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