Skip to content

fix(MUSD-651): polish Cash & mUSD UI per latest designs cp-7.74.0#28921

Merged
Kureev merged 15 commits into
mainfrom
kureev/MUSD-651
Apr 17, 2026
Merged

fix(MUSD-651): polish Cash & mUSD UI per latest designs cp-7.74.0#28921
Kureev merged 15 commits into
mainfrom
kureev/MUSD-651

Conversation

@Kureev

@Kureev Kureev commented Apr 16, 2026

Copy link
Copy Markdown
Contributor

Description

Implements the four remaining MUSD-651 polish items on the Cash full view, mUSD asset detail page, and home Cash section. Audit confirmed the other ticket items (tooltip icon color, stablecoin tag checkmarks/dark-mode fill, 3% bonus tag on home) already shipped in PRs #28479, #28656, and #28718.

Lifetime bonus formattingAssetOverviewClaimBonus now renders $0.00 in default text color until the user has actually claimed a bonus, then switches to +$X in SuccessDefault green. Previously always rendered +$0.00 in green.

Get mUSD CTAMusdConversionAssetListCta button promoted from Secondary to Primary to match the white-on-dark Figma spec; redundant inner <Text> color override dropped so the Button can drive its own text color from the variant.

Drop "Claim bonus" link from token rowsMusdAggregatedRow (home Cash section) and TokenListItem (mUSD per-network rows) no longer render the blue "Claim bonus" affordance when a bonus is claimable. They fall through to the green "3% bonus" label instead. The claim CTA still lives on the mUSD asset detail page (AssetOverviewClaimBonus), which is now the canonical claim entry point.

Padding above "Convert your stablecoins" — bumped top padding (pt-3) inside MoneyConvertStablecoins so the divider isn't flush with the title.

MusdAggregatedRow also dropped its now-unused useMerklBonusClaim, useNetworkName, and analytics dependencies — the removed click handler was the only reason the hook was called.

Note: claim bonus tag shape is addressed separately in this PR.

Changelog

CHANGELOG entry: Polished Cash and mUSD bonus UI: lifetime bonus shows zero state in white, "Get mUSD" CTA is now primary, blue "Claim bonus" link removed from token rows.

Related issues

Fixes: MUSD-651

Manual testing steps

Feature: MUSD-651 Cash & mUSD UI polish

  Scenario: lifetime bonus shows zero state in white
    Given the user has never claimed an mUSD bonus
    When user opens the Cash full view from Home → Cash header
    Then the "Lifetime bonus claimed" row reads "$0.00" in default (white) text

  Scenario: lifetime bonus shows positive amount in green
    Given the user has previously claimed at least one mUSD bonus
    When user opens the Cash full view
    Then the "Lifetime bonus claimed" row reads "+$<amount>" in green

  Scenario: Get mUSD CTA is primary
    Given the user has no mUSD balance and is geo-eligible
    When user views the home wallet asset list
    Then the "Get mUSD" CTA renders as a primary (white-on-dark) button

  Scenario: Cash row never shows blue "Claim bonus" link
    Given the user has a claimable mUSD bonus on Linea
    When user views Home → Cash section
    Then the row shows green "3% bonus" text (no blue "Claim bonus" link)
    And tapping the row navigates to the Cash full view

  Scenario: token list mUSD rows never show "Claim bonus"
    Given the user holds mUSD across multiple chains with claimable rewards
    When user opens the Cash full view
    Then each mUSD row in the token list shows green "3% bonus" (no blue link)
    And the "Claim $X bonus" CTA on the asset detail "Your bonus" section still works

  Scenario: spacing above "Convert your stablecoins"
    Given the user is on the Cash full view
    When user scrolls to the "Convert your stablecoins" section
    Then there is visible breathing room between the divider line and the section title

Screenshots/Recordings

image image

Pre-merge author checklist

Performance checks (if applicable)

  • I've tested on Android
  • I've tested with a power user scenario
  • I've instrumented key operations with Sentry traces for production performance metrics

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

Medium Risk
UI/UX behavior changes around when/where users can claim mUSD bonuses (removing claim affordances from token rows) plus token list rendering tweaks could affect discoverability and row layout, but no core auth or funds-transfer logic is modified.

Overview
Polishes mUSD bonus presentation to match updated designs: AssetOverviewClaimBonus now shows lifetime bonus as $0.00 in default text until a first claim, switching to green +$X only when non-zero, and tests are updated accordingly.

Updates Cash and token list rows to stop showing the previous inline claim bonus affordance: TokenListItem removes useMerklBonusClaim/spinner/claim handling entirely and, when eligible, renders a dedicated mUSD “3% bonus” row layout (hiding the price rail), while MusdAggregatedRow standardizes the label to “Claim 3% bonus” when claimable and uses the design-system spinner; analytics properties are adjusted to match the new button text.

Small UI tweaks: promotes the “Get mUSD” asset-list CTA button to Primary (letting the Button control text styling), adds top padding in MoneyConvertStablecoins, and simplifies TokenList by removing viewability state/props and dropping the scrollToMerklRewards navigation param type.

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

- Lifetime bonus: white $0.00 until first claim, then green +$X
- Promote "Get mUSD" asset-list CTA to primary variant
- Drop "Claim bonus" link from home Cash row and mUSD token rows;
  rows now always show the green "3% bonus" label
- Add top padding above "Convert your stablecoins" title
@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.

@Kureev Kureev self-assigned this Apr 16, 2026
@Kureev Kureev marked this pull request as ready for review April 16, 2026 13:44
@Kureev Kureev requested review from a team as code owners April 16, 2026 13:44
@Kureev Kureev enabled auto-merge April 16, 2026 13:44
@github-actions github-actions Bot added the risk-medium Moderate testing recommended · Possible bug introduction risk label Apr 16, 2026
Comment thread app/components/UI/Tokens/TokenList/TokenListItem/TokenListItem.tsx
@github-actions github-actions Bot added risk-medium Moderate testing recommended · Possible bug introduction risk and removed risk-medium Moderate testing recommended · Possible bug introduction risk labels Apr 16, 2026
if (hasClaimableBonus) {
const isMusdAsset = !!asset && isMusdToken(asset.address);

if (hasClaimableBonus && !isMusdAsset) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need this block if the secondary balance isn't meant to display the "claim bonus" text button anymore?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 on this - it seems like there is still a decent amount of code related to making claims

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — removed the entire Claim bonus branch in 68fb5c1. mUSD rows never used it (guarded by !isMusdAsset), and the other Merkl-eligible addresses are internal test tokens, so the branch was effectively unreachable. The hook, handleClaimBonus callback, Spinner fallback, and isVisible prop chain are all gone.


const secondaryBalanceDisplay = useMemo(() => {
if (hasClaimableBonus) {
const isMusdAsset = !!asset && isMusdToken(asset.address);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need the scrollToMerklRewards param above? I'm not sure if it's used anymore.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed in 68fb5c1 — confirmed the only caller was onItemPress passing it through to navigation, and no reader on the Asset screen side consumed it. Dropped the param from onItemPress and the scrollToMerklRewards field from Asset.types.ts.

asset &&
isMusdToken(asset.address)
) {
// mUSD rows always show the green "3% bonus" label (claim affordance

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving comment here because I can't comment on unchanged lines.

If the user can't claim via this component anymore we should remove any claiming and merkl dead code from this file.

Context: Merkl is the protocol we use to handle our mUSD bonuses right now. If you see merkl in the code it's related to the bonus claim. You may already know this but sharing in case 😄

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 68fb5c1 — the useMerklBonusClaim hook, the handleClaimBonus callback (and its MUSD_CLAIM_BONUS_BUTTON_CLICKED tracking), the Spinner fallback, hasClaimableBonus, and the related tests are all gone from this file. The hook itself stays (still used by AssetOverviewClaimBonus on the detail page).

@github-actions github-actions Bot added size-L risk-medium Moderate testing recommended · Possible bug introduction risk and removed size-M risk-medium Moderate testing recommended · Possible bug introduction risk labels Apr 16, 2026
@github-actions github-actions Bot added risk-medium Moderate testing recommended · Possible bug introduction risk and removed risk-medium Moderate testing recommended · Possible bug introduction risk labels Apr 16, 2026
Per reviewer feedback on #28921 — the Claim bonus CTA has moved to the
mUSD asset detail page, so the token-list row no longer needs Merkl
machinery. Removes useMerklBonusClaim, handleClaimBonus, hasClaimableBonus,
the Spinner fallback, the isVisible prop chain (only consumer was the
hook), scrollToMerklRewards route param (no active navigator set it),
and the now-obsolete tests.
@github-actions github-actions Bot added risk-medium Moderate testing recommended · Possible bug introduction risk and removed risk-medium Moderate testing recommended · Possible bug introduction risk labels Apr 16, 2026
@Kureev Kureev requested review from Jwhiles and Matt561 April 16, 2026 18:52
Comment thread app/components/Views/Homepage/Sections/Cash/MusdAggregatedRow.tsx
Update MUSD_CLAIM_BONUS_BUTTON_CLICKED button_text from "Claim bonus"
to "Claim 3% bonus" in both TokenListItem and MusdAggregatedRow,
matching the user-visible text.
@github-actions github-actions Bot added risk-high Extensive testing required · High bug introduction risk and removed risk-high Extensive testing required · High bug introduction risk labels Apr 17, 2026
@Matt561 Matt561 changed the title fix(MUSD-651): polish Cash & mUSD UI per latest designs fix(MUSD-651): polish Cash & mUSD UI per latest designs cp-7.74.0 Apr 17, 2026
Comment thread app/components/Views/Homepage/Sections/Cash/MusdAggregatedRow.tsx Outdated
Comment thread app/components/UI/Tokens/TokenList/TokenListItem/TokenListItem.tsx Outdated
…ListItem

Remove all Merkl claim infrastructure from TokenListItem and TokenList
(useMerklBonusClaim, handleClaimBonus, Spinner, isVisible viewport
tracking). Token rows now show static "3% bonus" only.

The claim CTA lives exclusively in MusdAggregatedRow (home screen)
and now references the Linea mUSD asset since claims execute on Linea.
@github-actions github-actions Bot added risk-medium Moderate testing recommended · Possible bug introduction risk and removed risk-high Extensive testing required · High bug introduction risk labels Apr 17, 2026
@github-actions github-actions Bot added risk-medium Moderate testing recommended · Possible bug introduction risk and removed risk-medium Moderate testing recommended · Possible bug introduction risk labels Apr 17, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit db45335. Configure here.

@github-actions github-actions Bot added risk-medium Moderate testing recommended · Possible bug introduction risk and removed risk-medium Moderate testing recommended · Possible bug introduction risk labels Apr 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔍 Smart E2E Test Selection

  • Selected E2E tags: SmokeTrade, SmokeWalletPlatform, SmokeConfirmations
  • Selected Performance tags: @PerformanceAssetLoading
  • Risk Level: medium
  • AI Confidence: 78%
click to see 🤖 AI reasoning details

E2E Test Selection:
The PR makes several focused changes to Earn/mUSD features and the token list:

  1. TokenList.tsx & TokenListItem.tsx: Removed viewport visibility tracking (visibleKeys, viewabilityConfig, onViewableItemsChanged) and removed the Merkl bonus claim functionality from individual token list items. The isVisible prop is removed entirely. This is a simplification that affects how the token list renders and what CTAs appear on mUSD tokens in the list. The token list is a core component used on the wallet homepage.

  2. MusdAggregatedRow.tsx: Refactored the mUSD aggregated row in the Cash section of the homepage. The claim bonus button is now a TouchableOpacity with updated text using the new locale key claim_percentage_bonus. The Spinner component was swapped from AnimatedSpinner to the design system Spinner.

  3. AssetOverviewClaimBonus.tsx: Fixed lifetime bonus display logic - shows white $0.00 before first claim, green +$X after. This is in the Asset detail view.

  4. MusdConversionAssetListCta/index.tsx: Button variant changed from Secondary to Primary (visual change).

  5. MoneyConvertStablecoins.tsx: Minor padding adjustment.

  6. Asset.types.ts: Removed scrollToMerklRewards navigation param.

  7. locales/en.json: Added claim_percentage_bonus string.

Tag Selection Rationale:

  • SmokeTrade: The Earn/staking features (mUSD conversion, bonus claiming) are part of the Trade/Earn category. Changes to the claim bonus flow, mUSD token display, and conversion CTA directly affect these flows.
  • SmokeWalletPlatform: The token list is a core component of the wallet homepage. Changes to TokenList and TokenListItem affect how tokens are displayed on the main wallet screen, transaction history display, and the Cash section. The MusdAggregatedRow is part of the homepage Cash section.
  • SmokeConfirmations: Per SmokeTrade tag description, when selecting SmokeTrade for swap/bridge flows, also select SmokeConfirmations since transaction confirmations are part of the flow. The mUSD claim bonus involves on-chain transactions.

The changes are focused on Earn/mUSD UI refactoring and token list simplification. No core controllers or Engine changes are involved, keeping risk at medium level.

Performance Test Selection:
The TokenList.tsx changes removed viewport visibility tracking (viewabilityConfig, onViewableItemsChanged, visibleKeys state) which was previously used to track which items are visible. This simplification could affect token list rendering performance - removing the state updates on scroll could improve performance, but it's worth validating. The @PerformanceAssetLoading tag covers token list rendering and balance fetching which is directly impacted by these TokenList changes.

View GitHub Actions results

@Matt561 Matt561 self-requested a review April 17, 2026 17:19
@sonarqubecloud

Copy link
Copy Markdown

@Kureev Kureev enabled auto-merge April 17, 2026 17:25
@Kureev Kureev requested a review from Prithpal-Sooriya April 17, 2026 17:25
@github-actions

Copy link
Copy Markdown
Contributor

E2E Fixture Validation — Schema is up to date
12 value mismatches detected (expected — fixture represents an existing user).
View details

@Kureev Kureev added this pull request to the merge queue Apr 17, 2026
Merged via the queue into main with commit 775a207 Apr 17, 2026
115 checks passed
@Kureev Kureev deleted the kureev/MUSD-651 branch April 17, 2026 18:35
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 17, 2026
@metamaskbotv2 metamaskbotv2 Bot added the release-7.75.0 Issue or pull request that will be included in release 7.75.0 label Apr 17, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-7.75.0 Issue or pull request that will be included in release 7.75.0 risk-medium Moderate testing recommended · Possible bug introduction risk size-L team-earn

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants