Repository: MetaMask/metamask-extension
Pull request #33018: chore: Bump Snaps packages
Author: login: Mrtenz
Labels: name: team-snaps-platform-deprecated
description: DEPRECATED: please use "team-core-platform" instead (or "team-new-networks" for Solana snap issues)
name: release-12.20.0
description: Issue or pull request that will be included in release 12.20.0
Created: 2025-05-16T12:42:33Z | Merged: 2025-05-19T20:53:57Z

<!--
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**

This bumps Snaps packages to the latest versions. Notable changes are:

- Support for `wallet_switchEthereumChain` inside Snaps.
   - Like with websites, we want to support a custom network per Snap rather than relying on the globally selected network. For Snaps, the permission for the network to switch to is automatically granted.
- Support for SIP-31 `onClientRequest` handler.
- New `showTestnets` property in `snap_getPreferences`.

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/33018?quickstart=1)

## **Related issues**

Closes: https://github.com/MetaMask/metamask-extension/issues/24718

Closes: https://github.com/MetaMask/MetaMask-planning/issues/2940

Closes: https://github.com/MetaMask/MetaMask-planning/issues/2939

## **Manual testing steps**

### `wallet_switchEthereumChain`

1. Go to [`test-snaps`](https://metamask.github.io/snaps/test-snaps/latest/)
2. Install the Ethereum Provider Example Snap.
3. Switch the chain ID using the `test-snaps` selector for the Ethereum Provider example.
4. Click "Get version".
5. The Snap should now use the new network, without any permission requests, and the appropriate chain ID should be shown.

## **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**

- [ ] 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).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] 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.



Diff:
diff --git a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js
index 85c6ef8b36a8..c1c2f5ffcf6c 100644
--- a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js
+++ b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js
@@ -1,4 +1,5 @@
 import { providerErrors } from '@metamask/rpc-errors';
+import { isSnapId } from '@metamask/snaps-utils';
 
 import { MESSAGE_TYPE } from '../../../../../shared/constants/app';
 import {
@@ -80,6 +81,7 @@ async function switchEthereumChainHandler(
   return switchChain(res, end, chainId, networkClientIdToSwitchTo, {
     origin,
     isSwitchFlow: true,
+    autoApprove: isSnapId(origin),
     setActiveNetwork,
     getCaveat,
     requestPermittedChainsPermissionIncrementalForOrigin,
diff --git a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js
index 3c3792605c53..6f298084d124 100644
--- a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js
+++ b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js
@@ -168,6 +168,7 @@ describe('switchEthereumChainHandler', () => {
       '0xdeadbeef',
       'mainnet',
       {
+        autoApprove: false,
         setActiveNetwork: mocks.setActiveNetwork,
         fromNetworkConfiguration: {
           chainId: '0xe708',
@@ -198,4 +199,31 @@ describe('switchEthereumChainHandler', () => {
       },
     );
   });
+
+  it('calls `switchChain` with `autoApprove: true` if the origin is a Snap', async () => {
+    const { mocks } = createMockedHandler();
+
+    const switchEthereumChainHandler = switchEthereumChain.implementation;
+    await switchEthereumChainHandler(
+      {
+        origin: 'npm:foo-snap',
+        params: [{ chainId: CHAIN_IDS.MAINNET }],
+      },
+      {},
+      jest.fn(),
+      jest.fn(),
+      mocks,
+    );
+
+    expect(EthChainUtils.switchChain).toHaveBeenCalledTimes(1);
+    expect(EthChainUtils.switchChain).toHaveBeenCalledWith(
+      {},
+      expect.any(Function),
+      CHAIN_IDS.MAINNET,
+      NETWORK_TYPES.MAINNET,
+      expect.objectContaining({
+        autoApprove: true,
+      }),
+    );
+  });
 });
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 0b424298ba3f..4f22e9c636bc 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -130,8 +130,6 @@ import {
   TransactionType,
 } from '@metamask/transaction-controller';
 
-import { isSnapId } from '@metamask/snaps-utils';
-
 import { Interface } from '@ethersproject/abi';
 import { abiERC1155, abiERC721 } from '@metamask/metamask-eth-abis';
 import {
@@ -2554,6 +2552,7 @@ export default class MetamaskController extends EventEmitter {
 
     return {
       privacyMode: preferences.privacyMode,
+      showTestnets: preferences.showTestNetworks,
       securityAlertsEnabled,
       useCurrencyRateCheck,
       useTransactionSimulations,
@@ -2585,6 +2584,7 @@ export default class MetamaskController extends EventEmitter {
               useMultiAccountBalanceChecker,
               openSeaEnabled,
               useNftDetection,
+              showTestnets,
             } = this.getPreferences();
             return {
               locale,
@@ -2597,6 +2597,7 @@ export default class MetamaskController extends EventEmitter {
               batchCheckBalances: useMultiAccountBalanceChecker,
               displayNftMedia: openSeaEnabled,
               useNftDetection,
+              showTestnets,
             };
           },
           clearSnapState: this.controllerMessenger.call.bind(
@@ -5891,12 +5892,6 @@ export default class MetamaskController extends EventEmitter {
     autoApprove,
     metadata,
   }) {
-    if (isSnapId(origin)) {
-      throw new Error(
-        `Cannot request permittedChains permission for Snaps with origin "${origin}"`,
-      );
-    }
-
     const caveatValueWithChains = setPermittedEthChainIds(
       {
         requiredScopes: {},
@@ -5948,11 +5943,11 @@ export default class MetamaskController extends EventEmitter {
    * Requests user approval for the CAIP-25 permission for the specified origin
    * and returns a granted permissions object.
    *
-   * @param {string} origin - The origin to request approval for.
+   * @param {string} _origin - The origin to request approval for.
    * @param requestedPermissions - The legacy permissions to request approval for.
    * @returns the approved permissions object.
    */
-  getCaip25PermissionFromLegacyPermissions(origin, requestedPermissions = {}) {
+  getCaip25PermissionFromLegacyPermissions(_origin, requestedPermissions = {}) {
     const permissions = pick(requestedPermissions, [
       RestrictedMethods.eth_accounts,
       PermissionNames.permittedChains,
@@ -5966,10 +5961,6 @@ export default class MetamaskController extends EventEmitter {
       permissions[PermissionNames.permittedChains] = {};
     }
 
-    if (isSnapId(origin)) {
-      delete permissions[PermissionNames.permittedChains];
-    }
-
     const requestedAccounts =
       permissions[RestrictedMethods.eth_accounts]?.caveats?.find(
         (caveat) => caveat.type === CaveatTypes.restrictReturnedAccounts,
@@ -5993,7 +5984,7 @@ export default class MetamaskController extends EventEmitter {
 
     const caveatValueWithChains = setPermittedEthChainIds(
       newCaveatValue,
-      isSnapId(origin) ? [] : requestedChains,
+      requestedChains,
     );
 
     const caveatValueWithAccountsAndChains = setEthAccounts(
diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js
index d20f8d2099fd..5eb8b285b130 100644
--- a/app/scripts/metamask-controller.test.js
+++ b/app/scripts/metamask-controller.test.js
@@ -1293,7 +1293,7 @@ describe('MetaMaskController', () => {
         );
       });
 
-      it('returns approval from the PermissionsController for only eth_accounts when only permittedChains is specified in params and origin is snapId', async () => {
+      it('returns approval from the PermissionsController for both eth_accounts and permittedChains when only permittedChains is specified in params and origin is snapId', async () => {
         const permissions =
           await metamaskController.getCaip25PermissionFromLegacyPermissions(
             'npm:snap',
@@ -1318,6 +1318,9 @@ describe('MetaMaskController', () => {
                   value: {
                     requiredScopes: {},
                     optionalScopes: {
+                      'eip155:100': {
+                        accounts: [],
+                      },
                       'wallet:eip155': {
                         accounts: [],
                       },
@@ -1332,7 +1335,7 @@ describe('MetaMaskController', () => {
         );
       });
 
-      it('returns approval from the PermissionsController for only eth_accounts when both eth_accounts and permittedChains are specified in params and origin is snapId', async () => {
+      it('returns approval from the PermissionsController for both eth_accounts and permittedChains when both eth_accounts and permittedChains are specified in params and origin is snapId', async () => {
         const permissions =
           await metamaskController.getCaip25PermissionFromLegacyPermissions(
             'npm:snap',
@@ -1365,6 +1368,9 @@ describe('MetaMaskController', () => {
                   value: {
                     requiredScopes: {},
                     optionalScopes: {
+                      'eip155:100': {
+                        accounts: ['eip155:100:foo'],
+                      },
                       'wallet:eip155': {
                         accounts: ['wallet:eip155:foo'],
                       },
@@ -1432,31 +1438,28 @@ describe('MetaMaskController', () => {
         );
       });
 
-      it('returns CAIP-25 approval with approved accounts for the `wallet:eip155` scope (and no approved chainIds) with isMultichainOrigin: false if origin is snapId', async () => {
+      it('returns CAIP-25 approval with approved accounts and chain IDs with isMultichainOrigin: false if origin is snapId', async () => {
         const origin = 'npm:snap';
 
         const permissions =
-          await metamaskController.getCaip25PermissionFromLegacyPermissions(
-            origin,
-            {
-              [RestrictedEthMethods.eth_accounts]: {
-                caveats: [
-                  {
-                    type: 'restrictReturnedAccounts',
-                    value: ['0xdeadbeef'],
-                  },
-                ],
-              },
-              [EndowmentTypes.permittedChains]: {
-                caveats: [
-                  {
-                    type: 'restrictNetworkSwitching',
-                    value: ['0x1', '0x5'],
-                  },
-                ],
-              },
+          metamaskController.getCaip25PermissionFromLegacyPermissions(origin, {
+            [RestrictedEthMethods.eth_accounts]: {
+              caveats: [
+                {
+                  type: 'restrictReturnedAccounts',
+                  value: ['0xdeadbeef'],
+                },
+              ],
             },
-          );
+            [EndowmentTypes.permittedChains]: {
+              caveats: [
+                {
+                  type: 'restrictNetworkSwitching',
+                  value: ['0x1', '0x5'],
+                },
+              ],
+            },
+          });
 
         expect(permissions).toStrictEqual(
           expect.objectContaining({
@@ -1467,6 +1470,12 @@ describe('MetaMaskController', () => {
                   value: {
                     requiredScopes: {},
                     optionalScopes: {
+                      'eip155:1': {
+                        accounts: ['eip155:1:0xdeadbeef'],
+                      },
+                      'eip155:5': {
+                        accounts: ['eip155:5:0xdeadbeef'],
+                      },
                       'wallet:eip155': {
                         accounts: ['wallet:eip155:0xdeadbeef'],
                       },
@@ -1540,19 +1549,6 @@ describe('MetaMaskController', () => {
     });
 
     describe('requestPermittedChainsPermissionIncremental', () => {
-      it('throws if the origin is snapId', async () => {
-        await expect(() =>
-          metamaskController.requestPermittedChainsPermissionIncremental({
-            origin: 'npm:snap',
-            chainId: '0x1',
-          }),
-        ).rejects.toThrow(
-          new Error(
-            'Cannot request permittedChains permission for Snaps with origin "npm:snap"',
-          ),
-        );
-      });
-
       it('requests permittedChains approval if autoApprove: false', async () => {
         const expectedCaip25Permission = {
           [Caip25EndowmentPermissionName]: {
diff --git a/app/scripts/migrations/160.test.ts b/app/scripts/migrations/160.test.ts
new file mode 100644
index 000000000000..0929480158df
--- /dev/null
+++ b/app/scripts/migrations/160.test.ts
@@ -0,0 +1,306 @@
+import { SnapEndowments } from '@metamask/snaps-rpc-methods';
+import { METAMASK_DOMAIN } from '@metamask/selected-network-controller';
+import {
+  Caip25CaveatType,
+  Caip25EndowmentPermissionName,
+} from '@metamask/chain-agnostic-permission';
+import { migrate, version } from './160';
+
+const oldVersion = 159;
+
+const MOCK_ORIGIN = 'http://example.com';
+const MOCK_SNAP_ID = 'npm:foo-snap';
+
+jest.useFakeTimers();
+jest.setSystemTime(1723635247705);
+
+describe(`migration #${version}`, () => {
+  afterEach(() => jest.resetAllMocks());
+
+  it('updates the version metadata', async () => {
+    const oldStorage = {
+      meta: { version: oldVersion },
+      data: {},
+    };
+
+    const newStorage = await migrate(oldStorage);
+
+    expect(newStorage.meta).toStrictEqual({ version });
+  });
+
+  it('adds the network endowment to Snaps with the `endowment:ethereum-provider` permission', async () => {
+    const oldStorage = {
+      meta: { version: oldVersion },
+      data: {
+        NetworkController: {
+          selectedNetworkClientId: 'linea-sepolia',
+          networkConfigurationsByChainId: {
+            '0x1': {
+              rpcEndpoints: [
+                {
+                  networkClient: 'mainnet',
+                },
+              ],
+            },
+            '0xe705': {
+              rpcEndpoints: [
+                {
+                  networkClient: 'linea-sepolia',
+                },
+              ],
+            },
+          },
+        },
+
+        PermissionController: {
+          subjects: {
+            [MOCK_SNAP_ID]: {
+              permissions: {
+                [SnapEndowments.EthereumProvider]: {
+                  caveats: [],
+                  date: 1664187844588,
+                  id: 'izn0WGUO8cvq_jqvLQuQP',
+                  invoker: MOCK_ORIGIN,
+                  parentCapability: SnapEndowments.EthereumProvider,
+                },
+              },
+            },
+          },
+        },
+
+        SelectedNetworkController: {
+          domains: {
+            [METAMASK_DOMAIN]: 'mainnet',
+          },
+        },
+      },
+    };
+
+    const newStorage = await migrate(oldStorage);
+    expect(newStorage.data.PermissionController).toStrictEqual({
+      subjects: {
+        [MOCK_SNAP_ID]: {
+          permissions: {
+            [SnapEndowments.EthereumProvider]: {
+              caveats: [],
+              date: 1664187844588,
+              id: 'izn0WGUO8cvq_jqvLQuQP',
+              invoker: MOCK_ORIGIN,
+              parentCapability: SnapEndowments.EthereumProvider,
+            },
+            [Caip25EndowmentPermissionName]: {
+              caveats: [
+                {
+                  type: Caip25CaveatType,
+                  value: {
+                    isMultichainOrigin: false,
+                    optionalScopes: {
+                      'eip155:59141': {
+                        accounts: [],
+                      },
+                    },
+                    requiredScopes: {},
+                    sessionProperties: {},
+                  },
+                },
+              ],
+              date: 1723635247705,
+              id: expect.any(String),
+              invoker: MOCK_SNAP_ID,
+              parentCapability: Caip25EndowmentPermissionName,
+            },
+          },
+        },
+      },
+    });
+
+    expect(newStorage.data.SelectedNetworkController).toStrictEqual({
+      domains: {
+        [METAMASK_DOMAIN]: 'mainnet',
+        [MOCK_SNAP_ID]: 'linea-sepolia',
+      },
+    });
+  });
+
+  it('merges with an existing permission if the Snap already has `endowment:caip25`', async () => {
+    const oldStorage = {
+      meta: { version: oldVersion },
+      data: {
+        NetworkController: {
+          selectedNetworkClientId: 'mainnet',
+          networkConfigurationsByChainId: {
+            '0x1': {
+              rpcEndpoints: [
+                {
+                  networkClient: 'mainnet',
+                },
+              ],
+            },
+            '0xe705': {
+              rpcEndpoints: [
+                {
+                  networkClient: 'linea-sepolia',
+                },
+              ],
+            },
+          },
+        },
+
+        PermissionController: {
+          subjects: {
+            [MOCK_SNAP_ID]: {
+              permissions: {
+                [SnapEndowments.EthereumProvider]: {
+                  caveats: [],
+                  date: 1664187844588,
+                  id: 'izn0WGUO8cvq_jqvLQuQP',
+                  invoker: MOCK_ORIGIN,
+                  parentCapability: SnapEndowments.EthereumProvider,
+                },
+                [Caip25EndowmentPermissionName]: {
+                  caveats: [
+                    {
+                      type: Caip25CaveatType,
+                      value: {
+                        isMultichainOrigin: false,
+                        optionalScopes: {
+                          'wallet:eip155': {
+                            accounts: [
+                              '0x1234567890123456789012345678901234567890',
+                            ],
+                          },
+                        },
+                        requiredScopes: {},
+                        sessionProperties: {},
+                      },
+                    },
+                  ],
+                  date: 1723635247705,
+                  id: 'izn0WGUO8cvq_jqvLQuQP',
+                  invoker: MOCK_SNAP_ID,
+                  parentCapability: Caip25EndowmentPermissionName,
+                },
+              },
+            },
+          },
+        },
+
+        SelectedNetworkController: {
+          domains: {
+            [METAMASK_DOMAIN]: 'mainnet',
+          },
+        },
+      },
+    };
+
+    const newStorage = await migrate(oldStorage);
+    expect(newStorage.data.PermissionController).toStrictEqual({
+      subjects: {
+        [MOCK_SNAP_ID]: {
+          permissions: {
+            [SnapEndowments.EthereumProvider]: {
+              caveats: [],
+              date: 1664187844588,
+              id: 'izn0WGUO8cvq_jqvLQuQP',
+              invoker: MOCK_ORIGIN,
+              parentCapability: SnapEndowments.EthereumProvider,
+            },
+            [Caip25EndowmentPermissionName]: {
+              caveats: [
+                {
+                  type: Caip25CaveatType,
+                  value: {
+                    isMultichainOrigin: false,
+                    optionalScopes: {
+                      'wallet:eip155': {
+                        accounts: [
+                          '0x1234567890123456789012345678901234567890',
+                        ],
+                      },
+                      'eip155:1': {
+                        accounts: [],
+                      },
+                    },
+                    requiredScopes: {},
+                    sessionProperties: {},
+                  },
+                },
+              ],
+              date: 1723635247705,
+              id: 'izn0WGUO8cvq_jqvLQuQP',
+              invoker: MOCK_SNAP_ID,
+              parentCapability: Caip25EndowmentPermissionName,
+            },
+          },
+        },
+      },
+    });
+
+    expect(newStorage.data.SelectedNetworkController).toStrictEqual({
+      domains: {
+        [METAMASK_DOMAIN]: 'mainnet',
+        [MOCK_SNAP_ID]: 'mainnet',
+      },
+    });
+  });
+
+  it(`does not modify Snaps that don't have the \`endowment:ethereum-provider\` permission`, async () => {
+    const oldStorage = {
+      meta: { version: oldVersion },
+      data: {
+        NetworkController: {
+          selectedNetworkClientId: 'mainnet',
+          networkConfigurationsByChainId: {
+            '0x1': {
+              rpcEndpoints: [
+                {
+                  networkClient: 'mainnet',
+                },
+              ],
+            },
+            '0xe705': {
+              rpcEndpoints: [
+                {
+                  networkClient: 'linea-sepolia',
+                },
+              ],
+            },
+          },
+        },
+
+        PermissionController: {
+          subjects: {
+            [MOCK_SNAP_ID]: {
+              permissions: {
+                [SnapEndowments.HomePage]: {
+                  caveats: [],
+                  date: 1664187844588,
+                  id: 'izn0WGUO8cvq_jqvLQuQP',
+                  invoker: MOCK_ORIGIN,
+                  parentCapability: SnapEndowments.HomePage,
+                },
+              },
+            },
+          },
+        },
+
+        SelectedNetworkController: {
+          domains: {
+            [METAMASK_DOMAIN]: 'mainnet',
+          },
+        },
+      },
+    };
+
+    const newStorage = await migrate(oldStorage);
+    expect(newStorage.data.NetworkController).toStrictEqual(
+      oldStorage.data.NetworkController,
+    );
+    expect(newStorage.data.PermissionController).toStrictEqual(
+      oldStorage.data.PermissionController,
+    );
+    expect(newStorage.data.SelectedNetworkController).toStrictEqual(
+      oldStorage.data.SelectedNetworkController,
+    );
+  });
+});
diff --git a/app/scripts/migrations/160.ts b/app/scripts/migrations/160.ts
new file mode 100644
index 000000000000..d534b5dcc915
--- /dev/null
+++ b/app/scripts/migrations/160.ts
@@ -0,0 +1,314 @@
+import { cloneDeep } from 'lodash';
+import { hasProperty, Hex, isObject, RuntimeObject } from '@metamask/utils';
+import { nanoid } from 'nanoid';
+import type {
+  PermissionConstraint,
+  PermissionControllerSubjects,
+} from '@metamask/permission-controller';
+import { SnapEndowments } from '@metamask/snaps-rpc-methods';
+import {
+  Caip25CaveatType,
+  Caip25EndowmentPermissionName,
+  addPermittedEthChainId,
+  Caip25CaveatValue,
+} from '@metamask/chain-agnostic-permission';
+
+type GenericPermissionControllerSubject =
+  PermissionControllerSubjects<PermissionConstraint>[string];
+
+export const version = 160;
+
+/**
+ * A map of the networks built into the extension at the time of this migration
+ * to their chain IDs.
+ *
+ * @see https://github.com/MetaMask/metamask-extension/blob/5b5c04a16fb7937a6e9d59b1debe4713978ef39d/shared/constants/network.ts#L535
+ */
+const BUILT_IN_NETWORKS: ReadonlyMap<string, Hex> = new Map([
+  ['sepolia', '0xaa36a7'],
+  ['mainnet', '0x1'],
+  ['linea-sepolia', '0xe705'],
+  ['linea-mainnet', '0xe708'],
+]);
+
+/**
+ * This migration adds or modifies the `endowment:caip25` permission for all
+ * Snaps that have the `endowment:ethereum-provider` permission, and sets the
+ * selected chain ID for each Snap to the current selected network chain ID.
+ *
+ * This is to enable Snaps to change their network which has become necessary
+ * since the extension has switched to a per origin selected network system -
+ * previously all origins shared the single selected network of the wallet.
+ *
+ * To simplify the use for Snaps, we automatically add or modify the
+ * `endowment:caip25` permission with the current selected network chain ID to
+ * all Snaps that have the `endowment:ethereum-provider` permission.
+ *
+ * @param originalVersionedData - Versioned MetaMask extension state, exactly
+ * what we persist to dist.
+ * @param originalVersionedData.meta - State metadata.
+ * @param originalVersionedData.meta.version - The current state version.
+ * @param originalVersionedData.data - The persisted MetaMask state, keyed by
+ * controller.
+ * @returns Updated versioned MetaMask extension state.
+ */
+export async function migrate(originalVersionedData: {
+  meta: { version: number };
+  data: Record<string, unknown>;
+}) {
+  const versionedData = cloneDeep(originalVersionedData);
+  versionedData.meta.version = version;
+  versionedData.data = transformState(versionedData.data);
+  return versionedData;
+}
+
+/**
+ * Transform the MetaMask extension state to add or modify the
+ * `endowment:caip25` permission for all Snaps that have the
+ * `endowment:ethereum-provider` permission.
+ *
+ * If the `NetworkController`, `PermissionController`, or
+ * `SelectedNetworkController` state is not found or is not an object, the state
+ * is returned as-is.
+ *
+ * @param state - The MetaMask extension state.
+ * @returns The updated MetaMask extension state.
+ */
+function transformState(state: Record<string, unknown>) {
+  const {
+    NetworkController: networkControllerState,
+    PermissionController: permissionControllerState,
+    SelectedNetworkController: selectedNetworkControllerState,
+  } = state;
+
+  if (!networkControllerState || !isObject(networkControllerState)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !hasProperty(networkControllerState, 'selectedNetworkClientId') ||
+    typeof networkControllerState.selectedNetworkClientId !== 'string'
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController.selectedNetworkClientId` is not a string.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !hasProperty(networkControllerState, 'networkConfigurationsByChainId') ||
+    !isObject(networkControllerState.networkConfigurationsByChainId)
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController.networkConfigurationsByChainId` is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!permissionControllerState || !isObject(permissionControllerState)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `PermissionController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!isObject(permissionControllerState.subjects)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `PermissionController.subjects` state is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !selectedNetworkControllerState ||
+    !isObject(selectedNetworkControllerState)
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `SelectedNetworkController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!isObject(selectedNetworkControllerState.domains)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `SelectedNetworkController.domains` state is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  const currentChainId = getChainId(
+    networkControllerState.selectedNetworkClientId,
+    networkControllerState.networkConfigurationsByChainId,
+  );
+
+  if (typeof currentChainId !== 'string') {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: No currently selected chainId was found, or the chainId resolved from the `NetworkController.selectedNetworkClientId` value is not a string.',
+      ),
+    );
+
+    return state;
+  }
+
+  const updatedSubjects: string[] = [];
+
+  // Add permission to use the current globally selected network to all Snaps
+  // that have the `endowment:ethereum-provider` permission.
+  const entries = Object.entries(permissionControllerState.subjects) as [
+    string,
+    GenericPermissionControllerSubject,
+  ][];
+
+  permissionControllerState.subjects = entries.reduce<
+    PermissionControllerSubjects<PermissionConstraint>
+  >((accumulator, [key, subject]) => {
+    const permissionKeys = Object.keys(subject.permissions);
+    const needsMigration = permissionKeys.includes(
+      SnapEndowments.EthereumProvider,
+    );
+
+    if (!needsMigration) {
+      return {
+        ...accumulator,
+        [key]: subject,
+      };
+    }
+
+    updatedSubjects.push(key);
+
+    const caip25PermissionCaveatWithCurrentChainIdSet = addPermittedEthChainId(
+      getExistingCaip25PermissionCaveat(subject),
+      currentChainId,
+    );
+
+    const {
+      date = Date.now(),
+      id = nanoid(),
+      invoker = key,
+      parentCapability = Caip25EndowmentPermissionName,
+    } = subject.permissions[Caip25EndowmentPermissionName] ?? {};
+
+    const newSubject: GenericPermissionControllerSubject = {
+      ...subject,
+      permissions: {
+        ...subject.permissions,
+        [Caip25EndowmentPermissionName]: {
+          caveats: [
+            {
+              type: Caip25CaveatType,
+              value: caip25PermissionCaveatWithCurrentChainIdSet,
+            },
+          ],
+          date,
+          id,
+          invoker,
+          parentCapability,
+        },
+      },
+    };
+
+    return {
+      ...accumulator,
+      [key]: newSubject,
+    };
+  }, {});
+
+  const currentDomains = selectedNetworkControllerState.domains;
+  const domains = Object.fromEntries(
+    updatedSubjects.map((subject) => [
+      subject,
+      networkControllerState.selectedNetworkClientId,
+    ]),
+  );
+
+  selectedNetworkControllerState.domains = {
+    ...currentDomains,
+    ...domains,
+  };
+
+  return state;
+}
+
+/**
+ * Get the existing `endowment:caip25` caveat value for a given subject, if any.
+ * If the caveat does not exist, a new empty caveat value is returned.
+ *
+ * This function does not validate the structure of the existing caveat value,
+ * and assumes that the existing value is valid.
+ *
+ * @param subject - The subject to get the existing caveat value for.
+ * @returns The existing `endowment:caip25` caveat value.
+ */
+function getExistingCaip25PermissionCaveat(
+  subject: GenericPermissionControllerSubject,
+): Caip25CaveatValue {
+  const existingCaveat = subject.permissions[
+    Caip25EndowmentPermissionName
+  ]?.caveats?.find((caveat) => caveat.type === Caip25CaveatType);
+
+  if (!existingCaveat) {
+    return {
+      isMultichainOrigin: false,
+      optionalScopes: {},
+      requiredScopes: {},
+      sessionProperties: {},
+    };
+  }
+
+  return existingCaveat.value as Caip25CaveatValue;
+}
+
+function getChainId(
+  networkClientId: string,
+  networkConfigurationsByChainId: RuntimeObject,
+): Hex | undefined {
+  const matchingNetworkConfigurationEntry = Object.entries(
+    networkConfigurationsByChainId,
+  ).find(([, config]) => {
+    if (
+      !isObject(config) ||
+      !hasProperty(config, 'rpcEndpoints') ||
+      !Array.isArray(config.rpcEndpoints)
+    ) {
+      return false;
+    }
+
+    return config.rpcEndpoints.some(
+      (endpoint) =>
+        isObject(endpoint) && endpoint.networkClientId === networkClientId,
+    );
+  });
+
+  if (matchingNetworkConfigurationEntry) {
+    // `matchingNetworkConfigurationEntry` is a tuple of [chainId, config], so
+    // we return the first element of the tuple, which is the chainId.
+    return matchingNetworkConfigurationEntry[0] as Hex;
+  }
+
+  return BUILT_IN_NETWORKS.get(networkClientId);
+}
diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js
index 616e6876231e..be8079887439 100644
--- a/app/scripts/migrations/index.js
+++ b/app/scripts/migrations/index.js
@@ -189,6 +189,7 @@ const migrations = [
   require('./157'),
   require('./158'),
   require('./159'),
+  require('./160'),
 ];
 
 export default migrations;
diff --git a/builds.yml b/builds.yml
index d6b6b9ffb85e..25f7438052c7 100644
--- a/builds.yml
+++ b/builds.yml
@@ -31,7 +31,7 @@ buildTypes:
       - ALLOW_LOCAL_SNAPS: false
       - REQUIRE_SNAPS_ALLOWLIST: true
       - REJECT_INVALID_SNAPS_PLATFORM_VERSION: true
-      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.0.1/index.html
+      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.1.0/index.html
       - ACCOUNT_SNAPS_DIRECTORY_URL: https://snaps.metamask.io/account-management
     # Main build uses the default browser manifest
     manifestOverrides: false
@@ -58,7 +58,7 @@ buildTypes:
       - ALLOW_LOCAL_SNAPS: false
       - REQUIRE_SNAPS_ALLOWLIST: true
       - REJECT_INVALID_SNAPS_PLATFORM_VERSION: true
-      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.0.1/index.html
+      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.1.0/index.html
       - ACCOUNT_SNAPS_DIRECTORY_URL: https://snaps.metamask.io/account-management
     # Modifies how the version is displayed.
     # eg. instead of 10.25.0 -> 10.25.0-beta.2
@@ -85,7 +85,7 @@ buildTypes:
       - ALLOW_LOCAL_SNAPS: true
       - REQUIRE_SNAPS_ALLOWLIST: false
       - REJECT_INVALID_SNAPS_PLATFORM_VERSION: false
-      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.0.1/index.html
+      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.1.0/index.html
       - SUPPORT_LINK: https://support.metamask.io/
       - SUPPORT_REQUEST_LINK: https://support.metamask.io/
       - INFURA_ENV_KEY_REF: INFURA_FLASK_PROJECT_ID
@@ -109,7 +109,7 @@ buildTypes:
       - ALLOW_LOCAL_SNAPS: false
       - REQUIRE_SNAPS_ALLOWLIST: true
       - REJECT_INVALID_SNAPS_PLATFORM_VERSION: true
-      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.0.1/index.html
+      - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/8.1.0/index.html
       - MMI_CONFIGURATION_SERVICE_URL: https://configuration.metamask-institutional.io/v2/configuration/default
       - SUPPORT_LINK: https://support.metamask-institutional.io
       - SUPPORT_REQUEST_LINK: https://support.metamask-institutional.io
diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json
index f4b029acf708..7f2d1ac4a591 100644
--- a/lavamoat/browserify/beta/policy.json
+++ b/lavamoat/browserify/beta/policy.json
@@ -1134,14 +1134,6 @@
         "immer": true
       }
     },
-    "@metamask/selected-network-controller>@metamask/base-controller": {
-      "globals": {
-        "setTimeout": true
-      },
-      "packages": {
-        "immer": true
-      }
-    },
     "@metamask/bridge-controller": {
       "globals": {
         "AbortController": true,
@@ -2072,7 +2064,7 @@
     },
     "@metamask/selected-network-controller": {
       "packages": {
-        "@metamask/selected-network-controller>@metamask/base-controller": true,
+        "@metamask/base-controller": true,
         "@metamask/network-controller>@metamask/swappable-obj-proxy": true
       }
     },
diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json
index f4b029acf708..7f2d1ac4a591 100644
--- a/lavamoat/browserify/flask/policy.json
+++ b/lavamoat/browserify/flask/policy.json
@@ -1134,14 +1134,6 @@
         "immer": true
       }
     },
-    "@metamask/selected-network-controller>@metamask/base-controller": {
-      "globals": {
-        "setTimeout": true
-      },
-      "packages": {
-        "immer": true
-      }
-    },
     "@metamask/bridge-controller": {
       "globals": {
         "AbortController": true,
@@ -2072,7 +2064,7 @@
     },
     "@metamask/selected-network-controller": {
       "packages": {
-        "@metamask/selected-network-controller>@metamask/base-controller": true,
+        "@metamask/base-controller": true,
         "@metamask/network-controller>@metamask/swappable-obj-proxy": true
       }
     },
diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json
index f4b029acf708..7f2d1ac4a591 100644
--- a/lavamoat/browserify/main/policy.json
+++ b/lavamoat/browserify/main/policy.json
@@ -1134,14 +1134,6 @@
         "immer": true
       }
     },
-    "@metamask/selected-network-controller>@metamask/base-controller": {
-      "globals": {
-        "setTimeout": true
-      },
-      "packages": {
-        "immer": true
-      }
-    },
     "@metamask/bridge-controller": {
       "globals": {
         "AbortController": true,
@@ -2072,7 +2064,7 @@
     },
     "@metamask/selected-network-controller": {
       "packages": {
-        "@metamask/selected-network-controller>@metamask/base-controller": true,
+        "@metamask/base-controller": true,
         "@metamask/network-controller>@metamask/swappable-obj-proxy": true
       }
     },
diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json
index 6c10c36ffd29..75ec3357e0bf 100644
--- a/lavamoat/browserify/mmi/policy.json
+++ b/lavamoat/browserify/mmi/policy.json
@@ -1265,14 +1265,6 @@
         "immer": true
       }
     },
-    "@metamask/selected-network-controller>@metamask/base-controller": {
-      "globals": {
-        "setTimeout": true
-      },
-      "packages": {
-        "immer": true
-      }
-    },
     "@metamask/bridge-controller": {
       "globals": {
         "AbortController": true,
@@ -2203,7 +2195,7 @@
     },
     "@metamask/selected-network-controller": {
       "packages": {
-        "@metamask/selected-network-controller>@metamask/base-controller": true,
+        "@metamask/base-controller": true,
         "@metamask/network-controller>@metamask/swappable-obj-proxy": true
       }
     },
diff --git a/package.json b/package.json
index 9ec5737d6ded..5b8629c7ab79 100644
--- a/package.json
+++ b/package.json
@@ -193,7 +193,7 @@
     "semver@7.3.7": "^7.5.4",
     "semver@7.3.8": "^7.5.4",
     "lavamoat-core@npm:^16.2.2": "patch:lavamoat-core@npm%3A16.2.2#~/.yarn/patches/lavamoat-core-npm-16.2.2-e361ff1f8a.patch",
-    "@metamask/snaps-sdk": "^6.23.0",
+    "@metamask/snaps-sdk": "^6.24.0",
     "@swc/types@0.1.5": "^0.1.6",
     "@babel/core": "patch:@babel/core@npm%3A7.25.9#~/.yarn/patches/@babel-core-npm-7.25.9-4ae3bff7f3.patch",
     "@babel/runtime": "patch:@babel/runtime@npm%3A7.25.9#~/.yarn/patches/@babel-runtime-npm-7.25.9-fe8c62510a.patch",
@@ -317,7 +317,7 @@
     "@metamask/phishing-controller": "^12.3.2",
     "@metamask/post-message-stream": "^10.0.0",
     "@metamask/ppom-validator": "0.36.0",
-    "@metamask/preinstalled-example-snap": "^0.3.0",
+    "@metamask/preinstalled-example-snap": "^0.4.0",
     "@metamask/profile-sync-controller": "^14.0.0",
     "@metamask/providers": "^22.1.0",
     "@metamask/rate-limit-controller": "^6.0.3",
@@ -325,14 +325,14 @@
     "@metamask/rpc-errors": "^7.0.0",
     "@metamask/safe-event-emitter": "^3.1.1",
     "@metamask/scure-bip39": "^2.0.3",
-    "@metamask/selected-network-controller": "^19.0.0",
+    "@metamask/selected-network-controller": "^22.1.0",
     "@metamask/signature-controller": "^27.1.0",
     "@metamask/smart-transactions-controller": "^16.3.1",
-    "@metamask/snaps-controllers": "^12.0.1",
-    "@metamask/snaps-execution-environments": "^8.0.1",
-    "@metamask/snaps-rpc-methods": "^12.2.0",
-    "@metamask/snaps-sdk": "^6.23.0",
-    "@metamask/snaps-utils": "^9.2.2",
+    "@metamask/snaps-controllers": "^12.1.0",
+    "@metamask/snaps-execution-environments": "^8.1.0",
+    "@metamask/snaps-rpc-methods": "^12.3.0",
+    "@metamask/snaps-sdk": "^6.24.0",
+    "@metamask/snaps-utils": "^9.3.0",
     "@metamask/solana-wallet-snap": "^1.29.0",
     "@metamask/solana-wallet-standard": "^0.4.1",
     "@metamask/transaction-controller": "^56.1.0",
diff --git a/test/e2e/flask/snaps/preinstalled-example.spec.ts b/test/e2e/flask/snaps/preinstalled-example.spec.ts
index 217ca32fe5fa..412871b33ea4 100644
--- a/test/e2e/flask/snaps/preinstalled-example.spec.ts
+++ b/test/e2e/flask/snaps/preinstalled-example.spec.ts
@@ -7,9 +7,8 @@ import { withFixtures, WINDOW_TITLES } from '../../helpers';
 import SettingsPage from '../../page-objects/pages/settings/settings-page';
 import PreinstalledExampleSettings from '../../page-objects/pages/settings/preinstalled-example-settings';
 import { TestSnaps } from '../../page-objects/pages/test-snaps';
-import SnapInstall from '../../page-objects/pages/dialog/snap-install';
 
-describe('Pre-install example', function () {
+describe('Preinstalled example Snap', function () {
   it('can display the Snap settings page', async function () {
     await withFixtures(
       {
@@ -31,13 +30,10 @@ describe('Pre-install example', function () {
         );
         await preInstalledExample.check_selectedDropdownOption('Option 2');
 
-        // Navigate to `test-snaps` page, click connect Preinstalled button, connect and approve
+        // Navigate to `test-snaps` page, we don't need to connect because the Snap uses
+        // initialConnections to pre-approve the dapp.
         const testSnaps = new TestSnaps(driver);
-        const snapInstall = new SnapInstall(driver);
         await testSnaps.openPage();
-        await testSnaps.scrollAndClickButton('connectPreinstalledButton');
-        await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
-        await snapInstall.clickConnectButton();
         await driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps);
         await testSnaps.clickButton('getSettingsStateButton');
         const jsonTextValidation = '"setting1": true';
@@ -48,6 +44,31 @@ describe('Pre-install example', function () {
       },
     );
   });
+
+  it('can use initialConnections to allow JSON-RPC', async function () {
+    await withFixtures(
+      {
+        fixtures: new FixtureBuilder().build(),
+        title: this.test?.fullTitle(),
+      },
+      async ({ driver }: { driver: Driver }) => {
+        await loginWithoutBalanceValidation(driver);
+
+        const testSnaps = new TestSnaps(driver);
+        await testSnaps.openPage();
+
+        // This test clicks this button without connecting and functions as E2E
+        // for the initialConnections functionality.
+        await testSnaps.scrollAndClickButton('showPreinstalledDialogButton');
+        await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
+
+        await driver.waitForSelector({
+          css: '.snap-ui-renderer__text',
+          text: 'This is a custom dialog. It has a custom footer and can be resolved to any value.',
+        });
+      },
+    );
+  });
 });
 
 async function navigateToPreInstalledExample(driver: Driver) {
diff --git a/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.2.1.txt b/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.2.1.txt
deleted file mode 100644
index 670ced97f59e..000000000000
Binary files a/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.2.1.txt and /dev/null differ
diff --git a/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.2.1-headers.json b/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0-headers.json
similarity index 57%
rename from test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.2.1-headers.json
rename to test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0-headers.json
index 275060831704..f1696b9b2c86 100644
--- a/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.2.1-headers.json
+++ b/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0-headers.json
@@ -1,7 +1,7 @@
 {
   "Accept-Ranges": "bytes",
-  "Content-Length": "13766",
+  "Content-Length": "13829",
   "Content-Type": "application/octet-stream",
-  "Etag": "\"2334ecd5d580bb940c25991210f3f063\"",
+  "Etag": "\"f5c4b16a8874ad5bf66af1f38f3a202c\"",
   "Vary": "Accept-Encoding"
 }
diff --git a/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0.txt b/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0.txt
new file mode 100644
index 000000000000..37864ac6dbfe
Binary files /dev/null and b/test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0.txt differ
diff --git a/test/e2e/page-objects/pages/test-snaps.ts b/test/e2e/page-objects/pages/test-snaps.ts
index cf1351cb0c4b..823dd5511ed1 100644
--- a/test/e2e/page-objects/pages/test-snaps.ts
+++ b/test/e2e/page-objects/pages/test-snaps.ts
@@ -1,4 +1,5 @@
 import { isEqual } from 'lodash';
+import { GetPreferencesResult } from '@metamask/snaps-sdk';
 import { Driver } from '../../webdriver/driver';
 import { TEST_SNAPS_WEBSITE_URL } from '../../snaps/enums';
 
@@ -80,6 +81,7 @@ export const buttonLocator = {
   sendUnencryptedStateButton: '#sendUnencryptedState',
   sendGetUnencryptedStateButton: '#sendGetUnencryptedState',
   clearStateUnencryptedButton: '#clearStateUnencrypted',
+  showPreinstalledDialogButton: '#showPreinstalledDialog',
 } satisfies Record<string, string>;
 
 const spanLocator = {
@@ -257,18 +259,7 @@ export class TestSnaps {
    * @param expectedPreferences.displayNftMedia
    * @param expectedPreferences.useNftDetection
    */
-  async check_preferencesResult(expectedPreferences: {
-    locale: string;
-    currency: string;
-    hideBalances: boolean;
-    useSecurityAlerts: boolean;
-    useExternalPricingData: boolean;
-    simulateOnChainActions: boolean;
-    useTokenDetection: boolean;
-    batchCheckBalances: boolean;
-    displayNftMedia: boolean;
-    useNftDetection: boolean;
-  }) {
+  async check_preferencesResult(expectedPreferences: GetPreferencesResult) {
     console.log('Validating preferences result span JSON response');
 
     const element = await this.driver.findElement(
diff --git a/test/e2e/snaps/enums.js b/test/e2e/snaps/enums.js
index 3d7db03af13b..f9daec47fa7f 100644
--- a/test/e2e/snaps/enums.js
+++ b/test/e2e/snaps/enums.js
@@ -1,3 +1,3 @@
 module.exports = {
-  TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/snaps/test-snaps/2.21.1',
+  TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/snaps/test-snaps/2.22.0',
 };
diff --git a/test/e2e/snaps/test-snap-ethprovider.spec.js b/test/e2e/snaps/test-snap-ethprovider.spec.js
index 87ec6c0e2c35..4a5bec26fedc 100644
--- a/test/e2e/snaps/test-snap-ethprovider.spec.js
+++ b/test/e2e/snaps/test-snap-ethprovider.spec.js
@@ -156,7 +156,7 @@ describe('Test Snap ethereum_provider', function () {
         await driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps);
         await driver.waitForSelector({
           css: '#signTypedDataResult',
-          text: '"0x18d05f8139ad66d581fb658aca4d41950c6f38a8daeb3adfdb18614e645bf73508a4c24d4fc4026b5d447d223fcf026a32947846205f663c536df8a7b4d841fe1c"',
+          text: '"0x7024dc071a7370eee444b2a3edc08d404dd03393694403cdca864653a7e8dd7c583419293d53602666cbe77faa8819fba04f8c57e95df2d4c0190968eece28021c"',
         });
       },
     );
diff --git a/test/e2e/snaps/test-snap-get-preferences.spec.ts b/test/e2e/snaps/test-snap-get-preferences.spec.ts
index f3be0b6cb7c3..e31e2a61b38c 100644
--- a/test/e2e/snaps/test-snap-get-preferences.spec.ts
+++ b/test/e2e/snaps/test-snap-get-preferences.spec.ts
@@ -14,6 +14,7 @@ describe('Test Snap get preferences', function () {
           .withPreferencesController({
             preferences: {
               privacyMode: true,
+              showTestNetworks: true,
             },
           })
           .build(),
@@ -48,6 +49,7 @@ describe('Test Snap get preferences', function () {
           batchCheckBalances: true,
           displayNftMedia: false,
           useNftDetection: false,
+          showTestnets: true,
         });
       },
     );
diff --git a/yarn.lock b/yarn.lock
index 5216dbd38735..9bf4377e0960 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6282,12 +6282,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@metamask/preinstalled-example-snap@npm:^0.3.0":
-  version: 0.3.0
-  resolution: "@metamask/preinstalled-example-snap@npm:0.3.0"
+"@metamask/preinstalled-example-snap@npm:^0.4.0":
+  version: 0.4.0
+  resolution: "@metamask/preinstalled-example-snap@npm:0.4.0"
   dependencies:
-    "@metamask/snaps-sdk": "npm:^6.14.0"
-  checksum: 10/add8f89c1b7327bc90486d868a9d4b7eff426ef98a5a96235fc6fdce4710c6d17842636ccd02db6638d061ce2b16939c6fe1f06e69cdde8bde2f6026c7b82df5
+    "@metamask/snaps-sdk": "npm:^6.24.0"
+  checksum: 10/348987db7c01472b7eaac9ae345407fa3aa83a0b5490a4c3ed74c664a1c3bdfa0a36b69484fe48f1253b8a237c9f8bb771697ff06292f2b72ad949569fbf0a05
   languageName: node
   linkType: hard
 
@@ -6386,18 +6386,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@metamask/selected-network-controller@npm:^19.0.0":
-  version: 19.0.0
-  resolution: "@metamask/selected-network-controller@npm:19.0.0"
+"@metamask/selected-network-controller@npm:^22.1.0":
+  version: 22.1.0
+  resolution: "@metamask/selected-network-controller@npm:22.1.0"
   dependencies:
-    "@metamask/base-controller": "npm:^7.0.1"
-    "@metamask/json-rpc-engine": "npm:^10.0.0"
-    "@metamask/swappable-obj-proxy": "npm:^2.2.0"
-    "@metamask/utils": "npm:^10.0.0"
+    "@metamask/base-controller": "npm:^8.0.1"
+    "@metamask/json-rpc-engine": "npm:^10.0.3"
+    "@metamask/swappable-obj-proxy": "npm:^2.3.0"
+    "@metamask/utils": "npm:^11.2.0"
   peerDependencies:
-    "@metamask/network-controller": ^22.0.0
+    "@metamask/network-controller": ^23.0.0
     "@metamask/permission-controller": ^11.0.0
-  checksum: 10/738a1c749f442b732c279c7446e0db2cc7d72fa03fd485da15121559077bb6ffeaa3233435a028f4ea69015a40ca35ba66972dc0fd3a7f61a7ea5eee43df30a6
+  checksum: 10/e1baeb274cddf62a2b6962cbcac34a1a0e7fd7da9321c392652f95a3a63d9e0bd898dc5ed0334b47c7f1502355873299bf8d45a6fae515f7b13b3af1915a8e20
   languageName: node
   linkType: hard
 
@@ -6457,9 +6457,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@metamask/snaps-controllers@npm:^12.0.1":
-  version: 12.0.1
-  resolution: "@metamask/snaps-controllers@npm:12.0.1"
+"@metamask/snaps-controllers@npm:^12.1.0":
+  version: 12.1.0
+  resolution: "@metamask/snaps-controllers@npm:12.1.0"
   dependencies:
     "@metamask/approval-controller": "npm:^7.1.3"
     "@metamask/base-controller": "npm:^8.0.1"
@@ -6472,9 +6472,9 @@ __metadata:
     "@metamask/post-message-stream": "npm:^10.0.0"
     "@metamask/rpc-errors": "npm:^7.0.2"
     "@metamask/snaps-registry": "npm:^3.2.3"
-    "@metamask/snaps-rpc-methods": "npm:^12.2.0"
-    "@metamask/snaps-sdk": "npm:^6.23.0"
-    "@metamask/snaps-utils": "npm:^9.2.2"
+    "@metamask/snaps-rpc-methods": "npm:^12.3.0"
+    "@metamask/snaps-sdk": "npm:^6.24.0"
+    "@metamask/snaps-utils": "npm:^9.3.0"
     "@metamask/utils": "npm:^11.4.0"
     "@xstate/fsm": "npm:^2.0.0"
     async-mutex: "npm:^0.5.0"
@@ -6490,29 +6490,29 @@ __metadata:
     semver: "npm:^7.5.4"
     tar-stream: "npm:^3.1.7"
   peerDependencies:
-    "@metamask/snaps-execution-environments": ^8.0.1
+    "@metamask/snaps-execution-environments": ^8.1.0
   peerDependenciesMeta:
     "@metamask/snaps-execution-environments":
       optional: true
-  checksum: 10/50495ba4e8b512fd4674bc241ac9c95a2182518a4fe101851e62df167169a36c6eb012b5e662933e02dd296ea2e49f0f085c659317000d2a8d6778da84e42e36
+  checksum: 10/de844bcc532ac967c0b9111aff8ca8ea61f106065454b0f571b93c637e9e2e7d8b6344a50c355d6ea9f8f933b6c29fccc28b2da29df47ff5b165138ed08f2232
   languageName: node
   linkType: hard
 
-"@metamask/snaps-execution-environments@npm:^8.0.1":
-  version: 8.0.1
-  resolution: "@metamask/snaps-execution-environments@npm:8.0.1"
+"@metamask/snaps-execution-environments@npm:^8.1.0":
+  version: 8.1.0
+  resolution: "@metamask/snaps-execution-environments@npm:8.1.0"
   dependencies:
     "@metamask/json-rpc-engine": "npm:^10.0.2"
     "@metamask/object-multiplex": "npm:^2.1.0"
     "@metamask/post-message-stream": "npm:^10.0.0"
     "@metamask/providers": "npm:^22.1.0"
     "@metamask/rpc-errors": "npm:^7.0.2"
-    "@metamask/snaps-sdk": "npm:^6.23.0"
-    "@metamask/snaps-utils": "npm:^9.2.2"
+    "@metamask/snaps-sdk": "npm:^6.24.0"
+    "@metamask/snaps-utils": "npm:^9.3.0"
     "@metamask/superstruct": "npm:^3.2.1"
     "@metamask/utils": "npm:^11.4.0"
     readable-stream: "npm:^3.6.2"
-  checksum: 10/36ab76ce5aee1d8357615078ca296b33cdf87225b0dba54a3a84b95092aa37be8170b7f93458f467adb25ed0b36f85611a9f9d4e5fbcd3cb2228baf20a7df503
+  checksum: 10/b4450dc1e88dc496dd2e33f42e1e490abb54580a7c7fe2c5768f16dd05638e7976ae7eb458138d286555749a6c85ae94ec6e3e3aa946b53869fe3196577ecfd0
   languageName: node
   linkType: hard
 
@@ -6528,33 +6528,33 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@metamask/snaps-rpc-methods@npm:^12.2.0":
-  version: 12.2.0
-  resolution: "@metamask/snaps-rpc-methods@npm:12.2.0"
+"@metamask/snaps-rpc-methods@npm:^12.3.0":
+  version: 12.3.0
+  resolution: "@metamask/snaps-rpc-methods@npm:12.3.0"
   dependencies:
     "@metamask/key-tree": "npm:^10.1.1"
     "@metamask/permission-controller": "npm:^11.0.6"
     "@metamask/rpc-errors": "npm:^7.0.2"
-    "@metamask/snaps-sdk": "npm:^6.23.0"
-    "@metamask/snaps-utils": "npm:^9.2.2"
+    "@metamask/snaps-sdk": "npm:^6.24.0"
+    "@metamask/snaps-utils": "npm:^9.3.0"
     "@metamask/superstruct": "npm:^3.2.1"
     "@metamask/utils": "npm:^11.4.0"
     "@noble/hashes": "npm:^1.7.1"
     luxon: "npm:^3.5.0"
-  checksum: 10/15833b8262f3cd3c33c510f844bb47a8f6d8ff611907a230645366965c2d170046297b1412f3901ee7330b0cbff3e9fc4db85b34dcafc40a5c3167a9cf9a66b5
+  checksum: 10/0a21db072a046766d8375b3bb53cee07278d0e3408a02652bdffe518fe05d9090854a85fc2ea01bf1e59228ab1198a562538e789345d56106c0fdbd49a708550
   languageName: node
   linkType: hard
 
-"@metamask/snaps-sdk@npm:^6.23.0":
-  version: 6.23.0
-  resolution: "@metamask/snaps-sdk@npm:6.23.0"
+"@metamask/snaps-sdk@npm:^6.24.0":
+  version: 6.24.0
+  resolution: "@metamask/snaps-sdk@npm:6.24.0"
   dependencies:
     "@metamask/key-tree": "npm:^10.1.1"
     "@metamask/providers": "npm:^22.1.0"
     "@metamask/rpc-errors": "npm:^7.0.2"
     "@metamask/superstruct": "npm:^3.2.1"
     "@metamask/utils": "npm:^11.4.0"
-  checksum: 10/ded883df9849d77431764b07d9e54756fe72276da10d4117ad60427a2719a14f2d8742ec50f9daed0d94d533919d35ab780f5def9f869e92f3ac9811bf2330b8
+  checksum: 10/7db818aed083d8d6a7f4556bdec555376058074519af612644b0030038e468f85eba82ee3b3446e32301cc96f3ab64ff076eb47a8f61d2a55c564b7ed9a9cc8f
   languageName: node
   linkType: hard
 
@@ -6589,9 +6589,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@metamask/snaps-utils@npm:^9.2.0, @metamask/snaps-utils@npm:^9.2.2":
-  version: 9.2.2
-  resolution: "@metamask/snaps-utils@npm:9.2.2"
+"@metamask/snaps-utils@npm:^9.2.0, @metamask/snaps-utils@npm:^9.3.0":
+  version: 9.3.0
+  resolution: "@metamask/snaps-utils@npm:9.3.0"
   dependencies:
     "@babel/core": "npm:^7.23.2"
     "@babel/types": "npm:^7.23.0"
@@ -6601,7 +6601,7 @@ __metadata:
     "@metamask/rpc-errors": "npm:^7.0.2"
     "@metamask/slip44": "npm:^4.1.0"
     "@metamask/snaps-registry": "npm:^3.2.3"
-    "@metamask/snaps-sdk": "npm:^6.23.0"
+    "@metamask/snaps-sdk": "npm:^6.24.0"
     "@metamask/superstruct": "npm:^3.2.1"
     "@metamask/utils": "npm:^11.4.0"
     "@noble/hashes": "npm:^1.7.1"
@@ -6617,7 +6617,7 @@ __metadata:
     semver: "npm:^7.5.4"
     ses: "npm:^1.12.0"
     validate-npm-package-name: "npm:^5.0.0"
-  checksum: 10/4b2acec759300617f0447b95db5a049d47de8de13d88e1c28dee197b7ab44ca7ef01a74c1156a4442e7c3a365db71e9a0e2ee53a7624744250c3dea3635e958e
+  checksum: 10/1eeb3aa795e4a82b005dae418a7a6e9564cab05bbc828c3a43ea5651dcc12541f0441b6dae741d1b90163e9880a93c992758f0c728fc102eadc4a26812157798
   languageName: node
   linkType: hard
 
@@ -6649,7 +6649,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@metamask/swappable-obj-proxy@npm:^2.2.0, @metamask/swappable-obj-proxy@npm:^2.3.0":
+"@metamask/swappable-obj-proxy@npm:^2.3.0":
   version: 2.3.0
   resolution: "@metamask/swappable-obj-proxy@npm:2.3.0"
   checksum: 10/1255c599de9237f06df2390719d6dfcb1f168873df61bbaad5ce376efbc057e2030260b94855569313faeb412b7df9b062d209f4b0b163a3dc02f29d42139e1f
@@ -6801,23 +6801,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@metamask/utils@npm:^10.0.0":
-  version: 10.0.1
-  resolution: "@metamask/utils@npm:10.0.1"
-  dependencies:
-    "@ethereumjs/tx": "npm:^4.2.0"
-    "@metamask/superstruct": "npm:^3.1.0"
-    "@noble/hashes": "npm:^1.3.1"
-    "@scure/base": "npm:^1.1.3"
-    "@types/debug": "npm:^4.1.7"
-    debug: "npm:^4.3.4"
-    pony-cause: "npm:^2.1.10"
-    semver: "npm:^7.5.4"
-    uuid: "npm:^9.0.1"
-  checksum: 10/c8e3d7578d05a1da4abb6c6712ec78ef6990801269f6529f4bb237b7d6e228d10a40738ccab81ad554f2fd51670267d086dc5be1a31c6d1f7040d4c0469d9d13
-  languageName: node
-  linkType: hard
-
 "@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.1.0, @metamask/utils@npm:^11.2.0, @metamask/utils@npm:^11.4.0":
   version: 11.4.0
   resolution: "@metamask/utils@npm:11.4.0"
@@ -30088,7 +30071,7 @@ __metadata:
     "@metamask/post-message-stream": "npm:^10.0.0"
     "@metamask/ppom-validator": "npm:0.36.0"
     "@metamask/preferences-controller": "npm:^17.0.0"
-    "@metamask/preinstalled-example-snap": "npm:^0.3.0"
+    "@metamask/preinstalled-example-snap": "npm:^0.4.0"
     "@metamask/profile-sync-controller": "npm:^14.0.0"
     "@metamask/providers": "npm:^22.1.0"
     "@metamask/rate-limit-controller": "npm:^6.0.3"
@@ -30096,14 +30079,14 @@ __metadata:
     "@metamask/rpc-errors": "npm:^7.0.0"
     "@metamask/safe-event-emitter": "npm:^3.1.1"
     "@metamask/scure-bip39": "npm:^2.0.3"
-    "@metamask/selected-network-controller": "npm:^19.0.0"
+    "@metamask/selected-network-controller": "npm:^22.1.0"
     "@metamask/signature-controller": "npm:^27.1.0"
     "@metamask/smart-transactions-controller": "npm:^16.3.1"
-    "@metamask/snaps-controllers": "npm:^12.0.1"
-    "@metamask/snaps-execution-environments": "npm:^8.0.1"
-    "@metamask/snaps-rpc-methods": "npm:^12.2.0"
-    "@metamask/snaps-sdk": "npm:^6.23.0"
-    "@metamask/snaps-utils": "npm:^9.2.2"
+    "@metamask/snaps-controllers": "npm:^12.1.0"
+    "@metamask/snaps-execution-environments": "npm:^8.1.0"
+    "@metamask/snaps-rpc-methods": "npm:^12.3.0"
+    "@metamask/snaps-sdk": "npm:^6.24.0"
+    "@metamask/snaps-utils": "npm:^9.3.0"
     "@metamask/solana-wallet-snap": "npm:^1.29.0"
     "@metamask/solana-wallet-standard": "npm:^0.4.1"
     "@metamask/test-bundler": "npm:^1.0.0"


Reviews:
user: login: FrederikBolding
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-16T13:42:13Z
user: login: Mrtenz
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-16T16:13:28Z
user: login: FrederikBolding
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-19T11:30:09Z
user: login: Mrtenz
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-19T11:32:12Z
user: login: FrederikBolding
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-05-19T12:18:05Z
user: login: GuillaumeRx
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T13:51:03Z
user: login: FrederikBolding
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-05-19T16:40:20Z
user: login: FrederikBolding
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-19T17:12:09Z
user: login: adonesky1
body: `wallet_switchEthereumChain` enablement changes (including migration) LGTM!
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T19:59:36Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-19T20:27:35Z
user: login: Mrtenz
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-19T21:00:27Z

Review comments:
diff_hunk: @@ -324,14 +324,14 @@
     "@metamask/rpc-errors": "^7.0.0",
     "@metamask/safe-event-emitter": "^3.1.1",
     "@metamask/scure-bip39": "^2.0.3",
-    "@metamask/selected-network-controller": "^19.0.0",
+    "@metamask/selected-network-controller": "^22.1.0",
path: package.json
user: login: FrederikBolding
body: Do we need to handle any of these breaking changes?
created_at: 2025-05-16T13:42:13Z
author_association: MEMBER
diff_hunk: @@ -324,14 +324,14 @@
     "@metamask/rpc-errors": "^7.0.0",
     "@metamask/safe-event-emitter": "^3.1.1",
     "@metamask/scure-bip39": "^2.0.3",
-    "@metamask/selected-network-controller": "^19.0.0",
+    "@metamask/selected-network-controller": "^22.1.0",
path: package.json
user: login: Mrtenz
body: Doesn't seem like it. 20.0.0 has breaking changes which were reverted in 21.0.0, and the other breaking changes are bumps to `@metamask/network-controller`.
created_at: 2025-05-16T16:13:28Z
author_association: MEMBER
diff_hunk: @@ -509,6 +509,7 @@
     "@types/madge": "^5.0.3",
     "@types/micromatch": "^4",
     "@types/mocha": "^10.0.3",
+    "@types/nanoid": "^3.0.0",
path: package.json
user: login: FrederikBolding
body: This doesn't seem to be required? The version we use of `nanoid` everywhere else has types
created_at: 2025-05-19T11:30:09Z
author_association: MEMBER
diff_hunk: @@ -509,6 +509,7 @@
     "@types/madge": "^5.0.3",
     "@types/micromatch": "^4",
     "@types/mocha": "^10.0.3",
+    "@types/nanoid": "^3.0.0",
path: package.json
user: login: Mrtenz
body: You're right. It was required at some point I think, but works fine without it now.
created_at: 2025-05-19T11:32:12Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,314 @@
+import { cloneDeep } from 'lodash';
+import { hasProperty, Hex, isObject, RuntimeObject } from '@metamask/utils';
+import { nanoid } from 'nanoid';
+import type {
+  PermissionConstraint,
+  PermissionControllerSubjects,
+} from '@metamask/permission-controller';
+import { SnapEndowments } from '@metamask/snaps-rpc-methods';
+import {
+  Caip25CaveatType,
+  Caip25EndowmentPermissionName,
+  addPermittedEthChainId,
+  Caip25CaveatValue,
+} from '@metamask/chain-agnostic-permission';
+
+type GenericPermissionControllerSubject =
+  PermissionControllerSubjects<PermissionConstraint>[string];
+
+export const version = 160;
+
+/**
+ * A map of the networks built into the extension at the time of this migration
+ * to their chain IDs.
+ *
+ * @see https://github.com/MetaMask/metamask-extension/blob/5b5c04a16fb7937a6e9d59b1debe4713978ef39d/shared/constants/network.ts#L535
+ */
+const BUILT_IN_NETWORKS: ReadonlyMap<string, Hex> = new Map([
+  ['sepolia', '0xaa36a7'],
+  ['mainnet', '0x1'],
+  ['linea-sepolia', '0xe705'],
+  ['linea-mainnet', '0xe708'],
+]);
+
+/**
+ * This migration adds or modifies the `endowment:caip25` permission for all
+ * Snaps that have the `endowment:ethereum-provider` permission, and sets the
+ * selected chain ID for each Snap to the current selected network chain ID.
+ *
+ * This is to enable Snaps to change their network which has become necessary
+ * since the extension has switched to a per origin selected network system -
+ * previously all origins shared the single selected network of the wallet.
+ *
+ * To simplify the use for Snaps, we automatically add or modify the
+ * `endowment:caip25` permission with the current selected network chain ID to
+ * all Snaps that have the `endowment:ethereum-provider` permission.
+ *
+ * @param originalVersionedData - Versioned MetaMask extension state, exactly
+ * what we persist to dist.
+ * @param originalVersionedData.meta - State metadata.
+ * @param originalVersionedData.meta.version - The current state version.
+ * @param originalVersionedData.data - The persisted MetaMask state, keyed by
+ * controller.
+ * @returns Updated versioned MetaMask extension state.
+ */
+export async function migrate(originalVersionedData: {
+  meta: { version: number };
+  data: Record<string, unknown>;
+}) {
+  const versionedData = cloneDeep(originalVersionedData);
+  versionedData.meta.version = version;
+  versionedData.data = transformState(versionedData.data);
+  return versionedData;
+}
+
+/**
+ * Transform the MetaMask extension state to add or modify the
+ * `endowment:caip25` permission for all Snaps that have the
+ * `endowment:ethereum-provider` permission.
+ *
+ * If the `NetworkController`, `PermissionController`, or
+ * `SelectedNetworkController` state is not found or is not an object, the state
+ * is returned as-is.
+ *
+ * @param state - The MetaMask extension state.
+ * @returns The updated MetaMask extension state.
+ */
+function transformState(state: Record<string, unknown>) {
+  const {
+    NetworkController: networkControllerState,
+    PermissionController: permissionControllerState,
+    SelectedNetworkController: selectedNetworkControllerState,
+  } = state;
+
+  if (!networkControllerState || !isObject(networkControllerState)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !hasProperty(networkControllerState, 'selectedNetworkClientId') ||
+    typeof networkControllerState.selectedNetworkClientId !== 'string'
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController.selectedNetworkClientId` is not a string.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !hasProperty(networkControllerState, 'networkConfigurationsByChainId') ||
+    !isObject(networkControllerState.networkConfigurationsByChainId)
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController.networkConfigurationsByChainId` is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!permissionControllerState || !isObject(permissionControllerState)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `PermissionController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!isObject(permissionControllerState.subjects)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `PermissionController.subjects` state is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !selectedNetworkControllerState ||
+    !isObject(selectedNetworkControllerState)
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `SelectedNetworkController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!isObject(selectedNetworkControllerState.domains)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `SelectedNetworkController.domains` state is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  const currentChainId = getChainId(
+    networkControllerState.selectedNetworkClientId,
+    networkControllerState.networkConfigurationsByChainId,
+  );
+
+  if (typeof currentChainId !== 'string') {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: No currently selected chainId was found, or the chainId resolved from the `NetworkController.selectedNetworkClientId` value is not a string.',
+      ),
+    );
+
+    return state;
+  }
+
+  const updatedSubjects: string[] = [];
+
+  // Add permission to use the current globally selected network to all Snaps
+  // that have the `endowment:ethereum-provider` permission.
+  const entries = Object.entries(permissionControllerState.subjects) as [
+    string,
+    GenericPermissionControllerSubject,
+  ][];
+
+  permissionControllerState.subjects = entries.reduce<
+    PermissionControllerSubjects<PermissionConstraint>
+  >((accumulator, [key, subject]) => {
+    const permissionKeys = Object.keys(subject.permissions);
+    const needsMigration = permissionKeys.includes(
+      SnapEndowments.EthereumProvider,
+    );
+
+    if (!needsMigration) {
+      return {
+        ...accumulator,
+        [key]: subject,
+      };
+    }
+
+    updatedSubjects.push(key);
+
+    const caip25PermissionCaveatWithCurrentChainIdSet = addPermittedEthChainId(
+      getExistingCaip25PermissionCaveat(subject),
+      currentChainId,
+    );
path: app/scripts/migrations/160.ts
user: login: jiexi
body: we may want to do a `getEthAccounts` and setEthAccounts` to ensure the existing accounts are set on all scopes? @adonesky1 
created_at: 2025-05-19T20:27:35Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,314 @@
+import { cloneDeep } from 'lodash';
+import { hasProperty, Hex, isObject, RuntimeObject } from '@metamask/utils';
+import { nanoid } from 'nanoid';
+import type {
+  PermissionConstraint,
+  PermissionControllerSubjects,
+} from '@metamask/permission-controller';
+import { SnapEndowments } from '@metamask/snaps-rpc-methods';
+import {
+  Caip25CaveatType,
+  Caip25EndowmentPermissionName,
+  addPermittedEthChainId,
+  Caip25CaveatValue,
+} from '@metamask/chain-agnostic-permission';
+
+type GenericPermissionControllerSubject =
+  PermissionControllerSubjects<PermissionConstraint>[string];
+
+export const version = 160;
+
+/**
+ * A map of the networks built into the extension at the time of this migration
+ * to their chain IDs.
+ *
+ * @see https://github.com/MetaMask/metamask-extension/blob/5b5c04a16fb7937a6e9d59b1debe4713978ef39d/shared/constants/network.ts#L535
+ */
+const BUILT_IN_NETWORKS: ReadonlyMap<string, Hex> = new Map([
+  ['sepolia', '0xaa36a7'],
+  ['mainnet', '0x1'],
+  ['linea-sepolia', '0xe705'],
+  ['linea-mainnet', '0xe708'],
+]);
+
+/**
+ * This migration adds or modifies the `endowment:caip25` permission for all
+ * Snaps that have the `endowment:ethereum-provider` permission, and sets the
+ * selected chain ID for each Snap to the current selected network chain ID.
+ *
+ * This is to enable Snaps to change their network which has become necessary
+ * since the extension has switched to a per origin selected network system -
+ * previously all origins shared the single selected network of the wallet.
+ *
+ * To simplify the use for Snaps, we automatically add or modify the
+ * `endowment:caip25` permission with the current selected network chain ID to
+ * all Snaps that have the `endowment:ethereum-provider` permission.
+ *
+ * @param originalVersionedData - Versioned MetaMask extension state, exactly
+ * what we persist to dist.
+ * @param originalVersionedData.meta - State metadata.
+ * @param originalVersionedData.meta.version - The current state version.
+ * @param originalVersionedData.data - The persisted MetaMask state, keyed by
+ * controller.
+ * @returns Updated versioned MetaMask extension state.
+ */
+export async function migrate(originalVersionedData: {
+  meta: { version: number };
+  data: Record<string, unknown>;
+}) {
+  const versionedData = cloneDeep(originalVersionedData);
+  versionedData.meta.version = version;
+  versionedData.data = transformState(versionedData.data);
+  return versionedData;
+}
+
+/**
+ * Transform the MetaMask extension state to add or modify the
+ * `endowment:caip25` permission for all Snaps that have the
+ * `endowment:ethereum-provider` permission.
+ *
+ * If the `NetworkController`, `PermissionController`, or
+ * `SelectedNetworkController` state is not found or is not an object, the state
+ * is returned as-is.
+ *
+ * @param state - The MetaMask extension state.
+ * @returns The updated MetaMask extension state.
+ */
+function transformState(state: Record<string, unknown>) {
+  const {
+    NetworkController: networkControllerState,
+    PermissionController: permissionControllerState,
+    SelectedNetworkController: selectedNetworkControllerState,
+  } = state;
+
+  if (!networkControllerState || !isObject(networkControllerState)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !hasProperty(networkControllerState, 'selectedNetworkClientId') ||
+    typeof networkControllerState.selectedNetworkClientId !== 'string'
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController.selectedNetworkClientId` is not a string.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !hasProperty(networkControllerState, 'networkConfigurationsByChainId') ||
+    !isObject(networkControllerState.networkConfigurationsByChainId)
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `NetworkController.networkConfigurationsByChainId` is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!permissionControllerState || !isObject(permissionControllerState)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `PermissionController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!isObject(permissionControllerState.subjects)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `PermissionController.subjects` state is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (
+    !selectedNetworkControllerState ||
+    !isObject(selectedNetworkControllerState)
+  ) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `SelectedNetworkController` state not found or is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  if (!isObject(selectedNetworkControllerState.domains)) {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: `SelectedNetworkController.domains` state is not an object.',
+      ),
+    );
+
+    return state;
+  }
+
+  const currentChainId = getChainId(
+    networkControllerState.selectedNetworkClientId,
+    networkControllerState.networkConfigurationsByChainId,
+  );
+
+  if (typeof currentChainId !== 'string') {
+    global.sentry?.captureException?.(
+      new Error(
+        'Skipping migration: No currently selected chainId was found, or the chainId resolved from the `NetworkController.selectedNetworkClientId` value is not a string.',
+      ),
+    );
+
+    return state;
+  }
+
+  const updatedSubjects: string[] = [];
+
+  // Add permission to use the current globally selected network to all Snaps
+  // that have the `endowment:ethereum-provider` permission.
+  const entries = Object.entries(permissionControllerState.subjects) as [
+    string,
+    GenericPermissionControllerSubject,
+  ][];
+
+  permissionControllerState.subjects = entries.reduce<
+    PermissionControllerSubjects<PermissionConstraint>
+  >((accumulator, [key, subject]) => {
+    const permissionKeys = Object.keys(subject.permissions);
+    const needsMigration = permissionKeys.includes(
+      SnapEndowments.EthereumProvider,
+    );
+
+    if (!needsMigration) {
+      return {
+        ...accumulator,
+        [key]: subject,
+      };
+    }
+
+    updatedSubjects.push(key);
+
+    const caip25PermissionCaveatWithCurrentChainIdSet = addPermittedEthChainId(
+      getExistingCaip25PermissionCaveat(subject),
+      currentChainId,
+    );
path: app/scripts/migrations/160.ts
user: login: Mrtenz
body: Not exactly sure what you mean. Happy to address this in a follow up though!
created_at: 2025-05-19T21:00:26Z
author_association: MEMBER

PR comments:
user: login: socket-security[bot]
created_at: 2025-05-16T12:44:44Z
body: **Review the following changes in direct dependencies.** Learn more about [Socket for GitHub](https://socket.dev?utm_medium=gh).

<table>
<thead>
<tr>
<th>Diff</th>
<th width="200px">Package</th>
<th align="left" width="100px">Supply Chain<br/>Security</th>
<th align="left" width="100px">Vulnerability</th>
<th align="left" width="100px">Quality</th>
<th align="left" width="100px">Maintenance</th>
<th align="left" width="100px">License</th>
</tr>
</thead>
<tbody>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=32431373851"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=32431373851">@​metamask/​preinstalled-example-snap@​0.3.0 ⏵ 0.4.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=32431373851"><img src="https://github-app-statics.socket.dev/score-78.svg" title="Supply Chain Security" width="40" height="40" alt="78"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=32431373851"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=32431373851"><img src="https://github-app-statics.socket.dev/score-69.svg" title="Quality" width="40" height="40" alt="69"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=32431373851"><img src="https://github-app-statics.socket.dev/score-91.svg" title="Maintenance" width="40" height="40" alt="91"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=32431373851"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675053"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675053">@​metamask/​snaps-utils@​9.2.2 ⏵ 9.3.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675053"><img src="https://github-app-statics.socket.dev/score-96.svg" title="Supply Chain Security" width="40" height="40" alt="96"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675053"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675053"><img src="https://github-app-statics.socket.dev/score-74.svg" title="Quality" width="40" height="40" alt="74"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675053"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Maintenance" width="40" height="40" alt="99"></a> <sup>+2</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675053"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202199"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202199">@​metamask/​snaps-rpc-methods@​12.2.0 ⏵ 12.3.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202199"><img src="https://github-app-statics.socket.dev/score-94.svg" title="Supply Chain Security" width="40" height="40" alt="94"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202199"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202199"><img src="https://github-app-statics.socket.dev/score-74.svg" title="Quality" width="40" height="40" alt="74"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202199"><img src="https://github-app-statics.socket.dev/score-98.svg" title="Maintenance" width="40" height="40" alt="98"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202199"><img src="https://github-app-statics.socket.dev/score-50.svg" title="License" width="40" height="40" alt="50"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31555180489"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31555180489">@​metamask/​selected-network-controller@​19.0.0 ⏵ 22.1.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31555180489"><img src="https://github-app-statics.socket.dev/score-90.svg" title="Supply Chain Security" width="40" height="40" alt="90"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31555180489"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31555180489"><img src="https://github-app-statics.socket.dev/score-74.svg" title="Quality" width="40" height="40" alt="74"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31555180489"><img src="https://github-app-statics.socket.dev/score-96.svg" title="Maintenance" width="40" height="40" alt="96"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31555180489"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202198"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202198">@​metamask/​snaps-controllers@​12.0.1 ⏵ 12.1.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202198"><img src="https://github-app-statics.socket.dev/score-93.svg" title="Supply Chain Security" width="40" height="40" alt="93"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202198"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202198"><img src="https://github-app-statics.socket.dev/score-74.svg" title="Quality" width="40" height="40" alt="74"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202198"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Maintenance" width="40" height="40" alt="100"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202198"><img src="https://github-app-statics.socket.dev/score-50.svg" title="License" width="40" height="40" alt="50"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202213"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202213">@​metamask/​snaps-execution-environments@​8.0.1 ⏵ 8.1.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202213"><img src="https://github-app-statics.socket.dev/score-93.svg" title="Supply Chain Security" width="40" height="40" alt="93"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202213"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202213"><img src="https://github-app-statics.socket.dev/score-75.svg" title="Quality" width="40" height="40" alt="75"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202213"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Maintenance" width="40" height="40" alt="99"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31553202213"><img src="https://github-app-statics.socket.dev/score-80.svg" title="License" width="40" height="40" alt="80"></a> <sup>+31</sup></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675052"><img src="https://github-app-statics.socket.dev/diff-updated.svg" title="Updated" alt="Updated" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675052">@​metamask/​snaps-sdk@​6.23.0 ⏵ 6.24.0</a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675052"><img src="https://github-app-statics.socket.dev/score-95.svg" title="Supply Chain Security" width="40" height="40" alt="95"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675052"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675052"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Quality" width="40" height="40" alt="76"></a> <sup>+1</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675052"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Maintenance" width="40" height="40" alt="99"></a> <sup>+2</sup></td><td align="left"><a href="https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies&dependency_item_key=31548675052"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
</tbody>
</table>

[View full report](https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=dependencies)

<!-- overview-comment -->
author_association: NONE
user: login: socket-security[bot]
created_at: 2025-05-16T12:44:46Z
body: **All alerts resolved.** Learn more about [Socket for GitHub](https://socket.dev?utm_medium=gh).

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

**Ignoring alerts on:**

- `@metamask/snaps-execution-environments@8.1.0`

[View full report](https://socket.dev/dashboard/org/MetaMask/diff/bf69ad4b-32ba-465c-b9fd-a216f2933e09/154bb690-a2fb-4727-ae57-9ede06bc47f4?tab=alerts&action=error%2Cwarn)
author_association: NONE
user: login: metamaskbot
created_at: 2025-05-16T12:44:47Z
body: <!-- METAMASK-CODEOWNERS-BOT -->
✨ Files requiring CODEOWNER review ✨
---
🧩 @MetaMask/extension-devs
- `lavamoat/browserify/beta/policy.json`
- `lavamoat/browserify/flask/policy.json`
- `lavamoat/browserify/main/policy.json`
- `lavamoat/browserify/mmi/policy.json`

📜 @MetaMask/policy-reviewers

> [!TIP]  
> Follow the policy review process outlined in the [LavaMoat Policy Review Process doc](https://github.com/MetaMask/metamask-extension/blob/main/docs/lavamoat-policy-review-process.md) before expecting an approval from Policy Reviewers.
- `lavamoat/browserify/beta/policy.json`
- `lavamoat/browserify/flask/policy.json`
- `lavamoat/browserify/main/policy.json`
- `lavamoat/browserify/mmi/policy.json`

🫰 @MetaMask/snaps-devs
- `test/e2e/flask/snaps/preinstalled-example.spec.ts`
- `test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.2.1.txt`
- `test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0-headers.json`
- `test/e2e/mock-response-data/snaps/snap-binaries-and-headers/ethereum-provider-example-snap@2.3.0.txt`
- `test/e2e/snaps/enums.js`
- `test/e2e/snaps/test-snap-ethprovider.spec.js`
- `test/e2e/snaps/test-snap-get-preferences.spec.ts`

🔗 @MetaMask/supply-chain
- `lavamoat/browserify/beta/policy.json`
- `lavamoat/browserify/flask/policy.json`
- `lavamoat/browserify/main/policy.json`
- `lavamoat/browserify/mmi/policy.json`


author_association: COLLABORATOR
user: login: Mrtenz
created_at: 2025-05-16T12:45:20Z
body: @SocketSecurity ignore npm/@metamask/snaps-execution-environments@8.1.0

This is ours.
author_association: MEMBER
user: login: Mrtenz
created_at: 2025-05-16T13:29:14Z
body: @metamaskbot update-policies
author_association: MEMBER
user: login: github-actions[bot]
created_at: 2025-05-16T13:40:52Z
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-16T13:41:03Z
body: Policies updated.  
👀 Please review the diff for suspicious new powers.  

🧠 Learn how: https://lavamoat.github.io/guides/policy-diff/#what-to-look-for-when-reviewing-a-policy-diff 



author_association: COLLABORATOR
user: login: Mrtenz
created_at: 2025-05-16T16:15:00Z
body: @metamaskbot update-policies
author_association: MEMBER
user: login: metamaskbot
created_at: 2025-05-16T16:26:50Z
body: No policy changes
author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-16T16:52:18Z
body: <details><summary>Builds ready [52de4da]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15072801787/builds-beta/metamask-beta-chrome-12.17.3-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds-test/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds-test-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15072801787/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15072801787/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15072801787/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15072801787/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4897696/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/ee42c7a1-ba22-4868-b40b-35670dca6e85/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/ee42c7a1-ba22-4868-b40b-35670dca6e85/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/ee42c7a1-ba22-4868-b40b-35670dca6e85/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1230 ± 63 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">1230</td><td align="right">1105</td><td align="right">1446</td><td align="right">63</td><td align="right">1274</td><td align="right">1330</td></tr><tr><td>load</td><td align="right">1060</td><td align="right">961</td><td align="right">1206</td><td align="right">55</td><td align="right">1089</td><td align="right">1153</td></tr><tr><td>domContentLoaded</td><td align="right">1053</td><td align="right">951</td><td align="right">1198</td><td align="right">56</td><td align="right">1084</td><td align="right">1148</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">30</td><td align="right">3</td><td align="right">17</td><td align="right">25</td></tr><tr><td>firstPaint</td><td align="right">763</td><td align="right">81</td><td align="right">1193</td><td align="right">400</td><td align="right">1067</td><td align="right">1145</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">29</td><td align="right">4</td><td align="right">8</td><td align="right">23</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">16</td><td align="right">41</td><td align="right">5</td><td align="right">21</td><td align="right">33</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">6</td><td align="right">36</td><td align="right">7</td><td align="right">18</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">812</td><td align="right">707</td><td align="right">957</td><td align="right">53</td><td align="right">836</td><td align="right">906</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">16</td><td align="right">2</td><td align="right">8</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2207</td><td align="right">1841</td><td align="right">2620</td><td align="right">193</td><td align="right">2347</td><td align="right">2481</td></tr><tr><td>load</td><td align="right">1709</td><td align="right">1364</td><td align="right">2213</td><td align="right">175</td><td align="right">1814</td><td align="right">2010</td></tr><tr><td>domContentLoaded</td><td align="right">1702</td><td align="right">1359</td><td align="right">2209</td><td align="right">174</td><td align="right">1801</td><td align="right">2000</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">12</td><td align="right">65</td><td align="right">10</td><td align="right">14</td><td align="right">48</td></tr><tr><td>firstPaint</td><td align="right">151</td><td align="right">62</td><td align="right">370</td><td align="right">53</td><td align="right">164</td><td align="right">267</td></tr><tr><td>backgroundConnect</td><td align="right">31</td><td align="right">10</td><td align="right">284</td><td align="right">30</td><td align="right">39</td><td align="right">62</td></tr><tr><td>firstReactRender</td><td align="right">141</td><td align="right">44</td><td align="right">436</td><td align="right">107</td><td align="right">270</td><td align="right">332</td></tr><tr><td>getState</td><td align="right">17</td><td align="right">4</td><td align="right">333</td><td align="right">33</td><td align="right">16</td><td align="right">38</td></tr><tr><td>initialActions</td><td align="right">5</td><td align="right">1</td><td align="right">216</td><td align="right">21</td><td align="right">4</td><td align="right">6</td></tr><tr><td>loadScripts</td><td align="right">1697</td><td align="right">1357</td><td align="right">2207</td><td align="right">175</td><td align="right">1797</td><td align="right">1992</td></tr><tr><td>setupStore</td><td align="right">25</td><td align="right">7</td><td align="right">258</td><td align="right">37</td><td align="right">25</td><td align="right">51</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1345</td><td align="right">1138</td><td align="right">1710</td><td align="right">115</td><td align="right">1407</td><td align="right">1561</td></tr><tr><td>load</td><td align="right">1187</td><td align="right">1012</td><td align="right">1483</td><td align="right">101</td><td align="right">1244</td><td align="right">1382</td></tr><tr><td>domContentLoaded</td><td align="right">1187</td><td align="right">1011</td><td align="right">1483</td><td align="right">101</td><td align="right">1244</td><td align="right">1381</td></tr><tr><td>domInteractive</td><td align="right">100</td><td align="right">40</td><td align="right">197</td><td align="right">25</td><td align="right">113</td><td align="right">140</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">13</td><td align="right">184</td><td align="right">21</td><td align="right">23</td><td align="right">68</td></tr><tr><td>firstReactRender</td><td align="right">22</td><td align="right">19</td><td align="right">52</td><td align="right">5</td><td align="right">22</td><td align="right">26</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">197</td><td align="right">30</td><td align="right">8</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">1167</td><td align="right">1002</td><td align="right">1464</td><td align="right">101</td><td align="right">1224</td><td align="right">1364</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">34</td><td align="right">3</td><td align="right">6</td><td align="right">9</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1554</td><td align="right">1382</td><td align="right">2239</td><td align="right">138</td><td align="right">1638</td><td align="right">1822</td></tr><tr><td>load</td><td align="right">1328</td><td align="right">1175</td><td align="right">1745</td><td align="right">119</td><td align="right">1411</td><td align="right">1556</td></tr><tr><td>domContentLoaded</td><td align="right">1327</td><td align="right">1173</td><td align="right">1745</td><td align="right">119</td><td align="right">1410</td><td align="right">1555</td></tr><tr><td>domInteractive</td><td align="right">85</td><td align="right">37</td><td align="right">341</td><td align="right">38</td><td align="right">87</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">22</td><td align="right">15</td><td align="right">77</td><td align="right">7</td><td align="right">23</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">29</td><td align="right">49</td><td align="right">5</td><td align="right">38</td><td align="right">45</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">5</td><td align="right">188</td><td align="right">19</td><td align="right">10</td><td align="right">31</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">1308</td><td align="right">1156</td><td align="right">1729</td><td align="right">120</td><td align="right">1390</td><td align="right">1544</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">38</td><td align="right">5</td><td align="right">8</td><td align="right">19</td></tr></tbody></table>Benchmark value 23 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 2207 exceeds gate value 2192 for chrome webpack home mean uiStartup<br>
Benchmark value 2482 exceeds gate value 2454 for chrome webpack home p95 uiStartup<br>
Benchmark value 1992 exceeds gate value 1970 for chrome webpack home p95 loadScripts<br>
Benchmark value 13 exceeds gate value 11 for firefox browserify home mean getState<br>
Benchmark value 26 exceeds gate value 24 for firefox browserify home p95 getState<br>
<b>Sum of mean exceeds: 17ms | Sum of p95 exceeds: 57ms<br>
Sum of all benchmark exceeds: 74ms</b><br>
</details>

<details><summary>Bundle size diffs [🚀 Bundle size reduced!]</summary><ul><li>background: -10.83 KiB (-0.2%)</li>
<li>ui: 3 Bytes (0%)</li>
<li>common: 195 Bytes (0%)</li></ul></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-19T08:40:17Z
body: <details><summary>Builds ready [7df0374]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15107660332/builds-beta/metamask-beta-chrome-12.17.3-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds-test/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds-test-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15107660332/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15107660332/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15107660332/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15107660332/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4898983/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/5bb942db-144b-4cf7-bd18-2d8cf147ee94/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/5bb942db-144b-4cf7-bd18-2d8cf147ee94/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/5bb942db-144b-4cf7-bd18-2d8cf147ee94/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1248 ± 69 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">1248</td><td align="right">1129</td><td align="right">1419</td><td align="right">69</td><td align="right">1283</td><td align="right">1379</td></tr><tr><td>load</td><td align="right">1073</td><td align="right">973</td><td align="right">1211</td><td align="right">62</td><td align="right">1114</td><td align="right">1190</td></tr><tr><td>domContentLoaded</td><td align="right">1066</td><td align="right">959</td><td align="right">1206</td><td align="right">62</td><td align="right">1109</td><td align="right">1183</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">39</td><td align="right">4</td><td align="right">17</td><td align="right">26</td></tr><tr><td>firstPaint</td><td align="right">718</td><td align="right">148</td><td align="right">1233</td><td align="right">428</td><td align="right">1090</td><td align="right">1179</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">29</td><td align="right">4</td><td align="right">8</td><td align="right">20</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">15</td><td align="right">47</td><td align="right">6</td><td align="right">21</td><td align="right">33</td></tr><tr><td>getState</td><td align="right">16</td><td align="right">5</td><td align="right">33</td><td align="right">8</td><td align="right">22</td><td align="right">32</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">823</td><td align="right">717</td><td align="right">954</td><td align="right">59</td><td align="right">861</td><td align="right">938</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">19</td><td align="right">2</td><td align="right">8</td><td align="right">13</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2159</td><td align="right">1754</td><td align="right">2633</td><td align="right">175</td><td align="right">2265</td><td align="right">2416</td></tr><tr><td>load</td><td align="right">1685</td><td align="right">1343</td><td align="right">2247</td><td align="right">150</td><td align="right">1755</td><td align="right">1935</td></tr><tr><td>domContentLoaded</td><td align="right">1678</td><td align="right">1338</td><td align="right">2240</td><td align="right">149</td><td align="right">1748</td><td align="right">1910</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">66</td><td align="right">11</td><td align="right">13</td><td align="right">45</td></tr><tr><td>firstPaint</td><td align="right">165</td><td align="right">65</td><td align="right">670</td><td align="right">87</td><td align="right">186</td><td align="right">285</td></tr><tr><td>backgroundConnect</td><td align="right">29</td><td align="right">9</td><td align="right">365</td><td align="right">37</td><td align="right">30</td><td align="right">57</td></tr><tr><td>firstReactRender</td><td align="right">128</td><td align="right">42</td><td align="right">348</td><td align="right">95</td><td align="right">139</td><td align="right">333</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">4</td><td align="right">219</td><td align="right">26</td><td align="right">15</td><td align="right">29</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1673</td><td align="right">1336</td><td align="right">2238</td><td align="right">149</td><td align="right">1744</td><td align="right">1886</td></tr><tr><td>setupStore</td><td align="right">24</td><td align="right">7</td><td align="right">301</td><td align="right">44</td><td align="right">18</td><td align="right">45</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1352</td><td align="right">1177</td><td align="right">1877</td><td align="right">108</td><td align="right">1407</td><td align="right">1522</td></tr><tr><td>load</td><td align="right">1202</td><td align="right">1034</td><td align="right">1715</td><td align="right">106</td><td align="right">1257</td><td align="right">1388</td></tr><tr><td>domContentLoaded</td><td align="right">1201</td><td align="right">1033</td><td align="right">1715</td><td align="right">106</td><td align="right">1257</td><td align="right">1387</td></tr><tr><td>domInteractive</td><td align="right">109</td><td align="right">38</td><td align="right">436</td><td align="right">52</td><td align="right">120</td><td align="right">161</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">21</td><td align="right">13</td><td align="right">106</td><td align="right">10</td><td align="right">21</td><td align="right">29</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">19</td><td align="right">54</td><td align="right">7</td><td align="right">23</td><td align="right">48</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">5</td><td align="right">24</td><td align="right">3</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">1183</td><td align="right">1015</td><td align="right">1612</td><td align="right">102</td><td align="right">1239</td><td align="right">1373</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">37</td><td align="right">4</td><td align="right">6</td><td align="right">7</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1566</td><td align="right">1392</td><td align="right">2136</td><td align="right">148</td><td align="right">1607</td><td align="right">1915</td></tr><tr><td>load</td><td align="right">1336</td><td align="right">1191</td><td align="right">1910</td><td align="right">136</td><td align="right">1391</td><td align="right">1640</td></tr><tr><td>domContentLoaded</td><td align="right">1335</td><td align="right">1191</td><td align="right">1910</td><td align="right">136</td><td align="right">1391</td><td align="right">1639</td></tr><tr><td>domInteractive</td><td align="right">82</td><td align="right">58</td><td align="right">259</td><td align="right">25</td><td align="right">87</td><td align="right">130</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">23</td><td align="right">16</td><td align="right">82</td><td align="right">10</td><td align="right">23</td><td align="right">45</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">29</td><td align="right">52</td><td align="right">5</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">216</td><td align="right">21</td><td align="right">9</td><td align="right">14</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">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1316</td><td align="right">1171</td><td align="right">1895</td><td align="right">137</td><td align="right">1373</td><td align="right">1617</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">57</td><td align="right">6</td><td align="right">8</td><td align="right">11</td></tr></tbody></table>Benchmark value 1248 exceeds gate value 1234 for chrome browserify home mean uiStartup<br>
Benchmark value 1074 exceeds gate value 1070 for chrome browserify home mean load<br>
Benchmark value 1067 exceeds gate value 1061 for chrome browserify home mean domContentLoaded<br>
Benchmark value 17 exceeds gate value 15 for chrome browserify home mean getState<br>
Benchmark value 1379 exceeds gate value 1365 for chrome browserify home p95 uiStartup<br>
Benchmark value 1191 exceeds gate value 1190 for chrome browserify home p95 load<br>
Benchmark value 1183 exceeds gate value 1180 for chrome browserify home p95 domContentLoaded<br>
Benchmark value 21 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
<b>Sum of mean exceeds: 26ms | Sum of p95 exceeds: 21ms<br>
Sum of all benchmark exceeds: 47ms</b><br>
</details>

<details><summary>Bundle size diffs [🚀 Bundle size reduced!]</summary><ul><li>background: -10.83 KiB (-0.2%)</li>
<li>ui: 129 Bytes (0%)</li>
<li>common: 353 Bytes (0%)</li></ul></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-19T10:35:34Z
body: <details><summary>Builds ready [b1b39b2]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15109602918/builds-beta/metamask-beta-chrome-12.17.3-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds-test/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds-test-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15109602918/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15109602918/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15109602918/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15109602918/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4899295/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/98a029b4-3a80-4a05-930e-4d95ee7e6b21/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/98a029b4-3a80-4a05-930e-4d95ee7e6b21/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/98a029b4-3a80-4a05-930e-4d95ee7e6b21/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1217 ± 57 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">1217</td><td align="right">1102</td><td align="right">1410</td><td align="right">57</td><td align="right">1257</td><td align="right">1329</td></tr><tr><td>load</td><td align="right">1053</td><td align="right">958</td><td align="right">1227</td><td align="right">51</td><td align="right">1084</td><td align="right">1146</td></tr><tr><td>domContentLoaded</td><td align="right">1046</td><td align="right">952</td><td align="right">1217</td><td align="right">52</td><td align="right">1079</td><td align="right">1136</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">38</td><td align="right">4</td><td align="right">16</td><td align="right">24</td></tr><tr><td>firstPaint</td><td align="right">739</td><td align="right">140</td><td align="right">1223</td><td align="right">417</td><td align="right">1072</td><td align="right">1122</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">26</td><td align="right">5</td><td align="right">8</td><td align="right">22</td></tr><tr><td>firstReactRender</td><td align="right">19</td><td align="right">15</td><td align="right">47</td><td align="right">5</td><td align="right">20</td><td align="right">24</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">6</td><td align="right">37</td><td align="right">8</td><td align="right">21</td><td align="right">33</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">807</td><td align="right">706</td><td align="right">958</td><td align="right">50</td><td align="right">836</td><td align="right">898</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">14</td><td align="right">2</td><td align="right">8</td><td align="right">10</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2161</td><td align="right">1764</td><td align="right">2616</td><td align="right">166</td><td align="right">2284</td><td align="right">2397</td></tr><tr><td>load</td><td align="right">1684</td><td align="right">1336</td><td align="right">2008</td><td align="right">131</td><td align="right">1748</td><td align="right">1848</td></tr><tr><td>domContentLoaded</td><td align="right">1677</td><td align="right">1332</td><td align="right">2004</td><td align="right">131</td><td align="right">1742</td><td align="right">1845</td></tr><tr><td>domInteractive</td><td align="right">15</td><td align="right">11</td><td align="right">49</td><td align="right">8</td><td align="right">13</td><td align="right">40</td></tr><tr><td>firstPaint</td><td align="right">163</td><td align="right">61</td><td align="right">392</td><td align="right">59</td><td align="right">189</td><td align="right">296</td></tr><tr><td>backgroundConnect</td><td align="right">30</td><td align="right">9</td><td align="right">274</td><td align="right">36</td><td align="right">33</td><td align="right">64</td></tr><tr><td>firstReactRender</td><td align="right">131</td><td align="right">42</td><td align="right">343</td><td align="right">97</td><td align="right">213</td><td align="right">324</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">164</td><td align="right">17</td><td align="right">15</td><td align="right">27</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">1672</td><td align="right">1330</td><td align="right">1980</td><td align="right">131</td><td align="right">1739</td><td align="right">1843</td></tr><tr><td>setupStore</td><td align="right">19</td><td align="right">6</td><td align="right">182</td><td align="right">24</td><td align="right">20</td><td align="right">34</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1307</td><td align="right">1142</td><td align="right">1792</td><td align="right">137</td><td align="right">1328</td><td align="right">1646</td></tr><tr><td>load</td><td align="right">1157</td><td align="right">993</td><td align="right">1651</td><td align="right">126</td><td align="right">1191</td><td align="right">1480</td></tr><tr><td>domContentLoaded</td><td align="right">1156</td><td align="right">992</td><td align="right">1651</td><td align="right">126</td><td align="right">1191</td><td align="right">1479</td></tr><tr><td>domInteractive</td><td align="right">96</td><td align="right">38</td><td align="right">200</td><td align="right">27</td><td align="right">109</td><td align="right">147</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">120</td><td align="right">15</td><td align="right">23</td><td align="right">49</td></tr><tr><td>firstReactRender</td><td align="right">22</td><td align="right">19</td><td align="right">56</td><td align="right">6</td><td align="right">22</td><td align="right">31</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">4</td><td align="right">167</td><td align="right">18</td><td align="right">8</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">1137</td><td align="right">979</td><td align="right">1619</td><td align="right">126</td><td align="right">1168</td><td align="right">1457</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">3</td><td align="right">47</td><td align="right">7</td><td align="right">6</td><td align="right">32</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1533</td><td align="right">1358</td><td align="right">2097</td><td align="right">134</td><td align="right">1598</td><td align="right">1825</td></tr><tr><td>load</td><td align="right">1308</td><td align="right">1162</td><td align="right">1689</td><td align="right">114</td><td align="right">1374</td><td align="right">1547</td></tr><tr><td>domContentLoaded</td><td align="right">1307</td><td align="right">1161</td><td align="right">1689</td><td align="right">114</td><td align="right">1374</td><td align="right">1546</td></tr><tr><td>domInteractive</td><td align="right">80</td><td align="right">55</td><td align="right">234</td><td align="right">23</td><td align="right">83</td><td align="right">125</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">15</td><td align="right">64</td><td align="right">7</td><td align="right">23</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">34</td><td align="right">29</td><td align="right">63</td><td align="right">5</td><td align="right">36</td><td align="right">44</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">4</td><td align="right">235</td><td align="right">24</td><td align="right">9</td><td align="right">29</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">1288</td><td align="right">1143</td><td align="right">1671</td><td align="right">114</td><td align="right">1355</td><td align="right">1525</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">44</td><td align="right">4</td><td align="right">8</td><td align="right">13</td></tr></tbody></table>Benchmark value 22 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 27 exceeds gate value 24 for firefox browserify home p95 getState<br>
Benchmark value 32 exceeds gate value 27 for firefox browserify home p95 setupStore<br>
<b>Sum of mean exceeds: 0ms | Sum of p95 exceeds: 12ms<br>
Sum of all benchmark exceeds: 12ms</b><br>
</details>

<details><summary>Bundle size diffs [🚀 Bundle size reduced!]</summary><ul><li>background: -10.99 KiB (-0.21%)</li>
<li>ui: 129 Bytes (0%)</li>
<li>common: -1.12 KiB (-0.01%)</li></ul></details>


author_association: COLLABORATOR
user: login: FrederikBolding
created_at: 2025-05-19T11:26:43Z
body: @Mrtenz Please add the details from https://github.com/MetaMask/metamask-extension/pull/26389 to the description of this PR.

Also we should have wallet API give final sign off before merge.
author_association: MEMBER
user: login: metamaskbot
created_at: 2025-05-19T12:04:58Z
body: <details><summary>Builds ready [3501b7b]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15111853359/builds-beta/metamask-beta-chrome-12.17.3-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds-test/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds-test-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15111853359/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15111853359/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15111853359/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15111853359/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4899613/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/f087bda6-ea6c-40cf-b78b-bd084d2948dc/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/f087bda6-ea6c-40cf-b78b-bd084d2948dc/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/f087bda6-ea6c-40cf-b78b-bd084d2948dc/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1200 ± 54 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">1200</td><td align="right">1089</td><td align="right">1372</td><td align="right">54</td><td align="right">1238</td><td align="right">1291</td></tr><tr><td>load</td><td align="right">1037</td><td align="right">937</td><td align="right">1140</td><td align="right">49</td><td align="right">1069</td><td align="right">1123</td></tr><tr><td>domContentLoaded</td><td align="right">1030</td><td align="right">928</td><td align="right">1136</td><td align="right">50</td><td align="right">1061</td><td align="right">1116</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">32</td><td align="right">4</td><td align="right">16</td><td align="right">24</td></tr><tr><td>firstPaint</td><td align="right">641</td><td align="right">78</td><td align="right">1147</td><td align="right">420</td><td align="right">1042</td><td align="right">1097</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">35</td><td align="right">5</td><td align="right">8</td><td align="right">20</td></tr><tr><td>firstReactRender</td><td align="right">18</td><td align="right">15</td><td align="right">32</td><td align="right">3</td><td align="right">19</td><td align="right">24</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">5</td><td align="right">67</td><td align="right">10</td><td align="right">20</td><td align="right">32</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">794</td><td align="right">693</td><td align="right">902</td><td align="right">48</td><td align="right">820</td><td align="right">876</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">17</td><td align="right">2</td><td align="right">8</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2184</td><td align="right">1766</td><td align="right">2517</td><td align="right">153</td><td align="right">2303</td><td align="right">2344</td></tr><tr><td>load</td><td align="right">1695</td><td align="right">1366</td><td align="right">1971</td><td align="right">126</td><td align="right">1771</td><td align="right">1858</td></tr><tr><td>domContentLoaded</td><td align="right">1688</td><td align="right">1362</td><td align="right">1956</td><td align="right">125</td><td align="right">1763</td><td align="right">1854</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">77</td><td align="right">11</td><td align="right">13</td><td align="right">50</td></tr><tr><td>firstPaint</td><td align="right">160</td><td align="right">64</td><td align="right">548</td><td align="right">75</td><td align="right">185</td><td align="right">297</td></tr><tr><td>backgroundConnect</td><td align="right">28</td><td align="right">9</td><td align="right">196</td><td align="right">21</td><td align="right">34</td><td align="right">54</td></tr><tr><td>firstReactRender</td><td align="right">133</td><td align="right">43</td><td align="right">340</td><td align="right">92</td><td align="right">180</td><td align="right">320</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">4</td><td align="right">161</td><td align="right">16</td><td align="right">16</td><td align="right">27</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">2</td><td align="right">5</td><td align="right">1</td><td align="right">3</td><td align="right">4</td></tr><tr><td>loadScripts</td><td align="right">1683</td><td align="right">1361</td><td align="right">1933</td><td align="right">125</td><td align="right">1759</td><td align="right">1852</td></tr><tr><td>setupStore</td><td align="right">16</td><td align="right">7</td><td align="right">40</td><td align="right">7</td><td align="right">20</td><td align="right">27</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1331</td><td align="right">1143</td><td align="right">1679</td><td align="right">123</td><td align="right">1398</td><td align="right">1612</td></tr><tr><td>load</td><td align="right">1181</td><td align="right">1024</td><td align="right">1537</td><td align="right">113</td><td align="right">1232</td><td align="right">1439</td></tr><tr><td>domContentLoaded</td><td align="right">1180</td><td align="right">1024</td><td align="right">1536</td><td align="right">113</td><td align="right">1232</td><td align="right">1439</td></tr><tr><td>domInteractive</td><td align="right">101</td><td align="right">37</td><td align="right">292</td><td align="right">35</td><td align="right">108</td><td align="right">168</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">14</td><td align="right">226</td><td align="right">21</td><td align="right">20</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">20</td><td align="right">56</td><td align="right">6</td><td align="right">22</td><td align="right">32</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">4</td><td align="right">203</td><td align="right">28</td><td align="right">8</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">1161</td><td align="right">1010</td><td align="right">1513</td><td align="right">109</td><td align="right">1217</td><td align="right">1408</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">73</td><td align="right">9</td><td align="right">6</td><td align="right">14</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1578</td><td align="right">1354</td><td align="right">2193</td><td align="right">166</td><td align="right">1628</td><td align="right">1884</td></tr><tr><td>load</td><td align="right">1347</td><td align="right">1169</td><td align="right">1828</td><td align="right">141</td><td align="right">1416</td><td align="right">1632</td></tr><tr><td>domContentLoaded</td><td align="right">1347</td><td align="right">1168</td><td align="right">1827</td><td align="right">141</td><td align="right">1416</td><td align="right">1631</td></tr><tr><td>domInteractive</td><td align="right">81</td><td align="right">32</td><td align="right">145</td><td align="right">19</td><td align="right">87</td><td align="right">125</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">15</td><td align="right">92</td><td align="right">10</td><td align="right">23</td><td align="right">34</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">28</td><td align="right">66</td><td align="right">6</td><td align="right">37</td><td align="right">48</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">226</td><td align="right">30</td><td align="right">9</td><td align="right">24</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">1327</td><td align="right">1149</td><td align="right">1812</td><td align="right">140</td><td align="right">1400</td><td align="right">1607</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">23</td></tr></tbody></table>Benchmark value 20 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 13 exceeds gate value 11 for firefox browserify home mean getState<br>
Benchmark value 26 exceeds gate value 24 for firefox browserify home p95 getState<br>
<b>Sum of mean exceeds: 2ms | Sum of p95 exceeds: 4ms<br>
Sum of all benchmark exceeds: 6ms</b><br>
</details>

<details><summary>Bundle size diffs [🚀 Bundle size reduced!]</summary><ul><li>background: -7.06 KiB (-0.13%)</li>
<li>ui: 136 Bytes (0%)</li>
<li>common: -1.11 KiB (-0.01%)</li></ul></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-19T12:36:59Z
body: <details><summary>Builds ready [3601fc3]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15112491884/builds-beta/metamask-beta-chrome-12.17.3-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds-test/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds-test-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15112491884/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15112491884/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15112491884/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15112491884/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4899681/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/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/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/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/f1b58c85-1a5e-4ff0-b767-6e512eda86cc/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1188 ± 62 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">1188</td><td align="right">1096</td><td align="right">1481</td><td align="right">62</td><td align="right">1221</td><td align="right">1307</td></tr><tr><td>load</td><td align="right">1023</td><td align="right">942</td><td align="right">1314</td><td align="right">56</td><td align="right">1052</td><td align="right">1104</td></tr><tr><td>domContentLoaded</td><td align="right">1017</td><td align="right">937</td><td align="right">1312</td><td align="right">57</td><td align="right">1045</td><td align="right">1098</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">30</td><td align="right">3</td><td align="right">16</td><td align="right">25</td></tr><tr><td>firstPaint</td><td align="right">629</td><td align="right">79</td><td align="right">1230</td><td align="right">409</td><td align="right">1015</td><td align="right">1098</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">22</td><td align="right">3</td><td align="right">7</td><td align="right">14</td></tr><tr><td>firstReactRender</td><td align="right">19</td><td align="right">15</td><td align="right">54</td><td align="right">6</td><td align="right">20</td><td align="right">28</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">5</td><td align="right">73</td><td align="right">11</td><td align="right">19</td><td align="right">31</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">781</td><td align="right">699</td><td align="right">1019</td><td align="right">54</td><td align="right">807</td><td align="right">869</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">19</td><td align="right">2</td><td align="right">8</td><td align="right">13</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2102</td><td align="right">1692</td><td align="right">2418</td><td align="right">167</td><td align="right">2236</td><td align="right">2303</td></tr><tr><td>load</td><td align="right">1635</td><td align="right">1310</td><td align="right">1978</td><td align="right">130</td><td align="right">1732</td><td align="right">1811</td></tr><tr><td>domContentLoaded</td><td align="right">1628</td><td align="right">1307</td><td align="right">1963</td><td align="right">129</td><td align="right">1726</td><td align="right">1807</td></tr><tr><td>domInteractive</td><td align="right">15</td><td align="right">11</td><td align="right">52</td><td align="right">9</td><td align="right">13</td><td align="right">40</td></tr><tr><td>firstPaint</td><td align="right">159</td><td align="right">61</td><td align="right">348</td><td align="right">60</td><td align="right">180</td><td align="right">288</td></tr><tr><td>backgroundConnect</td><td align="right">26</td><td align="right">9</td><td align="right">311</td><td align="right">30</td><td align="right">27</td><td align="right">49</td></tr><tr><td>firstReactRender</td><td align="right">130</td><td align="right">41</td><td align="right">338</td><td align="right">99</td><td align="right">243</td><td align="right">329</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">4</td><td align="right">43</td><td align="right">6</td><td align="right">12</td><td align="right">21</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">5</td><td align="right">1</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1621</td><td align="right">1306</td><td align="right">1831</td><td align="right">125</td><td align="right">1713</td><td align="right">1794</td></tr><tr><td>setupStore</td><td align="right">20</td><td align="right">6</td><td align="right">183</td><td align="right">29</td><td align="right">19</td><td align="right">49</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1295</td><td align="right">1112</td><td align="right">1854</td><td align="right">125</td><td align="right">1340</td><td align="right">1574</td></tr><tr><td>load</td><td align="right">1153</td><td align="right">983</td><td align="right">1630</td><td align="right">120</td><td align="right">1217</td><td align="right">1407</td></tr><tr><td>domContentLoaded</td><td align="right">1153</td><td align="right">983</td><td align="right">1630</td><td align="right">120</td><td align="right">1217</td><td align="right">1407</td></tr><tr><td>domInteractive</td><td align="right">95</td><td align="right">37</td><td align="right">266</td><td align="right">31</td><td align="right">104</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">21</td><td align="right">13</td><td align="right">193</td><td align="right">18</td><td align="right">20</td><td align="right">29</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">19</td><td align="right">56</td><td align="right">7</td><td align="right">22</td><td align="right">49</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">34</td><td align="right">4</td><td align="right">8</td><td align="right">12</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">1134</td><td align="right">972</td><td align="right">1610</td><td align="right">117</td><td align="right">1197</td><td align="right">1376</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">70</td><td align="right">8</td><td align="right">6</td><td align="right">15</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1549</td><td align="right">1367</td><td align="right">1941</td><td align="right">131</td><td align="right">1619</td><td align="right">1853</td></tr><tr><td>load</td><td align="right">1317</td><td align="right">1166</td><td align="right">1672</td><td align="right">115</td><td align="right">1394</td><td align="right">1544</td></tr><tr><td>domContentLoaded</td><td align="right">1317</td><td align="right">1166</td><td align="right">1672</td><td align="right">115</td><td align="right">1393</td><td align="right">1544</td></tr><tr><td>domInteractive</td><td align="right">82</td><td align="right">60</td><td align="right">236</td><td align="right">27</td><td align="right">85</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">22</td><td align="right">15</td><td align="right">80</td><td align="right">8</td><td align="right">24</td><td align="right">40</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">29</td><td align="right">48</td><td align="right">4</td><td align="right">36</td><td align="right">44</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">184</td><td align="right">18</td><td align="right">9</td><td align="right">23</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">1297</td><td align="right">1151</td><td align="right">1653</td><td align="right">115</td><td align="right">1367</td><td align="right">1518</td></tr><tr><td>setupStore</td><td align="right">11</td><td align="right">5</td><td align="right">239</td><td align="right">23</td><td align="right">8</td><td align="right">25</td></tr></tbody></table></details>

<details><summary>Bundle size diffs [🚀 Bundle size reduced!]</summary><ul><li>background: -6.91 KiB (-0.13%)</li>
<li>ui: 10 Bytes (0%)</li>
<li>common: 193 Bytes (0%)</li></ul></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-19T17:22:32Z
body: <details><summary>Builds ready [f8148e3]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15118575212/builds-beta/metamask-beta-chrome-12.17.3-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds-test/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds-test-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15118575212/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15118575212/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15118575212/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15118575212/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4900439/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/2d0db43b-f616-4a65-a0ac-db987e383676/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/2d0db43b-f616-4a65-a0ac-db987e383676/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/2d0db43b-f616-4a65-a0ac-db987e383676/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1199 ± 65 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">1199</td><td align="right">1089</td><td align="right">1479</td><td align="right">65</td><td align="right">1243</td><td align="right">1323</td></tr><tr><td>load</td><td align="right">1031</td><td align="right">938</td><td align="right">1277</td><td align="right">61</td><td align="right">1067</td><td align="right">1139</td></tr><tr><td>domContentLoaded</td><td align="right">1024</td><td align="right">929</td><td align="right">1271</td><td align="right">62</td><td align="right">1062</td><td align="right">1128</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">32</td><td align="right">3</td><td align="right">16</td><td align="right">24</td></tr><tr><td>firstPaint</td><td align="right">730</td><td align="right">90</td><td align="right">1166</td><td align="right">402</td><td align="right">1043</td><td align="right">1127</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">27</td><td align="right">5</td><td align="right">8</td><td align="right">23</td></tr><tr><td>firstReactRender</td><td align="right">19</td><td align="right">15</td><td align="right">48</td><td align="right">5</td><td align="right">20</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">5</td><td align="right">37</td><td align="right">8</td><td align="right">20</td><td align="right">29</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">785</td><td align="right">691</td><td align="right">1012</td><td align="right">60</td><td align="right">821</td><td align="right">889</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">25</td><td align="right">3</td><td align="right">8</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2104</td><td align="right">1691</td><td align="right">2542</td><td align="right">204</td><td align="right">2256</td><td align="right">2406</td></tr><tr><td>load</td><td align="right">1614</td><td align="right">1207</td><td align="right">1890</td><td align="right">158</td><td align="right">1727</td><td align="right">1834</td></tr><tr><td>domContentLoaded</td><td align="right">1608</td><td align="right">1203</td><td align="right">1882</td><td align="right">157</td><td align="right">1719</td><td align="right">1827</td></tr><tr><td>domInteractive</td><td align="right">15</td><td align="right">11</td><td align="right">50</td><td align="right">9</td><td align="right">13</td><td align="right">41</td></tr><tr><td>firstPaint</td><td align="right">175</td><td align="right">66</td><td align="right">1799</td><td align="right">171</td><td align="right">194</td><td align="right">258</td></tr><tr><td>backgroundConnect</td><td align="right">26</td><td align="right">9</td><td align="right">403</td><td align="right">40</td><td align="right">27</td><td align="right">47</td></tr><tr><td>firstReactRender</td><td align="right">137</td><td align="right">43</td><td align="right">408</td><td align="right">103</td><td align="right">150</td><td align="right">329</td></tr><tr><td>getState</td><td align="right">22</td><td align="right">4</td><td align="right">314</td><td align="right">59</td><td align="right">13</td><td align="right">33</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">3</td><td align="right">4</td></tr><tr><td>loadScripts</td><td align="right">1605</td><td align="right">1200</td><td align="right">1880</td><td align="right">156</td><td align="right">1713</td><td align="right">1816</td></tr><tr><td>setupStore</td><td align="right">36</td><td align="right">7</td><td align="right">342</td><td align="right">75</td><td align="right">18</td><td align="right">298</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1343</td><td align="right">1161</td><td align="right">1732</td><td align="right">121</td><td align="right">1412</td><td align="right">1635</td></tr><tr><td>load</td><td align="right">1190</td><td align="right">1006</td><td align="right">1503</td><td align="right">117</td><td align="right">1272</td><td align="right">1443</td></tr><tr><td>domContentLoaded</td><td align="right">1189</td><td align="right">1006</td><td align="right">1502</td><td align="right">117</td><td align="right">1272</td><td align="right">1443</td></tr><tr><td>domInteractive</td><td align="right">99</td><td align="right">37</td><td align="right">339</td><td align="right">37</td><td align="right">109</td><td align="right">153</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">21</td><td align="right">13</td><td align="right">49</td><td align="right">6</td><td align="right">23</td><td align="right">30</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">19</td><td align="right">51</td><td align="right">4</td><td align="right">24</td><td align="right">27</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">5</td><td align="right">200</td><td align="right">20</td><td align="right">8</td><td align="right">14</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">1171</td><td align="right">992</td><td align="right">1488</td><td align="right">116</td><td align="right">1258</td><td align="right">1427</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">37</td><td align="right">5</td><td align="right">6</td><td align="right">8</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1510</td><td align="right">1343</td><td align="right">1973</td><td align="right">117</td><td align="right">1587</td><td align="right">1705</td></tr><tr><td>load</td><td align="right">1296</td><td align="right">1145</td><td align="right">1727</td><td align="right">111</td><td align="right">1390</td><td align="right">1494</td></tr><tr><td>domContentLoaded</td><td align="right">1295</td><td align="right">1145</td><td align="right">1727</td><td align="right">111</td><td align="right">1389</td><td align="right">1493</td></tr><tr><td>domInteractive</td><td align="right">79</td><td align="right">58</td><td align="right">155</td><td align="right">19</td><td align="right">86</td><td align="right">121</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">23</td><td align="right">15</td><td align="right">251</td><td align="right">24</td><td align="right">22</td><td align="right">40</td></tr><tr><td>firstReactRender</td><td align="right">33</td><td align="right">28</td><td align="right">52</td><td align="right">4</td><td align="right">35</td><td align="right">42</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">31</td><td align="right">5</td><td align="right">8</td><td align="right">21</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">1278</td><td align="right">1130</td><td align="right">1708</td><td align="right">111</td><td align="right">1372</td><td align="right">1476</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">5</td><td align="right">63</td><td align="right">8</td><td align="right">8</td><td align="right">20</td></tr></tbody></table>Benchmark value 23 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 36 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 298 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
<b>Sum of mean exceeds: 4ms | Sum of p95 exceeds: 238ms<br>
Sum of all benchmark exceeds: 242ms</b><br>
</details>


author_association: COLLABORATOR