Skip to content

feat(ramps): surface ramp orders in Activity, details, and status toasts - #44948

Closed
georgeweiler wants to merge 28 commits into
mainfrom
tram-3718-orders
Closed

georgeweiler wants to merge 28 commits into
mainfrom
tram-3718-orders

Conversation

@georgeweiler

@georgeweiler georgeweiler commented Jul 28, 2026 •

Copy link
Copy Markdown
Contributor

Description

After a native Buy/Sell checkout, users had almost no in-wallet trail of the order — just the “buy tab opened” toast. This PR wires resolved ramp orders into the places people already look: Activity, transaction details, and status toasts.

User-facing flow

  1. Continue opens the provider checkout tab and starts a background tab watcher (important in popup mode: the popup can close when the tab opens, so open+watch cannot live in the UI).
  2. Provider redirects to the MetaMask fake-callback URL → watcher resolves the order (getOrderFromCallback, with getOrder(orderCode) fallback) and addOrders it. No optimistic PRECREATED stubs.
  3. Watcher opens Activity (so Chrome doesn’t quit if that was the only tab), closes the checkout tab, and status toasts fire on real transitions.
  4. Activity shows rampBuy / rampSell rows (Buy & Sell filter). Row / toast click opens RampOrderDetails (paid with, fee, status, order id, provider link, Buy again).

Implementation notes for reviewers

  • Mapping: mapRampsOrderSafely wraps shared @metamask/client-utils mapRampsOrder and normalizes provider quirks (missing chain / txHash).
  • IDs: details routes use getInternalOrderCode (slash-safe), not raw provider paths.
  • Toasts: seeded on mount/account switch (no historical spam); buy vs sell copy; whole toast is clickable (no View button); prior-account toasts dismissed on switch.
  • Details: TransactionDetails looks up ramp orders by id or settlement hash and does not treat order ids as EVM tx hashes for the accounts API.
  • Deps: published @metamask/client-utils ^1.4.0 (lockfile 1.5.0); LavaMoat/attributions updated for the bump.

Out of scope / intentional non-goals

  • No optimistic pending-quote preview overlay.
  • No forever-pending Activity stubs if the user abandons checkout.

Changelog

CHANGELOG entry: Added ramp order Activity rows, order details, and status toasts for native buy/sell.

Related issues

Fixes: TRAM-3718
Core: MetaMask/core#9650

Manual testing steps

  1. yarn start, reload unpacked extension from dist/chrome.
  2. Happy path (popup mode): open MetaMask as a popup → Buy → Continue. Confirm the popup can close when MoonPay opens, complete checkout, then confirm:
    • callback/MoonPay tab closes (not stuck on white fake-callback),
    • MetaMask Activity opens,
    • pending → success/failed toast appears,
    • Activity row + details look correct (amount, fee, order id, Buy again as applicable).
  3. Toast navigation: click the toast body (not a View button) → order details or Activity.
  4. Account switch: with a pending toast visible, switch accounts → prior toast dismissed; historical orders on the new account do not re-toast.
  5. Abandon checkout: start Buy, close the provider tab before finishing → no blank forever-pending stub in Activity.
  6. Optional last-tab stress: close other Chrome tabs so MoonPay is alone → after redirect, Chrome should stay open with MetaMask Activity, not quit.

Screenshots/Recordings

After

Video demo of tab watcher and order processing: https://www.loom.com/share/4bd6baed6e2b4a1996901e7cd5448335

Screenshot 2026-07-28 at 6 09 40 AM
ramp-checkout-2.mp4

Pre-merge author checklist

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
Touches fiat on-ramp checkout lifecycle, background tab handling, and Activity/dedup behavior; mistakes could strand orders or mis-route users, but scope is mostly UI plus isolated background watcher changes with solid test coverage.

Overview
Ramp buy/sell orders now show up in Activity, order details, and status toasts after checkout, instead of only the “tab opened” toast.

Checkout (background): Continue no longer opens the provider tab from the popup or seeds PRECREATED orders / in-memory quote previews. It calls watchRampsCheckoutTab with the checkout URL; the background script opens the tab, resolves the order on callback (getOrderFromCallback, getOrder fallback), opens Activity, then closes checkout.

Activity & navigation: useRampsOrderActivity merges ramp rows (deduped ahead of txs sharing a settlement hash). Details use /ramps/order/:chain/:id via getInternalOrderCode, with toast actions and list clicks wired through shared helpers. TransactionDetails accepts a pre-resolved item and skips treating order ids as EVM hashes for the accounts API.

UI: New RampOrderDetails page (fees, payment method, provider link, buy again), ramp row copy/placeholders, i18n, and useRampsOrderEventToasts (buy/sell copy, account-switch cleanup). @metamask/client-utils bumped to ^1.4.0 (patch removed).

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

@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.

@socket-security

socket-security Bot commented Jul 28, 2026 •

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updated@​metamask/​client-utils@​1.2.0 ⏵ 1.5.077 +110079 +297 +3100

View full report

@metamask-ci

metamask-ci Bot commented Jul 28, 2026 •

Copy link
Copy Markdown
Contributor

✨ Files requiring CODEOWNER review ✨

👨‍🔧 @MetaMask/core-extension-ux (31 files, +2130 -41)
  • 📁 shared/
    • 📁 lib/
      • 📁 activity/
        • 📄 fiat.test.ts +19 -0
        • 📄 fiat.ts +11 -1
  • 📁 ui/
    • 📁 pages/
      • 📁 activity/
        • 📁 rows/
          • 📄 useActivityRowContent.test.tsx +119 -1
          • 📄 useActivityRowContent.tsx +35 -3
          • 📄 activity-list.test.tsx +163 -3
          • 📄 activity-list.tsx +30 -16
          • 📄 helpers.test.ts +177 -5
          • 📄 helpers.ts +48 -1
          • 📄 useLocalTransactions.ts +4 -1
          • 📄 useNonEvmTransactions.ts +4 -1
      • 📁 details/
        • 📁 __snapshots__/
          • 📄 transaction-details.test.tsx.snap +9 -0
        • 📁 components/
          • 📁 __snapshots__/
            • 📄 sections.test.tsx.snap +61 -0
            • 📄 header.tsx +3 -1
            • 📄 sections.test.tsx +99 -0
            • 📄 sections.tsx +7 -5
        • 📁 templates/
          • 📁 ramps/
            • 📁 __snapshots__/
              • 📄 ramp-metadata-section.test.tsx.snap +49 -0
              • 📄 ramp-tokens-section.test.tsx.snap +23 -0
              • 📄 hooks.test.ts +156 -0
              • 📄 hooks.ts +53 -0
              • 📄 ramp-metadata-section.test.tsx +74 -0
              • 📄 ramp-metadata-section.tsx +78 -0
              • 📄 ramp-order-details-page.test.tsx +96 -0
              • 📄 ramp-order-details-page.tsx +35 -0
              • 📄 ramp-order-details.test.tsx +287 -0
              • 📄 ramp-order-details.tsx +162 -0
              • 📄 ramp-tokens-section.test.tsx +66 -0
              • 📄 ramp-tokens-section.tsx +51 -0
            • 📄 template-loader.test.tsx +17 -0
            • 📄 template-loader.tsx +4 -0
          • 📄 transaction-details.test.tsx +159 -0
          • 📄 transaction-details.tsx +31 -3

🔒 @MetaMask/extension-security-team (1 files, +1 -0)
  • 📁 .github/
    • 📄 CODEOWNERS +1 -0

👨‍🔧 @MetaMask/money-movement (31 files, +2607 -293)
  • 📁 app/
    • 📁 scripts/
      • 📁 lib/
        • 📁 ramps/
          • 📁 __snapshots__/
            • 📄 checkout-watch.test.ts.snap +15 -0
            • 📄 checkout-watch.test.ts +73 -92
            • 📄 checkout-watch.ts +162 -0
  • 📁 ui/
    • 📁 components/
      • 📁 app/
        • 📁 ramps/
          • 📄 ramps-order-toast-listener.tsx +7 -0
    • 📁 hooks/
      • 📁 ramps/
        • 📁 utils/
          • 📄 formatPendingRampTokenLabel.test.ts +12 -0
          • 📄 formatPendingRampTokenLabel.ts +9 -0
          • 📄 formatRampCurrencyAmount.test.ts +21 -0
          • 📄 formatRampCurrencyAmount.ts +25 -0
          • 📄 hasPositiveNumericAmount.test.ts +23 -0
          • 📄 hasPositiveNumericAmount.ts +15 -0
          • 📄 mapRampsOrderSafely.test.ts +162 -0
          • 📄 mapRampsOrderSafely.ts +103 -0
          • 📄 pendingOrderPreview.ts +0 -33
          • 📄 useRampsOrderActivity.test.ts +98 -0
          • 📄 useRampsOrderActivity.ts +36 -0
          • 📄 useRampsOrderEventToasts.test.ts +462 -0
          • 📄 useRampsOrderEventToasts.ts +234 -0
    • 📁 pages/
      • 📁 details/
        • 📁 templates/
          • 📁 ramps/
            • 📁 __snapshots__/
              • 📄 ramp-metadata-section.test.tsx.snap +49 -0
              • 📄 ramp-tokens-section.test.tsx.snap +23 -0
              • 📄 hooks.test.ts +156 -0
              • 📄 hooks.ts +53 -0
              • 📄 ramp-metadata-section.test.tsx +74 -0
              • 📄 ramp-metadata-section.tsx +78 -0
              • 📄 ramp-order-details-page.test.tsx +96 -0
              • 📄 ramp-order-details-page.tsx +35 -0
              • 📄 ramp-order-details.test.tsx +287 -0
              • 📄 ramp-order-details.tsx +162 -0
              • 📄 ramp-tokens-section.test.tsx +66 -0
              • 📄 ramp-tokens-section.tsx +51 -0
      • 📁 ramps/
        • 📁 build-quote/
          • 📁 hooks/
            • 📄 useRampsBuildQuote.ts +4 -71
            • 📄 build-quote.test.tsx +16 -97

📜 @MetaMask/policy-reviewers (8 files, +8 -0)
  • 📁 lavamoat/
    • 📁 webpack/
      • 📁 mv2/
        • 📁 beta/
          • 📄 policy.json +1 -0
        • 📁 experimental/
          • 📄 policy.json +1 -0
        • 📁 flask/
          • 📄 policy.json +1 -0
        • 📁 main/
          • 📄 policy.json +1 -0
      • 📁 mv3/
        • 📁 beta/
          • 📄 policy.json +1 -0
        • 📁 experimental/
          • 📄 policy.json +1 -0
        • 📁 flask/
          • 📄 policy.json +1 -0
        • 📁 main/
          • 📄 policy.json +1 -0

Tip

Follow the policy review process outlined in the LavaMoat Policy Review Process doc before expecting an approval from Policy Reviewers.

@metamask-ci

metamask-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Builds ready [97ca454]
⚡ Performance Benchmarks (Total: 🟢 14 pass · 🟡 9 warn · 🔴 1 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30359789181 | Baseline logs

Metricschrome-webpackfirefox-webpack
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]

Regressions (🔴 1 failure)

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
confirmTx
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
🟡 bridge_search_token

📈 Results compared to the previous 5 runs on main

  • ↑ confirmTx/tbt: +13%
  • ↑ confirmTx/inp: +21%
  • ↑ bridgeUserActions/longTaskCount: +11%
  • ↑ bridgeUserActions/longTaskTotalDuration: +13%
  • ↑ bridgeUserActions/tbt: +20%
  • ↑ bridgeUserActions/inp: +15%
  • ↓ loadNewAccount/inp: -17%
  • ↓ loadNewAccount/fcp: -45%
  • ↑ loadNewAccount/lcp: +1188%
  • ↑ confirmTx/confirm_tx: +10%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +10%
  • ↓ confirmTx/inp: -17%
  • ↓ confirmTx/fcp: -47%
  • ↑ confirmTx/lcp: +1233%
  • ↑ bridgeUserActions/bridge_load_page: +246%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +101%
  • ↑ bridgeUserActions/bridge_search_token: +181%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +168%
  • ↑ bridgeUserActions/inp: +1346%
  • ↓ bridgeUserActions/fcp: -48%
  • ↑ bridgeUserActions/lcp: +1110%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 confirmTx/FCP: p75 1.8s
  • 🟡 bridgeUserActions/FCP: p75 1.8s
  • 🔴 bridgeUserActions/INP: p75 1.5s
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
–🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ startupStandardHome/domInteractive: +27%
  • ↑ startupStandardHome/fcp: +33%
  • ↑ startupPowerUserHome/uiStartup: +21%
  • ↑ startupPowerUserHome/load: +13%
  • ↑ startupPowerUserHome/domContentLoaded: +13%
  • ↑ startupPowerUserHome/domInteractive: +13%
  • ↑ startupPowerUserHome/backgroundConnect: +28%
  • ↑ startupPowerUserHome/firstReactRender: +14%
  • ↑ startupPowerUserHome/initialActions: +11%
  • ↑ startupPowerUserHome/loadScripts: +13%
  • ↑ startupPowerUserHome/setupStore: +290%
  • ↑ startupPowerUserHome/inp: +31%
  • ↑ startupPowerUserHome/lcp: +19%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 startupPowerUserHome/INP: p75 248ms
  • 🟡 startupPowerUserHome/LCP: p75 3.4s
User Journey Benchmarks · Samples: 5 · mock API 🔴 1
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ onboardingImportWallet/srpButtonToSrpForm: -29%
  • ↓ onboardingImportWallet/confirmSrpToPwForm: -35%
  • ↓ onboardingImportWallet/pwFormToMetricsScreen: -31%
  • ↓ onboardingImportWallet/metricsToWalletReadyScreen: -40%
  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -92%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -79%
  • ↓ onboardingImportWallet/longTaskCount: -100%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -100%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -100%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -88%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -81%
  • ↓ onboardingNewWallet/longTaskCount: -69%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -79%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -52%
  • ↓ onboardingNewWallet/tbt: -100%
  • ↓ onboardingNewWallet/total: -77%
  • ↓ solanaAssetDetails/assetClickToPriceChart: -49%
  • ↓ solanaAssetDetails/longTaskCount: -100%
  • ↓ solanaAssetDetails/longTaskTotalDuration: -100%
  • ↓ solanaAssetDetails/longTaskMaxDuration: -100%
  • ↓ solanaAssetDetails/tbt: -100%
  • ↓ solanaAssetDetails/total: -49%
  • ↑ solanaAssetDetails/inp: +19%
  • ↑ solanaAssetDetails/fcp: +13%
  • ↓ importSrpHome/loginToHomeScreen: -15%
  • ↓ importSrpHome/homeAfterImportWithNewWallet: -18%
  • ↓ importSrpHome/longTaskCount: -37%
  • ↓ importSrpHome/longTaskTotalDuration: -38%
  • ↓ importSrpHome/tbt: -40%
  • ↓ importSrpHome/total: -16%
  • ↓ importSrpHome/inp: -12%
  • ↑ importSrpHome/cls: +464%
  • ↓ sendTransactions/openSendPageFromHome: -31%
  • ↑ sendTransactions/selectTokenToSendFormLoaded: +12%
  • ↓ sendTransactions/reviewTransactionToConfirmationPage: -98%
  • ↓ sendTransactions/longTaskCount: -100%
  • ↓ sendTransactions/longTaskTotalDuration: -100%
  • ↓ sendTransactions/longTaskMaxDuration: -100%
  • ↓ sendTransactions/tbt: -100%
  • ↓ sendTransactions/total: -96%
  • ↓ sendTransactions/inp: -22%
  • ↓ sendTransactions/lcp: -63%
  • ↑ sendTransactions/cls: +171%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 assetDetails/FCP: p75 1.8s
  • 🟡 importSrpHome/INP: p75 272ms
  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 sendTransactions/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 5.76 KiB (0.04%)
  • ui: 19.32 KiB (0.11%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 170 Bytes (0.01%)
  • zip: 7.42 KiB (0.03%)

@metamask-ci

metamask-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
Builds ready [f9150ee]
⚡ Performance Benchmarks (Total: 🟢 17 pass · 🟡 7 warn · 🔴 0 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30362700307 | Baseline logs

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 load_new_account
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ loadNewAccount/inp: -17%
  • ↓ loadNewAccount/fcp: -11%
  • ↓ confirmTx/longTaskTotalDuration: -24%
  • ↓ confirmTx/longTaskMaxDuration: -26%
  • ↓ confirmTx/tbt: -42%
  • ↓ confirmTx/inp: -24%
  • ↓ confirmTx/fcp: -18%
  • ↓ bridgeUserActions/bridge_load_page: -25%
  • ↓ bridgeUserActions/bridge_load_asset_picker: -29%
  • ↓ bridgeUserActions/longTaskCount: -44%
  • ↓ bridgeUserActions/longTaskTotalDuration: -51%
  • ↓ bridgeUserActions/longTaskMaxDuration: -24%
  • ↓ bridgeUserActions/tbt: -64%
  • ↓ bridgeUserActions/total: -11%
  • ↓ bridgeUserActions/fcp: -20%
  • ↑ loadNewAccount/load_new_account: +15%
  • ↑ loadNewAccount/total: +15%
  • ↓ loadNewAccount/inp: -24%
  • ↓ loadNewAccount/fcp: -59%
  • ↑ loadNewAccount/lcp: +1175%
  • ↑ confirmTx/confirm_tx: +12%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +12%
  • ↓ confirmTx/inp: -24%
  • ↓ confirmTx/fcp: -57%
  • ↑ confirmTx/lcp: +1170%
  • ↑ bridgeUserActions/bridge_load_page: +233%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +139%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +193%
  • ↓ bridgeUserActions/fcp: -47%
  • ↑ bridgeUserActions/lcp: +1113%
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 loadScripts
startupPowerUserHome
[Sentry log · main/release]
–🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ startupPowerUserHome/uiStartup: +13%
  • ↑ startupPowerUserHome/load: +13%
  • ↑ startupPowerUserHome/domContentLoaded: +13%
  • ↑ startupPowerUserHome/domInteractive: +20%
  • ↑ startupPowerUserHome/firstReactRender: +15%
  • ↑ startupPowerUserHome/initialActions: +11%
  • ↑ startupPowerUserHome/loadScripts: +13%
  • ↑ startupPowerUserHome/setupStore: +288%
  • ↑ startupPowerUserHome/inp: +14%
  • ↑ startupPowerUserHome/fcp: +21%
  • ↑ startupPowerUserHome/lcp: +14%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 startupPowerUserHome/INP: p75 216ms
  • 🟡 startupPowerUserHome/LCP: p75 3.3s
User Journey Benchmarks · Samples: 5 · mock API
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟡 [CI log]
🟡 total
🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
🟡 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
sendTransactions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -77%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -47%
  • ↓ onboardingImportWallet/longTaskCount: -86%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -96%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -93%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -80%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -78%
  • ↓ onboardingNewWallet/longTaskCount: -100%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -100%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -100%
  • ↓ onboardingNewWallet/tbt: -100%
  • ↓ onboardingNewWallet/total: -74%
  • ↓ solanaAssetDetails/longTaskCount: -100%
  • ↓ solanaAssetDetails/longTaskTotalDuration: -100%
  • ↓ solanaAssetDetails/longTaskMaxDuration: -100%
  • ↓ solanaAssetDetails/tbt: -100%
  • ↑ solanaAssetDetails/fcp: +14%
  • ↓ importSrpHome/loginToHomeScreen: -20%
  • ↓ importSrpHome/homeAfterImportWithNewWallet: -21%
  • ↓ importSrpHome/longTaskCount: -37%
  • ↓ importSrpHome/longTaskTotalDuration: -35%
  • ↓ importSrpHome/tbt: -34%
  • ↓ importSrpHome/total: -19%
  • ↓ importSrpHome/inp: -17%
  • ↑ importSrpHome/cls: +406%
  • ↓ sendTransactions/selectTokenToSendFormLoaded: -19%
  • ↓ sendTransactions/reviewTransactionToConfirmationPage: -98%
  • ↓ sendTransactions/longTaskCount: -100%
  • ↓ sendTransactions/longTaskTotalDuration: -100%
  • ↓ sendTransactions/longTaskMaxDuration: -100%
  • ↓ sendTransactions/tbt: -100%
  • ↓ sendTransactions/total: -96%
  • ↓ sendTransactions/inp: -30%
  • ↓ sendTransactions/lcp: -61%
  • ↑ sendTransactions/cls: +171%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 importSrpHome/INP: p75 256ms
  • 🟡 importSrpHome/FCP: p75 2.0s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 5.76 KiB (0.04%)
  • ui: 19.22 KiB (0.11%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 170 Bytes (0.01%)
  • zip: 7.41 KiB (0.03%)

Base automatically changed from tram-3718 to main July 29, 2026 23:12
@socket-security

socket-security Bot commented Jul 30, 2026 •

Copy link
Copy Markdown

All alerts resolved. Learn more about Socket for GitHub.

This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored.

View full report

@metamask-ci

metamask-ci Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor
Builds ready [e885d8e]
⚡ Performance Benchmarks (Total: 🟢 12 pass · 🟡 0 warn · 🔴 0 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30506729467 | Baseline logs

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
Startup Benchmarks · Samples: 100

⚠️ Missing data: firefox/webpack/startupStandardHome, firefox/webpack/startupPowerUserHome

✅ No regressions detected

User Journey Benchmarks · Samples: 5 · mock API

⚠️ Missing data: chrome/webpack/userJourneyAssets, chrome/webpack/userJourneyTransactions, firefox/webpack/userJourneyAssets, firefox/webpack/userJourneyTransactions

Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
importSrpHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
Dapp Page Load Benchmarks · Samples: 100

⚠️ Missing data: chrome/webpack/pageLoadBenchmark

✅ No regressions detected

Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -27.57 KiB (-0.19%)
  • ui: 29.48 KiB (0.17%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 272 Bytes (0.01%)
  • zip: -257 Bytes (0%)

@metamask-ci

metamask-ci Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor
Builds ready [310bc7d]
⚡ Performance Benchmarks (Total: 🟢 17 pass · 🟡 0 warn · 🔴 0 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30532274148 | Baseline logs

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
User Journey Benchmarks · Samples: 5 · mock API

⚠️ Missing data: chrome/webpack/userJourneyAssets, chrome/webpack/userJourneyTransactions

Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
importSrpHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
assetDetails
[Sentry log · main/release]
–🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
–🟢 [CI log]
sendTransactions
[Sentry log · main/release]
–🟢 [CI log]
swap
[Sentry log · main/release]
–🟢 [CI log]
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -27.22 KiB (-0.19%)
  • ui: 56.21 KiB (0.32%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 492 Bytes (0.03%)
  • zip: 6.42 KiB (0.03%)

@georgeweiler
georgeweiler marked this pull request as ready for review July 30, 2026 12:07
@georgeweiler
georgeweiler requested review from a team as code owners July 30, 2026 12:07
label={t('network')}
value={<NetworkName chainId={item.chainId} />}
/>
{item.chainId ? (

@n3ps n3ps Aug 3, 2026 •

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.

Was this rendering even when empty?

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.

yes. This PR adds a lot of defensive code like this because the chainID on ramps orders can be missing until providers update it.

value={<TransactionStatus status={item.status} hash={item.hash} />}
value={
<div className="flex flex-col items-end gap-0.5">
<TransactionStatus status={item.status} hash={item.hash} />

@n3ps n3ps Aug 3, 2026 •

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.

For items that only apply to Ramps, can it be scoped within the Ramps template(s)?

Comment thread ui/pages/activity/helpers.test.ts Outdated
'date-header',
'item',
]);
expect(grouped).toMatchSnapshot();

@n3ps n3ps Aug 3, 2026 •

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.

Prefer unit tests on functionality over snapshots


const { container } = render(<ActivityList />);

expect(container).toMatchSnapshot();

@n3ps n3ps Aug 3, 2026 •

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.

Prefer unit tests on functionality over snapshots

jest.mock('../../hooks/useFormatters', () => ({
useFormatters: () => ({
formatMediumDate: (date: Date) => date.toISOString(),
formatMediumDate: (date: Date | number) => new Date(date).toISOString(),

@n3ps n3ps Aug 3, 2026 •

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.

Can the call-site be updated instead?

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 call. But I think the mock is wrong here, not the call-site. formatMediumDate already takes string | number and the list passes row.date as a timestamp number. It is probably best to update the mock to match that signature instead of changing the call-site to pass a Date.

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.

georgeweiler and others added 3 commits August 3, 2026 03:46
Keep transaction-details generic by moving ramps order lookup and mapping into templates/ramps.

Co-authored-by: Cursor <cursoragent@cursor.com>
Move ramps status/tokens/routing into templates/ramps, restore generic details chrome, and replace activity snapshot assertions with unit checks.

Co-authored-by: Cursor <cursoragent@cursor.com>
Stop wrapping generic /tx and activity-list with ramps facades; toasts and deep links use /ramps/order, while the list dialog seeds the selected item into TransactionDetails.

Co-authored-by: Cursor <cursoragent@cursor.com>
Comment thread ui/pages/details/transaction-details.tsx
Drop toast-body onClick from the shared toast API and navigate from ramps status toasts through the existing actionText/onActionClick pattern.

Co-authored-by: Cursor <cursoragent@cursor.com>
return localItems.filter((item) => selectedNetworks.has(item.chainId));
return localItems.filter(
(item) =>
item.chainId !== undefined && selectedNetworks.has(item.chainId),

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.

Defensive code needed here because ramps orders can have undefined chain ID because they rely on providers to populate data


const selectedNetworks = new Set(networks);
return nonEvmItems.filter((item) => selectedNetworks.has(item.chainId));
return nonEvmItems.filter(

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.

Defensive code needed here because ramps orders can have undefined chain ID because they rely on providers to populate data

Track dialog details hash open state with a ref so activity-list no longer hardcodes /tx or ramps order routes for push/replace/back.

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

@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 742d269. Configure here.

return;
}

detailsHashOpenRef.current = true;

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.

Forward leaves stale details history

Low Severity

Replacing the hash-based “already on details” check with detailsHashOpenRef misses browser Forward. After Back, popstate clears the ref and closes the dialog; Forward restores a details hash without reopening the dialog or setting the ref. The next row click then pushStates instead of replaceStates, so Close can land on a stale details URL with the dialog closed.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 742d269. Configure here.

// `@metamask/client-utils` omits zero native `txParams.value` from mapped
// tokens but still provides symbol/asset metadata. Treat that as 0 so
// Activity can render "-0 ETH" for zero-value contract calls / sends.
if (token.symbol || token.assetId) {

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.

this is an edgecase found by bugbot, but valid. When a token has a symbol/asset but there is no amount we treat the amount as 0 so Activity can show -0 ETH instead of a blank row.


const handleClick = (item: ActivityListItem) => {
if (!item.hash) {
const detailsPath = getActivityDetailsPath(item);

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.

extracting the path such as #${TX_DETAILS_ROUTE}/${item.chainId}/${item.hash} to it's own helper (https://github.com/MetaMask/metamask-extension/pull/44948/changes#diff-0b6d11323768c8684ae4142a6214b5b2c44ecd1e792682fdf4b4c25449c0fec7R136) because I've added some ramp-specific path checking.

georgeweiler and others added 2 commits August 3, 2026 05:18
Narrow optional activity.chainId at the call site instead of teaching the helper to accept undefined.

Co-authored-by: Cursor <cursoragent@cursor.com>
Match the mock signature to string | number instead of Date | number.

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

Copy link
Copy Markdown
Contributor Author

@cursoragent please review

@cursor

cursor Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

Final PR Review: Ramp Orders UI Integration

🟢 Overall Assessment: Ready to Merge with 2 Minor Issues

The PR is in excellent shape and all previous critical issues have been resolved. Test coverage has improved to 86.7%, and the implementation is solid. There are 2 new minor issues identified by Bugbot that warrant attention.


🟡 New Issues Identified

1. Activity Details Freeze on Open (Medium Severity)

Location: ui/pages/details/transaction-details.tsx:57-61 & ui/pages/activity/activity-list.tsx:222-230

Issue: The Activity dialog now always seeds TransactionDetails with the clicked selectedItem prop, which short-circuits the local/API/non-EVM resolution logic. This means details stay frozen at click time—pending → success/failed updates don't appear while the dialog is open.

Impact: If a user has order details open and the order transitions from pending to success, the details page won't update until they close and reopen it. Toast navigation via RampOrderDetailsPage still gets live data.

Suggested fix: Either:

  • Remove the pre-seeding and let TransactionDetails resolve the item itself, OR
  • Add a polling mechanism to refresh selectedItem while the dialog is open

2. Forward Leaves Stale Details History (Low Severity)

Location: ui/pages/activity/activity-list.tsx:103-139

Issue: Replacing the hash-based "already on details" check with detailsHashOpenRef doesn't handle browser Forward correctly. After Back (which clears the ref), Forward restores a details hash without reopening the dialog or setting the ref. The next row click then pushStates instead of replaceStates, leaving stale history.

Impact: Minor navigation quirk where closing details after Back→Forward can land on a stale details URL with the dialog closed.

Suggested fix: Listen for popstate with forward direction and restore the ref when navigating forward to a details hash.


✅ Resolved Issues

All previously flagged issues have been addressed:

Issue Status Resolution
Pending ramps show false zero fiat ✅ Resolved Intentional design - Shows -0 ETH instead of blank row for pending orders
Account switch re-toasts ✅ Fixed Properly reseeds status map
Fallback omits order ✅ Fixed Always calls addOrder
Sell toasts use Buy copy ✅ Fixed Buy/sell differentiated
Slash order IDs break URLs ✅ Fixed Uses getInternalOrderCode
Account switch leaves toasts ✅ Fixed Dismisses before reseeding

📊 Updated Metrics

  • Test Coverage: 86.7% (↑ from 85.4%) ✅
  • Code Quality: SonarQube passing (6 new issues, gate passed) ✅
  • CI Status: Only check-pr-max-lines failing (expected for large features)
  • Performance: Some benchmark warnings but no critical regressions

🎯 Code Quality Highlights

Excellent Additions

  1. Defensive coding - Multiple chainId !== undefined checks for provider quirks
  2. Path extraction - getActivityDetailsPath helper centralizes logic
  3. Mock improvements - formatMediumDate mock updated to match signature
  4. Video demo - Loom recording added showing tab watcher flow

Design Decisions Validated

  • -0 ETH for pending orders - Intentional choice to show activity row instead of blank
  • Pre-seeding details - Performance optimization that trades off live updates (reasonable tradeoff)

💬 Code Review Comments

From @n3ps

"Can the call-site be updated instead?" (regarding mock signature)

Your response: Updated mock to match actual signature (string | number) ✅

This was the right call—fixing the mock rather than changing all call-sites is cleaner.


🚀 Final Checklist

  • All critical/high severity bugs fixed
  • Test coverage > 80% (now 86.7%)
  • Published dependency used
  • LavaMoat policies updated
  • PR description accurate with video demo
  • Defensive code for provider quirks
  • Activity details freeze (medium severity) - Optional fix
  • Forward navigation quirk (low severity) - Optional fix

📝 Recommendation

🟢 Approve - The PR is ready to merge. The two remaining issues are:

  1. Details freeze: Medium severity but acceptable—most users won't keep details open during order transitions
  2. Forward navigation: Low severity edge case

Both are non-blocking given:

  • Excellent test coverage (86.7%)
  • All critical bugs fixed
  • Clean architecture
  • Well-documented design decisions
  • Comprehensive defensive coding for provider quirks

If you want to address these before merge, they're straightforward fixes. Otherwise, they could be follow-up improvements.

Overall verdict: This is solid, production-ready code. The ramps order UI integration is comprehensive and well-tested. Ship it! 🚀

Open in Web Open in Cursor 

Copilot AI 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.

Pull request overview

Copilot reviewed 75 out of 76 changed files in this pull request and generated no new comments.

Suppressed comments (1)

ui/hooks/ramps/useRampsOrderEventToasts.ts:193

  • PR description/manual testing steps state the whole toast body should be clickable with no separate “View” button, but the ramps order toast logic still passes actionText: t('view') and onActionClick into show*Toast(...). In the current toast implementation (ui/components/ui/toast/toast.tsx), providing onActionClick renders a secondary button, so this will still show a “View” CTA instead of making the toast body itself clickable.

@sonarqubecloud

sonarqubecloud Bot commented Aug 3, 2026

Copy link
Copy Markdown

@metamask-ci

metamask-ci Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor
Builds ready [4d7e486] [reused from 93a6526]
⚡ Performance Benchmarks (Total: 🟢 12 pass · 🟡 9 warn · 🔴 2 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30810021930 | Baseline logs

Metricschrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 srpButtonToSrpForm(p95) [CI log]🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]🔴 [CI log]

Regressions (🔴 2 failures)

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟡 [CI log]
🟡 load_new_account
🟡 [CI log]
🟡 load_new_account
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ loadNewAccount/load_new_account: +18%
  • ↑ loadNewAccount/total: +18%
  • ↑ loadNewAccount/lcp: +24%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +12%
  • ↑ bridgeUserActions/longTaskCount: +11%
  • ↑ bridgeUserActions/longTaskTotalDuration: +13%
  • ↑ bridgeUserActions/tbt: +20%
  • ↑ loadNewAccount/load_new_account: +24%
  • ↑ loadNewAccount/total: +24%
  • ↑ loadNewAccount/fcp: +13%
  • ↑ loadNewAccount/lcp: +1205%
  • ↑ confirmTx/confirm_tx: +14%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +14%
  • ↓ confirmTx/inp: -17%
  • ↑ confirmTx/fcp: +16%
  • ↑ confirmTx/lcp: +1288%
  • ↑ bridgeUserActions/bridge_load_page: +357%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +159%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +46%
  • ↑ bridgeUserActions/inp: +69%
  • ↓ bridgeUserActions/fcp: -42%
  • ↑ bridgeUserActions/lcp: +1237%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 loadNewAccount/FCP: p75 2.0s
  • 🟡 confirmTx/FCP: p75 2.0s
Startup Benchmarks · Samples: 100

⚠️ Missing data: firefox/webpack/startupPowerUserHome

Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ startupStandardHome/numNetworkReqs: -14%
  • ↑ startupStandardHome/domInteractive: +47%
  • ↓ startupStandardHome/numNetworkReqs: -13%
  • ↑ startupStandardHome/fcp: +50%
User Journey Benchmarks · Samples: 5 · mock API 🔴 2
Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🟢 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🟢 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
sendTransactions
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -77%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -45%
  • ↓ onboardingImportWallet/longTaskCount: -100%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -100%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -100%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -79%
  • ↓ onboardingNewWallet/agreeButtonToOnboardingSuccess: -14%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -10%
  • ↓ onboardingNewWallet/longTaskCount: -69%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -79%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -52%
  • ↓ onboardingNewWallet/tbt: -100%
  • ↓ solanaAssetDetails/assetClickToPriceChart: -64%
  • ↓ solanaAssetDetails/longTaskCount: -100%
  • ↓ solanaAssetDetails/longTaskTotalDuration: -100%
  • ↓ solanaAssetDetails/longTaskMaxDuration: -100%
  • ↓ solanaAssetDetails/tbt: -100%
  • ↓ solanaAssetDetails/total: -64%
  • ↑ solanaAssetDetails/inp: +19%
  • ↑ solanaAssetDetails/fcp: +15%
  • ↓ importSrpHome/longTaskCount: -44%
  • ↓ importSrpHome/longTaskTotalDuration: -42%
  • ↓ importSrpHome/tbt: -37%
  • ↓ importSrpHome/inp: -27%
  • ↑ importSrpHome/cls: +464%
  • ↓ sendTransactions/openSendPageFromHome: -26%
  • ↓ sendTransactions/reviewTransactionToConfirmationPage: -97%
  • ↓ sendTransactions/longTaskCount: -100%
  • ↓ sendTransactions/longTaskTotalDuration: -100%
  • ↓ sendTransactions/longTaskMaxDuration: -100%
  • ↓ sendTransactions/tbt: -100%
  • ↓ sendTransactions/total: -94%
  • ↓ sendTransactions/inp: -22%
  • ↓ sendTransactions/lcp: -62%
  • ↓ sendTransactions/cls: -20%
  • ↓ swap/openSwapPageFromHome: -11%
  • ↑ swap/fetchAndDisplaySwapQuotes: +118%
  • ↑ swap/longTaskCount: +33%
  • ↑ swap/longTaskTotalDuration: +38%
  • ↑ swap/longTaskMaxDuration: +13%
  • ↓ swap/tbt: -26%
  • ↑ swap/total: +115%
  • ↑ swap/inp: +13%
  • ↓ swap/lcp: -72%
  • ↓ swap/cls: -92%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 assetDetails/FCP: p75 1.8s
  • 🟡 importSrpHome/INP: p75 224ms
  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 2.0s
  • 🔴 sendTransactions/INP: p75 776ms
  • 🟡 sendTransactions/FCP: p75 1.8s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 317.37 KiB (2.23%)
  • ui: 31.46 KiB (0.18%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 708 Bytes (0.04%)
  • zip: 58.62 KiB (0.27%)

Comment thread package.json
"@metamask/claims-controller": "^0.4.2",
"@metamask/client-controller": "^1.0.0",
"@metamask/client-utils": "patch:@metamask/client-utils@npm%3A1.2.0#~/.yarn/patches/@metamask-client-utils-npm-1.2.0-1adc40c3f3.patch",
"@metamask/client-utils": "^1.4.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

One way to reduce diff and the number of reviewers for this PR would be to split this dependency bump out.

@georgeweiler georgeweiler Aug 3, 2026 •

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.

Hey @FrederikBolding, that's a great point. I've opened this PR for bumping client-utils. I would really appreciate your review.

#45143

This branch was previously deployed

1 inactive deployment
pr-comment — 4d7e486d Deployed Aug 3, 2026 by georgeweiler via Publish prerelease / Publish prerelease #156298
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.

5 participants