Skip to content

[pull] main from MetaMask:main#323

Merged
pull[bot] merged 34 commits into
Reality2byte:mainfrom
MetaMask:main
Nov 13, 2025
Merged

[pull] main from MetaMask:main#323
pull[bot] merged 34 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Nov 13, 2025

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

khanti42 and others added 30 commits November 13, 2025 11:36
<!--
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>
grvgoel81 and others added 4 commits November 13, 2025 16:54
<!--
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 -->
@pull pull Bot locked and limited conversation to collaborators Nov 13, 2025
@pull pull Bot added the ⤵️ pull label Nov 13, 2025
@pull pull Bot merged commit 20f3ae5 into Reality2byte:main Nov 13, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.