[pull] main from MetaMask:main#726
Merged
Merged
Conversation
<!-- 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 -->
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 : )