Skip to content

test: add memory profiling CLI for extension flows#42733

Closed
pedronfigueiredo wants to merge 3 commits into
mainfrom
pnf/memory-leaks-investigation
Closed

test: add memory profiling CLI for extension flows#42733
pedronfigueiredo wants to merge 3 commits into
mainfrom
pnf/memory-leaks-investigation

Conversation

@pedronfigueiredo

Copy link
Copy Markdown
Contributor

Description

Adds a repeatable Chrome DevTools Protocol memory profiler for MetaMask extension flows. The profiler launches the existing LLM/E2E extension environment, optionally unlocks the default wallet, runs configurable route/send flows repeatedly, collects forced-GC heap and DOM counter samples, can write heap snapshots, and can fail on configurable heap/listener/node growth thresholds.

This is tooling-only. It does not include the Popover or Snow memory-leak fixes found during investigation.

Changelog

CHANGELOG entry: null

Manual testing steps

  1. Build a test extension if dist/chrome is not current: yarn build:test:webpack
  2. Run yarn llm:memory -- --help
  3. Run a profiling pass such as yarn llm:memory -- --iterations 5 --flow send-open-back --sample final --probe cdp --extension-path dist/chrome
  4. Confirm a JSON report is written under test-artifacts/memory and prints heap/listener/node deltas

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.

Validation

  • yarn test:unit test/e2e/playwright/llm-workflow/memory-profiler.test.ts
  • yarn lint:changed:fix
  • yarn llm:memory -- --help
  • yarn build:test:webpack

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

@metamaskbot metamaskbot added the team-confirmations Push issues to confirmations team label May 15, 2026
@metamaskbotv2

metamaskbotv2 Bot commented May 15, 2026

Copy link
Copy Markdown
Contributor
Builds ready [80879bd]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 14 pass · 🟡 10 warn · 🔴 0 fail)

Baseline (latest main): 51036da | Date: 5/2/2026 | Pipeline: 25933823277 | 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]

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: -77%
  • loadNewAccount/total: -77%
  • bridgeUserActions/bridge_load_page: -36%
  • bridgeUserActions/bridge_load_asset_picker: -53%
  • bridgeUserActions/bridge_search_token: -26%
  • bridgeUserActions/total: -34%
  • loadNewAccount/load_new_account: -49%
  • loadNewAccount/total: -49%
  • bridgeUserActions/bridge_load_page: +53%
  • bridgeUserActions/bridge_search_token: -26%

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

  • 🟡 loadNewAccount/FCP: p75 1.9s
  • 🟡 confirmTx/FCP: p75 1.8s
  • 🟡 bridgeUserActions/FCP: p75 1.9s
  • 🟡 confirmTx/FCP: p75 1.8s
  • 🟡 bridgeUserActions/INP: p75 288ms
  • 🟡 bridgeUserActions/FCP: p75 1.9s
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/uiStartup: -24%
  • startupStandardHome/load: -20%
  • startupStandardHome/domContentLoaded: -19%
  • startupStandardHome/firstPaint: -35%
  • startupStandardHome/backgroundConnect: -44%
  • startupStandardHome/firstReactRender: -26%
  • startupStandardHome/loadScripts: -20%
  • startupStandardHome/numNetworkReqs: -50%
  • startupStandardHome/domInteractive: -47%
  • startupStandardHome/backgroundConnect: +11%
  • startupStandardHome/firstReactRender: +11%
  • startupStandardHome/initialActions: +20%
  • startupStandardHome/setupStore: -43%
  • startupStandardHome/numNetworkReqs: -45%
  • startupPowerUserHome/uiStartup: -44%
  • startupPowerUserHome/domInteractive: -82%
  • startupPowerUserHome/backgroundConnect: -70%
  • startupPowerUserHome/setupStore: -87%
  • startupPowerUserHome/numNetworkReqs: -75%

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

  • 🟡 startupPowerUserHome/LCP: p75 2.9s
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]
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: -82%
  • onboardingImportWallet/pwFormToMetricsScreen: +542%
  • onboardingImportWallet/metricsToWalletReadyScreen: -33%
  • onboardingImportWallet/doneButtonToHomeScreen: -84%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +12%
  • onboardingImportWallet/total: -45%
  • onboardingNewWallet/srpButtonToPwForm: -77%
  • onboardingNewWallet/createPwToRecoveryScreen: +1037%
  • onboardingNewWallet/skipBackupToMetricsScreen: -67%
  • onboardingNewWallet/doneButtonToAssetList: -42%
  • onboardingNewWallet/total: -36%
  • assetDetails/assetClickToPriceChart: -76%
  • assetDetails/total: -76%
  • solanaAssetDetails/assetClickToPriceChart: -84%
  • solanaAssetDetails/total: -84%
  • importSrpHome/loginToHomeScreen: -37%
  • importSrpHome/openAccountMenuAfterLogin: -80%
  • importSrpHome/homeAfterImportWithNewWallet: -68%
  • importSrpHome/total: -65%
  • swap/openSwapPageFromHome: -98%
  • swap/fetchAndDisplaySwapQuotes: +35%
  • swap/total: +11%

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

  • 🟡 assetDetails/INP: p75 216ms
  • 🟡 assetDetails/FCP: p75 2.0s
  • 🟡 solanaAssetDetails/FCP: p75 1.9s
  • 🟡 importSrpHome/FCP: p75 1.9s
  • 🟡 swap/FCP: p75 2.0s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • dappPageLoad/pageLoadTime: +14%
