Skip to content

Cherry-picking commits from main to release/8.0.0 for PR #32083#32105

Open
runway-github[bot] wants to merge 1 commit into
release/8.0.0from
runway-cherry-pick-8.0.0-1781885431
Open

Cherry-picking commits from main to release/8.0.0 for PR #32083#32105
runway-github[bot] wants to merge 1 commit into
release/8.0.0from
runway-cherry-pick-8.0.0-1781885431

Conversation

@runway-github

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

Copy link
Copy Markdown
Contributor

Description

mUSD on Monad did not show a "No fee" label in the "Earn on your crypto"
section, even though depositing it into the Money account incurs no
Relay fixed-spread fee.

useMoneyEarnableTokens tags a token as no-fee using a directional
match against the confirmations_relay_fixed_spread SSOT flag: the
token must have a subsidized route whose target is Monad mUSD (a
Money deposit always converts into Monad mUSD). This is correct by
construction — it never mislabels tokens that are subsidized into a
different output (e.g. Linea USDC -> Linea mUSD, or the Monad mUSD -> USDC withdraw direction).

The one gap: Monad mUSD itself. The flag omits Monad mUSD -> Monad mUSD because no swap or bridge is needed when source and target are the
same — so the directional match never tags it, despite the deposit being
fee-free. This PR adds Monad mUSD as an explicit no-fee case in the
hook. It knowingly steps outside the SSOT flag for this single edge
case; see the inline comment.

Changelog

CHANGELOG entry: Fixed mUSD on Monad not showing the "No fee" label in
the "Earn on your crypto" section.

Related issues

Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-1030

Manual testing steps

Feature: No-fee label on mUSD in Earn on your crypto

  Scenario: Monad mUSD shows the No fee badge
    Given I hold mUSD on the Monad network

    When I view the "Earn on your crypto" section
    Then the Monad mUSD row shows the "No fee" label

  Scenario: a token subsidized only into a non-Monad mUSD is not mislabeled
    Given I hold a token whose only subsidized route targets a non-Monad mUSD

    When I view the "Earn on your crypto" section
    Then that token row does NOT show the "No fee" label

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.

Note

Low Risk
Localized Money UI labeling logic with added unit tests; no changes to
payments, auth, or transaction execution.

Overview
Earn on your crypto now shows the No fee badge on Monad
mUSD
when depositing into the Money account.

useMoneyEarnableTokens still marks tokens only when the relay
fixed-spread config has a subsidized route whose target is Monad
mUSD. It adds an explicit Monad mUSD case because that same-token
path is omitted from the SSOT flag even though the deposit is fee-free.

Tests lock in that withdraw-only Monad mUSD routes do not rely on
directional matching alone, and that sources subsidized only into
non-Monad mUSD (e.g. Linea) stay not no-fee.

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


Co-authored-by: Matthew Grainger 46547583+Matt561@users.noreply.github.com 767d224

…o cp-8.0.0 (#32083)

## **Description**

<!-- mms-check: type=text required=true -->

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

mUSD on Monad did not show a "No fee" label in the "Earn on your crypto"
section, even though depositing it into the Money account incurs no
Relay fixed-spread fee.

`useMoneyEarnableTokens` tags a token as no-fee using a **directional**
match against the `confirmations_relay_fixed_spread` SSOT flag: the
token must have a subsidized route whose **target** is Monad mUSD (a
Money deposit always converts into Monad mUSD). This is correct by
construction — it never mislabels tokens that are subsidized into a
different output (e.g. `Linea USDC -> Linea mUSD`, or the `Monad mUSD ->
USDC` withdraw direction).

The one gap: Monad mUSD itself. The flag omits `Monad mUSD -> Monad
mUSD` because no swap or bridge is needed when source and target are the
same — so the directional match never tags it, despite the deposit being
fee-free. This PR adds Monad mUSD as an explicit no-fee case in the
hook. It knowingly steps outside the SSOT flag for this single edge
case; see the inline comment.

## **Changelog**

<!-- mms-check: type=changelog required=true blocking=true -->

<!--
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 mUSD on Monad not showing the "No fee" label in
the "Earn on your crypto" section.

## **Related issues**

<!-- mms-check: type=issue-link required=true -->

Fixes: https://consensyssoftware.atlassian.net/browse/MUSD-1030

## **Manual testing steps**

<!-- mms-check: type=manual-testing required=true -->

```gherkin
Feature: No-fee label on mUSD in Earn on your crypto

  Scenario: Monad mUSD shows the No fee badge
    Given I hold mUSD on the Monad network

    When I view the "Earn on your crypto" section
    Then the Monad mUSD row shows the "No fee" label

  Scenario: a token subsidized only into a non-Monad mUSD is not mislabeled
    Given I hold a token whose only subsidized route targets a non-Monad mUSD

    When I view the "Earn on your crypto" section
    Then that token row does NOT show the "No fee" label
```

## **Screenshots/Recordings**

<!-- mms-check: type=screenshot required=true -->

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

### **Before**

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

N/A

### **After**

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

N/A

## **Pre-merge author checklist**

<!-- mms-check: type=checklist required=true -->

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

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

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] 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**
> Localized Money UI labeling logic with added unit tests; no changes to
payments, auth, or transaction execution.
> 
> **Overview**
> **Earn on your crypto** now shows the **No fee** badge on **Monad
mUSD** when depositing into the Money account.
> 
> `useMoneyEarnableTokens` still marks tokens only when the relay
fixed-spread config has a subsidized route whose **target** is Monad
mUSD. It adds an explicit **Monad mUSD** case because that same-token
path is omitted from the SSOT flag even though the deposit is fee-free.
> 
> Tests lock in that withdraw-only Monad mUSD routes do not rely on
directional matching alone, and that sources subsidized only into
non-Monad mUSD (e.g. Linea) stay **not** no-fee.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
a95b660. 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: Matthew Grainger <46547583+Matt561@users.noreply.github.com>
@runway-github runway-github Bot requested a review from a team as a code owner June 19, 2026 16:10
@github-actions

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 19, 2026
@github-actions

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-M risk:low AI analysis: low risk labels Jun 19, 2026
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant