Skip to content

[pull] main from MetaMask:main#431

Merged
pull[bot] merged 12 commits into
Reality2byte:mainfrom
MetaMask:main
Jan 6, 2026
Merged

[pull] main from MetaMask:main#431
pull[bot] merged 12 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Jan 6, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

michalconsensys and others added 12 commits January 6, 2026 08:10
…24238)

## **Description**

The TP (Take Profit) and SL (Stop Loss) text displayed below the "Auto
close" label in the Perps position card was using `TextVariant.BodySM`,
which appeared visually smaller than other values on the same card.

This PR updates the text variant from `BodySM` to `BodyMD` to ensure
consistent font sizing throughout the position card, matching the
styling of other value fields like P&L, ROE, Size, and Margin.

## **Changelog**

CHANGELOG entry: Fixed inconsistent font size for TP/SL text in Perps
position card


## **Related issues**

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

## **Manual testing steps**

```gherkin
Feature: Perps Position Card TP/SL Display

  Scenario: User views position card with TP/SL configured
    Given user has an open Perps position with TP and SL set
    
    When user views the position card
    Then the TP/SL text below "Auto close" label should have the same font size as other values on the card (P&L, ROE, Size, Margin)

  Scenario: User views position card without TP/SL configured
    Given user has an open Perps position without TP/SL set
    
    When user views the position card
    Then the "Set take profit and stop loss" description text should have the same font size as other values on the card
```

## **Screenshots/Recordings**

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

### **Before**

See here https://consensyssoftware.atlassian.net/browse/TAT-2176

### **After**

<img width="1206" height="2622"
alt="simulator_screenshot_B0629DD2-5EBE-40DB-B6B2-D6FF0DEE4C6B"
src="https://github.com/user-attachments/assets/4e6c3323-026b-4767-bcc2-0a8d64f40ffd"
/>


## **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]
> Ensures consistent typography in the Perps position card.
> 
> - Updates `Text` variant from `BodySM` to `BodyMD` for TP/SL values
and the default description under `Auto close` in
`PerpsPositionCard.tsx`
> - No behavioral or logic changes; UI-only styling adjustment
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9ab398e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…iews (#24234)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

This PR addresses minor UI polish issues in the Perps feature:

1. **Close All Positions View**: Removed the border from the secondary
"Keep" button in the footer and ensured both buttons have equal flex
width for better visual consistency.

2. **Market Balance Actions**: Added bottom margin (`mb-4`) to the
container when the balance is not empty, improving spacing consistency
in the layout.

## **Changelog**



CHANGELOG entry: Fixed UI styling inconsistencies in Perps close
positions and market balance views

## **Related issues**

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

## **Manual testing steps**

```gherkin
Feature: Perps Close All Positions UI

  Scenario: User views the close all positions sheet
    Given user has open perps positions
    
    When user opens the "Close All Positions" bottom sheet
    Then the "Keep" and "Close All" buttons should have equal width and wrap the text the same way
Feature: Perps Market Balance Actions UI

  Scenario: User views market balance with non-empty balance
    Given user has a non-empty perps market balance
    
    When user views the market balance actions section
    Then there should be appropriate bottom margin spacing below the component
```

## **Screenshots/Recordings**

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

### **Before**

See here https://consensyssoftware.atlassian.net/browse/TAT-2233

### **After**

<!-- [screenshots/recordings] -->
<img width="1206" height="2622" alt="Simulator Screenshot - iPhone 17
Pro - 2026-01-05 at 11 30 38"
src="https://github.com/user-attachments/assets/0cf8ea41-9723-48df-81e6-bb9ce0817c62"
/>

<img width="1206" height="2622"
alt="simulator_screenshot_75B46A50-1FC8-4693-82D7-3064FC34FF76"
src="https://github.com/user-attachments/assets/3942ba1b-39d8-460b-acca-091b36e08869"
/>

## **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]
> Minor UI polish for Perps screens.
> 
> - **Close All Positions:** Adds `footerButtonSecondary` style (`flex:
1`, `borderWidth: 0`) and applies it to the secondary "Keep positions"
button for equal width with the primary button and no border.
> - **Market Balance Actions:** Sets `twClassName` to include `mb-4`
when balance is not empty to ensure consistent bottom spacing.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9c5ab64. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

PerpsMarketBalanceActions was triggering the following Redux warning:
```
Selector unknown returned a different result when called with the same parameters.This can lead to unnecessary rerenders.
```

This occurred due to two issues:
* Inline selector creating new array references every render: The
component used an inline selector with .filter() that created a new
array reference on every render, even when the underlying data hadn't
changed. Additionally, it returned [] (a new empty array reference) when
no address was selected.
* Curried selector pattern at component level: The pattern
useSelector(selectSelectedInternalAccountByScope)('eip155:1') was
fragile and not following Redux best practices.

**Solution**

Created properly memoized selectors in a new file
app/selectors/perpsController.ts:
* selectPerpsControllerState - Base selector for PerpsController state
* selectAllWithdrawalRequests - Memoized selector with stable empty
array fallback
* selectSelectedEvmAddress - Properly handles the curried account
selector
* selectWithdrawalRequestsBySelectedAccount - Filters by account with
stable references

**Key improvements:**
* Uses createDeepEqualSelector for deep equality comparisons
* Returns a constant EMPTY_WITHDRAWAL_REQUESTS array instead of creating
new [] references
* Moves filtering logic into the selector chain where it can be properly
memoized

**Why This Matters**
* Without proper memoization:
* Unnecessary re-renders: Every state change (even unrelated ones) would
cause the component to re-render because the selector returned a "new"
array
* Performance degradation: Child components receiving withdrawalRequests
as a prop would also re-render unnecessarily
* React optimization bypass: React.memo, useMemo, and useCallback that
depend on these values become ineffective

## **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: Optimize PerpsSelectors in PerpsMarketBalanceActions

## **Related issues**

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

## **Manual testing steps**

Redux warning should no longer display in devtools console.

## **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]
> Introduces memoized Redux selectors for perps withdrawal requests and
updates the UI to use them, reducing re-renders and fixing account scope
filtering.
> 
> - Add `selectPerpsControllerState`, `selectAllWithdrawalRequests`, and
`selectWithdrawalRequestsBySelectedAccount` with deep-equality and
stable empty-array references
> - Filter by EVM-scoped selected account (`EVM_SCOPE`) with
case-insensitive address matching
> - Refactor `PerpsMarketBalanceActions` to consume
`selectWithdrawalRequestsBySelectedAccount` instead of inline
`.filter()`
> - Export selectors via `app/selectors/perps/index.ts`
> - Add unit tests for base and withdrawal selectors covering edge cases
and stability
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
696ab17. 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**

Updated APR fallback logic from nullish coalescing (`??`) to check if
`aprOverride` is a valid non-zero value, preventing "0%" from overriding
a legitimate `earnToken.experience.apr`.

## **Changelog**

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

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

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

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: 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]
> Ensures correct APR display in staking navbar by avoiding zero-value
overrides.
> 
> - In `Navbar/index.js` `getStakingNavbar`, added `parsedOverride` and
set `apr` to `aprOverride` only when `parseFloat(aprOverride) > 0`;
otherwise use formatted `earnToken.experience.apr`
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a7a813d. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR adds JVM and Gradle configuration improvements for Android E2E
builds to help diagnose and mitigate build failures.