Bundle size diffs [🚀 Bundle size reduced!]
  • background: -89.71 KiB (-1.37%)
  • ui: 54.32 KiB (0.57%)
  • common: -220.04 KiB (-1.74%)

pull Bot pushed a commit to Reality2byte/metamask-extension that referenced this pull request May 21, 2026
## **Description**

The `settings-route` memory profile still retained one detached Settings
page per route cycle after the shared image-listener fix. Heap snapshots
showed the full settings subtree retained through React 17's per-node
non-delegated listener on the native select:

`V8EventListener -> native_bind ->
select[data-testid="default-address-scope-dropdown"] -> parent settings
DOM subtree`

React 17 attaches per-node non-delegated listeners to form controls such
as `input`, `select`, and `textarea`. On Settings unmount, this change
detaches those retained listener targets and clears React's private host
references so a retained listener target cannot keep the entire Settings
tree alive. The cleanup is scoped to Settings and covered by a unit test
that verifies the retained select is detached and scrubbed on unmount.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. `source ~/.nvm/nvm.sh && nvm use && yarn build:test`
2. In the memory investigation worktree, with profiler tooling
intentionally excluded from this PR and the earlier memory fixes
applied: `source ~/.nvm/nvm.sh && nvm use && yarn llm:memory --
--iterations 20 --flow settings-route --sample final --probe cdp
--snapshot both --output
test-artifacts/memory/settings-route-detach-form-controls-probe-cdp-heap-20.json`
PR: MetaMask#42733

Profiler evidence:

- `settings-route` before this change, after the earlier Safe Chains and
image-listener fixes: runtime `+10.49 MiB`, JS `+6.89 MiB`, DOM nodes
`+5581`, JS listeners `+534` over 20 iterations.
- `settings-route` after this change: runtime `+5.60 MiB`, JS `+3.49
MiB`, DOM nodes `+183`, JS listeners `+55` over 20 iterations.
- Heap delta after this change no longer shows retained copies of the
settings root or `default-address-scope-dropdown`; remaining retained
`maskicon` image nodes are detached from the settings tree.

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

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

<!-- ### **Before** -->

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

<!-- ### **After** -->

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

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Adds manual DOM cleanup during Settings unmount, which could
inadvertently remove or interfere with elements if the selector scope or
ref wiring is wrong. Changes are localized to the Settings page and
covered by a new unit test.
> 
> **Overview**
> Prevents Settings-route memory retention by adding an unmount cleanup
in `SettingsLayout` that finds `input/select/textarea/img` under the
settings root, deletes React 17 internal `__reactFiber$`/`__reactProps$`
references, and removes those nodes from the DOM.
> 
> Adds a regression test that mounts Settings with the default-address
dropdown enabled, injects fake React internals onto the `<select>`,
unmounts, and asserts the element is detached and the internal keys are
cleared.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
6e95b11. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
sgextcsi pushed a commit to sgextcsi/metamask-extension-ne-regression that referenced this pull request May 21, 2026
## **Description**

The `settings-route` memory profile still retained one detached Settings
page per route cycle after the shared image-listener fix. Heap snapshots
showed the full settings subtree retained through React 17's per-node
non-delegated listener on the native select:

`V8EventListener -> native_bind ->
select[data-testid="default-address-scope-dropdown"] -> parent settings
DOM subtree`

React 17 attaches per-node non-delegated listeners to form controls such
as `input`, `select`, and `textarea`. On Settings unmount, this change
detaches those retained listener targets and clears React's private host
references so a retained listener target cannot keep the entire Settings
tree alive. The cleanup is scoped to Settings and covered by a unit test
that verifies the retained select is detached and scrubbed on unmount.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. `source ~/.nvm/nvm.sh && nvm use && yarn build:test`
2. In the memory investigation worktree, with profiler tooling
intentionally excluded from this PR and the earlier memory fixes
applied: `source ~/.nvm/nvm.sh && nvm use && yarn llm:memory --
--iterations 20 --flow settings-route --sample final --probe cdp
--snapshot both --output
test-artifacts/memory/settings-route-detach-form-controls-probe-cdp-heap-20.json`
PR: MetaMask#42733

Profiler evidence:

- `settings-route` before this change, after the earlier Safe Chains and
image-listener fixes: runtime `+10.49 MiB`, JS `+6.89 MiB`, DOM nodes
`+5581`, JS listeners `+534` over 20 iterations.
- `settings-route` after this change: runtime `+5.60 MiB`, JS `+3.49
MiB`, DOM nodes `+183`, JS listeners `+55` over 20 iterations.
- Heap delta after this change no longer shows retained copies of the
settings root or `default-address-scope-dropdown`; remaining retained
`maskicon` image nodes are detached from the settings tree.

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

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

<!-- ### **Before** -->

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

<!-- ### **After** -->

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

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Adds manual DOM cleanup during Settings unmount, which could
inadvertently remove or interfere with elements if the selector scope or
ref wiring is wrong. Changes are localized to the Settings page and
covered by a new unit test.
> 
> **Overview**
> Prevents Settings-route memory retention by adding an unmount cleanup
in `SettingsLayout` that finds `input/select/textarea/img` under the
settings root, deletes React 17 internal `__reactFiber$`/`__reactProps$`
references, and removes those nodes from the DOM.
> 
> Adds a regression test that mounts Settings with the default-address
dropdown enabled, injects fake React internals onto the `<select>`,
unmounts, and asserts the element is detached and the internal keys are
cleared.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
6e95b11. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
sgextcsi pushed a commit to sgextcsi/metamask-extension-ne-regression that referenced this pull request May 21, 2026
## **Description**

Fixes a shared Popover listener leak that retained old route trees
during send/settings route churn.

Popover registered document `keydown` and `click` listeners with capture
enabled, but removed them without matching capture options. Since
`removeEventListener` matches on event type, callback, and capture flag,
cleanup failed and leaked document listeners retained their React
closure scope.

This PR keeps the change scoped to
`ui/components/component-library/popover/popover.tsx` by:

- defining one shared capture listener options object
- adding document listeners only while the Popover is open and the
matching callback exists
- removing those listeners with the same callback and capture options
- adding a regression test that verifies unmount cleanup uses the same
listener and options captured from `addEventListener`

## **Changelog**

CHANGELOG entry: null

<!--
## **Related issues**

Fixes:
-->

## **Manual testing steps**

1. Build the test extension:
   ```bash
   source ~/.nvm/nvm.sh && nvm use
   yarn build:test:webpack
   ```
