Repository: MetaMask/metamask-extension
Pull request #32243: cherry-pick(12.17): SRP pills cp-12.17.0
Author: login: shane-t
Labels: name: QA Passed
name: team-identity-deprecated
description: DEPRECATED: team no longer exists
Created: 2025-04-24T13:46:27Z | Merged: 2025-04-25T10:53:10Z

<!--
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. -->

This is a cherry pick of @aganglada's PR [here](https://github.com/MetaMask/metamask-extension/pull/32168) to 12.17

Bringing back SRP pills

<!--
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/32168?quickstart=1)

Fixes:

1. Do a fresh install
2. import your first SRP
3. Accounts should be created automatically and you should see no pills indicating the SRP
4. Import a second SRP
5. Accounts should be created automatically and you should see pills indicating the SRP

<!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. -->

<!-- [screenshots/recordings] -->

<img width="989" alt="Screenshot 2025-04-22 at 12 41 30" src="https://github.com/user-attachments/assets/821aab04-f09d-4328-b1e6-d3f0328bb3da" />

<!-- [screenshots/recordings] -->

- [ ] 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.

- [ ] 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.

---------

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32243?quickstart=1)

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **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/constants/snaps.ts b/app/scripts/constants/snaps.ts
new file mode 100644
index 000000000000..b02bcf745815
--- /dev/null
+++ b/app/scripts/constants/snaps.ts
@@ -0,0 +1,44 @@
+// Needed for webpack to analyze the preinstalled snaps
+export const PREINSTALLED_SNAPS_URLS = [
+  new URL(
+    '@metamask/message-signing-snap/dist/preinstalled-snap.json',
+    // @ts-expect-error TS1470: 'import.meta' is not allowed in CommonJS
+    import.meta.url,
+  ),
+  new URL(
+    '@metamask/ens-resolver-snap/dist/preinstalled-snap.json',
+    // @ts-expect-error TS1470: 'import.meta' is not allowed in CommonJS
+    import.meta.url,
+  ),
+  new URL(
+    '@metamask/institutional-wallet-snap/dist/preinstalled-snap.json',
+    // @ts-expect-error TS1470: 'import.meta' is not allowed in CommonJS
+    import.meta.url,
+  ),
+  ///: BEGIN:ONLY_INCLUDE_IF(build-flask)
+  new URL(
+    '@metamask/account-watcher/dist/preinstalled-snap.json',
+    // @ts-expect-error TS1470: 'import.meta' is not allowed in CommonJS
+    import.meta.url,
+  ),
+  new URL(
+    '@metamask/preinstalled-example-snap/dist/preinstalled-snap.json',
+    // @ts-expect-error TS1470: 'import.meta' is not allowed in CommonJS
+    import.meta.url,
+  ),
+  ///: END:ONLY_INCLUDE_IF
+  ///: BEGIN:ONLY_INCLUDE_IF(bitcoin)
+  new URL(
+    '@metamask/bitcoin-wallet-snap/dist/preinstalled-snap.json',
+    // @ts-expect-error TS1470: 'import.meta' is not allowed in CommonJS
+    import.meta.url,
+  ),
+  ///: END:ONLY_INCLUDE_IF
+  ///: BEGIN:ONLY_INCLUDE_IF(solana)
+  new URL(
+    '@metamask/solana-wallet-snap/dist/preinstalled-snap.json',
+    // @ts-expect-error TS1470: 'import.meta' is not allowed in CommonJS
+    import.meta.url,
+  ),
+  ///: END:ONLY_INCLUDE_IF
+];
diff --git a/app/scripts/lib/snap-keyring/snap-keyring.test.ts b/app/scripts/lib/snap-keyring/snap-keyring.test.ts
index 4c42846a10d1..6264b841e5d6 100644
--- a/app/scripts/lib/snap-keyring/snap-keyring.test.ts
+++ b/app/scripts/lib/snap-keyring/snap-keyring.test.ts
@@ -11,6 +11,8 @@ import {
   MetaMetricsEventCategory,
   MetaMetricsEventName,
 } from '../../../../shared/constants/metametrics';
+import { isSnapPreinstalled } from '../../../../shared/lib/snaps/snaps';
+import { getSnapName } from '../../../../shared/lib/accounts/snaps';
 import {
   showAccountCreationDialog,
   showAccountNameSuggestionDialog,
@@ -20,7 +22,6 @@ import {
   SnapKeyringBuilderAllowActions,
   SnapKeyringBuilderMessenger,
 } from './types';
-import { getSnapName, isSnapPreinstalled } from './snaps';
 
 const mockAddRequest = jest.fn();
 const mockStartFlow = jest.fn();
@@ -68,9 +69,13 @@ const mockInternalAccount = {
   },
 };
 
