Skip to content

[pull] main from MetaMask:main#726

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

[pull] main from MetaMask:main#726
pull[bot] merged 5 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull

@pull pull Bot commented May 1, 2026

Copy link
Copy Markdown

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 : )

davibroc and others added 5 commits May 1, 2026 18:35
<!--
This is a temporary patch until this bug is fixed
ttps://github.com//issues/29615
-->

## **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?
-->

## **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:

## **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.
-->

- [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
- [ ] 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]
> **Low Risk**
> Low risk: changes are limited to smoke-test steps and analytics
expectations, adjusting assertions to match a temporarily missing
slippage event.
> 
> **Overview**
> Updates the swap action smoke test to **stop setting custom slippage**
during the first ETH→USDC swap while bug `#29615` is unresolved.
> 
> Adjusts the associated analytics expectations by reducing
`INPUT_CHANGED` event count from 12→11 and temporarily disabling the
`slippage` input assertion, with comments indicating it should be
re-enabled once the bug is fixed.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
05981c9. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

`BackgroundBridge` subscribes to seven controller messenger events in
its constructor but `onDisconnect()` only tore down three. After a
session disconnects, the leaked subscriptions kept firing — emitting
`chainChanged` / `accountsChanged` notifications and lock/unlock events
to dead sessions.

Root causes of the four leaks:
- `SelectedNetworkController:stateChange` — missing from
`onDisconnect()` entirely.
- `KeyringController:lock` / `unlock` — subscribed with
`this.onLock.bind(this)` / `this.onUnlock.bind(this)` inline, so each
call produced a fresh reference that couldn't be matched for
unsubscription.
- `PermissionController:stateChange` — subscribed with an anonymous
arrow function, same reference-matching problem.

Fix:
- Store stable bound references (`this._handleLock`,
`this._handleUnlock`, `this._handlePermissionControllerStateChange`) in
the constructor and pass them to both `subscribe` and `tryUnsubscribe`.
- Add matching `tryUnsubscribe` calls for all four events in
`onDisconnect()`.
- Make `onDisconnect()` idempotent: early-return on `this.disconnected`,
and convert the existing CAIP `unsubscribe` calls (which throw on a
missing sub) to `tryUnsubscribe`. `onDisconnect` is invoked from ~6 call
sites and could previously throw on a second call.

Affects both SDKConnectV2 and WalletConnect since they share this class.

## **Changelog**

CHANGELOG entry: Fixed a subscription leak in `BackgroundBridge` where
disconnected SDK and WalletConnect sessions could continue to receive
network, account, permission, and lock/unlock notifications.

## **Related issues**

Fixes:
[WAPI-1367](https://consensyssoftware.atlassian.net/browse/WAPI-1367)

## **Manual testing steps**

```gherkin
Feature: BackgroundBridge subscription teardown

  Scenario: SDKConnectV2 session stops receiving state events after disconnect
    Given a dapp has an active SDKConnectV2 session with the wallet
    And dev logs for notifyChainChanged / notifySelectedAddressChanged are being observed

    When the user disconnects the session
    And the user switches networks
    And the user switches the selected account
    And the user locks and unlocks the wallet
    Then no chain-changed, account-changed, or lock-state notifications are emitted to the disconnected session

  Scenario: WalletConnect v2 session stops receiving state events after disconnect
    Given a dapp has an active WalletConnect v2 session with the wallet

    When the user disconnects the session
    And the user performs the same network / account / lock actions
    Then no chain-changed or account-changed notifications are emitted to the disconnected session

  Scenario: Calling onDisconnect multiple times is safe
    Given a BackgroundBridge instance has been disconnected

    When onDisconnect is invoked again
    Then no unsubscribe throws and no teardown work repeats
```

## **Screenshots/Recordings**

N/A — no UI changes.

### **Before**

### **After**

## **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
- [ ] 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

N/A — subscription-teardown fix, no user-visible flow or new
instrumented operations.

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**

- [ ] 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.

[WAPI-1367]:
https://consensyssoftware.atlassian.net/browse/WAPI-1367?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes connection teardown logic for provider sessions; mistakes
could drop needed notifications or leave subscriptions around, impacting
WalletConnect/SDK session behavior.
> 
> **Overview**
> Fixes `BackgroundBridge` event-subscription leaks by using stable
handler references for `KeyringController` lock/unlock and
`PermissionController:stateChange`, and by adding missing teardowns
(including `SelectedNetworkController:stateChange`) in `onDisconnect()`.
> 
> Makes `onDisconnect()` *idempotent* (early-return when already
disconnected) and switches CAIP-related unsubscriptions to
`tryUnsubscribe` to avoid errors on repeated teardown calls. Adds
focused unit tests asserting correct handler-based unsubscription and
safe repeated `onDisconnect()` invocation.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e4e1440. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Jiexi Luan <jiexiluan@gmail.com>
<!--
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?
-->

This PR replaces many of the placeholder UI elements and no-ops with
their production equivalents.

- **Money in bottom navbar:** When `selectMoneyHomeScreenEnabledFlag` is
on, the Activity tab is replaced by a Money tab that redirects to Money
Home. Activity has been moved to the wallet header.

- **Money Home bottom sheets:** The options button (top-right), Transfer
action, APY info tooltip, and earnings info tooltip now navigate to
their respective modals; Card CTAs route into the Card stack; “Earn on
your crypto” opens-temporary "Earn on your crypto" page; wires up
"Convert" buttons for assets displayed in the "Earn on your crypto"
section.

- **MoneyPotentialEarningsView** lists all eligible conversion tokens,
shows aggregate projected yield, and reuses row-level conversion
behavior.

- **Shared utilities & hooks:** Adds `moneyFormatFiat`, centralizes temp
`__DEV__` vault APY handling in `useMoneyAccountBalance`, adds
`calculateProjectedEarnings` helper, and refactors Money-related
components to use the shared formatter instead of ad hoc `Intl` /
`useFiatFormatter` usage. This means we no longer see the "US" prefix in
front of USD fiat amount.

- **Updated image assets** Updates Money onboarding / condensed cards /
How it works images; removes the temporary How it Works header.

- **MoneyAccountHomeRow** When `selectMoneyHomeScreenEnabledFlag` is on,
The Money section on the home screen displays the Money account's
balance instead of the aggregated mUSD balance. This component has 2
variants; an empty state and a funded state.

## **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: Improved the Money home experience behind the feature
flag by wiring real navigation (sheets, Card flows, potential earnings
and conversion), replacing the Activity tab when the flag is enabled,
and showing projected earnings using live APY and balance data.

## **Related issues**

No issue: Money Home and tab-navigation workstream without a single
tracking issue from the branch; see
#29454 for scope and
review. Add `Fixes:` / `Closes:` when a primary ticket exists.

## **Screenshots/Recordings**

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

### **Before**


### **After**


## **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**
> Introduces new Money navigation routes/modals and swaps core
tab/wallet navigation behavior behind
`selectMoneyHomeScreenEnabledFlag`, which could affect app navigation
flows if misconfigured. Also changes fiat formatting and APY/projection
calculations used across Money UI, so regressions would show up as
incorrect amounts or broken sheets rather than data loss.
> 
> **Overview**
> When `selectMoneyHomeScreenEnabledFlag` is enabled, the bottom tab bar
replaces *Activity* with a new *Money* tab (new `TabBarIconKey.Money`)
and moves *Activity* access to a new wallet header button (with
`ACTIVITY_CLICKED` analytics). Navigation is updated so Money
routes/modals (`More`, `Transfer`, `APY info`, `Earnings info`, plus a
new `MoneyPotentialEarningsView`) are registered and can be opened from
Money Home.
> 
> Money Home is de-stubbed: menu/transfer/card CTAs now navigate to real
routes, token “Convert” actions initiate the conversion flow with error
logging, and earnings UI now shows lifetime/projected values and opens
an earnings info sheet. Shared Money utilities are added and adopted:
`moneyFormatFiat` centralizes fiat formatting,
`calculateProjectedEarnings` standardizes linear projections,
`useMoneyAccountBalance` now returns
`apyDecimal/apyPercent/apyPercentFormatted` and uses the shared
formatter, and Money activity fiat formatting is migrated to the same
utility.
> 
> Homepage Cash section now conditionally renders a new
`MoneyAccountHomeRow` (balance/APY + Get started/Add CTA with loading
skeletons) when the Money home flag is on, instead of the prior mUSD
aggregated row. Tests and locales are updated accordingly.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
b459652. 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**

<!--
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?
-->

This PR updates build variants:
- Create `main-dev-expo` for producing Expo debug dev builds (.app,
.ipa, .apk, test .apk)
- Update `main-dev` for producing release dev builds for installation
via side loading

Slack thread -
https://consensys.slack.com/archives/C02U025CVU4/p1776795191936139

## **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:

## **Related issues**

Fixes:  https://consensyssoftware.atlassian.net/browse/MCWP-561

## **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**
> Moderate risk because it changes CI build selection and iOS
signing/export behavior (including overriding signing settings for
Release archives), which could break artifact generation or produce
incorrectly signed builds.
> 
> **Overview**
> Separates dev build configurations by introducing `main-dev-expo`
(Debug Expo dev builds that produce simulator + device iOS artifacts and
Android APK + test APK) while repurposing `main-dev` as a dev *release*
build intended for sideloading.
> 
> Updates the reusable `build.yml` workflow to support an optional
`script_name` override from `builds.yml`, so different build configs can
reuse the same underlying yarn build script. Adjusts `scripts/build.sh`
iOS packaging to use a new `PROFILE` flag for selecting export options
and to allow development signing overrides when creating a Release
archive.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
dc86270. 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 PR removes the now deprecated Quick Convert code paths. We're
keeping the Max convert bottom sheet and the `MusdConversionAssetRow`
components to integrate into the Money Home screen.
<!--
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 deprecated quick convert feature code paths

## **Related issues**

Fixes:
- [MUSD-691: Clean up deprecated Quick Convert Home and related code
paths](https://consensyssoftware.atlassian.net/browse/MUSD-691)

## **Manual testing steps**

N/A

## **Screenshots/Recordings**

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

### **Before**

<!-- [screenshots/recordings] -->
N/A
### **After**

<!-- [screenshots/recordings] -->
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.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Medium risk because it removes a navigation route/feature flag and
rewires mUSD conversion CTAs and analytics to always use the
custom-amount flow, which could affect user routing and event reporting
if any remaining callers expected Quick Convert.
> 
> **Overview**
> Removes the deprecated mUSD **Quick Convert** flow end-to-end: deletes
`MusdQuickConvertView` (and `MusdBalanceCard`), drops the
`MM_MUSD_QUICK_CONVERT_ENABLED` env var, removes the quick-convert
feature-flag selector/remote registry entries, and removes the
`Routes.EARN.MUSD.QUICK_CONVERT` route.
> 
> Updates mUSD conversion entry points (`useMusdConversion`, education
screen, cash/token list/asset CTAs) to stop passing/handling
`navigationOverride` and to always route/track redirects to
`CUSTOM_AMOUNT_SCREEN` (while keeping the max-convert bottom sheet
location constant).
> 
> Renames `ConvertTokenRow` to `MusdConversionAssetRow` and updates
downstream usage/tests (e.g., Money convert stablecoins, cash tokens
skeleton) to use the new component/test IDs.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
74947e7. 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 1, 2026
@pull pull Bot added the ⤵️ pull label May 1, 2026
@pull pull Bot merged commit 484fa2b into Reality2byte:main May 1, 2026
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.

4 participants