[pull] main from MetaMask:main#323
Merged
Merged
Conversation
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **Description**
- Injective: update network logo/native token
- HyperEVM
- Added network and token logo for Injective network.
`ChainId: 999`
`Native Token Name: HYPE`
`Chain Name : HyperEVM`
- Added hyperevm in additional networks.
<!--
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: adds hyperevm network in additional networks
## **Related issues**
Fixes:
## **Manual testing steps**
Go to the MetaMask Mobile app
1/ Navigate to "chainList.org" search for `HyperEVM` and click add new
network.
2/ Confirm that the network logo is displayed correctly
3/ Confirm that the native Token logo is displayed correctly
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<img width="391" height="798" alt="Screenshot 2025-11-11 at 00 06 13"
src="https://github.com/user-attachments/assets/abca8815-55fb-4950-a484-95249469c3ad"
/>
<img width="384" height="792" alt="Screenshot 2025-11-11 at 10 45 43"
src="https://github.com/user-attachments/assets/6b7e98bc-6b62-4c73-b60a-e2d61c649b2a"
/>
<img width="384" height="792" alt="Screenshot 2025-11-11 at 11 06 54"
src="https://github.com/user-attachments/assets/6fa7e753-8a85-4c6c-9007-ba2439b19f38"
/>
## **Pre-merge author checklist**
- [ ] 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.
## **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_SUMMARY -->
---
> [!NOTE]
> Adds HyperEVM network (0x3e7/999) with HYPE ticker, wiring into
PopularList, currency/icon mappings, and updates tests/snapshots; also
updates Injective native token icon.
>
> - **Networks**
> - Add `HyperEVM` to `PopularList` in
`app/util/networks/customNetworks.tsx` with `chainId` `0x3e7` (999), RPC
`https://rpc.hyperliquid.xyz/evm`, explorer `https://hyperevmscan.io/`,
and ticker `HYPE`.
> - Extend chain ID enums/mappings: add `NETWORK_CHAIN_ID.HYPE` in
`customNetworks.tsx`; add `HYPER_EVM` in `app/constants/network.js` with
currency symbol mapping to `HYPE`.
> - Map `HyperEVM` images in `CustomNetworkImgMapping` and
`CustomNetworkNativeImgMapping` to `images/hyperevm.png`.
> - **Assets/Icons**
> - Add `HYPE` icon entry in `app/images/image-icons.js`.
> - Update Injective token image to `injective-native.png` and keep
`INJ` mapping.
> - **Tests/UI**
> - Update `customNetworks.test.ts` to include `HyperEVM` expected
`chainId`.
> - Update `NetworkSelector` snapshots to show `HyperEVM` in Additional
networks list.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
805cbf0. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description** Removes the recently introduced rewards predict feature flag. We will support reward estimations for predictions when it's released so it doesn't make sense to have a dedicated flag for it. ## **Changelog** CHANGELOG entry: null ## **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. ## **Pre-merge reviewer checklist** - [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] > Removes the Predict rewards feature flag and selector, ungates rewards display in `PredictBuyPreview`, and updates tests accordingly. > > - **Predict UI**: > - Remove `useSelector` usage and `selectRewardsPredictEnabledFlag` gating from `PredictBuyPreview.tsx`; rewards now show when `currentValue > 0`. > - **Feature Flags**: > - Delete `selectRewardsPredictEnabledFlag` and related constant from `app/selectors/featureFlagController/rewards`. > - **Tests**: > - Update `PredictBuyPreview.test.tsx` to drop rewards flag mocks and expectations; rewards shown based solely on amount. > - Remove tests for `selectRewardsPredictEnabledFlag` in `selectors/featureFlagController/rewards/index.test.ts`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit acf05bf. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
#22598) ## **Description** Since the introduction of the BIP-44 feature, we now run discovery after every unlock (which also run an alignment after having discovered accounts or not). Though, we were only doing it for the primary wallet, thus, preventing to run alignment for other wallets, which prevented those other wallets to automatically create missing accounts on new providers (such as Bitcoin). ## **Changelog** CHANGELOG entry: Now run discovery on all wallets after every unlock (used to be on the primary wallet only) ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: Discovery for every HD wallets Scenario: user gets new Bitcoin accounts Given it has upgraded his app and has multiple HD wallets When user unlocks Then it automatically run account discovery and alignment for all HD wallets, resulting in new Bitcoin accounts being added (after upgrading) ``` ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [ ] 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. ## **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_SUMMARY --> --- > [!NOTE] > On unlock (state 2), concurrently re-run multichain discovery and alignment for all HD wallets, with tests validating HD-only execution. > > - **Authentication**: > - Add `getEntropySourceIds()` to collect all HD wallet entropy IDs from `KeyringController.state.keyrings`. > - Update `retryDiscoveryIfPending()` (state 2 enabled): > - Run `attemptMultichainAccountWalletDiscovery` for each HD wallet via `Promise.allSettled`, enabling discovery/alignment across all HD keyrings. > - Keep legacy per-client retry path for non-state-2. > - **Tests (`app/core/Authentication/Authentication.test.ts`)**: > - Add spies for `attemptMultichainAccountWalletDiscovery` and verify it runs for each HD keyring only. > - Ensure `mockIsMultichainAccountsState2Enabled` resets after tests; minor setup/teardown adjustments. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 95624bd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Show skeleton loader while loading predict claim confirmation. Also disable scrolling, and fix back button on Android. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: [#6606](MetaMask/MetaMask-planning#6066) [#6260](MetaMask/MetaMask-planning#6260) [#6251](MetaMask/MetaMask-planning#6251) ## **Manual testing steps** ## **Screenshots/Recordings** ### **Before** ### **After** <img width="300" alt="Claim Loader" src="https://github.com/user-attachments/assets/95b47027-fb11-4ce9-bb97-6f974df4e723" /> ## **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. ## **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_SUMMARY --> --- > [!NOTE] > Adds a Predict Claim-specific loader with skeleton UI, disables scrolling during claim confirmations, and moves close handling to an in-view button. > > - **Confirmations** > - Introduces `ConfirmationLoader.PredictClaim` and integrates loader selection in `confirm-component` with new `InfoLoader` wrapper. > - Disables scroll for `TransactionType.predictClaim` confirmations. > - **Predict Claim UI** > - Adds `PredictClaimInfoSkeleton` and `PredictClaimAmountSkeleton` for loading state. > - Adds in-view close `BackButton` (Android-safe) and adjusts styles (e.g., `lineHeight`, layout tweaks). > - **Navigation/UI** > - `getModalNavigationOptions` no longer renders a right-close button; `useModalNavbar` updated accordingly. > - **Developer Tools** > - `ConfirmationsDeveloperOptions` now navigates with `loader: ConfirmationLoader.PredictClaim` for claim flow. > - **Tests** > - Updates `usePredictClaim` tests to expect `loader: ConfirmationLoader.PredictClaim` when navigating to confirmation. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5eaac0c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Jira: https://consensyssoftware.atlassian.net/browse/SL-290 Fixes: * remove "Steps" text from create password screen * Change text color of render text in confirm SRP 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: null ## **Related issues** Fixes: * remove "Steps" text from create password screen * Change text color of render text in confirm SRP screen. ## **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** https://github.com/user-attachments/assets/389f928e-c2e6-4245-8f8b-1bffaa9b84e1 <img width="347" height="736" alt="Screenshot_2025-11-13_at_3 53 35_PM" src="https://github.com/user-attachments/assets/13fbe35a-1956-4644-b75f-0377e7227d13" /> <!-- [screenshots/recordings] --> ## **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. ## **Pre-merge reviewer checklist** - [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] > Removes the “Step 1 of 3” label on Create Password, drops the period from “Learn more”, and updates selected-word text color on the SRP confirmation screen. > > - **UI**: > - **ChoosePassword (`app/components/Views/ChoosePassword/index.js`)**: > - Remove steps label (`"Step {{currentStep}} of {{totalSteps}}"`). > - Update “Learn more” link text to exclude trailing period. > - **ManualBackupStep2 (`app/components/Views/ManualBackupStep2/index.js`)**: > - Change color of selected missing-word text to `TextColor.Alternative`. > - **Localization (`locales/languages/en.json`)**: > - Set `choose_password.learn_more` and `reset_password.learn_more` to "Learn more" (no period). > - **Tests**: > - Update snapshot for ChoosePassword to reflect removed steps label and updated “Learn more” text. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit ce5b9c3. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…ns (#22389) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **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 aims to implement `onAmountInput` RPC call into amount validations of send flow. The approach is totally similar what's done in the extension ## **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: #22388 ## **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** Adding a recording to prove that it works on BTC https://github.com/user-attachments/assets/e0e07794-a0ab-4f64-8f37-0f0959312c54 ## **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. ## **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_SUMMARY --> --- > [!NOTE] > Integrates Snap-based non‑EVM amount validation into send flow, blocking navigation on errors and adding focused validation utilities and tests. > > - **Hooks/Validation**: > - Add `useSnapAmountOnInput` to call `validateAmountMultichain` for non‑EVM assets. > - Extend `useAmountValidation` to run Snap validation, expose `validateNonEvmAmountAsync`, and factor helpers: `validateERC1155Balance`, `validateTokenBalance`, `validatePositiveNumericString`. > - **UI/Flow**: > - Update `AmountKeyboard` to use `useSendType` and await `validateNonEvmAmountAsync` before navigating to `Routes.SEND.RECIPIENT`. > - **Tests**: > - Add comprehensive tests for new hooks and validation helpers. > - Update amount keyboard tests to verify non‑EVM validation on Continue. > - **Mocks**: > - Add `EVM_NATIVE_ASSET` and enhance send mocks for test coverage. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit dcd97e7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Hide tokens on testnet chains in the asset picker used by MetaMask Pay. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: [#6262](MetaMask/MetaMask-planning#6262) ## **Manual testing steps** ## **Screenshots/Recordings** ### **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 - [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. ## **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_SUMMARY --> --- > [!NOTE] > Filters out testnet-chain tokens from `getAvailableTokens` and adds a unit test to validate the behavior. > > - **Confirmations Utils**: > - Update `getAvailableTokens` in `app/components/Views/confirmations/utils/transaction-pay.ts` to exclude tokens on testnets using `isTestNet(chainId)`. > - **Tests**: > - Add test in `app/components/Views/confirmations/utils/transaction-pay.test.ts` to assert testnet tokens are not returned; import `CHAIN_IDS` for `SEPOLIA`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 72944f5. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…ice (#22573) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** - formatPercentage: Now returns whole numbers without decimals - Values >= 99%: ">99%" - Values < 1% (but > 0): "<1%" - Regular values: rounded to nearest integer (e.g., "5%", "-3%") - Removes "+" sign prefix for positive values - formatPrice: Now always returns exactly 2 decimals with truncation - Changed from variable decimals (2-4) based on magnitude - Truncates instead of rounding (e.g., 321.09 → $321.08) - Simplifies formatting logic by removing threshold-based behavior Updated components to use new format utilities: - PredictPositionDetail: Use formatPrice and formatCents for consistent formatting - PredictPositionsHeader: Use formatPercentage for unrealized P&L display - PredictMarketMultiple: Use formatPercentage for outcome prices Updated all test files to match new formatting expectations across: - PredictPositionsHeader.test.tsx (11 tests) - PredictMarketMultiple.test.tsx (2 tests) - PredictPositionDetail.test.tsx (4 tests) <!-- 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** Fixes: https://consensyssoftware.atlassian.net/browse/PRED-208?atlOrigin=eyJpIjoiMzNmN2ExNWYzOTFlNDNlZGEwNzBhMWYxMGM0MTg5OGIiLCJwIjoiaiJ9 ## **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** - [ ] 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. ## **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_SUMMARY --> --- > [!NOTE] > Unifies percentage and USD formatting across Predict UI (no-decimal percentages, 2-decimal truncated prices) and updates components/tests accordingly. > > - **Formatting Utilities**: > - `formatPercentage`: no decimals, removes `+`, caps as `>99%`, shows `<1%`, rounds negatives to whole percent. > - `formatPrice`: always 2 decimals with truncation (no rounding); removes threshold-based behavior. > - Adds `formatCents` for 1-decimal/whole-cent display; updates `formatCurrencyValue` behavior to align. > - **Component Updates**: > - `PredictMarketMultiple`: uses `formatPercentage` for outcome prices (drops appended `%`). > - `PredictPositionDetail`: uses `formatPrice` and `formatCents` for initial/current values and avg price. > - `PredictPositionsHeader`: uses `formatPercentage` for unrealized P&L. > - **Tests**: > - Adjust expectations across Predict tests (percentages like `65%` instead of `+65%`; prices like `$123.45` via truncation; edge cases `<1%`/`>99%`). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit efe8eaf. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…#22607) ## **Description** There was a problem when trying to send WETH, it didn't show the Confirmation page, but it was stuck on a spinning wheel. This PR excludes token transfers from marking them as a swap tx, which solves the issue. ## **Changelog** CHANGELOG entry: Fix sending WETH ## **Related issues** Fixes: #22357 ## **Manual testing steps** 1. Try to send WETH on Ethereum mainnet 2. You can see the Confirmation overview page before sending the transaction ## **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** - [ ] 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. ## **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_SUMMARY --> --- > [!NOTE] > Stops classifying ERC20 `transfer` calls as swap/approve transactions and adds tests to cover this case. > > - **Transactions utils**: > - Update `getIsSwapApproveOrSwapTransaction` to return `false` for ERC20 token transfers (`TRANSFER_FUNCTION_SIGNATURE`). > - **Tests**: > - Import `ORIGIN_METAMASK` and add test ensuring token transfers from swap origin are not flagged as swaps. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0c94b3f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Signed-off-by: dan437 <80175477+dan437@users.noreply.github.com>
## **Description** Update the duration for same chain transactions in MetaMask Pay to from `2` to `< 10`. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: [#6265](MetaMask/MetaMask-planning#6265) ## **Manual testing steps** ## **Screenshots/Recordings** ### **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 - [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. ## **Pre-merge reviewer checklist** - [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] > Updates same-chain transaction estimated time display from "2 sec" to "< 10 sec" and aligns tests. > > - **Confirmations UI**: > - Update `BridgeTimeRow` same-chain estimate to display `"< 10 sec"` via `SAME_CHAIN_DURATION_SECONDS`. > - **Tests**: > - Adjust expectation in `bridge-time-row.test.tsx` to `"< 10 sec"` for same-chain payment scenario. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5c28393. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
# Predict Analytics Improvements
## 📋 Summary
This PR includes two major analytics improvements for the Predict
feature:
1. **Consolidates trade events**: Merges 4 separate Predict trade
analytics events into a single consolidated event with a `status`
discriminator
2. **Adds user state tracking**: Adds `balance` and
`open_positions_count` properties to feed and position tracking events
Both changes follow MetaMask mobile analytics guidelines and align with
the Perps pattern.
CHANGELOG entry: null
## 🎯 Motivation
### Before (4 Separate Events)
```typescript
MetaMetricsEvents.PREDICT_ACTION_INITIATED
MetaMetricsEvents.PREDICT_ACTION_SUBMITTED
MetaMetricsEvents.PREDICT_ACTION_COMPLETED
MetaMetricsEvents.PREDICT_ACTION_FAILED
```
### After (1 Consolidated Event)
```typescript
MetaMetricsEvents.PREDICT_TRADE_TRANSACTION
// with status: 'initiated' | 'submitted' | 'succeeded' | 'failed'
```
### Why This Change?
1. **Consistency with Perps**: Perps uses `Perp Trade Transaction` with
a `status` discriminator
2. **Follows Guidelines**: Aligns with MetaMask mobile analytics
standards
3. **Better Maintainability**: Single source of truth for trade events
4. **Easier Queries**: Filter by `status` property instead of multiple
event names
5. **Extensibility**: Easy to add new statuses in the future
## 🔧 Changes Made
### Part 1: Trade Event Consolidation
#### 1. Event Constants (`MetaMetrics.events.ts`)
**Removed:**
- `PREDICT_ACTION_INITIATED`
- `PREDICT_ACTION_SUBMITTED`
- `PREDICT_ACTION_COMPLETED`
- `PREDICT_ACTION_FAILED`
**Added:**
- `PREDICT_TRADE_TRANSACTION`
#### 2. Analytics Properties (`eventNames.ts`)
**Added:**
```typescript
export const PredictEventProperties = {
STATUS: 'status', // New discriminator property
// ... existing properties
};
export const PredictTradeStatus = {
INITIATED: 'initiated', // User views preview
SUBMITTED: 'submitted', // Trade sent to blockchain
SUCCEEDED: 'succeeded', // Trade completed (renamed from COMPLETED)
FAILED: 'failed', // Trade failed
};
```
#### 3. Controller Method (`PredictController.ts`)
**Updated signature:**
```typescript
// Before
trackPredictOrderEvent({ eventType, ... })
// After
trackPredictOrderEvent({ status, ... })
```
**Single event tracking:**
```typescript
MetaMetrics.getInstance().trackEvent(
MetricsEventBuilder.createEventBuilder(
MetaMetricsEvents.PREDICT_TRADE_TRANSACTION, // Single event
)
.addProperties({
status, // Discriminator: initiated, submitted, succeeded, failed
// ... other properties
})
.build(),
);
```
#### 4. Preview Components
**Updated tracking calls:**
- `PredictBuyPreview.tsx`: `status: PredictTradeStatus.INITIATED`
- `PredictSellPreview.tsx`: `status: PredictTradeStatus.INITIATED`
### 5. All Controller Tracking Calls
- Initiated: When user views preview screen
- Submitted: When trade is sent to blockchain
- Succeeded: When trade completes successfully (renamed from
"completed")
- Failed: When trade fails with error
## 📊 Analytics Impact
### Event Structure
```typescript
{
event: "Predict Trade Transaction",
properties: {
status: "initiated" | "submitted" | "succeeded" | "failed",
market_id: "...",
transaction_type: "mm_predict_buy" | "mm_predict_sell",
amount_usd: 100,
// ... other properties
}
}
```
### Querying Example
```sql
-- Before: Multiple events
SELECT COUNT(*) FROM events
WHERE event IN ('Predict Action Initiated', 'Predict Action Submitted', ...)
-- After: Single event with filter
SELECT COUNT(*) FROM events
WHERE event = 'Predict Trade Transaction'
AND properties.status = 'succeeded'
```
## 🧪 Testing
### Manual Testing Checklist
- [ ] Buy trade initiated event fires with `status: initiated`
- [ ] Sell trade initiated event fires with `status: initiated`
- [ ] Trade submission fires with `status: submitted`
- [ ] Successful trade fires with `status: succeeded`
- [ ] Failed trade fires with `status: failed`
- [ ] All properties are correctly populated
- [ ] No old event names (`PREDICT_ACTION_*`) are tracked
### Verification Steps
1. Enable MetaMask analytics in settings
2. Navigate to Predict feature
3. Initiate a trade (buy or sell)
4. Check analytics debugger for `Predict Trade Transaction` event with
`status: initiated`
5. Complete the trade
6. Verify `status: submitted` and `status: succeeded` events fire
## 🔗 Related Changes
### Segment Schema Repository
A companion PR is required in the `segment-schema` repository to update
the event schemas:
**Schema Changes:**
- ✅ Delete 4 separate event files (`predict-action-*.yaml`)
- ✅ Create 1 consolidated file (`predict-trade-transaction.yaml`) with
`status` enum
- ✅ Update all documentation to reflect consolidated pattern
**Segment Schema PR:** [Link to be added]
## 📝 Pattern Consistency
### Perps Pattern (Existing)
```yaml
name: Perp Trade Transaction
properties:
status:
enum: [submitted, executed, partially_filled, failed]
```
### Predict Pattern (New)
```yaml
name: Predict Trade Transaction
properties:
status:
enum: [initiated, submitted, succeeded, failed]
```
## ⚠️ Breaking Changes
**None** - This is an internal refactor. The analytics team will need to
update their queries to use the new event name and `status` property,
but this is expected and has been coordinated.
## 🎯 Benefits
1. **Consistent Pattern**: Matches Perps and MetaMask mobile standards
2. **Single Source of Truth**: One event for all trade lifecycle states
3. **Better Analytics**: Easier to query and analyze trade funnels
4. **Less Code**: Reduced from 4 event handlers to 1
5. **Easier Maintenance**: Changes to trade events only need to update
one place
6. **Extensible**: Can add new statuses (e.g., `pending`, `retrying`)
easily
## 📚 Documentation
- [Perps Analytics Pattern](../Perps/controllers/PerpsController.ts) -
Reference implementation
- [Segment Schema PR](link-to-segment-schema-pr) - Schema changes
- [Analytics Guidelines](.github/guidelines/ANALYTICS_GUIDELINES.md) -
MetaMask standards
## ✅ Checklist
- [x] Event names updated
- [x] Constants renamed and consolidated
- [x] All tracking calls updated (5 locations)
- [x] No references to old event names remain
- [x] Pattern matches Perps implementation
- [x] Linting passes
- [x] Code formatted
- [x] Commit message follows conventions
- [ ] Segment schema PR created and linked
- [ ] Analytics team notified of changes
- [ ] Manual testing completed
## 🚀 Deployment Notes
**Important:** The Segment schema changes must be deployed **before** or
**at the same time** as this code change. Otherwise, the new event name
won't be recognized by Segment.
**Deployment Order:**
1. Merge and deploy Segment schema PR
2. Merge and deploy this mobile PR
---
**Questions?** Contact the Predict team or ping `#metamask-metametrics`
on Slack.
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **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: implement prediction on trending
## **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**
https://github.com/user-attachments/assets/d5557dc2-c4d7-48cc-9cdf-5527af33aa78
<!-- [screenshots/recordings] -->
## **Pre-merge author checklist**
- [ ] 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.
## **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_SUMMARY -->
---
> [!NOTE]
> Enables navigation to the Predict market list from the Predictions
section and balance card, refines the carousel layout/skeletons, and
updates tests accordingly.
>
> - **Trending Predictions UI**
> - Implements `onViewAll` to navigate to `Routes.PREDICT.ROOT` →
`Routes.PREDICT.MARKET_LIST` in `PredictionSection`.
> - Refines carousel: sets card width to 80%, adds `carouselItemLast`
(full-width last card), and `carouselContentContainer` padding; updates
pagination dots to reflect data length.
> - Improves loading state: renders `PredictMarketSkeleton` items with
last-item width and static dot indicators.
> - **Explore Search**
> - Uses `PredictMarketSkeleton` for the predictions section
`renderSkeleton`.
> - **Tests**
> - Adds/updates navigation tests for "View all" and available balance
tap (PredictPositionsHeader), including route structure and call counts.
> - Updates loading and carousel tests to expect new skeletons and
behaviors.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4d2928a. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#22023) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** This PR implements automatic tracking of related feature flags in analytics events. When feature flags are accessed via `getFeatureFlag()`, their states are automatically captured as snapshots. These snapshots are then included in all analytics events tracked through the `useMetrics` hook, providing better context for understanding user behavior in relation to feature flag configurations. **Key changes:** 1. **Feature Flag Snapshot Tracking**: Added snapshot functionality to `FeatureFlagOverrideContext` that captures feature flag states (including key, value, type, description, override status) with timestamps when flags are accessed 2. **Automatic Event Enhancement**: Modified `useMetrics` hook to automatically include related feature flags in all analytics events via `generateGenericProperties()` **Benefits:** - Enables correlation between user actions and feature flag states - Helps identify which feature flags influence user behavior - Provides automatic context without requiring manual property addition in each tracking call - Supports data-driven decision making for feature flag rollouts ## **Changelog** CHANGELOG entry: null <!-- This is an internal developer tooling enhancement that does not affect end-user experience --> ## **Related issues** Fixes: [MCWP-176 Jira Ticket](https://consensyssoftware.atlassian.net/browse/MCWP-176) [github Issue](MetaMask/mobile-planning#2360) ## **Manual testing steps** ```gherkin Feature: Related feature flags in analytics events Scenario: Feature flags are automatically included in analytics events Given the app is running with feature flag override functionality enabled When a feature flag is accessed via getFeatureFlag() Then a snapshot of that flag (key, value, type, description, override status, timestamp) is captured Scenario: Analytics events include related flags Given the app has accessed one or more feature flags When an analytics event is tracked using useMetrics().trackEvent() Then the event properties automatically include a relatedFlags array containing snapshots of accessed flags And each snapshot includes the flag key, value, originalValue, type, description, isOverridden status, and timestamp Scenario: Multiple events capture the same flags Given a feature flag has been accessed When multiple analytics events are tracked Then each event includes the relatedFlags property with the same flag snapshots ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- Before this change, analytics events did not automatically include feature flag context. Manual property addition was required. --> ### **After** <!-- After this change, all events tracked via useMetrics automatically include relatedFlags property with feature flag snapshots. --> ## **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 - [ ] 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_SUMMARY --> --- > [!NOTE] > Automatically captures boolean feature flag states via `useMetrics.addTraitsToUser` when `getFeatureFlag` is called, including evaluated values for `boolean with minimumVersion`, with comprehensive tests added. > > - **Feature flags/analytics integration**: > - In `app/contexts/FeatureFlagOverrideContext.tsx`, integrate `useMetrics` and call `addTraitsToUser` when `getFeatureFlag` is invoked: > - Snapshots for `boolean` flags using current value. > - Snapshots for `boolean with minimumVersion` using the validated result from `validateMinimumVersion`. > - Update `getFeatureFlag` dependencies to include `addTraitsToUser`. > - **Tests**: > - In `app/contexts/FeatureFlagOverrideContext.test.tsx`: > - Mock `useMetrics` and verify snapshots are sent for boolean flags (including min-version cases) and not for non-boolean flags. > - Add `waitFor` usage for async assertions. > - Switch environment checks from `process.env.NODE_ENV` to `process.env.METAMASK_ENVIRONMENT` in version-related tests. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f8412fc. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Nico MASSART <NicolasMassart@users.noreply.github.com>
## **Description** This PR adds a mUSD ways to earn cta and bottom sheet. Only if the feature flag is turned on. ## **Changelog** CHANGELOG entry: rewards earn musd ways to earn cta ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/RWDS-699 ## **Screenshots/Recordings** ### **After** <img width="643" height="685" alt="image" src="https://github.com/user-attachments/assets/65a14168-c6c1-49ca-bde1-fbf3dde8b341" /> <img width="710" height="516" alt="image" src="https://github.com/user-attachments/assets/15f96dab-4618-416c-ba47-e5cbee411f2a" /> ## **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. ## **Pre-merge reviewer checklist** - [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] > Adds a flag-gated "Deposit mUSD" way to earn in Rewards with bottom sheet and external CTA link, plus selector, strings, and tests. > > - **Rewards UI**: > - Add `WayToEarnType.DEPOSIT_MUSD` and list item in `app/components/UI/Rewards/.../WaysToEarn/WaysToEarn.tsx`. > - Show bottom sheet for `deposit_musd` with new copy; CTA opens external URL via `Linking.openURL('https://go.metamask.io/turtle-musd')`. > - Gate visibility in list rendering by `selectRewardsMusdDepositEnabledFlag`. > - **Feature Flags/Selectors**: > - Add `MUSD_DEPOSIT_FLAG_NAME` and selector `selectRewardsMusdDepositEnabledFlag` in `app/selectors/featureFlagController/rewards/index.ts` with tests. > - **Localization**: > - Add i18n strings under `rewards.ways_to_earn.deposit_musd.*` in `locales/languages/en.json`. > - **Tests**: > - Extend `WaysToEarn.test.tsx` to cover flag gating, bottom sheet content, CTA behavior (including URL open), metrics events, and enum value. > - Add unit tests for the new selector in `app/selectors/featureFlagController/rewards/index.test.ts`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3e2e65c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…ted chains (#22631) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **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? --> Fixed a crash in the Bridge feature that occurred when attempting to fetch token icons for chains not supported by the tokenIcons API. **The Problem:** The `getTokenIconUrl` function in `app/components/UI/Bridge/utils/index.ts` was calling `formatAddressToAssetId` from `@metamask/bridge-controller`, which throws errors for unsupported chains. This unhandled error was causing the app to crash when users attempted to open the Card home screen. The crash occurred through the following chain: Card home uses the `useTokensWithBalance` hook, which calls `getTokenIconUrl` in the background to fetch icons for all tokens. When processing tokens on unsupported chains, `formatAddressToAssetId` would throw an uncaught exception that propagated up the stack and crashed the app, making the entire Card feature inaccessible to users. **The Solution:** Added proper error handling by wrapping the `formatAddressToAssetId` call in a try-catch block. The function now gracefully returns `undefined` instead of propagating the error, preventing app crashes. Also enhanced the inline documentation to clearly explain why this error suppression is expected and necessary. Additionally, added comprehensive test coverage for all error scenarios including unsupported chains, invalid address formats, and null/undefined return values. ## **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: Fixed crash when fetching token icons for unsupported chains in Bridge ## **Related issues** Fixes: #22475 ## **Manual testing steps** As a Card holder, open the Card home screen and check if the fail still happening. should see the card-related info like balance and selected asset, without any crashes or failures. ```gherkin Feature: Card home screen loads with tokens on unsupported chains Scenario: Card home displays correctly with tokens on unsupported chains Given the user is logged into MetaMask Mobile And the user has an active Card And the user has tokens on chains not supported by the tokenIcons API When the user navigates to the Card home screen Then the Card home screen loads successfully without crashes And the Card balance is displayed correctly And the selected asset information is visible And token list is rendered (with or without icons for unsupported chains) And all Card functionality remains operational ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> https://github.com/user-attachments/assets/4ae409f8-9e7d-4258-8e07-a4a85b78db58 ### **After** <!-- [screenshots/recordings] --> https://github.com/user-attachments/assets/320c71a2-5fcb-495f-b576-148fb0a7661c ## **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. ## **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_SUMMARY --> --- > [!NOTE] > Wraps token icon URL generation in try/catch to return undefined on errors and adds comprehensive tests for EVM/Solana behavior and error cases. > > - **Bridge utils**: > - Wrap `getTokenIconUrl` call to `formatAddressToAssetId` in a try/catch and return `undefined` on errors; retain EVM lowercasing and URL formatting. > - **Tests** (`app/components/UI/Bridge/utils/index.test.ts`): > - Mock `formatAddressToAssetId` and `isNonEvmChainId` from `@metamask/bridge-controller`. > - Add cases for `getTokenIconUrl` covering native/ERC20 (EVM), Solana native/SPL, `null`/`undefined` returns, and thrown errors (unsupported chain, invalid address). > - Verify `wipeBridgeStatus` behavior: twice for EVM (original + lowercase) and once for Solana; minor test description cleanups. > - Keep `isBridgeAllowed` tests intact with minor wording tweaks. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c7809ae. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Update the design of the Perps and Predict deposit confirmations. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: [#5820](MetaMask/MetaMask-planning#5820) ## **Manual testing steps** ## **Screenshots/Recordings** ### **Before** ### **After** <img width="300" alt="Redesign" src="https://github.com/user-attachments/assets/d3892c8e-85a0-4b49-aed3-ebc62453d7e5" /> <img width="300" alt="Redesign Quotes" src="https://github.com/user-attachments/assets/af560bc2-fcfc-4223-8546-03dc1c40bcd3" /> <img width="300" alt="Funds" src="https://github.com/user-attachments/assets/ff90e8ca-7921-4ba1-a82a-5967315fdf38" /> <img width="300" alt="Native" src="https://github.com/user-attachments/assets/aad41669-1850-46e6-b6af-71e14368bbf8" /> <img width="300" alt="In Progress" src="https://github.com/user-attachments/assets/5ef571d2-e871-434b-b8cc-0c09e7f58d0e" /> <img width="300" alt="Hardware" src="https://github.com/user-attachments/assets/c5f3ab7b-ba1f-412c-9412-875acae99912" /> ## **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. ## **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.
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **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 introduces a new `useFeatureFlag` hook that provides a
standardized way to access feature flags with built-in basic
functionality checks. The hook ensures that feature flags respect the
`basicFunctionalityEnabled` setting before returning their values.
**Key changes:**
1. **New `useFeatureFlag` hook**
(`app/components/hooks/useFeatureFlag.ts`):
- Provides a type-safe interface for accessing feature flags via the
`FeatureFlagNames` enum
- Automatically checks if basic functionality is enabled before
returning flag values
- Returns `false` if basic functionality is disabled, regardless of the
flag's actual value
- Currently includes `rewardsEnabled` in the enum, with the ability to
extend for future flags
2. **Performance optimization in `FeatureFlagOverrideContext`**:
- Added `useMemo` to memoize raw feature flags from Redux selector
- Prevents unnecessary re-renders when the selector returns the same
reference
3. **Test infrastructure improvements**:
- Updated `renderWithProvider` to include `FeatureFlagOverrideProvider`
by default
- Added optional `includeFeatureFlagOverrideProvider` parameter for test
flexibility
- Updated multiple test files to work with the new provider setup
4. **FeatureFlagOverride UI updates**:
- Now uses the `FeatureFlagNames` enum to validate which flags can be
toggled
- Ensures consistency between the hook and the override UI
**Reason for change:**
- Standardizes feature flag access across the codebase
- Ensures feature flags respect basic functionality settings
- Improves type safety and reduces potential runtime errors
- Provides a foundation for future feature flag additions
**Improvement/solution:**
- Centralized feature flag access logic reduces code duplication
- Type-safe enum prevents typos and invalid flag names
- Automatic basic functionality check ensures consistent behavior
- Better test infrastructure supports feature flag testing
## **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: Feature flag hook and context improvements
Scenario: useFeatureFlag hook respects basic functionality setting
Given the app is running with basic functionality disabled
When a component uses the useFeatureFlag hook to check rewardsEnabled
Then the hook should return false regardless of the actual flag value
Scenario: useFeatureFlag hook returns correct flag value when basic functionality is enabled
Given the app is running with basic functionality enabled
When a component uses the useFeatureFlag hook to check rewardsEnabled
Then the hook should return the actual feature flag value from the override context
Scenario: FeatureFlagOverrideProvider is included in test renders by default
Given a test uses renderWithProvider to render a component
When the component is rendered
Then the FeatureFlagOverrideProvider should be available in the component tree
Scenario: Feature flag context memoization prevents unnecessary re-renders
Given the FeatureFlagOverrideContext is mounted
When the Redux selector returns the same feature flags object reference
Then the context should not trigger unnecessary re-renders of consuming components
Scenario: FeatureFlagOverride UI validates flags using FeatureFlagNames enum
Given the Feature Flag Override screen is open
When viewing a feature flag that is in the FeatureFlagNames enum
Then the flag toggle should be enabled and functional
```
## **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**
- [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.
## **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_SUMMARY -->
---
> [!NOTE]
> Adds a type-safe useFeatureFlag hook with basic-functionality guard,
memoizes remote flags in the override context, integrates the provider
into test utilities, and updates the override UI to gate toggles by enum
and minimum version with expanded tests.
>
> - **Hooks**
> - Add `useFeatureFlag` with `FeatureFlagNames` enum and
basic-functionality check (`app/components/hooks/useFeatureFlag.ts`).
> - **Context**
> - Memoize `selectRemoteFeatureFlags` result and default to `{}` to
prevent null/undefined issues in `FeatureFlagOverrideProvider`.
> - **UI (Feature Flag Override)**
> - Gate boolean and versioned-boolean switches: enable only for keys in
`FeatureFlagNames`; for versioned flags also require supported
`minimumVersion` unless whitelisted.
> - For versioned booleans, toggle now updates and passes the full `{
enabled, minimumVersion }` object; show version support indicator.
> - **Test Infra**
> - Update `renderWithProvider` to include `FeatureFlagOverrideProvider`
by default with an opt-out flag; adjust affected tests.
> - **Tests**
> - Add comprehensive tests for `useFeatureFlag` behavior and override
UI (search/filter/empty states, gating, version handling, counts).
> - Update existing tests to work with the new provider setup and mocks.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c547063. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** * Update login screen with rive animations. Only local unlock screen to be changed. Welcome back screen during social login rehydration to remain the same for now. * JIra: https://consensyssoftware.atlassian.net/browse/SL-245 <!-- 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: Update login screen with rive animations. Only local unlock screen to be changed. Welcome back screen during social login rehydration to remain the same for now. ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: Login screen rive animation 1) Open the app. 2) Create account using socila login/srp 3) Complete the onboarding process. 4) Close the app and reopen it. 5) Observe animations in login screen and during rehydration it is same as existing screen. ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** https://www.figma.com/design/pViOUcmjwhEzFsdrwknpNc/Onboarding?node-id=14300-145910&t=Ir1K6aDpp5RevULI-0 <!-- [screenshots/recordings] --> ### **After** https://github.com/user-attachments/assets/379df18e-aaf0-4e8e-bbdf-f2709819e8de https://github.com/user-attachments/assets/8e0b6e42-1b95-4fb8-80cc-eb8ae634cf0e <!-- [screenshots/recordings] --> ## **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. ## **Pre-merge reviewer checklist** - [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] > Revamps the login UI with new Rive animations and routes social-login rehydration to a new OAuthRehydration screen, with navigation, styling, tests, and copy updates. > > - **UI/Animations**: > - Integrate `OnboardingAnimation` and new `FoxAnimation` (Rive) into `Views/Login` and `Views/Onboarding`; add pointerEvents/safe-area positioning and triggers. > - Add comprehensive tests for Fox animation behavior and platform-specific layout. > - **Auth Flow**: > - Introduce `Views/OAuthRehydration` for social login rehydration; `Login` now focused on local unlock and redirects to `Rehydrate` when needed. > - Refine back-press handling (login locks app), error handling, and biometric triggers. > - **Navigation**: > - Map `Rehydrate` to `OAuthRehydration` in `App.tsx` (onboarding and app stacks). > - **Styling**: > - Update login screen theming (light/dark backgrounds), text field background, scroll container, and animation wrappers. > - **Tests**: > - Add/refresh tests and snapshots for `Login`, `OAuthRehydration`, `FoxAnimation`, and `Onboarding`; update mocks. > - **i18n**: > - Change login password placeholder to `Enter password`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b9ea82d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: hieu-w <maestrokoder@gmail.com> Co-authored-by: ieow <4881057+ieow@users.noreply.github.com> Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** Added perps section in the trending view <!-- 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: added perps section in the trending view ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-1525 ## **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** https://github.com/user-attachments/assets/d2fb9a2b-5ae7-4dbe-91d8-c5fa53c39553 <!-- [screenshots/recordings] --> ## **Pre-merge author checklist** - [ ] 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. ## **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_SUMMARY --> --- > [!NOTE] > Adds a Perps market section to Trending, introduces shared SectionHeader/SectionCard, and wires Perps providers around search and Perps content. > > - **Trending Feed** > - **Perps Section**: New `PerpsSection` showing top 3 markets via `usePerpsMarkets`, with skeletons and navigation to market list/details. > - **Provider wiring**: Wraps Perps content with `PerpsConnectionProvider` and `PerpsStreamProvider` in `TrendingView` and `ExploreSearchScreen`. > - **Shared UI** > - **SectionHeader**: Simplified API (removes `viewAllText`; uses `strings('trending.view_all')`). > - **SectionCard**: New wrapper card component for section content. > - **Refactors**: `TrendingTokensSection` and `PredictionSection` updated to use new Section components and imports. > - **Navigation** > - Stack setup cleaned; Perps providers localized around Perps content only. > - **Tests** > - Adds unit tests for `PerpsSection` and `SectionHeader`; updates `TrendingView.test` mocks. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d733b65. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Reject confirmation if swipe on Android, previously only applied to iOS. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: [#6141](MetaMask/MetaMask-planning#6141) ## **Manual testing steps** ## **Screenshots/Recordings** ### **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 - [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. ## **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_SUMMARY --> --- > [!NOTE] > Expands `gestureEnd` listener to all full-screen confirmations (not just iOS) to trigger `onReject`, and updates tests accordingly. > > - **Hook `useClearConfirmationOnBackSwipe`** > - Apply `navigation.addListener('gestureEnd', ...)` whenever `isFullScreenConfirmation` is true (removed iOS-only guard) to call `onReject`. > - **Tests `useClearConfirmationOnBackSwipe.test.ts`** > - Expect `gestureEnd` listener to be registered and to invoke `onReject`. > - Verify unsubscribe on unmount for iOS path and no Android back handler on iOS. > - On Android, continue asserting hardware back press handling and also assert `gestureEnd` behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit abde76b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…22627) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **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? --> - replace KDF delays with explicit wallet visibility checks ## **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** - [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 - [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. ## **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_SUMMARY --> --- > [!NOTE] > Removes fixed delays and sync toggles, adding explicit wallet/account visibility waits and stability checks in account syncing E2E tests (including SRP import flows). > > - **E2E Tests (identity/account-syncing)** > - Replace `delay`-based timing with explicit `Assertions.expectElementToBeVisible` checks on `WalletView.container`, account lists, and specific accounts (with timeouts) after login, SRP import, and navigation. > - Add stability waits after renaming and before interacting (e.g., ensure account list and renamed account are visible). > - Remove `device.disableSynchronization()`/`enableSynchronization()` usages and KDF delay comments. > - Clean up unused `TestHelpers` import in `adding-and-renaming-accounts.spec.ts`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4cee7a2. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Use coin icon for deposit musd ways to earn. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/RWDS-699 ## **Screenshots/Recordings** ### **After** <img width="449" height="93" alt="image" src="https://github.com/user-attachments/assets/eee5891e-e22f-47f2-9bee-43e7a5d86306" /> ## **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. ## **Pre-merge reviewer checklist** - [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] > Replace `IconName.AttachMoney` with `IconName.Coin` for the `DEPOSIT_MUSD` way to earn in `WaysToEarn.tsx`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7ccdeed. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
# Predict GTM Modal Implementation ## Overview This PR implements a Go-To-Market (GTM) announcement modal for the Predict feature, similar to the existing Perps GTM Modal. The modal is displayed once to users after login when both the Predict feature and GTM modal feature flags are enabled. It also adjusts the gap between the Fees text and icon on the buy screen. <img width="1728" height="820" alt="image" src="https://github.com/user-attachments/assets/6aa70a3e-2b9e-4893-8901-916e319c9f95" /> ## Changes CHANGELOG entry: null ### 1. New Component: `PredictGTMModal` **Location:** `app/components/UI/Predict/components/PredictGTMModal/` Created a new modal component with the following features: - Full-screen background image with "Predict and Win" branding - "Powered by Polymarket" logo at the top - Responsive design with special handling for smaller screens (< 750px height) - Two action buttons: - **"Get started"**: Navigates to Predict feed - **"Not now"**: Returns to wallet home - Analytics tracking for user interactions - One-time display using AsyncStorage persistence **Key Files:** - `PredictGTMModal.tsx` - Main component - `PredictGTMModal.styles.ts` - Responsive styles with platform-specific scaling - `PredictGTMModal.test.tsx` - Unit tests - `index.ts` - Export file #### Responsive Design Features: - **Small screens (< 750px)**: - Title font: 40px (instead of 50px) - Subtitle font: 14px (instead of 16px) - Adjusted padding and background image sizing - **Normal screens (≥ 750px)**: - Title font: 50px with MM Poly font family - Subtitle font: 16px - Background image coverage: 107% width, 114% height ### 2. Navigation Integration **File:** `app/components/UI/Predict/routes/index.tsx` - Added `PredictGTMModal` to `PredictModalStack` under route `Routes.PREDICT.MODALS.GTM_MODAL` - Modal is presented within the Predict navigation stack ### 3. Wallet Integration **File:** `app/components/Views/Wallet/index.tsx` Added logic to display the modal on wallet load: - Created `checkAndNavigateToPredictGTM` callback to check if modal was shown - Added `useEffect` hook that triggers when both feature flags are enabled - Modal is shown only once per user (tracked in AsyncStorage) ### 4. Feature Flag **File:** `app/components/UI/Predict/selectors/featureFlags/index.ts` Added new selector `selectPredictGtmOnboardingModalEnabledFlag`: - Checks remote feature flag `predictGtmOnboardingModalEnabled` - Falls back to local environment variable `MM_PREDICT_GTM_MODAL_ENABLED` - Uses version-gated feature flag pattern ### 5. Storage Constant **File:** `app/constants/storage.ts` Added new storage key: ```typescript export const PREDICT_GTM_MODAL_SHOWN = `${prefix}predictGTMModalShown`; ``` ### 6. Analytics Events **File:** `app/components/UI/Predict/constants/eventNames.ts` Added analytics constants: ```typescript export const PREDICT_GTM_WHATS_NEW_MODAL = 'predict-gtm-whats-new-modal'; export const PREDICT_GTM_MODAL_ENGAGE = 'engage'; export const PREDICT_GTM_MODAL_DECLINE = 'decline'; ``` ### 7. Localization **File:** `locales/languages/en.json` Added new locale strings under `predict.gtm_content`: ```json { "title": "PREDICT AND WIN", "title_description": "Trade on the outcome of real-world events, like sports or elections.", "get_started": "Get started", "not_now": "Not now" } ``` ### 8. Image Assets Added two new images: - `app/images/predict-marketing.png` - Full-screen background with character and Yes/No buttons - `app/images/powered-by-polymarket.png` - Polymarket branding logo ### 9. PredictFeeSummary UI Adjustment **File:** `app/components/UI/Predict/components/PredictFeeSummary/PredictFeeSummary.tsx` Minor styling adjustment: - Removed `gap-1` from the Fees row container to adjust spacing between the "Fees" label and info icon - Changed from: `<Box twClassName="flex-row items-center gap-1">` - Changed to: `<Box twClassName="flex-row items-center">` ## User Flow 1. User opens MetaMask and navigates to Wallet 2. If Predict and GTM modal flags are enabled AND user hasn't seen the modal: - Modal is displayed with Predict branding 3. User can either: - **Click "Get started"**: - Modal is dismissed - User is navigated to Predict feed (market list) - Analytics event tracked: `PREDICT_GTM_MODAL_ENGAGE` - Storage flag set to prevent re-display - **Click "Not now"**: - Modal is dismissed - User returns to wallet home - Analytics event tracked: `PREDICT_GTM_MODAL_DECLINE` - Storage flag set to prevent re-display ## Navigation Pattern The modal follows the same navigation pattern as Perps GTM Modal: - **"Get started"**: Two sequential navigations 1. `navigate(Routes.WALLET.HOME)` - Return to home first 2. `navigate(Routes.PREDICT.ROOT, { screen: Routes.PREDICT.MARKET_LIST })` - Navigate to Predict feed - **"Not now"**: Single navigation - `navigate(Routes.WALLET.HOME)` - Return to home This pattern ensures: - Modal is properly dismissed - Navigation stack is maintained correctly - Back button works as expected from Predict feed ## Analytics Tracking All user interactions are tracked via MetaMetrics: - Event: `WHATS_NEW_LINK_CLICKED` - Properties: - `feature`: `predict-gtm-whats-new-modal` - `action`: `engage` or `decline` - Device analytics metadata ## Testing ### Unit Tests **File:** `app/components/UI/Predict/components/PredictGTMModal/PredictGTMModal.test.tsx` Comprehensive test coverage including: - ✅ Renders all main elements (title, subtitle, buttons, images) - ✅ Handles "Not now" button press: - Sets storage flag - Tracks analytics event - Navigates to wallet home - ✅ Handles "Get started" button press: - Sets storage flag with `emitEvent: false` - Tracks analytics event - Navigates to wallet home first - Navigates to Predict feed - ✅ Renders images correctly ### Manual Testing To test the modal: 1. Set feature flags to `true` (either via remote config or local env vars) 2. Clear the storage flag if needed: ```typescript await StorageWrapper.setItem(PREDICT_GTM_MODAL_SHOWN, 'false'); ``` 3. Open the app and navigate to Wallet 4. Modal should appear automatically 5. Test both button actions ### Screen Size Testing The modal has been optimized for different screen sizes: - Test on small screens (iPhone SE, devices with height < 750px) - Test on standard screens (iPhone 14, standard Android phones) - Test on large screens (iPhone 14 Pro Max, large Android phones) - Verify background image covers entire screen on all sizes - Verify text is readable on all sizes ## Design Specifications ### Typography - **Title**: - Font: MM Poly Variable - Weight: 400 (Regular) - Size: 50px (normal), 40px (small screens) - Line height: 100% - Color: `theme.colors.accent02.light` (#EAC2FF) - **Subtitle**: - Font: System default (iOS: System, Android: Roboto) - Weight: 500 (Medium) - Size: 16px (normal), 14px (small screens) - Line height: 24px - Color: `theme.colors.accent02.light` (#EAC2FF) ### Buttons - **"Get started"**: - Background: White - Text color: Black - Border radius: 12px - Width: Full width - Size: Large - **"Not now"**: - Background: Transparent - Text color: White - Border: None - Border radius: 12px - Width: Full width - Size: Large ### Images - **Background**: `predict-marketing.png` - Position: Absolute, covers entire screen - Size: 107% width × 112-114% height (for edge coverage) - Resize mode: Cover - **Powered by Polymarket**: `powered-by-polymarket.png` - Width: 200px (scaled) - Height: 24px (scaled) - Position: Top of header - Margin bottom: 8px - Resize mode: Contain ## Feature Flags Two feature flags control this feature: 1. **`predictTradingEnabled`** (or `MM_PREDICT_ENABLED`) - Enables the entire Predict feature - Version-gated 2. **`predictGtmOnboardingModalEnabled`** (or `MM_PREDICT_GTM_MODAL_ENABLED`) - Enables the GTM modal specifically - Version-gated - Both flags must be `true` for the modal to appear ## Dependencies No new external dependencies added. Uses existing libraries: - React Navigation for navigation - MetaMetrics for analytics - StorageWrapper for persistence - Design system components for UI ## Accessibility - Uses semantic components from the design system - Proper button labels for screen readers - Safe area insets handled via `SafeAreaView` - Touch targets meet minimum size requirements ## Performance Considerations - Modal is lazy-loaded as part of the navigation stack - Images are optimized and bundled - No expensive computations in render path - Analytics events are tracked asynchronously - Storage checks are performed only when needed ## Backwards Compatibility - Feature is opt-in via feature flags - No breaking changes to existing code - Storage flag prevents modal from appearing if previously shown - Graceful fallback if feature flags are not set ## Review Checklist - [ ] Component follows MetaMask Mobile coding guidelines - [ ] Responsive design works on all screen sizes - [ ] Unit tests pass and provide good coverage - [ ] Analytics events are properly tracked - [ ] Navigation flow works correctly (forward and back) - [ ] Modal appears only once per user - [ ] Feature flags control the feature correctly - [ ] Images are optimized and render correctly - [ ] Localization strings are added - [ ] No console errors or warnings - [ ] Code follows TypeScript best practices - [ ] Follows existing patterns (Perps GTM Modal) ## Screenshots The modal displays: - "Powered by Polymarket" logo at top - "PREDICT AND WIN" title in large purple text - Subtitle describing the feature - Full-screen branded background image - "Get started" button (white background) - "Not now" button (transparent) ## Related PRs/Issues This implementation follows the same pattern as the Perps GTM Modal for consistency. ## Migration Notes None required. This is a new feature with no data migration needed. ## Rollout Plan 1. Merge PR with feature flags disabled 2. Deploy to production 3. Enable `predictTradingEnabled` flag for beta users 4. Enable `predictGtmOnboardingModalEnabled` flag for beta users 5. Monitor analytics and user feedback 6. Gradually roll out to wider audience 7. Eventually enable for all users ## Maintenance - Storage flag: `@MetaMask:predictGTMModalShown` - Can be cleared to re-show modal for testing - Persists across app restarts - Feature flags can be toggled remotely without app update - Images can be updated by replacing assets and rebuilding app <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Adds a “Powered by Polymarket” logo to the Predict GTM modal with small-screen responsive style tweaks, and tightens spacing in the Fees row. > > - **Predict GTM Modal** (`app/components/UI/Predict/components/PredictGTMModal/`) > - **Branding**: Render `powered-by-polymarket.png` at the top of the header in `PredictGTMModal.tsx`. > - **Responsive styles** (`PredictGTMModal.styles.ts`): > - Add `MIN_SCREEN_HEIGHT_FOR_SMALL_SCREEN_STYLES` to gate small-screen adjustments. > - Tune `backgroundImage` height based on screen height; add `poweredByImage` style. > - Make `title` and `titleDescription` font sizes and padding smaller on short screens. > - **Predict Fee Summary** (`PredictFeeSummary.tsx`) > - Remove `gap-1` from the Fees row container to tighten spacing between label and info icon. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e7d3edd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…ure tab content is shown cp-7.59.0 (#22632) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** This PR addresses 2 issues - The `goToTabIndex` unintentionally triggered the last tab active on remount - The `goToTabIndex` unintentionally makes the content not visible and may need to be fixed in the TabList component - goToTabIndex calls handleTabPress - handleTabPress updates activeIndex - Content loading is deferred via the useEffect, which uses InteractionManager.runAfterInteractions() - Rendering happens immediately, but the check `if (!isLoaded) return null` means nothing renders until the InteractionManager callback completes Note: We may need to refactor PerpsMarketTabs - as there are unused variables such as `onActiveTabChange` - the order of the default active tab doesn't need to be passed from parents, as the use-case is to always show Position > Orders > Overview (always the first tab) - etc ## **Changelog** CHANGELOG entry: Fixed an issue where Perps market tabs could navigate unexpectedly and could skip the rendering of a tab ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/TAT-1982 ## **Manual testing steps** ```gherkin Feature: Perps Market Tabs Navigation Scenario: user switches between tabs in Perps market details Given user is viewing a market with an open position and open orders When user swipes between Position, Orders, and Statistics tabs Then tabs should switch smoothly without unexpected navigation And the selected tab should remain stable And the tab should show a content ``` ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** https://github.com/user-attachments/assets/20dfcaa6-6670-4305-a496-e1b329d3ea2b ### **After** <!-- [screenshots/recordings] --> https://github.com/user-attachments/assets/d58c3213-d11f-4a26-a49d-5747187369c5 ## **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. ## **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_SUMMARY --> --- > [!NOTE] > Restricts programmatic tab navigation to test environments to prevent unintended tab switching and missing content on remount. > > - **PerpsMarketTabs (`app/components/UI/Perps/components/PerpsMarketTabs/PerpsMarketTabs.tsx`)**: > - Gate programmatic tab sync to tests: only call `tabsListRef.current.goToTabIndex(activeIndex)` in test mode (`process.env.JEST_WORKER_ID || process.env.E2E`) to avoid unintended navigation on remount. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1465a34. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **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 solves the issue where users with alphanumeric ZIP/postal codes (such as those in the UK) are unable to complete the onboarding flow because the ZIP code field only accepts numeric input. The keyboard shown is numeric-only, and the field does not allow typing letters, preventing users from entering valid postal codes. ## **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: Fix ZIP Code Input Blocks Letters on Card Onboarding flow ## **Related issues** Fixes: #22633 ## **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] --> <img width="332" height="720" alt="image" src="https://github.com/user-attachments/assets/1a5056ed-225c-49f1-ac1a-f94a0162b15d" /> ### **After** <!-- [screenshots/recordings] --> <img width="332" height="720" alt="Simulator Screenshot - iPhone 16 - 2025-11-13 at 11 08 53" src="https://github.com/user-attachments/assets/26cb5338-e93c-485e-bcc6-51b7b447cf15" /> ## **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. ## **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_SUMMARY --> --- > [!NOTE] > Change `keyboardType` of the `zipCode` `TextField` in `PhysicalAddress.tsx` from `number-pad` to `default` to allow alphanumeric input. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6082943. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** This PR removes Wallet Details 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: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/TMCU-186 ## **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** - [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. ## **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_SUMMARY --> --- > [!NOTE] > Remove Wallet Details V1 and feature-flag paths, consolidate to account-group list with direct account creation, and update tests/e2e accordingly. > > - **Wallet Details (Base)**: > - Remove state-1/feature-flag logic and legacy modal flow; always render account groups via `FlashList` with trailing `add-account` item. > - Simplify add-account: `handlePress` directly calls `MultichainAccountService.createNextMultichainAccountGroup` and scrolls to end; remove account-level rendering/navigation. > - Keep SRP reveal/backup section; minor balance rendering unchanged. > - **Removed**: > - `components/AccountItem.tsx` > - `components/WalletAddAccountActions.tsx` and its test. > - **Unit Tests** (`index.test.tsx`): > - Drop feature-flag mocks and legacy view tests; assert account-group rendering, add-account creation parameters, SRP behaviors, and key extraction. > - **E2E** (`e2e/specs/accounts/wallet-details.spec.ts`): > - Replace legacy fixtures wrapper with `withFixtures` and `FixtureBuilder`; add `loginToApp`. > - Mock remote feature flag for Account Details V2; validate creating an account and SRP export flows. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b4e72e1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Fix the generation of the `simulation_sending_assets_total_value` property by reading it from the required tokens. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #6245 ## **Manual testing steps** ## **Screenshots/Recordings** ### **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 - [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. ## **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_SUMMARY --> --- > [!NOTE] > Compute `simulation_sending_assets_total_value` from required tokens instead of `useTokenAmount`, updating hook logic and tests accordingly. > > - **Metrics hook (`useTransactionPayMetrics`)**: > - Replace `useTokenAmount` with `useTransactionPayRequiredTokens` to derive primary required token and compute `sendingValue` from `amountHuman`. > - Set `simulation_sending_assets_total_value` for `perps_deposit` and `predict_deposit` using the derived numeric value. > - Keep existing quote, fee, strategy, and dust metrics logic intact. > - **Tests (`useTransactionPayMetrics.test.ts`)**: > - Mock `useTransactionPayRequiredTokens` and expect numeric `simulation_sending_assets_total_value` (e.g., `1.23`). > - Remove reliance on `useTokenAmount`; adjust mocks and expectations for quotes/steps, dust, token list size, and fees. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4d1b8fd. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…2539) ## **Description** Upgrades notification services controller and adds the new Platform Notification Item UI. https://www.figma.com/design/c7GgNw2kScGrVyRGAPhwEd/Notifications?node-id=1030-97574&m=dev <!-- 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: feat: add generic Platform Notification support ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-1302 ## **Manual testing steps** Test Notifications 1. Enable Notifications 2. Go to notification menu - does it render correctly? Test Platform Notifications 0. Requires creating a platform notification for users (this is currently only via shield team, but will be expanded for other teams soon) 1. Click notification menu - do you see the platform notification 2. Try clicking platform notification CTA (if added) ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> https://www.loom.com/share/2285e2b916604eea9b879ee5c4d018f8 https://www.loom.com/share/8ec2ba49fc204bd989efa79585aeaa97 ## **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. ## **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_SUMMARY --> --- > [!NOTE] > Upgrades notification services controller to v20 and adds Platform notification support with a new CTA UI, refactors click/metrics/badge handling, and aligns code/tests to the new payload API. > > - **Notifications UI**: > - **CTA**: New `NotificationMenuItem.Cta` with deeplink/external link handling; integrated into `NotificationsListItem` and exposed via `NotificationMenuItem`. > - **Icon/Styling**: Optional `badgeIcon`, unread indicator revamped; uses `Box`/Tailwind; cleans up styles. > - **Click Handling**: Split into `handleNotificationClickMetricsAndUpdates` and navigation; decrements badge by 1; events include extra data. > - **Platform Notifications**: > - New state `platform-notifications` added to `NotificationComponentState`; renders title/body/image and optional `cta`. > - **Payload API migration**: > - Switches many notification states and helpers to `payload.*` fields (e.g., `chain_id`, `tx_hash`, NFT/token data); updates block explorer and network fee helpers. > - **Push/FCM**: > - Adapted to new types (`UnprocessedRawNotification`, `toRawAPINotification`); relaxed `isINotification` guard; background/initial handling unchanged. > - **Controller setup**: > - `create-notification-services-controller` now passes `platformVersion` and `locale`; tests updated. > - **Tests**: > - Added/updated tests for CTA, Icon, Content, notification list click flow, and component-state coverage; removed brittle snapshots. > - **Dependency**: > - Bump `@metamask/notification-services-controller` to `^20.0.0`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 18b1594. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
# Predict: Add Sentry Performance Tracking
## Summary
This PR implements comprehensive Sentry performance tracking for the
Predict feature **from scratch**. Previously, Predict had **no
performance monitoring** - we could not measure screen load times,
operation durations, or identify bottlenecks. This implementation adds
complete observability following the established Perps pattern.
CHANGELOG entry: null
## What This Adds
- **Complete observability** across all user-facing flows
- **21 distinct traces** covering screens, operations, and toasts
- **Searchable tags** for filtering in Sentry (`feature:Predict`,
`providerId`, `side`, etc.)
- **Debug context** for troubleshooting screen load issues
- **Error tracking** with full context for all operations
- **Performance baselines** for future optimization
---
## What We Implemented
### 1. Infrastructure (NEW)
**Created `usePredictMeasurement` Hook:**
- Location: `app/components/UI/Predict/hooks/usePredictMeasurement.ts`
- Declarative API for UI performance tracking
- Conditional start/end logic based on data loading
- Auto-reset for modals and dynamic content
- Automatically applies `feature: Predict` tag
**Added Trace Names & Operations:**
- Location: `app/util/trace.ts`
- 13 new `TraceName` entries for Predict
- 3 new `TraceOperation` entries (`PredictOperation`,
`PredictOrderSubmission`, `PredictDataFetch`)
**Added Error Context Helper:**
- Location: `app/components/UI/Predict/controllers/PredictController.ts`
- Consistent error logging across all operations
- Enables `feature:Predict` filtering in Sentry
### 2. UI Screen Tracking (6 screens)
Added performance tracking to all user-facing screens:
| Screen | What We Track | Why It Matters |
|--------|---------------|----------------|
| **Feed** | Time to display market list | First impression, most
visited screen |
| **Market Details** | Time to display chart + data | Core UX,
conversion funnel entry |
| **Buy Preview** | Time to show order preview | Conversion funnel,
order flow |
| **Sell Preview** | Time to show sell preview | Exit flow, claim flow |
| **Positions Tab** | Time to show positions | First screen from wallet
|
| **Transactions** | Time to display history | Activity tracking,
engagement |
**Implementation:**
```typescript
// Example: Market Details tracking
usePredictMeasurement({
traceName: TraceName.PredictMarketDetailsView,
conditions: [!isMarketFetching, !!market, !isRefreshing],
debugContext: {
marketId: market?.id,
hasMarket: !!market,
loadingStates: { isMarketFetching, isRefreshing },
},
});
```
### 3. Controller Operation Tracking (11 operations)
Added comprehensive tracing to all controller operations:
**Trading Operations:**
- `placeOrder` - Order execution timing
- Order preview - Quote generation timing
- `claim` - Cashout timing
**Data Fetch Operations:**
- `getMarkets` - Market list loading
- `getMarket` - Market details loading
- `getPositions` - User positions loading
- `getActivity` - Activity history loading
- `getBalance` - Balance checking
- `getAccountState` - Account state loading
- `getPriceHistory` - Chart data loading
- `getPrices` - Current price loading
- `getUnrealizedPnL` - P&L calculation
**Implementation Pattern:**
```typescript
async placeOrder(params: PlaceOrderParams): Promise<Result> {
const traceId = `place-order-${Date.now()}`;
let traceData: { success: boolean; error?: string } | undefined;
trace({
name: TraceName.PredictPlaceOrder,
op: TraceOperation.PredictOrderSubmission,
id: traceId,
tags: {
feature: PREDICT_CONSTANTS.FEATURE_NAME,
providerId: providerId ?? 'unknown',
side: preview.side,
},
data: {
marketId: analyticsProperties?.marketId,
},
});
try {
const result = await provider.placeOrder(params);
traceData = { success: true, side: preview.side };
return result;
} catch (error) {
traceData = { success: false, error: errorMessage };
Logger.error(ensureError(error), this.getErrorContext('placeOrder'));
throw error;
} finally {
endTrace({ name: TraceName.PredictPlaceOrder, id: traceId, data: traceData });
}
}
```
### 4. Toast Notification Tracking (4 toasts)
Added tracking for user feedback timing:
- Order submission toast
- Order confirmation toast
- Cashout submission toast
- Cashout confirmation toast
**Why this matters:** Measures complete user journey from API call to UI
feedback. Helps identify if UI rendering (not API) is the bottleneck.
---
## Key Implementation Details
### Tags vs Data Pattern
Following Perps convention:
**Tags** (Searchable/Filterable in Sentry):
```typescript
tags: {
feature: PREDICT_CONSTANTS.FEATURE_NAME, // Filter all Predict traces
providerId: 'polymarket', // Filter by provider
side: 'BUY', // Filter BUY vs SELL
claimable: true, // Filter claimable positions
interval: '1h', // Filter by chart interval
}
```
**Data** (Contextual Debugging Info):
```typescript
data: {
success: true, // Operation result
error: 'Network timeout', // Error details
marketId: 'abc123', // Specific identifiers
marketCount: 42, // Result counts
}
```
### Reliability Patterns
**Finally blocks ensure traces always complete:**
```typescript
try {
// ... operation ...
traceData = { success: true };
} catch (error) {
traceData = { success: false, error };
throw error;
} finally {
// Always executes, even on error
endTrace({ name, id, data: traceData });
}
```
**Debug context for troubleshooting:**
```typescript
usePredictMeasurement({
traceName: TraceName.PredictMarketDetailsView,
debugContext: {
marketId: market?.id, // What was being loaded
loadingStates: { isMarketFetching }, // Loading state snapshot
},
});
```
---
## Benefits
### For Engineering
✅ **Visibility into Predict performance** - Previously had zero metrics
✅ **Identify bottlenecks** - See which operations are slow
✅ **Performance baselines** - Track improvements/regressions
✅ **Error context** - Failures include operation details
✅ **Consistent patterns** - Matches Perps implementation
### For Product/Support
✅ **Searchable in Sentry** - Filter by `feature:Predict`
✅ **User journey tracking** - Complete flow timing
✅ **Performance trends** - Monitor over time
✅ **Provider comparison** - Compare Polymarket performance (ready for
multi-provider)
✅ **A/B testing support** - Compare performance across variants
### For Performance Optimization
✅ **P50/P95/P99 metrics** - Statistical analysis
✅ **Regression detection** - Alert on performance degradation
✅ **User segmentation** - Analyze by network/device
✅ **Operation comparison** - Which operations are slowest?
---
## Sentry Queries (Examples)
```
# All Predict traces
feature:Predict
# Buy orders only
feature:Predict side:BUY
# Failed operations
feature:Predict success:false
# Slow operations (P95 > 1s)
feature:Predict p95(transaction.duration):>1000
# Screen loads specifically
feature:Predict transaction:Predict*View
# Data fetches only
feature:Predict transaction:Predict Get*
```
---
## Testing
### Manual Testing Checklist
- [x] Navigate through all 6 screens - traces fire correctly
- [x] Place BUY order - trace includes `side:BUY` tag
- [x] Place SELL order - trace includes `side:SELL` tag
- [x] Claim winnings - trace includes `claimable:true` tag
- [x] View transaction history - trace includes activity count
- [x] All toasts display - traces show timing
- [x] Force error in operation - trace includes error context
- [x] Check Sentry dashboard - all traces appear with correct tags
### Verified in Sentry
- [x] All 21 traces appear in performance dashboard
- [x] `feature:Predict` tag present on all traces
- [x] Tags are searchable/filterable
- [x] Debug context appears in trace details
- [x] Error context links to operations
- [x] Duration calculations are accurate
---
## Files Changed (15 total)
### Core Implementation (5 files)
- ✅ `app/util/trace.ts` - Added 13 TraceName + 3 TraceOperation entries
- ✅ `app/components/UI/Predict/hooks/usePredictMeasurement.ts` - **NEW**
hook
- ✅ `app/components/UI/Predict/controllers/PredictController.ts` - Added
tracing to 11 operations
- ✅ `app/components/UI/Predict/hooks/usePredictPlaceOrder.ts` - Added
toast tracking
- ✅ `app/components/UI/Predict/constants/errors.ts` - Added
`FEATURE_NAME` constant
### Views (6 files)
- ✅ `app/components/UI/Predict/views/PredictFeed/PredictFeed.tsx`
- ✅
`app/components/UI/Predict/views/PredictMarketDetails/PredictMarketDetails.tsx`
- ✅
`app/components/UI/Predict/views/PredictBuyPreview/PredictBuyPreview.tsx`
- ✅
`app/components/UI/Predict/views/PredictSellPreview/PredictSellPreview.tsx`
- ✅ `app/components/UI/Predict/views/PredictTabView/PredictTabView.tsx`
- ✅
`app/components/UI/Predict/views/PredictTransactionsView/PredictTransactionsView.tsx`
### Documentation (4 files)
- ✅ `docs/predict/predict-sentry-performance.md` - Complete
implementation guide
- ✅ `docs/predict/predict-sentry-implementation-summary.md` - High-level
overview
- ✅ `docs/predict/predict-views-analysis.md` - View-by-view analysis
- ✅ `docs/predict/IMPLEMENTATION_VERIFICATION.md` - Verification
checklist
**Total changes:** 3,707 insertions, 34 deletions
---
## Implementation Highlights
### ✅ What We Did
1. **`finally` pattern for all traces** - Ensures traces complete even
on error
2. **Tags vs data separation** - Searchable tags, contextual data
3. **Feature tag on every trace** - Easy filtering: `feature:Predict`
4. **Debug context on all views** - Troubleshooting information
5. **Standardized error logging** - Consistent context across operations
6. **Type-safe trace data** - All values conform to `TraceValue` type
### ❌ What We Excluded (Intentionally)
1. **`setMeasurement` in operations** - `trace()`/`endTrace()` provides
sufficient granularity
2. **`DevLogger.log` calls** - Sentry provides all debugging information
3. **Separate performance metrics enum** - `TraceName` is sufficient
4. **Performance logging markers** - Not needed for production
monitoring
---
## Breaking Changes
**None.** This is a purely additive implementation.
- All existing functionality unchanged
- No API changes to controllers or hooks
- No impact on users without Sentry consent
- Feature flag compatible (if needed)
---
## Performance Overhead
- **Minimal** - Sentry tracing adds <1ms per operation
- **No impact on user experience**
- **Sampling can be configured** to manage Sentry quota
- **Development impact** - Zero (no DevLogger calls in production)
---
## Comparison with Perps
We followed the Perps pattern exactly:
| Pattern | Perps | Predict | Status |
|---------|-------|---------|--------|
| **Hook-based UI tracking** | ✅ `usePerpsMeasurement` | ✅
`usePredictMeasurement` | ✅ Same |
| **Direct operation tracing** | ✅ `trace()`/`endTrace()` | ✅
`trace()`/`endTrace()` | ✅ Same |
| **Tags for filtering** | ✅ | ✅ | ✅ Same |
| **Debug context** | ✅ | ✅ | ✅ Same |
| **Finally pattern** | ✅ | ✅ | ✅ Same |
| **Feature tag** | ✅ | ✅ | ✅ Same |
| **Error context helper** | ✅ | ✅ | ✅ Same |
**Key differences:**
- Predict: 6 screens vs Perps: 8 screens (simpler UX)
- Predict: No WebSocket tracking (REST only)
- Predict: Single provider vs Perps: multi-provider (for now)
---
## Next Steps
### Immediate (Post-Merge)
1. Monitor Sentry dashboard for first week
2. Verify sampling rate is appropriate
3. Check Sentry quota usage
4. Create performance baselines
### Short-term (1-2 weeks)
1. Analyze P50/P95/P99 metrics for each operation
2. Identify slow operations for optimization
3. Create Sentry alerts for regressions
4. Share performance insights with team
### Long-term (Ongoing)
1. Regular performance reviews (monthly)
2. Track improvements/regressions over time
3. Use data to inform optimization priorities
4. Update traces as feature evolves
---
## Documentation
Complete documentation available:
- **Implementation guide**: `docs/predict/predict-sentry-performance.md`
- All patterns and examples
- Usage guide for extending tracking
- Sentry query examples
- **Quick reference**: `app/components/UI/Predict/README.md`
- Updated with performance section
- Links to full documentation
- **Verification**: `docs/predict/IMPLEMENTATION_VERIFICATION.md`
- Complete checklist
- What was implemented vs planned
---
## Questions for Reviewers
1. ✅ Coverage complete? - All 6 screens + 11 operations tracked
2. ✅ Tags appropriate? - `feature`, `providerId`, `side`, `claimable`,
`interval`
3. ✅ Debug context useful? - Includes loading states, counts, IDs
4. ✅ Error handling correct? - All operations use `finally` + error
context
---
## Screenshots/Examples
### Sentry Trace Example (Order Placement):
```json
{
"name": "Predict Place Order",
"op": "predict.order_submission",
"tags": {
"feature": "Predict",
"providerId": "polymarket",
"side": "BUY"
},
"data": {
"marketId": "abc123",
"success": true
},
"duration": 234,
"status": "ok"
}
```
### Sentry Query Results:
```
feature:Predict
→ Shows all 21 Predict traces
→ P50: 145ms, P95: 428ms, P99: 1.2s
feature:Predict side:BUY
→ Shows only BUY orders
→ P50: 234ms, P95: 567ms
```
---
## Related
- Follows patterns from Perps Sentry implementation
- Aligns with MetaMask observability standards
- Part of broader performance monitoring initiative
---
**This PR adds complete Sentry performance tracking to Predict from
scratch, providing the observability needed to monitor, optimize, and
maintain the feature's performance.**
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Implements comprehensive Sentry performance tracing for Predict via a
new hook, controller operation spans, toast traces, and expanded trace
enums, plus docs.
>
> - **Observability Infrastructure**:
> - **New Hook**: `usePredictMeasurement` for declarative UI tracing
with conditional start/end/reset and debug context.
> - **Trace System**: Extend `app/util/trace.ts` with Predict
`TraceName` and `TraceOperation` entries.
> - **Controller Instrumentation (`PredictController.ts`)**:
> - Add `trace`/`endTrace` with tags/data and `finally` blocks to
operations: `getMarkets`, `getMarket`, `getPriceHistory`, `getPrices`,
`getPositions`, `getActivity`, `getUnrealizedPnL`, `getAccountState`,
`getBalance`, `placeOrder`, `claimWithConfirmation`.
> - Standardize error logging context via `getErrorContext`; update
state on success/error.
> - **UI Screens**:
> - Add `usePredictMeasurement` to `PredictFeed`,
`PredictMarketDetails`, `PredictBuyPreview`, `PredictSellPreview`,
`PredictTabView`, `PredictTransactionsView` with relevant conditions and
debug context.
> - **Toasts & UX Feedback**:
> - Trace order/cashout confirmation toasts in `usePredictPlaceOrder`
using `Predict*Toast` trace names.
> - **Constants**:
> - Annotate `PREDICT_CONSTANTS.FEATURE_NAME` for Sentry filtering
(`feature:Predict`).
> - **Docs**:
> - Add `docs/predict/predict-sentry-performance.md` detailing patterns,
usage, and queries.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
99a6840. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **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?
-->
Refactored the AI E2E tags selector.
Key Changes
Architecture:
- Split monolithic file into organized modules: tools/, prompts/,
analysis/, utils/, config/
- Created selector.ts as main orchestrator
- Added comprehensive TypeScript types
Tag Configuration:
- Centralized all tag definitions in e2e/tags.js via aiE2EConfig array
- Single source of truth for tag names and descriptions
- Eliminated duplicate definitions across files
Documentation:
- Added README.md with architecture overview
- Included examples for extending functionality
Files Changed
- e2e/scripts/ai-e2e-tags-selector.ts - Reduced to entry point
- e2e/scripts/ai-e2e-tags-selector/ - 22 new modular files
- e2e/tags.js - Added aiE2EConfig export
## **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**
- [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
- [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.
## **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_SUMMARY -->
---
> [!NOTE]
> Replaces the old AI E2E analysis with a new Smart E2E Selection action
and modular analyzer, updates CI wiring, restructures E2E tags, and
adjusts linting/docs.
>
> - **CI / GitHub Actions**:
> - Replace `ai-e2e-analysis` with `smart-e2e-selection` composite
action (`.github/actions/smart-e2e-selection/action.yml`).
> - Update `ci.yml` to use new action, expose `ai_e2e_test_tags` and
`ai_confidence`, and post PR comments; remove old job wiring.
> - Add skip label handling `skip-smart-e2e-selection` and enable PR
comment cleanup/posting.
> - **Analyzer Tooling (new)**:
> - Add `e2e/tools/e2e-ai-analyzer` with modular architecture:
`analysis/`, `ai-tools/` (read_file, get_git_diff, related_files,
list_directory, grep_codebase, finalize_tag_selection),
`modes/select-tags/` (handlers, prompt), `utils/` (git/file),
`config.ts`, `types`, and README.
> - Add runner script `.github/scripts/e2e-smart-selection.mjs` to
execute analyzer and write outputs/PR comment content.
> - **Removals / Migrations**:
> - Delete legacy AI analysis action and script:
`.github/actions/ai-e2e-analysis/action.yml`,
`.github/scripts/ai-e2e-analysis.mjs`.
> - Remove monolithic selector `e2e/scripts/ai-e2e-tags-selector.ts` and
AI section from `e2e/docs/README.md`.
> - **E2E Tags**:
> - Rewrite `e2e/tags.js`: introduce `smokeTags` and `otherTags` as
single source of truth; export standardized tag helper functions; expand
tag set.
> - **Linting / Config**:
> - ESLint: include `e2e/tools/**/*.{js,ts}` in relaxed rules override.
> - package.json: remove `ai-e2e` script.
> - **Docs / Guidelines**:
> - Update labeling guidelines with `skip-e2e-quality-gate` and
`skip-smart-e2e-selection` labels.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0adf2ae. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: Javier Briones <1674192+jvbriones@users.noreply.github.com>
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **Description**
* Fix: login component code cleanup
* Remove unused code
<!--
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**
Fixes:
* Fix: login component code cleanup
* Remove unused code
## **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**
- [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.
## **Pre-merge reviewer checklist**
- [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]
> Cleans up `Login` by removing an unused trace context/ref and several
redundant `endTrace` calls in the login flow.
>
> - **Login (`app/components/Views/Login/index.tsx`)**:
> - Remove unused `TraceContext` import and
`passwordLoginAttemptTraceCtxRef` `useRef`.
> - Delete redundant `endTrace` calls for
`OnboardingPasswordLoginAttempt`, `OnboardingExistingSocialLogin`, and
`OnboardingJourneyOverall`.
> - Update `onLogin` dependencies to drop
`passwordLoginAttemptTraceCtxRef`.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
61dc54f. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…22608) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** This PR prevents errors when the not trimmed amount is passed to balanceToFiat and other conversion functions. Now both `handleETHPrimaryCurrency` and `handleFiatPrimaryCurrency` receive the amount with leading/trailing spaces stripped via .trim() before processing. <!-- 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** Fixes: #17369 https://consensyssoftware.atlassian.net/browse/TMCU-128 ## **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** - [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. ## **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_SUMMARY --> --- > [!NOTE] > Normalizes amount input (trim and comma-to-dot) in PaymentRequest and adds tests for whitespace handling. > > - **PaymentRequest (`app/components/UI/PaymentRequest/index.js`)** > - Normalize `amount` in `updateAmount`: trim whitespace and replace `,` with `.`. > - Pass normalized `amount` to `handleFiatPrimaryCurrency` and `handleETHPrimaryCurrency`. > - **Tests (`app/components/UI/PaymentRequest/index.test.tsx`)** > - Add tests to verify trimming of leading/trailing spaces. > - Add test to ensure whitespace-only input does not throw. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c777e28. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->
## **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 change removes Sei from the default preloaded networks so that it
no longer appears as a default entry in the networks list.
Instead, it will now be displayed under Additional Networks, allowing
users to manually add it if needed.
Additionally, this update introduces a fallback RPC for Sei
(QUICKNODE_SEI_URL) in customNetworks.tsx, ensuring improved redundancy
and reliability when Infura is unavailable.
## **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: removed Sei from default networks and added QuickNode
fallback RPC.
## **Manual testing steps**
```gherkin
Feature: Sei network configuration updates
Scenario: Verify Sei is not listed as a default network
Given the app is freshly installed or reset
When I open the list of default networks
Then I should NOT see "Sei" listed in the main network list
And I should see "Sei" listed under the "Additional Networks" section
Scenario: Verify Sei can be manually added
Given I open the "Add Network" flow
When I search for "Sei"
Then I should be able to add the "Sei" network manually
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<!-- [screenshots/recordings] -->
<img width="391" height="799" alt="Screenshot 2025-11-10 at 21 19 16"
src="https://github.com/user-attachments/assets/f9a2266d-b27f-453e-a0c1-c60ca0b2d15e"
/>
## **Pre-merge author checklist**
- [ ] 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.
## **Pre-merge reviewer checklist**
- [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]
> Removes Sei from default networks and adds a QuickNode fallback RPC,
including a migration to populate failoverUrls and associated
test/snapshot updates.
>
> - **Networks**:
> - Remove `sei-mainnet` from default `NetworkController` state so it
appears under Additional Networks
(`app/core/Engine/controllers/network-controller-init.ts`).
> - Add QuickNode mapping for `sei-mainnet` and use it as
`failoverRpcUrls` in `PopularList`
(`app/util/networks/customNetworks.tsx`).
> - **Migration**:
> - Add `migration107` to append `failoverUrls` to SEI RPC endpoints
when missing, guarded by `QUICKNODE_SEI_URL`
(`app/store/migrations/107.ts`, wired in
`app/store/migrations/index.ts`).
> - Comprehensive tests for structure validation and behavior
(`app/store/migrations/107.test.ts`).
> - **Tests/Snapshots**:
> - Update AddressSelector expectations/snapshot to exclude `Sei` from
EVM list (`app/components/Views/AddressSelector/*`).
> - Extend QuickNode env support to include `QUICKNODE_SEI_URL` in utils
tests (`app/core/Engine/controllers/network-controller/utils.test.ts`).
> - Update logs and initial background state fixtures to remove default
SEI config (`app/util/logs/__snapshots__/index.test.ts.snap`,
`app/util/test/initial-background-state.json`).
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
27c61df. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: Stanley Yuen <102275989+stanleyyconsensys@users.noreply.github.com>
## **Description** This PR makes it so that the activity grid in rewards can identify predict and deposit musd type events. ## **Changelog** CHANGELOG entry: feat rewards activity grid predict and deposit musd ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/RWDS-697 ## **Screenshots/Recordings** ### **After** <img width="469" height="154" alt="image" src="https://github.com/user-attachments/assets/ae81b968-8f99-4392-9704-7e2b20b4df66" /> <img width="544" height="448" alt="image" src="https://github.com/user-attachments/assets/e874d717-ba16-4488-ac87-7c7bf71cfd4c" /> ## **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. ## **Pre-merge reviewer checklist** - [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] > Adds Rewards Activity support for PREDICT and MUSD_DEPOSIT events, including UI details, date formatting utilities, types, i18n strings, and comprehensive tests. > > - **Rewards Activity UI**: > - Add `MUSD_DEPOSIT` handling in `ActivityDetailsSheet` via new `MusdDepositEventDetails` component. > - Ensure `PREDICT` events render without description in `ActivityEventRow`. > - **Utils**: > - Update `getEventDetails` to support `PREDICT` and `MUSD_DEPOSIT` (with formatted "For {{date}}" detail and icons). > - Add `formatUTCDate` and `formatRewardsMusdDepositPayloadDate` in `utils/formatUtils`. > - **Types**: > - Introduce `MusdDepositEventPayload` and extend `PointsEventDto` union with `PREDICT` and `MUSD_DEPOSIT`. > - **i18n**: > - Add strings for prediction, mUSD deposit, and deposit-period/date labels in `locales/languages/en.json`. > - **Tests**: > - New/expanded tests for `ActivityEventRow`, `ActivityDetailsSheet`, `MusdDepositEventDetails`, `eventDetailsUtils`, and `formatUtils`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 99d004a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=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 : )