Repository: MetaMask/metamask-extension
Pull request #32690: fix: account sorting for snap accounts that derive entropySource cp-12.18.0
Author: login: montelaidev
Labels: name: team-accounts-framework
description: Accounts team
Created: 2025-05-08T15:17:43Z | Merged: 2025-05-09T14:34:36Z

<!--
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 PR fixes the account sorting order where discovered accounts are not sorted with their srp. 

<!--
Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32690?quickstart=1)

## **Related issues**

Fixes: https://github.com/MetaMask/metamask-extension/issues/32653
Resolves: https://consensyssoftware.atlassian.net/browse/MMMULTISRP-207?atlOrigin=eyJpIjoiYTlhZGQ0NjMyNjQxNGRmZGEyNjAyYzI4ZGRjYjQzZDAiLCJwIjoiaiJ9

## **Manual testing steps**

1. Open fresh srp
2. Import a srp where it won't discover accounts 
3. Import a srp where it won't discover accounts 
4. See that the accounts are still sorted

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. -->

### **Before**
<img width="375" alt="Screenshot 2025-05-08 at 23 17 19" src="https://github.com/user-attachments/assets/34dea535-28c9-4b98-893c-14bccce4ff8d" />

<!-- [screenshots/recordings] -->

### **After**
<img width="369" alt="Screenshot 2025-05-08 at 23 17 01" src="https://github.com/user-attachments/assets/ac8f6f78-596b-4b6b-985e-26c69914203e" />

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable
- [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.



Diff:
diff --git a/ui/components/multichain/account-list-menu/account-list-menu.test.tsx b/ui/components/multichain/account-list-menu/account-list-menu.test.tsx
index 062d36458199..64774f9649ba 100644
--- a/ui/components/multichain/account-list-menu/account-list-menu.test.tsx
+++ b/ui/components/multichain/account-list-menu/account-list-menu.test.tsx
@@ -653,6 +653,7 @@ describe('AccountListMenu', () => {
     const mockBtcAccount = createMockInternalAccount({
       name: 'Bitcoin Account',
       type: BtcAccountType.P2wpkh,
+      keyringType: KeyringTypes.snap,
       address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq',
     });
     const defaultMockState = {
diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js
index 1fc2cecafb01..530208a30e5f 100644
--- a/ui/selectors/selectors.js
+++ b/ui/selectors/selectors.js
@@ -536,15 +536,52 @@ export const getInternalAccountsSortedByKeyring = createDeepEqualSelector(
   getMetaMaskKeyrings,
   getMetaMaskAccounts,
   (keyrings, accounts) => {
+    const thirdPartySnaps = 'thirdPartySnaps';
+    // Create a map of entropySource map to accounts for quick lookup
+    const entropySourceToAccountsMap = Object.values(accounts).reduce(
+      (map, account) => {
+        if (account.metadata?.keyring?.type === KeyringTypes.snap) {
+          const { entropySource = thirdPartySnaps } = account.options || {};
+          if (!map[entropySource]) {
+            map[entropySource] = [];
+          }
+          map[entropySource].push(account);
+        }
+        return map;
+      },
+      {},
+    );
+
     // keep existing keyring order
-    const internalAccounts = keyrings
-      .map(({ accounts: addresses }) => addresses)
-      .flat()
-      .map((address) => {
-        return accounts[address];
-      });
+    return keyrings.reduce((internalAccounts, keyring) => {
+      // Get regular accounts for this keyring
+      const keyringAccounts = keyring.accounts.map(
+        (address) => accounts[address],
+      );
+
+      // If it's an HD keyring, add any snap accounts that belong to it
+      if (keyring.type === KeyringTypes.hd) {
+        const snapAccounts =
+          entropySourceToAccountsMap[keyring.metadata.id] || [];
+        internalAccounts.push(...keyringAccounts, ...snapAccounts);
+        return internalAccounts;
+      } else if (keyring.type === KeyringTypes.snap) {
+        const thirdpartySnapAccounts =
+          entropySourceToAccountsMap[thirdPartySnaps] || [];
+        // In a scenario where there are multiple snap keyrings, which isn't the case for today
+        // There would be duplicate third party snap accounts that are being pushed into internalAccounts again
+        // This will only be run once, when there is only one snap keyring
+        const accountsToAdd = thirdpartySnapAccounts.filter(
+          (account) =>
+            !internalAccounts.some((existing) => existing.id === account.id),
+        );
 
-    return internalAccounts;
+        internalAccounts.push(...accountsToAdd);
+        return internalAccounts;
+      }
+      internalAccounts.push(...keyringAccounts);
+      return internalAccounts;
+    }, []);
   },
 );
 
diff --git a/ui/selectors/selectors.test.js b/ui/selectors/selectors.test.js
index 34c2f31f1440..658357426cab 100644
--- a/ui/selectors/selectors.test.js
+++ b/ui/selectors/selectors.test.js
@@ -3,9 +3,11 @@ import {
   BtcAccountType,
   EthAccountType,
   EthMethod,
+  SolAccountType,
 } from '@metamask/keyring-api';
 import { deepClone } from '@metamask/snaps-utils';
 import { TransactionStatus } from '@metamask/transaction-controller';
+import { KeyringTypes } from '@metamask/keyring-controller';
 import { KeyringType } from '../../shared/constants/keyring';
 import mockState from '../../test/data/mock-state.json';
 import { CHAIN_IDS, NETWORK_TYPES } from '../../shared/constants/network';
@@ -16,6 +18,10 @@ import { selectSwitchedNetworkNeverShowMessage } from '../components/app/toast-m
 import * as networkSelectors from '../../shared/modules/selectors/networks';
 import { MultichainNetworks } from '../../shared/constants/multichain/networks';
 
+import {
+  SOLANA_WALLET_NAME,
+  SOLANA_WALLET_SNAP_ID,
+} from '../../shared/lib/accounts';
 import * as selectors from './selectors';
 
 jest.mock('../../shared/modules/selectors/networks', () => ({
@@ -2494,3 +2500,114 @@ describe('getNativeTokenInfo', () => {
     });
   });
 });
+
+describe('getInternalAccountsSortedByKeyring', () => {
+  const hdAccountFromHdKeyring1 = {
+    ...createMockInternalAccount({
+      address: '0x67B2fAf7959fB61eb9746571041476Bbd0672569',
+      keyringType: KeyringTypes.hd,
+    }),
+    balance: '0x0',
+  };
+  const hdAccountFromHdKeyring2 = {
+    ...createMockInternalAccount({
+      address: '0x38b00C1620c260cc683F0C89bda9b0D985A233a7',
+      keyringType: KeyringTypes.hd,
+    }),
+    balance: '0x0',
+  };
+  const solanaAccount1 = {
+    ...createMockInternalAccount({
+      address: 'eVFCkMPMevHrWfkvAixLcjsJnpGTkuU4HAP3S3RXU3b',
+      type: SolAccountType.DataAccount,
+      keyringType: KeyringTypes.snap,
+      snapOptions: {
+        id: SOLANA_WALLET_SNAP_ID,
+        name: SOLANA_WALLET_NAME,
+        enabled: true,
+      },
+      options: {
+        entropySource: 'mockHdKeyring1',
+      },
+    }),
+    balance: '0',
+  };
+  const solanaAccount2 = {
+    ...createMockInternalAccount({
+      address: 'DdHGa63k3vcH6kqDbX834GpeRUUef81Q8bUrBPdF937k',
+      type: SolAccountType.DataAccount,
+      keyringType: KeyringTypes.snap,
+      snapOptions: {
+        id: SOLANA_WALLET_SNAP_ID,
+        name: SOLANA_WALLET_NAME,
+        enabled: true,
+      },
+      options: {
+        entropySource: 'mockHdKeyring2',
+      },
+    }),
+    balance: '0',
+  };
+
+  const mockHdKeyring1 = {
+    type: KeyringTypes.hd,
+    accounts: [hdAccountFromHdKeyring1.address],
+  };
+
+  const mockHdKeyring2 = {
+    type: KeyringTypes.hd,
+    accounts: [hdAccountFromHdKeyring2.address],
+  };
+  const mockSnapKeyring = {
+    type: KeyringTypes.snap,
+    accounts: [solanaAccount1.address, solanaAccount2.address],
+  };
+
+  const mockHdKeyring1Metadata = {
+    id: 'mockHdKeyring1',
+    name: '',
+  };
+  const mockHdKeyring2Metadata = {
+    id: 'mockHdKeyring2',
+    name: '',
+  };
+  const mockSnapKeyringMetadata = {
+    id: 'mockSnapKeyring',
+    name: '',
+  };
+
+  it('returns internal accounts sorted by keyring', () => {
+    const mockStateWithSnapAccounts = {
+      metamask: {
+        internalAccounts: {
+          accounts: {
+            [hdAccountFromHdKeyring1.id]: hdAccountFromHdKeyring1,
+            [hdAccountFromHdKeyring2.id]: hdAccountFromHdKeyring2,
+            [solanaAccount1.id]: solanaAccount1,
+            [solanaAccount2.id]: solanaAccount2,
+          },
+          selectedAccount: solanaAccount1.id,
+        },
+        keyrings: [mockHdKeyring1, mockHdKeyring2, mockSnapKeyring],
+        keyringsMetadata: [
+          mockHdKeyring1Metadata,
+          mockHdKeyring2Metadata,
+          mockSnapKeyringMetadata,
+        ],
+        networkConfigurationsByChainId:
+          mockState.metamask.networkConfigurationsByChainId,
+        selectedNetworkClientId: mockState.metamask.selectedNetworkClientId,
+      },
+    };
+
+    const result = selectors.getInternalAccountsSortedByKeyring(
+      mockStateWithSnapAccounts,
+    );
+    expect(result).toStrictEqual([
+      hdAccountFromHdKeyring1,
+      solanaAccount1,
+      hdAccountFromHdKeyring2,
+      solanaAccount2,
+    ]);
+  });
+});


Reviews:
user: login: gantunesr
body: looks good! left some minor suggestions
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-08T22:23:10Z
user: login: montelaidev
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T23:26:22Z
user: login: NidhiKJha
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-09T11:44:43Z
user: login: gantunesr
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-09T12:46:43Z

Review comments:
diff_hunk: @@ -536,15 +536,41 @@ export const getInternalAccountsSortedByKeyring = createDeepEqualSelector(
   getMetaMaskKeyrings,
   getMetaMaskAccounts,
   (keyrings, accounts) => {
+    const thirdpartySnaps = 'thirdpartySnaps';
path: ui/selectors/selectors.js
user: login: gantunesr
body: nit
```suggestion
    const thirdPartySnaps = 'thirdPartySnaps';
```
created_at: 2025-05-08T21:57:39Z
author_association: MEMBER
diff_hunk: @@ -536,15 +536,41 @@ export const getInternalAccountsSortedByKeyring = createDeepEqualSelector(
   getMetaMaskKeyrings,
   getMetaMaskAccounts,
   (keyrings, accounts) => {
+    const thirdpartySnaps = 'thirdpartySnaps';
+    // Create a map of entropySource map to accounts for quick lookup
+    const entropySourceToAccountsMap = Object.values(accounts).reduce(
+      (map, account) => {
+        if (account.metadata?.keyring?.type === KeyringTypes.snap) {
+          const { entropySource = thirdpartySnaps } = account.options || {};
path: ui/selectors/selectors.js
user: login: gantunesr
body: I assume we can't execute a migration to populate this data, is that right?
created_at: 2025-05-08T22:01:47Z
author_association: MEMBER
diff_hunk: @@ -536,15 +536,41 @@ export const getInternalAccountsSortedByKeyring = createDeepEqualSelector(
   getMetaMaskKeyrings,
   getMetaMaskAccounts,
   (keyrings, accounts) => {
+    const thirdpartySnaps = 'thirdpartySnaps';
+    // Create a map of entropySource map to accounts for quick lookup
+    const entropySourceToAccountsMap = Object.values(accounts).reduce(
+      (map, account) => {
+        if (account.metadata?.keyring?.type === KeyringTypes.snap) {
+          const { entropySource = thirdpartySnaps } = account.options || {};
+          if (!map[entropySource]) {
+            map[entropySource] = [];
+          }
+          map[entropySource].push(account);
+        }
+        return map;
+      },
+      {},
+    );
+
     // keep existing keyring order
-    const internalAccounts = keyrings
-      .map(({ accounts: addresses }) => addresses)
-      .flat()
-      .map((address) => {
-        return accounts[address];
-      });
+    return keyrings.reduce((internalAccounts, keyring) => {
+      // Get regular accounts for this keyring
+      const keyringAccounts = keyring.accounts.map(
+        (address) => accounts[address],
+      );
 
-    return internalAccounts;
+      // If it's an HD keyring, add any snap accounts that belong to it
+      if (keyring.type === KeyringTypes.hd) {
+        const snapAccounts =
+          entropySourceToAccountsMap[keyring.metadata.id] || [];
+        return [...internalAccounts, ...keyringAccounts, ...snapAccounts];
+      } else if (keyring.type === KeyringTypes.snap) {
+        const thirdpartySnapAccounts =
+          entropySourceToAccountsMap[thirdpartySnaps] || [];
+        return [...internalAccounts, ...thirdpartySnapAccounts];
+      }
+      return [...internalAccounts, ...keyringAccounts];
path: ui/selectors/selectors.js
user: login: gantunesr
body: I think it is a bit faster if you just push the new elements into internalAccounts instead of generating a new array for every iteration

```suggestion
      // If it's an HD keyring, add any snap accounts that belong to it
      if (keyring.type === KeyringTypes.hd) {
        const snapAccounts =
          entropySourceToAccountsMap[keyring.metadata.id] || [];
        internalAccounts.push(...keyringAccounts, ...snapAccounts);
        return internalAccounts;
      } else if (keyring.type === KeyringTypes.snap) {
        const thirdpartySnapAccounts =
          entropySourceToAccountsMap[thirdpartySnaps] || [];
        internalAccounts.push(...thirdpartySnapAccounts);
        return internalAccounts;
      }
      internalAccounts.push(...keyringAccounts);
      return internalAccounts;
```
created_at: 2025-05-08T22:22:24Z
author_association: MEMBER
diff_hunk: @@ -536,15 +536,41 @@ export const getInternalAccountsSortedByKeyring = createDeepEqualSelector(
   getMetaMaskKeyrings,
   getMetaMaskAccounts,
   (keyrings, accounts) => {
+    const thirdpartySnaps = 'thirdpartySnaps';
+    // Create a map of entropySource map to accounts for quick lookup
+    const entropySourceToAccountsMap = Object.values(accounts).reduce(
+      (map, account) => {
+        if (account.metadata?.keyring?.type === KeyringTypes.snap) {
+          const { entropySource = thirdpartySnaps } = account.options || {};
path: ui/selectors/selectors.js
user: login: montelaidev
body: Correct, we currently have no way to migrate snap data. 
created_at: 2025-05-08T23:26:22Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-08T15:17:58Z
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-08T16:24:02Z
body: <details><summary>Builds ready [9ce9cdd]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds/metamask-chrome-12.17.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds-mv2/metamask-firefox-12.17.2.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14910624164/builds-beta/metamask-beta-chrome-12.17.2-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds-flask/metamask-flask-chrome-12.17.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds-test/metamask-chrome-12.17.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds-test-mv2/metamask-firefox-12.17.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14910624164/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14910624164/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14910624164/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14910624164/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4876216/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/7a17601e-63a2-454d-b871-d37abe182bc3/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/7a17601e-63a2-454d-b871-d37abe182bc3/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/7a17601e-63a2-454d-b871-d37abe182bc3/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1234 ± 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">1234</td><td align="right">1112</td><td align="right">1401</td><td align="right">54</td><td align="right">1265</td><td align="right">1329</td></tr><tr><td>load</td><td align="right">1077</td><td align="right">978</td><td align="right">1196</td><td align="right">48</td><td align="right">1108</td><td align="right">1151</td></tr><tr><td>domContentLoaded</td><td align="right">1071</td><td align="right">958</td><td align="right">1190</td><td align="right">49</td><td align="right">1102</td><td align="right">1146</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">14</td><td align="right">35</td><td align="right">3</td><td align="right">17</td><td align="right">25</td></tr><tr><td>firstPaint</td><td align="right">814</td><td align="right">136</td><td align="right">1201</td><td align="right">407</td><td align="right">1110</td><td align="right">1152</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">32</td><td align="right">4</td><td align="right">7</td><td align="right">13</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">15</td><td align="right">47</td><td align="right">6</td><td align="right">21</td><td align="right">37</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">6</td><td align="right">43</td><td align="right">8</td><td align="right">19</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">0</td></tr><tr><td>loadScripts</td><td align="right">824</td><td align="right">718</td><td align="right">938</td><td align="right">46</td><td align="right">854</td><td align="right">893</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">18</td><td align="right">2</td><td align="right">8</td><td align="right">11</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2206</td><td align="right">1786</td><td align="right">2554</td><td align="right">157</td><td align="right">2331</td><td align="right">2444</td></tr><tr><td>load</td><td align="right">1710</td><td align="right">1302</td><td align="right">1998</td><td align="right">119</td><td align="right">1783</td><td align="right">1855</td></tr><tr><td>domContentLoaded</td><td align="right">1703</td><td align="right">1294</td><td align="right">1987</td><td align="right">119</td><td align="right">1775</td><td align="right">1847</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">51</td><td align="right">9</td><td align="right">13</td><td align="right">39</td></tr><tr><td>firstPaint</td><td align="right">167</td><td align="right">66</td><td align="right">383</td><td align="right">64</td><td align="right">186</td><td align="right">320</td></tr><tr><td>backgroundConnect</td><td align="right">29</td><td align="right">9</td><td align="right">129</td><td align="right">18</td><td align="right">36</td><td align="right">51</td></tr><tr><td>firstReactRender</td><td align="right">192</td><td align="right">55</td><td align="right">398</td><td align="right">108</td><td align="right">297</td><td align="right">346</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">41</td><td align="right">7</td><td align="right">16</td><td align="right">28</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">7</td><td align="right">1</td><td align="right">4</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1698</td><td align="right">1290</td><td align="right">1963</td><td align="right">121</td><td align="right">1774</td><td align="right">1842</td></tr><tr><td>setupStore</td><td align="right">25</td><td align="right">7</td><td align="right">248</td><td align="right">37</td><td align="right">23</td><td align="right">41</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1337</td><td align="right">1165</td><td align="right">1898</td><td align="right">135</td><td align="right">1376</td><td align="right">1667</td></tr><tr><td>load</td><td align="right">1198</td><td align="right">1047</td><td align="right">1761</td><td align="right">133</td><td align="right">1244</td><td align="right">1506</td></tr><tr><td>domContentLoaded</td><td align="right">1197</td><td align="right">1047</td><td align="right">1760</td><td align="right">133</td><td align="right">1244</td><td align="right">1505</td></tr><tr><td>domInteractive</td><td align="right">99</td><td align="right">37</td><td align="right">293</td><td align="right">30</td><td align="right">110</td><td align="right">145</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">20</td><td align="right">13</td><td align="right">128</td><td align="right">12</td><td align="right">20</td><td align="right">33</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">19</td><td align="right">56</td><td align="right">6</td><td align="right">22</td><td align="right">30</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">37</td><td align="right">4</td><td align="right">8</td><td align="right">9</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">1180</td><td align="right">1033</td><td align="right">1728</td><td align="right">129</td><td align="right">1229</td><td align="right">1437</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">29</td><td align="right">5</td><td align="right">6</td><td align="right">19</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1569</td><td align="right">1386</td><td align="right">2208</td><td align="right">168</td><td align="right">1640</td><td align="right">1875</td></tr><tr><td>load</td><td align="right">1342</td><td align="right">1190</td><td align="right">1896</td><td align="right">148</td><td align="right">1421</td><td align="right">1578</td></tr><tr><td>domContentLoaded</td><td align="right">1341</td><td align="right">1189</td><td align="right">1895</td><td align="right">148</td><td align="right">1421</td><td align="right">1578</td></tr><tr><td>domInteractive</td><td align="right">83</td><td align="right">40</td><td align="right">362</td><td align="right">37</td><td align="right">85</td><td align="right">138</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">33</td><td align="right">14</td><td align="right">599</td><td align="right">66</td><td align="right">26</td><td align="right">57</td></tr><tr><td>firstReactRender</td><td align="right">36</td><td align="right">30</td><td align="right">55</td><td align="right">5</td><td align="right">37</td><td align="right">46</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">5</td><td align="right">30</td><td align="right">6</td><td align="right">10</td><td align="right">28</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">1313</td><td align="right">1174</td><td align="right">1876</td><td align="right">130</td><td align="right">1396</td><td align="right">1548</td></tr><tr><td>setupStore</td><td align="right">16</td><td align="right">5</td><td align="right">291</td><td align="right">40</td><td align="right">8</td><td align="right">59</td></tr></tbody></table>Benchmark value 1078 exceeds gate value 1070 for chrome browserify home mean load<br>
Benchmark value 1071 exceeds gate value 1061 for chrome browserify home mean domContentLoaded<br>
Benchmark value 815 exceeds gate value 800 for chrome browserify home mean firstPaint<br>
Benchmark value 2207 exceeds gate value 2192 for chrome webpack home mean uiStartup<br>
Benchmark value 1667 exceeds gate value 1660 for firefox browserify home p95 uiStartup<br>
Benchmark value 1506 exceeds gate value 1495 for firefox browserify home p95 load<br>
Benchmark value 1505 exceeds gate value 1495 for firefox browserify home p95 domContentLoaded<br>
Benchmark value 33 exceeds gate value 26 for firefox webpack home mean backgroundConnect<br>
Benchmark value 16 exceeds gate value 13 for firefox webpack home mean setupStore<br>
Benchmark value 57 exceeds gate value 49 for firefox webpack home p95 backgroundConnect<br>
Benchmark value 59 exceeds gate value 28 for firefox webpack home p95 setupStore<br>
<b>Sum of mean exceeds: 58ms | Sum of p95 exceeds: 67ms<br>
Sum of all benchmark exceeds: 125ms</b><br>
</details>

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


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-08T23:47:40Z
body: <!-- METAMASK-CODEOWNERS-BOT -->
✨ Files requiring CODEOWNER review ✨
---
🖥️ @MetaMask/wallet-ux
- `ui/components/multichain/account-list-menu/account-list-menu.test.tsx`


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

<details><summary>UI Startup Metrics (1236 ± 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">1236</td><td align="right">1108</td><td align="right">1388</td><td align="right">62</td><td align="right">1281</td><td align="right">1347</td></tr><tr><td>load</td><td align="right">1076</td><td align="right">961</td><td align="right">1210</td><td align="right">59</td><td align="right">1124</td><td align="right">1180</td></tr><tr><td>domContentLoaded</td><td align="right">1068</td><td align="right">958</td><td align="right">1202</td><td align="right">60</td><td align="right">1116</td><td align="right">1170</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">48</td><td align="right">5</td><td align="right">17</td><td align="right">25</td></tr><tr><td>firstPaint</td><td align="right">735</td><td align="right">148</td><td align="right">1207</td><td align="right">426</td><td align="right">1093</td><td align="right">1162</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">28</td><td align="right">4</td><td align="right">8</td><td align="right">21</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">16</td><td align="right">58</td><td align="right">7</td><td align="right">20</td><td align="right">34</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">6</td><td align="right">57</td><td align="right">10</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">823</td><td align="right">711</td><td align="right">964</td><td align="right">59</td><td align="right">877</td><td align="right">921</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">6</td><td align="right">27</td><td align="right">3</td><td align="right">9</td><td align="right">14</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2172</td><td align="right">1771</td><td align="right">2551</td><td align="right">191</td><td align="right">2290</td><td align="right">2489</td></tr><tr><td>load</td><td align="right">1689</td><td align="right">1303</td><td align="right">2021</td><td align="right">147</td><td align="right">1784</td><td align="right">1906</td></tr><tr><td>domContentLoaded</td><td align="right">1679</td><td align="right">1279</td><td align="right">2010</td><td align="right">152</td><td align="right">1777</td><td align="right">1898</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">12</td><td align="right">68</td><td align="right">10</td><td align="right">14</td><td align="right">46</td></tr><tr><td>firstPaint</td><td align="right">168</td><td align="right">63</td><td align="right">419</td><td align="right">65</td><td align="right">180</td><td align="right">314</td></tr><tr><td>backgroundConnect</td><td align="right">32</td><td align="right">11</td><td align="right">335</td><td align="right">40</td><td align="right">34</td><td align="right">63</td></tr><tr><td>firstReactRender</td><td align="right">176</td><td align="right">54</td><td align="right">364</td><td align="right">110</td><td align="right">297</td><td align="right">351</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">42</td><td align="right">8</td><td align="right">16</td><td align="right">29</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">1674</td><td align="right">1275</td><td align="right">1998</td><td align="right">152</td><td align="right">1775</td><td align="right">1890</td></tr><tr><td>setupStore</td><td align="right">18</td><td align="right">6</td><td align="right">189</td><td align="right">19</td><td align="right">20</td><td align="right">38</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1407</td><td align="right">1175</td><td align="right">1850</td><td align="right">122</td><td align="right">1482</td><td align="right">1637</td></tr><tr><td>load</td><td align="right">1254</td><td align="right">1057</td><td align="right">1680</td><td align="right">115</td><td align="right">1336</td><td align="right">1441</td></tr><tr><td>domContentLoaded</td><td align="right">1253</td><td align="right">1056</td><td align="right">1679</td><td align="right">115</td><td align="right">1335</td><td align="right">1441</td></tr><tr><td>domInteractive</td><td align="right">103</td><td align="right">38</td><td align="right">245</td><td align="right">32</td><td align="right">116</td><td align="right">158</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">14</td><td align="right">276</td><td align="right">26</td><td align="right">21</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">25</td><td align="right">20</td><td align="right">64</td><td align="right">9</td><td align="right">25</td><td align="right">53</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">315</td><td align="right">31</td><td align="right">9</td><td align="right">13</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">5</td><td align="right">1</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1233</td><td align="right">1042</td><td align="right">1660</td><td align="right">113</td><td align="right">1314</td><td align="right">1418</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">25</td><td align="right">3</td><td align="right">7</td><td align="right">14</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1599</td><td align="right">1421</td><td align="right">2060</td><td align="right">140</td><td align="right">1688</td><td align="right">1888</td></tr><tr><td>load</td><td align="right">1374</td><td align="right">1211</td><td align="right">1790</td><td align="right">130</td><td align="right">1463</td><td align="right">1645</td></tr><tr><td>domContentLoaded</td><td align="right">1374</td><td align="right">1211</td><td align="right">1789</td><td align="right">130</td><td align="right">1462</td><td align="right">1644</td></tr><tr><td>domInteractive</td><td align="right">80</td><td align="right">36</td><td align="right">218</td><td align="right">24</td><td align="right">90</td><td align="right">124</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">28</td><td align="right">15</td><td align="right">319</td><td align="right">39</td><td align="right">24</td><td align="right">46</td></tr><tr><td>firstReactRender</td><td align="right">36</td><td align="right">30</td><td align="right">47</td><td align="right">4</td><td align="right">38</td><td align="right">44</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">280</td><td align="right">28</td><td align="right">9</td><td align="right">32</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">1349</td><td align="right">1189</td><td align="right">1725</td><td align="right">121</td><td align="right">1436</td><td align="right">1599</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">35</td><td align="right">4</td><td align="right">8</td><td align="right">12</td></tr></tbody></table>Benchmark value 1236 exceeds gate value 1234 for chrome browserify home mean uiStartup<br>
Benchmark value 1076 exceeds gate value 1070 for chrome browserify home mean load<br>
Benchmark value 1069 exceeds gate value 1061 for chrome browserify home mean domContentLoaded<br>
Benchmark value 16 exceeds gate value 15 for chrome browserify home mean getState<br>
Benchmark value 22 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 2489 exceeds gate value 2454 for chrome webpack home p95 uiStartup<br>
Benchmark value 1408 exceeds gate value 1405 for firefox browserify home mean uiStartup<br>
Benchmark value 1254 exceeds gate value 1245 for firefox browserify home mean load<br>
Benchmark value 1254 exceeds gate value 1239 for firefox browserify home mean domContentLoaded<br>
Benchmark value 26 exceeds gate value 25 for firefox browserify home mean firstReactRender<br>
Benchmark value 1234 exceeds gate value 1230 for firefox browserify home mean loadScripts<br>
Benchmark value 28 exceeds gate value 26 for firefox webpack home mean backgroundConnect<br>
<b>Sum of mean exceeds: 51ms | Sum of p95 exceeds: 39ms<br>
Sum of all benchmark exceeds: 90ms</b><br>
</details>

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


author_association: COLLABORATOR