**Changes:**
1. **JVM Flags** (`gradle.properties.github`):
- `ExitOnOutOfMemoryError`: Fail-fast on JVM heap exhaustion (note: does
not catch OS OOM killer)
- `file.encoding=UTF-8`: Ensure consistent charset across different
runner configurations

2. **Gradle Logging** (`scripts/build.sh`):
- Enable `--stacktrace --info` for E2E builds to provide actionable logs
when builds fail

These are additive improvements only - no existing values were reduced.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:
[INFRA-3174](https://consensyssoftware.atlassian.net/browse/INFRA-3174)

## **Manual testing steps**

```gherkin
Feature: Android E2E Build Improvements

  Scenario: E2E build with verbose logging
    Given the PR is merged to main
    
    When an Android E2E build runs
    Then Gradle uses --stacktrace --info flags
    And build logs show detailed information for debugging
    
  Scenario: JVM exits on heap exhaustion
    Given the Gradle JVM encounters OutOfMemoryError
    
    When the error is thrown
    Then the JVM exits immediately (fail-fast)
    And the build fails with clear OOM indication
```

## **Screenshots/Recordings**

### **Before**

N/A - infrastructure/CI change

### **After**

Build results will be visible in PR checks after workflow runs.

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


[INFRA-3174]:
https://consensyssoftware.atlassian.net/browse/INFRA-3174?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
<!--
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**
* convert optinmetrics component code from javascript to typescript
* Jira: https://consensyssoftware.atlassian.net/browse/SL-357
<!--
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:

## **Manual testing steps**

```gherkin
Feature: my feature name

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

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

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

https://github.com/user-attachments/assets/5a61d3d5-211b-4b1f-b4e1-f70205181a05
<!-- [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]
> Migrates `OptinMetrics` from class-based JS to a typed functional
component, extracting styles/types and updating tests accordingly.
> 
> - **UI (React Native)**:
> - Reimplements `app/components/UI/OptinMetrics/index.js` as
`index.tsx` using hooks (`useState`, `useEffect`, `useCallback`), Redux
hooks, and React Navigation hooks with typed route params.
> - Maintains analytics consent flow: enables/disables metrics, updates
Sentry/trace buffering, tracks `ANALYTICS_PREFERENCE_SELECTED`, and adds
device/user traits; preserves navigation reset and webview "Learn more"
link handling.
>   - Preserves scroll/end-reached logic and back-press alert handling.
> - Extracts styles to `OptinMetrics.styles.ts` and adds
`OptinMetrics.types.ts` for route/link params.
> - **Tests**:
> - Updates `index.test.tsx` to import `index.tsx`; tests cover checkbox
interdependency, feature flag text, scroll/layout handlers, and
analytics event emissions.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
42ee375. 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**

On send recipient page filter addresses by chain id.

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

## **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**
<img width="397" height="845" alt="Screenshot 2026-01-06 at 5 06 44 PM"
src="https://github.com/user-attachments/assets/ed73cd15-a084-48a8-aee8-8899e86f6211"
/>

## **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]
> Narrows recipient suggestions to the active chain.
> 
> - `useContacts` now reads `chainId` from `useSendContext` and returns
contacts only from `addressBook[chainId]`, deduplicated
> - Preserves EVM-only validation (0x prefix, 42 chars, excludes
`LOWER_CASED_BURN_ADDRESSES`); returns `[]` for `isNonEvmSendType`
> - Updates memo deps to include `chainId`
> - Test suite updated to mock `useSendContext`, expect chain-scoped
results, handle hex chain IDs (e.g., `0x1`), and cover burn/invalid
address filtering and empty/edge cases
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b12adcf. 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 aims to fix the flakiness for
`e2e/specs/confirmations-redesigned/transactions/gas-fee-tokens-eip-7702.spec.ts`.

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

## **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]
> Improves stability of the EIP-7702 gas fee token e2e and re-enables
the test.
> 
> - Unskips `gas-fee-tokens-eip-7702.spec.ts`; adds assertion that
`Select a token` modal is visible before validations
> - Replaces inline attribute access with
`RowComponents.getNetworkFeeGasFeeTokenSymbolText()` to read the
selected token symbol
> - Adds `getNetworkFeeGasFeeTokenSymbolText()` to `RowComponents.ts`
> - Adds a visibility check in `GasFeeTokenModal.checkAmountFiat()`
before reading attributes
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c40a243. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Pedro Figueiredo <pedro.figueiredo@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**

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

This PR introduces an intermediate Verification screen in the Card
onboarding flow, placed between the Veriff webview and the Personal
Details screen.
The main motivation is to correctly handle Veriff KYC outcomes before
allowing the user to proceed. Previously, users were always redirected
to the next step regardless of the verification result, which could lead
to invalid states and confusing UX.

## **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 a verification step to the Card onboarding flow
to validate Veriff KYC results before proceeding.

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Card onboarding Veriff verification handling

  Scenario: User successfully completes Veriff KYC
    Given the user is in the Card onboarding flow
    And the user completes the Veriff verification
    And Veriff returns a successful KYC response
    When the verification check is performed
    Then the user is redirected to the Personal Details screen

  Scenario: User fails Veriff KYC
    Given the user is in the Card onboarding flow
    And the user completes the Veriff verification
    And Veriff returns a failed or rejected KYC response
    When the verification check is performed
    Then the user is shown the verification error screen
    And the user is prevented from continuing the onboarding flow
```

## **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]
> Introduces a dedicated Veriff KYC verification step and rewires
onboarding navigation accordingly.
> 
> - Adds `VerifyingVeriffKYC` screen that polls
`useUserRegistrationStatus` and resets stack to `PERSONAL_DETAILS` on
`VERIFIED` or `KYC_FAILED` on `REJECTED`; tracks metrics and adds i18n
strings
> - `KYCWebview` now `StackActions.replace`s to
`CARD.ONBOARDING.VERIFYING_VERIFF_KYC`
> - Updates `OnboardingNavigator`: replaces `ValidatingKYC` with
`VerifyingVeriffKYC`, adds new route constants, reorders screens, and
changes initial-route logic (PENDING with `firstName` ->
`VERIFYING_VERIFF_KYC`; VERIFIED without `countryOfNationality` ->
`PERSONAL_DETAILS` else address checks -> `PHYSICAL_ADDRESS`/`COMPLETE`)
> - `VerifyingRegistration`: continue now replaces to
`CARD.ONBOARDING.ROOT` → `COMPLETE`; auto-replaces to `KYC_FAILED` when
rejected; refines header/actions and copy
> - `PhysicalAddress`: after successful registration, resets to
`Routes.CARD.VERIFYING_REGISTRATION`
> - Updates metrics (`CardScreens.VERIFYING_VERIFF_KYC`), route names,
and en locale strings; removes `ValidatingKYC` test and adds
comprehensive tests for new flows
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
c5f051a. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

Refactored the send flow navbar to use the new `HeaderCenter` component
pattern via `getHeaderCenterNavbarOptions`. This replaces the manual
header configuration (custom `headerLeft`, `headerRight`, `headerTitle`,
and `headerStyle` implementations) with the standardized header
component, significantly simplifying the code.

**Why:**
The send flow was using a custom inline header implementation with
individually defined components for back button, close button, title,
and styling. This duplicated logic that exists in the reusable
`HeaderCenter` component.

**Improvement:**
- Reduced `useSendNavbar` hook from ~100 lines to ~50 lines
- Aligned send flow headers with the standardized `HeaderCenter` pattern
used across the app
- Improved maintainability by using a centralized header component

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MDP-654

## **Manual testing steps**

```gherkin
Feature: Send flow navigation header

  Scenario: User navigates through send flow screens
    Given user is on the wallet home screen with available ETH balance

    When user taps on Send button
    Then user sees the Asset selection screen with "Send" title in header

    When user selects an asset and proceeds to Recipient screen
    Then user sees the Recipient screen with centered "Send" title, back button (left), and close button (right)

    When user selects a recipient and proceeds to Amount screen
    Then user sees the Amount screen with centered "Send" title, back button (left), and close button (right)

    When user taps the back button
    Then user navigates to the previous screen

    When user taps the close (X) button
    Then the send flow is closed and user returns to the home screen
```

## **Screenshots/Recordings**

### **Before**

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

### **After**

https://github.com/user-attachments/assets/99fd07e2-4598-4d19-ba71-2e4a90ccc818

<!-- [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]
> Migrates the send flow to the standardized `HeaderCenter` header
options and updates tests to match the new API.
> 
> - Replaces manual
`headerLeft`/`headerRight`/`headerTitle`/`headerStyle` with
`getHeaderCenterNavbarOptions` for `Amount`, `Asset`, and `Recipient`,
wiring `onBack`/`onClose`, `includesTopInset`, and test IDs
> - Removes theme/design-system header composition and related code from
`useSendNavbar`
> - Updates tests to render the `header` function, assert back/close
buttons and title, and adjusts mocks (`react-navigation`, safe area,
tailwind, design-system)
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
53d0f5c. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

This PR adds a disclaimer to the "About" tab on the Predict market
details page.

**Reason for change:**
Users need to be informed that the market information displayed may be
incomplete and that all market rules, resolution criteria, and final
outcomes are governed by Polymarket.

**Solution:**
Added a disclaimer text section below the market description in the
About tab, separated by a horizontal divider. The disclaimer directs
users to Polymarket for the full rules before making trades.

## **Changelog**

CHANGELOG entry: Added disclaimer to Predict market details About tab
informing users to check Polymarket for full market rules

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/PRED-386

## **Manual testing steps**

```gherkin
Feature: Predict Market Details Disclaimer

  Scenario: user views market About tab
    Given user has Predict enabled
    And user is on a Predict market details screen

    When user scrolls to the About section
    Then user sees the market description
    And user sees a disclaimer below the description stating market info may be incomplete and rules are governed by Polymarket
```

## **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="1179" height="2556"
alt="simulator_screenshot_1BDF6804-092E-4394-9D94-E3071EBD51EB"
src="https://github.com/user-attachments/assets/e9645ba5-0589-4459-a35a-399b74ec0c3c"
/>


## **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]
> Adds a short legal disclaimer to the Predict market details About
section.
> 
> - Updates `PredictMarketDetails.tsx` to render a divider and `Text`
with `strings('predict.market_details.disclaimer')` beneath the market
description
> - Adds `predict.market_details.disclaimer` to
`locales/languages/en.json`
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
14b3b27. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…24202)

## **Description**

Move network icon to the left in network filter in send flow

## **Changelog**

CHANGELOG entry:null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MDP-303

## **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 |
| -------- | ------- |
|
![before](https://github.com/user-attachments/assets/f4269ea0-26ab-4b14-b823-a54718ea04c2)
|
![after](https://github.com/user-attachments/assets/f4ec2d2c-0e63-4285-9d24-20599b568136)
|

### **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]
> Reorders `NetworkFilterTab` to place the network avatar before the
label, updating spacing to `mr-2`.
> 
> - **UI/Layout**
> - In
`app/components/Views/confirmations/components/network-filter/network-filter.tsx`:
> - `NetworkFilterTab`: Moves the network `Avatar` before the text label
and updates spacing from `ml-2` to `mr-2` to align the icon on the left
of the label.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
03e8a7d. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pull pull Bot locked and limited conversation to collaborators Jan 6, 2026
@pull pull Bot added the ⤵️ pull label Jan 6, 2026
@pull pull Bot merged commit 9abfd43 into Reality2byte:main Jan 6, 2026
2 of 36 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.