Repository: MetaMask/metamask-extension
Pull request #31781: feat: Add "Create Solana Account" in connection flow when Solana is requested chain by dapp
Author: login: adonesky1
Labels: name: team-wallet-api-platform-deprecated
description: DEPRECATED: please use "team-wallet-integrations" instead
name: INVALID-PR-TEMPLATE
description: PR's body doesn't match template
name: release-12.18.0
description: Issue or pull request that will be included in release 12.18.0
Created: 2025-04-09T15:42:13Z | Merged: 2025-04-16T20:58:39Z

Adds the ability to create a Solana Account on the fly in connection flow when a dapp requests to connect to Solana and no Solana accounts have been previously created. 

[Relevant Figma Designs](https://www.figma.com/design/ZQKVsVg1yqve25sUJkX12Z/Solana-opt-in-Scenarios?m=dev)

### Only Solana Requested (No Solana Accounts Previously Created):
- Intentional UX changed to note: in this scenario you can't click on the "permissions" tab -> see [related slack convo](https://consensys.slack.com/archives/C089Q8CQZHT/p1744714811971359?thread_ts=1744659060.255629&cid=C089Q8CQZHT)

https://github.com/user-attachments/assets/4fd8bdae-c2e2-4824-ba9c-512666f62803

### Solana + EVM Chain Requested (No Solana Accounts Previously Created):

https://github.com/user-attachments/assets/f7d3f502-188e-48da-9044-87abda8e22f3


[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/31781?quickstart=1)

## **Manual testing steps**

See video above ☝️ 



Diff:
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index 7e020d821f0c..0a748d4e5797 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -5315,6 +5315,12 @@
     "message": "Contact the creators of $1 for further support.",
     "description": "This is shown when the insight snap throws an error. $1 is the snap name"
   },
+  "solanaAccountRequested": {
+    "message": "This site is requesting a Solana account."
+  },
+  "solanaAccountRequired": {
+    "message": "A Solana account is required to connect to this site."
+  },
   "solanaImportAccounts": {
     "message": "Import Solana accounts"
   },
diff --git a/app/_locales/en_GB/messages.json b/app/_locales/en_GB/messages.json
index 7e020d821f0c..0a748d4e5797 100644
--- a/app/_locales/en_GB/messages.json
+++ b/app/_locales/en_GB/messages.json
@@ -5315,6 +5315,12 @@
     "message": "Contact the creators of $1 for further support.",
     "description": "This is shown when the insight snap throws an error. $1 is the snap name"
   },
+  "solanaAccountRequested": {
+    "message": "This site is requesting a Solana account."
+  },
+  "solanaAccountRequired": {
+    "message": "A Solana account is required to connect to this site."
+  },
   "solanaImportAccounts": {
     "message": "Import Solana accounts"
   },