-jest.mock('./snaps', () => ({
-  ...jest.requireActual('./snaps'),
+jest.mock('../../../../shared/lib/snaps/snaps', () => ({
+  ...jest.requireActual('../../../../shared/lib/snaps/snaps'),
   isSnapPreinstalled: jest.fn(),
+}));
+
+jest.mock('../../../../shared/lib/accounts/snaps', () => ({
+  ...jest.requireActual('../../../../shared/lib/accounts/snaps'),
   getSnapName: jest.fn(),
 }));
 
diff --git a/app/scripts/lib/snap-keyring/snap-keyring.ts b/app/scripts/lib/snap-keyring/snap-keyring.ts
index 85f7668a75e3..6506c697ab58 100644
--- a/app/scripts/lib/snap-keyring/snap-keyring.ts
+++ b/app/scripts/lib/snap-keyring/snap-keyring.ts
@@ -19,10 +19,11 @@ import { t } from '../../translate';
 import { IconName } from '../../../../ui/components/component-library/icon';
 import MetaMetricsController from '../../controllers/metametrics-controller';
 import { getUniqueAccountName } from '../../../../shared/lib/accounts';
+import { isSnapPreinstalled } from '../../../../shared/lib/snaps/snaps';
+import { getSnapName } from '../../../../shared/lib/accounts/snaps';
 import { SnapKeyringBuilderMessenger } from './types';
 import { isBlockedUrl } from './utils/isBlockedUrl';
 import { showError, showSuccess } from './utils/showResult';
-import { getSnapName, isSnapPreinstalled } from './snaps';
 
 /**
  * Builder type for the Snap keyring.
diff --git a/shared/lib/accounts/snaps.ts b/shared/lib/accounts/snaps.ts
index e1b46e26a395..dd6a0ba442f1 100644
--- a/shared/lib/accounts/snaps.ts
+++ b/shared/lib/accounts/snaps.ts
@@ -1,6 +1,12 @@
 import { SnapId } from '@metamask/snaps-sdk';
-import { BITCOIN_WALLET_SNAP_ID } from './bitcoin-wallet-snap';
+import {
+  stripSnapPrefix,
+  getLocalizedSnapManifest,
+} from '@metamask/snaps-utils';
+// eslint-disable-next-line import/no-restricted-paths
+import { SnapKeyringBuilderMessenger } from '../../../app/scripts/lib/snap-keyring/types';
 import { SOLANA_WALLET_SNAP_ID } from './solana-wallet-snap';
+import { BITCOIN_WALLET_SNAP_ID } from './bitcoin-wallet-snap';
 
 /**
  * A constant array that contains the IDs of whitelisted multichain
@@ -21,3 +27,33 @@ const WHITELISTED_SNAPS = [BITCOIN_WALLET_SNAP_ID, SOLANA_WALLET_SNAP_ID];
 export function isMultichainWalletSnap(id: SnapId): boolean {
   return WHITELISTED_SNAPS.includes(id);
 }
+
+/**
+ * Get the localized Snap name or some fallback name otherwise.
+ *
+ * @param snapId - Snap ID.
+ * @param messenger - Snap keyring messenger.
+ * @returns The Snap name.
+ */
+export function getSnapName(
+  snapId: SnapId,
+  messenger: SnapKeyringBuilderMessenger,
+) {
+  const { currentLocale } = messenger.call('PreferencesController:getState');
+  const snap = messenger.call('SnapController:get', snapId);
+
+  if (!snap) {
+    return stripSnapPrefix(snapId);
+  }
+
+  if (snap.localizationFiles) {
+    const localizedManifest = getLocalizedSnapManifest(
+      snap.manifest,
+      currentLocale,
+      snap.localizationFiles,
+    );
+    return localizedManifest.proposedName;
+  }
+
+  return snap.manifest.proposedName;
+}
diff --git a/shared/lib/snaps/snaps.ts b/shared/lib/snaps/snaps.ts
new file mode 100644
index 000000000000..347d85adb75c
--- /dev/null
+++ b/shared/lib/snaps/snaps.ts
@@ -0,0 +1,21 @@
+import { SnapId } from '@metamask/snaps-sdk';
+
+export const PREINSTALLED_SNAPS = [
+  'npm:@metamask/message-signing-snap',
+  'npm:@metamask/ens-resolver-snap',
+  'npm:@metamask/institutional-wallet-snap',
+  'npm:@metamask/account-watcher',
+  'npm:@metamask/preinstalled-example-snap',
+  'npm:@metamask/bitcoin-wallet-snap',
+  'npm:@metamask/solana-wallet-snap',
+];
+
+/**
+ * Check if a Snap is a preinstalled Snap.
+ *
+ * @param snapId - Snap ID to verify.
+ * @returns True if Snap is a preinstalled Snap, false otherwise.
+ */
+export function isSnapPreinstalled(snapId: SnapId) {
+  return PREINSTALLED_SNAPS.some((snap) => snap === snapId);
+}
diff --git a/ui/components/multichain/account-list-item/account-list-item.js b/ui/components/multichain/account-list-item/account-list-item.js
index b1443702e209..3e0b4728033b 100644
--- a/ui/components/multichain/account-list-item/account-list-item.js
+++ b/ui/components/multichain/account-list-item/account-list-item.js
@@ -56,6 +56,7 @@ import {
   getShowFiatInTestnets,
   getChainIdsToPoll,
   getSnapsMetadata,
+  getMetaMaskKeyrings,
 } from '../../../selectors';
 ///: BEGIN:ONLY_INCLUDE_IF(build-main)
 import { getIntlLocale } from '../../../ducks/locale/locale';
@@ -76,7 +77,7 @@ import { normalizeSafeAddress } from '../../../../app/scripts/lib/multichain/add
 import { useMultichainSelector } from '../../../hooks/useMultichainSelector';
 import { useGetFormattedTokensPerChain } from '../../../hooks/useGetFormattedTokensPerChain';
 import { useAccountTotalCrossChainFiatBalance } from '../../../hooks/useAccountTotalCrossChainFiatBalance';
-import { getAccountLabel } from '../../../helpers/utils/accounts';
+import { getAccountLabels } from '../../../helpers/utils/accounts';
 ///: BEGIN:ONLY_INCLUDE_IF(multichain)
 import { getMultichainAggregatedBalance } from '../../../selectors/assets';
 ///: END:ONLY_INCLUDE_IF
@@ -113,13 +114,20 @@ const AccountListItem = ({
   const [accountOptionsMenuOpen, setAccountOptionsMenuOpen] = useState(false);
   const [accountListItemMenuElement, setAccountListItemMenuElement] =
     useState();
+
   const snapMetadata = useSelector(getSnapsMetadata);
-  const accountLabel = getAccountLabel(
-    account.metadata.keyring.type,
-    account,
-    account.metadata.keyring.type === KeyringType.snap
-      ? getSnapName(snapMetadata)(account.metadata?.snap.id)
-      : null,
+  const keyrings = useSelector(getMetaMaskKeyrings);
+  const accountLabels = useMemo(
+    () =>
+      getAccountLabels(
+        account.metadata.keyring.type,
+        account,
+        keyrings,
+        account.metadata.keyring.type === KeyringType.snap
+          ? getSnapName(snapMetadata)(account.metadata?.snap?.id)
+          : null,
+      ),
+    [account, keyrings, snapMetadata],
   );
 
   const useBlockie = useSelector(getUseBlockie);
@@ -437,19 +445,23 @@ const AccountListItem = ({
             </Box>
           )}
         </Box>
-        {accountLabel ? (
-          <Tag
-            label={accountLabel}
-            labelProps={{
-              variant: TextVariant.bodyXs,
-              color: Color.textAlternative,
-            }}
-            startIconName={
-              account.metadata.keyring.type === KeyringType.snap
-                ? IconName.Snaps
-                : null
-            }
-          />
+        {accountLabels.length > 0 ? (
+          <Box flexDirection={FlexDirection.Row}>
+            {accountLabels.map(({ label, icon }) => {
+              return (
+                <Tag
+                  data-testid={`account-list-item-tag-${account.id}-${label}`}
+                  key={label}
+                  label={label}
+                  labelProps={{
+                    variant: TextVariant.bodyXs,
+                    color: Color.textAlternative,
+                  }}
+                  startIconName={icon}
+                />
+              );
+            })}
+          </Box>
         ) : null}
       </Box>
 
diff --git a/ui/components/multichain/pages/send/components/__snapshots__/your-accounts.test.tsx.snap b/ui/components/multichain/pages/send/components/__snapshots__/your-accounts.test.tsx.snap
index 60491ac72580..9181801c45c1 100644
--- a/ui/components/multichain/pages/send/components/__snapshots__/your-accounts.test.tsx.snap
+++ b/ui/components/multichain/pages/send/components/__snapshots__/your-accounts.test.tsx.snap
@@ -646,13 +646,18 @@ exports[`SendPageYourAccounts render renders correctly 1`] = `
           </div>
         </div>
         <div
-          class="mm-box mm-tag mm-box--padding-right-1 mm-box--padding-left-1 mm-box--display-flex mm-box--gap-1 mm-box--align-items-center mm-box--background-color-background-default mm-box--rounded-pill mm-box--border-color-border-default mm-box--border-width-1 box--border-style-solid"
+          class="mm-box mm-box--flex-direction-row"
         >
-          <p
-            class="mm-box mm-text mm-text--body-xs mm-box--color-text-alternative"
+          <div
+            class="mm-box mm-tag mm-box--padding-right-1 mm-box--padding-left-1 mm-box--display-flex mm-box--gap-1 mm-box--align-items-center mm-box--background-color-background-default mm-box--rounded-pill mm-box--border-color-border-default mm-box--border-width-1 box--border-style-solid"
+            data-testid="account-list-item-tag-15e69915-2a1a-4019-93b3-916e11fd432f-Ledger"
           >
-            Ledger
-          </p>
+            <p
+              class="mm-box mm-text mm-text--body-xs mm-box--color-text-alternative"
+            >
+              Ledger
+            </p>
+          </div>
         </div>
       </div>
     </div>
@@ -1080,6 +1085,24 @@ exports[`SendPageYourAccounts render renders correctly 1`] = `
             </div>
           </div>
         </div>
+        <div
+          class="mm-box mm-box--flex-direction-row"
+        >
+          <div
+            class="mm-box mm-tag mm-box--padding-right-1 mm-box--padding-left-1 mm-box--display-flex mm-box--gap-1 mm-box--align-items-center mm-box--background-color-background-default mm-box--rounded-pill mm-box--border-color-border-default mm-box--border-width-1 box--border-style-solid"
+            data-testid="account-list-item-tag-c3deeb99-ba0d-4a4e-a0aa-033fc1f79ae3-mock snap name (Beta)"
+          >
+            <span
+              class="mm-box mm-icon mm-icon--size-xs mm-box--display-inline-block mm-box--color-inherit"
+              style="mask-image: url('./images/icons/snaps.svg');"
+            />
+            <p
+              class="mm-box mm-text mm-text--body-xs mm-box--color-text-alternative"
+            >
+              mock snap name (Beta)
+            </p>
+          </div>
+        </div>
       </div>
     </div>
     <div
diff --git a/ui/helpers/utils/accounts.js b/ui/helpers/utils/accounts.js
index ba5298deab4c..cddda8b58d74 100644
--- a/ui/helpers/utils/accounts.js
+++ b/ui/helpers/utils/accounts.js
@@ -1,3 +1,4 @@
+import { IconName } from '@metamask/snaps-sdk/jsx';
 import { InvisibleCharacter } from '../../components/component-library';
 import {
   GOERLI_DISPLAY_NAME,
@@ -11,6 +12,7 @@ import { HardwareKeyringNames } from '../../../shared/constants/hardware-wallets
 // TODO: Remove restricted import
 // eslint-disable-next-line import/no-restricted-paths
 import { t } from '../../../app/scripts/translate';
+import { isSnapPreinstalled } from '../../../shared/lib/snaps/snaps';
 
 export function getAccountNameErrorMessage(
   accounts,
@@ -73,26 +75,112 @@ export function getAvatarNetworkColor(name) {
   }
 }
 
-export function getAccountLabel(type, account) {
+const toSrpLabel = (index) =>
+  // Index starts at 1, for SRPs.
+  `SRP #${index + 1}`;
+
+export function getAccountLabels(
+  type,
+  account,
+  keyrings,
+  ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
+  snapName,
+  ///: END:ONLY_INCLUDE_IF
+) {
   if (!account) {
-    return null;
+    return [];
   }
+
+  const labels = [];
+
+  const hdKeyrings = keyrings.filter(
+    (keyring) => keyring.type === KeyringType.hdKeyTree,
+  );
+
   switch (type) {
-    case KeyringType.hdKeyTree:
-      return null;
+    case KeyringType.hdKeyTree: {
+      if (hdKeyrings.length > 1) {
+        const hdKeyringIndex = hdKeyrings.findIndex((kr) =>
+          kr.accounts.includes(account.address),
+        );
+        labels.push({
+          label: toSrpLabel(hdKeyringIndex),
+          icon: null,
+        });
+      }
+      break;
+    }
     case KeyringType.imported:
-      return t('imported');
+      labels.push({
+        label: t('imported'),
+        icon: null,
+      });
+      break;
     case KeyringType.qr:
-      return HardwareKeyringNames.qr;
+      labels.push({
+        label: HardwareKeyringNames.qr,
+        icon: null,
+      });
+      break;
     case KeyringType.trezor:
-      return HardwareKeyringNames.trezor;
-    case KeyringType.oneKey:
-      return HardwareKeyringNames.oneKey;
+      labels.push({
+        label: HardwareKeyringNames.trezor,
+        icon: null,
+      });
+      break;
     case KeyringType.ledger:
-      return HardwareKeyringNames.ledger;
+      labels.push({
+        label: HardwareKeyringNames.ledger,
+        icon: null,
+      });
+      break;
+    case KeyringType.oneKey:
+      labels.push({
+        label: HardwareKeyringNames.oneKey,
+        icon: null,
+      });
+      break;
     case KeyringType.lattice:
-      return HardwareKeyringNames.lattice;
+      labels.push({
+        label: HardwareKeyringNames.lattice,
+        icon: null,
+      });
+      break;
+    ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
+    case KeyringType.snap: {
+      const { entropySource } = account.options;
+      if (entropySource && hdKeyrings.length > 1) {
+        const hdKeyringIndex = hdKeyrings.findIndex(
+          (kr) => kr.metadata.id === entropySource,
+        );
+        labels.push({
+          label: toSrpLabel(hdKeyringIndex),
+          icon: null,
+        });
+      }
+
+      const isPreinstalled = isSnapPreinstalled(account.metadata.snap.id);
+
+      if (isPreinstalled) {
+        break;
+      }
+
+      if (snapName) {
+        labels.push({
+          label: `${snapName} (${t('beta')})`,
+          icon: IconName.Snaps,
+        });
+        break;
+      }
+      labels.push({
+        label: `${t('snaps')} (${t('beta')})`,
+        icon: IconName.Snaps,
+      });
+      break;
+    }
+    ///: END:ONLY_INCLUDE_IF
     default:
-      return null;
+      break;
   }
+  return labels;
 }
diff --git a/ui/helpers/utils/accounts.test.js b/ui/helpers/utils/accounts.test.js
index aa0b121a6cc0..11110e61bf03 100644
--- a/ui/helpers/utils/accounts.test.js
+++ b/ui/helpers/utils/accounts.test.js
@@ -9,8 +9,9 @@ import { BackgroundColor } from '../constants/design-system';
 import { KeyringType } from '../../../shared/constants/keyring';
 import { HardwareKeyringNames } from '../../../shared/constants/hardware-wallets';
 import mockState from '../../../test/data/mock-state.json';
+import { SOLANA_WALLET_SNAP_ID } from '../../../shared/lib/accounts/solana-wallet-snap';
 import {
-  getAccountLabel,
+  getAccountLabels,
   getAccountNameErrorMessage,
   getAvatarNetworkColor,
 } from './accounts';
@@ -21,6 +22,17 @@ const mockAccounts = Object.values(
 
 const mockLocalization = { t: jest.fn().mockReturnValue('Account') };
 
+const keyringsWithMetadata = [
+  {
+    type: KeyringType.hdKeyTree,
+    metadata: { id: 'hdKeyring1' },
+  },
+  {
+    type: KeyringType.hdKeyTree,
+    metadata: { id: 'hdKeyring2' },
+  },
+];
+
 describe('Accounts', () => {
   describe('#getAccountNameErrorMessage', () => {
     it('does not allow duplicate names', () => {
@@ -92,7 +104,7 @@ describe('Accounts', () => {
     });
   });
 
-  describe('#getAccountLabel', () => {
+  describe('#getAccountLabels', () => {
     const mockAccount = {
       address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
       id: 'cf8dace4-9439-4bd4-b3a8-88c821c8fcb3',
@@ -101,6 +113,9 @@ describe('Accounts', () => {
         keyring: {
           type: KeyringType.hdKeyTree,
         },
+        snap: {
+          id: SOLANA_WALLET_SNAP_ID,
+        },
       },
       options: {},
       methods: [
@@ -113,59 +128,157 @@ describe('Accounts', () => {
       type: 'eip155:eoa',
     };
 
-    it('should return null for null account', () => {
-      expect(getAccountLabel(KeyringType.qr, null)).toBeNull();
+    it('should return empty array for null account', () => {
+      expect(
+        getAccountLabels(KeyringType.qr, null, keyringsWithMetadata),
+      ).toStrictEqual([]);
     });
 
-    it('should return null for HD Key Tree accounts', () => {
-      expect(getAccountLabel(KeyringType.hdKeyTree, mockAccount)).toBeNull();
+    it('should return empty array for HD Key Tree accounts', () => {
+      expect(
+        getAccountLabels(KeyringType.hdKeyTree, mockAccount, []),
+      ).toStrictEqual([]);
     });
 
     it('should return the correct label for imported accounts', () => {
       mockAccount.metadata.keyring.type = KeyringType.imported;
-      expect(getAccountLabel(KeyringType.imported, mockAccount)).toBe(
-        'Imported',
-      );
+      expect(
+        getAccountLabels(
+          KeyringType.imported,
+          mockAccount,
+          keyringsWithMetadata,
+        ),
+      ).toStrictEqual([{ label: 'Imported', icon: null }]);
     });
 
     it('should return the correct label for QR hardware wallet', () => {
       mockAccount.metadata.keyring.type = KeyringType.qr;
-      expect(getAccountLabel(KeyringType.qr, mockAccount)).toBe(
-        HardwareKeyringNames.qr,
-      );
+      expect(
+        getAccountLabels(KeyringType.qr, mockAccount, keyringsWithMetadata),
+      ).toStrictEqual([{ label: HardwareKeyringNames.qr, icon: null }]);
     });
 
     it('should return the correct label for Trezor hardware wallet', () => {
       mockAccount.metadata.keyring.type = KeyringType.trezor;
-      expect(getAccountLabel(KeyringType.trezor, mockAccount)).toBe(
-        HardwareKeyringNames.trezor,
-      );
+      expect(
+        getAccountLabels(KeyringType.trezor, mockAccount, keyringsWithMetadata),
+      ).toStrictEqual([{ label: HardwareKeyringNames.trezor, icon: null }]);
     });
 
     it('should return the correct label for OneKey hardware wallet', () => {
       mockAccount.metadata.keyring.type = KeyringType.oneKey;
-      expect(getAccountLabel(KeyringType.oneKey, mockAccount)).toBe(
-        HardwareKeyringNames.oneKey,
-      );
+      expect(
+        getAccountLabels(KeyringType.oneKey, mockAccount, keyringsWithMetadata),
+      ).toStrictEqual([{ label: HardwareKeyringNames.oneKey, icon: null }]);
     });
 
     it('should return the correct label for Ledger hardware wallet', () => {
       mockAccount.metadata.keyring.type = KeyringType.ledger;
-      expect(getAccountLabel(KeyringType.ledger, mockAccount)).toBe(
-        HardwareKeyringNames.ledger,
-      );
+      expect(
+        getAccountLabels(KeyringType.ledger, mockAccount, keyringsWithMetadata),
+      ).toStrictEqual([{ label: HardwareKeyringNames.ledger, icon: null }]);
     });
 
     it('should return the correct label for Lattice hardware wallet', () => {
       mockAccount.metadata.keyring.type = KeyringType.lattice;
-      expect(getAccountLabel(KeyringType.lattice, mockAccount)).toBe(
-        HardwareKeyringNames.lattice,
-      );
+      expect(
+        getAccountLabels(
+          KeyringType.lattice,
+          mockAccount,
+          keyringsWithMetadata,
+        ),
+      ).toStrictEqual([{ label: HardwareKeyringNames.lattice, icon: null }]);
     });
 
     it('should handle unhandled account types', () => {
       mockAccount.metadata.keyring.type = 'unknown';
-      expect(getAccountLabel('unknown', mockAccount)).toBeNull();
+      expect(
+        getAccountLabels('unknown', mockAccount, keyringsWithMetadata),
+      ).toStrictEqual([]);
+    });
+  });
+
+  describe('SRP label', () => {
+    it('should show SRP label with index when there are multiple HD keyrings', () => {
+      const mockAccountWithHdKeyring = {
+        address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
+        metadata: {
+          keyring: { type: KeyringType.hdKeyTree },
+          snap: {
+            id: SOLANA_WALLET_SNAP_ID,
+          },
+        },
+      };
+
+      const multipleHdKeyrings = [
+        {
+          type: KeyringType.hdKeyTree,
+          accounts: ['0x123'],
+        },
+        {
+          type: KeyringType.hdKeyTree,
+          accounts: ['0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'],
+        },
+      ];
+
+      expect(
+        getAccountLabels(
+          KeyringType.hdKeyTree,
+          mockAccountWithHdKeyring,
+          multipleHdKeyrings,
+        ),
+      ).toStrictEqual([{ label: 'SRP #2', icon: null }]);
+    });
+
+    it('should not show SRP label when there is only one HD keyring', () => {
+      const mockAccountWithHdKeyring = {
+        address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
+        metadata: {
+          keyring: { type: KeyringType.hdKeyTree },
+          snap: {
+            id: SOLANA_WALLET_SNAP_ID,
+          },
+        },
+      };
+
+      const singleHdKeyring = [
+        {
+          type: KeyringType.hdKeyTree,
+          accounts: ['0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'],
+        },
+      ];
+
+      expect(
+        getAccountLabels(
+          KeyringType.hdKeyTree,
+          mockAccountWithHdKeyring,
+          singleHdKeyring,
+        ),
+      ).toStrictEqual([]);
+    });
+
+    it('should show SRP label for snap accounts with entropySource matching HD keyring', () => {
+      const mockSnapAccount = {
+        address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
+        options: {
+          entropySource: 'hdKeyring2',
+        },
+        metadata: {
+          keyring: { type: KeyringType.snap },
+          snap: {
+            id: SOLANA_WALLET_SNAP_ID,
+          },
+        },
+      };
+
+      expect(
+        getAccountLabels(
+          KeyringType.snap,
+          mockSnapAccount,
+          keyringsWithMetadata,
+          'Test Snap',
+        ),
+      ).toStrictEqual([{ label: 'SRP #2', icon: null }]);
     });
   });
 });


Reviews:
user: login: montelaidev
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T14:33:38Z
user: login: aganglada
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T10:46:19Z
user: login: montelaidev
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T10:53:09Z
user: login: shane-t
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-25T11:06:12Z

Review comments:
diff_hunk: @@ -73,26 +75,112 @@ export function getAvatarNetworkColor(name) {
   }
 }
 
-export function getAccountLabel(type, account) {
+const toSrpLabel = (index) =>
+  // Index starts at 1, for SRPs.
+  `SRP #${index + 1}`;
+
+export function getAccountLabels(
+  type,
+  account,
+  keyrings,
+  ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
+  snapName,
+  ///: END:ONLY_INCLUDE_IF
+) {
   if (!account) {
-    return null;
+    return [];
   }
+
+  const labels = [];
+
+  const hdKeyrings = keyrings.filter(
+    (keyring) => keyring.type === KeyringType.hdKeyTree,
+  );
+
   switch (type) {
-    case KeyringType.hdKeyTree:
-      return null;
+    case KeyringType.hdKeyTree: {
+      if (hdKeyrings.length > 1) {
+        const hdKeyringIndex = hdKeyrings.findIndex((kr) =>
+          kr.accounts.includes(account.address),
+        );
+        labels.push({
+          label: toSrpLabel(hdKeyringIndex),
+          icon: null,
+        });
+      }
+      break;
+    }
     case KeyringType.imported:
-      return t('imported');
+      labels.push({
+        label: t('imported'),
+        icon: null,
+      });
+      break;
     case KeyringType.qr:
-      return HardwareKeyringNames.qr;
+      labels.push({
+        label: HardwareKeyringNames.qr,
+        icon: null,
+      });
+      break;
     case KeyringType.trezor:
-      return HardwareKeyringNames.trezor;
-    case KeyringType.oneKey:
-      return HardwareKeyringNames.oneKey;
+      labels.push({
+        label: HardwareKeyringNames.trezor,
+        icon: null,
+      });
+      break;
     case KeyringType.ledger:
-      return HardwareKeyringNames.ledger;
+      labels.push({
+        label: HardwareKeyringNames.ledger,
+        icon: null,
+      });
+      break;
+    case KeyringType.oneKey:
+      labels.push({
+        label: HardwareKeyringNames.oneKey,
+        icon: null,
+      });
+      break;
     case KeyringType.lattice:
-      return HardwareKeyringNames.lattice;
+      labels.push({
+        label: HardwareKeyringNames.lattice,
+        icon: null,
+      });
+      break;
+    ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps)
+    case KeyringType.snap: {
+      const { entropySource } = account.options;
+      if (entropySource && hdKeyrings.length > 1) {
+        const hdKeyringIndex = hdKeyrings.findIndex(
+          (kr) => kr.metadata.id === entropySource,
+        );
+        labels.push({
+          label: toSrpLabel(hdKeyringIndex),
+          icon: null,
+        });
+      }
+
+      const isPreinstalled = isSnapPreinstalled(account.metadata.snap.id);
+
+      if (isPreinstalled) {
+        break;
+      }
+
+      if (snapName) {
+        labels.push({
+          label: `${snapName} (${t('beta')})`,
+          icon: IconName.Snaps,
+        });
+        break;
+      }
+      labels.push({
+        label: `${t('snaps')} (${t('beta')})`,
+        icon: IconName.Snaps,
+      });
+      break;
+    }
+    ///: END:ONLY_INCLUDE_IF
     default:
       return null;
path: ui/helpers/utils/accounts.js
user: login: montelaidev
body: ```suggestion
    default:
      return labels;
```
created_at: 2025-04-24T14:33:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,21 @@
+import { SnapId } from '@metamask/snaps-sdk';
+
+export const PREINSTALLED_SNAPS = [
+  'npm:@metamask/message-signing-snap',
+  'npm:@metamask/ens-resolver-snap',
+  'npm:@metamask/institutional-wallet-snap',
+  'npm:@metamask/account-watcher',
+  'npm:@metamask/preinstalled-example-snap',
+  'npm:@metamask/bitcoin-wallet-snap',
+  'npm:@metamask/solana-wallet-snap',
+];
path: shared/lib/snaps/snaps.ts
user: login: aganglada
body: is this not somewhere else on the codebase?
created_at: 2025-04-25T10:46:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,21 @@
+import { SnapId } from '@metamask/snaps-sdk';
+
+export const PREINSTALLED_SNAPS = [
+  'npm:@metamask/message-signing-snap',
+  'npm:@metamask/ens-resolver-snap',
+  'npm:@metamask/institutional-wallet-snap',
+  'npm:@metamask/account-watcher',
+  'npm:@metamask/preinstalled-example-snap',
+  'npm:@metamask/bitcoin-wallet-snap',
+  'npm:@metamask/solana-wallet-snap',
+];
path: shared/lib/snaps/snaps.ts
user: login: shane-t
body: it is something which was changed in main after the release was cut, there is a couple of stuff like that
created_at: 2025-04-25T11:06:12Z
author_association: MEMBER

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-24T13:49:07Z
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-04-24T13:50:59Z
body: <!-- METAMASK-CODEOWNERS-BOT -->
✨ Files requiring CODEOWNER review ✨
---
🔑 @MetaMask/accounts-engineers
- `app/scripts/lib/snap-keyring/snap-keyring.test.ts`
- `app/scripts/lib/snap-keyring/snap-keyring.ts`

🫰 @MetaMask/snaps-devs
- `app/scripts/constants/snaps.ts`
- `shared/lib/snaps/snaps.ts`

🖥️ @MetaMask/wallet-ux
- `ui/components/multichain/account-list-item/account-list-item.js`
- `ui/components/multichain/pages/send/components/__snapshots__/your-accounts.test.tsx.snap`


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-04-24T14:44:40Z
body: <details><summary>Builds ready [1262123]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14643508622/builds-beta/metamask-beta-chrome-12.17.0-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds-test/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds-test-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14643508622/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14643508622/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14643508622/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4818988/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a></li><li>content-script: <a href="https://output.circle-artifacts.com/output/job/4910e3a2-e805-40fc-863c-e88c19aace88/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/4910e3a2-e805-40fc-863c-e88c19aace88/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1288 ± 64 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">1288</td><td align="right">1171</td><td align="right">1495</td><td align="right">64</td><td align="right">1327</td><td align="right">1419</td></tr><tr><td>load</td><td align="right">1107</td><td align="right">976</td><td align="right">1339</td><td align="right">74</td><td align="right">1166</td><td align="right">983</td></tr><tr><td>domContentLoaded</td><td align="right">1101</td><td align="right">971</td><td align="right">1330</td><td align="right">74</td><td align="right">1164</td><td align="right">982</td></tr><tr><td>domInteractive</td><td align="right">21</td><td align="right">15</td><td align="right">82</td><td align="right">12</td><td align="right">19</td><td align="right">53</td></tr><tr><td>firstPaint</td><td align="right">669</td><td align="right">104</td><td align="right">1337</td><td align="right">449</td><td align="right">242</td><td align="right">325</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">8</td></tr><tr><td>firstReactRender</td><td align="right">29</td><td align="right">16</td><td align="right">160</td><td align="right">24</td><td align="right">25</td><td align="right">45</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">6</td><td align="right">32</td><td align="right">6</td><td align="right">7</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">847</td><td align="right">719</td><td align="right">1081</td><td align="right">73</td><td align="right">888</td><td align="right">924</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">5</td><td align="right">23</td><td align="right">3</td><td align="right">8</td><td align="right">9</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2199</td><td align="right">1821</td><td align="right">2787</td><td align="right">221</td><td align="right">2335</td><td align="right">2549</td></tr><tr><td>load</td><td align="right">1730</td><td align="right">1401</td><td align="right">2249</td><td align="right">199</td><td align="right">1820</td><td align="right">2155</td></tr><tr><td>domContentLoaded</td><td align="right">1721</td><td align="right">1397</td><td align="right">2244</td><td align="right">196</td><td align="right">1812</td><td align="right">2119</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">59</td><td align="right">9</td><td align="right">15</td><td align="right">46</td></tr><tr><td>firstPaint</td><td align="right">162</td><td align="right">65</td><td align="right">373</td><td align="right">59</td><td align="right">227</td><td align="right">77</td></tr><tr><td>backgroundConnect</td><td align="right">32</td><td align="right">10</td><td align="right">266</td><td align="right">31</td><td align="right">33</td><td align="right">81</td></tr><tr><td>firstReactRender</td><td align="right">178</td><td align="right">55</td><td align="right">369</td><td align="right">119</td><td align="right">71</td><td align="right">96</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">46</td><td align="right">8</td><td align="right">6</td><td align="right">9</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">4</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1716</td><td align="right">1396</td><td align="right">2242</td><td align="right">194</td><td align="right">1811</td><td align="right">2090</td></tr><tr><td>setupStore</td><td align="right">47</td><td align="right">7</td><td align="right">329</td><td align="right">81</td><td align="right">291</td><td align="right">9</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1427</td><td align="right">1251</td><td align="right">1792</td><td align="right">115</td><td align="right">1493</td><td align="right">1661</td></tr><tr><td>load</td><td align="right">1277</td><td align="right">1095</td><td align="right">1617</td><td align="right">117</td><td align="right">1347</td><td align="right">1503</td></tr><tr><td>domContentLoaded</td><td align="right">1276</td><td align="right">1095</td><td align="right">1617</td><td align="right">117</td><td align="right">1346</td><td align="right">1503</td></tr><tr><td>domInteractive</td><td align="right">105</td><td align="right">36</td><td align="right">262</td><td align="right">34</td><td align="right">87</td><td align="right">98</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">125</td><td align="right">14</td><td align="right">21</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">20</td><td align="right">52</td><td align="right">5</td><td align="right">27</td><td align="right">35</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">5</td><td align="right">27</td><td align="right">3</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">1257</td><td align="right">1080</td><td align="right">1601</td><td align="right">116</td><td align="right">1329</td><td align="right">1485</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">21</td><td align="right">2</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">1593</td><td align="right">1417</td><td align="right">2099</td><td align="right">143</td><td align="right">1632</td><td align="right">1935</td></tr><tr><td>load</td><td align="right">1374</td><td align="right">1215</td><td align="right">1883</td><td align="right">134</td><td align="right">1422</td><td align="right">1675</td></tr><tr><td>domContentLoaded</td><td align="right">1373</td><td align="right">1215</td><td align="right">1883</td><td align="right">134</td><td align="right">1422</td><td align="right">1675</td></tr><tr><td>domInteractive</td><td align="right">106</td><td align="right">62</td><td align="right">391</td><td align="right">44</td><td align="right">89</td><td align="right">96</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">48</td><td align="right">6</td><td align="right">24</td><td align="right">35</td></tr><tr><td>firstReactRender</td><td align="right">37</td><td align="right">30</td><td align="right">65</td><td align="right">6</td><td align="right">38</td><td align="right">50</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">5</td><td align="right">30</td><td align="right">4</td><td align="right">8</td><td align="right">9</td></tr><tr><td>initialActions</td><td align="right">1</td><td align="right">0</td><td align="right">1</td><td align="right">1</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1355</td><td align="right">1193</td><td align="right">1863</td><td align="right">134</td><td align="right">1398</td><td align="right">1661</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">31</td><td align="right">3</td><td align="right">8</td><td align="right">9</td></tr></tbody></table></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-04-24T15:58:28Z
body: <details><summary>Builds ready [b106e36]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14644845973/builds-beta/metamask-beta-chrome-12.17.0-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds-test/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds-test-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14644845973/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14644845973/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14644845973/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4819673/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a></li><li>content-script: <a href="https://output.circle-artifacts.com/output/job/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/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/5c434ee0-6af3-478f-9b6c-97ecbc7bfe70/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1211 ± 53 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">1211</td><td align="right">1111</td><td align="right">1346</td><td align="right">53</td><td align="right">1252</td><td align="right">1307</td></tr><tr><td>load</td><td align="right">1054</td><td align="right">946</td><td align="right">1197</td><td align="right">51</td><td align="right">1154</td><td align="right">993</td></tr><tr><td>domContentLoaded</td><td align="right">1049</td><td align="right">940</td><td align="right">1193</td><td align="right">51</td><td align="right">1153</td><td align="right">988</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">62</td><td align="right">7</td><td align="right">16</td><td align="right">30</td></tr><tr><td>firstPaint</td><td align="right">732</td><td align="right">70</td><td align="right">1161</td><td align="right">416</td><td align="right">241</td><td align="right">986</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">29</td><td align="right">3</td><td align="right">7</td><td align="right">8</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">16</td><td align="right">151</td><td align="right">15</td><td align="right">21</td><td align="right">40</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">42</td><td align="right">8</td><td align="right">7</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">804</td><td align="right">697</td><td align="right">919</td><td align="right">49</td><td align="right">841</td><td align="right">886</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">27</td><td align="right">3</td><td align="right">7</td><td align="right">8</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2246</td><td align="right">1886</td><td align="right">2620</td><td align="right">178</td><td align="right">2387</td><td align="right">2487</td></tr><tr><td>load</td><td align="right">1768</td><td align="right">1449</td><td align="right">2259</td><td align="right">177</td><td align="right">1867</td><td align="right">2134</td></tr><tr><td>domContentLoaded</td><td align="right">1759</td><td align="right">1445</td><td align="right">2255</td><td align="right">173</td><td align="right">1862</td><td align="right">2053</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">13</td><td align="right">102</td><td align="right">12</td><td align="right">16</td><td align="right">46</td></tr><tr><td>firstPaint</td><td align="right">168</td><td align="right">69</td><td align="right">399</td><td align="right">65</td><td align="right">277</td><td align="right">88</td></tr><tr><td>backgroundConnect</td><td align="right">34</td><td align="right">10</td><td align="right">221</td><td align="right">31</td><td align="right">36</td><td align="right">61</td></tr><tr><td>firstReactRender</td><td align="right">175</td><td align="right">55</td><td align="right">380</td><td align="right">113</td><td align="right">63</td><td align="right">91</td></tr><tr><td>getState</td><td align="right">23</td><td align="right">4</td><td align="right">392</td><td align="right">53</td><td align="right">5</td><td align="right">8</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">8</td><td align="right">1</td><td align="right">4</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1753</td><td align="right">1443</td><td align="right">2253</td><td align="right">171</td><td align="right">1855</td><td align="right">2024</td></tr><tr><td>setupStore</td><td align="right">33</td><td align="right">6</td><td align="right">334</td><td align="right">67</td><td align="right">30</td><td align="right">9</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1425</td><td align="right">1213</td><td align="right">1790</td><td align="right">114</td><td align="right">1503</td><td align="right">1645</td></tr><tr><td>load</td><td align="right">1273</td><td align="right">1052</td><td align="right">1640</td><td align="right">110</td><td align="right">1352</td><td align="right">1455</td></tr><tr><td>domContentLoaded</td><td align="right">1273</td><td align="right">1052</td><td align="right">1640</td><td align="right">110</td><td align="right">1352</td><td align="right">1454</td></tr><tr><td>domInteractive</td><td align="right">103</td><td align="right">38</td><td align="right">280</td><td align="right">33</td><td align="right">91</td><td align="right">95</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">133</td><td align="right">20</td><td align="right">21</td><td align="right">44</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">19</td><td align="right">46</td><td align="right">4</td><td align="right">25</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">4</td><td align="right">248</td><td align="right">24</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">1251</td><td align="right">1033</td><td align="right">1621</td><td align="right">109</td><td align="right">1332</td><td align="right">1434</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">29</td><td align="right">3</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">1543</td><td align="right">1334</td><td align="right">2005</td><td align="right">136</td><td align="right">1610</td><td align="right">1830</td></tr><tr><td>load</td><td align="right">1333</td><td align="right">1153</td><td align="right">1784</td><td align="right">125</td><td align="right">1395</td><td align="right">1563</td></tr><tr><td>domContentLoaded</td><td align="right">1333</td><td align="right">1153</td><td align="right">1784</td><td align="right">125</td><td align="right">1395</td><td align="right">1563</td></tr><tr><td>domInteractive</td><td align="right">92</td><td align="right">34</td><td align="right">175</td><td align="right">22</td><td align="right">87</td><td align="right">92</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">14</td><td align="right">43</td><td align="right">6</td><td align="right">23</td><td align="right">40</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">28</td><td align="right">49</td><td align="right">5</td><td align="right">37</td><td align="right">46</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">4</td><td align="right">34</td><td align="right">6</td><td align="right">8</td><td align="right">9</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">1314</td><td align="right">1134</td><td align="right">1767</td><td align="right">124</td><td align="right">1379</td><td align="right">1545</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">28</td><td align="right">4</td><td align="right">8</td><td align="right">9</td></tr></tbody></table></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-04-24T17:58:40Z
body: <details><summary>Builds ready [c66b2bc]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14645977993/builds-beta/metamask-beta-chrome-12.17.0-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds-test/metamask-chrome-12.17.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds-test-mv2/metamask-firefox-12.17.0.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.0-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14645977993/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14645977993/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14645977993/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4820436/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a></li><li>content-script: <a href="https://output.circle-artifacts.com/output/job/f4a5f95d-0989-4346-a6f7-09578cf642d4/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/f4a5f95d-0989-4346-a6f7-09578cf642d4/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1266 ± 53 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">1266</td><td align="right">1151</td><td align="right">1509</td><td align="right">53</td><td align="right">1296</td><td align="right">1339</td></tr><tr><td>load</td><td align="right">1103</td><td align="right">1000</td><td align="right">1244</td><td align="right">48</td><td align="right">1131</td><td align="right">1186</td></tr><tr><td>domContentLoaded</td><td align="right">1097</td><td align="right">996</td><td align="right">1232</td><td align="right">47</td><td align="right">1125</td><td align="right">1187</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">14</td><td align="right">65</td><td align="right">6</td><td align="right">17</td><td align="right">29</td></tr><tr><td>firstPaint</td><td align="right">682</td><td align="right">77</td><td align="right">1217</td><td align="right">445</td><td align="right">235</td><td align="right">296</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">27</td><td align="right">4</td><td align="right">7</td><td align="right">9</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">16</td><td align="right">42</td><td align="right">4</td><td align="right">21</td><td align="right">30</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">6</td><td align="right">39</td><td align="right">8</td><td align="right">6</td><td align="right">8</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">845</td><td align="right">747</td><td align="right">968</td><td align="right">46</td><td align="right">875</td><td align="right">919</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">5</td><td align="right">27</td><td align="right">3</td><td align="right">8</td><td align="right">9</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2101</td><td align="right">1728</td><td align="right">2631</td><td align="right">220</td><td align="right">2231</td><td align="right">2471</td></tr><tr><td>load</td><td align="right">1633</td><td align="right">1262</td><td align="right">2090</td><td align="right">180</td><td align="right">1742</td><td align="right">1980</td></tr><tr><td>domContentLoaded</td><td align="right">1626</td><td align="right">1254</td><td align="right">2050</td><td align="right">176</td><td align="right">1734</td><td align="right">1971</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">12</td><td align="right">58</td><td align="right">10</td><td align="right">14</td><td align="right">46</td></tr><tr><td>firstPaint</td><td align="right">177</td><td align="right">67</td><td align="right">1962</td><td align="right">190</td><td align="right">220</td><td align="right">87</td></tr><tr><td>backgroundConnect</td><td align="right">27</td><td align="right">10</td><td align="right">83</td><td align="right">16</td><td align="right">31</td><td align="right">75</td></tr><tr><td>firstReactRender</td><td align="right">182</td><td align="right">54</td><td align="right">438</td><td align="right">116</td><td align="right">69</td><td align="right">97</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">3</td><td align="right">37</td><td align="right">8</td><td align="right">7</td><td align="right">9</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">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1621</td><td align="right">1251</td><td align="right">2022</td><td align="right">172</td><td align="right">1731</td><td align="right">1943</td></tr><tr><td>setupStore</td><td align="right">27</td><td align="right">6</td><td align="right">382</td><td align="right">53</td><td align="right">26</td><td align="right">9</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1404</td><td align="right">1205</td><td align="right">1923</td><td align="right">117</td><td align="right">1474</td><td align="right">1622</td></tr><tr><td>load</td><td align="right">1251</td><td align="right">1079</td><td align="right">1749</td><td align="right">115</td><td align="right">1314</td><td align="right">1446</td></tr><tr><td>domContentLoaded</td><td align="right">1251</td><td align="right">1078</td><td align="right">1748</td><td align="right">115</td><td align="right">1314</td><td align="right">1446</td></tr><tr><td>domInteractive</td><td align="right">104</td><td align="right">40</td><td align="right">284</td><td align="right">34</td><td align="right">90</td><td align="right">98</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">175</td><td align="right">17</td><td align="right">21</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">19</td><td align="right">51</td><td align="right">5</td><td align="right">25</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">209</td><td align="right">21</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">2</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1230</td><td align="right">1066</td><td align="right">1730</td><td align="right">115</td><td align="right">1292</td><td align="right">1432</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">5</td><td align="right">11</td><td align="right">1</td><td align="right">7</td><td align="right">8</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1535</td><td align="right">1355</td><td align="right">2105</td><td align="right">149</td><td align="right">1605</td><td align="right">1798</td></tr><tr><td>load</td><td align="right">1325</td><td align="right">1172</td><td align="right">1876</td><td align="right">132</td><td align="right">1382</td><td align="right">1578</td></tr><tr><td>domContentLoaded</td><td align="right">1324</td><td align="right">1172</td><td align="right">1876</td><td align="right">132</td><td align="right">1381</td><td align="right">1578</td></tr><tr><td>domInteractive</td><td align="right">95</td><td align="right">34</td><td align="right">205</td><td align="right">26</td><td align="right">87</td><td align="right">96</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">25</td><td align="right">15</td><td align="right">339</td><td align="right">33</td><td align="right">23</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">34</td><td align="right">28</td><td align="right">50</td><td align="right">4</td><td align="right">36</td><td align="right">43</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">5</td><td align="right">350</td><td align="right">34</td><td align="right">8</td><td align="right">9</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">1303</td><td align="right">1153</td><td align="right">1862</td><td align="right">130</td><td align="right">1354</td><td align="right">1564</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">7</td><td align="right">8</td></tr></tbody></table></details>


author_association: COLLABORATOR