Skip to content

[pull] main from MetaMask:main#515

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

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

Conversation

@pull
Copy link
Copy Markdown

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

abretonc7s and others added 13 commits February 11, 2026 11:48
## **Description**

Per **ADR-042** ("PerpsController Package Location"), the team is
adopting a mobile-first strategy for perps: mobile remains the single
source of truth, and the controller will be published as
`@metamask/perps-controller` on npm so the Extension can achieve feature
parity.

The controller code originally lived under
`app/components/UI/Perps/controllers/` — that co-location with UI was
the right design when perps was a mobile-only feature. Now that
cross-platform publication is the goal, ADR-042 requires a prerequisite
step: **simulate package boundaries inside the mobile repo before actual
extraction**. This PR implements that "Mobile Isolation" section of
ADR-042. **No functional changes** — this is a pure reorganization.

Three outcomes:

1. **Controller code lives at `app/controllers/perps/`** — physically
separated from the UI layer and consistent with where other controllers
sit in the mobile codebase. Services that were always part of the
controller layer (connection management, trading readiness, all
HyperLiquid services) now live there too, with a `ServiceContext`
abstraction for runtime injection of mobile-specific infrastructure.

2. **All imports use the `@metamask/perps-controller` alias** —
configured in `tsconfig.json`, `babel.config.js`, `metro.config.js`, and
`jest.config.js`. This simulates the npm package boundary so that every
import site is ready for extraction with zero diff.

3. **ESLint `no-restricted-imports` rule enforces the boundary going
forward** — direct imports from `app/controllers/perps/` are disallowed;
all consumers must go through the alias, exactly as they would with a
real npm package.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes: N/A — internal refactor for perps-controller portability

## **Manual testing steps**

```gherkin
Feature: Perps trading functionality unchanged after refactor

  Scenario: User opens perps market view
    Given the user has perps feature enabled
    When user navigates to the perps trading screen
    Then the market list loads correctly with live prices

  Scenario: User places a perps order
    Given the user is on a perps market detail page
    When user enters order parameters and submits
    Then the order executes successfully via HyperLiquid

  Scenario: User views open positions and orders
    Given the user has existing perps positions
    When user navigates to positions/orders tab
    Then all positions and open orders display correctly
```

## **Screenshots/Recordings**

N/A — pure refactor, 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]
> **Medium Risk**
> Broad refactor across many Perps modules changing import sources and
moving constants, which risks subtle runtime/test breakages if any
symbol wiring diverges. No business-logic changes are intended, but the
new platform dependency surface (feature flags/formatters) needs
verification.
> 
> **Overview**
> **Perps controller/package boundary is enforced.** Adds an ESLint
`no-restricted-imports` rule to block direct imports from
`app/controllers/perps/**` and updates depcheck config to ignore the new
`@metamask/perps-controller` TS path alias.
> 
> **UI code is migrated to the alias.** Most Perps screens, components,
hooks, and tests switch their imports (types, constants, helpers like
`getPerpsDisplaySymbol`, analytics event names, chart enums, trading
calculations) from local `controllers/*`, `constants/*`, and `utils/*`
to `@metamask/perps-controller`, and removes a now-redundant
`controllers/utils.ts` helper.
> 
> **Mobile-only constants and adapters are carved out.**
`constants/chartConfig.ts` and `constants/perpsConfig.ts` are slimmed to
UI-specific exports while portable enums/pure logic move to the
controller package; new `constants/perpsUIConfig.ts` holds UI-only
fee/timing/spread values. The mobile platform bridge
(`mobileInfrastructure.ts`) is extended to provide controller
dependencies for version-gated feature flags and market-data formatting
utilities.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8350386. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
… taking 30s (#25939)

<!--
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 updates the toast behavior for
**TransactionType.perpsDepositAndOrder** (deposit + order flow):

1. **Pending deposit toast ("Depositing your funds")**  
The toast is no longer sticky: it now auto-dismisses after the default
visibility duration (~2–3 seconds) instead of staying until the deposit
completes or fails. Implemented by setting `hasNoTimeout: false` in
`usePerpsOrderDepositTracking` when showing the progress toast.

2. **"Deposit taking longer than usual" toast**  
The delay before this toast is shown is increased from 15 seconds to 30
seconds (`DepositTakingLongerToastDelayMs` in `perpsConfig.ts`).



## **Changelog**

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

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

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

CHANGELOG entry: Fixed Perps deposit+order flow so the pending deposit
toast auto-dismisses after a few seconds and the "deposit taking longer"
message appears after 30 seconds.

## **Related issues**

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

## **Manual testing steps**

```gherkin
Feature: Perps deposit and order toast behavior

  Scenario: user confirms a deposit-and-order transaction
    Given user is on Perps order view with insufficient balance (deposit + order required)

    When user submits the order and confirms the deposit transaction in the confirmation sheet
    Then the "Depositing your funds" toast appears and auto-dismisses after ~2–3 seconds (not sticky)
    And if the deposit is still pending after 30 seconds, the "Deposit taking longer than usual" toast is shown (previously 15 seconds)
```

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

No visible change

## **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**
> UI-only toast timing/behavior changes with no impact on transaction
execution, auth, or data handling.
> 
> **Overview**
> Updates the Perps deposit+order flow toast behavior so the initial
**"Depositing your funds"** progress toast is no longer sticky (it now
uses the default timeout instead of `hasNoTimeout: true`).
> 
> Delays the **"Deposit taking longer than usual"** toast from 15s to
30s via `PERPS_CONSTANTS.DepositTakingLongerToastDelayMs`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
41fd05a. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
#25951)

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

## **Description**
This PR adds startPositionX and startPositionY to ScrollOptions in order
to allow for offset scrolling actions.
It also fixes a snap test where the scrollable container was not
allowing scrolls on Android due to its viewport.

<!--
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]
> **Medium Risk**
> Touches shared test framework scrolling behavior on Android, which can
impact many Detox tests if the new parameters or default `NaN` handling
behave differently across devices; changes are limited to test code.
> 
> **Overview**
> Adds `startPositionX`/`startPositionY` to `ScrollOptions` and threads
them into Android’s `Gestures.scrollToElement()` call so Detox scrolls
can start from an explicit screen offset.
> 
> Updates affected page objects/tests to pass start positions for Snap
UI date-time picker scrolling and horizontal quick-action scrolling, and
adjusts the predict claim smoke test to scroll to the lost position
first (then winning) before asserting claim-button visibility.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f977d57. 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**

1. **What is the reason for the change?**
- The Perps order view had 32px top padding on the scroll content that
created unnecessary empty space.
- The fees row showed a loading state whenever
`feeResults.isLoadingMetamaskFee` was true, which could keep the row in
a loading state even when the main fee data was ready, causing a
flickery or stuck loading experience.

2. **What is the improvement/solution?**
- Set `scrollViewContent.paddingTop` from `32` to `0` in
`PerpsOrderView.styles.ts` so the scroll content aligns with the rest of
the layout.
- Simplified `isFeesLoading` in `PerpsOrderView.tsx` to only depend on
pay-totals loading when a custom token is selected
(`hasCustomTokenSelected && isPayTotalsLoading`). The fees row no longer
shows loading solely because the MetaMask fee is loading, reducing
unnecessary loading states.


## **Changelog**

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

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

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

CHANGELOG entry: null

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/TAT-2522
Fixes: https://consensyssoftware.atlassian.net/browse/TAT-2515

## **Manual testing steps**