diff --git a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.test.ts b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.test.ts
index f3ffaf32806e..fabcd5f09ee7 100644
--- a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.test.ts
+++ b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.test.ts
@@ -462,34 +462,37 @@ describe('wallet_createSession', () => {
 
     await handler(baseRequest);
 
-    expect(requestPermissionsForOrigin).toHaveBeenCalledWith({
-      [Caip25EndowmentPermissionName]: {
-        caveats: [
-          {
-            type: Caip25CaveatType,
-            value: {
-              requiredScopes: {
-                'eip155:1337': {
-                  accounts: ['eip155:1337:0x1', 'eip155:1337:0x3'],
-                },
-              },
-              optionalScopes: {
-                'eip155:100': {
-                  accounts: ['eip155:100:0x1', 'eip155:100:0x3'],
+    expect(requestPermissionsForOrigin).toHaveBeenCalledWith(
+      {
+        [Caip25EndowmentPermissionName]: {
+          caveats: [
+            {
+              type: Caip25CaveatType,
+              value: {
+                requiredScopes: {
+                  'eip155:1337': {
+                    accounts: ['eip155:1337:0x1', 'eip155:1337:0x3'],
+                  },
                 },
-                [MultichainNetwork.Solana]: {
-                  accounts: [
-                    'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:EEivRh9T4GTLEJprEaKQyjSQzW13JRb5D7jSpvPQ8296',
-                  ],
+                optionalScopes: {
+                  'eip155:100': {
+                    accounts: ['eip155:100:0x1', 'eip155:100:0x3'],
+                  },
+                  [MultichainNetwork.Solana]: {
+                    accounts: [
+                      'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:EEivRh9T4GTLEJprEaKQyjSQzW13JRb5D7jSpvPQ8296',
+                    ],
+                  },
                 },
+                isMultichainOrigin: true,
+                sessionProperties: {},
               },
-              isMultichainOrigin: true,
-              sessionProperties: {},
             },
-          },
-        ],
+          ],
+        },
       },
-    });
+      { metadata: { promptToCreateSolanaAccount: false } },
+    );
   });
 
   it('throws an error when requesting account permission approval fails', async () => {
@@ -597,29 +600,32 @@ describe('wallet_createSession', () => {
         unsupportableScopes: {},
       });
     await handler(baseRequest);
-    expect(requestPermissionsForOrigin).toHaveBeenCalledWith({
-      [Caip25EndowmentPermissionName]: {
-        caveats: [
-          {
-            type: Caip25CaveatType,
-            value: {
-              requiredScopes: {
-                'eip155:1337': {
-                  accounts: ['eip155:1337:0x1', 'eip155:1337:0x3'],
+    expect(requestPermissionsForOrigin).toHaveBeenCalledWith(
+      {
+        [Caip25EndowmentPermissionName]: {
+          caveats: [
+            {
+              type: Caip25CaveatType,
+              value: {
+                requiredScopes: {
+                  'eip155:1337': {
+                    accounts: ['eip155:1337:0x1', 'eip155:1337:0x3'],
+                  },
                 },
-              },
-              optionalScopes: {
-                'eip155:100': {
-                  accounts: ['eip155:100:0x1', 'eip155:100:0x3'],
+                optionalScopes: {
+                  'eip155:100': {
+                    accounts: ['eip155:100:0x1', 'eip155:100:0x3'],
+                  },
                 },
+                isMultichainOrigin: true,
+                sessionProperties: {},
               },
-              isMultichainOrigin: true,
-              sessionProperties: {},
             },
-          },
-        ],
+          ],
+        },
       },
-    });
+      { metadata: { promptToCreateSolanaAccount: false } },
+    );
   });
 
   it('preserves known session properties', async () => {
@@ -680,6 +686,159 @@ describe('wallet_createSession', () => {
     });
   });
 
+  describe('promptToCreateSolanaAccount', () => {
+    const baseRequestWithSolanaScope = {
+      jsonrpc: '2.0' as const,
+      id: 0,
+      method: 'wallet_createSession',
+      origin: 'http://test.com',
+      params: {
+        optionalScopes: {
+          [MultichainNetwork.Solana]: {
+            methods: [],
+            notifications: [],
+            accounts: [],
+          },
+        },
+        sessionProperties: {
+          [KnownSessionProperties.SolanaAccountChangedNotifications]: true,
+        },
+      },
+    };
+    it('prompts to create a solana account if a solana scope is requested and no solana accounts are currently available', async () => {
+      const {
+        handler,
+        requestPermissionsForOrigin,
+        getNonEvmAccountAddresses,
+      } = createMockedHandler();
+      getNonEvmAccountAddresses.mockResolvedValue([]);
+      MockMultichain.validateAndNormalizeScopes.mockReturnValue({
+        normalizedRequiredScopes: {
+          [MultichainNetwork.Solana]: {
+            methods: [],
+            notifications: [],
+            accounts: [],
+          },
+        },
+        normalizedOptionalScopes: {},
+      });
+
+      MockMultichain.bucketScopes
+        .mockReturnValueOnce({
+          supportedScopes: {},
+          supportableScopes: {},
+          unsupportableScopes: {},
+        })
+        .mockReturnValueOnce({
+          supportedScopes: {
+            'eip155:1337': {
+              methods: [],
+              notifications: [],
+              accounts: [],
+            },
+          },
+          supportableScopes: {},
+          unsupportableScopes: {},
+        });
+
+      await handler(baseRequestWithSolanaScope);
+
+      expect(requestPermissionsForOrigin).toHaveBeenCalledWith(
+        {
+          [Caip25EndowmentPermissionName]: {
+            caveats: [
+              {
+                type: Caip25CaveatType,
+                value: {
+                  requiredScopes: {},
+                  optionalScopes: {
+                    'eip155:1337': {
+                      accounts: [],
+                    },
+                  },
+                  isMultichainOrigin: true,
+                  sessionProperties: {
+                    [KnownSessionProperties.SolanaAccountChangedNotifications]:
+                      true,
+                  },
+                },
+              },
+            ],
+          },
+        },
+        { metadata: { promptToCreateSolanaAccount: true } },
+      );
+    });
+
+    it('does not prompt to create a solana account if a solana scope is requested and solana accounts are currently available', async () => {
+      const {
+        handler,
+        requestPermissionsForOrigin,
+        getNonEvmAccountAddresses,
+      } = createMockedHandler();
+      getNonEvmAccountAddresses.mockResolvedValue([
+        'solana:101:0x1',
+        'solana:101:0x2',
+      ]);
+      MockMultichain.validateAndNormalizeScopes.mockReturnValue({
+        normalizedRequiredScopes: {},
+        normalizedOptionalScopes: {
+          [MultichainNetwork.Solana]: {
+            methods: [],
+            notifications: [],
+            accounts: [],
+          },
+        },
+      });
+
+      MockMultichain.bucketScopes
+        .mockReturnValueOnce({
+          supportedScopes: {},
+          supportableScopes: {},
+          unsupportableScopes: {},
+        })
+        .mockReturnValueOnce({
+          supportedScopes: {
+            [MultichainNetwork.Solana]: {
+              methods: [],
+              notifications: [],
+              accounts: [],
+            },
+          },
+          supportableScopes: {},
+          unsupportableScopes: {},
+        });
+
+      await handler(baseRequestWithSolanaScope);
+
+      expect(requestPermissionsForOrigin).toHaveBeenCalledWith(
+        {
+          [Caip25EndowmentPermissionName]: {
+            caveats: [
+              {
+                type: Caip25CaveatType,
+                value: {
+                  requiredScopes: {},
+                  optionalScopes: {
+                    [MultichainNetwork.Solana]: {
+                      accounts: [],
+                    },
+                  },
+                  isMultichainOrigin: true,
+                  sessionProperties: {
+                    [KnownSessionProperties.SolanaAccountChangedNotifications]:
+                      true,
+                  },
+                },
+              },
+            ],
+          },
+        },
+        { metadata: { promptToCreateSolanaAccount: false } },
+      );
+    });
+  });
+
   describe('address case sensitivity', () => {
     it('treats EVM addresses as case insensitive but other addresses as case sensitive', async () => {
       const {
@@ -766,32 +925,35 @@ describe('wallet_createSession', () => {
         },
       });
 
-      expect(requestPermissionsForOrigin).toHaveBeenCalledWith({
-        [Caip25EndowmentPermissionName]: {
-          caveats: [
-            {
-              type: Caip25CaveatType,
-              value: {
-                requiredScopes: {
-                  'eip155:1': {
-                    accounts: ['eip155:1:0xABC123'], // Requested EVM address included
-                  },
-                },
-                optionalScopes: {
-                  [MultichainNetwork.Solana]: {
-                    accounts: [], // Solana address excluded due to case mismatch
+      expect(requestPermissionsForOrigin).toHaveBeenCalledWith(
+        {
+          [Caip25EndowmentPermissionName]: {
+            caveats: [
+              {
+                type: Caip25CaveatType,
+                value: {
+                  requiredScopes: {
+                    'eip155:1': {
+                      accounts: ['eip155:1:0xABC123'], // Requested EVM address included
+                    },
                   },
-                  [MultichainNetwork.Bitcoin]: {
-                    accounts: [], // Bitcoin address excluded due to case mismatch
+                  optionalScopes: {
+                    [MultichainNetwork.Solana]: {
+                      accounts: [], // Solana address excluded due to case mismatch
+                    },
+                    [MultichainNetwork.Bitcoin]: {
+                      accounts: [], // Bitcoin address excluded due to case mismatch
+                    },
                   },
+                  isMultichainOrigin: true,
+                  sessionProperties: {},
                 },
-                isMultichainOrigin: true,
-                sessionProperties: {},
               },
-            },
-          ],
+            ],
+          },
         },
-      });
+        { metadata: { promptToCreateSolanaAccount: false } },
+      );
     });
   });
 });
diff --git a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts
index 47984b0c0c89..3da6c466854a 100644
--- a/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts
+++ b/app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts
@@ -33,6 +33,7 @@ import {
   JsonRpcEngineEndCallback,
   JsonRpcEngineNextCallback,
 } from '@metamask/json-rpc-engine';
+import { MultichainNetwork } from '@metamask/multichain-transactions-controller';
 import {
   MetaMetricsEventCategory,
   MetaMetricsEventName,
@@ -45,7 +46,10 @@ import { GrantedPermissions } from '../types';
 import { isEqualCaseInsensitive } from '../../../../../../shared/modules/string-utils';
 import { getAllScopesFromScopesObjects } from '../../../../../../shared/lib/multichain/chain-agnostic-permission-utils/caip-chainids';
 import { getCaipAccountIdsFromScopesObjects } from '../../../../../../shared/lib/multichain/chain-agnostic-permission-utils/caip-accounts';
-import { isKnownSessionPropertyValue } from '../../../../../../shared/lib/multichain/chain-agnostic-permission-utils/misc-utils';
+import {
+  isKnownSessionPropertyValue,
+  isNamespaceInScopesObject,
+} from '../../../../../../shared/lib/multichain/chain-agnostic-permission-utils/misc-utils';
 
 /**
  * Handler for the `wallet_createSession` RPC method which is responsible
@@ -142,6 +146,25 @@ async function walletCreateSessionHandler(
       }
     };
 
+    // if solana is a requested scope but not supported, we add a promptToCreateSolanaAccount flag to request
+    const isSolanaRequested =
+      isNamespaceInScopesObject(
+        requiredScopesWithSupportedMethodsAndNotifications,
+        KnownCaipNamespace.Solana,
+      ) ||
+      isNamespaceInScopesObject(
+        optionalScopesWithSupportedMethodsAndNotifications,
+        KnownCaipNamespace.Solana,
+      );
+
+    let promptToCreateSolanaAccount = false;
+    if (isSolanaRequested) {
+      const supportedSolanaAccounts = await hooks.getNonEvmAccountAddresses(
+        MultichainNetwork.Solana,
+      );
+      promptToCreateSolanaAccount = supportedSolanaAccounts.length === 0;
+    }
+
     const { supportedScopes: supportedRequiredScopes } = bucketScopes(
       requiredScopesWithSupportedMethodsAndNotifications,
       {
@@ -172,10 +195,6 @@ async function walletCreateSessionHandler(
       supportedOptionalScopes,
     ]);
 
-    if (allSupportedRequestedCaipChainIds.length === 0) {
-      return end(new JsonRpcError(5100, 'Requested scopes are not supported'));
-    }
-
     const existingEvmAddresses = hooks
       .listAccounts()
       .map((account) => account.address);
@@ -216,16 +235,40 @@ async function walletCreateSessionHandler(
         supportedRequestedAccountAddresses,
       );
 
-    const [grantedPermissions] = await hooks.requestPermissionsForOrigin({
-      [Caip25EndowmentPermissionName]: {
-        caveats: [
-          {
-            type: Caip25CaveatType,
-            value: requestedCaip25CaveatValueWithSupportedAccounts,
-          },
-        ],
+    // if `promptToCreateSolanaAccount` is true and there are no other valid scopes requested,
+    // we add a `wallet` scope to the request in order to get passed the CAIP-25 caveat validator.
+    // This is very hacky but is necessary because the solana opt-in flow breaks key assumptions
+    // of the CAIP-25 permission specification -  namely that we can have valid requests with no scopes.
+    if (allSupportedRequestedCaipChainIds.length === 0) {
+      if (promptToCreateSolanaAccount) {
+        requestedCaip25CaveatValueWithSupportedAccounts.optionalScopes[
+          KnownCaipNamespace.Wallet
+        ] = {
+          accounts: [],
+        };
+      } else {
+        // if solana is not requested and there are no supported scopes, we return an error
+        return end(
+          new JsonRpcError(5100, 'Requested scopes are not supported'),
+        );
+      }
+    }
+
+    const [grantedPermissions] = await hooks.requestPermissionsForOrigin(
+      {
+        [Caip25EndowmentPermissionName]: {
+          caveats: [
+            {
+              type: Caip25CaveatType,
+              value: requestedCaip25CaveatValueWithSupportedAccounts,
+            },
+          ],
+        },
       },
-    });
+      {
+        metadata: { promptToCreateSolanaAccount },
+      },
+    );
 
     const approvedCaip25Permission =
       grantedPermissions[Caip25EndowmentPermissionName];
diff --git a/ui/components/multichain/create-solana-account-modal/create-solana-account-modal.tsx b/ui/components/multichain/create-solana-account-modal/create-solana-account-modal.tsx
index ba61a950eca2..88de2da57359 100644
--- a/ui/components/multichain/create-solana-account-modal/create-solana-account-modal.tsx
+++ b/ui/components/multichain/create-solana-account-modal/create-solana-account-modal.tsx
@@ -54,10 +54,9 @@ export const CreateSolanaAccountModal = ({
             <CreateSnapAccount
               onActionComplete={async (confirmed: boolean) => {
                 if (confirmed) {
-                  onClose();
-                } else {
                   setShowCreateAccount(false);
                 }
+                onClose();
               }}
               selectedKeyringId={selectedKeyringId}
               onSelectSrp={() => {
diff --git a/ui/components/ui/tabs/tab/tab.component.js b/ui/components/ui/tabs/tab/tab.component.js
index 118ff6f4dda2..13b5694453f1 100644
--- a/ui/components/ui/tabs/tab/tab.component.js
+++ b/ui/components/ui/tabs/tab/tab.component.js
@@ -27,6 +27,7 @@ const Tab = (props) => {
     // eslint-disable-next-line no-unused-vars
     children,
     textProps,
+    disabled,
     ...rest
   } = props;
 
@@ -57,6 +58,7 @@ const Tab = (props) => {
         color={TextColor.inherit}
         {...textProps}
         className={classnames(buttonClassName, textProps?.className)}
+        disabled={disabled}
       >
         {name}
       </Text>
@@ -78,6 +80,7 @@ Tab.propTypes = {
   children: PropTypes.node, // required, but we are not rendering it explicitly
   textProps: PropTypes.object, // props to spread to the Text component
   width: PropTypes.string,
+  disabled: PropTypes.bool,
 };
 
 Tab.defaultProps = {
diff --git a/ui/pages/permissions-connect/connect-page/connect-page.test.tsx b/ui/pages/permissions-connect/connect-page/connect-page.test.tsx
index 5df4baa941c9..08747a6ca64e 100644
--- a/ui/pages/permissions-connect/connect-page/connect-page.test.tsx
+++ b/ui/pages/permissions-connect/connect-page/connect-page.test.tsx
@@ -9,6 +9,18 @@ import mockState from '../../../../test/data/mock-state.json';
 import configureStore from '../../../store/store';
 import { ConnectPage, ConnectPageProps } from './connect-page';
 
+// Mock the CreateSolanaAccountModal component to avoid errors
+jest.mock(
+  '../../../components/multichain/create-solana-account-modal/create-solana-account-modal',
+  () => ({
+    CreateSolanaAccountModal: ({ onClose }: { onClose: () => void }) => (
+      <div data-testid="create-solana-account-modal">
+        <button onClick={onClose}>Close</button>
+      </div>
+    ),
+  }),
+);
+
 const mockTestDappUrl = 'https://test.dapp';
 
 const mockTargetSubjectMetadata = {
@@ -283,4 +295,173 @@ describe('ConnectPage', () => {
 
     expect(container).toMatchSnapshot();
   });
+
+  it('should render Solana account requested message when promptToCreateSolanaAccount is true', () => {
+    const { getByText } = render({
+      props: {
+        request: {
+          id: '1',
+          origin: mockTestDappUrl,
+          permissions: {
+            [Caip25EndowmentPermissionName]: {
+              caveats: [
+                {
+                  type: Caip25CaveatType,
+                  value: {
+                    requiredScopes: {},
+                    optionalScopes: {
+                      'eip155:1': {
+                        accounts: [],
+                      },
+                    },
+                    sessionProperties: {},
+                    isMultichainOrigin: false,
+                  },
+                },
+              ],
+            },
+          },
+          metadata: {
+            promptToCreateSolanaAccount: true,
+          },
+        },
+        permissionsRequestId: '1',
+        rejectPermissionsRequest: jest.fn(),
+        approveConnection: jest.fn(),
+        activeTabOrigin: mockTestDappUrl,
+        targetSubjectMetadata: mockTargetSubjectMetadata,
+      },
+    });
+
+    expect(
+      getByText('This site is requesting a Solana account.'),
+    ).toBeDefined();
+    expect(getByText('Create Solana account')).toBeDefined();
+  });
+
+  it('should not render Solana account message when promptToCreateSolanaAccount is false', () => {
+    const { queryByText } = render({
+      props: {
+        request: {
+          id: '1',
+          origin: mockTestDappUrl,
+          permissions: {
+            [Caip25EndowmentPermissionName]: {
+              caveats: [
+                {
+                  type: Caip25CaveatType,
+                  value: {
+                    requiredScopes: {},
+                    optionalScopes: {
+                      'eip155:1': {
+                        accounts: [],
+                      },
+                    },
+                    sessionProperties: {},
+                    isMultichainOrigin: false,
+                  },
+                },
+              ],
+            },
+          },
+          metadata: {
+            promptToCreateSolanaAccount: false,
+          },
+        },
+        permissionsRequestId: '1',
+        rejectPermissionsRequest: jest.fn(),
+        approveConnection: jest.fn(),
+        activeTabOrigin: mockTestDappUrl,
+        targetSubjectMetadata: mockTargetSubjectMetadata,
+      },
+    });
+
+    expect(
+      queryByText('A Solana account is required to connect to this site.'),
+    ).toBeNull();
+    expect(queryByText('Create Solana account')).toBeNull();
+  });
+
+  it('should open CreateSolanaAccountModal when create Solana account button is clicked', () => {
+    const { getByText, getByTestId } = render({
+      props: {
+        request: {
+          id: '1',
+          origin: mockTestDappUrl,
+          permissions: {
+            [Caip25EndowmentPermissionName]: {
+              caveats: [
+                {
+                  type: Caip25CaveatType,
+                  value: {
+                    requiredScopes: {},
+                    optionalScopes: {
+                      'eip155:1': {
+                        accounts: [],
+                      },
+                    },
+                    sessionProperties: {},
+                    isMultichainOrigin: false,
+                  },
+                },
+              ],
+            },
+          },
+          metadata: {
+            promptToCreateSolanaAccount: true,
+          },
+        },
+        permissionsRequestId: '1',
+        rejectPermissionsRequest: jest.fn(),
+        approveConnection: jest.fn(),
+        activeTabOrigin: mockTestDappUrl,
+        targetSubjectMetadata: mockTargetSubjectMetadata,
+      },
+    });
+
+    const createSolanaAccountButton = getByText('Create Solana account');
+    fireEvent.click(createSolanaAccountButton);
+
+    expect(getByTestId('create-solana-account-modal')).toBeDefined();
+  });
+
+  it('should not show select account message when promptToCreateSolanaAccount is true', () => {
+    const { queryByText } = render({
+      props: {
+        request: {
+          id: '1',
+          origin: mockTestDappUrl,
+          permissions: {
+            [Caip25EndowmentPermissionName]: {
+              caveats: [
+                {
+                  type: Caip25CaveatType,
+                  value: {
+                    requiredScopes: {},
+                    optionalScopes: {
+                      'eip155:1': {
+                        accounts: [],
+                      },
+                    },
+                    sessionProperties: {},
+                    isMultichainOrigin: false,
+                  },
+                },
+              ],
+            },
+          },
+          metadata: {
+            promptToCreateSolanaAccount: true,
+          },
+        },
+        permissionsRequestId: '1',
+        rejectPermissionsRequest: jest.fn(),
+        approveConnection: jest.fn(),
+        activeTabOrigin: mockTestDappUrl,
+        targetSubjectMetadata: mockTargetSubjectMetadata,
+      },
+    });
+
+    expect(queryByText('Select an account to connect')).toBeNull();
+  });
 });
diff --git a/ui/pages/permissions-connect/connect-page/connect-page.tsx b/ui/pages/permissions-connect/connect-page/connect-page.tsx
index f5213692c5aa..67f99ecddbd1 100644
--- a/ui/pages/permissions-connect/connect-page/connect-page.tsx
+++ b/ui/pages/permissions-connect/connect-page/connect-page.tsx
@@ -40,6 +40,7 @@ import {
   Display,
   FlexDirection,
   JustifyContent,
+  TextAlign,
   TextColor,
   TextVariant,
 } from '../../../helpers/constants/design-system';
@@ -71,6 +72,7 @@ import {
 } from '../../../../shared/lib/multichain/chain-agnostic-permission-utils/caip-chainids';
 import { getCaipAccountIdsFromCaip25CaveatValue } from '../../../../shared/lib/multichain/chain-agnostic-permission-utils/caip-accounts';
 import { isEqualCaseInsensitive } from '../../../../shared/modules/string-utils';
+import { CreateSolanaAccountModal } from '../../../components/multichain/create-solana-account-modal/create-solana-account-modal';
 import {
   PermissionsRequest,
   getRequestedCaip25CaveatValue,
@@ -81,6 +83,9 @@ export type ConnectPageRequest = {
   id: string;
   origin: string;
   permissions?: PermissionsRequest;
+  metadata?: {
+    promptToCreateSolanaAccount?: boolean;
+  };
 };
 
 export type ConnectPageProps = {
@@ -119,6 +124,9 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
     requestedCaip25CaveatValue,
   );
 
+  const promptToCreateSolanaAccount =
+    request.metadata?.promptToCreateSolanaAccount;
+
   const networkConfigurationsByCaipChainId = useSelector(
     getAllNetworkConfigurationsByCaipChainId,
   );
@@ -157,6 +165,8 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
   );
 
   const [showEditAccountsModal, setShowEditAccountsModal] = useState(false);
+  const [showCreateSolanaAccountModal, setShowCreateSolanaAccountModal] =
+    useState(false);
 
   // By default, if a non test network is the globally selected network. We will only show non test networks as default selected.
   const currentlySelectedNetwork = useSelector(getMultichainNetwork);
@@ -291,7 +301,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
     });
   });
 
-  const onConfirm = () => {
+  const solanaAccountExistsInWallet = useMemo(() => {
+    return allAccounts.some(({ caipAccountId }) => {
+      const { chain } = parseCaipAccountId(caipAccountId);
+      return chain.namespace === KnownCaipNamespace.Solana;
+    });
+  }, [allAccounts]);
+
+  const handleOpenAccountsModal = useCallback(() => {
+    setShowEditAccountsModal(true);
+    trackEvent({
+      category: MetaMetricsEventCategory.Navigation,
+      event: MetaMetricsEventName.ViewPermissionedAccounts,
+      properties: {
+        location:
+          'Connect view (accounts tab), Permissions toast, Permissions (dapp)',
+      },
+    });
+  }, [trackEvent]);
+
+  const handleOpenCreateSolanaAccountModal = useCallback(() => {
+    setShowCreateSolanaAccountModal(true);
+  }, []);
+
+  const handleCloseCreateSolanaAccountModal = useCallback(() => {
+    setShowCreateSolanaAccountModal(false);
+  }, []);
+
+  const handleCloseEditAccountsModal = useCallback(() => {
+    setShowEditAccountsModal(false);
+  }, []);
+
+  const handleCancelConnection = useCallback(() => {
+    rejectPermissionsRequest(permissionsRequestId);
+  }, [permissionsRequestId, rejectPermissionsRequest]);
+
+  const onConfirm = useCallback(() => {
     const _request = {
       ...request,
       permissions: {
@@ -304,22 +349,16 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
       },
     };
     approveConnection(_request);
-  };
+  }, [
+    request,
+    requestedCaip25CaveatValue,
+    selectedCaipAccountAddresses,
+    selectedChainIds,
+    approveConnection,
+  ]);
 
   const title = transformOriginToTitle(targetSubjectMetadata.origin);
 
-  const handleOpenAccountsModal = () => {
-    setShowEditAccountsModal(true);
-    trackEvent({
-      category: MetaMetricsEventCategory.Navigation,
-      event: MetaMetricsEventName.ViewPermissionedAccounts,
-      properties: {
-        location:
-          'Connect view (accounts tab), Permissions toast, Permissions (dapp)',
-      },
-    });
-  };
-
   return (
     <Page
       data-testid="connect-page"
@@ -426,22 +465,23 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                     selected={false}
                   />
                 ))}
-                {selectedAccounts.length === 0 && (
-                  <Box
-                    className="connect-page__accounts-empty"
-                    display={Display.Flex}
-                    justifyContent={JustifyContent.center}
-                    alignItems={AlignItems.center}
-                    borderRadius={BorderRadius.XL}
-                  >
-                    <ButtonLink
-                      onClick={() => handleOpenAccountsModal()}
-                      data-testid="edit"
+                {selectedAccounts.length === 0 &&
+                  !promptToCreateSolanaAccount && (
+                    <Box
+                      className="connect-page__accounts-empty"
+                      display={Display.Flex}
+                      justifyContent={JustifyContent.center}
+                      alignItems={AlignItems.center}
+                      borderRadius={BorderRadius.XL}
                     >
-                      {t('selectAccountToConnect')}
-                    </ButtonLink>
-                  </Box>
-                )}
+                      <ButtonLink
+                        onClick={handleOpenAccountsModal}
+                        data-testid="edit"
+                      >
+                        {t('selectAccountToConnect')}
+                      </ButtonLink>
+                    </Box>
+                  )}
               </Box>
               {selectedAccounts.length > 0 && (
                 <Box
@@ -450,18 +490,52 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   justifyContent={JustifyContent.center}
                 >
                   <ButtonLink
-                    onClick={() => handleOpenAccountsModal()}
+                    onClick={handleOpenAccountsModal}
                     data-testid="edit"
                   >
                     {t('editAccounts')}
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountExistsInWallet && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
+                  </Text>
+                  <Button
+                    variant={ButtonVariant.Secondary}
+                    width={BlockSize.Full}
+                    size={ButtonSize.Lg}
+                    onClick={handleOpenCreateSolanaAccountModal}
+                    data-testid="create-solana-account"
+                  >
+                    {t('createSolanaAccount')}
+                  </Button>
+                </Box>
+              )}
+              {showCreateSolanaAccountModal && (
+                <CreateSolanaAccountModal
+                  onClose={handleCloseCreateSolanaAccountModal}
+                />
+              )}
               {showEditAccountsModal && (
                 <EditAccountsModal
                   accounts={allAccounts}
                   defaultSelectedAccountAddresses={selectedCaipAccountAddresses}
-                  onClose={() => setShowEditAccountsModal(false)}
+                  onClose={handleCloseEditAccountsModal}
                   onSubmit={setSelectedCaipAccountAddresses}
                 />
               )}
@@ -472,6 +546,11 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
             tabKey="permissions"
             width={BlockSize.Full}
             data-testid="permissions-tab"
+            disabled={
+              promptToCreateSolanaAccount &&
+              !solanaAccountExistsInWallet &&
+              selectedAccounts.length === 0
+            }
           >
             <Box marginTop={4}>
               <SiteCell
@@ -501,7 +580,7 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
               variant={ButtonVariant.Secondary}
               size={ButtonSize.Lg}
               data-testid="cancel-btn"
-              onClick={() => rejectPermissionsRequest(permissionsRequestId)}
+              onClick={handleCancelConnection}
             >
               {t('cancel')}
             </Button>


Reviews:
user: login: jiexi
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-04-09T22:34:37Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T18:14:21Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T18:15:43Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T18:22:03Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T18:22:19Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T18:25:34Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T18:26:30Z
user: login: darkwing
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T18:28:54Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:08:48Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:19:12Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:23:05Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:25:18Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:25:25Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:25:28Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:25:42Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T19:28:34Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T19:29:47Z
user: login: jiexi
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-04-16T19:30:22Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:37:57Z
user: login: darkwing
body: Worked great!  Nice work!
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:44:11Z
user: login: jiexi
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-16T20:20:41Z

Review comments:
diff_hunk: @@ -142,6 +146,25 @@ async function walletCreateSessionHandler(
       }
     };
 
+    // if solana is a requested scope but not supported, we add a promptToCreateSolanaAccount flag to request
+    const isSolanaRequested =
+      isNamespaceInScopesObject(
+        requiredScopesWithSupportedMethodsAndNotifications,
+        KnownCaipNamespace.Solana,
+      ) ||
+      isNamespaceInScopesObject(
+        optionalScopesWithSupportedMethodsAndNotifications,
+        KnownCaipNamespace.Solana,
+      );
+
+    let promptToCreateSolanaAccount = false;
+    if (isSolanaRequested) {
+      const supportedSolanaAccounts = await hooks.getNonEvmAccountAddresses(
+        MultichainNetwork.Solana,
path: app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts
user: login: jiexi
body: assumption here is that all solana accounts across any reference will get returned from just requesting for mainnet. Probably fine for now, but just pointing that out
created_at: 2025-04-16T18:14:21Z
author_association: MEMBER
diff_hunk: @@ -57,6 +57,7 @@ export const CreateSolanaAccountModal = ({
                   onClose();
                 } else {
                   setShowCreateAccount(false);
+                  onClose();
                 }
               }}
path: ui/components/multichain/create-solana-account-modal/create-solana-account-modal.tsx
user: login: jiexi
body: nit. can we clean this up?
```
                if (!confirmed) {
                  setShowCreateAccount(false);
                } 
                onClose();
```
created_at: 2025-04-16T18:15:42Z
author_association: MEMBER
diff_hunk: @@ -291,6 +301,13 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
     });
   });
 
+  const solanaAccountCreated = useMemo(() => {
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: jiexi
body: ```suggestion
  const existsSolanaAccount = useMemo(() => {
```
created_at: 2025-04-16T18:22:03Z
author_association: MEMBER
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: jiexi
body: ```suggestion
              {promptToCreateSolanaAccount && !existsSolanaAccount && (
```
created_at: 2025-04-16T18:22:19Z
author_association: MEMBER
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: jiexi
body: won't `selectedAccounts.length` always be zero in this block of components?
created_at: 2025-04-16T18:25:34Z
author_association: MEMBER
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
+                  </Text>
+                  <Button
+                    variant={ButtonVariant.Secondary}
+                    width={BlockSize.Full}
+                    size={ButtonSize.Lg}
+                    onClick={() => setShowCreateSolanaAccountModal(true)}
+                    data-testid="create-solana-account"
+                  >
+                    {t('createSolanaAccount')}
+                  </Button>
+                </Box>
+              )}
+              {showCreateSolanaAccountModal && (
+                <CreateSolanaAccountModal
+                  onClose={() => {
+                    setShowCreateSolanaAccountModal(false);
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: jiexi
body: these really should use useCallback to prevent rerendering, but less a blocker and more a nit from my perspective
created_at: 2025-04-16T18:26:30Z
author_association: MEMBER
diff_hunk: @@ -291,6 +301,13 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
     });
   });
 
+  const solanaAccountCreated = useMemo(() => {
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: darkwing
body: `solanaAccountCreated` doesn't scream to me what it does.  Does this determine if a user has any Solana accounts?  Maybe `userHasSolanaAccount`?
created_at: 2025-04-16T18:28:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -142,6 +146,25 @@ async function walletCreateSessionHandler(
       }
     };
 
+    // if solana is a requested scope but not supported, we add a promptToCreateSolanaAccount flag to request
+    const isSolanaRequested =
+      isNamespaceInScopesObject(
+        requiredScopesWithSupportedMethodsAndNotifications,
+        KnownCaipNamespace.Solana,
+      ) ||
+      isNamespaceInScopesObject(
+        optionalScopesWithSupportedMethodsAndNotifications,
+        KnownCaipNamespace.Solana,
+      );
+
+    let promptToCreateSolanaAccount = false;
+    if (isSolanaRequested) {
+      const supportedSolanaAccounts = await hooks.getNonEvmAccountAddresses(
+        MultichainNetwork.Solana,
path: app/scripts/lib/rpc-method-middleware/handlers/wallet-createSession/handler.ts
user: login: adonesky1
body: > assumption here is that all solana accounts across any reference will get returned from just requesting for mainnet. Probably fine for now, but just pointing that out

yeah this assumption definitely holds though. There are no Solana accounts that only support Solana mainnet
created_at: 2025-04-16T19:08:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
+                  </Text>
+                  <Button
+                    variant={ButtonVariant.Secondary}
+                    width={BlockSize.Full}
+                    size={ButtonSize.Lg}
+                    onClick={() => setShowCreateSolanaAccountModal(true)}
+                    data-testid="create-solana-account"
+                  >
+                    {t('createSolanaAccount')}
+                  </Button>
+                </Box>
+              )}
+              {showCreateSolanaAccountModal && (
+                <CreateSolanaAccountModal
+                  onClose={() => {
+                    setShowCreateSolanaAccountModal(false);
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: adonesky1
body: No sure I follow how `useCallback` will help prevent unnecessary re-rendering in this context?
created_at: 2025-04-16T19:19:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: adonesky1
body: An EVM account can also be selected:
<img width="357" alt="Screenshot 2025-04-16 at 2 22 20 PM" src="https://github.com/user-attachments/assets/de77b9e4-dd10-4af1-81a2-8e1c4c78eaec" />

And then when **only** Solana is requested:
<img width="349" alt="Screenshot 2025-04-16 at 2 22 37 PM" src="https://github.com/user-attachments/assets/512850b6-37ba-4da8-aa71-ea147b78cbc5" />

created_at: 2025-04-16T19:23:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -291,6 +301,13 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
     });
   });
 
+  const solanaAccountCreated = useMemo(() => {
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: adonesky1
body: Updated to `solanaAccountExistsInWallet` here: https://github.com/MetaMask/metamask-extension/pull/31781/commits/b53b22ee44be827a8daa7bc2174448a45133b460
created_at: 2025-04-16T19:25:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: adonesky1
body: Updated to `solanaAccountExistsInWallet` here: https://github.com/MetaMask/metamask-extension/pull/31781/commits/b53b22ee44be827a8daa7bc2174448a45133b460
created_at: 2025-04-16T19:25:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -291,6 +301,13 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
     });
   });
 
+  const solanaAccountCreated = useMemo(() => {
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: adonesky1
body: Updated to `solanaAccountExistsInWallet` here: https://github.com/MetaMask/metamask-extension/pull/31781/commits/b53b22ee44be827a8daa7bc2174448a45133b460
created_at: 2025-04-16T19:25:28Z
author_association: CONTRIBUTOR
diff_hunk: @@ -57,6 +57,7 @@ export const CreateSolanaAccountModal = ({
                   onClose();
                 } else {
                   setShowCreateAccount(false);
+                  onClose();
                 }
               }}
path: ui/components/multichain/create-solana-account-modal/create-solana-account-modal.tsx
user: login: adonesky1
body: Done here: https://github.com/MetaMask/metamask-extension/pull/31781/commits/b53b22ee44be827a8daa7bc2174448a45133b460
created_at: 2025-04-16T19:25:42Z
author_association: CONTRIBUTOR
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: jiexi
body: ohhhh... my wires are crossed. For some reason i thought this prompt would only be set by the wallet_createSession handler if solana was the **only** scope selected
created_at: 2025-04-16T19:28:34Z
author_association: MEMBER
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
+                  </Text>
+                  <Button
+                    variant={ButtonVariant.Secondary}
+                    width={BlockSize.Full}
+                    size={ButtonSize.Lg}
+                    onClick={() => setShowCreateSolanaAccountModal(true)}
+                    data-testid="create-solana-account"
+                  >
+                    {t('createSolanaAccount')}
+                  </Button>
+                </Box>
+              )}
+              {showCreateSolanaAccountModal && (
+                <CreateSolanaAccountModal
+                  onClose={() => {
+                    setShowCreateSolanaAccountModal(false);
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: jiexi
body: if connect-page has to rerender, then `CreateSolanaAccountModal` will also check if it has to rerender, which it will because `() => {...}` is always going to result in a new reference anytime connect-page rerenders
created_at: 2025-04-16T19:29:47Z
author_association: MEMBER
diff_hunk: @@ -457,6 +475,42 @@ export const ConnectPage: React.FC<ConnectPageProps> = ({
                   </ButtonLink>
                 </Box>
               )}
+              {promptToCreateSolanaAccount && !solanaAccountCreated && (
+                <Box
+                  display={Display.Flex}
+                  flexDirection={FlexDirection.Column}
+                  justifyContent={JustifyContent.center}
+                  alignItems={AlignItems.center}
+                  marginTop={4}
+                  gap={2}
+                >
+                  <Text
+                    variant={TextVariant.bodyMd}
+                    color={TextColor.textAlternative}
+                    textAlign={TextAlign.Center}
+                  >
+                    {selectedAccounts.length === 0
+                      ? t('solanaAccountRequired')
+                      : t('solanaAccountRequested')}
+                  </Text>
+                  <Button
+                    variant={ButtonVariant.Secondary}
+                    width={BlockSize.Full}
+                    size={ButtonSize.Lg}
+                    onClick={() => setShowCreateSolanaAccountModal(true)}
+                    data-testid="create-solana-account"
+                  >
+                    {t('createSolanaAccount')}
+                  </Button>
+                </Box>
+              )}
+              {showCreateSolanaAccountModal && (
+                <CreateSolanaAccountModal
+                  onClose={() => {
+                    setShowCreateSolanaAccountModal(false);
path: ui/pages/permissions-connect/connect-page/connect-page.tsx
user: login: adonesky1
body: yeep! Memoized a bunch here: https://github.com/MetaMask/metamask-extension/pull/31781/commits/c74d054fc8dc342ce632ea29ae8570f03a7aa08d
created_at: 2025-04-16T19:37:57Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-09T15:53:19Z
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-09T17:39:53Z
body: <details><summary>Builds ready [0db3506]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds-test/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds-test-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds-test-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14362171233/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14362171233/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14362171233/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4751336/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/e7649481-b4d5-428c-9534-22aaa2d9be1f/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/e7649481-b4d5-428c-9534-22aaa2d9be1f/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/e7649481-b4d5-428c-9534-22aaa2d9be1f/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1206 ± 66 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1206</td><td align="right">1094</td><td align="right">1486</td><td align="right">66</td><td align="right">1238</td><td align="right">1331</td></tr><tr><td>load</td><td align="right">1057</td><td align="right">935</td><td align="right">1307</td><td align="right">61</td><td align="right">1196</td><td align="right">996</td></tr><tr><td>domContentLoaded</td><td align="right">1052</td><td align="right">929</td><td align="right">1303</td><td align="right">61</td><td align="right">1303</td><td align="right">994</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">29</td></tr><tr><td>firstPaint</td><td align="right">710</td><td align="right">150</td><td align="right">1225</td><td align="right">419</td><td align="right">222</td><td align="right">989</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">24</td><td align="right">3</td><td align="right">7</td><td align="right">8</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">13</td><td align="right">56</td><td align="right">7</td><td align="right">20</td><td align="right">36</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">40</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">0</td></tr><tr><td>loadScripts</td><td align="right">812</td><td align="right">691</td><td align="right">1056</td><td align="right">59</td><td align="right">839</td><td align="right">928</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">21</td><td align="right">3</td><td align="right">7</td><td align="right">9</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2158</td><td align="right">1724</td><td align="right">2614</td><td align="right">190</td><td align="right">2292</td><td align="right">2404</td></tr><tr><td>load</td><td align="right">1718</td><td align="right">1316</td><td align="right">2296</td><td align="right">175</td><td align="right">1791</td><td align="right">1972</td></tr><tr><td>domContentLoaded</td><td align="right">1711</td><td align="right">1312</td><td align="right">2283</td><td align="right">174</td><td align="right">1786</td><td align="right">1967</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">12</td><td align="right">59</td><td align="right">9</td><td align="right">14</td><td align="right">45</td></tr><tr><td>firstPaint</td><td align="right">160</td><td align="right">65</td><td align="right">318</td><td align="right">59</td><td align="right">261</td><td align="right">82</td></tr><tr><td>backgroundConnect</td><td align="right">30</td><td align="right">10</td><td align="right">282</td><td align="right">31</td><td align="right">33</td><td align="right">56</td></tr><tr><td>firstReactRender</td><td align="right">141</td><td align="right">53</td><td align="right">357</td><td align="right">102</td><td align="right">61</td><td align="right">92</td></tr><tr><td>getState</td><td align="right">27</td><td align="right">3</td><td align="right">333</td><td align="right">63</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">2</td><td align="right">3</td><td align="right">6</td></tr><tr><td>loadScripts</td><td align="right">1706</td><td align="right">1311</td><td align="right">2274</td><td align="right">171</td><td align="right">1784</td><td align="right">1944</td></tr><tr><td>setupStore</td><td align="right">22</td><td align="right">6</td><td align="right">283</td><td align="right">37</td><td align="right">7</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">1400</td><td align="right">1241</td><td align="right">1735</td><td align="right">98</td><td align="right">1457</td><td align="right">1604</td></tr><tr><td>load</td><td align="right">1253</td><td align="right">1086</td><td align="right">1582</td><td align="right">102</td><td align="right">1315</td><td align="right">1460</td></tr><tr><td>domContentLoaded</td><td align="right">1253</td><td align="right">1086</td><td align="right">1581</td><td align="right">102</td><td align="right">1314</td><td align="right">1459</td></tr><tr><td>domInteractive</td><td align="right">103</td><td align="right">36</td><td align="right">270</td><td align="right">36</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">20</td><td align="right">13</td><td align="right">57</td><td align="right">7</td><td align="right">21</td><td align="right">34</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">19</td><td align="right">73</td><td align="right">7</td><td align="right">24</td><td align="right">38</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">37</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">1235</td><td align="right">1072</td><td align="right">1566</td><td align="right">101</td><td align="right">1300</td><td align="right">1440</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">42</td><td align="right">5</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">1527</td><td align="right">1321</td><td align="right">1950</td><td align="right">126</td><td align="right">1599</td><td align="right">1768</td></tr><tr><td>load</td><td align="right">1317</td><td align="right">1155</td><td align="right">1716</td><td align="right">117</td><td align="right">1390</td><td align="right">1545</td></tr><tr><td>domContentLoaded</td><td align="right">1316</td><td align="right">1155</td><td align="right">1716</td><td align="right">117</td><td align="right">1390</td><td align="right">1545</td></tr><tr><td>domInteractive</td><td align="right">93</td><td align="right">44</td><td align="right">165</td><td align="right">18</td><td align="right">90</td><td align="right">97</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">20</td><td align="right">14</td><td align="right">40</td><td align="right">5</td><td align="right">21</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">28</td><td align="right">55</td><td align="right">4</td><td align="right">37</td><td align="right">44</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</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">1298</td><td align="right">1140</td><td align="right">1700</td><td align="right">117</td><td align="right">1372</td><td align="right">1526</td></tr><tr><td>setupStore</td><td align="right">10</td><td align="right">5</td><td align="right">300</td><td align="right">29</td><td align="right">7</td><td align="right">9</td></tr></tbody></table></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-04-09T18:39:09Z
body: <details><summary>Builds ready [dc4693a]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds-test/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds-test-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds-test-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14363222950/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14363222950/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14363222950/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4751951/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/41fa647d-5690-4974-aa10-5951441b573c/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/41fa647d-5690-4974-aa10-5951441b573c/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/41fa647d-5690-4974-aa10-5951441b573c/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1213 ± 48 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">1213</td><td align="right">1121</td><td align="right">1346</td><td align="right">48</td><td align="right">1246</td><td align="right">1314</td></tr><tr><td>load</td><td align="right">1063</td><td align="right">971</td><td align="right">1192</td><td align="right">47</td><td align="right">1113</td><td align="right">991</td></tr><tr><td>domContentLoaded</td><td align="right">1057</td><td align="right">964</td><td align="right">1188</td><td align="right">47</td><td align="right">1120</td><td align="right">989</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">59</td><td align="right">7</td><td align="right">16</td><td align="right">33</td></tr><tr><td>firstPaint</td><td align="right">712</td><td align="right">80</td><td align="right">1174</td><td align="right">422</td><td align="right">258</td><td align="right">983</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">28</td><td align="right">4</td><td align="right">7</td><td align="right">8</td></tr><tr><td>firstReactRender</td><td align="right">19</td><td align="right">15</td><td align="right">38</td><td align="right">4</td><td align="right">20</td><td align="right">26</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">72</td><td align="right">9</td><td align="right">7</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">816</td><td align="right">729</td><td align="right">932</td><td align="right">44</td><td align="right">843</td><td align="right">889</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">17</td><td align="right">2</td><td align="right">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">2113</td><td align="right">1602</td><td align="right">2595</td><td align="right">202</td><td align="right">2255</td><td align="right">2406</td></tr><tr><td>load</td><td align="right">1685</td><td align="right">1320</td><td align="right">2248</td><td align="right">178</td><td align="right">1772</td><td align="right">1989</td></tr><tr><td>domContentLoaded</td><td align="right">1676</td><td align="right">1316</td><td align="right">2237</td><td align="right">177</td><td align="right">1757</td><td align="right">1968</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">12</td><td align="right">69</td><td align="right">12</td><td align="right">13</td><td align="right">53</td></tr><tr><td>firstPaint</td><td align="right">162</td><td align="right">65</td><td align="right">302</td><td align="right">54</td><td align="right">233</td><td align="right">79</td></tr><tr><td>backgroundConnect</td><td align="right">34</td><td align="right">11</td><td align="right">295</td><td align="right">45</td><td align="right">29</td><td align="right">59</td></tr><tr><td>firstReactRender</td><td align="right">153</td><td align="right">51</td><td align="right">356</td><td align="right">112</td><td align="right">61</td><td align="right">92</td></tr><tr><td>getState</td><td align="right">20</td><td align="right">3</td><td align="right">333</td><td align="right">41</td><td align="right">7</td><td align="right">9</td></tr><tr><td>initialActions</td><td align="right">2</td><td align="right">1</td><td align="right">7</td><td align="right">1</td><td align="right">3</td><td align="right">4</td></tr><tr><td>loadScripts</td><td align="right">1671</td><td align="right">1315</td><td align="right">2206</td><td align="right">172</td><td align="right">1755</td><td align="right">1938</td></tr><tr><td>setupStore</td><td align="right">18</td><td align="right">6</td><td align="right">244</td><td align="right">31</td><td align="right">7</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">1433</td><td align="right">1225</td><td align="right">1829</td><td align="right">113</td><td align="right">1509</td><td align="right">1647</td></tr><tr><td>load</td><td align="right">1280</td><td align="right">1094</td><td align="right">1661</td><td align="right">113</td><td align="right">1361</td><td align="right">1481</td></tr><tr><td>domContentLoaded</td><td align="right">1280</td><td align="right">1094</td><td align="right">1661</td><td align="right">113</td><td align="right">1360</td><td align="right">1480</td></tr><tr><td>domInteractive</td><td align="right">107</td><td align="right">37</td><td align="right">297</td><td align="right">31</td><td align="right">89</td><td align="right">97</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">52</td><td align="right">8</td><td align="right">22</td><td align="right">43</td></tr><tr><td>firstReactRender</td><td align="right">25</td><td align="right">20</td><td align="right">62</td><td align="right">7</td><td align="right">25</td><td align="right">31</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">37</td><td align="right">5</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">1260</td><td align="right">1078</td><td align="right">1641</td><td align="right">113</td><td align="right">1346</td><td align="right">1454</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">35</td><td align="right">5</td><td align="right">6</td><td align="right">8</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1555</td><td align="right">1366</td><td align="right">2043</td><td align="right">141</td><td align="right">1674</td><td align="right">1790</td></tr><tr><td>load</td><td align="right">1335</td><td align="right">1175</td><td align="right">1741</td><td align="right">122</td><td align="right">1421</td><td align="right">1560</td></tr><tr><td>domContentLoaded</td><td align="right">1335</td><td align="right">1174</td><td align="right">1740</td><td align="right">121</td><td align="right">1421</td><td align="right">1560</td></tr><tr><td>domInteractive</td><td align="right">98</td><td align="right">59</td><td align="right">323</td><td align="right">33</td><td align="right">90</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">23</td><td align="right">16</td><td align="right">81</td><td align="right">9</td><td align="right">23</td><td align="right">42</td></tr><tr><td>firstReactRender</td><td align="right">36</td><td align="right">28</td><td align="right">57</td><td align="right">5</td><td align="right">38</td><td align="right">44</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">4</td><td align="right">40</td><td align="right">7</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">1</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1315</td><td align="right">1148</td><td align="right">1724</td><td align="right">121</td><td align="right">1405</td><td align="right">1540</td></tr><tr><td>setupStore</td><td align="right">14</td><td align="right">5</td><td align="right">307</td><td align="right">41</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-09T21:57:35Z
body: <details><summary>Builds ready [a011818]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds-test/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds-test-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds-test-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14367239026/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14367239026/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14367239026/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4753772/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/3c22052e-08bc-4c52-9f4c-893e19977be2/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/3c22052e-08bc-4c52-9f4c-893e19977be2/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/3c22052e-08bc-4c52-9f4c-893e19977be2/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1214 ± 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">1214</td><td align="right">1098</td><td align="right">1348</td><td align="right">53</td><td align="right">1249</td><td align="right">1311</td></tr><tr><td>load</td><td align="right">1058</td><td align="right">927</td><td align="right">1168</td><td align="right">51</td><td align="right">1140</td><td align="right">995</td></tr><tr><td>domContentLoaded</td><td align="right">1052</td><td align="right">921</td><td align="right">1162</td><td align="right">51</td><td align="right">1152</td><td align="right">989</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">29</td></tr><tr><td>firstPaint</td><td align="right">720</td><td align="right">97</td><td align="right">1167</td><td align="right">414</td><td align="right">254</td><td align="right">982</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">37</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">14</td><td align="right">60</td><td align="right">8</td><td align="right">21</td><td align="right">44</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">41</td><td align="right">8</td><td align="right">6</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">0</td></tr><tr><td>loadScripts</td><td align="right">810</td><td align="right">692</td><td align="right">925</td><td align="right">51</td><td align="right">842</td><td align="right">899</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">22</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">2194</td><td align="right">1801</td><td align="right">2699</td><td align="right">208</td><td align="right">2322</td><td align="right">2557</td></tr><tr><td>load</td><td align="right">1774</td><td align="right">1396</td><td align="right">2350</td><td align="right">212</td><td align="right">1858</td><td align="right">2254</td></tr><tr><td>domContentLoaded</td><td align="right">1765</td><td align="right">1392</td><td align="right">2340</td><td align="right">210</td><td align="right">1851</td><td align="right">2248</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">12</td><td align="right">79</td><td align="right">14</td><td align="right">14</td><td align="right">53</td></tr><tr><td>firstPaint</td><td align="right">181</td><td align="right">66</td><td align="right">423</td><td align="right">74</td><td align="right">263</td><td align="right">89</td></tr><tr><td>backgroundConnect</td><td align="right">29</td><td align="right">11</td><td align="right">233</td><td align="right">30</td><td align="right">30</td><td align="right">56</td></tr><tr><td>firstReactRender</td><td align="right">137</td><td align="right">53</td><td align="right">353</td><td align="right">104</td><td align="right">61</td><td align="right">90</td></tr><tr><td>getState</td><td align="right">17</td><td align="right">4</td><td align="right">292</td><td align="right">40</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">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">1757</td><td align="right">1390</td><td align="right">2310</td><td align="right">207</td><td align="right">1837</td><td align="right">2246</td></tr><tr><td>setupStore</td><td align="right">29</td><td align="right">6</td><td align="right">313</td><td align="right">59</td><td align="right">6</td><td align="right">8</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1361</td><td align="right">1180</td><td align="right">2021</td><td align="right">138</td><td align="right">1417</td><td align="right">1646</td></tr><tr><td>load</td><td align="right">1219</td><td align="right">1039</td><td align="right">1838</td><td align="right">139</td><td align="right">1280</td><td align="right">1524</td></tr><tr><td>domContentLoaded</td><td align="right">1218</td><td align="right">1038</td><td align="right">1838</td><td align="right">139</td><td align="right">1280</td><td align="right">1524</td></tr><tr><td>domInteractive</td><td align="right">98</td><td align="right">39</td><td align="right">162</td><td align="right">22</td><td align="right">90</td><td align="right">99</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">19</td><td align="right">13</td><td align="right">67</td><td align="right">7</td><td align="right">19</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">19</td><td align="right">60</td><td align="right">8</td><td align="right">23</td><td align="right">49</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">36</td><td align="right">5</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">1202</td><td align="right">1020</td><td align="right">1810</td><td align="right">138</td><td align="right">1261</td><td align="right">1502</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">41</td><td align="right">6</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">1632</td><td align="right">1421</td><td align="right">2142</td><td align="right">161</td><td align="right">1699</td><td align="right">1986</td></tr><tr><td>load</td><td align="right">1399</td><td align="right">1207</td><td align="right">1842</td><td align="right">136</td><td align="right">1471</td><td align="right">1721</td></tr><tr><td>domContentLoaded</td><td align="right">1399</td><td align="right">1207</td><td align="right">1841</td><td align="right">136</td><td align="right">1471</td><td align="right">1721</td></tr><tr><td>domInteractive</td><td align="right">99</td><td align="right">61</td><td align="right">186</td><td align="right">25</td><td align="right">90</td><td align="right">97</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">23</td><td align="right">16</td><td align="right">67</td><td align="right">7</td><td align="right">25</td><td align="right">32</td></tr><tr><td>firstReactRender</td><td align="right">36</td><td align="right">31</td><td align="right">56</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">4</td><td align="right">47</td><td align="right">6</td><td align="right">7</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">1379</td><td align="right">1189</td><td align="right">1824</td><td align="right">136</td><td align="right">1443</td><td align="right">1698</td></tr><tr><td>setupStore</td><td align="right">16</td><td align="right">5</td><td align="right">364</td><td align="right">47</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-10T16:16:03Z
body: <details><summary>Builds ready [6c3d6b5]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds-test/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds-test-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds-test-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14384082029/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14384082029/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14384082029/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4759598/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/5e2e7539-523f-4123-b343-4770cc4b4b08/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/5e2e7539-523f-4123-b343-4770cc4b4b08/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/5e2e7539-523f-4123-b343-4770cc4b4b08/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1243 ± 66 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1243</td><td align="right">1122</td><td align="right">1389</td><td align="right">66</td><td align="right">1286</td><td align="right">1372</td></tr><tr><td>load</td><td align="right">1087</td><td align="right">956</td><td align="right">1218</td><td align="right">60</td><td align="right">1158</td><td align="right">988</td></tr><tr><td>domContentLoaded</td><td align="right">1081</td><td align="right">953</td><td align="right">1214</td><td align="right">60</td><td align="right">1154</td><td align="right">986</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">13</td><td align="right">59</td><td align="right">7</td><td align="right">17</td><td align="right">31</td></tr><tr><td>firstPaint</td><td align="right">691</td><td align="right">134</td><td align="right">1202</td><td align="right">442</td><td align="right">221</td><td align="right">274</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">9</td></tr><tr><td>firstReactRender</td><td align="right">19</td><td align="right">14</td><td align="right">40</td><td align="right">4</td><td align="right">20</td><td align="right">27</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">34</td><td align="right">7</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">836</td><td align="right">720</td><td align="right">959</td><td align="right">57</td><td align="right">875</td><td align="right">934</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">26</td><td align="right">3</td><td align="right">7</td><td align="right">9</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2195</td><td align="right">1659</td><td align="right">2705</td><td align="right">183</td><td align="right">2332</td><td align="right">2452</td></tr><tr><td>load</td><td align="right">1741</td><td align="right">1313</td><td align="right">2245</td><td align="right">167</td><td align="right">1800</td><td align="right">2122</td></tr><tr><td>domContentLoaded</td><td align="right">1734</td><td align="right">1307</td><td align="right">2241</td><td align="right">165</td><td align="right">1791</td><td align="right">2076</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">12</td><td align="right">59</td><td align="right">11</td><td align="right">14</td><td align="right">52</td></tr><tr><td>firstPaint</td><td align="right">159</td><td align="right">63</td><td align="right">551</td><td align="right">71</td><td align="right">252</td><td align="right">91</td></tr><tr><td>backgroundConnect</td><td align="right">28</td><td align="right">9</td><td align="right">245</td><td align="right">26</td><td align="right">34</td><td align="right">81</td></tr><tr><td>firstReactRender</td><td align="right">174</td><td align="right">54</td><td align="right">355</td><td align="right">106</td><td align="right">58</td><td align="right">91</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">4</td><td align="right">52</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">7</td><td align="right">1</td><td align="right">4</td><td align="right">6</td></tr><tr><td>loadScripts</td><td align="right">1726</td><td align="right">1305</td><td align="right">2239</td><td align="right">158</td><td align="right">1789</td><td align="right">2021</td></tr><tr><td>setupStore</td><td align="right">19</td><td align="right">6</td><td align="right">314</td><td align="right">31</td><td align="right">42</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">1376</td><td align="right">1201</td><td align="right">1716</td><td align="right">98</td><td align="right">1448</td><td align="right">1560</td></tr><tr><td>load</td><td align="right">1228</td><td align="right">1053</td><td align="right">1541</td><td align="right">98</td><td align="right">1294</td><td align="right">1410</td></tr><tr><td>domContentLoaded</td><td align="right">1227</td><td align="right">1053</td><td align="right">1541</td><td align="right">98</td><td align="right">1293</td><td align="right">1410</td></tr><tr><td>domInteractive</td><td align="right">102</td><td align="right">40</td><td align="right">296</td><td align="right">35</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">21</td><td align="right">12</td><td align="right">94</td><td align="right">11</td><td align="right">21</td><td align="right">48</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">19</td><td align="right">64</td><td align="right">8</td><td align="right">23</td><td align="right">49</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">37</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">1208</td><td align="right">1037</td><td align="right">1527</td><td align="right">99</td><td align="right">1278</td><td align="right">1394</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">197</td><td align="right">19</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">1677</td><td align="right">1460</td><td align="right">2205</td><td align="right">142</td><td align="right">1746</td><td align="right">1968</td></tr><tr><td>load</td><td align="right">1440</td><td align="right">1261</td><td align="right">2019</td><td align="right">136</td><td align="right">1493</td><td align="right">1735</td></tr><tr><td>domContentLoaded</td><td align="right">1439</td><td align="right">1261</td><td align="right">2018</td><td align="right">136</td><td align="right">1493</td><td align="right">1735</td></tr><tr><td>domInteractive</td><td align="right">103</td><td align="right">44</td><td align="right">480</td><td align="right">48</td><td align="right">88</td><td align="right">97</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">16</td><td align="right">56</td><td align="right">7</td><td align="right">26</td><td align="right">46</td></tr><tr><td>firstReactRender</td><td align="right">39</td><td align="right">31</td><td align="right">64</td><td align="right">6</td><td align="right">42</td><td align="right">50</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">5</td><td align="right">72</td><td align="right">9</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">1418</td><td align="right">1242</td><td align="right">2003</td><td align="right">137</td><td align="right">1473</td><td align="right">1717</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">5</td><td align="right">42</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-16T16:12:11Z
body: <!-- METAMASK-CODEOWNERS-BOT -->
✨ Files requiring CODEOWNER review ✨
---
🖥️ @MetaMask/wallet-ux
- `ui/components/multichain/create-solana-account-modal/create-solana-account-modal.tsx`


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-04-16T16:46:54Z
body: <details><summary>Builds ready [fd74386]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14497371520/builds-beta/metamask-beta-chrome-12.15.2-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds-test/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds-test-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds-test-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14497371520/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14497371520/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14497371520/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4784822/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/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/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/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/c129fcfb-3bc6-4d09-9e07-25d41b9e6d19/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1208 ± 59 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">1208</td><td align="right">1086</td><td align="right">1364</td><td align="right">59</td><td align="right">1252</td><td align="right">1304</td></tr><tr><td>load</td><td align="right">1042</td><td align="right">916</td><td align="right">1195</td><td align="right">54</td><td align="right">1077</td><td align="right">1128</td></tr><tr><td>domContentLoaded</td><td align="right">1035</td><td align="right">909</td><td align="right">1188</td><td align="right">55</td><td align="right">1070</td><td align="right">1123</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">68</td><td align="right">7</td><td align="right">16</td><td align="right">29</td></tr><tr><td>firstPaint</td><td align="right">700</td><td align="right">80</td><td align="right">1202</td><td align="right">419</td><td align="right">1068</td><td align="right">1127</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">123</td><td align="right">12</td><td align="right">7</td><td align="right">11</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">14</td><td align="right">50</td><td align="right">5</td><td align="right">21</td><td align="right">33</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">5</td><td align="right">34</td><td align="right">7</td><td align="right">17</td><td align="right">26</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">797</td><td align="right">673</td><td align="right">951</td><td align="right">54</td><td align="right">833</td><td align="right">886</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">15</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">2048</td><td align="right">1700</td><td align="right">2535</td><td align="right">182</td><td align="right">2164</td><td align="right">2310</td></tr><tr><td>load</td><td align="right">1584</td><td align="right">1249</td><td align="right">1961</td><td align="right">144</td><td align="right">1707</td><td align="right">1780</td></tr><tr><td>domContentLoaded</td><td align="right">1577</td><td align="right">1241</td><td align="right">1950</td><td align="right">143</td><td align="right">1699</td><td align="right">1772</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">11</td><td align="right">69</td><td align="right">14</td><td align="right">13</td><td align="right">60</td></tr><tr><td>firstPaint</td><td align="right">183</td><td align="right">66</td><td align="right">354</td><td align="right">64</td><td align="right">222</td><td align="right">307</td></tr><tr><td>backgroundConnect</td><td align="right">27</td><td align="right">9</td><td align="right">430</td><td align="right">43</td><td align="right">25</td><td align="right">58</td></tr><tr><td>firstReactRender</td><td align="right">181</td><td align="right">54</td><td align="right">384</td><td align="right">121</td><td align="right">334</td><td align="right">357</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">4</td><td align="right">30</td><td align="right">5</td><td align="right">13</td><td align="right">22</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">5</td><td align="right">1</td><td align="right">3</td><td align="right">4</td></tr><tr><td>loadScripts</td><td align="right">1573</td><td align="right">1237</td><td align="right">1928</td><td align="right">142</td><td align="right">1696</td><td align="right">1769</td></tr><tr><td>setupStore</td><td align="right">25</td><td align="right">6</td><td align="right">290</td><td align="right">51</td><td align="right">19</td><td align="right">31</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1383</td><td align="right">1203</td><td align="right">1806</td><td align="right">110</td><td align="right">1446</td><td align="right">1602</td></tr><tr><td>load</td><td align="right">1233</td><td align="right">1057</td><td align="right">1650</td><td align="right">114</td><td align="right">1305</td><td align="right">1437</td></tr><tr><td>domContentLoaded</td><td align="right">1233</td><td align="right">1057</td><td align="right">1650</td><td align="right">114</td><td align="right">1305</td><td align="right">1437</td></tr><tr><td>domInteractive</td><td align="right">107</td><td align="right">35</td><td align="right">293</td><td align="right">35</td><td align="right">122</td><td align="right">170</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">21</td><td align="right">13</td><td align="right">81</td><td align="right">9</td><td align="right">22</td><td align="right">38</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">19</td><td align="right">51</td><td align="right">4</td><td align="right">25</td><td align="right">32</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">15</td><td align="right">2</td><td align="right">8</td><td align="right">10</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1214</td><td align="right">1043</td><td align="right">1628</td><td align="right">112</td><td align="right">1290</td><td align="right">1411</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">201</td><td align="right">20</td><td align="right">6</td><td align="right">9</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1508</td><td align="right">1341</td><td align="right">1836</td><td align="right">105</td><td align="right">1576</td><td align="right">1704</td></tr><tr><td>load</td><td align="right">1286</td><td align="right">1140</td><td align="right">1566</td><td align="right">89</td><td align="right">1341</td><td align="right">1459</td></tr><tr><td>domContentLoaded</td><td align="right">1286</td><td align="right">1140</td><td align="right">1565</td><td align="right">89</td><td align="right">1341</td><td align="right">1458</td></tr><tr><td>domInteractive</td><td align="right">82</td><td align="right">45</td><td align="right">189</td><td align="right">23</td><td align="right">94</td><td align="right">126</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">15</td><td align="right">113</td><td align="right">11</td><td align="right">22</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">29</td><td align="right">48</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">35</td><td align="right">5</td><td align="right">9</td><td align="right">17</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">1267</td><td align="right">1126</td><td align="right">1546</td><td align="right">88</td><td align="right">1325</td><td align="right">1445</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">5</td><td align="right">75</td><td align="right">9</td><td align="right">8</td><td align="right">22</td></tr></tbody></table></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-04-16T18:07:00Z
body: <details><summary>Builds ready [a306f37]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14498357889/builds-beta/metamask-beta-chrome-12.15.2-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds-test/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds-test-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds-test-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14498357889/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14498357889/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14498357889/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4785376/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/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/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/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/e3f7cf7c-2afe-4a4e-b158-0a40ec169ce6/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1224 ± 77 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">1224</td><td align="right">1090</td><td align="right">1446</td><td align="right">77</td><td align="right">1278</td><td align="right">1370</td></tr><tr><td>load</td><td align="right">1059</td><td align="right">959</td><td align="right">1265</td><td align="right">70</td><td align="right">1104</td><td align="right">1203</td></tr><tr><td>domContentLoaded</td><td align="right">1052</td><td align="right">956</td><td align="right">1259</td><td align="right">69</td><td align="right">1099</td><td align="right">1196</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">63</td><td align="right">6</td><td align="right">16</td><td align="right">27</td></tr><tr><td>firstPaint</td><td align="right">758</td><td align="right">71</td><td align="right">1276</td><td align="right">409</td><td align="right">1061</td><td align="right">1200</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">8</td><td align="right">14</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">16</td><td align="right">39</td><td align="right">6</td><td align="right">21</td><td align="right">35</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">5</td><td align="right">46</td><td align="right">10</td><td align="right">22</td><td align="right">35</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">814</td><td align="right">712</td><td align="right">1013</td><td align="right">67</td><td align="right">859</td><td align="right">951</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">16</td><td align="right">2</td><td align="right">8</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2137</td><td align="right">1805</td><td align="right">2604</td><td align="right">168</td><td align="right">2266</td><td align="right">2391</td></tr><tr><td>load</td><td align="right">1647</td><td align="right">1395</td><td align="right">2056</td><td align="right">127</td><td align="right">1731</td><td align="right">1840</td></tr><tr><td>domContentLoaded</td><td align="right">1641</td><td align="right">1392</td><td align="right">2045</td><td align="right">126</td><td align="right">1721</td><td align="right">1833</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">11</td><td align="right">61</td><td align="right">12</td><td align="right">13</td><td align="right">56</td></tr><tr><td>firstPaint</td><td align="right">208</td><td align="right">71</td><td align="right">598</td><td align="right">80</td><td align="right">245</td><td align="right">362</td></tr><tr><td>backgroundConnect</td><td align="right">26</td><td align="right">9</td><td align="right">71</td><td align="right">13</td><td align="right">29</td><td align="right">59</td></tr><tr><td>firstReactRender</td><td align="right">224</td><td align="right">57</td><td align="right">413</td><td align="right">118</td><td align="right">331</td><td align="right">360</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">4</td><td align="right">41</td><td align="right">6</td><td align="right">14</td><td align="right">23</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">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1636</td><td align="right">1390</td><td align="right">2022</td><td align="right">125</td><td align="right">1718</td><td align="right">1828</td></tr><tr><td>setupStore</td><td align="right">24</td><td align="right">7</td><td align="right">304</td><td align="right">40</td><td align="right">21</td><td align="right">32</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">1210</td><td align="right">1743</td><td align="right">106</td><td align="right">1472</td><td align="right">1596</td></tr><tr><td>load</td><td align="right">1245</td><td align="right">1053</td><td align="right">1514</td><td align="right">105</td><td align="right">1327</td><td align="right">1436</td></tr><tr><td>domContentLoaded</td><td align="right">1244</td><td align="right">1053</td><td align="right">1514</td><td align="right">105</td><td align="right">1327</td><td align="right">1436</td></tr><tr><td>domInteractive</td><td align="right">109</td><td align="right">37</td><td align="right">239</td><td align="right">36</td><td align="right">120</td><td align="right">177</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">27</td><td align="right">15</td><td align="right">120</td><td align="right">21</td><td align="right">23</td><td align="right">84</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">20</td><td align="right">46</td><td align="right">4</td><td align="right">26</td><td align="right">32</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">13</td><td align="right">1</td><td align="right">8</td><td align="right">10</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1220</td><td align="right">1035</td><td align="right">1497</td><td align="right">106</td><td align="right">1310</td><td align="right">1415</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">40</td><td align="right">4</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">1554</td><td align="right">1377</td><td align="right">2122</td><td align="right">128</td><td align="right">1617</td><td align="right">1839</td></tr><tr><td>load</td><td align="right">1327</td><td align="right">1166</td><td align="right">1879</td><td align="right">111</td><td align="right">1390</td><td align="right">1562</td></tr><tr><td>domContentLoaded</td><td align="right">1327</td><td align="right">1166</td><td align="right">1878</td><td align="right">111</td><td align="right">1390</td><td align="right">1561</td></tr><tr><td>domInteractive</td><td align="right">84</td><td align="right">40</td><td align="right">164</td><td align="right">25</td><td align="right">93</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">23</td><td align="right">15</td><td align="right">54</td><td align="right">7</td><td align="right">24</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">37</td><td align="right">29</td><td align="right">56</td><td align="right">6</td><td align="right">41</td><td align="right">47</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">4</td><td align="right">39</td><td align="right">8</td><td align="right">10</td><td align="right">30</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">1305</td><td align="right">1152</td><td align="right">1856</td><td align="right">111</td><td align="right">1361</td><td align="right">1548</td></tr><tr><td>setupStore</td><td align="right">11</td><td align="right">5</td><td align="right">324</td><td align="right">32</td><td align="right">8</td><td align="right">12</td></tr></tbody></table></details>


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

<details><summary>UI Startup Metrics (1240 ± 67 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">1240</td><td align="right">1104</td><td align="right">1428</td><td align="right">67</td><td align="right">1286</td><td align="right">1374</td></tr><tr><td>load</td><td align="right">1071</td><td align="right">964</td><td align="right">1242</td><td align="right">64</td><td align="right">1111</td><td align="right">1201</td></tr><tr><td>domContentLoaded</td><td align="right">1065</td><td align="right">960</td><td align="right">1231</td><td align="right">63</td><td align="right">1100</td><td align="right">1195</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">14</td><td align="right">63</td><td align="right">8</td><td align="right">16</td><td align="right">33</td></tr><tr><td>firstPaint</td><td align="right">804</td><td align="right">140</td><td align="right">1239</td><td align="right">405</td><td align="right">1093</td><td align="right">1194</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">24</td><td align="right">3</td><td align="right">8</td><td align="right">14</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">16</td><td align="right">40</td><td align="right">5</td><td align="right">21</td><td align="right">34</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">5</td><td align="right">36</td><td align="right">8</td><td align="right">19</td><td align="right">33</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">4</td><td align="right">1</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">826</td><td align="right">723</td><td align="right">995</td><td align="right">62</td><td align="right">864</td><td align="right">955</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">14</td><td align="right">2</td><td align="right">8</td><td align="right">11</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2233</td><td align="right">1778</td><td align="right">2699</td><td align="right">169</td><td align="right">2348</td><td align="right">2517</td></tr><tr><td>load</td><td align="right">1729</td><td align="right">1387</td><td align="right">2178</td><td align="right">143</td><td align="right">1829</td><td align="right">1996</td></tr><tr><td>domContentLoaded</td><td align="right">1722</td><td align="right">1383</td><td align="right">2173</td><td align="right">142</td><td align="right">1823</td><td align="right">1984</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">12</td><td align="right">72</td><td align="right">12</td><td align="right">14</td><td align="right">52</td></tr><tr><td>firstPaint</td><td align="right">191</td><td align="right">69</td><td align="right">464</td><td align="right">75</td><td align="right">241</td><td align="right">352</td></tr><tr><td>backgroundConnect</td><td align="right">31</td><td align="right">12</td><td align="right">387</td><td align="right">39</td><td align="right">31</td><td align="right">67</td></tr><tr><td>firstReactRender</td><td align="right">234</td><td align="right">55</td><td align="right">432</td><td align="right">118</td><td align="right">338</td><td align="right">366</td></tr><tr><td>getState</td><td align="right">16</td><td align="right">3</td><td align="right">286</td><td align="right">28</td><td align="right">17</td><td align="right">32</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">6</td></tr><tr><td>loadScripts</td><td align="right">1717</td><td align="right">1381</td><td align="right">2171</td><td align="right">140</td><td align="right">1820</td><td align="right">1961</td></tr><tr><td>setupStore</td><td align="right">28</td><td align="right">6</td><td align="right">314</td><td align="right">47</td><td align="right">26</td><td align="right">49</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1370</td><td align="right">1201</td><td align="right">1670</td><td align="right">94</td><td align="right">1429</td><td align="right">1551</td></tr><tr><td>load</td><td align="right">1221</td><td align="right">1039</td><td align="right">1500</td><td align="right">101</td><td align="right">1300</td><td align="right">1410</td></tr><tr><td>domContentLoaded</td><td align="right">1221</td><td align="right">1039</td><td align="right">1500</td><td align="right">101</td><td align="right">1300</td><td align="right">1410</td></tr><tr><td>domInteractive</td><td align="right">106</td><td align="right">37</td><td align="right">312</td><td align="right">39</td><td align="right">119</td><td align="right">187</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">19</td><td align="right">13</td><td align="right">91</td><td align="right">9</td><td align="right">20</td><td align="right">26</td></tr><tr><td>firstReactRender</td><td align="right">22</td><td align="right">19</td><td align="right">39</td><td align="right">3</td><td align="right">23</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">37</td><td align="right">3</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">1203</td><td align="right">1024</td><td align="right">1478</td><td align="right">101</td><td align="right">1283</td><td align="right">1388</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">219</td><td align="right">21</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">1535</td><td align="right">1345</td><td align="right">2091</td><td align="right">156</td><td align="right">1593</td><td align="right">1860</td></tr><tr><td>load</td><td align="right">1301</td><td align="right">1145</td><td align="right">1820</td><td align="right">129</td><td align="right">1361</td><td align="right">1567</td></tr><tr><td>domContentLoaded</td><td align="right">1301</td><td align="right">1144</td><td align="right">1820</td><td align="right">129</td><td align="right">1360</td><td align="right">1566</td></tr><tr><td>domInteractive</td><td align="right">82</td><td align="right">34</td><td align="right">156</td><td align="right">22</td><td align="right">88</td><td align="right">137</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">25</td><td align="right">15</td><td align="right">81</td><td align="right">11</td><td align="right">26</td><td align="right">50</td></tr><tr><td>firstReactRender</td><td align="right">37</td><td align="right">29</td><td align="right">59</td><td align="right">6</td><td align="right">40</td><td align="right">49</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">283</td><td align="right">28</td><td align="right">10</td><td align="right">30</td></tr><tr><td>initialActions</td><td align="right">1</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">1280</td><td align="right">1128</td><td align="right">1795</td><td align="right">128</td><td align="right">1336</td><td align="right">1543</td></tr><tr><td>setupStore</td><td align="right">13</td><td align="right">5</td><td align="right">336</td><td align="right">33</td><td align="right">9</td><td align="right">24</td></tr></tbody></table></details>


author_association: COLLABORATOR