Skip to content

[pull] main from MetaMask:main#795

Merged
pull[bot] merged 10 commits into
Reality2byte:mainfrom
MetaMask:main
May 29, 2026
Merged

[pull] main from MetaMask:main#795
pull[bot] merged 10 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 29, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

juanmigdr and others added 10 commits May 29, 2026 12:24
<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**

- Reused a shared `AddAssetTokenRow` across import search results and
confirmation.
- Aligned token row icon, badge, title, subtitle, spacing, and skeleton
sizing.
- Updated the import search field to use the shared `TextFieldSearch`
pattern.
- Added loading/disabled feedback for the confirmation import action.
- Added tests for import loading, duplicate press prevention, failure
handling, and search behavior.
- Kept Explore search bar unchanged.


<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: remove inconsistencies on token import flow

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-3294

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> UI and UX changes in the add-token flow with no auth, security, or
wallet-core logic changes; import behavior is guarded with loading and
error recovery.
> 
> **Overview**
> Unifies how tokens look in the **add/import** flow and hardens the
confirm step when users tap **Import**.
> 
> A new **`AddAssetTokenRow`** component is shared by **search results**
and **confirm import**, so avatar, network badge, name, and symbol use
the same layout and typography (including **`BadgeNetwork`**). Search
uses the design-system **`TextFieldSearch`** instead of a custom search
bar; list rows and loading skeletons are aligned to the same **`h-16`**
row spacing. **`SearchTokenResults`** no longer takes a **`chainId`**
prop (network context comes from each asset).
> 
> **`ConfirmAddAsset`** treats **`addTokenList`** as async: import shows
**loading**, **disables** Cancel/Import to block double-taps, **logs**
failures and re-enables buttons without navigating away on error.
**`AddAsset`** inlines the network bottom sheet without a memoized
render callback.
> 
> Tests cover in-flight import, duplicate presses, and failed import
recovery.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
99573ec. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…#30749)

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## **Description**

Raises the AI confidence gate used by smart E2E selection from **80%**
to **85%**.

At the higher threshold the smart-selection path is more conservative:
the AI must be more confident before its narrowed tag list is trusted.
PRs where the AI confidence falls between 80–84% will now fall back to
running the full E2E suite instead of the AI-selected subset.

**Files changed:**
- `.github/workflows/ci.yml` — four `>= 80` threshold expressions
updated to `>= 85` (Android/iOS build-skip checks and selected-tags
expressions)
- `.github/guidelines/E2E_DECISION_TREE.md` — Mermaid diagram node
updated to `Confidence >= 85%`

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

CI-only change — no manual testing steps required.

## **Screenshots/Recordings**

N/A — CI configuration change only.

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a
href="https://cursor.com/agents/bc-9d0b1e0d-1bde-492b-8403-268d52e549f5"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-9d0b1e0d-1bde-492b-8403-268d52e549f5"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cmd-ob <cmd-ob@users.noreply.github.com>
## **Description**

We had two flags gating Money surfaces (`moneyHomeScreenEnabled` and
`moneyEnableMoneyAccount`). This was needed for independent development
of features. We can simply rely `moneyEnableMoneyAccount` now. This PR
drops `moneyHomeScreenEnabled` and routes every Money UI gate through
`moneyEnableMoneyAccount`.

This also removes the `featureDisabled` branch of
`MoneyBalanceDisplayState` since this it's now unreachable.

## **Changelog**

CHANGELOG entry: update moneyHomeScreenEnabled UI gating to use
moneyEnableMoneyAccount; remove featureDisabled MoneyBalanceDisplayState
code paths since they are now unreachable

## **Related issues**

- Fixes:
[MUSD-864](https://consensyssoftware.atlassian.net/browse/MUSD-864)

## **Manual testing steps**

```gherkin
Feature: Money account feature flag

  Scenario: flag off hides Money surfaces
    Given Money account is disabled
    When the user opens the app
    Then the Activity tab is shown in the bottom navbar
    And the Money section is rendered instead of the MoneyBalanceCard on the Wallet home screen

  Scenario: flag on shows Money surfaces
    Given Money account is enabled
    When the user opens the app
    Then the Money tab replaces Activity in bottom navbar
    And the MoneyBalanceCard renders on the Wallet home screen
```

## **Screenshots/Recordings**

### **Before**

<!-- N/A — no user-visible change when flags are aligned -->

### **After**

<!-- N/A -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
- [ ] I've tested with a power user scenario
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- Generated with the help of the pr-description AI skill -->


[MUSD-864]:
https://consensyssoftware.atlassian.net/browse/MUSD-864?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Wide but mechanical flag swap across tabs, wallet, and cash
navigation; behavior changes if remote flags were previously mismatched,
with no auth or payment logic touched.
> 
> **Overview**
> This PR **consolidates Money UI gating** onto a single remote flag,
**`moneyEnableMoneyAccount`**, and removes the parallel
**`moneyHomeScreenEnabled`** path (selector, registry entry, and
`MM_MONEY_HOME_SCREEN_ENABLED` from `.js.env.example`).
> 
> **Navigation and home surfaces** now read
`selectMoneyEnableMoneyAccountFlag` instead of the home-screen flag: the
bottom tab swaps Activity for Money when enabled, `MainNavigator`
registers Money stacks conditionally, **Wallet** shows
`MoneyBalanceCard` and the activity shortcut, **Activity** back/hardware
behavior routes to home tabs when Money is on, and the homepage **Cash**
section / `useCashNavigation` hide or deep-link to Money accordingly.
> 
> **In-app Money balance UI** drops the **`featureDisabled`** branch
from `MoneyBalanceDisplayState` and related components (`MoneyHomeView`,
`MoneyBalanceCard`, `MoneyBalanceSummary`), test IDs, copy, and
precedence docs—on the assumption users only reach these screens when
the account flag is on. **`isMoneyAccountEnabled`** no longer falls back
to `MM_MONEY_ENABLE_MONEY_ACCOUNT`; undefined remote evaluates to
**false**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
8b0d2c0. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…mports cp-7.80.0 (#30754)

<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Enables the live BTC 5-minute up/down row in the Predict homepage
discovery section (HomepagePredictWorldCupDiscovery).

The row was previously gated behind a temporary SHOW_BTC_UP_DOWN_5M_ROW
kill switch while waiting on the shared useCurrentCryptoUpDownMarketData
hook. That hook is now wired up, so the row shows live BTC spot price,
price-to-beat, and a countdown. Tapping the row opens the active BTC
market details when available; otherwise it falls back to the crypto
category market list.

**Why:** Surface live crypto up/down markets on the homepage discovery
treatment and remove dead placeholder/TODO wiring.

**Changes:**

- Remove SHOW_BTC_UP_DOWN_5M_ROW from btcUpDown5mSeries.ts
- Wire useCurrentCryptoUpDownMarketData + usePredictNavigation in
HomepagePredictWorldCupDiscovery
- Always render BtcLiveRow (no longer conditional on kill switch)
- Navigate to live market on row tap when btcMarketId is available


## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Added a live BTC up/down row to the Predict homepage
discovery section with real-time price, price-to-beat, and countdown.

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Predict homepage discovery BTC live row

  Scenario: BTC row displays live data when Predict is enabled
    Given Predict is enabled
    And the user is in the homepage discovery treatment (world cup discovery layout)
    When the user views the Predict section on the homepage
    Then the BTC live row is visible
    And it shows BTC spot price, price-to-beat, and a live countdown

  Scenario: Tapping BTC row opens the active market
    Given Predict is enabled
    And a live BTC 5-minute up/down market is available
    When the user taps the BTC live row
    Then the app navigates to that market's details screen
    And the entry point is HOME_SECTION

  Scenario: Tapping BTC row falls back when no live market
    Given Predict is enabled
    And no live BTC market is available
    When the user taps the BTC live row
    Then the app navigates to the Predict crypto category market list
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**
<img width="403" height="234" alt="Screenshot 2026-05-28 at 13 26 58"
src="https://github.com/user-attachments/assets/d71ebb53-84bb-4c6c-943f-a3adbcab1b0e"
/>

<!-- [screenshots/recordings] -->

### **After**
<img width="410" height="867" alt="Screenshot 2026-05-28 at 17 41 35"
src="https://github.com/user-attachments/assets/9c35e1a5-8ed6-4a24-8c47-8c09e2ebc419"
/>

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> User-visible homepage Predict navigation and live market data depend
on external feeds; misconfiguration could send users to the wrong market
or show stale prices, but scope is limited to discovery UI.
> 
> **Overview**
> Removes the temporary **`SHOW_BTC_UP_DOWN_5M_ROW`** kill switch and
turns on the **BTC 5-minute up/down** discovery row on the Predict
homepage.
> 
> **`HomepagePredictWorldCupDiscovery`** now loads live window data via
**`useCurrentCryptoUpDownMarketData`** (series
**`BTC_UP_OR_DOWN_5M_SERIES`**, gated by **`selectPredictEnabledFlag`**)
and always renders **`BtcLiveRow`** with spot price, price-to-beat, and
countdown. Tapping the row opens the active market through
**`navigateToMarketDetails`** when **`btcMarketId`** exists (including
**`transactionActiveAbTests`** when present); otherwise it still
navigates to the crypto market list. Placeholder constants and commented
TODO wiring are deleted.
> 
> **`PredictionsSection.test.tsx`** mocks
**`useCurrentCryptoUpDownMarketData`** so tests stay stable without live
market data.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
3e187e4. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**

This is the second pr related to gasless hardware wallet swap support.
It introduces hooks that will be used.
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**


<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Related to: https://consensyssoftware.atlassian.net/browse/MUL-1718

Depends on: #30182

## **Manual testing steps**

Not applicable

## **Screenshots/Recordings**

Not applicable

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes bridge Redux and signing/disconnect/reject dispatch paths for
hardware wallets; incorrect baseline or dedup logic could mis-handle
swap failures, though behavior is heavily unit-tested and not yet wired
to production UI.
> 
> **Overview**
> Adds **hardware-wallet swap state** to the bridge Redux slice
(`hardwareWalletsSwaps`, `updateHardwareWalletsSwaps` /
`resetHardwareWalletsSwaps`, `selectHardwareWalletsSwaps`) and two hooks
meant for the gasless HW signing flow.
> 
> **`useHwConnectionMonitoring`** watches device connection while status
is `Waiting`. It dispatches `DEVICE_DISCONNECTED` or `REJECTED` when
signing is active, with guards for pre-signing disconnect handoffs,
stale baseline state on re-entry, deduplication, and recoverable
transport errors. **`useHwQrState`** drives inline QR signing
visibility, user cancel → `REJECTED`, and auto-cancels pending QR scans
when the flow hits terminal statuses.
> 
> Mocks and bridge slice tests are updated; hook behavior is covered by
large unit test suites. No UI wiring in this diff—hooks and Redux
plumbing only.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
9be3ea4. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…l sites (#29525)

## **Description**

Adopts the explicit `isInternal: true` flag on internal `addTransaction`
/ `addTransactionBatch` call sites, replacing the old `origin ===
ORIGIN_METAMASK` trust check removed in
`@metamask/transaction-controller@66.0.0`.

A [yarn patch](https://yarnpkg.com/features/patching) on
`@metamask/transaction-controller@66.0.0` is included to backport the
`isInternal` field to the `ExtraTransactionsPublishHook` (needed for
extra-transaction batches).

### Call sites stamped `isInternal: true`

| Feature | Hook / Utility |
|---------|---------------|
| Send | `send.ts` `transaction.ts` |
| Earn | `musdConversionTransaction.ts` `EarnInputView.tsx`
`useMerklClaimTransaction.ts` |
| Card | `useCardDelegation.ts` |
| Money Account | `useMoneyAccount.ts` |
| Perps | `usePerpsWithdrawConfirmation.ts` |
| Predict | `PredictController.ts` |
| Ramp | `SendTransaction.tsx` |
| Pooled Staking | `usePoolStakedClaim/index.ts`
`usePoolStakedDeposit/index.ts` `usePoolStakedUnstake/index.ts` |
| Dev Tools | `confirmations-developer-options` |

### Not stamped — controller sets `isInternal` internally

- **`BridgeStatusController`** (via
`@metamask/bridge-status-controller@71.2.0`) —
`bridge-status-controller-init.ts` is a passthrough; the controller sets
the flag itself.
- **`TransactionPayController`** (via
`@metamask/transaction-pay-controller@22.6.0`) — sets `isInternal: true`
in its own submit strategies.

### Excluded — external / dapp-originated paths

- `BackgroundBridge` (`eth_sendTransaction`, `wallet_sendCalls`)
- WalletConnect v2 session requests
- Deeplink handlers

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: isInternal flag propagation

  Scenario: user submits an internal transaction
    Given the app is on a transaction submission flow (send, stake, earn, perps, etc.)
    When the transaction is submitted
    Then the transaction proceeds without requiring an external approval prompt
```

## **Screenshots/Recordings**

N/A — internal flag propagation, no UI changes.

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
#30806)

<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Remove android lint result from slack notification on release automatic
RC builds.
Adding back once test phase ends

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**
Remove explore search V1

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: remove explore search V1

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-3293

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Medium risk: large UX/navigation change in Explore search (removed
full-view route, new default flows) with broad test updates; no auth or
payment logic, but user-facing search behavior changes for all users
once shipped.
> 
> **Overview**
> This PR **removes Explore search V1** and makes the tabbed, pill-based
search the only path. The **`exploreSearchV2` remote feature flag** and
its selector/registry entries are deleted, so search is no longer gated
at runtime.
> 
> **`ExploreSearchScreen`** always renders pill filters plus
**`ExploreSearchContent`**, which uses **`useExploreSearch`** with
pagination. The legacy **`ExploreSearchResultsV2`** duplicate and the
**`ExploreSectionResultsFullView`** stack screen (and route/types) are
removed; **“view more”** now switches the active pill and shows
**`FullFeedList`** in-place instead of pushing a separate full-results
screen.
> 
> **`ExploreSearchResults`** is updated to the former V2 behavior:
sections passed in from the parent, **`getViewMoreLabel`**, empty-state
headers with popular asset pills, and analytics tied to **`activeTab`**.
**`useExploreSearch`** drops V1-only options (truncate-without-query,
title variants); **`useExploreSearchV2`** is deleted and tests/docs
rename “V2” to the default experience.
> 
> Tests and Detox/smoke flows now assert **search pills** and the
**results list** instead of scrolling to a search-engine footer link.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
3b42ea9. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…30709)

<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

Aligns the Spending Limit **Spend and earn** promo card with the updated
Money account design (Figma `7749:21026`).

**Why:** Product/design refreshed the copy and visual hierarchy for the
Money account linkage CTA so it matches the broader Money account
linkage experience and emphasizes APY as a highlighted benefit.

**What changed:**
- **SpendAndEarnPromoCard** — Title is now **Spend and earn** (bold).
Body copy focuses on linking balance to the card and mUSD back on
purchases, with the APY rate rendered in **success green**
(`TextColor.SuccessDefault`, medium weight). CTA label is **Link card**.
Button shimmer (`ShimmerOverlay`) is unchanged.
- **Copy / i18n** — Replaced single-paragraph strings with split prefix
/ APY / suffix keys; removed explicit cashback % from the promo (Metal
vs regular no longer differentiated in this banner).
- **SpendingLimit** — Stops passing `cashbackPercent` into the promo
card.
- **useCardPostAuthRedirect** — New hook (with unit tests) to read
`postAuthRedirect` from parent navigators when the user enters card
flows from Money Home; supports nested onboarding params. Scaffolding
for upcoming linkage / bottom-sheet navigation work.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Updated the Spending Limit spend-and-earn promo card
copy, styling, and Link card CTA to match the Money account design.

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Spending Limit spend-and-earn promo card

  Scenario: User sees the redesigned promo when linking Money account from card onboarding
    Given the user is on the Card Spending Limit screen during onboarding
    And a crypto token is selected (not Money account as source)
    And the Money account linkage CTA is available (funded Money balance)
    And a live APY rate is available

    When the user views the spend-and-earn promo card
    Then the title reads "Spend and earn"
    And the description mentions linking balance to the card and mUSD back on purchases
    And the APY rate (e.g. "4% APY") appears highlighted in green
    And the primary button label reads "Link card"
    And the button still shows the horizontal shimmer animation

    When the user taps the promo card or the "Link card" button
    Then the app switches the spending source to the Money account

  Scenario: User sees shortened copy when APY is unavailable
    Given the same Spending Limit onboarding context as above
    And no APY rate is returned for the Money account

    When the user views the spend-and-earn promo card
    Then the description reads "Link your balance to your card and get mUSD back on purchases."
    And no highlighted APY segment is shown
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- Generated with the help of the pr-description AI skill -->

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Navigation param threading across Money and card onboarding/auth
affects where users land after sign-in; regressions could strand users
on the wrong screen, though changes are mostly UI copy plus tested
redirect plumbing.
> 
> **Overview**
> **Spend-and-earn promo** on Spending Limit is redesigned to match
Money account UX: title **Spend and earn**, new body copy with a
**green-highlighted** APY segment, CTA **Link card**, and **no Metal vs
regular cashback** in the banner (`SpendAndEarnPromoCard` drops
`cashbackPercent`; i18n uses prefix / APY / suffix keys).
> 
> **Return-to-Money after card flows:** new `useCardPostAuthRedirect`
reads `postAuthRedirect` from parent navigators (including nested
onboarding params). **Money Home** card entry points pass
`MONEY_HOME_CARD_ORIGIN`; **Card Welcome**, **Sign Up**, and
**money–card linkage** forward that param into onboarding or
authentication. **Money Link Card sheet** and **MetaMask Card** promos
get aligned copy and **“(variable)”** APY wording in `en.json`.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
031c060. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**
Migrates the legacy aggregator routes (`Aggregator/routes/index.tsx`)
from `@react-navigation/stack` (JS stack) to
`@react-navigation/native-stack`, aligning with the rest of the Ramp
routing tree (Unified V2 `Ramp/routes.tsx` already uses native stack).

Native stack uses platform-native navigation primitives
(`UINavigationController` on iOS, `FragmentTransaction` on Android),
which yields better performance and a more native feel — especially
noticeable on the modal/overlay transitions used by `Quotes` and
`Checkout`.

The migration is purely a wiring/config change. No screen behaviour,
route names, or component imports change. Translations applied:
- Navigator: `createStackNavigator` → `createNativeStackNavigator`
- Per-screen overlay options: replaced inline `headerShown / cardStyle /
animationEnabled / detachPreviousScreen` blocks for `Quotes` and
`Checkout` with the shared `clearNativeStackNavigatorOptions` +
`transparentModalScreenOptions` presets from
`app/constants/navigation/clearStackNavigatorOptions.ts`.
- Property renames: `cardStyle` → `contentStyle`, `animationEnabled:
false` → `animation: 'none'`.
- The `detachPreviousScreen: false` workaround used to keep the
underlying screen mounted under transparent modals is no longer needed —
native stack keeps the presenting screen mounted automatically when
`presentation: 'transparentModal'` is used.
- Removed the now-unused `colors` import (it was only used to set
`cardStyle.backgroundColor: colors.transparent`).
 
Test mock in `routes/index.test.tsx` updated to mock
`@react-navigation/native-stack` (`createNativeStackNavigator`) instead
of `@react-navigation/stack`.


## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**
<img width="364" height="752" alt="Aggregator Before"
src="https://github.com/user-attachments/assets/423ec7f4-66b2-48dd-bfc2-ab2769eaf260"
/>

### **After**
<img width="364" height="752" alt="Aggregator After"
src="https://github.com/user-attachments/assets/e545af4e-9b7d-4907-a343-6475c44ba0be"
/>

Android

https://github.com/user-attachments/assets/9df9f89d-3c4e-4e49-ac32-ba3896d0384f

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [x] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [x] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [x] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Navigation-only wiring in Ramp Aggregator routes; no business logic,
auth, or data handling changes.
> 
> **Overview**
> **Aggregator Ramp routing** now uses `@react-navigation/native-stack`
instead of the JS stack, matching the newer Ramp navigation setup while
leaving screens and route names unchanged.
> 
> **Quotes**, **Checkout**, and the nested **modals** stack pick up
shared `clearNativeStackNavigatorOptions` and
`transparentModalScreenOptions` instead of inline `cardStyle` /
`animationEnabled` / `detachPreviousScreen` workarounds;
`BUILD_QUOTE_HAS_STARTED` uses `animation: 'none'`. The route test mock
was updated to `createNativeStackNavigator`.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
371f725. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pull pull Bot locked and limited conversation to collaborators May 29, 2026
@pull pull Bot added the ⤵️ pull label May 29, 2026
@pull pull Bot merged commit f166abb into Reality2byte:main May 29, 2026
4 of 15 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants