Skip to content

release(runway): cherry-pick feat: gate scam questionnaire behind LaunchDarkly flag cp-13.40.0 - #44582

Merged
HowardBraham merged 2 commits into
release/13.40.0from
runway-cherry-pick-13.40.0-1784228387
Jul 16, 2026
Merged

HowardBraham merged 2 commits into
release/13.40.0from
runway-cherry-pick-13.40.0-1784228387

Conversation

@runway-github

@runway-github runway-github Bot commented Jul 16, 2026 •

Copy link
Copy Markdown
Contributor

Description

The scam questionnaire (introduced in #43822) currently ships
hardcoded-on, gated only by client-side conditions (MetaMask origin +
transfer type + Blockaid Malicious verdict). There is no server-side
rollout control or kill-switch — if the questionnaire causes unexpected
issues at launch, our only remediation is a client release.

This PR adds a LaunchDarkly-backed remote feature flag
(productSafetyScamQuestionnaireEnabled) as a rollout gate on top of
the existing conditions. Flag off (the default) → users see the
pre-existing Blockaid danger alert modal exactly as they did before
#43822. Flag on → users see the questionnaire. footer.tsx is
untouched; the flag check is folded into isScamQuestionnaireRequired
inside useSendScamQuestionnaire, so the existing branch point in the
footer keys off the same boolean it already reads.

Implementation notes

  • Uses useABTest with { trackExposure: false }. This is a staged
    rollout, not an A/B test — Experiment Viewed events are suppressed so
    the experiments dashboard stays clean. useABTest is used intentionally
    so a future A/B experiment is a small diff (add variants, register an
    analytics mapping, flip trackExposure back on).
  • Safe fallback: when LaunchDarkly is unreachable or the flag is unset,
    useABTest resolves to the local control variant with
    showQuestionnaire: false, matching the "default off in prod"
    acceptance criterion.
  • Config lives in shared/lib/ab-testing/configs/scam-questionnaire.ts
    alongside sibling A/B test configs. No analytics mapping is registered
    (rollout, not experiment).
  • E2E registry entry is set with inProd: false and defaults to 100%
    control. This should be flipped to inProd: true once the LaunchDarkly
    flag is fully configured for the production environment.

Changelog

CHANGELOG entry: null

Related issues

Fixes:
PSAFE-558

Manual testing steps

Scenario A — flag off (default; existing modal path)

  1. Ensure .manifest-overrides.json does not override
    productSafetyScamQuestionnaireEnabled (or the file does not exist).
  2. Build and load the extension.
  3. Initiate a send transaction from within MetaMask to a recipient that
    Blockaid flags as Malicious.
  4. On the confirmation screen, click the red "Confirm" button.
  5. Verify the pre-existing "Are you sure?" Blockaid danger alert modal
    appears — not the scam questionnaire.

Scenario B — flag on (questionnaire path)

  1. Create or update .manifest-overrides.json in the repo root:
    {
      "_flags": {
        "remoteFeatureFlags": {
          "productSafetyScamQuestionnaireEnabled": {
            "name": "treatment",
            "value": { "showQuestionnaire": true }
          }
        }
      }
    }
  2. Ensure .metamaskrc has
    MANIFEST_OVERRIDES=.manifest-overrides.json.
  3. Rebuild and reload the extension.
  4. Repeat the send flow from Scenario A.
  5. Verify the scam questionnaire modal appears when clicking the red
    Confirm button — not the pre-existing alert modal.
  6. Complete the questionnaire (clean pass, bypass, or reject) and verify
    behavior matches the current questionnaire flow (unchanged by this PR).

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
Changes which safety UI appears on malicious wallet-initiated sends at
confirm time; default-off control limits blast radius but
misconfiguration could hide the questionnaire or leave it on
unexpectedly.

Overview
Adds a LaunchDarkly remote rollout
(productSafetyScamQuestionnaireEnabled) so the send-flow scam
questionnaire is not always on. New shared config maps control →
questionnaire off and treatment → on.

useSendScamQuestionnaire now reads the flag via useABTest
with trackExposure: false (staged rollout, not an experiment).
isScamQuestionnaireRequired only stays true when
variant.showQuestionnaire is true in addition to the existing
MetaMask send + Blockaid malicious + unconfirmed alert checks. Flag off
or unset → users keep the prior Blockaid danger alert modal path; the
confirm footer still branches on the same boolean.

Registers the flag in the E2E feature-flag registry (inProd: false, default control). Unit tests cover control vs treatment and the
footer test sets remoteFeatureFlags to treatment so the
questionnaire path still passes.

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

[8a1ccdc](https://github.com/MetaMask/metamask-extension/commit/8a1ccdc82c904430e81f23885b7c8e7709cff09c)

…nchDarkly flag cp-13.40.0 (#44496)

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

The scam questionnaire (introduced in #43822) currently ships
hardcoded-on, gated only by client-side conditions (MetaMask origin +
transfer type + Blockaid `Malicious` verdict). There is no server-side
rollout control or kill-switch — if the questionnaire causes unexpected
issues at launch, our only remediation is a client release.

This PR adds a LaunchDarkly-backed remote feature flag
(`productSafetyScamQuestionnaireEnabled`) as a rollout gate on top of
the existing conditions. Flag off (the default) → users see the
pre-existing Blockaid danger alert modal exactly as they did before
#43822. Flag on → users see the questionnaire. `footer.tsx` is
untouched; the flag check is folded into `isScamQuestionnaireRequired`
inside `useSendScamQuestionnaire`, so the existing branch point in the
footer keys off the same boolean it already reads.

### Implementation notes

- Uses `useABTest` with `{ trackExposure: false }`. This is a staged
rollout, not an A/B test — `Experiment Viewed` events are suppressed so
the experiments dashboard stays clean. `useABTest` is used intentionally
so a future A/B experiment is a small diff (add variants, register an
analytics mapping, flip `trackExposure` back on).
- Safe fallback: when LaunchDarkly is unreachable or the flag is unset,
`useABTest` resolves to the local `control` variant with
`showQuestionnaire: false`, matching the "default off in prod"
acceptance criterion.
- Config lives in `shared/lib/ab-testing/configs/scam-questionnaire.ts`
alongside sibling A/B test configs. No analytics mapping is registered
(rollout, not experiment).
- E2E registry entry is set with `inProd: false` and defaults to 100%
control. This should be flipped to `inProd: true` once the LaunchDarkly
flag is fully configured for the production environment.

## **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:
[PSAFE-558](https://consensyssoftware.atlassian.net/browse/PSAFE-558)

## **Manual testing steps**

### Scenario A — flag off (default; existing modal path)

1. Ensure `.manifest-overrides.json` does not override
`productSafetyScamQuestionnaireEnabled` (or the file does not exist).
2. Build and load the extension.
3. Initiate a send transaction from within MetaMask to a recipient that
Blockaid flags as `Malicious`.
4. On the confirmation screen, click the red "Confirm" button.
5. Verify the pre-existing "Are you sure?" Blockaid danger alert modal
appears — not the scam questionnaire.

### Scenario B — flag on (questionnaire path)

1. Create or update `.manifest-overrides.json` in the repo root:
   ```json
   {
     "_flags": {
       "remoteFeatureFlags": {
         "productSafetyScamQuestionnaireEnabled": {
           "name": "treatment",
           "value": { "showQuestionnaire": true }
         }
       }
     }
   }
   ```
2. Ensure `.metamaskrc` has
`MANIFEST_OVERRIDES=.manifest-overrides.json`.
3. Rebuild and reload the extension.
4. Repeat the send flow from Scenario A.
5. Verify the scam questionnaire modal appears when clicking the red
Confirm button — not the pre-existing alert modal.
6. Complete the questionnaire (clean pass, bypass, or reject) and verify
behavior matches the current questionnaire flow (unchanged by this PR).

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/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-extension/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.


[PSAFE-558]:
https://consensyssoftware.atlassian.net/browse/PSAFE-558?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes which safety UI appears on malicious wallet-initiated sends at
confirm time; default-off control limits blast radius but
misconfiguration could hide the questionnaire or leave it on
unexpectedly.
> 
> **Overview**
> Adds a **LaunchDarkly remote rollout**
(`productSafetyScamQuestionnaireEnabled`) so the send-flow scam
questionnaire is not always on. New shared config maps **control** →
questionnaire off and **treatment** → on.
> 
> **`useSendScamQuestionnaire`** now reads the flag via **`useABTest`**
with **`trackExposure: false`** (staged rollout, not an experiment).
**`isScamQuestionnaireRequired`** only stays true when
**`variant.showQuestionnaire`** is true in addition to the existing
MetaMask send + Blockaid malicious + unconfirmed alert checks. Flag off
or unset → users keep the prior Blockaid danger alert modal path; the
confirm footer still branches on the same boolean.
> 
> Registers the flag in the **E2E feature-flag registry** (`inProd:
false`, default control). Unit tests cover control vs treatment and the
footer test sets **`remoteFeatureFlags`** to **`treatment`** so the
questionnaire path still passes.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
c8f1394. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@runway-github
runway-github Bot requested review from a team as code owners July 16, 2026 18:59
@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.

@metamask-ci metamask-ci Bot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Jul 16, 2026
HowardBraham
HowardBraham previously approved these changes Jul 16, 2026
@HowardBraham
HowardBraham enabled auto-merge (squash) July 16, 2026 19:01
@metamask-ci

metamask-ci Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor
Builds ready [dd1c823]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 16 pass · 🟡 8 warn · 🔴 0 fail)

Baseline (latest main): 4c7819a | Date: 7/16/2026 | Pipeline: 29526239624 | 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]
🟡 bridge_search_token

📈 Results compared to the previous 5 runs on main

  • ↑ loadNewAccount/load_new_account: +72%
  • ↑ loadNewAccount/total: +72%
  • ↓ loadNewAccount/inp: -23%
  • ↑ loadNewAccount/lcp: +82%
  • ↑ confirmTx/confirm_tx: +46%
  • ↑ confirmTx/total: +46%
  • ↑ confirmTx/lcp: +13%
  • ↓ bridgeUserActions/bridge_load_asset_picker: -10%
  • ↓ bridgeUserActions/longTaskCount: -17%
  • ↓ bridgeUserActions/longTaskTotalDuration: -23%
  • ↓ bridgeUserActions/longTaskMaxDuration: -14%
  • ↓ bridgeUserActions/tbt: -37%
  • ↑ bridgeUserActions/lcp: +11%
  • ↑ loadNewAccount/load_new_account: +774%
  • ↑ loadNewAccount/total: +774%
  • ↓ loadNewAccount/inp: -31%
  • ↑ loadNewAccount/lcp: +1052%
  • ↑ confirmTx/confirm_tx: +59%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +59%
  • ↑ confirmTx/lcp: +1232%
  • ↑ bridgeUserActions/bridge_load_page: +111%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +118%
  • ↑ bridgeUserActions/bridge_search_token: +199%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +169%
  • ↑ bridgeUserActions/inp: +1683%
  • ↓ bridgeUserActions/fcp: -43%
  • ↑ bridgeUserActions/lcp: +1256%

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

  • 🟡 loadNewAccount/FCP: p75 1.9s
  • 🟡 confirmTx/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]
🟡 loadScripts
startupPowerUserHome
[Sentry log · main/release]
–🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ startupStandardHome/uiStartup: +12%
  • ↑ startupStandardHome/load: +13%
  • ↑ startupStandardHome/domContentLoaded: +13%
  • ↑ startupStandardHome/domInteractive: +11%
  • ↑ startupStandardHome/backgroundConnect: +17%
  • ↑ startupStandardHome/firstReactRender: +14%
  • ↑ startupStandardHome/initialActions: +15%
  • ↑ startupStandardHome/loadScripts: +14%
  • ↑ startupStandardHome/setupStore: +23%
  • ↑ startupStandardHome/numNetworkReqs: +12%
  • ↑ startupStandardHome/longTaskCount: +15%
  • ↑ startupStandardHome/longTaskTotalDuration: +16%
  • ↑ startupStandardHome/longTaskMaxDuration: +15%
  • ↑ startupStandardHome/tbt: +16%
  • ↑ startupStandardHome/inp: +10%
  • ↑ startupStandardHome/fcp: +13%
  • ↓ startupStandardHome/lcp: -47%
  • ↑ startupStandardHome/initialActions: +11%
  • ↑ startupStandardHome/fcp: +10%
  • ↓ startupPowerUserHome/uiStartup: -27%
  • ↓ startupPowerUserHome/load: -28%
  • ↓ startupPowerUserHome/domContentLoaded: -28%
  • ↓ startupPowerUserHome/domInteractive: -31%
  • ↓ startupPowerUserHome/backgroundConnect: -38%
  • ↓ startupPowerUserHome/firstReactRender: -29%
  • ↓ startupPowerUserHome/loadScripts: -28%
  • ↓ startupPowerUserHome/setupStore: -13%
  • ↓ startupPowerUserHome/inp: -17%
  • ↓ startupPowerUserHome/fcp: -30%
  • ↓ startupPowerUserHome/lcp: -26%

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

  • 🟡 startupPowerUserHome/LCP: p75 2.6s
User Journey Benchmarks · Samples: 5 · mock API
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/pwFormToMetricsScreen: -11%
  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -88%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -99%
  • ↓ onboardingImportWallet/longTaskCount: -100%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -100%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -100%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -88%
  • ↑ onboardingNewWallet/srpButtonToPwForm: +15%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -28%
  • ↓ onboardingNewWallet/longTaskCount: -75%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -84%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -60%
  • ↓ onboardingNewWallet/tbt: -92%
  • ↓ onboardingNewWallet/total: -26%
  • ↓ solanaAssetDetails/assetClickToPriceChart: -39%
  • ↓ solanaAssetDetails/total: -39%
  • ↓ solanaAssetDetails/inp: -39%
  • ↓ solanaAssetDetails/fcp: -19%
  • ↓ solanaAssetDetails/lcp: -12%
  • ↓ solanaAssetDetails/cls: -86%
  • ↓ importSrpHome/loginToHomeScreen: -50%
  • ↓ importSrpHome/homeAfterImportWithNewWallet: -60%
  • ↓ importSrpHome/longTaskCount: -74%
  • ↓ importSrpHome/longTaskTotalDuration: -75%
  • ↓ importSrpHome/longTaskMaxDuration: -44%
  • ↓ importSrpHome/tbt: -79%
  • ↓ importSrpHome/total: -59%
  • ↓ importSrpHome/inp: -41%
  • ↓ importSrpHome/fcp: -31%
  • ↓ importSrpHome/lcp: -21%
  • ↓ importSrpHome/cls: -55%
  • ↓ sendTransactions/openSendPageFromHome: -47%
  • ↓ sendTransactions/selectTokenToSendFormLoaded: -33%
  • ↓ sendTransactions/reviewTransactionToConfirmationPage: -24%
  • ↓ sendTransactions/longTaskCount: -100%
  • ↓ sendTransactions/longTaskTotalDuration: -100%
  • ↓ sendTransactions/longTaskMaxDuration: -100%
  • ↓ sendTransactions/tbt: -100%
  • ↓ sendTransactions/total: -24%
  • ↓ sendTransactions/inp: -47%
  • ↓ sendTransactions/fcp: -25%
  • ↓ sendTransactions/lcp: -76%
  • ↓ sendTransactions/cls: -86%
  • ↑ swap/openSwapPageFromHome: +23%
  • ↑ swap/fetchAndDisplaySwapQuotes: +67%
  • ↓ swap/longTaskCount: -100%
  • ↓ swap/longTaskTotalDuration: -100%
  • ↓ swap/longTaskMaxDuration: -100%
  • ↓ swap/tbt: -100%
  • ↑ swap/total: +67%
  • ↓ swap/inp: -25%
  • ↓ swap/fcp: -23%
  • ↑ swap/lcp: +124%
  • ↓ swap/cls: -86%

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

  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle sizes
  • background: 14.22 MiB
  • ui: 17.06 MiB
  • common: 0 Bytes
  • other: 998.07 KiB
  • contentScripts: 1.87 MiB
  • zip: 27.07 MiB
No matching bundle-size baseline was found in the history data, so diff values are omitted.

@sonarqubecloud

Copy link
Copy Markdown

@metamask-ci

metamask-ci Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor
Builds ready [5391abf] [reused from dd1c823]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 16 pass · 🟡 8 warn · 🔴 0 fail)

Baseline (latest main): 5d12649 | Date: 7/16/2026 | Pipeline: 29528042728 | 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]
🟡 bridge_search_token

📈 Results compared to the previous 5 runs on main

  • ↑ loadNewAccount/load_new_account: +74%
  • ↑ loadNewAccount/total: +74%
  • ↓ loadNewAccount/inp: -23%
  • ↑ loadNewAccount/fcp: +11%
  • ↑ loadNewAccount/lcp: +87%
  • ↑ confirmTx/confirm_tx: +46%
  • ↑ confirmTx/total: +46%
  • ↑ confirmTx/lcp: +13%
  • ↓ bridgeUserActions/longTaskCount: -17%
  • ↓ bridgeUserActions/longTaskTotalDuration: -23%
  • ↓ bridgeUserActions/longTaskMaxDuration: -14%
  • ↓ bridgeUserActions/tbt: -36%
  • ↑ bridgeUserActions/lcp: +11%
  • ↑ loadNewAccount/load_new_account: +782%
  • ↑ loadNewAccount/total: +782%
  • ↓ loadNewAccount/inp: -31%
  • ↑ loadNewAccount/lcp: +1088%
  • ↑ confirmTx/confirm_tx: +60%
  • ↓ confirmTx/longTaskCount: -100%
  • ↓ confirmTx/longTaskTotalDuration: -100%
  • ↓ confirmTx/longTaskMaxDuration: -100%
  • ↓ confirmTx/tbt: -100%
  • ↑ confirmTx/total: +60%
  • ↑ confirmTx/lcp: +1234%
  • ↑ bridgeUserActions/bridge_load_page: +106%
  • ↑ bridgeUserActions/bridge_load_asset_picker: +131%
  • ↑ bridgeUserActions/bridge_search_token: +197%
  • ↓ bridgeUserActions/longTaskCount: -100%
  • ↓ bridgeUserActions/longTaskTotalDuration: -100%
  • ↓ bridgeUserActions/longTaskMaxDuration: -100%
  • ↓ bridgeUserActions/tbt: -100%
  • ↑ bridgeUserActions/total: +175%
  • ↑ bridgeUserActions/inp: +1790%
  • ↓ bridgeUserActions/fcp: -42%
  • ↑ bridgeUserActions/lcp: +1256%

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

  • 🟡 loadNewAccount/FCP: p75 1.9s
  • 🟡 confirmTx/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]
🟡 loadScripts
startupPowerUserHome
[Sentry log · main/release]
–🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • ↑ startupStandardHome/uiStartup: +12%
  • ↑ startupStandardHome/load: +13%
  • ↑ startupStandardHome/domContentLoaded: +13%
  • ↑ startupStandardHome/domInteractive: +12%
  • ↑ startupStandardHome/backgroundConnect: +17%
  • ↑ startupStandardHome/firstReactRender: +15%
  • ↑ startupStandardHome/initialActions: +15%
  • ↑ startupStandardHome/loadScripts: +14%
  • ↑ startupStandardHome/setupStore: +25%
  • ↑ startupStandardHome/numNetworkReqs: +12%
  • ↑ startupStandardHome/longTaskCount: +15%
  • ↑ startupStandardHome/longTaskTotalDuration: +16%
  • ↑ startupStandardHome/longTaskMaxDuration: +15%
  • ↑ startupStandardHome/tbt: +16%
  • ↑ startupStandardHome/inp: +10%
  • ↑ startupStandardHome/fcp: +13%
  • ↓ startupStandardHome/lcp: -47%
  • ↑ startupStandardHome/domInteractive: +26%
  • ↑ startupStandardHome/initialActions: +11%
  • ↑ startupStandardHome/setupStore: +12%
  • ↑ startupStandardHome/fcp: +26%
  • ↓ startupPowerUserHome/uiStartup: -27%
  • ↓ startupPowerUserHome/load: -27%
  • ↓ startupPowerUserHome/domContentLoaded: -27%
  • ↓ startupPowerUserHome/domInteractive: -31%
  • ↓ startupPowerUserHome/backgroundConnect: -32%
  • ↓ startupPowerUserHome/firstReactRender: -29%
  • ↓ startupPowerUserHome/loadScripts: -26%
  • ↓ startupPowerUserHome/setupStore: -14%
  • ↓ startupPowerUserHome/inp: -15%
  • ↓ startupPowerUserHome/fcp: -30%
  • ↓ startupPowerUserHome/lcp: -25%

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

  • 🟡 startupPowerUserHome/LCP: p75 2.6s
User Journey Benchmarks · Samples: 5 · mock API
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/pwFormToMetricsScreen: -11%
  • ↓ onboardingImportWallet/metricsToWalletReadyScreen: -23%
  • ↓ onboardingImportWallet/doneButtonToHomeScreen: -86%
  • ↓ onboardingImportWallet/openAccountMenuToAccountListLoaded: -99%
  • ↓ onboardingImportWallet/longTaskCount: -100%
  • ↓ onboardingImportWallet/longTaskTotalDuration: -100%
  • ↓ onboardingImportWallet/longTaskMaxDuration: -100%
  • ↓ onboardingImportWallet/tbt: -100%
  • ↓ onboardingImportWallet/total: -86%
  • ↑ onboardingNewWallet/srpButtonToPwForm: +10%
  • ↓ onboardingNewWallet/doneButtonToAssetList: -29%
  • ↓ onboardingNewWallet/longTaskCount: -75%
  • ↓ onboardingNewWallet/longTaskTotalDuration: -85%
  • ↓ onboardingNewWallet/longTaskMaxDuration: -69%
  • ↓ onboardingNewWallet/tbt: -93%
  • ↓ onboardingNewWallet/total: -26%
  • ↓ solanaAssetDetails/assetClickToPriceChart: -41%
  • ↓ solanaAssetDetails/total: -41%
  • ↓ solanaAssetDetails/inp: -33%
  • ↓ solanaAssetDetails/fcp: -19%
  • ↓ solanaAssetDetails/lcp: -14%
  • ↓ solanaAssetDetails/cls: -86%
  • ↓ importSrpHome/loginToHomeScreen: -45%
  • ↓ importSrpHome/openAccountMenuAfterLogin: -15%
  • ↓ importSrpHome/homeAfterImportWithNewWallet: -67%
  • ↓ importSrpHome/longTaskCount: -73%
  • ↓ importSrpHome/longTaskTotalDuration: -72%
  • ↓ importSrpHome/longTaskMaxDuration: -44%
  • ↓ importSrpHome/tbt: -76%
  • ↓ importSrpHome/total: -65%
  • ↓ importSrpHome/inp: -39%
  • ↓ importSrpHome/fcp: -31%
  • ↓ importSrpHome/lcp: -17%
  • ↓ importSrpHome/cls: -29%
  • ↓ sendTransactions/openSendPageFromHome: -47%
  • ↓ sendTransactions/selectTokenToSendFormLoaded: -33%
  • ↓ sendTransactions/reviewTransactionToConfirmationPage: -49%
  • ↓ sendTransactions/longTaskCount: -100%
  • ↓ sendTransactions/longTaskTotalDuration: -100%
  • ↓ sendTransactions/longTaskMaxDuration: -100%
  • ↓ sendTransactions/tbt: -100%
  • ↓ sendTransactions/total: -48%
  • ↓ sendTransactions/inp: -45%
  • ↓ sendTransactions/fcp: -25%
  • ↓ sendTransactions/lcp: -72%
  • ↓ sendTransactions/cls: -86%
  • ↑ swap/openSwapPageFromHome: +36%
  • ↑ swap/fetchAndDisplaySwapQuotes: +69%
  • ↓ swap/longTaskCount: -100%
  • ↓ swap/longTaskTotalDuration: -100%
  • ↓ swap/longTaskMaxDuration: -100%
  • ↓ swap/tbt: -100%
  • ↑ swap/total: +69%
  • ↓ swap/inp: -23%
  • ↓ swap/fcp: -25%
  • ↑ swap/lcp: +531%
  • ↓ swap/cls: -86%

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

  • 🟡 assetDetails/FCP: p75 1.9s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle sizes
  • background: 14.22 MiB
  • ui: 17.06 MiB
  • common: 0 Bytes
  • other: 998.07 KiB
  • contentScripts: 1.87 MiB
  • zip: 27.07 MiB
No matching bundle-size baseline was found in the history data, so diff values are omitted.

@HowardBraham
HowardBraham merged commit 6d442d4 into release/13.40.0 Jul 16, 2026
194 checks passed
@HowardBraham
HowardBraham deleted the runway-cherry-pick-13.40.0-1784228387 branch July 16, 2026 19:49
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 16, 2026
@metamaskbot metamaskbot added the release-13.40.0 Issue or pull request that will be included in release 13.40.0 label Jul 17, 2026
@gauthierpetetin

Copy link
Copy Markdown
Contributor

No release label on PR. Adding release label release-13.40.0 on PR, as PR was cherry-picked in branch 13.40.0.

This branch was previously deployed

1 inactive deployment
pr-comment — 5391abfb Deployed Jul 16, 2026 by metamaskbot via Publish prerelease / Publish prerelease #152772
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-13.40.0 Issue or pull request that will be included in release 13.40.0 risk:low team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants