Repository: MetaMask/metamask-extension
Pull request #32493: test: migrate benchmark tests to anvil and remove more ganache old references
Author: login: seaona
Labels: name: team-qa
description: QA team
name: skip-e2e-quality-gate
name: no-changelog
description: no-changelog Indicates no external facing user changes, therefore no changelog documentation needed
Created: 2025-05-03T09:21:35Z | Merged: 2025-05-05T17:24:05Z

<!--
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**
Migrate benchmark specs to use anvil instead of ganache, and remove more ganache old references.

Skipping e2e quality gate as touching several spec files, but mostly they are variable renames.


[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32493?quickstart=1)

## **Related issues**

Fixes: https://github.com/MetaMask/metamask-extension/issues/31761

## **Manual testing steps**

1. Test should continue to pass

## **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
- [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.



Diff:
diff --git a/.github/workflows/run-benchmarks.yml b/.github/workflows/run-benchmarks.yml
index da1393ddcf99..353e932a8a2f 100644
--- a/.github/workflows/run-benchmarks.yml
+++ b/.github/workflows/run-benchmarks.yml
@@ -30,6 +30,10 @@ jobs:
           is-high-risk-environment: false
           skip-allow-scripts: true
 
+      # not installed by checkout-and-setup when cache is restored
+      - name: Install anvil
+        run: yarn foundryup
+
       - name: Download artifact ${{ env.ARTIFACT_NAME }}
         uses: actions/download-artifact@v4
         with:
diff --git a/test/e2e/benchmark.mjs b/test/e2e/benchmark.mjs
index 38dcb2d94fa0..4748500a42e7 100644
--- a/test/e2e/benchmark.mjs
+++ b/test/e2e/benchmark.mjs
@@ -34,7 +34,6 @@ async function measurePage(pageName, pageLoads) {
     {
       fixtures: new FixtureBuilder().build(),
       disableServerMochaToBackground: true,
-      localNodeOptions: 'ganache',
       title: 'benchmark-pageload',
     },
     async ({ driver }) => {
diff --git a/test/e2e/flask/multichain-api/testHelpers.ts b/test/e2e/flask/multichain-api/testHelpers.ts
index acdc4b01ddfa..655d4369624a 100644
--- a/test/e2e/flask/multichain-api/testHelpers.ts
+++ b/test/e2e/flask/multichain-api/testHelpers.ts
@@ -5,15 +5,8 @@ import {
   KnownNotifications,
 } from '@metamask/chain-agnostic-permission';
 import { JsonRpcRequest } from '@metamask/utils';
-import {
-  convertETHToHexGwei,
-  multipleGanacheOptions,
-  PRIVATE_KEY,
-  regularDelayMs,
-  WINDOW_TITLES,
-} from '../../helpers';
+import { regularDelayMs, WINDOW_TITLES } from '../../helpers';
 import { Driver } from '../../webdriver/driver';
-import { DEFAULT_LOCAL_NODE_ETH_BALANCE_DEC } from '../../constants';
 import {
   CONTENT_SCRIPT,
   METAMASK_CAIP_MULTICHAIN_PROVIDER,
@@ -39,27 +32,20 @@ export const DEFAULT_MULTICHAIN_TEST_DAPP_FIXTURE_OPTIONS = {
   ],
   localNodeOptions: [
     {
-      type: 'ganache',
-      options: {
-        secretKey: PRIVATE_KEY,
-        balance: convertETHToHexGwei(DEFAULT_LOCAL_NODE_ETH_BALANCE_DEC),
-        accounts: multipleGanacheOptions.accounts,
-      },
+      type: 'anvil',
     },
     {
-      type: 'ganache',
+      type: 'anvil',
       options: {
         port: 8546,
         chainId: 1338,
-        accounts: multipleGanacheOptions.accounts,
       },
     },
     {
-      type: 'ganache',
+      type: 'anvil',
       options: {
         port: 7777,
         chainId: 1000,
-        accounts: multipleGanacheOptions.accounts,
       },
     },
   ],
diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js
index 3ede30ce11aa..f75bbb173a60 100644
--- a/test/e2e/helpers.js
+++ b/test/e2e/helpers.js
@@ -544,7 +544,7 @@ const PRIVATE_KEY_TWO =
 const ACCOUNT_1 = '0x5cfe73b6021e818b776b421b1c4db2474086a7e1';
 const ACCOUNT_2 = '0x09781764c08de8ca82e156bbf156a3ca217c7950';
 
-const defaultGanacheOptionsForType2Transactions = {
+const defaultOptionsForType2Transactions = {
   // EVM version that supports type 2 transactions (EIP1559)
   hardfork: 'london',
 };
@@ -941,7 +941,7 @@ module.exports = {
   switchToOrOpenDapp,
   connectToDapp,
   multipleGanacheOptions,
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   sendTransaction,
   sendScreenToConfirmScreen,
   unlockWallet,
diff --git a/test/e2e/json-rpc/eth_newBlockFilter.spec.ts b/test/e2e/json-rpc/eth_newBlockFilter.spec.ts
index 5766c1e0cb6e..e5898fd33584 100644
--- a/test/e2e/json-rpc/eth_newBlockFilter.spec.ts
+++ b/test/e2e/json-rpc/eth_newBlockFilter.spec.ts
@@ -5,7 +5,7 @@ import FixtureBuilder from '../fixture-builder';
 import { Driver } from '../webdriver/driver';
 
 describe('eth_newBlockFilter', function () {
-  const ganacheOptions: { blockTime: number } = {
+  const localNodeOptions: { blockTime: number } = {
     blockTime: 0.1,
   };
   it('executes a new block filter call', async function () {
@@ -15,7 +15,7 @@ describe('eth_newBlockFilter', function () {
         fixtures: new FixtureBuilder()
           .withPermissionControllerConnectedToTestDapp()
           .build(),
-        localNodeOptions: ganacheOptions,
+        localNodeOptions,
         title: this.test?.fullTitle(),
       },
       async ({ driver }: { driver: Driver }) => {
diff --git a/test/e2e/tests/confirmations/helpers.ts b/test/e2e/tests/confirmations/helpers.ts
index c15e27aaa236..e99eea7353ec 100644
--- a/test/e2e/tests/confirmations/helpers.ts
+++ b/test/e2e/tests/confirmations/helpers.ts
@@ -1,7 +1,7 @@
 import { TransactionEnvelopeType } from '@metamask/transaction-controller';
 import FixtureBuilder from '../../fixture-builder';
 import {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   withFixtures,
 } from '../../helpers';
 import { MockedEndpoint, Mockttp } from '../../mock-e2e';
@@ -44,7 +44,7 @@ export function withTransactionEnvelopeTypeFixtures(
       localNodeOptions:
         transactionEnvelopeType === TransactionEnvelopeType.legacy
           ? {}
-          : defaultGanacheOptionsForType2Transactions,
+          : defaultOptionsForType2Transactions,
       ...(smartContract && { smartContract }),
       ...(mocks && { testSpecificMock: mocks }),
       title,
diff --git a/test/e2e/tests/confirmations/transactions/contract-deployment-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/contract-deployment-redesign.spec.ts
index 05c92df5e0e8..8173e4909f63 100644
--- a/test/e2e/tests/confirmations/transactions/contract-deployment-redesign.spec.ts
+++ b/test/e2e/tests/confirmations/transactions/contract-deployment-redesign.spec.ts
@@ -9,7 +9,7 @@ import {
 } from './shared';
 
 const {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   withFixtures,
 } = require('../../../helpers');
 const FixtureBuilder = require('../../../fixture-builder');
@@ -49,7 +49,7 @@ describe('Confirmation Redesign Contract Deployment Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           title: this.test?.fullTitle(),
         },
         async ({ driver }: TestSuiteArguments) => {
diff --git a/test/e2e/tests/confirmations/transactions/contract-interaction-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/contract-interaction-redesign.spec.ts
index 786bb54e35c9..da09c9153977 100644
--- a/test/e2e/tests/confirmations/transactions/contract-interaction-redesign.spec.ts
+++ b/test/e2e/tests/confirmations/transactions/contract-interaction-redesign.spec.ts
@@ -18,7 +18,7 @@ import {
 
 const { hexToNumber } = require('@metamask/utils');
 const {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   WINDOW_TITLES,
   withFixtures,
 } = require('../../../helpers');
@@ -59,7 +59,7 @@ describe('Confirmation Redesign Contract Interaction Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           title: this.test?.fullTitle(),
         },
@@ -128,7 +128,7 @@ describe('Confirmation Redesign Contract Interaction Component', function () {
             .withNetworkControllerOnOptimism()
             .build(),
           localNodeOptions: {
-            ...defaultGanacheOptionsForType2Transactions,
+            ...defaultOptionsForType2Transactions,
             chainId: hexToNumber(CHAIN_IDS.OPTIMISM),
           },
           smartContract,
@@ -163,7 +163,7 @@ describe('Confirmation Redesign Contract Interaction Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           title: this.test?.fullTitle(),
         },
@@ -184,7 +184,7 @@ describe('Confirmation Redesign Contract Interaction Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           title: this.test?.fullTitle(),
         },
@@ -213,7 +213,7 @@ describe('Confirmation Redesign Contract Interaction Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           title: this.test?.fullTitle(),
         },
@@ -238,7 +238,7 @@ describe('Confirmation Redesign Contract Interaction Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           title: this.test?.fullTitle(),
         },
diff --git a/test/e2e/tests/confirmations/transactions/erc20-approve-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/erc20-approve-redesign.spec.ts
index ce39e73adc5a..9358ff7a88ca 100644
--- a/test/e2e/tests/confirmations/transactions/erc20-approve-redesign.spec.ts
+++ b/test/e2e/tests/confirmations/transactions/erc20-approve-redesign.spec.ts
@@ -11,7 +11,7 @@ import {
 } from './shared';
 
 const {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   withFixtures,
 } = require('../../../helpers');
 const FixtureBuilder = require('../../../fixture-builder');
@@ -53,7 +53,7 @@ describe('Confirmation Redesign ERC20 Approve Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           testSpecificMock: mocks,
           title: this.test?.fullTitle(),
diff --git a/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts
index adc75f3cd43f..7ede89189063 100644
--- a/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts
+++ b/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts
@@ -10,7 +10,7 @@ import {
 } from './shared';
 
 const {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   withFixtures,
 } = require('../../../helpers');
 const FixtureBuilder = require('../../../fixture-builder');
@@ -52,7 +52,7 @@ describe('Confirmation Redesign ERC721 Approve Component', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           testSpecificMock: mocks,
           title: this.test?.fullTitle(),
diff --git a/test/e2e/tests/confirmations/transactions/increase-token-allowance-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/increase-token-allowance-redesign.spec.ts
index 9c2da3c3a6db..4ddd450b0bdf 100644
--- a/test/e2e/tests/confirmations/transactions/increase-token-allowance-redesign.spec.ts
+++ b/test/e2e/tests/confirmations/transactions/increase-token-allowance-redesign.spec.ts
@@ -1,6 +1,6 @@
 import FixtureBuilder from '../../../fixture-builder';
 import {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   WINDOW_TITLES,
   withFixtures,
 } from '../../../helpers';
@@ -91,7 +91,7 @@ function generateFixtureOptionsForEIP1559Tx(mochaContext: Mocha.Context) {
     fixtures: new FixtureBuilder()
       .withPermissionControllerConnectedToTestDapp()
       .build(),
-    localNodeOptions: defaultGanacheOptionsForType2Transactions,
+    localNodeOptions: defaultOptionsForType2Transactions,
     smartContract: SMART_CONTRACTS.HST,
     testSpecificMock: mocks,
     title: mochaContext.test?.fullTitle(),
diff --git a/test/e2e/tests/confirmations/transactions/metrics.spec.ts b/test/e2e/tests/confirmations/transactions/metrics.spec.ts
index ebf59ef95dc5..9fa162604c38 100644
--- a/test/e2e/tests/confirmations/transactions/metrics.spec.ts
+++ b/test/e2e/tests/confirmations/transactions/metrics.spec.ts
@@ -15,7 +15,7 @@ import {
 } from './shared';
 
 const {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   openDapp,
   unlockWallet,
   WINDOW_TITLES,
@@ -36,7 +36,7 @@ describe('Metrics', function () {
             participateInMetaMetrics: true,
           })
           .build(),
-        localNodeOptions: defaultGanacheOptionsForType2Transactions,
+        localNodeOptions: defaultOptionsForType2Transactions,
         title: this.test?.fullTitle(),
         testSpecificMock: mocks,
       },
diff --git a/test/e2e/tests/confirmations/transactions/revoke-allowance-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/revoke-allowance-redesign.spec.ts
index 1d6d59119250..5afc81ffaefa 100644
--- a/test/e2e/tests/confirmations/transactions/revoke-allowance-redesign.spec.ts
+++ b/test/e2e/tests/confirmations/transactions/revoke-allowance-redesign.spec.ts
@@ -12,7 +12,7 @@ import {
 } from './shared';
 
 const {
-  defaultGanacheOptionsForType2Transactions,
+  defaultOptionsForType2Transactions,
   withFixtures,
 } = require('../../../helpers');
 const FixtureBuilder = require('../../../fixture-builder');
@@ -60,7 +60,7 @@ describe('Confirmation Redesign ERC20 Revoke Allowance', function () {
           fixtures: new FixtureBuilder()
             .withPermissionControllerConnectedToTestDapp()
             .build(),
-          localNodeOptions: defaultGanacheOptionsForType2Transactions,
+          localNodeOptions: defaultOptionsForType2Transactions,
           smartContract,
           testSpecificMock: mocks,
           title: this.test?.fullTitle(),
diff --git a/test/e2e/tests/network/chain-interactions.spec.js b/test/e2e/tests/network/chain-interactions.spec.js
index bc2ceab613ed..a752b151f96a 100644
--- a/test/e2e/tests/network/chain-interactions.spec.js
+++ b/test/e2e/tests/network/chain-interactions.spec.js
@@ -10,7 +10,7 @@ describe('Chain Interactions', function () {
   const port = 8546;
   const chainId = 1338;
 
-  it('should add the Ganache chain and switch the network', async function () {
+  it('should add the Local chain and switch the network', async function () {
     await withFixtures(
       {
         dapp: true,
diff --git a/test/e2e/tests/network/custom-rpc-history.spec.js b/test/e2e/tests/network/custom-rpc-history.spec.js
index 72b6ce162e22..33bd7c7cb132 100644
--- a/test/e2e/tests/network/custom-rpc-history.spec.js
+++ b/test/e2e/tests/network/custom-rpc-history.spec.js
@@ -36,7 +36,7 @@ describe('Custom RPC history', function () {
         await unlockWallet(driver);
 
         const rpcUrl = `http://127.0.0.1:${port}`;
-        const networkName = 'Secondary Ganache Testnet';
+        const networkName = 'Secondary Local Testnet';
 
         await driver.clickElement('[data-testid="network-display"]');
         await driver.clickElement({
@@ -87,12 +87,12 @@ describe('Custom RPC history', function () {
 
         // Validate the network was added
         const networkAdded = await driver.isElementPresent({
-          text: '“Secondary Ganache Testnet” was successfully added!',
+          text: '“Secondary Local Testnet” was successfully added!',
         });
         assert.equal(
           networkAdded,
           true,
-          '“Secondary Ganache Testnet” was successfully added!',
+          '“Secondary Local Testnet” was successfully added!',
         );
       },
     );
diff --git a/test/e2e/tests/onboarding/onboarding.spec.ts b/test/e2e/tests/onboarding/onboarding.spec.ts
index 5e9fdcd6dbff..d823a6c02f48 100644
--- a/test/e2e/tests/onboarding/onboarding.spec.ts
+++ b/test/e2e/tests/onboarding/onboarding.spec.ts
@@ -27,16 +27,6 @@ import {
 import { switchToNetworkFlow } from '../../page-objects/flows/network.flow';
 
 describe('MetaMask onboarding', function () {
-  const ganacheOptions2 = {
-    accounts: [
-      {
-        secretKey:
-          '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9',
-        balance: convertToHexValue(10000000000000000000),
-      },
-    ],
-  };
-
   it("Creates a new wallet, sets up a secure password, and doesn't complete the onboarding process and refreshes the page", async function () {
     await withFixtures(
       {
@@ -225,20 +215,23 @@ describe('MetaMask onboarding', function () {
         fixtures: new FixtureBuilder({ onboarding: true }).build(),
         localNodeOptions: [
           {
-            type: 'ganache',
+            type: 'anvil',
           },
           {
-            type: 'ganache',
+            type: 'anvil',
             options: {
               port,
               chainId,
-              ...ganacheOptions2,
             },
           },
         ],
         title: this.test?.fullTitle(),
       },
       async ({ driver, localNodes }) => {
+        await localNodes[1].setAccountBalance(
+          '0x0Cc5261AB8cE458dc977078A3623E2BaDD27afD3',
+          convertToHexValue(10000000000000000000),
+        );
         await importSRPOnboardingFlow({
           driver,
           seedPhrase: TEST_SEED_PHRASE,
@@ -270,9 +263,9 @@ describe('MetaMask onboarding', function () {
 
         // Check the correct balance for the custom network is displayed
         if (localNodes[1] && Array.isArray(localNodes)) {
-          await homePage.check_localNodeBalanceIsDisplayed(localNodes[1]);
+          await homePage.check_expectedBalanceIsDisplayed('10');
         } else {
-          throw new Error('Custom network Ganache server not available');
+          throw new Error('Custom network server not available');
         }
       },
     );
diff --git a/test/e2e/tests/request-queuing/ui.spec.js b/test/e2e/tests/request-queuing/ui.spec.js
index 3fd81c13153f..58d19e79a0b0 100644
--- a/test/e2e/tests/request-queuing/ui.spec.js
+++ b/test/e2e/tests/request-queuing/ui.spec.js
@@ -696,7 +696,7 @@ describe('Request-queue UI changes', function () {
             },
           },
         ],
-        // This test intentionally quits Ganache while the extension is using it, causing
+        // This test intentionally quits the local node server while the extension is using it, causing
         // PollingBlockTracker errors and others. These are expected.
         ignoredConsoleErrors: ['ignore-all'],
         dappOptions: { numberOfDapps: 2 },
@@ -720,7 +720,7 @@ describe('Request-queue UI changes', function () {
           text: 'Ethereum Mainnet',
         });
 
-        // Kill ganache servers
+        // Kill local node servers
         await localNodes[0].quit();
         await localNodes[1].quit();
 
diff --git a/test/e2e/tests/swap-send/swap-send-erc20.spec.ts b/test/e2e/tests/swap-send/swap-send-erc20.spec.ts
index 31d259214070..cf75ee1691c0 100644
--- a/test/e2e/tests/swap-send/swap-send-erc20.spec.ts
+++ b/test/e2e/tests/swap-send/swap-send-erc20.spec.ts
@@ -22,7 +22,7 @@ describe('Swap-Send ERC20', function () {
         getSwapSendFixtures(
           this.test?.fullTitle(),
           SWAP_SEND_QUOTES_RESPONSE_TST_ETH,
-          '?sourceAmount=100000&sourceToken=0x581c3C1A2A4EBDE2A0Df29B5cf4c116E42945947&destinationToken=0x0000000000000000000000000000000000000000&sender=0x5cfe73b6021e818b776b421b1c4db2474086a7e1&recipient=0xc427D562164062a23a5cFf596A4a3208e72Acd28&slippage=2',
+          '?sourceAmount=100000&sourceToken=0x581c3c1a2a4ebde2a0df29b5cf4c116e42945947&destinationToken=0x0000000000000000000000000000000000000000&sender=0x5cfe73b6021e818b776b421b1c4db2474086a7e1&recipient=0xc427D562164062a23a5cFf596A4a3208e72Acd28&slippage=2',
         ),
         async ({ driver }) => {
           const swapSendPage = new SwapSendPage(driver);
diff --git a/test/e2e/tests/swap-send/swap-send-test-utils.ts b/test/e2e/tests/swap-send/swap-send-test-utils.ts
index 30189e1f4398..c4c8c37289d9 100644
--- a/test/e2e/tests/swap-send/swap-send-test-utils.ts
+++ b/test/e2e/tests/swap-send/swap-send-test-utils.ts
@@ -323,14 +323,9 @@ export const getSwapSendFixtures = (
     smartContract: SMART_CONTRACTS.HST,
     ethConversionInUsd: ETH_CONVERSION_RATE_USD,
     testSpecificMock: mockSwapsApi(swapsQuotes, swapsQuery),
-    localNodeOptions: [
-      {
-        type: 'ganache',
-        options: {
-          hardfork: 'london',
-        },
-      },
-    ],
+    localNodeOptions: {
+      hardfork: 'london',
+    },
     title,
   };
 };
diff --git a/test/e2e/user-actions-benchmark.ts b/test/e2e/user-actions-benchmark.ts
index cc8ee3f0d0b9..76415f66ce64 100644
--- a/test/e2e/user-actions-benchmark.ts
+++ b/test/e2e/user-actions-benchmark.ts
@@ -24,8 +24,10 @@ async function loadNewAccount(): Promise<number> {
   await withFixtures(
     {
       fixtures: new FixtureBuilder().build(),
-      localNodeOptions: 'ganache',
       disableServerMochaToBackground: true,
+      localNodeOptions: {
+        accounts: 1,
+      },
       title: 'benchmark-userActions-loadNewAccount',
     },
     async ({ driver }: { driver: Driver }) => {
@@ -58,7 +60,6 @@ async function confirmTx(): Promise<number> {
   await withFixtures(
     {
       fixtures: new FixtureBuilder().build(),
-      localNodeOptions: 'ganache',
       disableServerMochaToBackground: true,
       title: 'benchmark-userActions-confirmTx',
     },
@@ -116,7 +117,6 @@ async function bridgeUserActions(): Promise<{
     {
       fixtures: fixtureBuilder.build(),
       disableServerMochaToBackground: true,
-      localNodeOptions: 'ganache',
       title: 'benchmark-userActions-bridgeUserActions',
       testSpecificMock: async (mockServer: Mockttp) => [
         await mockFeatureFlag(mockServer, {


Reviews:
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-05T05:46:03Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-05T05:46:30Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-05T05:46:40Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-05T05:46:48Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-05T05:47:52Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-05T05:48:21Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-05T05:49:31Z
user: login: chloeYue
body: LGTM ! 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-05T11:05:07Z
user: login: HowardBraham
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-05T16:50:44Z

Review comments:
diff_hunk: @@ -34,7 +34,6 @@ async function measurePage(pageName, pageLoads) {
     {
       fixtures: new FixtureBuilder().build(),
       disableServerMochaToBackground: true,
-      localNodeOptions: 'ganache',
path: test/e2e/benchmark.mjs
user: login: seaona
body: removing custom options, runs anvil by default
created_at: 2025-05-05T05:46:03Z
author_association: MEMBER
diff_hunk: @@ -39,27 +32,20 @@ export const DEFAULT_MULTICHAIN_TEST_DAPP_FIXTURE_OPTIONS = {
   ],
   localNodeOptions: [
     {
-      type: 'ganache',
-      options: {
-        secretKey: PRIVATE_KEY,
-        balance: convertETHToHexGwei(DEFAULT_LOCAL_NODE_ETH_BALANCE_DEC),
-        accounts: multipleGanacheOptions.accounts,
-      },
+      type: 'anvil',
     },
     {
-      type: 'ganache',
+      type: 'anvil',
       options: {
         port: 8546,
         chainId: 1338,
-        accounts: multipleGanacheOptions.accounts,
       },
     },
     {
-      type: 'ganache',
+      type: 'anvil',
       options: {
         port: 7777,
         chainId: 1000,
-        accounts: multipleGanacheOptions.accounts,
path: test/e2e/flask/multichain-api/testHelpers.ts
user: login: seaona
body: the accounts custom option can be removed as we already seed the accounts with the default SRP
created_at: 2025-05-05T05:46:30Z
author_association: MEMBER
diff_hunk: @@ -544,7 +544,7 @@ const PRIVATE_KEY_TWO =
 const ACCOUNT_1 = '0x5cfe73b6021e818b776b421b1c4db2474086a7e1';
 const ACCOUNT_2 = '0x09781764c08de8ca82e156bbf156a3ca217c7950';
 
-const defaultGanacheOptionsForType2Transactions = {
path: test/e2e/helpers.js
user: login: seaona
body: just a rename
created_at: 2025-05-05T05:46:39Z
author_association: MEMBER
diff_hunk: @@ -15,7 +15,7 @@ describe('eth_newBlockFilter', function () {
         fixtures: new FixtureBuilder()
           .withPermissionControllerConnectedToTestDapp()
           .build(),
-        localNodeOptions: ganacheOptions,
path: test/e2e/json-rpc/eth_newBlockFilter.spec.ts
user: login: seaona
body: rename
created_at: 2025-05-05T05:46:48Z
author_association: MEMBER
diff_hunk: @@ -27,16 +27,6 @@ import {
 import { switchToNetworkFlow } from '../../page-objects/flows/network.flow';
 
 describe('MetaMask onboarding', function () {
-  const ganacheOptions2 = {
-    accounts: [
-      {
-        secretKey:
-          '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9',
-        balance: convertToHexValue(10000000000000000000),
-      },
-    ],
-  };
-
path: test/e2e/tests/onboarding/onboarding.spec.ts
user: login: seaona
body: removing accounts option, as it  is not available in anvil, we can seed this specific account using setAccountBalance below
created_at: 2025-05-05T05:47:52Z
author_association: MEMBER
diff_hunk: @@ -323,14 +323,9 @@ export const getSwapSendFixtures = (
     smartContract: SMART_CONTRACTS.HST,
     ethConversionInUsd: ETH_CONVERSION_RATE_USD,
     testSpecificMock: mockSwapsApi(swapsQuotes, swapsQuery),
-    localNodeOptions: [
-      {
-        type: 'ganache',
path: test/e2e/tests/swap-send/swap-send-test-utils.ts
user: login: seaona
body: if we don't pass any type, this will use the default node which is anvil now
created_at: 2025-05-05T05:48:21Z
author_association: MEMBER
diff_hunk: @@ -24,8 +24,10 @@ async function loadNewAccount(): Promise<number> {
   await withFixtures(
     {
       fixtures: new FixtureBuilder().build(),
-      localNodeOptions: 'ganache',
       disableServerMochaToBackground: true,
+      localNodeOptions: {
+        accounts: 1,
path: test/e2e/user-actions-benchmark.ts
user: login: seaona
body: setting custom account 1, as in this test, we want that the second account we create has 0 balance.
Before, it was already like this as in ganache we only seeded the first account, as we were using the accounts option instead of the SRP (which seeds 10 accounts by default)
created_at: 2025-05-05T05:49:31Z
author_association: MEMBER

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-03T09:21:47Z
body: **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.
author_association: CONTRIBUTOR
user: login: metamaskbot
created_at: 2025-05-03T10:36:23Z
body: <details><summary>Builds ready [76ef0cb]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14809846042/builds-beta/metamask-beta-chrome-12.17.0-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds-test/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds-test-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14809846042/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14809846042/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14809846042/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4855147/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/ui-13.html">13</a></li><li>content-script: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/content-script-0.html">0</a></li><li>offscreen: <a href="https://output.circle-artifacts.com/output/job/9bb015ab-d6bb-4339-b8b5-add58eeec9e8/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1206 ± 61 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1206</td><td align="right">1100</td><td align="right">1383</td><td align="right">61</td><td align="right">1242</td><td align="right">1323</td></tr><tr><td>load</td><td align="right">1048</td><td align="right">918</td><td align="right">1212</td><td align="right">59</td><td align="right">1089</td><td align="right">1155</td></tr><tr><td>domContentLoaded</td><td align="right">1041</td><td align="right">908</td><td align="right">1208</td><td align="right">60</td><td align="right">1084</td><td align="right">1149</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">63</td><td align="right">8</td><td align="right">16</td><td align="right">27</td></tr><tr><td>firstPaint</td><td align="right">691</td><td align="right">75</td><td align="right">1215</td><td align="right">426</td><td align="right">1059</td><td align="right">1155</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">103</td><td align="right">10</td><td align="right">7</td><td align="right">10</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">13</td><td align="right">47</td><td align="right">5</td><td align="right">20</td><td align="right">32</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">35</td><td align="right">7</td><td align="right">19</td><td align="right">27</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">804</td><td align="right">664</td><td align="right">953</td><td align="right">58</td><td align="right">849</td><td align="right">916</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">29</td><td align="right">4</td><td align="right">8</td><td align="right">14</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2168</td><td align="right">1788</td><td align="right">2631</td><td align="right">163</td><td align="right">2284</td><td align="right">2408</td></tr><tr><td>load</td><td align="right">1678</td><td align="right">1349</td><td align="right">2064</td><td align="right">130</td><td align="right">1762</td><td align="right">1857</td></tr><tr><td>domContentLoaded</td><td align="right">1671</td><td align="right">1345</td><td align="right">2030</td><td align="right">129</td><td align="right">1758</td><td align="right">1850</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">88</td><td align="right">12</td><td align="right">13</td><td align="right">47</td></tr><tr><td>firstPaint</td><td align="right">183</td><td align="right">60</td><td align="right">382</td><td align="right">76</td><td align="right">235</td><td align="right">341</td></tr><tr><td>backgroundConnect</td><td align="right">30</td><td align="right">10</td><td align="right">370</td><td align="right">37</td><td align="right">34</td><td align="right">58</td></tr><tr><td>firstReactRender</td><td align="right">206</td><td align="right">57</td><td align="right">367</td><td align="right">115</td><td align="right">320</td><td align="right">358</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">217</td><td align="right">21</td><td align="right">13</td><td align="right">30</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">8</td><td align="right">1</td><td align="right">4</td><td align="right">6</td></tr><tr><td>loadScripts</td><td align="right">1662</td><td align="right">1319</td><td align="right">2006</td><td align="right">133</td><td align="right">1756</td><td align="right">1846</td></tr><tr><td>setupStore</td><td align="right">27</td><td align="right">6</td><td align="right">301</td><td align="right">46</td><td align="right">23</td><td align="right">54</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1362</td><td align="right">1201</td><td align="right">1678</td><td align="right">108</td><td align="right">1412</td><td align="right">1596</td></tr><tr><td>load</td><td align="right">1215</td><td align="right">1016</td><td align="right">1484</td><td align="right">106</td><td align="right">1278</td><td align="right">1440</td></tr><tr><td>domContentLoaded</td><td align="right">1215</td><td align="right">1016</td><td align="right">1484</td><td align="right">106</td><td align="right">1278</td><td align="right">1440</td></tr><tr><td>domInteractive</td><td align="right">100</td><td align="right">38</td><td align="right">223</td><td align="right">30</td><td align="right">113</td><td align="right">151</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">12</td><td align="right">105</td><td align="right">16</td><td align="right">21</td><td align="right">69</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">19</td><td align="right">51</td><td align="right">5</td><td align="right">25</td><td align="right">31</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">4</td><td align="right">219</td><td align="right">22</td><td align="right">8</td><td align="right">15</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1195</td><td align="right">1003</td><td align="right">1465</td><td align="right">105</td><td align="right">1257</td><td align="right">1424</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">99</td><td align="right">9</td><td align="right">6</td><td align="right">10</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1567</td><td align="right">1395</td><td align="right">2057</td><td align="right">138</td><td align="right">1620</td><td align="right">1905</td></tr><tr><td>load</td><td align="right">1342</td><td align="right">1198</td><td align="right">1758</td><td align="right">120</td><td align="right">1398</td><td align="right">1644</td></tr><tr><td>domContentLoaded</td><td align="right">1341</td><td align="right">1197</td><td align="right">1757</td><td align="right">120</td><td align="right">1398</td><td align="right">1643</td></tr><tr><td>domInteractive</td><td align="right">86</td><td align="right">44</td><td align="right">180</td><td align="right">23</td><td align="right">102</td><td align="right">137</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">24</td><td align="right">15</td><td align="right">125</td><td align="right">13</td><td align="right">24</td><td align="right">44</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">29</td><td align="right">49</td><td align="right">4</td><td align="right">37</td><td align="right">45</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">262</td><td align="right">26</td><td align="right">9</td><td align="right">25</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">2</td><td align="right">1</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1321</td><td align="right">1177</td><td align="right">1734</td><td align="right">117</td><td align="right">1379</td><td align="right">1620</td></tr><tr><td>setupStore</td><td align="right">12</td><td align="right">5</td><td align="right">346</td><td align="right">34</td><td align="right">8</td><td align="right">20</td></tr></tbody></table>Benchmark value 342 exceeds gate value 334 for chrome webpack home p95 firstPaint<br>
<b>Sum of mean exceeds: 0ms | Sum of p95 exceeds: 8ms<br>
Sum of all benchmark exceeds: 8ms</b><br>
</details>

<details><summary>Bundle size diffs</summary><ul><li>background: 0 Bytes (0%)</li>
<li>ui: -27 Bytes (0%)</li>
<li>common: 0 Bytes (0%)</li></ul></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-04T17:20:14Z
body: <details><summary>Builds ready [c2307b6]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14823237476/builds-beta/metamask-beta-chrome-12.17.0-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds-test/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds-test-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14823237476/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14823237476/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14823237476/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4855823/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/ui-13.html">13</a></li><li>content-script: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/content-script-0.html">0</a></li><li>offscreen: <a href="https://output.circle-artifacts.com/output/job/70dc1c37-659b-4fbc-96d2-6a32fb16bc2b/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1204 ± 66 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1204</td><td align="right">1093</td><td align="right">1425</td><td align="right">66</td><td align="right">1228</td><td align="right">1358</td></tr><tr><td>load</td><td align="right">1044</td><td align="right">950</td><td align="right">1254</td><td align="right">58</td><td align="right">1069</td><td align="right">1173</td></tr><tr><td>domContentLoaded</td><td align="right">1039</td><td align="right">946</td><td align="right">1248</td><td align="right">57</td><td align="right">1062</td><td align="right">1169</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">14</td><td align="right">62</td><td align="right">8</td><td align="right">17</td><td align="right">29</td></tr><tr><td>firstPaint</td><td align="right">701</td><td align="right">131</td><td align="right">1263</td><td align="right">421</td><td align="right">1052</td><td align="right">1160</td></tr><tr><td>backgroundConnect</td><td align="right">6</td><td align="right">4</td><td align="right">16</td><td align="right">2</td><td align="right">7</td><td align="right">10</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">13</td><td align="right">53</td><td align="right">6</td><td align="right">21</td><td align="right">35</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">43</td><td align="right">8</td><td align="right">20</td><td align="right">26</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">802</td><td align="right">708</td><td align="right">1003</td><td align="right">55</td><td align="right">827</td><td align="right">912</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">15</td><td align="right">2</td><td align="right">8</td><td align="right">14</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2163</td><td align="right">1673</td><td align="right">2550</td><td align="right">193</td><td align="right">2305</td><td align="right">2445</td></tr><tr><td>load</td><td align="right">1665</td><td align="right">1282</td><td align="right">2129</td><td align="right">151</td><td align="right">1773</td><td align="right">1892</td></tr><tr><td>domContentLoaded</td><td align="right">1658</td><td align="right">1279</td><td align="right">2124</td><td align="right">150</td><td align="right">1769</td><td align="right">1885</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">62</td><td align="right">10</td><td align="right">13</td><td align="right">45</td></tr><tr><td>firstPaint</td><td align="right">176</td><td align="right">74</td><td align="right">578</td><td align="right">67</td><td align="right">195</td><td align="right">316</td></tr><tr><td>backgroundConnect</td><td align="right">34</td><td align="right">10</td><td align="right">379</td><td align="right">47</td><td align="right">34</td><td align="right">58</td></tr><tr><td>firstReactRender</td><td align="right">208</td><td align="right">56</td><td align="right">386</td><td align="right">119</td><td align="right">336</td><td align="right">356</td></tr><tr><td>getState</td><td align="right">18</td><td align="right">4</td><td align="right">299</td><td align="right">38</td><td align="right">14</td><td align="right">48</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">8</td><td align="right">1</td><td align="right">4</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1653</td><td align="right">1277</td><td align="right">2122</td><td align="right">150</td><td align="right">1768</td><td align="right">1880</td></tr><tr><td>setupStore</td><td align="right">19</td><td align="right">7</td><td align="right">51</td><td align="right">9</td><td align="right">23</td><td align="right">40</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1348</td><td align="right">1188</td><td align="right">1798</td><td align="right">112</td><td align="right">1412</td><td align="right">1571</td></tr><tr><td>load</td><td align="right">1207</td><td align="right">1047</td><td align="right">1676</td><td align="right">116</td><td align="right">1270</td><td align="right">1446</td></tr><tr><td>domContentLoaded</td><td align="right">1207</td><td align="right">1046</td><td align="right">1676</td><td align="right">116</td><td align="right">1270</td><td align="right">1446</td></tr><tr><td>domInteractive</td><td align="right">103</td><td align="right">38</td><td align="right">305</td><td align="right">37</td><td align="right">115</td><td align="right">157</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">13</td><td align="right">231</td><td align="right">25</td><td align="right">19</td><td align="right">37</td></tr><tr><td>firstReactRender</td><td align="right">22</td><td align="right">19</td><td align="right">34</td><td align="right">3</td><td align="right">22</td><td align="right">27</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">40</td><td align="right">5</td><td align="right">8</td><td align="right">10</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1186</td><td align="right">1007</td><td align="right">1649</td><td align="right">115</td><td align="right">1253</td><td align="right">1430</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">33</td><td align="right">4</td><td align="right">6</td><td align="right">10</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1528</td><td align="right">1349</td><td align="right">2006</td><td align="right">134</td><td align="right">1605</td><td align="right">1815</td></tr><tr><td>load</td><td align="right">1312</td><td align="right">1164</td><td align="right">1715</td><td align="right">117</td><td align="right">1396</td><td align="right">1537</td></tr><tr><td>domContentLoaded</td><td align="right">1311</td><td align="right">1164</td><td align="right">1715</td><td align="right">117</td><td align="right">1395</td><td align="right">1536</td></tr><tr><td>domInteractive</td><td align="right">83</td><td align="right">54</td><td align="right">286</td><td align="right">29</td><td align="right">97</td><td align="right">136</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">20</td><td align="right">14</td><td align="right">58</td><td align="right">6</td><td align="right">20</td><td align="right">29</td></tr><tr><td>firstReactRender</td><td align="right">34</td><td align="right">29</td><td align="right">49</td><td align="right">4</td><td align="right">36</td><td align="right">42</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">4</td><td align="right">277</td><td align="right">27</td><td align="right">8</td><td align="right">25</td></tr><tr><td>initialActions</td><td align="right">1</td><td align="right">0</td><td align="right">2</td><td align="right">1</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1294</td><td align="right">1145</td><td align="right">1695</td><td align="right">117</td><td align="right">1379</td><td align="right">1509</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">41</td><td align="right">5</td><td align="right">8</td><td align="right">19</td></tr></tbody></table></details>

<details><summary>Bundle size diffs [🚨 Warning! Bundle size has increased!]</summary><ul><li>background: 0 Bytes (0%)</li>
<li>ui: -220 Bytes (0%)</li>
<li>common: 1.39 KiB (0.01%)</li></ul></details>


author_association: COLLABORATOR