Skip to content

chore(runway): cherry-pick fix: cp-7.81.0 always show native tokens and stablecoins in QuickBuy sell receive list (TSA-642)#31258

Merged
sleepytanya merged 1 commit into
release/7.81.0from
runway-cherry-pick-7.81.0-1780994678
Jun 10, 2026
Merged

chore(runway): cherry-pick fix: cp-7.81.0 always show native tokens and stablecoins in QuickBuy sell receive list (TSA-642)#31258
sleepytanya merged 1 commit into
release/7.81.0from
runway-cherry-pick-7.81.0-1780994678

Conversation

@runway-github

@runway-github runway-github Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Description

In QuickBuy Sell mode the user sells the fixed position token and
chooses which token to receive. The Receive picker
(useReceiveTokens) only listed stablecoins (mUSD/USDC/USDT), so native
tokens were never offered.

This PR extends the Receive candidate set to always include the native
token of every chain already covered by the stablecoin candidates, so
natives and stablecoins are always visible regardless of balance.
Natives are built via the existing Bridge helper
getNativeSourceToken(chainId) and enriched through the same
enrichTokenBalance path (the isNativeAddress branch already handles
native balance/pricing), so no controller changes were needed.
Candidates are ordered stablecoin-before-native within each chain group
and the position chain is sorted first, which keeps a stablecoin as the
default selection (sellDestTokenOptions[0]).

Changelog

CHANGELOG entry: Fixed QuickBuy sell flow so native tokens are always
shown alongside stablecoins in the "Receive" token list.

Related issues

Fixes: https://consensyssoftware.atlassian.net/browse/TSA-642

Manual testing steps

Feature: QuickBuy sell receive token list

  Scenario: user opens the Receive picker when selling a position
    Given I am on a trader position and open QuickBuy
    And I switch to Sell mode
    When I open the "Receive" token picker
    Then the list shows the native token and stablecoins for each supported chain
    And the position chain's stablecoin is selected by default
    And tokens I do not hold still appear with a $0.00 balance

Screenshots/Recordings

Before

N/A

After

N/A

Pre-merge author checklist

Performance checks (if applicable)

  • I've tested on Android
    • Ideally on a mid-range device; emulator is acceptable
  • I've tested with a power user scenario
  • Use these power-user
    SRPs

    to import wallets with many accounts and tokens
  • I've instrumented key operations with Sentry traces for production
    performance metrics
  • See trace() for usage and
    addToken
    for an example

For performance guidelines and tooling, see the Performance
Guide
.

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.

Made with Cursor


Note

Low Risk
UI-only expansion of receive picker options using existing bridge
token helpers and enrichment; no auth or controller changes.

Overview
QuickBuy Sell mode’s Receive picker now lists native
tokens
(ETH, POL, etc.) in addition to stablecoins, fixing cases where
natives were never offered.

useReceiveTokens builds one native per chain already covered by
stablecoin candidates via getNativeSourceToken, merges them into the
picker list, and keeps stablecoins before natives within each chain
group so the default receive token (sellDestTokenOptions[0]) stays a
stablecoin. Non-stable ERC-20s like WETH remain excluded. Comments on
QuickBuyReceiveScreen were updated to describe stablecoin-or-native
receive options; behavior is unchanged aside from the expanded list from
the hook.

Tests cover natives in the list, zero-address natives, preferred-chain
ordering, and stablecoin-first within the preferred chain.

Reviewed by Cursor Bugbot for commit
a02ec0d. Bugbot is set up for automated
code reviews on this repo. Configure
here.

Co-authored-by: Cursor cursoragent@cursor.com bedb452

…nd stablecoins in QuickBuy sell receive list (TSA-642) (#31235)

## **Description**

In QuickBuy Sell mode the user sells the fixed position token and
chooses which token to **receive**. The Receive picker
(`useReceiveTokens`) only listed stablecoins (mUSD/USDC/USDT), so native
tokens were never offered.

This PR extends the Receive candidate set to always include the native
token of every chain already covered by the stablecoin candidates, so
natives and stablecoins are always visible regardless of balance.
Natives are built via the existing Bridge helper
`getNativeSourceToken(chainId)` and enriched through the same
`enrichTokenBalance` path (the `isNativeAddress` branch already handles
native balance/pricing), so no controller changes were needed.
Candidates are ordered stablecoin-before-native within each chain group
and the position chain is sorted first, which keeps a stablecoin as the
default selection (`sellDestTokenOptions[0]`).

## **Changelog**

CHANGELOG entry: Fixed QuickBuy sell flow so native tokens are always
shown alongside stablecoins in the "Receive" token list.

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/TSA-642

## **Manual testing steps**

```gherkin
Feature: QuickBuy sell receive token list

  Scenario: user opens the Receive picker when selling a position
    Given I am on a trader position and open QuickBuy
    And I switch to Sell mode
    When I open the "Receive" token picker
    Then the list shows the native token and stablecoins for each supported chain
    And the position chain's stablecoin is selected by default
    And tokens I do not hold still appear with a $0.00 balance
```

## **Screenshots/Recordings**

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [x] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [x] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [x] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

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

Made with [Cursor](https://cursor.com)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> UI-only expansion of receive picker options using existing bridge
token helpers and enrichment; no auth or controller changes.
> 
> **Overview**
> QuickBuy **Sell** mode’s **Receive** picker now lists **native
tokens** (ETH, POL, etc.) in addition to stablecoins, fixing cases where
natives were never offered.
> 
> `useReceiveTokens` builds one native per chain already covered by
stablecoin candidates via `getNativeSourceToken`, merges them into the
picker list, and keeps **stablecoins before natives** within each chain
group so the default receive token (`sellDestTokenOptions[0]`) stays a
stablecoin. Non-stable ERC-20s like WETH remain excluded. Comments on
`QuickBuyReceiveScreen` were updated to describe stablecoin-or-native
receive options; behavior is unchanged aside from the expanded list from
the hook.
> 
> Tests cover natives in the list, zero-address natives, preferred-chain
ordering, and stablecoin-first within the preferred chain.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
a02ec0d. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@mm-token-exchange-service mm-token-exchange-service Bot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Jun 9, 2026
@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

🔍 Smart E2E Test Selection

⏭️ Smart E2E selection skipped - PR targets a release or stable branch (release/* or stable)

All E2E tests pre-selected.

View GitHub Actions results

@github-actions github-actions Bot added size-S risk:low AI analysis: low risk labels Jun 9, 2026
@sleepytanya sleepytanya merged commit 7437e75 into release/7.81.0 Jun 10, 2026
208 of 210 checks passed
@sleepytanya sleepytanya deleted the runway-cherry-pick-7.81.0-1780994678 branch June 10, 2026 02:04
@github-actions github-actions Bot locked and limited conversation to collaborators Jun 10, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

risk:low AI analysis: low risk size-S team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants