[pull] main from MetaMask:main#519
Merged
Merged
Conversation
## **Description** **Reason for the change** On iOS, `TextInput` can show intermittent placeholder text misalignment or clipping. This comes from a React Native bug: `TextInput` still uses the default `usesFontLeading = YES` in `NSLayoutManager`, while `Text` was fixed in 2020 with `usesFontLeading = NO`. With Geist’s large ascender/leading, Fabric’s text measurement becomes inconsistent, so placeholder alignment is unstable. **Improvement / solution** Add `lineHeight: 0` to the Input base styles in `Input.styles.ts`. This gives Fabric a fixed line height and avoids the faulty font-leading calculation. Unlike `lineHeight: 20`, it does not reintroduce the multi-line wrapping issue. No native changes or rebuilds are required. **References** - [React Native #39145](facebook/react-native#39145) - [React Native #45268](facebook/react-native#45268) - [RN fix for Text only](facebook/react-native@5d08aab) --- ## **Changelog** CHANGELOG entry: Fixed intermittent placeholder text alignment and clipping in text inputs on iOS. --- ## **Related issues** Fixes: --- ## **Manual testing steps** ```gherkin Feature: Text input placeholder alignment Scenario: user views single-line text inputs on iOS Given the app is running on an iOS device or simulator When the user opens screens with text inputs (e.g. Send, Swap, custom token amount) Then placeholder text is vertically aligned and does not shift or clip on focus/blur or after re-renders ``` --- ## **Screenshots/Recordings** ### **Before** https://github.com/user-attachments/assets/b401bc85-1222-4dcd-859a-c9266283cebd ### **After** https://github.com/user-attachments/assets/e0cf18cd-e3a0-4fef-b050-73bb611216ff Verified on Android  ## **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] > **Low Risk** > Small, style-only change to a shared input component; main risk is unintended layout differences in text rendering across platforms and screens. > > **Overview** > Fixes intermittent iOS `TextInput` placeholder vertical misalignment/clipping by forcing a fixed `lineHeight: 0` in the shared `Input` base styles (`Input.styles.ts`). > > Updates a large set of Jest snapshots across screens/components that render this `Input` to reflect the new style output. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cd3cd24. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…25997) <!-- 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 aligns subpage headers with the stacked-standard pattern by replacing all `HeaderWithTitleLeft` usage with `HeaderStackedStandard` and removing the deprecated title-left components. **Reason for change:** `HeaderWithTitleLeft` and related components (`HeaderWithTitleLeftScrollable`, `TitleLeft`) are being retired in favor of the shared `HeaderStackedStandard` / `TitleStandard` pattern used elsewhere. Using one header pattern improves consistency and reduces maintenance. **What changed:** 1. **Consumer updates** – Replaced `HeaderWithTitleLeft` with `HeaderStackedStandard` (and `titleLeftProps` → `titleStandardProps`) in: - **Connect Hardware → Select Hardware** (`SelectHardware/index.tsx`) - **Import Secret Recovery Phrase** (`ImportNewSecretRecoveryPhrase/index.tsx`) - **Import Private Key** (`ImportPrivateKey/index.tsx`) 2. **Cleanup** – Removed unused components from `component-library/components-temp`: - `HeaderWithTitleLeft` (and `getHeaderWithTitleLeftNavbarOptions`) - `HeaderWithTitleLeftScrollable` (and its hook / navbar helper) - `TitleLeft` No behavior or visual change for users; same header layout and props, different component names and implementation. ## **Changelog** This PR is not end-user-facing. CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: Header alignment – stacked standard on import/hardware screens Scenario: user opens Select Hardware, Import SRP, or Import Private Key Given the app is open and the user can navigate When user goes to Connect Hardware → Select Hardware Or user goes to Import wallet flow → Import Secret Recovery Phrase Or user goes to Import wallet flow → Import Private Key Then the screen shows the same header as before (title + optional subtitle/accessory and back button) ``` ## **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/cbbe0e90-614b-4ab0-aa77-d3eca55604de <!-- [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] > **Low Risk** > Primarily a UI refactor and component cleanup; risk is limited to possible header layout/behavior regressions on the migrated screens. > > **Overview** > Migrates several screens to the stacked-standard header pattern by replacing `HeaderWithTitleLeft` with `HeaderStackedStandard` and renaming `titleLeftProps` to `titleStandardProps` while preserving back/close actions and bottom-accessory subtitle content. > > Removes the deprecated temp components `HeaderWithTitleLeft`, `HeaderWithTitleLeftScrollable` (including hook/navbar helpers), and `TitleLeft`, and updates Storybook’s auto-generated requires list plus the `ImportPrivateKey` snapshot to match the new header render output. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit db99b20. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description** Update lint related libraries to help prepare for the update to ESLint v9. ## **Changelog** CHANGELOG entry: null ## **Related issues** N/A ## **Manual testing steps** N/A ## **Screenshots/Recordings** 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] > **Low Risk** > Lockfile-only updates to dev-time lint tooling; main risk is CI/editor lint behavior changes or new lint failures, not runtime impact. > > **Overview** > Updates the `yarn.lock` to pull newer lint/tooling dependencies, primarily upgrading `eslint-plugin-import` (2.27.5 → 2.32.0), `eslint-plugin-react` (7.35.0 → 7.37.5), and `eslint-plugin-react-native` (4.0.0 → 4.1.0). > > These upgrades cascade into refreshed resolver/utility packages (e.g., `eslint-import-resolver-node`, `eslint-module-utils`, `tsconfig-paths`) and a broad set of transitive dependency bumps (notably `es-abstract` and related polyfill helpers) to align with upcoming ESLint v9 compatibility. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 75732ae. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…keleton blink [TAT-2544 TAT-2454] cp-7.66.0 (#25977) ## **Description** 1. Decouple Perps Home sorting from Market List sorting The Perps Home sections (Crypto, Stocks, Commodities, Forex) were reading the same sort preference that the Market List search writes to. This meant that when a user changed the sort in the market search (e.g., to "Funding Rate"), the home screen sections would also re-sort — which isn't the intended behavior. Home sections should always surface the highest-volume markets regardless of what the user does in search. The fix removes the dependency on `selectPerpsMarketFilterPreferences` in `usePerpsHomeData` and hardcodes the home sort to Volume descending. The Market List continues to use and persist its own sort preference independently. 2. Remove skeleton loader blink on leverage bottom sheet When adjusting leverage via the slider or preset buttons, the liquidation banner and liquidation price would rapidly toggle between a skeleton placeholder and the actual value. This created a jarring "blink" effect — especially during slider drags, where every tick triggered the skeleton. The current price row right below it just updates its value in place with no loading state, making the inconsistency more noticeable. The fix caches the last valid liquidation price and percentage in refs, so the UI always shows either the latest calculated value or the previously known one. On first open (before any calculation has completed), it shows -- as a placeholder instead of a skeleton shimmer. The banner colors (safe/caution/medium/high) are unaffected because they're driven by the leverage slider position, not the liquidation price calculation. ## **Changelog** CHANGELOG entry: Fixed a flickering skeleton loader on the leverage bottom sheet when adjusting leverage, and decoupled Perps Home sorting from the market search sort preference so home sections always sort by volume. ## **Related issues** Fixes: [TAT-2544](https://consensyssoftware.atlassian.net/browse/TAT-2544) Fixes: [TAT-2454](https://consensyssoftware.atlassian.net/browse/TAT-2454) ## **Manual testing steps** ```gherkin Feature: Perps Home sections sort independently from Market List Scenario: Home sections always sort by volume Given user is on the Perps Home screen When user opens the Market List and changes sort to "Funding Rate" And user navigates back to Perps Home Then all home sections (Crypto, Stocks, Commodities, Forex) remain sorted by descending volume Feature: Leverage bottom sheet liquidation display Scenario: No skeleton blink when dragging leverage slider Given user opens the leverage bottom sheet on any market When user drags the leverage slider back and forth Then the liquidation banner text and price update in place without skeleton flashing And the banner color transitions smoothly based on leverage risk level Scenario: No skeleton blink when tapping preset buttons Given user opens the leverage bottom sheet When user taps different preset leverage buttons (2x, 5x, 10x, etc.) Then the liquidation values tick to the new values without a skeleton placeholder appearing Scenario: Initial open shows placeholder Given user opens the leverage bottom sheet for the first time When the liquidation price has not yet been calculated Then the liquidation price and percentage show "--" until the first value arrives ``` ## **Screenshots/Recordings** https://github.com/user-attachments/assets/f69fdc60-82c9-479f-ba8d-7d7274b1713b https://github.com/user-attachments/assets/ea03375d-1803-4cc5-8066-2169b8e3b130 ## **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. [TAT-2544]: https://consensyssoftware.atlassian.net/browse/TAT-2544?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Touches user-facing trading UI state around liquidation calculations and introduces timing/cache logic that could regress displayed values if edge cases slip through, though changes are localized and covered by updated tests. > > **Overview** > Fixes Perps Home market sections to **always sort by volume (default direction)**, removing their dependency on the Market List’s persisted sort preference so Home no longer re-sorts when users change Market List search sorting. > > Reworks the leverage bottom sheet liquidation display to avoid flicker and stale values: caches the last valid liquidation price for passive updates, shows `--` when no value is available, and only shows skeleton placeholders after a *user-initiated leverage change* (with a minimum display time to avoid stale in-flight responses clearing loading too early). Also adds a fixed `minHeight` to the warning container to prevent layout shift when the percentage wraps. > > Updates/expands tests to mock `react-native-skeleton-placeholder` and to cover placeholder vs. skeleton behavior, including ensuring stale cached prices aren’t shown after leverage changes while pressing the already-active leverage does not trigger loading UI. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit bbd35e3. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## **Description**
Migrate all `interface` declarations in `app/controllers/perps/` to
`type` aliases to align with the `@metamask/core` monorepo ESLint rule
(`@typescript-eslint/consistent-type-definitions: ['error', 'type']`).
This reduces linting friction when the perps controller is migrated to
core.
- Added folder-specific ESLint override enforcing `type` for
`app/controllers/perps/**`
- Converted 120 `interface` declarations across 26 files to `type`
aliases
- Removed 3 now-unnecessary `eslint-disable` comments
- Fixed pre-existing duplicate `LastTransactionResult` in
`transactionTypes.ts` (interface merging hid this)
## **Changelog**
CHANGELOG entry: null
## **Related issues**
Refs: Core monorepo migration preparation
## **Manual testing steps**
```gherkin
Feature: Perps type definitions alignment
Scenario: user interacts with perps features after type-level refactor
Given the app is built with type aliases instead of interfaces in perps controller
When user interacts with any perps feature (trading, positions, deposits, withdrawals)
Then all behavior remains identical since this is a type-level-only change
```
## **Screenshots/Recordings**
N/A - Type-level refactor only, no UI or behavioral changes.
### **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.
….65.0 (#26002) <!-- 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 addresses a regression on 7.65.0 where biometrics access is no longer prompted on wallet creation for iOS. The change here adds that back, which should result in a more intuitive user experience + makes it consistent with Android. This is an improvement relative to the code that was removed in #24496 since we're now detecting the auth type prior to the password being stored rather than triggering two storage actions. ## **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: #25998 ## **Manual testing steps** Allowing biometrics - Will be prompted ask for biometric access on wallet creation - If allowed, unlock access control will be stored using biometrics - Future unlock triggers biometrics Rejecting biometrics - Will be prompted ask for biometric access on wallet creation - If rejected, unlock access control will not be stored, forcing user to use password - Future unlock falls back to password entry ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> Allowing biometrics https://github.com/user-attachments/assets/9a05e870-b1fe-465e-ba8c-6b565198ed9e Rejecting biometrics https://github.com/user-attachments/assets/9ce0be47-2aaf-4ce3-bf6e-c0386559546c ## **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] > **Medium Risk** > Touches authentication method selection and keychain password storage/fallback paths used during onboarding/import/reset, so mistakes could impact how users are prompted and how unlock methods are persisted; changes are well-covered by updated tests but span multiple critical flows. > > **Overview** > Restores an explicit iOS biometric prompt during wallet creation/import by introducing `Authentication.requestBiometricsAccessControlForIOS` and invoking it from `ChoosePassword` and `ImportFromSecretRecoveryPhrase`, falling back to `PASSWORD` when the user declines/cancels. > > Refactors password persistence by removing `updateAuthTypeStorageFlags` and `storePasswordWithFallback`, making `Authentication.storePassword` public and adding an optional fallback-to-password retry used by `newWalletAndKeychain`/`newWalletAndRestore`/Reset Password. Updates OAuth rehydration and reset-password flows/tests accordingly, and adds/adjusts unit tests to cover iOS decline/success and fallback behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5639099. 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**
<!--
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]
> **Low Risk**
> Test-only changes that adjust mock endpoints and fixtures; risk is
limited to potential E2E flakiness if URL patterns or response shapes
don’t match what the app requests.
>
> **Overview**
> Expands E2E API mocking for on-ramp (ramps) flows to cover additional
*Unified Buy* endpoints and reduce reliance on live network calls.
>
> Default mocks now include UAT `v2` endpoints for `topTokens`,
`providers`, and `payments`, and region-aware setup adds corresponding
handlers (plus legacy `tokens` fallback) and updates geolocation mocking
to explicitly include prod/dev/uat URLs. Mock response fixtures are
extended with Base network support and realistic UAT-shaped payloads for
tokens, providers, and payment methods, while some prod allowlist/mocks
for on-ramp hosts are removed.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
bbb0c94. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…26053) ## **Description** Defense-in-depth fix to prevent a single bad LaunchDarkly pattern from crashing the perps provider or flooding Sentry with `CLIENT_NOT_INITIALIZED` errors. - Validate and filter invalid market patterns at both ingestion points (`FeatureFlagConfigurationService.filterValidPatterns`, `HyperLiquidProvider.compilePatternsSafely`) — invalid patterns are dropped and reported to Sentry - Fix `stripQuotes` to handle nested quote layers (e.g. `'"xyz:TSLA"'` from LaunchDarkly) ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: Sentry `CLIENT_NOT_INITIALIZED` flood caused by malformed LaunchDarkly patterns ## **Manual testing steps** ```gherkin Feature: Invalid market pattern resilience Scenario: Provider initializes with bad patterns Given a HyperLiquidProvider with an invalid pattern in the allowlist When the provider is constructed Then it does not throw and valid patterns are compiled And the invalid pattern is logged to Sentry Scenario: Feature flag service filters bad remote config Given LaunchDarkly returns a market list containing an invalid pattern When FeatureFlagConfigurationService validates the list Then the invalid pattern is dropped And the valid patterns are applied And the invalid pattern is logged to Sentry ``` ## **Screenshots/Recordings** N/A — no UI changes ## **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] > **Low Risk** > Scoped defensive validation/logging changes around feature-flag parsing and pattern compilation; behavior changes mainly drop invalid patterns and avoid constructor throws. > > **Overview** > Hardens HIP-3 market allow/blocklist handling so malformed LaunchDarkly values no longer crash perps setup: `FeatureFlagConfigurationService` now validates patterns via `validateMarketPattern`, **drops invalid entries**, and logs them via `logger.error`, falling back to the existing config when filtering produces an empty list. > > `HyperLiquidProvider` now compiles market filters with a new `compilePatternsSafely` helper that skips patterns that fail `compileMarketPattern` and logs the error instead of throwing during construction. `stripQuotes` was updated to remove *multiple nested quote layers*, and new/expanded tests cover nested quote parsing plus invalid-pattern filtering/logging and provider resilience. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 572077d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.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 bumps the `@ledgerhq/react-native-hw-transport-ble` package. <!-- 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/MUL-1284?atlOrigin=eyJpIjoiNjQwNjg1YWNiNmIxNGNhZjlkZDAyOGY2OGNkYTM3MWMiLCJwIjoiaiJ9 and this issue #24898 ## **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** N/a <!-- [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] > **Medium Risk** > Dependency-only bump, but it touches Ledger hardware-wallet BLE transport and keyring integration, so regressions could impact device connectivity or signing flows. > > **Overview** > Bumps Ledger Bluetooth transport support by updating `@ledgerhq/react-native-hw-transport-ble` from `^6.34.1` to `^6.37.0`, pulling in newer `@ledgerhq/*` dependencies (`devices`, `hw-transport`, `errors`, `logs`) and lockfile resolution updates. > > Also updates `@metamask/eth-ledger-bridge-keyring` from `11.2.0` to `11.3.0`, which adds a dependency on `@metamask/hw-wallet-sdk` and bumps related keyring packages (`@metamask/keyring-api`, `@metamask/keyring-utils`). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 537e87d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…RScannerModal (#25936) This PR fix #20442 This PR has improved camera permission handling in AnimatedQRScannerModal - Updated the camera permission request logic to ensure `onScanError` is only called after the permission request resolves with denial. - Added tests to verify that `onScanError` is not called when permission is granted or already available. - Enhanced cleanup logic in the effect to prevent state updates on unmounted components. This change improves the reliability of camera permission handling and enhances the user experience by preventing unnecessary error calls. <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **Description** <!-- Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions: 1. What is the reason for the change? 2. What is the improvement/solution? --> ## **Changelog** <!-- If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either: 1. Write `CHANGELOG entry: null` 2. Label with `no-changelog` If this PR is End-User-Facing, please write a short User-Facing description in the past tense like: `CHANGELOG entry: Added a new tab for users to see their NFTs` `CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker` (This helps the Release Engineer do their job more quickly and accurately) --> CHANGELOG entry: Improved camera permission handling in AnimatedQRScannerModal ## **Related issues** Fixes: #20442 ## **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] > **Low Risk** > Small, localized change to permission-request side effects plus test updates; low risk aside from potential behavior change in when/if permission errors are surfaced. > > **Overview** > Fixes camera permission error handling in `AnimatedQRScannerModal` so `onScanError` is triggered **only after** `requestPermission()` resolves with a denial, and adds effect cleanup to avoid firing after unmount. > > Updates unit tests to assert `requestPermission` is called only when the modal is visible, and to cover the granted/already-granted paths where `onScanError` must not fire. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6dcc997. 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** Improve handling of scenario when gas estimation fails. ## **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: MetaMask/MetaMask-planning#6389 ## **Manual testing steps** 1. Mock gas estimations to fail and submit a transaction 2. Check that Unavailable is displayed for gas 3. Update to custom value and see that alert and unavailable goes away ## **Screenshots/Recordings** https://github.com/user-attachments/assets/3b372807-18f6-45e6-8bd1-111442d00249 ## **Pre-merge author checklist** - [X] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/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-extension/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] > **Low Risk** > UI/UX and hook refactor around gas-estimation failure handling; limited scope with added test coverage, but touches core confirmation fee display logic. > > **Overview** > Improves confirmation UX when gas estimation fails by introducing a shared `useEstimationFailed` hook (based on `simulationFails`, but ignored for `UserFeeLevel.CUSTOM`) and wiring it into the confirmations flow. > > When estimation is failed, the gas fee token selector is disabled (no arrow, modal won’t open) and the gas fee display shows *"Unavailable"* (new `transactions.unavailable` i18n string), while still showing *Paid by MetaMask* for sponsored fees. Tests were updated/added to cover these behaviors and the updated alert suppression for custom fee level. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit a6ad6aa. 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** Implement new swaps keypad UI. <!-- 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: revamp swaps keypad ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/SWAPS-3970, https://consensyssoftware.atlassian.net/browse/SWAPS-3972, https://consensyssoftware.atlassian.net/browse/SWAPS-3973 ## **Manual testing steps** ```gherkin Ensure the acceptance criteria tests pass. ``` ## **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] > **Medium Risk** > Changes user input/confirmation UI flow for swaps/bridge amounts and updates many tests, which can impact core transaction initiation behavior if edge cases (focus/close/refresh states) are missed. > > **Overview** > Updates `BridgeView` to use the new `SwapsKeypad` bottom-sheet experience: keypad is opened/closed via refs, closes on outside tap, and can show either `GaslessQuickPickOptions` (when amount is empty/0) or a confirm CTA inside the keypad. > > Adjusts layout/styling to accommodate the bottom sheet (e.g., quote area alignment and new `keypadBottomSheet` styles) and adds a new test id `CONFIRM_BUTTON_KEYPAD`. > > Refactors and trims BridgeView tests to match the new UI behavior (keypad rendered outside the scroll view, confirm button may appear in multiple places, mock reset to avoid leakage), and removes several now-obsolete validation/continue-button test cases. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit a9afae9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Davide Brocchetto <davide.brocchetto@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**
Updates the claim bonus subtitle copy to be more concise and
natural-sounding.
**Before:** "Bonus payout will be on {{networkName}} Network."
**After:** "Bonus will be paid out on {{networkName}}."
## **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: Updated mUSD claim bonus subtitle copy
## **Related issues**
Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-312
## **Manual testing steps**
```gherkin
Feature: mUSD Claim Bonus Subtitle
Scenario: user views claim bonus confirmation screen
Given user has mUSD tokens with claimable yield rewards
And user is on the mUSD token details screen
When user taps the "Claim" button to claim bonus
Then the confirmation screen displays "Claim bonus" as the title
And the subtitle shows "Bonus will be paid out on Linea."
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- [screenshots/recordings] -->
### **After**
<img width="388" height="565" alt="Screenshot 2026-02-12 at 16 55 22"
src="https://github.com/user-attachments/assets/d4508e6d-7114-4859-a3e0-3d369fe9a8ef"
/>
<!-- [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]
> **Low Risk**
> String-only localization copy change plus a matching test update; no
logic, security, or data-handling behavior is modified.
>
> **Overview**
> Updates the `mUSD` claim bonus confirmation subtitle to a shorter,
more natural sentence by changing `earn.claim_bonus_subtitle` from
“Bonus payout will be on {{networkName}} Network.” to “Bonus will be
paid out on {{networkName}}.”
>
> Adjusts the `Title` component test to assert the new subtitle text for
the Linea Mainnet case.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
428bdaf. 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 : )