```gherkin
Feature: my feature name

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

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

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

<img width="1206" height="2622"
alt="simulator_screenshot_EEA6722D-603A-4185-9DFD-1CF08262D61B"
src="https://github.com/user-attachments/assets/b7640e3f-2ed9-477e-92bc-f6f10953c056"
/>


## **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 UI/layout tweak and a narrow change to when the order button is
disabled; low blast radius but could affect edge-case timing when paying
with a custom token.
> 
> **Overview**
> Removes the extra 32px top padding from `PerpsOrderView` scroll
content so the order form no longer starts with empty space.
> 
> Separates fee *display* loading from order *blocking*: the fees row
can still show a loading skeleton, but the Place Order button is now
only disabled while custom-token pay totals are loading (not while
`feeResults.isLoadingMetamaskFee` is true).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
56e7cfa. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.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**
Changed Slack message to displayed a descriptive message where the build
type can be easily spotted
<!--
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]
> **Medium Risk**
> Touches CI reporting/notification outputs and slightly changes the
`summary.json` schema and Slack message formatting, which could impact
any downstream consumers expecting the previous structure or text
layout.
> 
> **Overview**
> Performance E2E aggregation now propagates the workflow
`build_variant` (rc/exp) into generated artifacts by adding
`buildVariant`/`buildType` fields to `summary.json` (including
empty/fallback summaries) and showing the build type in the HTML report
header.
> 
> The `run-performance-e2e` workflow passes `BUILD_VARIANT` to the
aggregator, and the Slack summary message is reformatted to include a
build-type label, a one-line run overview (devices/tests/failures),
clearer device/test sections, and failed-test output grouped by platform
(iOS then Android).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
065e3cc. 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**
Update the token display layout to match competitor's setup so the row
answers, in one glance:
- What is it? (symbol/name)
- What’s it doing? (price + 24h)
- What do I have? (fiat value + quantity)

Left block (identity + market quote)
- Line 1: SYMBOL / Name (and small network pill if relevant)
- Line 2: Unit price + 24h change (this is Trust’s win)

Right block (user holding)
- Line 1: Fiat value (bold, largest)
- Line 2: Token quantity + token symbol (smaller, muted)


<!--
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: created new token list item v2

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-2615 &
https://consensyssoftware.atlassian.net/browse/ASSETS-2621

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


https://github.com/user-attachments/assets/41cfff75-0a3b-4718-8410-153d359866db


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

### **After**


https://github.com/user-attachments/assets/966863aa-4162-4fa8-a479-1a6c126a83b9


<!-- [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]
> **Medium Risk**
> UI changes affect the primary token list rendering and add new
conditional CTA/analytics behavior gated by a remote flag; risk is
moderate due to breadth of interactions (Earn CTAs, navigation, market
data) despite being feature-flagged.
> 
> **Overview**
> Adds a new **Token List Item V2** layout behind a LaunchDarkly A/B
test (`tokenListItemV2Abtest`), and switches `TokenList` to render
either V1 or V2 items based on the flag.
> 
> `TokenListItemV2` introduces a new row presentation (logo + network
badge, name/labels, unit price + secondary action, fiat + token balance)
and integrates existing Earn-related states (Merkl claim bonus, mUSD
conversion CTA, stablecoin lending Earn CTA threshold, stake CTA), stock
token badge support, and updated navigation source tagging.
> 
> Centralizes *very-small-number* subscript formatting into a shared
`formatSubscriptNotation` utility, reusing it in Predict price
formatting and optionally in `addCurrencySymbol` (new
`useSubscriptNotation` param), with accompanying unit tests. Token
details open analytics now includes `ab_tests.token_list_layout` when
launched from the token list.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d1c32ec. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: sahar-fehri <sahar.fehri@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**

1. **What is the reason for the change?**  
The Perps home overflow menu previously hid the "Learn more" item when
the user had an empty balance to avoid duplicating the "Learn more" CTA
already shown on the empty-state card. Users with an empty state could
only use that card and had no "Learn more" in the menu.

2. **What is the improvement/solution?**  
Always show "Learn more" in the Perps home menu, independent of balance.
Users can access the tutorial from the menu in all states, and the
empty-state card can still offer the same link without conflicting with
the menu.


## **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: Always display learn more about perps link

## **Related issues**

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

## **Manual testing steps**

```gherkin
Feature: Perps

  Scenario: user has no activity in perps
    Given user visits the perps home screen

    Then user should see the link to learn more about Perps