2. The `yarn llm:memory` profiler is available on the separate [profiler
PR](MetaMask#42733). With
that tooling available and this branch's `dist/chrome` build, run:
   ```bash
yarn llm:memory -- --iterations 50 --flow send-open-back --sample final
--probe cdp --wait-after-flow 500 --extension-path dist/chrome
yarn llm:memory -- --iterations 100 --flow settings-route --sample final
--probe cdp --wait-after-flow 500 --extension-path dist/chrome
   ```
3. Expected post-fix profile from the prior investigation with the [Snow
WeakMap patch](LavaMoat/snow#170) still applied:

   | Flow | Before | After |
   |---|---:|---:|
   | settings-route 50x | +118.91 MiB | +2.22 MiB rerun, +37 listeners |
   | settings-route 100x | n/a | -0.34 MiB, +34 listeners |
   | settings-route 50x paired heap snapshots | n/a | -5.84 MiB |
   | send-open-back 50x | +111.66 MiB | +0.05 MiB, +307 listeners |

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

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

### **Before**

[screenshots/recordings]

### **After**

[screenshots/recordings]
-->

## **Validation**

- `source ~/.nvm/nvm.sh && nvm use && yarn test:unit
ui/components/component-library/popover/popover.test.tsx`
- `source ~/.nvm/nvm.sh && nvm use && yarn lint:changed:fix`
- `source ~/.nvm/nvm.sh && nvm use && yarn webpack:tsc`
- `source ~/.nvm/nvm.sh && nvm use && yarn build:test:webpack`

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: scoped to Popover’s document event listener lifecycle and
adds a regression test; main risk is behavior change in when listeners
are attached (only when open and handlers provided).
> 
> **Overview**
> Fixes a Popover document-listener leak by **reusing a shared capture
options object** and ensuring `removeEventListener` is called with the
*same* callback and capture options used for `addEventListener`.
> 
> Listeners for `keydown` (Esc) and `click` (outside) are now only
attached when the popover is open and the corresponding handler prop is
provided, and a new unit test asserts the add/remove signatures match on
unmount to prevent regressions.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
0ccfb58. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@pedronfigueiredo pedronfigueiredo force-pushed the pnf/memory-leaks-investigation branch from c867ec1 to e19b750 Compare May 26, 2026 15:20
@metamaskbotv2

metamaskbotv2 Bot commented May 26, 2026

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

Baseline (latest main): 51036da | Date: 5/2/2026 | Pipeline: 26457545100 | 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]

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: -60%
  • loadNewAccount/total: -60%
  • bridgeUserActions/bridge_load_page: -73%
  • bridgeUserActions/bridge_load_asset_picker: -49%
  • bridgeUserActions/bridge_search_token: -28%
  • bridgeUserActions/total: -40%
  • loadNewAccount/load_new_account: -55%
  • loadNewAccount/total: -55%
  • bridgeUserActions/bridge_load_page: -47%
  • bridgeUserActions/bridge_load_asset_picker: -46%
  • bridgeUserActions/bridge_search_token: -36%
  • bridgeUserActions/total: -41%
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/uiStartup: -35%
  • startupStandardHome/load: -33%
  • startupStandardHome/domContentLoaded: -33%
  • startupStandardHome/domInteractive: -38%
  • startupStandardHome/firstPaint: -23%
  • startupStandardHome/backgroundConnect: -43%
  • startupStandardHome/loadScripts: -33%
  • startupStandardHome/numNetworkReqs: -50%
  • startupStandardHome/domInteractive: -59%
  • startupStandardHome/backgroundConnect: +12%
  • startupStandardHome/firstReactRender: +28%
  • startupStandardHome/initialActions: +20%
  • startupStandardHome/setupStore: -43%
  • startupStandardHome/numNetworkReqs: -21%
  • startupPowerUserHome/uiStartup: -42%
  • startupPowerUserHome/load: -15%
  • startupPowerUserHome/domContentLoaded: -15%
  • startupPowerUserHome/domInteractive: -77%
  • startupPowerUserHome/backgroundConnect: -72%
  • startupPowerUserHome/firstReactRender: +24%
  • startupPowerUserHome/loadScripts: -13%
  • startupPowerUserHome/setupStore: -83%
  • startupPowerUserHome/numNetworkReqs: -66%

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

  • 🟡 startupPowerUserHome/LCP: p75 2.8s
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]
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: -63%
  • onboardingImportWallet/pwFormToMetricsScreen: +580%
  • onboardingImportWallet/metricsToWalletReadyScreen: -30%
  • onboardingImportWallet/doneButtonToHomeScreen: -74%
  • onboardingImportWallet/total: -46%
  • onboardingNewWallet/createWalletToSocialScreen: +11%
  • onboardingNewWallet/srpButtonToPwForm: -76%
  • onboardingNewWallet/createPwToRecoveryScreen: +1110%
  • onboardingNewWallet/skipBackupToMetricsScreen: -66%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -11%
  • onboardingNewWallet/doneButtonToAssetList: -60%
  • onboardingNewWallet/total: -49%
  • assetDetails/assetClickToPriceChart: -51%
  • assetDetails/total: -51%
  • solanaAssetDetails/assetClickToPriceChart: -78%
  • solanaAssetDetails/total: -78%
  • importSrpHome/loginToHomeScreen: -43%
  • importSrpHome/openAccountMenuAfterLogin: -77%
  • importSrpHome/homeAfterImportWithNewWallet: -76%
  • importSrpHome/total: -71%
  • swap/openSwapPageFromHome: -97%
  • swap/fetchAndDisplaySwapQuotes: +36%
  • swap/total: +12%

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

  • 🟡 onboardingImportWallet/INP: p75 224ms
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • dappPageLoad/pageLoadTime: +17%
Bundle size diffs [🚀 Bundle size reduced!]
  • background: -1.03 MiB (-15.72%)
  • ui: -924 Bytes (-0.01%)
  • common: -488.41 KiB (-3.94%)

@sonarqubecloud

Copy link
Copy Markdown

@metamaskbotv2

metamaskbotv2 Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor
Builds ready [099c069] [reused from e19b750]
Deprecated Browserify fallback builds
⚡ Performance Benchmarks (Total: 🟢 22 pass · 🟡 2 warn · 🔴 0 fail)

Baseline (latest main): 51036da | Date: 5/2/2026 | Pipeline: 26461164888 | 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]

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: -60%
  • loadNewAccount/total: -60%
  • bridgeUserActions/bridge_load_page: -73%
  • bridgeUserActions/bridge_load_asset_picker: -49%
  • bridgeUserActions/bridge_search_token: -28%
  • bridgeUserActions/total: -40%
  • loadNewAccount/load_new_account: -55%
  • loadNewAccount/total: -55%
  • bridgeUserActions/bridge_load_page: -47%
  • bridgeUserActions/bridge_load_asset_picker: -46%
  • bridgeUserActions/bridge_search_token: -36%
  • bridgeUserActions/total: -41%
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/uiStartup: -35%
  • startupStandardHome/load: -33%
  • startupStandardHome/domContentLoaded: -33%
  • startupStandardHome/domInteractive: -38%
  • startupStandardHome/firstPaint: -23%
  • startupStandardHome/backgroundConnect: -43%
  • startupStandardHome/loadScripts: -33%
  • startupStandardHome/numNetworkReqs: -50%
  • startupStandardHome/domInteractive: -59%
  • startupStandardHome/backgroundConnect: +12%
  • startupStandardHome/firstReactRender: +28%
  • startupStandardHome/initialActions: +20%
  • startupStandardHome/setupStore: -43%
  • startupStandardHome/numNetworkReqs: -21%
  • startupPowerUserHome/uiStartup: -42%
  • startupPowerUserHome/load: -15%
  • startupPowerUserHome/domContentLoaded: -15%
  • startupPowerUserHome/domInteractive: -77%
  • startupPowerUserHome/backgroundConnect: -72%
  • startupPowerUserHome/firstReactRender: +24%
  • startupPowerUserHome/loadScripts: -13%
  • startupPowerUserHome/setupStore: -83%
  • startupPowerUserHome/numNetworkReqs: -66%

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

  • 🟡 startupPowerUserHome/LCP: p75 2.8s
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]
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: -63%
  • onboardingImportWallet/pwFormToMetricsScreen: +580%
  • onboardingImportWallet/metricsToWalletReadyScreen: -30%
  • onboardingImportWallet/doneButtonToHomeScreen: -74%
  • onboardingImportWallet/total: -46%
  • onboardingNewWallet/createWalletToSocialScreen: +11%
  • onboardingNewWallet/srpButtonToPwForm: -76%
  • onboardingNewWallet/createPwToRecoveryScreen: +1110%
  • onboardingNewWallet/skipBackupToMetricsScreen: -66%
  • onboardingNewWallet/agreeButtonToOnboardingSuccess: -11%
  • onboardingNewWallet/doneButtonToAssetList: -60%
  • onboardingNewWallet/total: -49%
  • assetDetails/assetClickToPriceChart: -51%
  • assetDetails/total: -51%
  • solanaAssetDetails/assetClickToPriceChart: -78%
  • solanaAssetDetails/total: -78%
  • importSrpHome/loginToHomeScreen: -43%
  • importSrpHome/openAccountMenuAfterLogin: -77%
  • importSrpHome/homeAfterImportWithNewWallet: -76%
  • importSrpHome/total: -71%
  • swap/openSwapPageFromHome: -97%
  • swap/fetchAndDisplaySwapQuotes: +36%
  • swap/total: +12%

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

  • 🟡 onboardingImportWallet/INP: p75 224ms
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • dappPageLoad/pageLoadTime: +17%
Bundle size diffs [🚀 Bundle size reduced!]
  • background: -1.03 MiB (-15.72%)
  • ui: -924 Bytes (-0.01%)
  • common: -488.41 KiB (-3.94%)

@github-actions github-actions Bot locked and limited conversation to collaborators Jun 2, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

size-XL team-confirmations Push issues to confirmations team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants