Skip to content

[pull] main from MetaMask:main#518

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

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

Conversation

@pull
Copy link
Copy Markdown

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

gantunesr and others added 13 commits February 12, 2026 17:37
<!--
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 removes the usage of the selector
`selectMultichainAccountsState2Enabled` which gets the value for the
BIP-44 feature flag. Moving forward, BIP-44 is the default behaviour and
any alternative logic branch will be remove alongside tests.

The scope of the changes is limited to files inside the
`app/components/UI` and `app/components/Views` directory.

- Blocked by #24886

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

## **Manual testing steps**

Not applicable

## **Screenshots/Recordings**

Not applicable

## **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 core navigation and account selection/receive flows by
removing fallback branches, so regressions could surface if any callers
still rely on legacy (non-group) behavior or missing
`selectedAccountGroup` handling.
> 
> **Overview**
> **BIP-44 multichain behavior is now treated as the default** by
removing `selectMultichainAccountsState2Enabled`-gated branches and
legacy account-view code paths.
> 
> `AccountSelector` drops the EVM-only/legacy list and always renders
`MultichainAccountSelectorList`, always uses “Add wallet” actions, and
simplifies selection to `setSelectedAccountGroup`; its tests are
rewritten accordingly and the old snapshot is removed. Related
screens/tests are updated to remove legacy navigation paths (e.g.,
`BaseAccountDetails` now always routes to account-group edit-name), SRP
import tracking always happens via the discovery callback, and the
Wallet “Receive” flow always navigates to the multichain address list
when a selected group is present. Confirmation account/network row UI is
simplified by removing legacy network badge/name rendering and showing
wallet name when multiple wallets exist, with test expectations updated.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3f0e0c7. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

These resolutions were either holding back new versions, or had no
impact at all.

Some resolutions were preserved but scoped to a single parent package,
in cases where they only applied to one parent.

## **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]
> **Medium Risk**
> Dependency resolution changes can subtly alter transitive package
versions and behavior, potentially impacting builds/tests even though no
app runtime code is modified.
> 
> **Overview**
> Reduces and refines Yarn `resolutions` in `package.json` by **removing
several global overrides** and **scoping a few remaining ones to
specific parent packages** (e.g., `ganache/secp256k1`, `eas-cli/nanoid`,
`@appium/schema/json-schema`).
> 
> Regenerates `yarn.lock` to reflect the new resolution strategy, which
results in **updated transitive versions** for a handful of packages
(notably `@metamask/rpc-errors` to `7.0.3` and
`@playwright/test`/`playwright` to `1.58.2`) and adds additional lock
entries where multiple version ranges are now allowed.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9a8202b. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

This PR adds a multi-functional provider selection modal by querying
quotes and mapping them to the available providers. Users can now change
their preferred provider by interacting with the payment method
selection modal.


<!--
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: Adds a page for changing preferred ramp provider

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/TRAM-3052

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

Loom video demo of the feature:
https://www.loom.com/share/0fcb15a5c937437c95eb24e4dc8cccf3

<!-- [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**
> Touches ramp quote-fetching and selection flows across multiple
screens/modals; mistakes could lead to incorrect quote context or
polling behavior, though changes are UI-scoped and covered by updated
tests.
> 
> **Overview**
> The ramp payment selection bottom sheet now **fetches/display quotes**
and uses them to drive a new provider-selection experience: it calls
`getQuotes` based on the current amount/wallet/token, shows
per-payment-method quote output amounts, and lets users switch providers
by selecting a provider’s quote (which also sets the selected quote).
> 
> The modal UI adds **loading/empty/error states** (skeleton list +
alert banners), disables “Change provider” when payment methods are
loading/errored, and introduces reusable `QuoteDisplay` for rendering
quote values, skeletons, or a warning icon (replacing the old
`PaymentMethodQuote`).
> 
> `BuildQuote` now passes the current amount into the payment selection
modal, stops quote polling before navigating, and uses `useFocusEffect`
to prevent polling when the screen is unfocused; tests/snapshots were
updated accordingly (including new route param callback support on
payment-method select).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
413e1b6. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
This PR brings back the Analytics checks on the swap spec file that was
previously removed and enables back the dapp initiated transfer test.

<!--
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: https://consensyssoftware.atlassian.net/browse/MMQA-1157

## **Manual testing steps**
N/A

## **Screenshots/Recordings**

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

### **Before**
N/A

### **After**
N/A
<!-- [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**
> Test-only changes that tighten/restore analytics assertions; main risk
is increased smoke test flakiness due to stricter event/property
expectations and reliance on mocked requests.
> 
> **Overview**
> Re-enables the `DApp Initiated Transfer` smoke spec (previously
skipped) and updates its request mocks/fixtures to use
`DEFAULT_ANVIL_PORT`, allow specific ignored request fields, and
validate only the key transaction-related analytics events.
> 
> Restores analytics validation in the swap action smoke test by opting
into MetaMetrics, capturing analytics payloads from the first swap run,
and adding a dedicated assertion test that checks expected SwapBridge
event presence, counts, and property shapes. Also factors repeated
transaction analytics property/type expectations into a shared
`commonTransactionPropertiesAndTypes` helper.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f984c18. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- CURSOR_SUMMARY -->
> [!NOTE]
> **Low Risk**
> Translation-only changes; no runtime logic changes, with the main risk
being missing/inconsistent locale strings causing user-facing copy
issues.
> 
> **Overview**
> Refreshes German (`de.json`) and Greek (`el.json`) locale files with
**new and corrected translations** across multiple UI areas.
> 
> Adds new i18n keys for newer flows (e.g., gas sponsorship
reserve-balance warnings, first-time address interaction warning, wallet
creation error reporting, provider selection/payment method strings,
additional perps status/validation/tooltips, card
provisioning/onboarding consent/legal text, and new mUSD claim-related
labels), and replaces several leftover English strings with localized
equivalents while introducing some new English placeholders that may
still need translation.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b1cb594. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: metamaskbot <metamaskbot@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**

The purpose of this PR is to add intial e2e coverage for the unified buy
flow.

> Primarily test/mocking changes, but it alters fixture state shape and
expands network allowlisting, which can impact E2E reliability and
masking of unmocked calls if misconfigured.
> 
> **Overview**
> Adds initial E2E coverage for the new **Unified Buy (v2) onramp**
flow, including a new smoke test (`onramp-unified-buy.spec.ts`) and
updates to page objects to support unified-buy interactions (new
`unifiedBuyButton`, token search screen naming, and keypad/amount entry
behavior differences).
> 
> Extends test infrastructure to support unified routing: adds region
eligibility + `v2/quotes` mocks, introduces unified ramps remote
feature-flag mock helpers, expands the e2e allowlist for onramp hosts,
and updates fixtures/region types so tests set
`RampsController.userRegion` (with country/state ISO metadata) instead
of legacy `fiatOrders.selectedRegionAgg`.
> 
> Minor app-side testability tweaks: centralizes the Build Quote
continue button selector and adds `testID`s for amount display and
token-search input.

## **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**
> Mostly test/mocking changes, but it expands allowed network hosts and
changes fixture state shape (`RampsController.userRegion`), which could
mask unmocked calls or break other E2E setups if misconfigured.
> 
> **Overview**
> Adds an initial Detox smoke test for *Unified Buy (v2) onramp*
(`onramp-unified-buy.spec.ts`) and updates page objects to support
unified-buy interactions (new `unifiedBuyButton`, token-select screen
helper, and amount entry differences).
> 
> Extends E2E test infrastructure for unified routing by adding remote
feature-flag helpers (`rampsUnifiedBuyV1`/`rampsUnifiedBuyV2`), new
region-eligibility and `v2/quotes` API mocks, and expanding the
API-mocking allowlist to include additional UAT onramp hosts.
> 
> Updates fixture/state typing to set
`engine.backgroundState.RampsController.userRegion` (with country/state
ISO metadata) while keeping legacy `fiatOrders.selectedRegionAgg` for
backwards compatibility, and adds a couple of app-side `testID`/selector
centralizations to stabilize tests (amount display, token search input,
continue button).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
def9458. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## **Description**

The PredictController was designed with multi-provider support (using a
`Map<string, PredictProvider>`), but we only ever use Polymarket and
have no plans to support additional providers. This PR simplifies the
entire Predict feature to single-provider architecture.

### Changes:
- **Controller core**: Replace `providers: Map<string, PredictProvider>`
with a single `provider: PolymarketProvider` instance. Remove
initialization machinery (`initializeProviders`,
`performInitialization`, `isInitialized`).
- **State shape**: Flatten `eligibility`, `balances`, and
`pendingDeposits` by removing the provider-key nesting. `accountMeta` is
left unchanged for backwards compatibility (persisted data).
- **Type interfaces**: Remove `providerId` from all param types
(`GetMarketsParams`, `GetPositionsParams`, `PlaceOrderParams`,
`PreviewOrderParams`, `GetPriceHistoryParams`, `GetPriceParams`,
`GetBalanceParams`, etc.)
- **Hooks**: Remove `providerId` option from all ~20 hooks
- **Selectors**: Update `selectPredictBalanceByAddress` and
`selectPredictPendingDepositByAddress` to use flat state
- **Components/Views**: Remove `providerId` prop passing throughout UI
layer
- **Tests**: Update all test files for new state shapes and method
signatures

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: Predict market functionality

  Scenario: user interacts with prediction markets
    Given user has the Predict feature enabled

    When user browses markets, views positions, places orders, deposits, withdraws, or claims
    Then all functionality works identically to before the refactoring
```

## **Screenshots/Recordings**

N/A — no UI changes, purely internal refactoring.

### **Before**

Multi-provider architecture with `Map<string, PredictProvider>` and
`providerId` params throughout.

### **After**

Single `PolymarketProvider` instance, flat state shapes, no `providerId`
params needed.

## **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 signature/state refactor across Predict hooks and components
could cause subtle runtime breakage if any call sites or controller
methods still expect `providerId`. Risk is mitigated by updated unit
tests but warrants focused regression on deposit/claim/cashout flows and
price-history fetching.
> 
> **Overview**
> Refactors Predict toward a **single-provider (Polymarket) model** by
removing `providerId` parameters/props from UI calls into Predict hooks
(e.g., `usePredictActionGuard`, `usePredictClaim`, `useUnrealizedPnL`,
`usePredictPriceHistory`).
> 
> Updates affected components (e.g., balance/add-funds sheets, market
cards, picks, position details, game chart) to rely on navigation/market
IDs only, and adjusts tests accordingly (replacing hardcoded
`'polymarket'` strings with `POLYMARKET_PROVIDER_ID` and deleting
coverage for custom provider IDs).
> 
> Reworks `PredictController.getActivity` unit test to construct a real
messenger-backed controller and to mock `PolymarketProvider` directly,
validating default selected-address behavior and explicit-address
overrides without multi-provider merging/lookup scenarios.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b1f33c3. 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**

The purpose of this PR is to fix universal link handling for buy/sell
deeplinks by removing the unnecessary "Proceed with
caution" interstitial modal. The issue was that Buy, sell, and swap
deeplinks (e.g., `metamask://buy?chainId=1&amount=275`) were triggering
an interstitial modal requiring user confirmation. What I did here was
to add `BUY, BUY_CRYPTO, SELL, SELL_CRYPTO`, actions to
`WHITELISTED_ACTIONS` in `handleUniversalLink.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:

## **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, localized change to deep link gating logic; risk is limited to
potentially bypassing the interstitial for buy/sell links if the
whitelist is too permissive.
> 
> **Overview**
> Buy/sell universal links now skip the “Proceed with caution”
interstitial by adding `BUY`, `BUY_CRYPTO`, `SELL`, and `SELL_CRYPTO` to
`WHITELISTED_ACTIONS` in `handleUniversalLink.ts`.
> 
> This changes universal link handling so these ramp-related deeplinks
proceed directly while still being treated as supported actions for
downstream routing/analytics.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
9e1fc60. 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**

init the new assets controller under a feature flag

<!--
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: init the new assets controller under a feature flag

## **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**
> Introduces a new core Engine controller and messaging surface area,
which can affect persisted state shape and background state change
handling even though runtime behavior is gated behind a remote feature
flag.
> 
> **Overview**
> Initializes and registers the new `AssetsController` (from
`@metamask/assets-controller`) in the Engine, including adding it to
controller init lists, Engine context/state export, and background
`stateChange` event tracking.
> 
> Adds `assetsControllerInit` plus a dedicated messenger pair
(`AssetsController` + `AssetsControllerInit`) that wires required
actions/events and gates activation via the `assetsUnifyState` remote
feature flag (version-checked), while also providing an API platform
client (bearer token) and token-detection preference into the
controller.
> 
> Updates test fixtures/snapshots and API-mocking defaults to include
the new controller’s initial state and an additional
`v2/supportedNetworks` response; also cleans up a Login test to use
`DeepPartial` for mocked Redux state.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a998149. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## Version Bump After Release

This PR bumps the main branch version from 7.66.0 to 7.67.0 after
cutting the release branch.

### Why this is needed:
- **Nightly builds**: Each nightly build needs to be one minor version
ahead of the current release candidate
- **Version conflicts**: Prevents conflicts between nightlies and
release candidates
- **Platform alignment**: Maintains version alignment between MetaMask
mobile and extension
- **Update systems**: Ensures nightlies are accepted by app stores and
browser update systems

### What changed:
- Version bumped from `7.66.0` to `7.67.0`
- Platform: `mobile`
- Files updated by `set-semvar-version.sh` script

### Next steps:
This PR should be **manually reviewed and merged by the release
manager** to maintain proper version flow.

### Related:
- Release version: 7.66.0
- Release branch: release/7.66.0
- Platform: mobile
- Test mode: false

---
*This PR was automatically created by the
`create-platform-release-pr.sh` script.*

Co-authored-by: metamaskbot <metamaskbot@users.noreply.github.com>
## **Description**

These were not referenced anywhere, and had no lockfile impact.

## **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**
> Deletes unreferenced patch artifacts only; risk is limited to the
unlikely case a patch was implicitly relied on despite not being wired
into dependency resolution.
> 
> **Overview**
> Removes several unused Yarn patch files under `.yarn/patches`,
including patches previously targeting `@metamask/*` controllers and
`appwright`/Appium configuration tweaks.
> 
> No runtime or dependency behavior is intended to change, since these
patches were not referenced by `package.json` resolutions/lockfile.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3e4d52e. 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**

Uses the priceImpact or destTokenAmount to sort bridge quotes if fiat
cost is not available

<!--
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: fix: fall back to priceImpact or destTokenAmount for
swap quote sorting

## **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**
> Changes quote ordering logic and timing of exchange-rate fetching,
which can affect which quote is recommended and potentially alter
user-facing swap/bridge outcomes when data is missing.
> 
> **Overview**
> Improves `selectSortedBridgeQuotes` sorting behavior in the patched
`@metamask/bridge-controller` so the default sort no longer treats
missing fiat cost as `0`; it now sorts by fiat cost when available for
all quotes, otherwise falls back to `priceImpact`, and finally
`destTokenAmount`.
> 
> Moves `fetchAssetExchangeRates` from the quote-request update path to
the `fetchBridgeQuotes` path (fire-and-forget with logging), aligning
rate fetching with quote retrieval.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
b977cf1. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…ack local (#25990)

<!--
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**
- Added new scripts in `package.json` for running MM Connect tests on
BrowserStack, including local tunnel support.
- Updated `appwright.config.ts` to define specific test matches for MM
Connect scenarios.
- Enhanced the `BrowserStackDeviceProvider` to support local testing
capabilities.
- Updated README with instructions for running MM Connect tests locally
and on BrowserStack.

This improves the testing framework for MM Connect, allowing for better
integration with BrowserStack's local testing features.

<!--
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: https://consensyssoftware.atlassian.net/browse/MMQA-1419

## **Manual testing steps**

```gherkin
Feature: MM Connect – Multichain API connection to local Browser

  Scenario: Connect wallet to local test dapp and verify multichain connection
    Given the user is logged into MetaMask on a mobile device
    And a local Browser Playground dapp server is running on port 8090
    When the user launches the mobile browser (Chrome)
    And the browser opens with a single tab and any first-run modals are dismissed
    And the user navigates to the dapp URL (local emulator or BrowserStack Local tunnel)
    And the user taps "Connect" in the dapp
    And the user approves the connection in MetaMask
    And the test switches back to the browser without reloading the page
    Then the dapp shows the wallet as connected with multichain scope cards
    And at least the default scope "eip155:1" is visible
    And the user can disconnect from the dapp

  Scenario: Connect to local dapp from BrowserStack cloud device via Local tunnel
    Given the BrowserStack Local binary is running with the same access key as in .e2e.env
    And the local Browser Playground dapp server is running on port 8090 on the host machine
    When the tester runs the test with BROWSERSTACK_LOCAL=true (e.g. yarn run-appwright:mm-connect-android-bs-local)
    Then the BrowserStack session is created with Local testing "On" (local: true in capabilities)
    And the cloud device loads the dapp at "http://bs-local.com:8090" through the tunnel
    And the test completes the connect flow and verifies multichain connection on the same dapp tab
```

## **Screenshots/Recordings**

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

### **Before**

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

### **After**
Test run passes on
[browserstack](https://app-automate.browserstack.com/builds/5848fa614265dae9ee9ed2b2882ec1679f932355/sessions/805740cfcc0ba3ec8a3ce2b6cdb5ddab4018eaab?auth_token=3473bf0be3da94c4f637f168377b6ed98eadf6280c53bdeaa7b61c551cb5fe36)
<!-- [screenshots/recordings] -->

No impact on existing appwright performance tests
[workflows](https://github.com/MetaMask/metamask-mobile/actions/runs/21965341810).

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] 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 test infrastructure and the patched `appwright` runtime
(BrowserStack/Appium capabilities, locator selection), which can change
how CI sessions are created and how elements are resolved across many
tests, but does not affect production app code.
> 
> **Overview**
> Enables running MM Connect performance tests on BrowserStack with
optional **BrowserStack Local** tunneling, including new `package.json`
scripts and doc updates, and updates the multichain connect spec to use
`bs-local.com` when `BROWSERSTACK_LOCAL=true` and to switch back to the
existing browser tab after approvals.
> 
> Hardens Android browser automation by clearing/launching Chrome with
FRE disabled, dismissing common first-run modals with bounded timeouts,
and making navigation more resilient when the search box is missing.
> 
> Updates the patched `appwright@0.1.45` provider behavior for CI
stability/perf: single-worker/single-retry defaults, improved element
lookup when `textToMatch` is unset, added Appium chromedriver
auto-download support, expanded BrowserStack capabilities (local flag,
build name override, logging/profiling/self-heal, and Appium settings),
and allows skipping BrowserStack video downloads via
`DISABLE_VIDEO_DOWNLOAD` (set in the performance runner workflow).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
ce3dada. 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>
@pull pull Bot locked and limited conversation to collaborators Feb 12, 2026
@pull pull Bot added the ⤵️ pull label Feb 12, 2026
@pull pull Bot merged commit 8516a07 into Reality2byte:main Feb 12, 2026
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.

10 participants