Skip to content

Conversation

@metamaskbot
Copy link
Collaborator

@metamaskbot metamaskbot commented Nov 6, 2025

🚀 v7.59.0 Testing & Release Quality Process

Hi Team,
As part of our new MetaMask Release Quality Process, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment.


📋 Key Processes

Testing Strategy

  • Developer Teams:
    Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows.
  • QA Team:
    Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing.
  • Customer Success Team:
    Validate new functionalities and provide feedback to support release monitoring.

GitHub Signoff

  • Each team must sign off on the Release Candidate (RC) via GitHub by the end of the validation timeline (Tuesday EOD PT).
  • Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed.

Issue Resolution

  • Resolve all Release Blockers (Sev0 and Sev1) by Tuesday EOD PT.
  • For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines.

Cherry-Picking Criteria

  • Only critical fixes meeting outlined criteria will be cherry-picked.
  • Developers must ensure these fixes are thoroughly reviewed, tested, and merged by Tuesday EOD PT.

🗓️ Timeline and Milestones

  1. Today (Friday): Begin Release Candidate validation.
  2. Tuesday EOD PT: Finalize RC with all fixes and cherry-picks.
  3. Wednesday: Buffer day for final checks.
  4. Thursday: Submit release to app stores and begin rollout to 1% of users.
  5. Monday: Scale deployment to 10%.
  6. Tuesday: Full rollout to 100%.

✅ Signoff Checklist

Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion:

Team sign-off checklist

  • Accounts Framework
  • Assets
  • Bots Team
  • Card
  • Confirmations
  • Core Platform
  • Design System
  • Earn
  • Mobile Platform
  • Mobile UX
  • Network Enablement
  • New Networks
  • Perps
  • Predict
  • Product Safety
  • Ramp
  • Rewards
  • Swaps and Bridge
  • Transactions
  • Wallet Integrations
  • Web3Auth

This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀

Feel free to reach out if you have questions or need clarification.

Many thanks in advance

Reference


Note

Cursor Bugbot is generating a summary for commit 06788b7. Configure here.

rarquevaux and others added 30 commits October 31, 2025 15:31
…20.1.0 (#21977)

## **Description**


https://github.com/MetaMask/smart-transactions-controller/releases/tag/v20.1.0

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

- [ ] 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]
> Updates dependency @metamask/smart-transactions-controller from
^20.0.0 to ^20.1.0 in package.json and yarn.lock.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d824ff5. 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 fixes addresses styling on transaction details 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: Fixed styling on transaction details view

## **Related issues**

Fixes: #15603
https://consensyssoftware.atlassian.net/browse/TMCU-138

## **Manual testing steps**

```gherkin
Feature: Show transaction details

  Scenario: user opens transaction details
    Given user has any transactions in activity view

    When user clicks transaction item to open details
    Then transaction details view has smaller addresses styling
```

## **Screenshots/Recordings**

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

### **Before**

<!-- [screenshots/recordings] -->
<img width="412" height="909" alt="Screenshot 2025-10-30 at 16 33 39"
src="https://github.com/user-attachments/assets/82cb6219-542d-4ee5-8d39-c363c73b03ea"
/>

### **After**

<!-- [screenshots/recordings] -->
<img width="407" height="915" alt="Screenshot 2025-10-31 at 09 16 40"
src="https://github.com/user-attachments/assets/104bb565-5294-4658-ba84-2cae2953348d"
/>

## **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]
> Shrinks the from/to address avatar and label typography in Transaction
Details and updates snapshots.
> 
> - **UI — Transaction Details
(`app/components/UI/TransactionElement/TransactionDetails/index.js`)**:
> - Reduce `Avatar` size from `AvatarSize.Md` to `AvatarSize.Sm` for
`renderFrom` and `renderTo`.
> - Replace `Text small` with `Text variant={TextVariant.BodySM}` for
address labels.
> - **Tests — Snapshots**:
> - Update `__snapshots__/index.test.tsx.snap` to reflect smaller avatar
container (32→24, radius 8→6) and smaller text (fontSize 16→14,
lineHeight 24→22).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
bcceec7. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR implements the `BalanceEmptyState` component on the homepage
when users have a zero balance across all mainnet networks. It is hidden
behind the `homepageRedesignV1Key` feature flag which will be used for
full page scroll of the homepage.

- Shows `BalanceEmptyState` component for accounts with an aggregated
balance of zero across mainnets(excludes testnets)
- Applies to only `AccountGroupBalance` component.
- Replaces the regular balance display with an empty state component
when total aggregated balance is zero
- Replaces previous `TokenListFooter`(Removed in this PR:
#21490)
- Hidden behind the `homepageRedesignV1Key` feature flag
- Adds new `selectWalletBalanceForEmptyState` to get balance across all
networks
- Adds e2e tests

## **Changelog**

CHANGELOG entry: Updating zero balance display to "Add funds" card

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/DSYS-153

## **Manual testing steps**

```gherkin
Feature: Balance Empty State on Homepage

  Background:
    Given the homepageRedesignV1Key feature flag is enabled

  Scenario: User with zero balance across all aggregated networks sees empty state
    Given user has a wallet with zero balance across all aggregated networks (Evm and nonEvm)
    When user navigates to the homepage
    Then user should see the BalanceEmptyState component with illustration and "Add funds" button
    And user should not see the regular balance display showing "$0.00"

  Scenario: User with positive balance on all aggregated networks sees positive balance
    Given user has a wallet with positive balance across aggregated networks (EVM and non EVM)
    When user navigates to the homepage
    Then user should see the normal balance display showing the actual dollar amount
    And user should not see the BalanceEmptyState component

  Scenario: User changes to network with empty balance sees zero balance
    Given user has positive balance on some networks but zero on others
    When user switches to a network where they have zero balance (EVM and non EVM)
    Then user should see "$0.00" balance display

  Scenario: User changes to network with positive balance sees positive balance (including test networks)
    Given user has zero balance on some networks but positive on others
    When user switches to a network where they have positive balance (mainnet, Sepolia, Goerli, etc.)
    Then user should see the normal balance display with actual amount
    And user should not see the BalanceEmptyState component
    And this behavior should be consistent across mainnet and test networks

  Scenario: User taps "Add funds" button from empty state
    Given user sees the BalanceEmptyState on homepage
    When user taps the "Add funds" button
    Then user should be navigated to the buy crypto page (not deposit flow)
    And appropriate analytics events should be tracked

  Scenario: Feature flag disabled - no empty state shown
    Given the homepageRedesignV1Key feature flag is disabled
    And user has zero balance
    When user navigates to the homepage
    Then user should see the regular "$0.00" balance display
    And user should not see the BalanceEmptyState component

  Scenario: Privacy mode interaction with empty state
    Given user has zero balance and sees BalanceEmptyState
    When user toggles privacy mode
    Then the BalanceEmptyState should remain visible (not affected by privacy toggle)

  Scenario: Loading states
    Given user navigates to homepage
    When balance data is still loading
    Then user should see skeleton/loader components
    And user should not see BalanceEmptyState or balance display until data loads
```

## **Screenshots/Recordings**

### **Before**
Empty balance showed a `0` balance and footer CTA to go to deposit


https://github.com/user-attachments/assets/022fa47d-b567-41a8-a1f7-d85ac3164701

Loading balance on first import of an account with zero balance 


https://github.com/user-attachments/assets/a91cca57-31a2-4317-b741-206884f9a2db

### **After**

Empty balance now shows BalanceEmptyState component



https://github.com/user-attachments/assets/44b9c855-d9fb-4c96-bcac-72b62a82b862


The flicker between a zero balance(now empty state) still exists and is
an architectural issue outside of the scope of this PR. This is being
worked on by the @MetaMask/metamask-assets team


https://github.com/user-attachments/assets/de262384-ebdf-4bc6-8f94-b5ab39aec928

## **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 recordings and or screenshots.





<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Show BalanceEmptyState in `AccountGroupBalance` when aggregated
mainnet balance is zero (feature-flagged), with new selector and
comprehensive tests.
> 
> - **UI (Wallet)**:
> - Display `BalanceEmptyState` in `AccountGroupBalance` when aggregated
mainnet balance is zero; hide on testnets; keep skeleton while loading;
gated by `selectHomepageRedesignV1Enabled`.
> - Uses `TEST_NETWORK_IDS` and `selectEvmChainId` to suppress empty
state on test networks.
> - **Selectors**:
> - Add `selectAccountGroupBalanceForEmptyState` to compute selected
group balance across mainnet networks only, using CAIP utilities and
excluding `TEST_NETWORK_IDS` and `NON_EVM_TESTNET_IDS`.
> - **Tests**:
> - Unit: update `AccountGroupBalance.test.tsx` to cover empty state
rendering; add selector tests for network filtering, no selection, and
missing group fallbacks.
> - E2E: add `balance-empty-state.spec.ts` validating visibility on
mainnet vs testnets, navigation to buy flow, and persistence after
restart; extend page object `WalletView` and selectors with
`BALANCE_EMPTY_STATE_*` IDs.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
2078f33. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Introduces new home screen + Hip-3 support UI. Initially broken out from
#21410 to make it easier
to iterate on, and isolate codeowners.

More complete technical detail in original ticket. This includes the
home page redesign with hip-3 support, along with [after hours
UX](#21901).

Figma designs:
https://www.figma.com/design/kdRiGFFmRrkbCJyKf4c4Re/Equity-perps-and-more?node-id=153-3116&p=f&t=AS2BitV7DlFSsEWX-0

## **Changelog**

CHANGELOG entry: Introduce new Perps Home screen UI

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



https://github.com/user-attachments/assets/db35b6dd-ba76-4b95-bca1-f043bc71e27e

## **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]
> Implements a new Perps Home UI with search/sections and bulk actions,
overhauls Market List with tabs/sorting/filtering, adds HIP-3 2× fee
logic and market-hours UX, refactors close flows and hooks, and updates
routes, tests, and i18n.
> 
> - **UI/Views**:
> - New `PerpsHomeView` with positions/orders carousels, watchlist,
navigation card, search bar, and bottom sheets for bulk actions.
> - Added `PerpsCloseSummary` shared component for close flows;
integrated into Close Position and Close All modals.
> - Added bulk action modals: `PerpsCloseAllPositionsModal` and
`PerpsCancelAllOrdersModal`.
> - **Market List Overhaul**:
> - New components: `PerpsMarketList`, `PerpsMarketListHeader`,
`PerpsMarketFiltersBar`, `PerpsMarketTypeSection`,
`PerpsStocksCommoditiesDropdown/BottomSheet`.
> - Tabs (All/Crypto/Stocks & Commodities), favorites filter, search,
and sort presets (volume, price change, funding, OI).
> - Filters zero-volume/fallback markets by default; optional inclusion
via flag.
> - **Fees/Providers**:
> - Add HIP-3 fee multiplier (2× base protocol rate) with `coin`
propagated through fee calculations.
> - Updated `HyperLiquidProvider` and controller/types; extended tests.
> - **Market Hours**:
> - `PerpsMarketHoursBanner` and tooltip with `marketHours` utils;
integrated into Market Details.
> - **Hooks**:
> - New hooks: `usePerpsHomeData`, `usePerpsMarketListView`,
`usePerpsSearch`, `usePerpsSorting`, `usePerpsCloseAllCalculations`,
`usePerpsCancelAllOrders`, `usePerpsCloseAllPositions`.
> - `usePerpsOrderForm`: prioritize leverage (route > existing position
> saved config > default) and sync on position load.
>   - `usePerpsLiveFills` now returns `{fills,isInitialLoading}`.
> - **Navigation/Routes**:
> - Home view wired as main Perps screen; added modal routes for bulk
actions.
> - **Misc**:
> - Numerous tests for new components/hooks; style and i18n updates
(home labels, market-hours strings).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5e56909. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Arthur Breton <arthur.breton@consensys.net>
Co-authored-by: abretonc7s <107169956+abretonc7s@users.noreply.github.com>
Co-authored-by: Curtis David <Curtis.David7@gmail.com>
Co-authored-by: tommasini <46944231+tommasini@users.noreply.github.com>
Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
Co-authored-by: Borislav Grigorov <b.s.grigorov@gmail.com>
Co-authored-by: Nicholas Smith <nick.smith@consensys.net>
<!--

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 the `RatesController` to reduce redundant CryptoCompare
API calls in the multichain architecture.

### **Reason for the change**

The `RatesController` was introduced for fetching cryptocurrency
conversion rates (primarily for BTC and SOL) to support non-EVM chains.
However, this resulted in duplicate API calls to CryptoCompare since we
already have `MultichainAssetsRatesController` and
`TokenRatesController` handling rate fetching functionality. This
redundancy increased API usage unnecessarily.

### **Improvement/solution**

- Removed `RatesController` initialization and configuration from the
Engine
- Deleted `RatesController` messenger setup and related controller
initialization files
- Removed multichain selectors that depended on `RatesController` state
(`selectMultichainConversionRate`, `selectMultichainCoinRates`)
- Cleaned up type definitions and state management to remove
`RatesController` references
- Updated test snapshots and initial background state

The existing `MultichainAssetsRatesController` and
`TokenRatesController` will continue to handle all rate-fetching needs
without the additional overhead of `RatesController`.

## **Changelog**

CHANGELOG entry: Removed redundant RatesController to optimize API usage

## **Related issues**

Fixes: <!-- Add issue number if applicable -->

## **Manual testing steps**

```gherkin
Feature: Multichain rate fetching

  Scenario: User views portfolio balance with non-EVM accounts
    Given user has Bitcoin and Solana accounts configured
    And user is viewing their portfolio

    When the app fetches cryptocurrency rates
    Then rates should be fetched only through MultichainAssetsRatesController
    And no redundant API calls should be made to CryptoCompare
    And account balances should display with correct fiat conversions

  Scenario: User switches between EVM and non-EVM accounts
    Given user has both EVM and non-EVM accounts
    And user is viewing their wallet

    When user switches between different account types
    Then appropriate conversion rates should display for each account
    And rate updates should continue to work correctly
```

## **Screenshots/Recordings**

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

### **Before**

<!-- RatesController making redundant API calls alongside
MultichainAssetsRatesController -->

### **After**

<!-- Single source of rate fetching through
MultichainAssetsRatesController, reducing API overhead -->

## **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]
> Removes RatesController across Engine, messengers, selectors, and
types; adds migration 106 to purge its persisted state; updates tests
and fixtures.
> 
> - **Engine/Core**:
> - Remove `RatesController` initialization, context exposure, polling,
and state-change subscriptions in `Engine.ts` and `constants.ts`.
> - Drop `rates-controller-init` and its tests; delete
`rates-controller-messenger` and references in `messengers/index.ts`.
> - **Selectors**:
> - Remove `selectMultichainConversionRate` and
`selectMultichainCoinRates`; update `multichain.ts` and related tests
accordingly.
> - **Types**:
> - Strip `RatesController` types and entries from `types.ts`
(controllers, state, actions/events, controller names).
> - **Migration**:
> - Add migration `106` to remove `backgroundState.RatesController`;
register in `migrations/index.ts` with tests.
> - **Tests/Fixtures**:
> - Update snapshots and `initial-background-state.json` to omit
`RatesController`.
> - Adjust `Engine.test.ts` assertions to no longer expect
`RatesController`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
da413b8. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ew (#21889)

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

Fixes the issue where take profit (TP) and stop loss (SL) orders that
are children of limit orders were being displayed on the chart by
default which is confusing to the user as these TPSL are not yet live.
Left stand-alone TPSL alone. Any TPSL can still be manually selected to
show on the graph.

- Add takeProfitOrderId and stopLossOrderId assertions to
hyperLiquidAdapter tests
- Add new test suite for TP/SL child order filtering in
PerpsMarketDetailsView
- Test scenarios: child order exclusion, standalone orders, partial
TP/SL, empty lists

<!--
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/TAT-1879

## **Manual testing steps**


```gherkin
Feature: TP/SL Child Order Filtering on Chart
  As a trader
  I want to see only relevant TP/SL lines on the chart
  So that I don't see duplicate TP/SL indicators for orders with attached children

  Background:
    Given I am on the Perps Market Details View
    And the market is "BTC"

  Scenario: Child TP order is excluded from default chart display
    Given I have a limit order with ID "parent-order-1"
    And the order has a child take profit order with ID "child-tp-order-1"
    And there is a standalone take profit order with ID "standalone-tp-order"
    When the chart renders the TP/SL lines
    Then the child TP order "child-tp-order-1" should not be displayed
    And the standalone TP order "standalone-tp-order" should be displayed
    And the chart should be visible

  Scenario: Child SL order is excluded from default chart display
    Given I have a limit order with ID "parent-order-2"
    And the order has a child stop loss order with ID "child-sl-order-2"
    And there is a standalone stop loss order with ID "standalone-sl-order"
    When the chart renders the TP/SL lines
    Then the child SL order "child-sl-order-2" should not be displayed
    And the standalone SL order "standalone-sl-order" should be displayed
    And the chart should be visible

  Scenario: Standalone trigger orders are included when no child relationships exist
    Given I have a regular limit order with ID "order-1"
    And there is a standalone take profit order with ID "standalone-tp-1"
    And there is a standalone stop loss order with ID "standalone-sl-1"
    And none of the orders have child relationships
    When the chart renders the TP/SL lines
    Then the standalone TP order "standalone-tp-1" should be displayed
    And the standalone SL order "standalone-sl-1" should be displayed
    And the chart should be visible

  Scenario: Order with only take profit child
    Given I have a limit order with ID "parent-order-3"
    And the order has only a child take profit order with ID "child-tp-order-3"
    And the order has no stop loss child
    When the chart renders the TP/SL lines
    Then the child TP order "child-tp-order-3" should not be displayed
    And the chart should be visible

  Scenario: Order with only stop loss child
    Given I have a limit order with ID "parent-order-4"
    And the order has only a child stop loss order with ID "child-sl-order-4"
    And the order has no take profit child
    When the chart renders the TP/SL lines
    Then the child SL order "child-sl-order-4" should not be displayed
    And the chart should be visible

  Scenario: Empty order list
    Given there are no open orders
    When the chart renders
    Then the chart should be visible
    And no TP/SL lines should be displayed

  Scenario: Order with both TP and SL children
    Given I have a limit order with ID "parent-order-1"
    And the order has a child take profit order with ID "child-tp-order-1"
    And the order has a child stop loss order with ID "child-sl-order-1"
    When the chart renders the TP/SL lines
    Then neither child order should be displayed on the chart
    And the parent order should be tracked with both child IDs
    And the chart should be visible
```

## **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/ac21821d-f197-49a3-be24-ed6eaf0db8de

<!-- [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]
> Filters out child TP/SL orders from default chart lines and adds TP/SL
child order IDs via adapter, with tests covering new scenarios.
> 
> - **UI (PerpsMarketDetailsView)**:
> - Exclude TP/SL child orders from default selection by computing
`orderChildOrderIds` and ignoring those IDs when auto-picking TP/SL
(`selectedOrderTPSL`).
>   - Update memo deps to include `orderChildOrderIds`.
> - **Types**:
> - Extend `Order` with optional `takeProfitOrderId` and
`stopLossOrderId`.
> - **Adapter (hyperLiquidAdapter)**:
> - Populate `takeProfitOrderId`/`stopLossOrderId` when converting child
TP/SL orders; retain existing price extraction.
> - **Tests**:
> - Add TP/SL child filtering suite in `PerpsMarketDetailsView.test.tsx`
(child exclusion, standalone triggers, partial TP/SL, empty list).
> - Expand `hyperLiquidAdapter.test.ts` to assert child order IDs and
add cases for only-TP/only-SL and `limitPx` child orders; minor test
name clarifications.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
2dc3097. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR removes custom color styling from RefreshControl components in
the Perps feature area. The colors prop (or tintColor prop) was
previously set to theme.colors.icon.default, which could cause visual
inconsistencies when the user uses dark theme. By removing this custom
color configuration, the RefreshControl now uses the native system
defaults
## **Changelog**

CHANGELOG entry: Fixed RefreshControl color styling in Perps views to
use native system defaults


## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/TAT-1568

## **Manual testing steps**

```gherkin
Feature: RefreshControl styling in Perps views

  Scenario: user performs pull-to-refresh on Perps Market Details
    Given user is on the Perps Market Details view
    And the user is using dark mode on Android
    
    When user performs a pull-to-refresh gesture
    Then the refresh indicator should display with native system colors
    And the refresh indicator should be visible and properly styled
    And data should refresh successfully
```

## **Screenshots/Recordings**

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

### **Before**

<img width="270" height="605" alt="Capture d’écran 2025-09-16 à 12 23
17"
src="https://github.com/user-attachments/assets/71b5d8be-ce47-4787-85cc-3532086fc340"
/>


### **After**

<img width="1080" height="2400" alt="Screenshot_1761822745"
src="https://github.com/user-attachments/assets/2194a426-f6aa-4cfc-9c19-f8234ccd1ec7"
/>


## **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]
> Removes theme-based color overrides from `RefreshControl` in Perps
Market Details and drops the now-unused `theme` from `useStyles`.
> 
> - **Perps Market Details
(`app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx`)**:
> - **RefreshControl**: Removed `tintColor`/`colors` theme overrides;
now uses system defaults via `<RefreshControl refreshing={refreshing}
onRefresh={handleRefresh} />`.
> - **Styles hook**: Dropped unused `theme` from `useStyles` destructure
(`const { styles } = useStyles(createStyles, {});`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
95ae927. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: abretonc7s <107169956+abretonc7s@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**

This PR is splitting the content of another much bigger
[PR](#20936) to simplify
the review and merge

I'll be adding add funds in perps

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

## **Changelog**

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

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

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

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

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

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

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

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

## **Pre-merge author checklist**

- [ ] 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 Perps E2E smoke tests and infrastructure (HTTP command-queue
bridge, mocks, Sentry module aliasing) and runs them on iOS/Android CI.
> 
> - **E2E Perps Infrastructure**:
> - Add HTTP command-queue polling in
`app/components/UI/Perps/utils/e2eBridgePerps.ts` with deep link handler
refinements, mock deposit, and duplicate-link protection.
> - Introduce command queue server
(`e2e/framework/fixtures/CommandQueueServer.ts`) and plumb ports via
`app/util/test/utils.js`, `shim.js`, Detox reverse ports, and fixture
lifecycle.
> - Expand Perps controller mixin
(`e2e/controller-mocking/mock-config/perps-controller-mixin.ts`) with
overrides for orders, fills, funding, cancel order, TP/SL updates,
deterministic liquidation price, and provider wrapping.
> - Enhance Perps mock service (`e2e/.../perps-e2e-mocks.ts`) with
deposits, close fills, orders history, TP/SL trigger orders, price/liq
handling, and seeded data.
> - Add Arbitrum RPC and API mocks
(`e2e/api-mocking/perps-arbitrum-mocks.ts`).
> - **New Tests & Page Objects**:
> - Add Perps “Add funds” smoke spec
(`e2e/specs/perps/perps-add-funds.spec.ts`) and helpers/pages
(`PerpsDepositView`, `PerpsDepositProcessingView`, updates to
`PerpsTabView`, `TabBarComponent`, `Matchers`).
> - Update deep link mapping to `metamask://e2e/perps/`
(`e2e/framework/DeepLink.ts`) and add server-driven modifiers.
> - **CI**:
> - Add `perps-android-smoke` and `perps-ios-smoke` jobs and include
them in report steps.
> - **Module Aliasing**:
> - Alias Sentry packages to E2E no-op mocks via `metro.config.js`; add
mock files under `e2e/module-mocking/sentry/`.
> - **Config/Quality**:
> - Exclude `e2eBridgePerps.ts` from Sonar analysis; add docs
(`e2e/docs/*`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c904dce. 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 polishes the slider, icons and text on the order page to improve
visual consistency. It refines the UI, ensuring the product matches the
original design intentions. Designs have been approved by @vstern1 and
@roymetamask.

## **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 - minor UI change

## **Related issues**

Fixes:
https://consensys.slack.com/archives/C09ADJ3E81G/p1757691523669519

## **Manual testing steps**

```gherkin
Feature: Perps

  Scenario: user opens the order page
    Given user wants to adjust slider values

    When user drags the slider
    Then the border on the slider should not exist
    And the text around it should be more readable
```

## **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/0a6bd1d3-1321-4ad7-acd7-133fdab4be39




### **After**


https://github.com/user-attachments/assets/b9e34b21-9d83-4766-81ac-7d0fec3a50a7



## **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]
> Switch info icons and percentage labels to alternative color and
remove slider thumb border for a cleaner perps order UI.
> 
> - **Perps Order View (`PerpsOrderView.tsx`)**:
> - Info icons for `leverage`, `tp_sl`, `margin`, `liquidation_price`,
`fees`, and `estimated_points` now use `IconColor.Alternative`.
> - **Perps Slider Styles (`PerpsSlider.styles.ts`)**:
>   - Remove `thumb` border by deleting `borderWidth`.
>   - Update `percentageText` color to `colors.text.alternative`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3558152. 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**

Translate Polygon native token address
(`0x0000000000000000000000000000000000001010`) to zero address to
prevent logic treating it as an ERC20 token and enabling the Max button.

<!--
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:  fix: remove Max button from Polygon native asset

## **Related issues**

Fixes: #22001

## **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] -->
<img width="420" height="913" alt="Simulator Screenshot - iPhone 16 Pro
Max - 2025-10-31 at 13 12 49"
src="https://github.com/user-attachments/assets/adcad339-58b6-4274-af32-55bf39cb641d"
/>

## **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]
> Normalize Polygon native token (0x…1010) to zero address to detect it
as native and conditionally show/hide the Max button; add targeted
tests.
> 
> - **Bridge UI**:
> - Normalize Polygon native token address
(`0x0000000000000000000000000000000000001010`) to `zeroAddress()` before
`isNativeAddress` checks and address formatting in `TokenInputArea`.
> - Correct Max button visibility for native assets: hidden when gasless
swaps disabled, shown when enabled.
> - **Tests**:
> - Add tests verifying Polygon native token is treated as native and
Max button visibility toggles with gasless swap flag.
>   - Include necessary imports (`CHAIN_IDS`, `POLYGON_NATIVE_TOKEN`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
106f8b4. 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**

Fixed the decimal precision issue for token amounts displayed in the
Perps Close Position screen. The component now uses asset-specific
szDecimals from market metadata to format position sizes correctly,
ensuring proper display across different cryptocurrencies.

🐛 Problem
Previously, formatPositionSize was called without the szDecimals
parameter, causing inconsistent decimal precision across different
assets. This resulted in either too many or too few decimal places being
displayed for token amounts (e.g., BTC showing too many decimals, DOGE
showing unnecessary precision).

✅ Solution
Added usePerpsMarketData hook to fetch market metadata for the
position's asset
Passed marketData?.szDecimals to both formatPositionSize calls:
Token amount display in PerpsAmountDisplay component
Token amount in the toggle container text
The formatting now respects asset-specific decimal precision

<!--
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/TAT-1922

## **Manual testing steps**

```gherkin
Feature: Position Close Token Amount Formatting

  Background:
    Given the user has an open position
    And the user navigates to the Close Position screen

  Scenario: Display token amounts with asset-specific decimal precision
    Given the position is for <asset> with szDecimals of <decimals>
    When the close amount is calculated
    Then the token amount displays with <decimals> decimal places
    And no unnecessary trailing zeros are shown

  Scenario: Update token display when close percentage changes
    Given the position has specific szDecimals
    When the user adjusts the close percentage slider
    Then the token amount updates in real-time
    And maintains correct decimal precision

  Scenario: Handle missing market data gracefully
    Given the market data is unavailable
    When the close position screen loads
    Then the token amount displays with fallback formatting
    And the component does not crash

  Scenario: Format partial close amounts correctly
    Given the user selects a partial close percentage
    When the token amount is calculated
    Then the display uses asset-specific decimal precision
    And shows accurate fractional token amounts
```

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

<img width="300" height="auto" alt="Simulator Screenshot - iPhone 16 Pro
- 2025-10-30 at 18 47 36"
src="https://github.com/user-attachments/assets/a31311f6-7593-48d5-93ca-3052e1676b8a"
/>

<!-- [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]
> Uses asset-specific szDecimals from market data to format token
amounts in Close Position and adds focused tests; minor key fix in error
list rendering.
> 
> - **Perps Close Position (UI)**:
> - Integrate `usePerpsMarketData(position.coin)` and pass
`marketData?.szDecimals` to `formatPositionSize` for `tokenAmount` and
the toggle text.
>   - Use stable keys for validation messages (`error-${index}`).
> - **Tests**:
> - Add comprehensive coverage for szDecimals/market data integration
(varying assets/precisions, loading, errors, missing data, small/large
sizes) and hook invocation with correct coin.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6ace779. 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?
-->

Uses more accurate content and tone for most translations of Rewards
opt-out content.

## **Changelog**

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

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

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

CHANGELOG entry: improved translations for Rewards

## **Related issues**

Fixes: n/a

## **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
- [ ] 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]
> Refines Rewards opt-out copy across multiple locales, updating
titles/descriptions/confirm labels and a few related strings.
> 
> - **i18n (Rewards opt-out)**:
> - Update translation copy for `optout.title`, `optout.description`,
and `optout.confirm` in
`locales/languages/{de,el,es,fr,hi,id,ja,ko,pt,tl,tr,vi,zh}.json` to
more accurate phrasing and irreversible-action tone.
> - Adjust related modal strings where present (e.g.,
`modal.error_message`, `modal.confirm`).
> - Spanish: capitalize `settings.title` to “Configuración de
Recompensas”.
>   - Chinese: refine `optout.modal.error_message` text.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
61a67e2. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Laurel <153323700+i18nlaurel@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**
Handle deeplink if provided in boost cards
<!--
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/RWDS-618

## **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]
> Boost card tap now opens provided deeplink (fallback to swaps) and
`PointsBoostDto` adds optional `deeplink` field.
> 
> - **Rewards UI**
> - `ActiveBoosts.tsx`: On boost tap, open `boost.deeplink` via
`handleDeeplink`; fallback to `goToSwaps`.
> - **Types**
> - `PointsBoostDto`: Add optional `deeplink?: string` to support
deeplink-enabled boosts.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5cb6279. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Christian Montoya <christian.montoya@consensys.net>
…iguration for Android (#21530)

<!--
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 aims to resolve some bottlenecks associated with hardcoded
environment build types and environments especially when running the
watcher locally. This is causing much confusion since devs have reported
that METAMASK_BUILD_TYPE and METAMASK_ENVIRONMENT is not being picked up
when switching between variants such as main and flask. Furthermore,
these issues impacts E2E as well (especially flask build setup), which
continues to introduce friction as CI continues to migrate to Github CI.

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

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

watcher mode with both METAMASK_BUILD_TYPE and METAMASK_ENVIRONMENT
specified
<img width="964" height="484" alt="image"
src="https://github.com/user-attachments/assets/9cedea8d-3281-4912-938b-70e0cb810c82"
/>

watcher mode without METAMASK_BUILD_TYPE and METAMASK_ENVIRONMENT
<img width="1002" height="528" alt="image"
src="https://github.com/user-attachments/assets/245acee9-7e8a-4544-85c5-10df4b2f452d"
/>

using `start:ios`, which hardcodes platform=ios, buildtype=main,
environment=dev
<img width="977" height="482" alt="image"
src="https://github.com/user-attachments/assets/180dbaa9-b9c9-4a26-893d-a127a6945b2c"
/>

using `test:e2e:android:flask:build`, which hardcodes platform=android,
buildtype=flask, environment=e2e
<img width="1237" height="518" alt="image"
src="https://github.com/user-attachments/assets/14847adf-d085-4f60-be48-603290413d19"
/>

expo_dev_pipeline -
https://app.bitrise.io/app/be69d4368ee7e86d/pipelines/a9dc5979-790d-411c-b823-f3295abb9d28


## **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]
> Unifies E2E build/run across scripts, Detox, Bitrise, and docs with
dynamic Debug/Release via CONFIGURATION, prebuilt artifact support, new
iOS/Flask CI configs, and removal of legacy workflows.
> 
> - **Build system**:
> - Refactor `scripts/build.sh` to source
`METAMASK_BUILD_TYPE`/`METAMASK_ENVIRONMENT` (except watcher), validate
inputs, and print unified titles.
> - Add `generateAndroidBinary` for flavor/config builds; remove legacy
per-variant dev/E2E builders; standardize Sentry property handling.
> - **CI (Bitrise)**:
> - Standardize Android/iOS build steps to use `COMMAND_YARN` and
`CONFIGURATION` (Debug/Release); add/share intermediate artifacts;
adjust renaming/deploy steps.
> - Add explicit `CONFIGURATION='Release'` to main Android workflows;
simplify build scripts; remove deprecated Flask QA/beta paths and
redundant workflows.
> - Update E2E runners to call `yarn
test:e2e:*:$METAMASK_BUILD_TYPE:ci`; improve caching and artifact
sharing.
> - **Detox**:
> - Enable prebuilt binary paths via env for all apps; export
`CONFIGURATION` in build commands.
> - Switch `ios.sim.main.ci` to `ios.main.release`; add
`ios.sim.flask.ci`.
>   - Reorder Android app configs; add `testBinaryPath` support.
> - **NPM scripts (`package.json`)**:
>   - Simplify `watch` scripts; remove start-e2e variants.
> - Add `test:e2e:ios:flask:ci`; set `BRIDGE_USE_DEV_APIS=true` for
Flask E2E builds; add `build:android:checksum:prod`.
> - **Docs**:
> - Update E2E guide to emphasize sourcing `.e2e.env`, watcher usage,
and hardcoded build types; revise Flask sections to use
`test:e2e:*:flask:*` commands and troubleshooting.
> - **CODEOWNERS**:
> - Add ownership for `app/core/DeeplinkManager`, `scripts/build.sh`,
and `handlePerpsUrl.ts` under Perps.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
cb8faa3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Quality of life change to default local environments to run Perps on
mainnet. Devs can still go into Developer options and toggle to testnet
if they wish.

## **Changelog**

CHANGELOG entry: default perps controller to mainnet

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

- [ ] 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]
> Sets `isTestnet` default to `false` (mainnet) in `PerpsController` and
updates tests to reflect the new default.
> 
> - **PerpsController**
(`app/components/UI/Perps/controllers/PerpsController.ts`):
> - Change default `isTestnet` to `false` in
`getDefaultPerpsControllerState`.
> - **Tests**
(`app/components/UI/Perps/controllers/PerpsController.test.ts`):
>   - Update constructor test to assert `isTestnet` defaults to `false`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d419c14. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
#21880)

<!--
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 adds a shareable P&L Hero Card. Accessible from both the
PerpsPositionCard (when user has an active position) and via a "share"
button on the close position success toast.

### Changes:
- Added Shareable P&L hero card view
- Added event tracking for Perps P&L hero card sharing
  - Track share initiated, share success, and share failed statuses
  - Event properties include:
- Common across all 3 share status events: `SCREEN_NAME`, `ACTION`,
`ASSET`, `DIRECTION`, `LEVERAGE`, `PNL_PERCENT`, `IMAGE_SELECTED`,
`TAB_NUMBER`, and `STATUS`.
    - Share error event includes `ERROR_MESSAGE`
- Added patch for `react-native-view-shot`
  - Fixes Android compatibility issues with react-native Fabric
- Added reusable `RewardsReferralCodeTag` component (owned by Rewards
team)
- Updated `usePerpsToasts` hook to support `ReactNode` labels instead of
of only strings
- Moved `buildReferralUrl` into rewards utils file

<!--
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 shareable pnl hero card

## **Related issues**

Fixes: [TAT-1073: As a user, I can share my PnL hero card with my
contacts](https://consensyssoftware.atlassian.net/browse/TAT-1073)

## **Manual testing steps**

```gherkin
Feature: Shareable Perps P&L Hero Card

  Scenario: User is redirected to the Perps P&L hero card view
    Given user has active Perps position

    When user clicks share button on Perps position card
    Then user is redirected to the Perps hero card view

    Given user successfully closes full or partial position

    When user clicks share button within the close position success toast
    Then user is redirected to the Perps hero card view

  Scenario: User wants to share P&L hero card (e.g. Twitter)
    Given user is on Perps P&L hero card view

    When user clicks share button
    Then user sees the share bottom-sheet that's part of their phone's OS
```

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

<!-- [screenshots/recordings] -->
1. Accessing from the Perps position card


https://github.com/user-attachments/assets/407a0857-9f7a-4d87-9643-f7021a13f249

2. Accessing from the close position success toast


https://github.com/user-attachments/assets/395ba67c-098c-4661-b32b-d2cbe1f47c13

## **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]
> Introduces a shareable Perps PnL Hero Card (with referral tag), wired
into position card and success toasts with analytics, updates
toast/route infrastructure, and patches react-native-view-shot for
Fabric.
> 
> - **Perps UI**:
> - **PnL Hero Card**: New `PerpsHeroCardView` (carousel, capture &
share via `react-native-share`), added route
`Routes.PERPS.PNL_HERO_CARD`, and E2E selectors/strings.
> - **Share Entry Points**: `PerpsPositionCard` adds share button
(navigates with live price); close-position success toasts add “Share”
CTA and pass `marketPrice` through `usePerpsClosePosition`.
> - **Toasts**: `usePerpsToasts` now supports ReactNode labels and adds
`contentSharing.pnlHeroCard` configs; close-position success toasts show
PnL and link to Hero Card.
> - **Close Position**: `PerpsClosePositionView`/hook pass
`priceData[position.coin]?.price`; tests updated to validate params and
tracking.
> - **Rewards**:
> - **Referral Tag**: New reusable `RewardsReferralCodeTag` and
`buildReferralUrl`; `ReferralActionsSection` uses shared utils.
> - **Analytics**:
> - Adds `SHARE_ACTION` event and new Perps properties
(`IMAGE_SELECTED`, `TAB_NUMBER`) and values (`PERPS_HERO_CARD`,
`SUCCESS`).
> - **Infra**:
> - **Android Fabric Fix**: Patch `react-native-view-shot` for Fabric
UIManager compatibility.
> - **Misc**:
> - Minor layout/style updates (transaction view buttons); cast fixes
for `PerpsToastOptions`; extensive tests for new flows and selectors;
localization additions.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8ddfa22. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: abretonc7s <107169956+abretonc7s@users.noreply.github.com>
… not set (#21981)

<!--
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 loading state detection for percentage change in LivePriceHeader

**Problem:**
The component defaulted `percentChange` to `0`, making it impossible to
distinguish
between a legitimate 0% change and a loading state. This caused the
loading indicator
(`--%`) to not display when price was available but percentage change
was still loading.

**Solution:**
- Use `null` as sentinel value to represent loading state for percentage
change
- Remove `fallbackChange` prop to simplify component behavior
- When live data exists but `percentChange24h` is undefined, display
loading state
- When `percentChange24h` is explicitly `"0"`, display formatted
`+0.00%`

**Changes:**
- Modified `displayChange` logic to check for `null` vs actual numeric
values (including 0)
- Removed `fallbackChange` prop from component interface
- Updated color logic to only apply when we have actual data (not
loading)
- Added 6 new test cases to verify loading state behavior
- Updated existing tests to match simplified component API

<!--
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/TAT-1951

## **Manual testing steps**

```gherkin
Feature: LivePriceHeader Loading State

  Scenario: Display loading state when percentage change is not yet available
    Given the component receives live price data
    And the percentChange24h field is undefined
    When the component renders
    Then it displays the formatted price
    And it displays "--%" as the change indicator

  Scenario: Display legitimate zero percent change
    Given the component receives live price data
    And the percentChange24h field is "0"
    When the component renders
    Then it displays the formatted price
    And it displays "+0.00%" as the change indicator
    And it does not display the loading indicator

  Scenario: Display loading state when no live data exists
    Given the component receives no live price data
    And a fallback price is provided
    When the component renders
    Then it displays the fallback price
    And it displays "--%" as the change indicator

  Scenario: Prefer live percentage change over fallback values
    Given the component receives live price data with percentChange
    When the component renders
    Then it displays the live price
    And it displays the live percentage change
    And it does not display the loading indicator
```

## **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/bdff7788-3d20-484d-89fb-751d5b8a785a

<!-- [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]
> Updates LivePriceHeader to treat missing percentChange as loading
(neutral color, --%) while displaying legitimate 0% as +0.00%, and
removes the fallbackChange prop; tests updated accordingly.
> 
> - **Perps UI**:
>   - **LivePriceHeader (`LivePriceHeader.tsx`)**:
> - Remove `fallbackChange` prop and related fallback logic; only
`fallbackPrice` remains.
> - Interpret missing `percentChange24h` as loading (`null`), rendering
`--%` with neutral color.
> - Render `+0.00%` for explicit zero change; positive uses success
color, negative uses error color.
> - Keep price formatting and fallbacks unchanged; prefer live data over
fallbacks.
> - **Tests (`LivePriceHeader.test.tsx`)**:
> - Add cases covering loading state, explicit zero change, color
behavior (Default/Success/Error), and preference for live
`percentChange`.
> - Update existing tests to remove `fallbackChange` usage and validate
new loading behavior.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
022a9fe. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Nick Gambino <35090461+gambinish@users.noreply.github.com>
#21984)

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

- Still room for improvement (and see refactoring incoming), but filters
markets on the feed(s) that are already resolved

<!--
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: NA

## **Related issues**

Fixes: NA

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

<img width="420" alt="image"
src="https://github.com/user-attachments/assets/032ab439-8d09-40bb-9aae-cc2693301c2a"
/>

<img width="420" alt="image"
src="https://github.com/user-attachments/assets/d8753fa7-fd4d-4371-abe7-c87c938cfb51"
/>


<!-- [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]
> Filters resolved outcomes in market cards and adds an expandable
resolved outcomes section on details (hiding the chart and banner when
applicable), with tests and i18n updates.
> 
> - **Predict UI**:
>   - **Market List (`PredictMarketMultiple.tsx`)**:
> - Filters out resolved outcomes (`price` 0 or 1) from display and
counts.
>     - Uses `market.image` instead of first outcome image.
>   - **Market Details (`PredictMarketDetails.tsx`)**:
> - Adds detection for multiple-open-outcomes partially resolved and
hides `PredictDetailsChart` in that case.
>     - Suppresses winning banner when partially resolved.
> - Introduces expandable "`predict.resolved_outcomes`" section listing
closed outcomes with volume and winner/draw label, plus toggle icons;
open outcomes render below.
> - Special-cases closed single-outcome markets to show winning/losing
outcomes only.
> - **Tests** (`PredictMarketDetails.test.tsx`):
> - Extensive coverage for expandable resolved outcomes, chart hiding,
tab behavior, eligibility/balance flows, and icon toggles.
> - **i18n**:
>   - Adds `predict.resolved_outcomes` string.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e9a3a7e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This is a collective effort to clean up our codebase by removing old
feature flags such as `PORTFOLIO_VIEW`

## **Changelog**

CHANGELOG entry:null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MUL-1132

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

`~`

### **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]
> Removes the PORTFOLIO_VIEW feature flag and related conditionals,
making multi‑network/portfolio behavior the default across UI,
selectors, polling, and tests, and cleans up env/CI config.
> 
> - **Feature flag removal**:
> - Delete `isPortfolioViewEnabled` usage across components, hooks,
selectors, and tests; default to portfolio/multi‑network behavior.
> - **Behavioral simplifications**:
>   - Always set `tokenNetworkFilter` on network changes/additions.
> - Use multi‑chain swaps tokens and asset data by default (`Asset`,
`AssetDetails`).
> - Poll across enabled EVM networks (or popular/all) based on GNS,
removing portfolio checks (`use*Polling` hooks).
> - Simplify staking/earn views (unified logos; EarnTokenList gating
only by lending flag).
> - **Selectors/Utils**:
> - Simplify `getChainIdsToPoll`; remove portfolio gating in earn/tokens
selectors.
>   - Multichain balance hook always reports portfolio mode.
> - **Tests**:
> - Remove mocks/branches for portfolio flag; update expectations for
polling, token lists, snapshots, and flows.
> - **Config Cleanup**:
> - Remove `PORTFOLIO_VIEW` env from `.js.env.example`, Bitrise, and
Jest config.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
73769b7. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- CURSOR_SUMMARY -->
> [!NOTE]
> Updates translations and adds new i18n strings across many locales
(hi, id, ja, ko, pt, ru, tl, tr, vi, zh) for Perps, Predict, Card,
Wallet, deposits, errors, and assorted UI labels/modals.
> 
> - i18n:
> - Perps: translate/adjust trading statuses, validation, TP/SL labels,
sorting/markets, activity/home tabs, banners, modals (close/cancel all),
and transaction/history fields.
> - Predict: localize cash-out/withdraw/deposit flows, order/state
messages, error handling, and UI copy; add error_messages keys.
> - Card: onboarding, spending limits, asset selection, management
options, and warnings localized.
> - Core/Wallet/UI: burn-address alerts, deposit limit errors, gas fee
token messages, staking (TRON resources), privacy policy text, SDK
connect, network connection banners, and miscellaneous labels/tabs.
> - Adds missing keys and replaces residual English with localized text
across locales.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
7e20cf3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

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

Fixes incorrect search behavior from PerpsHomeView. We were handling two
different search behaviors in PerpsHomeScree and PerpsMarketListView.
Correct behavior is:

1. When search icon is pressed on the PerpsHomeView, it need to navigate
to the PerpsMarketListView with search enabled.
2. On cancel, it should go back to the PerpsMarketListView

3. When search icon is pressed from PerpsMarketListView, we enable
search as is currently does
4. When cancel is pressed it goes back to PerpsMarketListView

This PR removes the multi-dimensional search from the PerpsHomeScreen
view and instead navigates to the MarketListView as per the latest
designs.

## **Changelog**

CHANGELOG entry: Fixes search behavior in PerpsHomeScreen

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


https://github.com/user-attachments/assets/f747b86f-4080-44ab-9cdd-7a96add3b510

## **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]
> PerpsHomeView now navigates to PerpsMarketListView with search
pre-opened on search tap, with minor header padding tweak, a new
navigation param, and updated tests.
> 
> - **Perps Home → Market List navigation**
> - Replace in-place search in `PerpsHomeView` with navigation to
`PerpsMarketListView` via `usePerpsNavigation.navigateToMarketList({
defaultSearchVisible: true, source: 'homescreen_tab', fromHome: true
})`.
> - Remove local search state and filtering from `PerpsHomeView`; call
`usePerpsHomeData({})`.
> - Header in `PerpsHomeHeader` is always rendered with
`isSearchVisible: false` on Home.
> - **Market List search handling**
> - Refactor `handleSearchToggle` in `PerpsMarketListView` to
`useCallback`; clears query on close and tracks event on open.
> - **Header UI tweak**
> - `PerpsMarketListHeader`: add `Platform`-specific padding for the
search bar (`py-3` iOS, `py-1` Android); import `Platform`. Mark
`onSearchClear` as unused.
> - **Navigation types**
> - Add `fromHome?: boolean` to
`PerpsNavigationParamList['PerpsMarketListView']`.
> - **Tests**
> - `PerpsHomeView.test.tsx`: mock `navigateToMarketList` and assert
navigation with `{ defaultSearchVisible: true, source: 'homescreen_tab',
fromHome: true }`; remove assertions about HomeView search bar
visibility; minor setup/mocks cleanup.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8218306. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Arthur Breton <arthur.breton@consensys.net>
Co-authored-by: abretonc7s <107169956+abretonc7s@users.noreply.github.com>
Co-authored-by: Curtis David <Curtis.David7@gmail.com>
Co-authored-by: tommasini <46944231+tommasini@users.noreply.github.com>
Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
Co-authored-by: Borislav Grigorov <b.s.grigorov@gmail.com>
Co-authored-by: Nicholas Smith <nick.smith@consensys.net>
#21960)

<!--
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 stops the amount from switching when the input amount is
clicked. However, it allows the amount to update with price until the
user actually presses the keypad. At that point the price does not
update the amount until the user has clicked Done

<!--
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/TAT-1751

## **Manual testing steps**

```gherkin
Feature: ensure amount does not change + pnl  on user input

  Scenario:  user is on the position close screen
    Given the user clicks on the amount input when they have pnl

    When the amount is focused, the price will update it until the user has pressed the keypad
    Then when clicking done, the price will be set

    When the price is at 100 percent and the user clicks done, the price will update to match what 100% actually is in amount
```

## **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/402bc2ad-5109-4de8-83de-2d04dcc23612

<!-- [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]
> Stabilizes USD close amount during input by syncing only when not
editing, adds centralized USD formatter, and extends tests for price
sync and formatting.
> 
> - **PerpsClosePositionView**:
> - Add `isAmountInitializedRef` and effects to initialize USD once and
sync `closeAmountUSDString` with calculated value only when not actively
editing.
> - Use new `formatCloseAmountUSD` for all USD amount updates
(calculated, percentage, max, slider).
> - Ensure effective price drives calculations (incl. limit price),
preventing amount jumps on focus after price updates.
> - **Utils**:
> - Add `formatCloseAmountUSD(value)` with 2‑dp rounding and guards;
export and use in view.
> - **Tests**:
> - Add "Price Update Synchronization" suite covering init-once,
focus-jump prevention, sync when not editing, and no-sync while editing.
>   - Add unit tests for `formatCloseAmountUSD` edge cases.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
22b7d1f. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR fixes a performance regression in the Perps feature introduced
in PR #21428 (October 21, 2025) where L2 order book WebSocket
subscriptions were created for 100+ markets globally, despite only 2
views needing this data.

### What is the reason for the change?

**Performance Regression**: PR #21428 added `includeOrderBook: true` to
ALL price subscriptions (including the prewarm system) to support
maker/taker fee calculations. This created unnecessary L2 order book
WebSocket subscriptions for 100+ markets on every screen, even though
only PerpsOrderView and PerpsClosePositionView actually use
bestBid/bestAsk data.

**Critical Context**: This issue is present in **release/7.58.0** (about
to be submitted). It wasn't detected earlier because it was masked by:
1. React Native patch performance issues (October 2025) - caused general
app slowness
2. HIP-3 new markets (October 2025) - added 3-10 markets which
multiplied the problem
3. All three issues hit simultaneously, making attribution extremely
difficult

The order book issue would have been obvious in isolation, but was
effectively "lost in the noise" of other performance problems.

### What is the improvement/solution?

**Architectural Fix**: Separate order book subscriptions from basic
price subscriptions using a dedicated channel:

1. **Keep prewarm efficient**: Basic price data (price, %change,
funding, OI, volume) remains in prewarm for 100+ markets
2. **Separate top of book channel**: New `TopOfBookStreamChannel` and
`usePerpsTopOfBook()` hook
3. **Explicit subscriptions**: Only PerpsOrderView and
PerpsClosePositionView subscribe to top of book data for their 1 active
token

**Note**: Renamed to "TopOfBook" (from "OrderBook") to clarify that it
provides only best bid/ask (1 level), not full L2 order book with
multiple levels. Full L2 order book subscriptions would be a separate
feature if needed.

**Result**: Reduces L2 order book WebSocket subscriptions from 100+
(global) to 2 maximum (on-demand).

### Implementation Details

**Phase 1: Infrastructure**
- Created `TopOfBookStreamChannel` class in PerpsStreamManager.tsx
- Created `usePerpsTopOfBook` hook in hooks/stream/
- Added TypeScript types for `TopOfBookData`

**Phase 2: View Updates**
- Updated `PerpsOrderView.tsx` to use `usePerpsTopOfBook`
- Updated `PerpsClosePositionView.tsx` to use `usePerpsTopOfBook`
- Both views now explicitly request top of book data for their active
asset only

**Phase 3: Cleanup**
- Removed `includeOrderBook: true` from prewarm subscription (line 357)
- Removed `includeOrderBook: true` from regular subscriptions (line 250)

**Phase 4: Testing**
- Updated test mocks to include `topOfBook` channel
- All Perps Views tests pass (19/19)
- All Perps Hooks tests pass (68/68)

## **Changelog**

CHANGELOG entry: Fixed Perps performance issue by optimizing order book
subscriptions

## **Related issues**

Fixes: Performance regression from PR #21428
Related: Issue present in release/7.58.0

## **Manual testing steps**

```gherkin
Feature: Perps Order Book Subscription Optimization

  Scenario: HomeView performance - no unnecessary order book subscriptions
    Given user opens Perps HomeView
    When the view loads with positions, watchlist, and trending markets
    Then only basic price data should be subscribed (no order book)
    And the view should render without performance issues

  Scenario: MarketListView performance - no unnecessary order book subscriptions
    Given user opens Perps MarketListView with 100+ markets
    When the list renders
    Then only basic price data should be subscribed (no order book)
    And scrolling should be smooth

  Scenario: OrderView fee calculation - top of book works correctly
    Given user opens PerpsOrderView for a market
    When user enters a limit order
    Then top of book data should be fetched for that 1 market only
    And maker/taker fee should be calculated correctly based on bestBid/bestAsk
    And fee should update when limit price changes relative to top of book

  Scenario: ClosePositionView fee calculation - top of book works correctly
    Given user opens PerpsClosePositionView for a position
    When user enters close details
    Then top of book data should be fetched for that 1 market only
    And closing fee should be calculated correctly based on bestBid/bestAsk

  Scenario: Multiple views - independent subscriptions
    Given user has OrderView open for BTC
    When user navigates to ClosePositionView for ETH
    Then BTC top of book subscription should clean up
    And ETH top of book subscription should be created
    And only 1 top of book subscription should be active at a time
```

## **Screenshots/Recordings**

### **Before**

Video extracted from clean install on `release/7.58.0`


https://github.com/user-attachments/assets/9c9c6845-5434-4cfd-b615-a04b45d156c8


**Architecture**:
```
Connection → Prewarm (includeOrderBook: true)
  ├─ Subscribe to 100+ markets with L2 order book
  ↓
All Views (HomeView, MarketListView, OrderView, etc.)
  ├─ Receive order book data for 100+ markets
  └─ Process bestBid/bestAsk for 100+ markets (98% unused)
```

**WebSocket Subscriptions**: 100+ L2 order book subscriptions created on
connection

**Performance**: Views processing unnecessary order book data for
markets they don't display

### **After**


https://github.com/user-attachments/assets/6e309b46-28a3-4d44-a160-380b5bf6cead


**Architecture**:
```
Connection → Prewarm (basic prices only)
  ├─ Subscribe to 100+ markets for price/change/funding/OI/volume
  ↓
HomeView/MarketListView/etc.
  ├─ Receive basic price data only
  └─ No order book processing

OrderView/ClosePositionView
  ├─ usePerpsLivePrices(['BTC']) → basic price data
  ├─ usePerpsTopOfBook(['BTC']) → top of book for 1 market
  └─ Process top of book only for active trading asset
```

**WebSocket Subscriptions**: Max 2 L2 order book subscriptions (only
when OrderView or ClosePositionView is active)

**Performance**: Views only process data they actually need

## **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]
> Introduces a dedicated top-of-book stream/hook used by order/close
views, removes global L2 order book from price subscriptions, and
optimizes price/throttle handling.
> 
> - **Streams/Infrastructure**:
> - **Top of Book**: Add `TopOfBookStreamChannel` in
`PerpsStreamManager` and `usePerpsTopOfBook` hook; subscribes per-symbol
with `includeOrderBook: true`, caches best bid/ask, and cleans up on
unmount.
> - **Price Subscriptions**: Remove `includeOrderBook` from `prices`
subscriptions and prewarm; keep basic price data only.
> - **Performance**: Improve throttling/timer cleanup in
`StreamChannel`; memoize `usePerpsLivePrices` dependencies; optimize
`HyperLiquidSubscriptionService.allMids` to process only subscribed
symbols and skip unchanged prices before notifying.
> - **Views**:
> - Update `PerpsOrderView.tsx` and `PerpsClosePositionView.tsx` to use
`usePerpsTopOfBook` for maker/taker fee inputs
(`currentBidPrice`/`currentAskPrice`).
> - **Tests**:
> - Add `usePerpsTopOfBook` tests and `TopOfBookStreamChannel` tests;
update mocks (`defaultPerpsTopOfBookMock`) and view tests to wire new
hook; mark `perps-add-funds.spec.ts` test as `it.skip`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9216fff. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Nicholas Gambino <nicholas.gambino@consensys.net>
…end flow (#21515)

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

Similarly what's being done in
MetaMask/metamask-extension#37047 this PR
implements a short living cache for `Name` component to use after send
flow.

## **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: Show ENS name in the confirmation after picking ENS
recipient in send flow

## **Related issues**

Fixes: #19072

## **Manual testing steps**

1. Go to send flow
2. Pick ENS recipient
3. Proceed into confirmation - you should be able to see ENS in the
confirmation now

## **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/d74ee373-8df0-43d4-924a-5520eb203240



## **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 5‑minute ENS resolution cache used post-send and surfaces
cached ENS in Name display; integrates with validation and updates
tests.
> 
> - **ENS caching (5 min TTL)**:
> - Add `useSendFlowEnsResolutions` with `setResolvedAddress` and
`getResolvedENSName` to cache ENS per `chainId:address`.
> - **Send flow integration**:
> - Update `useNameValidation` to call `setResolvedAddress(chainId,
ensName, resolvedAddress)` when `isEvmSendType` and ENS resolves.
> - **Display name integration**:
> - Update `useDisplayName` to read `ensName` via
`getResolvedENSName(variation, value)` and prioritize it in `name`
selection.
> - **Tests**:
> - New tests for cache storage, expiration, chain separation, overwrite
behavior.
> - Extend `useNameValidation` tests to assert cache writes only for
EVM/ENS.
>   - Add `useDisplayName` test to verify ENS name is returned.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c5a24a9. 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?
-->

## **Changelog**
This PR fixes missing blockexplorer links by not relying only on network
config from NetworksController and getting it from `useBlockExplorer`
for networks without blockexplorer.

We should potentially fill the initial list somehow or use only one the
new method.
<!--
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 a bug that was preventing blockexplorer links to
appear on some networks (ie. Linea)

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Show Linea transactions on blockexplorer

  Scenario: user navigates to Linea blockexplorer
    Given Linea is available on the networks list

    When user goes to activity and chooses Linea as a network
    Then "View full history on Lineascan" button is visible and working correctly
```

## **Screenshots/Recordings**

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

### **Before**
<img width="407" height="911" alt="Screenshot 2025-10-30 at 14 14 49"
src="https://github.com/user-attachments/assets/f7b88a20-54bf-4d21-962f-66a7efb3f3e9"
/>

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

### **After**
<img width="409" height="913" alt="Screenshot 2025-10-30 at 13 19 03"
src="https://github.com/user-attachments/assets/b57e0655-314d-42a7-89f3-dd6c5f202ca7"
/>

<!-- [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]
> Restores missing EVM block explorer links by preferring config URLs
and falling back to useBlockExplorer, adjusts footer logic, updates
tests, and changes Palm explorer URL.
> 
> - **Transactions (UnifiedTransactionsView)**
> - Integrates `useBlockExplorer` and selects `blockExplorerUrl` from
`configBlockExplorerUrl` or `getBlockExplorerUrl(address)` when config
is absent.
> - Computes `configBlockExplorerUrl` respecting the
per-dapp/multiselect selector (only when exactly one EVM chain is
selected).
> - Updates `onViewBlockExplorer` to use `getBlockExplorerAddressUrl`
only when a config URL exists; otherwise navigates directly with
PopularList explorer URL and name.
> - Passes `providerType` to `TransactionsFooter` only when
`configBlockExplorerUrl` is defined.
> - Improves refresh handler to await `updateIncomingTransactions` and
manage `refreshing` state.
> - Enhances non‑EVM explorer resolution (uses CAIP `chainId` prop when
no non‑EVM networks are enabled).
> - **UI (TransactionsFooter)**
> - Safeguards provider comparison: only treat as non‑RPC when
`providerType` is defined and not `RPC`.
> - **Networks**
>   - Updates Palm block explorer to `https://palm.chainlens.com`.
> - **Tests**
> - Adds mocks for `useBlockExplorer` and `selectProviderConfig`;
updates expectations for explorer URL selection and refresh behavior;
ensures no `getBlockExplorerAddressUrl` call when multiple EVM chains.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
db74123. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ring social login rehydration (#21903)

## **Description**

This PR adds MetaMetrics tracking for when users click the "Use a
different login method" button during social login rehydration flow

**What is the reason for the change?**
We need to track when users decide to switch login methods during the
rehydration phase

**What is the improvement/solution?**
Added a new MetaMetrics event `UseDifferentLoginMethodClicked` that
fires when:
- User is in social login flow
- Onboarding is not completed (rehydration phase)
- User clicks "Use a different login method" on the welcome back screen

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/SL-241

## **Manual testing steps**

1. Start a social login import flow (Google or Apple)
2. Complete authentication with the provider
3. Navigate to the unlock/rehydration screen
4. Click "Use a different login method" button
5. Verify the `USE_DIFFERENT_LOGIN_METHOD_CLICKED` event is tracked with
`account_type: 'social'`

## **Screenshots/Recordings**

### **Before**
No MetaMetrics event tracked when clicking "Use a different login
method" during rehydration

### **After**
`USE_DIFFERENT_LOGIN_METHOD_CLICKED` event tracked with proper
account_type property

## **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 new MetaMetrics event and triggers it when users in OAuth
rehydration click "Use a different login method".
> 
> - **Analytics**
> - Add `USE_DIFFERENT_LOGIN_METHOD_CLICKED` to `EVENT_NAME` and expose
via `MetaMetricsEvents` in `app/core/Analytics/MetaMetrics.events.ts`.
> - **Login**
> - In `app/components/Views/Login/index.tsx`, fire
`MetaMetricsEvents.USE_DIFFERENT_LOGIN_METHOD_CLICKED` with `{
account_type: 'social' }` when `handleUseOtherMethod` is used during
OAuth onboarding rehydration.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9951208. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…22047)

<!--
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 make burn/null address sending alert to be a blocking
alert.

See the task details for further information

## **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: Make burn and null address sending a blocking alert

## **Related issues**

Fixes: #22046

## **Manual testing steps**

N/A

## **Screenshots/Recordings**

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

### **Before**

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

### **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]
> Make burn/null address alerts blocking and update tests accordingly.
> 
> - **Alerts**:
> - `useBurnAddressAlert`: Set `isBlocking: true` for `BurnAddress`
alert in `Severity.Danger`.
> - **Tests**:
> - Update `useBurnAddressAlert.test.ts` to expect `isBlocking: true`
for burn/null address cases (direct and nested recipients,
mixed/uppercase casing).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9093654. 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**
Remove not needed workaround for change password e2e test issue

<!--
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:
#16758

## **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 iOS CI-specific workaround from the change-password flow in the
delete wallet E2E test.
> 
> - **E2E tests**:
> - Remove iOS CI-specific workaround in
`e2e/specs/settings/delete-wallet.spec.ts` that tapped
`TabBarComponent.tapWallet()` after changing password.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6e9f931. 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**

We were not getting Tron addresses for all BIP44 accounts due to a
mismatch between what the `multichain-account-service`'s `TrxProvider`
called the Snap with and what the Snap's keyring handler expected. Both
of these dependencies have been fixed. This PR bumps the version of both
dependencies to a healthy one.

## **Changelog**

CHANGELOG entry: Bump `@metamask/multichain-account-service` to version
2.0.1
CHANGELOG entry: Bump `@metamask/tron-wallet-snap` to version 1.6.1

## **Related issues**

Fixes: NWNT-646

## **Manual testing steps**

```gherkin
Feature: Tron address generation

  Scenario:
    When user finishes onboarding with his Seed Phrase
    Then we should have X accounts initialized and all of them should have a Tron address associated with them

    When user finishes onboarding with his Seed Phrase and adds a new account
    Then the new account should have a Tron address associated with it
```

## **Screenshots/Recordings**

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

### **Before**

n/a

### **After**

n/a

## **Pre-merge author checklist**

- [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]
> Bumps `@metamask/multichain-account-service` to ^2.0.1 and
`@metamask/tron-wallet-snap` to ^1.6.1 with corresponding lockfile
updates.
> 
> - **Dependencies**:
> - Bump `@metamask/multichain-account-service` to `^2.0.1` in
`package.json` (updated `yarn.lock`).
> - Bump `@metamask/tron-wallet-snap` to `^1.6.1` in `package.json`
(updated `yarn.lock`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f7dc608. 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?
-->

- Add option to wait for the confirm button to disappear on Android,
addressing cases where the button may be obscured, this should force and
error and cause the action to be retried

## **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]
> Updates the e2e confirm action to wait for the confirm button to
disappear on Android before proceeding.
> 
> - **E2E / Browser Confirmations**
>   - `e2e/pages/Browser/Confirmations/FooterActions.ts`
> - Update `tapConfirmButton()` to pass `waitForElementToDisappear`
(Android-only) to `Gestures.waitAndTap`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f51e416. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
metamaskbot and others added 2 commits November 17, 2025 20:38
This PR updates the change log for 7.59.0. (Hotfix - no test plan
generated.)

---------

Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
Co-authored-by: João Loureiro <175489935+joaoloureirop@users.noreply.github.com>
Co-authored-by: sethkfman <setk.kaufman@consensys.net>
@joaoloureirop joaoloureirop marked this pull request as ready for review November 18, 2025 18:32
@joaoloureirop joaoloureirop requested review from a team as code owners November 18, 2025 18:32
@joaoloureirop joaoloureirop added the skip-sonar-cloud Only used for bypassing sonar cloud when failures are not relevant to the changes. label Nov 18, 2025
joaoloureirop
joaoloureirop previously approved these changes Nov 18, 2025
@theomart77
Copy link

🚀 v7.59.0 Testing & Release Quality Process

Hi Team,
As part of our new MetaMask Release Quality Process, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment.


📋 Key Processes

Testing Strategy

  • Developer Teams:
    Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows.
  • QA Team:
    Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing.
  • Customer Success Team:
    Validate new functionalities and provide feedback to support release monitoring.

GitHub Signoff

  • Each team must sign off on the Release Candidate (RC) via GitHub by the end of the validation timeline (Tuesday EOD PT).
  • Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed.

Issue Resolution

  • Resolve all Release Blockers (Sev0 and Sev1) by Tuesday EOD PT.
  • For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines.

Cherry-Picking Criteria

  • Only critical fixes meeting outlined criteria will be cherry-picked.
  • Developers must ensure these fixes are thoroughly reviewed, tested, and merged by Tuesday EOD PT.

🗓️ Timeline and Milestones

  1. Today (Friday): Begin Release Candidate validation.
  2. Tuesday EOD PT: Finalize RC with all fixes and cherry-picks.
  3. Wednesday: Buffer day for final checks.
  4. Thursday: Submit release to app stores and begin rollout to 1% of users.
  5. Monday: Scale deployment to 10%.
  6. Tuesday: Full rollout to 100%.

✅ Signoff Checklist

Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion:

Team sign-off checklist

  • Accounts Framework
  • Assets
  • Bots Team
  • Card
  • Confirmations
  • Core Platform
  • Design System
  • Earn
  • Mobile Platform
  • Mobile UX
  • Network Enablement
  • New Networks
  • Perps
  • Predict
  • Product Safety
  • Ramp
  • Rewards
  • Swaps and Bridge
  • Transactions
  • Wallet Integrations
  • Web3Auth

This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀

Feel free to reach out if you have questions or need clarification.

Many thanks in advance

Reference

@sonarqubecloud
Copy link

@joaoloureirop joaoloureirop merged commit 878c836 into stable Nov 20, 2025
142 of 180 checks passed
@github-actions github-actions bot locked and limited conversation to collaborators Nov 20, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-7.59.0 Issue or pull request that will be included in release 7.59.0 size-XL skip-sonar-cloud Only used for bypassing sonar cloud when failures are not relevant to the changes.

Projects

None yet

Development

Successfully merging this pull request may close these issues.