Skip to content

[pull] main from MetaMask:main#519

Merged
pull[bot] merged 13 commits into
Reality2byte:mainfrom
MetaMask:main
Feb 13, 2026
Merged

[pull] main from MetaMask:main#519
pull[bot] merged 13 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Feb 13, 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 : )

brianacnguyen and others added 13 commits February 12, 2026 23:46
## **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

![IMG_0029](https://github.com/user-attachments/assets/a78a2150-e4e5-431c-9430-1c2fd1f48ba6)


## **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 -->
@pull pull Bot locked and limited conversation to collaborators Feb 13, 2026
@pull pull Bot added the ⤵️ pull label Feb 13, 2026
@pull pull Bot merged commit 68a3041 into Reality2byte:main Feb 13, 2026
3 of 37 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.