```

## **Screenshots/Recordings**

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

### **Before**

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

### **After**

<!-- [screenshots/recordings] -->
<img width="1206" height="2622"
alt="simulator_screenshot_D734BD34-3FE8-4B2A-B9E0-6E1AEF9E30A9"
src="https://github.com/user-attachments/assets/ad4dbf11-1224-4366-be9d-33a3f2ebcbd4"
/>

## **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 UI/menu logic change with no auth, funds movement, or data
handling impact; main risk is minor UX duplication in the empty state.
> 
> **Overview**
> The Perps home navigation/overflow menu now **always** includes the
`Learn more` item, instead of hiding it when the balance is empty to
avoid duplicating the empty-state CTA.
> 
> This removes the `isBalanceEmpty` gating and dependency from the
`navigationItems` memo, so `Learn more` consistently routes to the
tutorial from the menu in all states.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
149606f. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Cursor <cursoragent@cursor.com>
…fication deeplink handler (#25964)

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

The `handleCardKycNotification` deeplink handler had its own inline
feature flag verification logic using `selectCardExperimentalSwitch`,
which diverged from the canonical check used across the rest of the Card
feature. The shared `isBaanxLoginEnabled` utility (used by the
`useIsBaanxLoginEnabled` hook) defines the single source of truth for
whether the Baanx/Card feature is enabled, based on
`alwaysShowCardButton`, `cardGeoLocation`, `cardSupportedCountries`, and
`displayCardButtonFeatureFlag`.

This PR replaces the inline logic with a call to `isBaanxLoginEnabled`,
ensuring the deeplink handler uses the same enablement criteria as the
rest of the app. Tests have been updated accordingly.

## **Changelog**

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

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

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

CHANGELOG entry: Fixed card KYC notification deeplink using incorrect
feature flag check

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Card KYC notification deeplink

  Scenario: user taps a card KYC push notification when the card feature is enabled
    Given the user has the card feature enabled (via alwaysShowCardButton or supported country + feature flag)
    And the user has a pending or completed KYC verification

    When user taps on the card KYC push notification deeplink
    Then the user is navigated to the correct screen based on their verification state (KYCFailed, Complete, KYCPending, or CardHome)

  Scenario: user taps a card KYC push notification when the card feature is disabled
    Given the user does not have the card feature enabled

    When user taps on the card KYC push notification deeplink
    Then nothing happens and the handler exits early
```

## **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]
> **Low Risk**
> Small, localized change to deeplink feature-gating logic with
corresponding test updates; primary risk is inadvertently changing when
the handler early-exits vs navigates.
> 
> **Overview**
> `handleCardKycNotification` now uses the shared `isBaanxLoginEnabled`
check (driven by `alwaysShowCardButton` and supported-country +
`displayCardButtonFeatureFlag`) instead of its own inline logic based on
`selectCardExperimentalSwitch`.
> 
> Tests were updated to mock `selectAlwaysShowCardButton` and validate
navigation behavior under the new enablement criteria.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
cbf4b20. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ments (#25942)

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

Update transaction controller for transaction polling and incoming
transaction improvements.

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

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

## **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**
> Upgrades `@metamask/transaction-controller`, which may change
transaction polling/incoming-transaction behavior across the app. Also
broadens event wiring for the transaction controller messenger,
potentially affecting when transactions refresh and how UI/state reacts
to account/network/connectivity changes.
> 
> **Overview**
> Updates `@metamask/transaction-controller` from `62.15.0` to `62.16.0`
(lockfile updated accordingly) to pick up transaction polling and
incoming-transaction improvements.
> 
> Extends `transaction-controller-messenger` delegation to listen for
additional engine events (`AccountActivityService` updates/status
changes, selected account changes, and backend websocket connection
state changes) instead of only `NetworkController:stateChange`, enabling
the transaction controller to react to more real-time state changes.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a2e126a. 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?
-->

Adds chiliz CHZ network logos to metamask mobile

## **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: Adds chiliz.png as network logo and enables it in
metamask mobile

## **Related issues**

Fixes: N/A

## **Manual testing steps**

```gherkin
Feature: my feature name

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

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

Feature: Chiliz network logo
  Scenario: user wants to add chiliz network
    Given network is not added
    When user fills in the information
    Then network logo should appear and apply for netowrk tokens

## **Screenshots/Recordings**

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

### **Before**

<img width="388" height="894" alt="image"
src="https://github.com/user-attachments/assets/decdb11a-db5b-42c8-8fbb-a0cbe38ac2b8"
/>

<img width="388" height="898" alt="image"
src="https://github.com/user-attachments/assets/40a5b729-2ca1-4e53-9221-28c13f19c1bb"
/>


### **After**

<img width="395" height="865" alt="image"
src="https://github.com/user-attachments/assets/94e4859a-f2b7-461a-b528-1be3c7be96ad"
/>

<img width="391" height="862" alt="image"
src="https://github.com/user-attachments/assets/20c8b74f-0fce-46b4-b3da-463e812d0d17"
/>


## **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**
> Asset and mapping-only changes (new icon + chain-id/image mappings)
with no changes to transaction/auth/data flow; main risk is an incorrect
chain id or missing asset causing the logo to not render.
> 
> **Overview**
> Adds support for displaying the **Chiliz (CHZ) logo** by importing
`chiliz.png` and exposing it via the `image-icons.js` symbol map
(`CHZ`).
> 
> Extends custom network configuration to recognize the `CHILIZ` chain
id (`0x15b38`) and maps it to the same `chiliz.png` asset in
`CustomNetworkImgMapping`, enabling the logo to appear for Chiliz custom
networks/tokens.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
753d2ce. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ct to any existing flow) (#25766)

<!--
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**
signing certificates configuration;
main-dev working; script to generate build secrets into the build yml,
could be optimised hopefully;
 action to configure signing certificates;
 set secrets from config script; 
 apply build config excepts secrets script
<!--
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**

- [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**
> Updates CI build and signing flows, including fetching and injecting
signing materials/secrets at runtime, so misconfiguration could break
releases or leak/omit required env vars despite the changes being mostly
workflow/scripts.
> 
> **Overview**
> **Build configuration is moved and expanded.** `.github/builds.yml` is
removed and replaced by a root-level `builds.yml`, now including an
explicit `signing` section (AWS role/secret + Android keystore path) and
a new `main-beta` build variant, plus updated GitHub Environment
mappings for UAT/flask builds.
> 
> **GitHub Actions build pipeline now supports AWS-based code signing
and more reliable env propagation.** The `build.yml` workflow reads
config from root `builds.yml`, persists applied config into
`GITHUB_ENV`, replaces the previous keystore action with a new composite
action (`.github/actions/configure-signing`) that assumes an AWS role
and pulls signing material from AWS Secrets Manager (Android keystore +
iOS cert/profile/keychain), and adds retries/timeouts plus Android CI
Gradle properties and an updated iOS simulator artifact path.
> 
> **Secret/config tooling is refactored to match the new workflow
requirements.** `apply-build-config.js`, `validate-build-config.js`, and
`verify-build-config.js` are updated to use root `builds.yml`,
`apply-build-config.js` adds `--export-github-env`,
`set-secrets-from-config.js` now writes mapped secrets into `GITHUB_ENV`
(with multiline support), and a new maintenance script
`generate-build-workflow-secrets-env.js` (wired via `yarn
build:workflow:update-secrets`) regenerates the workflow’s explicit
secret env list. Docs/CODEOWNERS are updated accordingly.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
77a734b. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: sethkfman <10342624+sethkfman@users.noreply.github.com>
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
This PR fixes the height clipping of the swaps input with vertical
paddings for Android
<!--
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: #25950

## **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**
<img width="798" height="1908" alt="image"
src="https://github.com/user-attachments/assets/df984b60-3d76-4856-80d2-62f3ed516403"
/>

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

### **After**

![IMG_0028](https://github.com/user-attachments/assets/7ae8ad3d-9251-4518-a0f1-63b100f9aad6)

<!-- [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**
> Small, UI-only styling change limited to the Bridge token amount
input; risk is mainly minor layout regressions across platforms/font
sizes.
> 
> **Overview**
> Restores vertical spacing in the Bridge amount input by adding
platform-specific `paddingVertical` in `TokenInputArea` (iOS: `2`,
Android: `1`) to avoid height/text clipping.
> 
> Updates `BridgeView` Jest snapshots to reflect the new input style
(`paddingVertical`).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
02a76f3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ing (#24272)

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

Improves MM Connect connection deeplink reliability by adding an
addition UUID format check for the id in the payload

## **Changelog**

CHANGELOG entry: null

MetaMask Connect has not been released to public yet.

## **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**
> Small input-validation tightening in deeplink handling with unit test
coverage; main risk is rejecting previously-accepted non-UUID IDs if any
callers relied on them.
> 
> **Overview**
> Connection deeplink parsing now rejects payloads where
`sessionRequest.id` is not a valid UUID by extending
`isConnectionRequest` to check `id` with `isUUID`.
> 
> Tests were updated to use UUID-shaped IDs and a new
`handleConnectDeeplink` case asserts that a non-UUID `id` triggers
`showConnectionError` and prevents connection creation, persistence, or
UI sync.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b0cd29a. 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 11, 2026
@pull pull Bot added the ⤵️ pull label Feb 11, 2026
@pull pull Bot merged commit fb1d501 into Reality2byte:main Feb 11, 2026
1 of 11 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.