Repository: MetaMask/metamask-extension
Pull request #33112: chore: add remote feature flag for multichain accounts
Author: login: gantunesr
Labels: name: team-accounts-framework
description: Accounts team
name: release-12.21.0
description: Issue or pull request that will be included in release 12.21.0
Created: 2025-05-21T21:43:17Z | Merged: 2025-05-29T11:51:33Z

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/33112?quickstart=1)

Add remote feature flag for multichain accounts. The feature flag structure is,

```ts
{
  enabled: boolean;
  featureVersion: string;
  minimumVersion: string;
};
```

## **Related issues**

Fixes: None

## **Manual testing steps**

Not applicable

## **Screenshots/Recordings**

applicable

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.



Diff:
diff --git a/ui/selectors/index.js b/ui/selectors/index.js
index c7fbb2f4cda9..6f1ca5f95946 100644
--- a/ui/selectors/index.js
+++ b/ui/selectors/index.js
@@ -10,3 +10,4 @@ export * from './accounts';
 export * from './remote-feature-flags';
 export * from './origin-throttling';
 export * from './multichain/networks';
+export * from './multichain-accounts';
diff --git a/ui/selectors/multichain-accounts/feature-flags.test.ts b/ui/selectors/multichain-accounts/feature-flags.test.ts
new file mode 100644
index 000000000000..e54b78e8c085
--- /dev/null
+++ b/ui/selectors/multichain-accounts/feature-flags.test.ts
@@ -0,0 +1,93 @@
+import { type RemoteFeatureFlagsState } from '../remote-feature-flags';
+import {
+  type MultichainAccountsFeatureFlag,
+  getIsMultichainAccountsState1Enabled,
+  getIsMultichainAccountsState2Enabled,
+} from './feature-flags';
+
+jest.mock('../../../package.json', () => ({
+  version: '12.0.0',
+}));
+
+type TestState = RemoteFeatureFlagsState & {
+  metamask: {
+    remoteFeatureFlags: {
+      enableMultichainAccounts: MultichainAccountsFeatureFlag;
+    };
+  };
+};
+
+const disabledStateMock: MultichainAccountsFeatureFlag = {
+  enabled: false,
+  featureVersion: null,
+  minimumVersion: null,
+};
+
+const state1Mock: MultichainAccountsFeatureFlag = {
+  enabled: true,
+  featureVersion: '1',
+  minimumVersion: '13.0.0',
+};
+
+const state2Mock: MultichainAccountsFeatureFlag = {
+  enabled: true,
+  featureVersion: '2',
+  minimumVersion: '14.0.0',
+};
+
+const getMockState = (
+  multichainAccountsFeatureFlagMock: MultichainAccountsFeatureFlag,
+): TestState =>
+  Object.freeze({
+    metamask: {
+      remoteFeatureFlags: {
+        enableMultichainAccounts: multichainAccountsFeatureFlagMock,
+      },
+    },
+  });
+
+describe('Multichain Accounts Feature Flags', () => {
+  beforeEach(() => {
+    jest.clearAllMocks(); // Clears all mocks before each test
+  });
+
+  describe('getIsMultichainAccountsState1Enabled', () => {
+    it('returns false for disabled state', () => {
+      expect(
+        getIsMultichainAccountsState1Enabled(getMockState(disabledStateMock)),
+      ).toBe(false);
+    });
+
+    it('returns true for state 1', () => {
+      expect(
+        getIsMultichainAccountsState1Enabled(getMockState(state1Mock)),
+      ).toBe(true);
+    });
+
+    it('returns true for state 2', () => {
+      expect(
+        getIsMultichainAccountsState1Enabled(getMockState(state2Mock)),
+      ).toBe(true);
+    });
+  });
+
+  describe('getIsMultichainAccountsState2Enabled', () => {
+    it('returns false for disabled state', () => {
+      expect(
+        getIsMultichainAccountsState2Enabled(getMockState(disabledStateMock)),
+      ).toBe(false);
+    });
+
+    it('returns false for state 1', () => {
+      expect(
+        getIsMultichainAccountsState2Enabled(getMockState(state1Mock)),
+      ).toBe(false);
+    });
+
+    it('returns true for state 2', () => {
+      expect(
+        getIsMultichainAccountsState2Enabled(getMockState(state2Mock)),
+      ).toBe(true);
+    });
+  });
+});
diff --git a/ui/selectors/multichain-accounts/feature-flags.ts b/ui/selectors/multichain-accounts/feature-flags.ts
new file mode 100644
index 000000000000..0b595ec33566
--- /dev/null
+++ b/ui/selectors/multichain-accounts/feature-flags.ts
@@ -0,0 +1,115 @@
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+const APP_VERSION = packageJson.version;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param enableMultichainAccounts - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+export const isMultichainAccountsFeatureEnabled = (
+  enableMultichainAccounts: MultichainAccountsFeatureFlag,
+  featureVersion: string,
+) => {
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts;
+
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    semver.gte(minimumVersion, APP_VERSION)
+  );
+};
+
+/**
+ * Selector to get the multichain accounts remote feature flags.
+ *
+ * @param state - The MetaMask state object
+ * @returns MultichainAccountsFeatureFlag - The feature flags for multichain accounts.
+ */
+export const getMultichainAccountsRemoteFeatureFlags = (
+  state: RemoteFeatureFlagsState,
+) => {
+  const multichainAccountsFeatureFlags =
+    getRemoteFeatureFlags(state).enableMultichainAccounts;
+
+  try {
+    assert(multichainAccountsFeatureFlags, MultichainAccountsFeatureFlag);
+  } catch (error) {
+    console.warn('Invalid multichain accounts feature flags:', error);
+    return {
+      enabled: false,
+      featureVersion: null,
+      minimumVersion: null,
+    };
+  }
+
+  return multichainAccountsFeatureFlags;
+};
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 1.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 1, false otherwise.
+ */
+export const getIsMultichainAccountsState1Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  const flags = getMultichainAccountsRemoteFeatureFlags(state);
+  return (
+    isMultichainAccountsFeatureEnabled(flags, FEATURE_VERSION_2) ||
+    isMultichainAccountsFeatureEnabled(flags, FEATURE_VERSION_1)
+  );
+};
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 2.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 2, false otherwise.
+ */
+export const getIsMultichainAccountsState2Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  const flags = getMultichainAccountsRemoteFeatureFlags(state);
+  return isMultichainAccountsFeatureEnabled(flags, FEATURE_VERSION_2);
+};
diff --git a/ui/selectors/multichain-accounts/index.ts b/ui/selectors/multichain-accounts/index.ts
new file mode 100644
index 000000000000..9dbcb3101c29
--- /dev/null
+++ b/ui/selectors/multichain-accounts/index.ts
@@ -0,0 +1 @@
+export * from './feature-flags';


Reviews:
user: login: shane-t
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-05-22T10:04:10Z
user: login: owencraston
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-05-22T12:42:27Z
user: login: montelaidev
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-05-22T12:57:52Z
user: login: ccharly
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-27T08:52:15Z
user: login: montelaidev
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-27T14:24:38Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T01:12:00Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T01:23:38Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T01:25:41Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T01:25:51Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T01:26:26Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T03:14:25Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T03:14:39Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T03:15:03Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T03:15:45Z
user: login: ccharly
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-28T10:21:16Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T15:10:50Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T15:11:00Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T15:11:06Z
user: login: gantunesr
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T15:11:13Z
user: login: owencraston
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-28T22:00:36Z
user: login: montelaidev
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T11:06:41Z
user: login: shane-t
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-29T11:14:01Z

Review comments:
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: WDYT about relying on `semver` package instead here? Using `semver.valid` and `semver.gte` would do the trick I guess.

Also, I think that we should `console.warn` if any of the versions are invalid. This should not crash the whole app, but logging it somewhere could help catch some bad configs if any.
created_at: 2025-05-27T08:30:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: I wonder if we could just do:
```suggestion
    (MINIMUM_SUPPORTED_VERSION !== null && compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION))
```

This way, we know `MINIMUM_SUPPORTED_VERSION` will be defined as a `string`. We might need to change this:
```ts
const MINIMUM_SUPPORTED_VERSION = null;
```

To:

```ts
const MINIMUM_SUPPORTED_VERSION: string | null = null;
```
created_at: 2025-05-27T08:32:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
+  );
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for state 1.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 1, false otherwise.
+ */
+export const getIsMultichainAccountsState1Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  return false;
+
+  // TODO: Uncomment this when the feature is ready for release
+  // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_1);
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: I think we should already uncomment this, otherwise it would make dev for state 1 and 2 harder to test (since we would have to hack the code manually to enable this).

If we enable it now, it allows us to override remote feature flag in our `.metamaskrc` and would make manual testing easier IMO.
created_at: 2025-05-27T08:37:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
+  );
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for state 1.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 1, false otherwise.
+ */
+export const getIsMultichainAccountsState1Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  return false;
+
+  // TODO: Uncomment this when the feature is ready for release
+  // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_1);
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for state 2.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 2, false otherwise.
+ */
+export const getIsMultichainAccountsState2Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  return false;
+
+  // TODO: Uncomment this when the feature is ready for release
+  // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_2);
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Same comment here.
created_at: 2025-05-27T08:37:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Also, instead of defining a `MINIMUM_SUPPORTED_VERSION` here, we could just use the extension version instead? As long as `enableMultichainAccounts.minimumVersion` is not higher than the extension's version, this would be considered `false` no?
created_at: 2025-05-27T08:39:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Cosmetic: I think it's better if we cast it before:

```suggestion
  const { enableMultichainAccounts } = getRemoteFeatureFlags(state) as MultichainAccountsFeatureFlag;
  const {
    enabled,
    featureVersion: currentFeatureVersion,
    minimumVersion,
  } = enableMultichainAccounts;
```

WDYT?
created_at: 2025-05-27T08:43:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Question: Since we have a more "complex shape" than other feature flags, do we want to run any schema validation here with `superstruct` in case we make any error on the configuration side?
created_at: 2025-05-27T08:45:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: We should probably use `createSelector` or `createDeepEqualSelector` here to memoize and only react to `remoteFeatureFlag` change.

I guess we're gonna use that selector in several place, so memoizing does seem important to me.

We could maybe follow the same pattern than the bridge team: https://github.com/MetaMask/metamask-extension/blob/main/ui/ducks/bridge/selectors.ts#L138-L146? That sounds like a good pattern to me.


created_at: 2025-05-27T08:52:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: montelaidev
body: We do use `compare-versions` on mobile already. Maybe we can do the same on extension?
created_at: 2025-05-27T14:24:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: good to know, I was not aware we had this dependency
created_at: 2025-05-28T01:12:00Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: The `MINIMUM_SUPPORTED_VERSION` should never be null, I left it as that on purpose until we figure out the proper flag structure 

>  instead of defining a MINIMUM_SUPPORTED_VERSION here, we could just use the extension version instead? 
True, the reason I preferred to have a constant was because it was slightly faster since you don't need to be getting the version

Good point, I wanted to keep a constant to avoid getting the version but maybe it is not necessary

created_at: 2025-05-28T01:23:38Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
+  );
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for state 1.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 1, false otherwise.
+ */
+export const getIsMultichainAccountsState1Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  return false;
+
+  // TODO: Uncomment this when the feature is ready for release
+  // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_1);
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: It would make a bit harder for a few days until we decide if the version should be part of the flag but the team should be able to handle to change the value of a boolean for development and testing in the meanwhile
created_at: 2025-05-28T01:25:41Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
+  );
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for state 1.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 1, false otherwise.
+ */
+export const getIsMultichainAccountsState1Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  return false;
+
+  // TODO: Uncomment this when the feature is ready for release
+  // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_1);
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for state 2.
+ *
+ * @param state - The MetaMask state object
+ * @returns boolean - True if the feature is enabled for state 2, false otherwise.
+ */
+export const getIsMultichainAccountsState2Enabled = (
+  state: RemoteFeatureFlagsState,
+) => {
+  return false;
+
+  // TODO: Uncomment this when the feature is ready for release
+  // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_2);
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: https://github.com/MetaMask/metamask-extension/pull/33112#discussion_r2110666092
created_at: 2025-05-28T01:25:51Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: I get the following error with this change: `Property 'enableMultichainAccounts' does not exist on type 'MultichainAccountsFeatureFlag'.`
created_at: 2025-05-28T01:26:26Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: done in https://github.com/MetaMask/metamask-extension/pull/33112/commits/5eb39a30c7316f17e0f7e1f4aaf4506a4bd9483f
created_at: 2025-05-28T03:14:25Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    // @ts-expect-error - this error can be ignored while the minimum version is not defined
+    compareVersions(minimumVersion, MINIMUM_SUPPORTED_VERSION)
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: done in https://github.com/MetaMask/metamask-extension/pull/33112/commits/be6d59949258278b0fa056364b61696c29217fe0
created_at: 2025-05-28T03:14:39Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: done in https://github.com/MetaMask/metamask-extension/pull/33112/commits/a97efefadf7f895e14fa67d6dee87bebd78f1235
created_at: 2025-05-28T03:15:02Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: done in https://github.com/MetaMask/metamask-extension/pull/33112/commits/9401614fc72ab7b307df028e4e57136b39140642
created_at: 2025-05-28T03:15:45Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: This might not be needed anymore?
created_at: 2025-05-28T10:13:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const APP_VERSION = packageJson.version;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+export const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  try {
+    assert(enableMultichainAccounts, MultichainAccountsFeatureFlag);
+  } catch (error) {
+    console.error(error);
+    return false;
+  }
+
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    semver.gt(minimumVersion, APP_VERSION)
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Is it inclusive? I guess the `minimumVersion` is the starting point, so we should "include" it too? If yes, then we need `gte` instead.

```suggestion
    semver.gte(minimumVersion, APP_VERSION)
```
created_at: 2025-05-28T10:15:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts as MultichainAccountsFeatureFlag;
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Yes indeed 🙈 anyway, since we use `superstruct.assert` now, it's not needed anymore! 🎉
created_at: 2025-05-28T10:16:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,109 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = {
+  enabled: boolean;
+  featureVersion: string | null;
+  minimumVersion: string | null;
+};
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const MINIMUM_SUPPORTED_VERSION = null;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Compare is the version1 is greater than or equal to version2
+ *
+ * @param version1 - The first version string to compare.
+ * @param version2 - The second version string to compare.
+ * @returns boolean - True if version1 is greater than or equal to version2, false otherwise.
+ */
+export const compareVersions = (version1: string, version2: string) => {
+  const regex = /^\d+\.\d+\.\d+$/u;
+  if (!regex.test(version1) || !regex.test(version2)) {
+    return false; // Invalid version format
+  }
+
+  const v1 = version1.split('.').map(Number);
+  const v2 = version2.split('.').map(Number);
+
+  for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
+    const num1 = v1[i] || 0;
+    const num2 = v2[i] || 0;
+
+    if (num1 > num2) {
+      return true;
+    }
+    if (num1 < num2) {
+      return false;
+    }
+  }
+
+  return true; // Versions are equal
+};
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Almost good, but I think we should use the entire state, cause deep-equality will be too costly.

Instead we might want to use something like:
```ts
  [(state) => getRemoteFeatureFlags(state).enableMultichainAccounts],
```

(I did not test it)
created_at: 2025-05-28T10:18:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const APP_VERSION = packageJson.version;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+export const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  try {
+    assert(enableMultichainAccounts, MultichainAccountsFeatureFlag);
+  } catch (error) {
+    console.error(error);
+    return false;
+  }
+
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    semver.gt(minimumVersion, APP_VERSION)
+  );
+};
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 1.
+ */
+export const getIsMultichainAccountsState1Enabled = createDeepEqualSelector(
+  (state: RemoteFeatureFlagsState) => state,
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: As mentioned in the other thread, we might want to scope this to our config only, so probably something like:

```suggestion
  (state: RemoteFeatureFlagsState) => getRemoteFeatureFlags(state).enableMultichainAccounts,
```

(I did not test it).
created_at: 2025-05-28T10:20:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const APP_VERSION = packageJson.version;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+export const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  try {
+    assert(enableMultichainAccounts, MultichainAccountsFeatureFlag);
+  } catch (error) {
+    console.error(error);
+    return false;
+  }
+
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    semver.gt(minimumVersion, APP_VERSION)
+  );
+};
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 1.
+ */
+export const getIsMultichainAccountsState1Enabled = createDeepEqualSelector(
+  (state: RemoteFeatureFlagsState) => state,
+  (state) => {
+    return false;
+    // TODO: Uncomment this when the feature is ready for release
+    // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_1);
+  },
+);
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 2.
+ */
+export const getIsMultichainAccountsState2Enabled = createDeepEqualSelector(
+  (state: RemoteFeatureFlagsState) => state,
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: ccharly
body: Same here:

```suggestion
  (state: RemoteFeatureFlagsState) => getRemoteFeatureFlags(state).enableMultichainAccounts,
```
created_at: 2025-05-28T10:20:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: true, removed in https://github.com/MetaMask/metamask-extension/pull/33112/commits/44e143ce2e2ca73fb8c4498a9b4a0abe80c4ef8a
created_at: 2025-05-28T15:10:50Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const APP_VERSION = packageJson.version;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+export const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  try {
+    assert(enableMultichainAccounts, MultichainAccountsFeatureFlag);
+  } catch (error) {
+    console.error(error);
+    return false;
+  }
+
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    semver.gt(minimumVersion, APP_VERSION)
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: correct, fixed in https://github.com/MetaMask/metamask-extension/pull/33112/commits/44e143ce2e2ca73fb8c4498a9b4a0abe80c4ef8a
created_at: 2025-05-28T15:11:00Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const APP_VERSION = packageJson.version;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+export const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  try {
+    assert(enableMultichainAccounts, MultichainAccountsFeatureFlag);
+  } catch (error) {
+    console.error(error);
+    return false;
+  }
+
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    semver.gt(minimumVersion, APP_VERSION)
+  );
+};
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 1.
+ */
+export const getIsMultichainAccountsState1Enabled = createDeepEqualSelector(
+  (state: RemoteFeatureFlagsState) => state,
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: done in https://github.com/MetaMask/metamask-extension/pull/33112/commits/44e143ce2e2ca73fb8c4498a9b4a0abe80c4ef8a
created_at: 2025-05-28T15:11:06Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+// We can ignore the unused vars warning while the flag is not active
+
+import {
+  Infer,
+  object,
+  boolean,
+  nullable,
+  string,
+  assert,
+} from '@metamask/superstruct';
+import semver from 'semver';
+import packageJson from '../../../package.json';
+import {
+  getRemoteFeatureFlags,
+  type RemoteFeatureFlagsState,
+} from '../remote-feature-flags';
+import { createDeepEqualSelector } from '../../../shared/modules/selectors/util';
+
+/**
+ * Feature flag structure for multichain accounts features
+ */
+const MultichainAccountsFeatureFlag = object({
+  enabled: boolean(),
+  featureVersion: nullable(string()),
+  minimumVersion: nullable(string()),
+});
+
+/**
+ * Feature flag type for multichain accounts features
+ */
+export type MultichainAccountsFeatureFlag = Infer<
+  typeof MultichainAccountsFeatureFlag
+>;
+
+// TODO: Update the value to the decided version multichain accounts will be released
+const APP_VERSION = packageJson.version;
+const FEATURE_VERSION_1 = '1';
+const FEATURE_VERSION_2 = '2';
+
+/**
+ * Checks if the multichain accounts feature is enabled for a given state and feature version.
+ *
+ * @param state - The MetaMask state object
+ * @param featureVersion - The specific feature version to check
+ * @returns boolean - True if the feature is enabled for the given state and version, false otherwise.
+ */
+export const isMultichainAccountsFeatureEnabled = (
+  state: RemoteFeatureFlagsState,
+  featureVersion: string,
+) => {
+  const { enableMultichainAccounts } = getRemoteFeatureFlags(state);
+  try {
+    assert(enableMultichainAccounts, MultichainAccountsFeatureFlag);
+  } catch (error) {
+    console.error(error);
+    return false;
+  }
+
+  const {
+    enabled,
+    featureVersion: currentFeatureVersion,
+    minimumVersion,
+  } = enableMultichainAccounts;
+  return (
+    enabled &&
+    currentFeatureVersion &&
+    minimumVersion &&
+    currentFeatureVersion === featureVersion &&
+    semver.gt(minimumVersion, APP_VERSION)
+  );
+};
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 1.
+ */
+export const getIsMultichainAccountsState1Enabled = createDeepEqualSelector(
+  (state: RemoteFeatureFlagsState) => state,
+  (state) => {
+    return false;
+    // TODO: Uncomment this when the feature is ready for release
+    // return isMultichainAccountsFeatureEnabled(state, FEATURE_VERSION_1);
+  },
+);
+
+/**
+ * Selector to check if the multichain accounts feature is enabled for state 2.
+ */
+export const getIsMultichainAccountsState2Enabled = createDeepEqualSelector(
+  (state: RemoteFeatureFlagsState) => state,
path: ui/selectors/multichain-accounts/feature-flags.ts
user: login: gantunesr
body: done in https://github.com/MetaMask/metamask-extension/pull/33112/commits/44e143ce2e2ca73fb8c4498a9b4a0abe80c4ef8a
created_at: 2025-05-28T15:11:13Z
author_association: MEMBER

PR comments:
user: login: metamaskbot
created_at: 2025-05-21T22:15:20Z
body: <details><summary>Builds ready [b1e466e]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds/metamask-chrome-12.18.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds-mv2/metamask-firefox-12.18.0.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15173177907/builds-beta/metamask-beta-chrome-12.18.0-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds-flask/metamask-flask-chrome-12.18.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.18.0-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds-test/metamask-chrome-12.18.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds-test-mv2/metamask-firefox-12.18.0.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds-test-flask/metamask-flask-chrome-12.18.0-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.18.0-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15173177907/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15173177907/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15173177907/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15173177907/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4906220/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/147013bd-536d-43f3-8fd2-2be1ce34346d/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/147013bd-536d-43f3-8fd2-2be1ce34346d/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/147013bd-536d-43f3-8fd2-2be1ce34346d/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1217 ± 65 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1217</td><td align="right">1080</td><td align="right">1367</td><td align="right">65</td><td align="right">1265</td><td align="right">1319</td></tr><tr><td>load</td><td align="right">1052</td><td align="right">926</td><td align="right">1197</td><td align="right">66</td><td align="right">1099</td><td align="right">1158</td></tr><tr><td>domContentLoaded</td><td align="right">1044</td><td align="right">918</td><td align="right">1191</td><td align="right">67</td><td align="right">1093</td><td align="right">1149</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">27</td><td align="right">3</td><td align="right">16</td><td align="right">24</td></tr><tr><td>firstPaint</td><td align="right">830</td><td align="right">78</td><td align="right">1198</td><td align="right">377</td><td align="right">1093</td><td align="right">1159</td></tr><tr><td>backgroundConnect</td><td align="right">9</td><td align="right">4</td><td align="right">31</td><td align="right">6</td><td align="right">8</td><td align="right">25</td></tr><tr><td>firstReactRender</td><td align="right">19</td><td align="right">14</td><td align="right">41</td><td align="right">5</td><td align="right">19</td><td align="right">32</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">5</td><td align="right">59</td><td align="right">9</td><td align="right">20</td><td align="right">30</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">804</td><td align="right">667</td><td align="right">951</td><td align="right">66</td><td align="right">851</td><td align="right">909</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">27</td><td align="right">3</td><td align="right">8</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2075</td><td align="right">1669</td><td align="right">2555</td><td align="right">189</td><td align="right">2195</td><td align="right">2453</td></tr><tr><td>load</td><td align="right">1623</td><td align="right">1309</td><td align="right">2009</td><td align="right">142</td><td align="right">1690</td><td align="right">1893</td></tr><tr><td>domContentLoaded</td><td align="right">1617</td><td align="right">1305</td><td align="right">2005</td><td align="right">141</td><td align="right">1686</td><td align="right">1881</td></tr><tr><td>domInteractive</td><td align="right">15</td><td align="right">11</td><td align="right">53</td><td align="right">8</td><td align="right">12</td><td align="right">42</td></tr><tr><td>firstPaint</td><td align="right">164</td><td align="right">64</td><td align="right">469</td><td align="right">73</td><td align="right">194</td><td align="right">324</td></tr><tr><td>backgroundConnect</td><td align="right">20</td><td align="right">9</td><td align="right">62</td><td align="right">8</td><td align="right">24</td><td align="right">36</td></tr><tr><td>firstReactRender</td><td align="right">107</td><td align="right">41</td><td align="right">335</td><td align="right">85</td><td align="right">117</td><td align="right">317</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">291</td><td align="right">28</td><td align="right">12</td><td align="right">18</td></tr><tr><td>initialActions</td><td align="right">6</td><td align="right">1</td><td align="right">292</td><td align="right">29</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1614</td><td align="right">1303</td><td align="right">2004</td><td align="right">139</td><td align="right">1685</td><td align="right">1878</td></tr><tr><td>setupStore</td><td align="right">43</td><td align="right">6</td><td align="right">304</td><td align="right">86</td><td align="right">19</td><td align="right">301</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1301</td><td align="right">1125</td><td align="right">1822</td><td align="right">134</td><td align="right">1331</td><td align="right">1606</td></tr><tr><td>load</td><td align="right">1153</td><td align="right">994</td><td align="right">1668</td><td align="right">117</td><td align="right">1201</td><td align="right">1374</td></tr><tr><td>domContentLoaded</td><td align="right">1152</td><td align="right">994</td><td align="right">1667</td><td align="right">117</td><td align="right">1200</td><td align="right">1373</td></tr><tr><td>domInteractive</td><td align="right">90</td><td align="right">41</td><td align="right">249</td><td align="right">27</td><td align="right">95</td><td align="right">135</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">12</td><td align="right">89</td><td align="right">10</td><td align="right">20</td><td align="right">41</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">20</td><td align="right">54</td><td align="right">4</td><td align="right">23</td><td align="right">30</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">4</td><td align="right">229</td><td align="right">29</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">1135</td><td align="right">981</td><td align="right">1655</td><td align="right">115</td><td align="right">1185</td><td align="right">1352</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">3</td><td align="right">58</td><td align="right">7</td><td align="right">6</td><td align="right">14</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1625</td><td align="right">1369</td><td align="right">2183</td><td align="right">179</td><td align="right">1742</td><td align="right">1979</td></tr><tr><td>load</td><td align="right">1412</td><td align="right">1172</td><td align="right">1971</td><td align="right">168</td><td align="right">1530</td><td align="right">1766</td></tr><tr><td>domContentLoaded</td><td align="right">1411</td><td align="right">1172</td><td align="right">1971</td><td align="right">168</td><td align="right">1530</td><td align="right">1765</td></tr><tr><td>domInteractive</td><td align="right">79</td><td align="right">40</td><td align="right">152</td><td align="right">16</td><td align="right">86</td><td align="right">116</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">23</td><td align="right">14</td><td align="right">75</td><td align="right">8</td><td align="right">24</td><td align="right">37</td></tr><tr><td>firstReactRender</td><td align="right">39</td><td align="right">27</td><td align="right">59</td><td align="right">6</td><td align="right">42</td><td align="right">50</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">5</td><td align="right">32</td><td align="right">5</td><td align="right">9</td><td align="right">22</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">1392</td><td align="right">1158</td><td align="right">1943</td><td align="right">167</td><td align="right">1512</td><td align="right">1739</td></tr><tr><td>setupStore</td><td align="right">10</td><td align="right">5</td><td align="right">74</td><td align="right">11</td><td align="right">9</td><td align="right">32</td></tr></tbody></table>cc: @HowardBraham<br>
Benchmark value 831 exceeds gate value 800 for chrome browserify home mean firstPaint<br>
Benchmark value 25 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 44 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 301 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
Benchmark value 12 exceeds gate value 11 for firefox browserify home mean getState<br>
Benchmark value 1625 exceeds gate value 1615 for firefox webpack home mean uiStartup<br>
Benchmark value 1412 exceeds gate value 1380 for firefox webpack home mean load<br>
Benchmark value 1412 exceeds gate value 1380 for firefox webpack home mean domContentLoaded<br>
Benchmark value 39 exceeds gate value 38 for firefox webpack home mean firstReactRender<br>
Benchmark value 1392 exceeds gate value 1360 for firefox webpack home mean loadScripts<br>
Benchmark value 1979 exceeds gate value 1935 for firefox webpack home p95 uiStartup<br>
Benchmark value 1766 exceeds gate value 1660 for firefox webpack home p95 load<br>
Benchmark value 1765 exceeds gate value 1660 for firefox webpack home p95 domContentLoaded<br>
Benchmark value 1739 exceeds gate value 1630 for firefox webpack home p95 loadScripts<br>
Benchmark value 32 exceeds gate value 28 for firefox webpack home p95 setupStore<br>
<b>Sum of mean exceeds: 151ms | Sum of p95 exceeds: 611ms<br>
Sum of all benchmark exceeds: 762ms</b><br>
</details>

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


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

<details><summary>UI Startup Metrics (1216 ± 81 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">1216</td><td align="right">1088</td><td align="right">1616</td><td align="right">81</td><td align="right">1260</td><td align="right">1349</td></tr><tr><td>load</td><td align="right">1051</td><td align="right">914</td><td align="right">1365</td><td align="right">78</td><td align="right">1100</td><td align="right">1181</td></tr><tr><td>domContentLoaded</td><td align="right">1043</td><td align="right">910</td><td align="right">1358</td><td align="right">79</td><td align="right">1095</td><td align="right">1176</td></tr><tr><td>domInteractive</td><td align="right">15</td><td align="right">13</td><td align="right">42</td><td align="right">3</td><td align="right">16</td><td align="right">22</td></tr><tr><td>firstPaint</td><td align="right">757</td><td align="right">147</td><td align="right">1364</td><td align="right">404</td><td align="right">1059</td><td align="right">1175</td></tr><tr><td>backgroundConnect</td><td align="right">9</td><td align="right">4</td><td align="right">37</td><td align="right">5</td><td align="right">9</td><td align="right">23</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">14</td><td align="right">40</td><td align="right">6</td><td align="right">21</td><td align="right">37</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">5</td><td align="right">41</td><td align="right">8</td><td align="right">19</td><td align="right">34</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">803</td><td align="right">681</td><td align="right">1106</td><td align="right">77</td><td align="right">857</td><td align="right">938</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">56</td><td align="right">5</td><td align="right">8</td><td align="right">14</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2088</td><td align="right">1669</td><td align="right">2524</td><td align="right">215</td><td align="right">2249</td><td align="right">2429</td></tr><tr><td>load</td><td align="right">1621</td><td align="right">1315</td><td align="right">1937</td><td align="right">154</td><td align="right">1719</td><td align="right">1861</td></tr><tr><td>domContentLoaded</td><td align="right">1615</td><td align="right">1311</td><td align="right">1926</td><td align="right">152</td><td align="right">1714</td><td align="right">1852</td></tr><tr><td>domInteractive</td><td align="right">14</td><td align="right">11</td><td align="right">42</td><td align="right">7</td><td align="right">12</td><td align="right">39</td></tr><tr><td>firstPaint</td><td align="right">164</td><td align="right">66</td><td align="right">551</td><td align="right">69</td><td align="right">196</td><td align="right">305</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">12</td><td align="right">49</td><td align="right">7</td><td align="right">26</td><td align="right">37</td></tr><tr><td>firstReactRender</td><td align="right">144</td><td align="right">42</td><td align="right">369</td><td align="right">106</td><td align="right">274</td><td align="right">344</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">4</td><td align="right">309</td><td align="right">30</td><td align="right">14</td><td align="right">26</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">4</td></tr><tr><td>loadScripts</td><td align="right">1612</td><td align="right">1310</td><td align="right">1916</td><td align="right">151</td><td align="right">1712</td><td align="right">1841</td></tr><tr><td>setupStore</td><td align="right">32</td><td align="right">6</td><td align="right">305</td><td align="right">65</td><td align="right">18</td><td align="right">269</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1319</td><td align="right">1146</td><td align="right">2158</td><td align="right">160</td><td align="right">1349</td><td align="right">1645</td></tr><tr><td>load</td><td align="right">1165</td><td align="right">1020</td><td align="right">1659</td><td align="right">129</td><td align="right">1209</td><td align="right">1442</td></tr><tr><td>domContentLoaded</td><td align="right">1165</td><td align="right">1019</td><td align="right">1658</td><td align="right">129</td><td align="right">1209</td><td align="right">1442</td></tr><tr><td>domInteractive</td><td align="right">99</td><td align="right">38</td><td align="right">668</td><td align="right">67</td><td align="right">102</td><td align="right">159</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">67</td><td align="right">8</td><td align="right">21</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">25</td><td align="right">20</td><td align="right">59</td><td align="right">8</td><td align="right">24</td><td align="right">51</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">255</td><td align="right">27</td><td align="right">8</td><td align="right">18</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">1147</td><td align="right">1003</td><td align="right">1634</td><td align="right">126</td><td align="right">1189</td><td align="right">1423</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">179</td><td align="right">17</td><td align="right">6</td><td align="right">11</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1530</td><td align="right">1324</td><td align="right">2111</td><td align="right">152</td><td align="right">1620</td><td align="right">1849</td></tr><tr><td>load</td><td align="right">1328</td><td align="right">1134</td><td align="right">1874</td><td align="right">144</td><td align="right">1420</td><td align="right">1619</td></tr><tr><td>domContentLoaded</td><td align="right">1328</td><td align="right">1134</td><td align="right">1874</td><td align="right">144</td><td align="right">1420</td><td align="right">1619</td></tr><tr><td>domInteractive</td><td align="right">76</td><td align="right">59</td><td align="right">124</td><td align="right">13</td><td align="right">80</td><td align="right">109</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">118</td><td align="right">12</td><td align="right">21</td><td align="right">36</td></tr><tr><td>firstReactRender</td><td align="right">37</td><td align="right">27</td><td align="right">48</td><td align="right">4</td><td align="right">40</td><td align="right">46</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">5</td><td align="right">169</td><td align="right">19</td><td align="right">8</td><td align="right">19</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1309</td><td align="right">1118</td><td align="right">1858</td><td align="right">141</td><td align="right">1400</td><td align="right">1574</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">35</td><td align="right">4</td><td align="right">8</td><td align="right">11</td></tr></tbody></table>Benchmark value 23 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 34 exceeds gate value 33 for chrome browserify home p95 getState<br>
Benchmark value 33 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 269 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
Benchmark value 12 exceeds gate value 11 for firefox browserify home mean getState<br>
<b>Sum of mean exceeds: 2ms | Sum of p95 exceeds: 210ms<br>
Sum of all benchmark exceeds: 212ms</b><br>
</details>

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


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

<details><summary>UI Startup Metrics (1207 ± 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">1207</td><td align="right">1088</td><td align="right">1416</td><td align="right">66</td><td align="right">1255</td><td align="right">1301</td></tr><tr><td>load</td><td align="right">1043</td><td align="right">931</td><td align="right">1184</td><td align="right">59</td><td align="right">1087</td><td align="right">1146</td></tr><tr><td>domContentLoaded</td><td align="right">1037</td><td align="right">919</td><td align="right">1179</td><td align="right">60</td><td align="right">1082</td><td align="right">1139</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">34</td><td align="right">5</td><td align="right">15</td><td align="right">30</td></tr><tr><td>firstPaint</td><td align="right">666</td><td align="right">79</td><td align="right">1192</td><td align="right">427</td><td align="right">1061</td><td align="right">1131</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">27</td><td align="right">4</td><td align="right">8</td><td align="right">18</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">14</td><td align="right">44</td><td align="right">6</td><td align="right">21</td><td align="right">36</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">6</td><td align="right">45</td><td align="right">8</td><td align="right">21</td><td align="right">29</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">0</td></tr><tr><td>loadScripts</td><td align="right">799</td><td align="right">689</td><td align="right">931</td><td align="right">57</td><td align="right">838</td><td align="right">896</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">8</td><td align="right">13</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2115</td><td align="right">1686</td><td align="right">2697</td><td align="right">240</td><td align="right">2272</td><td align="right">2467</td></tr><tr><td>load</td><td align="right">1639</td><td align="right">1316</td><td align="right">2115</td><td align="right">181</td><td align="right">1772</td><td align="right">1888</td></tr><tr><td>domContentLoaded</td><td align="right">1633</td><td align="right">1312</td><td align="right">2107</td><td align="right">180</td><td align="right">1765</td><td align="right">1879</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">61</td><td align="right">10</td><td align="right">13</td><td align="right">44</td></tr><tr><td>firstPaint</td><td align="right">175</td><td align="right">69</td><td align="right">338</td><td align="right">58</td><td align="right">215</td><td align="right">291</td></tr><tr><td>backgroundConnect</td><td align="right">26</td><td align="right">13</td><td align="right">342</td><td align="right">33</td><td align="right">27</td><td align="right">48</td></tr><tr><td>firstReactRender</td><td align="right">142</td><td align="right">43</td><td align="right">363</td><td align="right">107</td><td align="right">277</td><td align="right">331</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">4</td><td align="right">338</td><td align="right">33</td><td align="right">14</td><td align="right">25</td></tr><tr><td>initialActions</td><td align="right">5</td><td align="right">1</td><td align="right">253</td><td align="right">25</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1629</td><td align="right">1311</td><td align="right">2096</td><td align="right">179</td><td align="right">1762</td><td align="right">1876</td></tr><tr><td>setupStore</td><td align="right">36</td><td align="right">7</td><td align="right">318</td><td align="right">72</td><td align="right">19</td><td align="right">301</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1360</td><td align="right">1175</td><td align="right">1790</td><td align="right">117</td><td align="right">1414</td><td align="right">1577</td></tr><tr><td>load</td><td align="right">1207</td><td align="right">1050</td><td align="right">1636</td><td align="right">117</td><td align="right">1288</td><td align="right">1436</td></tr><tr><td>domContentLoaded</td><td align="right">1207</td><td align="right">1050</td><td align="right">1635</td><td align="right">117</td><td align="right">1287</td><td align="right">1436</td></tr><tr><td>domInteractive</td><td align="right">102</td><td align="right">38</td><td align="right">330</td><td align="right">42</td><td align="right">114</td><td align="right">172</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">13</td><td align="right">218</td><td align="right">21</td><td align="right">21</td><td align="right">30</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">21</td><td align="right">55</td><td align="right">6</td><td align="right">24</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">37</td><td align="right">4</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">1189</td><td align="right">1035</td><td align="right">1564</td><td align="right">114</td><td align="right">1272</td><td align="right">1420</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">81</td><td align="right">8</td><td align="right">6</td><td align="right">11</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1536</td><td align="right">1338</td><td align="right">2138</td><td align="right">147</td><td align="right">1618</td><td align="right">1831</td></tr><tr><td>load</td><td align="right">1326</td><td align="right">1149</td><td align="right">1910</td><td align="right">140</td><td align="right">1412</td><td align="right">1594</td></tr><tr><td>domContentLoaded</td><td align="right">1325</td><td align="right">1148</td><td align="right">1910</td><td align="right">140</td><td align="right">1411</td><td align="right">1594</td></tr><tr><td>domInteractive</td><td align="right">79</td><td align="right">30</td><td align="right">344</td><td align="right">32</td><td align="right">85</td><td align="right">121</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">24</td><td align="right">16</td><td align="right">218</td><td align="right">21</td><td align="right">23</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">39</td><td align="right">28</td><td align="right">48</td><td align="right">5</td><td align="right">42</td><td align="right">47</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">5</td><td align="right">32</td><td align="right">5</td><td align="right">9</td><td align="right">23</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">1304</td><td align="right">1133</td><td align="right">1894</td><td align="right">138</td><td align="right">1382</td><td align="right">1574</td></tr><tr><td>setupStore</td><td align="right">13</td><td align="right">5</td><td align="right">238</td><td align="right">31</td><td align="right">8</td><td align="right">14</td></tr></tbody></table>Benchmark value 36 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 2467 exceeds gate value 2454 for chrome webpack home p95 uiStartup<br>
Benchmark value 301 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
Benchmark value 39 exceeds gate value 38 for firefox webpack home mean firstReactRender<br>
<b>Sum of mean exceeds: 5ms | Sum of p95 exceeds: 249ms<br>
Sum of all benchmark exceeds: 254ms</b><br>
</details>

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


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-23T20:17:47Z
body: <!-- METAMASK-CODEOWNERS-BOT -->
✨ Files requiring CODEOWNER review ✨
---

<details>
<summary>🔑 <strong>@MetaMask/accounts-engineers</strong> (3 files, +209 -0)</summary>

- 📁 ui/
  - 📁 selectors/
    - 📁 multichain-accounts/
        - 📄 `feature-flags.test.ts` *+93 -0*
        - 📄 `feature-flags.ts` *+115 -0*
        - 📄 `index.ts` *+1 -0*
</details>

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

<details><summary>UI Startup Metrics (1230 ± 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">1230</td><td align="right">1097</td><td align="right">1437</td><td align="right">66</td><td align="right">1271</td><td align="right">1352</td></tr><tr><td>load</td><td align="right">1059</td><td align="right">953</td><td align="right">1281</td><td align="right">62</td><td align="right">1095</td><td align="right">1157</td></tr><tr><td>domContentLoaded</td><td align="right">1052</td><td align="right">942</td><td align="right">1271</td><td align="right">63</td><td align="right">1091</td><td align="right">1152</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">42</td><td align="right">4</td><td align="right">16</td><td align="right">26</td></tr><tr><td>firstPaint</td><td align="right">680</td><td align="right">72</td><td align="right">1174</td><td align="right">427</td><td align="right">1064</td><td align="right">1135</td></tr><tr><td>backgroundConnect</td><td align="right">9</td><td align="right">4</td><td align="right">28</td><td align="right">5</td><td align="right">8</td><td align="right">23</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">16</td><td align="right">33</td><td align="right">3</td><td align="right">21</td><td align="right">27</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">5</td><td align="right">42</td><td align="right">8</td><td align="right">20</td><td align="right">30</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">809</td><td align="right">703</td><td align="right">1018</td><td align="right">61</td><td align="right">846</td><td align="right">921</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">12</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">2141</td><td align="right">1691</td><td align="right">2532</td><td align="right">195</td><td align="right">2270</td><td align="right">2469</td></tr><tr><td>load</td><td align="right">1656</td><td align="right">1325</td><td align="right">1908</td><td align="right">141</td><td align="right">1760</td><td align="right">1876</td></tr><tr><td>domContentLoaded</td><td align="right">1650</td><td align="right">1322</td><td align="right">1899</td><td align="right">140</td><td align="right">1750</td><td align="right">1866</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">10</td><td align="right">56</td><td align="right">10</td><td align="right">13</td><td align="right">43</td></tr><tr><td>firstPaint</td><td align="right">170</td><td align="right">62</td><td align="right">356</td><td align="right">69</td><td align="right">210</td><td align="right">316</td></tr><tr><td>backgroundConnect</td><td align="right">23</td><td align="right">13</td><td align="right">53</td><td align="right">8</td><td align="right">27</td><td align="right">41</td></tr><tr><td>firstReactRender</td><td align="right">155</td><td align="right">42</td><td align="right">357</td><td align="right">111</td><td align="right">287</td><td align="right">341</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">4</td><td align="right">234</td><td align="right">23</td><td align="right">14</td><td align="right">26</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">1647</td><td align="right">1320</td><td align="right">1888</td><td align="right">139</td><td align="right">1748</td><td align="right">1856</td></tr><tr><td>setupStore</td><td align="right">43</td><td align="right">6</td><td align="right">336</td><td align="right">86</td><td align="right">19</td><td align="right">301</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1303</td><td align="right">1126</td><td align="right">1744</td><td align="right">124</td><td align="right">1353</td><td align="right">1577</td></tr><tr><td>load</td><td align="right">1151</td><td align="right">1006</td><td align="right">1571</td><td align="right">109</td><td align="right">1210</td><td align="right">1386</td></tr><tr><td>domContentLoaded</td><td align="right">1151</td><td align="right">1006</td><td align="right">1571</td><td align="right">109</td><td align="right">1209</td><td align="right">1386</td></tr><tr><td>domInteractive</td><td align="right">95</td><td align="right">39</td><td align="right">272</td><td align="right">34</td><td align="right">104</td><td align="right">155</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">12</td><td align="right">61</td><td align="right">9</td><td align="right">20</td><td align="right">40</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">20</td><td align="right">55</td><td align="right">5</td><td align="right">24</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">4</td><td align="right">182</td><td align="right">25</td><td align="right">8</td><td align="right">29</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1133</td><td align="right">993</td><td align="right">1550</td><td align="right">108</td><td align="right">1193</td><td align="right">1365</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">175</td><td align="right">17</td><td align="right">6</td><td align="right">20</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1532</td><td align="right">1329</td><td align="right">2137</td><td align="right">155</td><td align="right">1623</td><td align="right">1876</td></tr><tr><td>load</td><td align="right">1321</td><td align="right">1147</td><td align="right">1728</td><td align="right">133</td><td align="right">1419</td><td align="right">1565</td></tr><tr><td>domContentLoaded</td><td align="right">1321</td><td align="right">1147</td><td align="right">1728</td><td align="right">133</td><td align="right">1419</td><td align="right">1565</td></tr><tr><td>domInteractive</td><td align="right">77</td><td align="right">54</td><td align="right">149</td><td align="right">15</td><td align="right">83</td><td align="right">105</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">15</td><td align="right">45</td><td align="right">5</td><td align="right">23</td><td align="right">32</td></tr><tr><td>firstReactRender</td><td align="right">38</td><td align="right">27</td><td align="right">55</td><td align="right">5</td><td align="right">41</td><td align="right">45</td></tr><tr><td>getState</td><td align="right">16</td><td align="right">4</td><td align="right">376</td><td align="right">45</td><td align="right">10</td><td align="right">29</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">1302</td><td align="right">1132</td><td align="right">1711</td><td align="right">133</td><td align="right">1398</td><td align="right">1546</td></tr><tr><td>setupStore</td><td align="right">10</td><td align="right">5</td><td align="right">248</td><td align="right">24</td><td align="right">8</td><td align="right">22</td></tr></tbody></table>Benchmark value 23 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 44 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 2469 exceeds gate value 2454 for chrome webpack home p95 uiStartup<br>
Benchmark value 301 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
Benchmark value 12 exceeds gate value 11 for firefox browserify home mean getState<br>
Benchmark value 29 exceeds gate value 24 for firefox browserify home p95 getState<br>
Benchmark value 39 exceeds gate value 38 for firefox webpack home mean firstReactRender<br>
Benchmark value 16 exceeds gate value 15 for firefox webpack home mean getState<br>
<b>Sum of mean exceeds: 15ms | Sum of p95 exceeds: 261ms<br>
Sum of all benchmark exceeds: 276ms</b><br>
</details>

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


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-26T18:27:35Z
body: <details><summary>Builds ready [df0fc64]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds/metamask-chrome-12.18.1.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds-mv2/metamask-firefox-12.18.1.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15259618181/builds-beta/metamask-beta-chrome-12.18.1-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds-flask/metamask-flask-chrome-12.18.1-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.18.1-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds-test/metamask-chrome-12.18.1.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds-test-mv2/metamask-firefox-12.18.1.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds-test-flask/metamask-flask-chrome-12.18.1-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.18.1-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15259618181/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15259618181/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15259618181/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15259618181/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4911209/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/96a652f1-901a-45c3-8ce1-0ed48482eb43/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/96a652f1-901a-45c3-8ce1-0ed48482eb43/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/96a652f1-901a-45c3-8ce1-0ed48482eb43/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1221 ± 68 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">1221</td><td align="right">1094</td><td align="right">1391</td><td align="right">68</td><td align="right">1270</td><td align="right">1348</td></tr><tr><td>load</td><td align="right">1052</td><td align="right">943</td><td align="right">1225</td><td align="right">62</td><td align="right">1097</td><td align="right">1161</td></tr><tr><td>domContentLoaded</td><td align="right">1045</td><td align="right">938</td><td align="right">1218</td><td align="right">62</td><td align="right">1089</td><td align="right">1150</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">31</td><td align="right">4</td><td align="right">17</td><td align="right">28</td></tr><tr><td>firstPaint</td><td align="right">759</td><td align="right">87</td><td align="right">1168</td><td align="right">415</td><td align="right">1083</td><td align="right">1152</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">30</td><td align="right">5</td><td align="right">8</td><td align="right">24</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">15</td><td align="right">38</td><td align="right">4</td><td align="right">20</td><td align="right">30</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">6</td><td align="right">29</td><td align="right">7</td><td align="right">21</td><td align="right">27</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">805</td><td align="right">697</td><td align="right">976</td><td align="right">61</td><td align="right">848</td><td align="right">906</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">41</td><td align="right">4</td><td align="right">8</td><td align="right">13</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2146</td><td align="right">1694</td><td align="right">2628</td><td align="right">212</td><td align="right">2289</td><td align="right">2515</td></tr><tr><td>load</td><td align="right">1658</td><td align="right">1254</td><td align="right">1995</td><td align="right">161</td><td align="right">1763</td><td align="right">1917</td></tr><tr><td>domContentLoaded</td><td align="right">1652</td><td align="right">1246</td><td align="right">1980</td><td align="right">160</td><td align="right">1756</td><td align="right">1908</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">62</td><td align="right">11</td><td align="right">13</td><td align="right">47</td></tr><tr><td>firstPaint</td><td align="right">166</td><td align="right">62</td><td align="right">328</td><td align="right">61</td><td align="right">220</td><td align="right">268</td></tr><tr><td>backgroundConnect</td><td align="right">24</td><td align="right">10</td><td align="right">85</td><td align="right">10</td><td align="right">28</td><td align="right">38</td></tr><tr><td>firstReactRender</td><td align="right">157</td><td align="right">44</td><td align="right">357</td><td align="right">107</td><td align="right">290</td><td align="right">340</td></tr><tr><td>getState</td><td align="right">25</td><td align="right">5</td><td align="right">341</td><td align="right">63</td><td align="right">15</td><td align="right">55</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">8</td><td align="right">1</td><td align="right">4</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1648</td><td align="right">1241</td><td align="right">1969</td><td align="right">158</td><td align="right">1753</td><td align="right">1897</td></tr><tr><td>setupStore</td><td align="right">28</td><td align="right">7</td><td align="right">301</td><td align="right">56</td><td align="right">20</td><td align="right">51</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1297</td><td align="right">1121</td><td align="right">1746</td><td align="right">127</td><td align="right">1338</td><td align="right">1570</td></tr><tr><td>load</td><td align="right">1150</td><td align="right">997</td><td align="right">1604</td><td align="right">122</td><td align="right">1199</td><td align="right">1410</td></tr><tr><td>domContentLoaded</td><td align="right">1149</td><td align="right">997</td><td align="right">1604</td><td align="right">122</td><td align="right">1199</td><td align="right">1410</td></tr><tr><td>domInteractive</td><td align="right">97</td><td align="right">37</td><td align="right">411</td><td align="right">44</td><td align="right">104</td><td align="right">151</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">19</td><td align="right">12</td><td align="right">50</td><td align="right">6</td><td align="right">20</td><td align="right">33</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">20</td><td align="right">56</td><td align="right">7</td><td align="right">23</td><td align="right">45</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">4</td><td align="right">166</td><td align="right">16</td><td align="right">8</td><td align="right">14</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1133</td><td align="right">984</td><td align="right">1589</td><td align="right">121</td><td align="right">1183</td><td align="right">1393</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">34</td><td align="right">5</td><td align="right">6</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1514</td><td align="right">1323</td><td align="right">1963</td><td align="right">130</td><td align="right">1594</td><td align="right">1829</td></tr><tr><td>load</td><td align="right">1308</td><td align="right">1146</td><td align="right">1712</td><td align="right">122</td><td align="right">1385</td><td align="right">1535</td></tr><tr><td>domContentLoaded</td><td align="right">1307</td><td align="right">1145</td><td align="right">1712</td><td align="right">122</td><td align="right">1385</td><td align="right">1534</td></tr><tr><td>domInteractive</td><td align="right">84</td><td align="right">56</td><td align="right">313</td><td align="right">35</td><td align="right">89</td><td align="right">132</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">243</td><td align="right">24</td><td align="right">23</td><td align="right">54</td></tr><tr><td>firstReactRender</td><td align="right">38</td><td align="right">26</td><td align="right">52</td><td align="right">5</td><td align="right">41</td><td align="right">44</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">4</td><td align="right">30</td><td align="right">5</td><td align="right">9</td><td align="right">24</td></tr><tr><td>initialActions</td><td align="right">1</td><td align="right">0</td><td align="right">2</td><td align="right">1</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1286</td><td align="right">1125</td><td align="right">1692</td><td align="right">121</td><td align="right">1355</td><td align="right">1508</td></tr><tr><td>setupStore</td><td align="right">10</td><td align="right">5</td><td align="right">230</td><td align="right">22</td><td align="right">8</td><td align="right">17</td></tr></tbody></table>Benchmark value 25 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 2515 exceeds gate value 2454 for chrome webpack home p95 uiStartup<br>
Benchmark value 54 exceeds gate value 49 for firefox webpack home p95 backgroundConnect<br>
<b>Sum of mean exceeds: 0ms | Sum of p95 exceeds: 73ms<br>
Sum of all benchmark exceeds: 73ms</b><br>
</details>

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


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

<details><summary>UI Startup Metrics (1222 ± 74 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">1222</td><td align="right">1077</td><td align="right">1378</td><td align="right">74</td><td align="right">1271</td><td align="right">1366</td></tr><tr><td>load</td><td align="right">1057</td><td align="right">923</td><td align="right">1224</td><td align="right">72</td><td align="right">1109</td><td align="right">1177</td></tr><tr><td>domContentLoaded</td><td align="right">1050</td><td align="right">918</td><td align="right">1222</td><td align="right">73</td><td align="right">1104</td><td align="right">1169</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">37</td><td align="right">4</td><td align="right">16</td><td align="right">29</td></tr><tr><td>firstPaint</td><td align="right">790</td><td align="right">128</td><td align="right">1217</td><td align="right">395</td><td align="right">1086</td><td align="right">1162</td></tr><tr><td>backgroundConnect</td><td align="right">9</td><td align="right">4</td><td align="right">32</td><td align="right">5</td><td align="right">9</td><td align="right">21</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">16</td><td align="right">45</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">29</td><td align="right">7</td><td align="right">20</td><td align="right">25</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">686</td><td align="right">984</td><td align="right">72</td><td align="right">857</td><td align="right">924</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">23</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">2142</td><td align="right">1708</td><td align="right">2607</td><td align="right">198</td><td align="right">2285</td><td align="right">2422</td></tr><tr><td>load</td><td align="right">1651</td><td align="right">1317</td><td align="right">1961</td><td align="right">142</td><td align="right">1750</td><td align="right">1879</td></tr><tr><td>domContentLoaded</td><td align="right">1645</td><td align="right">1314</td><td align="right">1951</td><td align="right">141</td><td align="right">1744</td><td align="right">1872</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">54</td><td align="right">10</td><td align="right">13</td><td align="right">42</td></tr><tr><td>firstPaint</td><td align="right">165</td><td align="right">63</td><td align="right">323</td><td align="right">61</td><td align="right">222</td><td align="right">274</td></tr><tr><td>backgroundConnect</td><td align="right">23</td><td align="right">10</td><td align="right">46</td><td align="right">8</td><td align="right">28</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">153</td><td align="right">44</td><td align="right">352</td><td align="right">109</td><td align="right">280</td><td align="right">335</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">4</td><td align="right">328</td><td align="right">32</td><td align="right">14</td><td align="right">22</td></tr><tr><td>initialActions</td><td align="right">6</td><td align="right">1</td><td align="right">288</td><td align="right">28</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1641</td><td align="right">1309</td><td align="right">1940</td><td align="right">140</td><td align="right">1741</td><td align="right">1868</td></tr><tr><td>setupStore</td><td align="right">39</td><td align="right">6</td><td align="right">334</td><td align="right">78</td><td align="right">20</td><td align="right">305</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1302</td><td align="right">1120</td><td align="right">1800</td><td align="right">152</td><td align="right">1313</td><td align="right">1735</td></tr><tr><td>load</td><td align="right">1148</td><td align="right">978</td><td align="right">1650</td><td align="right">139</td><td align="right">1165</td><td align="right">1580</td></tr><tr><td>domContentLoaded</td><td align="right">1148</td><td align="right">977</td><td align="right">1650</td><td align="right">139</td><td align="right">1165</td><td align="right">1580</td></tr><tr><td>domInteractive</td><td align="right">98</td><td align="right">35</td><td align="right">188</td><td align="right">29</td><td align="right">108</td><td align="right">163</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">72</td><td align="right">9</td><td align="right">23</td><td align="right">36</td></tr><tr><td>firstReactRender</td><td align="right">24</td><td align="right">19</td><td align="right">57</td><td align="right">7</td><td align="right">23</td><td align="right">48</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">4</td><td align="right">191</td><td align="right">20</td><td align="right">8</td><td align="right">26</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1130</td><td align="right">964</td><td align="right">1633</td><td align="right">137</td><td align="right">1150</td><td align="right">1555</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">32</td><td align="right">3</td><td align="right">6</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1518</td><td align="right">1350</td><td align="right">2025</td><td align="right">134</td><td align="right">1616</td><td align="right">1763</td></tr><tr><td>load</td><td align="right">1317</td><td align="right">1163</td><td align="right">1780</td><td align="right">132</td><td align="right">1407</td><td align="right">1539</td></tr><tr><td>domContentLoaded</td><td align="right">1317</td><td align="right">1163</td><td align="right">1779</td><td align="right">132</td><td align="right">1407</td><td align="right">1539</td></tr><tr><td>domInteractive</td><td align="right">75</td><td align="right">34</td><td align="right">146</td><td align="right">16</td><td align="right">81</td><td align="right">112</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">15</td><td align="right">49</td><td align="right">5</td><td align="right">22</td><td align="right">35</td></tr><tr><td>firstReactRender</td><td align="right">40</td><td align="right">28</td><td align="right">54</td><td align="right">5</td><td align="right">43</td><td align="right">47</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">29</td><td align="right">3</td><td align="right">9</td><td align="right">12</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">1298</td><td align="right">1146</td><td align="right">1758</td><td align="right">131</td><td align="right">1388</td><td align="right">1523</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">61</td><td align="right">7</td><td align="right">8</td><td align="right">15</td></tr></tbody></table>Benchmark value 1367 exceeds gate value 1365 for chrome browserify home p95 uiStartup<br>
Benchmark value 21 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 40 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 305 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
Benchmark value 1735 exceeds gate value 1660 for firefox browserify home p95 uiStartup<br>
Benchmark value 1580 exceeds gate value 1495 for firefox browserify home p95 load<br>
Benchmark value 1580 exceeds gate value 1495 for firefox browserify home p95 domContentLoaded<br>
Benchmark value 26 exceeds gate value 24 for firefox browserify home p95 getState<br>
Benchmark value 1555 exceeds gate value 1475 for firefox browserify home p95 loadScripts<br>
Benchmark value 41 exceeds gate value 38 for firefox webpack home mean firstReactRender<br>
<b>Sum of mean exceeds: 11ms | Sum of p95 exceeds: 572ms<br>
Sum of all benchmark exceeds: 583ms</b><br>
</details>

<details><summary>Bundle size diffs [🚨 Warning! Bundle size has increased!]</summary><ul><li>background: 4.64 KiB (0.09%)</li>
<li>ui: 344 Bytes (0%)</li>
<li>common: 44.89 KiB (0.55%)</li></ul></details>


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

<details><summary>UI Startup Metrics (1213 ± 76 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">1059</td><td align="right">1403</td><td align="right">76</td><td align="right">1262</td><td align="right">1362</td></tr><tr><td>load</td><td align="right">1052</td><td align="right">929</td><td align="right">1259</td><td align="right">71</td><td align="right">1105</td><td align="right">1172</td></tr><tr><td>domContentLoaded</td><td align="right">1045</td><td align="right">921</td><td align="right">1249</td><td align="right">71</td><td align="right">1099</td><td align="right">1164</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">48</td><td align="right">5</td><td align="right">16</td><td align="right">28</td></tr><tr><td>firstPaint</td><td align="right">725</td><td align="right">72</td><td align="right">1257</td><td align="right">419</td><td align="right">1063</td><td align="right">1159</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">32</td><td align="right">5</td><td align="right">8</td><td align="right">22</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">16</td><td align="right">41</td><td align="right">4</td><td align="right">20</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">6</td><td align="right">32</td><td align="right">7</td><td align="right">19</td><td align="right">27</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">806</td><td align="right">686</td><td align="right">1002</td><td align="right">70</td><td align="right">856</td><td align="right">920</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">18</td><td align="right">2</td><td align="right">8</td><td align="right">11</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2119</td><td align="right">1723</td><td align="right">2593</td><td align="right">205</td><td align="right">2250</td><td align="right">2469</td></tr><tr><td>load</td><td align="right">1634</td><td align="right">1345</td><td align="right">1975</td><td align="right">155</td><td align="right">1739</td><td align="right">1896</td></tr><tr><td>domContentLoaded</td><td align="right">1628</td><td align="right">1341</td><td align="right">1968</td><td align="right">154</td><td align="right">1733</td><td align="right">1885</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">68</td><td align="right">10</td><td align="right">13</td><td align="right">42</td></tr><tr><td>firstPaint</td><td align="right">163</td><td align="right">64</td><td align="right">322</td><td align="right">55</td><td align="right">203</td><td align="right">271</td></tr><tr><td>backgroundConnect</td><td align="right">25</td><td align="right">10</td><td align="right">334</td><td align="right">32</td><td align="right">26</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">138</td><td align="right">43</td><td align="right">358</td><td align="right">105</td><td align="right">217</td><td align="right">338</td></tr><tr><td>getState</td><td align="right">21</td><td align="right">4</td><td align="right">347</td><td align="right">54</td><td align="right">15</td><td align="right">39</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">12</td><td align="right">1</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1625</td><td align="right">1339</td><td align="right">1957</td><td align="right">152</td><td align="right">1731</td><td align="right">1874</td></tr><tr><td>setupStore</td><td align="right">38</td><td align="right">7</td><td align="right">316</td><td align="right">77</td><td align="right">18</td><td align="right">304</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1312</td><td align="right">1125</td><td align="right">2003</td><td align="right">133</td><td align="right">1363</td><td align="right">1553</td></tr><tr><td>load</td><td align="right">1165</td><td align="right">995</td><td align="right">1573</td><td align="right">116</td><td align="right">1208</td><td align="right">1392</td></tr><tr><td>domContentLoaded</td><td align="right">1164</td><td align="right">994</td><td align="right">1573</td><td align="right">116</td><td align="right">1208</td><td align="right">1392</td></tr><tr><td>domInteractive</td><td align="right">101</td><td align="right">41</td><td align="right">288</td><td align="right">33</td><td align="right">105</td><td align="right">173</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">12</td><td align="right">208</td><td align="right">21</td><td align="right">22</td><td align="right">44</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">20</td><td align="right">60</td><td align="right">6</td><td align="right">23</td><td align="right">28</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">4</td><td align="right">218</td><td align="right">21</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">1146</td><td align="right">982</td><td align="right">1541</td><td align="right">115</td><td align="right">1190</td><td align="right">1370</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">36</td><td align="right">3</td><td align="right">6</td><td align="right">9</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1514</td><td align="right">1329</td><td align="right">2089</td><td align="right">137</td><td align="right">1593</td><td align="right">1802</td></tr><tr><td>load</td><td align="right">1306</td><td align="right">1160</td><td align="right">1755</td><td align="right">119</td><td align="right">1362</td><td align="right">1550</td></tr><tr><td>domContentLoaded</td><td align="right">1305</td><td align="right">1160</td><td align="right">1754</td><td align="right">119</td><td align="right">1362</td><td align="right">1549</td></tr><tr><td>domInteractive</td><td align="right">77</td><td align="right">32</td><td align="right">143</td><td align="right">18</td><td align="right">83</td><td align="right">116</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">23</td><td align="right">14</td><td align="right">234</td><td align="right">23</td><td align="right">21</td><td align="right">41</td></tr><tr><td>firstReactRender</td><td align="right">40</td><td align="right">28</td><td align="right">53</td><td align="right">4</td><td align="right">43</td><td align="right">47</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">5</td><td align="right">216</td><td align="right">22</td><td align="right">9</td><td align="right">31</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">1286</td><td align="right">1146</td><td align="right">1716</td><td align="right">112</td><td align="right">1344</td><td align="right">1523</td></tr><tr><td>setupStore</td><td align="right">10</td><td align="right">5</td><td align="right">212</td><td align="right">21</td><td align="right">8</td><td align="right">15</td></tr></tbody></table>Benchmark value 23 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 38 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 2470 exceeds gate value 2454 for chrome webpack home p95 uiStartup<br>
Benchmark value 304 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
Benchmark value 41 exceeds gate value 38 for firefox webpack home mean firstReactRender<br>
<b>Sum of mean exceeds: 9ms | Sum of p95 exceeds: 260ms<br>
Sum of all benchmark exceeds: 269ms</b><br>
</details>

<details><summary>Bundle size diffs [🚨 Warning! Bundle size has increased!]</summary><ul><li>background: 4.76 KiB (0.09%)</li>
<li>ui: 350 Bytes (0%)</li>
<li>common: 44.75 KiB (0.55%)</li></ul></details>


author_association: COLLABORATOR
user: login: metamaskbot
created_at: 2025-05-28T21:08:58Z
body: <details><summary>Builds ready [2adc168]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds/metamask-chrome-12.18.1.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds-mv2/metamask-firefox-12.18.1.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15310076598/builds-beta/metamask-beta-chrome-12.18.1-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds-flask/metamask-flask-chrome-12.18.1-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.18.1-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds-test/metamask-chrome-12.18.1.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds-test-mv2/metamask-firefox-12.18.1.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds-test-flask/metamask-flask-chrome-12.18.1-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.18.1-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15310076598/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15310076598/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15310076598/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15310076598/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4915669/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/97a3d0c8-8268-4719-b584-65c0a6373d29/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/97a3d0c8-8268-4719-b584-65c0a6373d29/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/97a3d0c8-8268-4719-b584-65c0a6373d29/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1204 ± 62 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1204</td><td align="right">1077</td><td align="right">1388</td><td align="right">62</td><td align="right">1240</td><td align="right">1322</td></tr><tr><td>load</td><td align="right">1043</td><td align="right">934</td><td align="right">1207</td><td align="right">59</td><td align="right">1074</td><td align="right">1165</td></tr><tr><td>domContentLoaded</td><td align="right">1035</td><td align="right">926</td><td align="right">1193</td><td align="right">59</td><td align="right">1069</td><td align="right">1153</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">34</td><td align="right">4</td><td align="right">16</td><td align="right">28</td></tr><tr><td>firstPaint</td><td align="right">725</td><td align="right">86</td><td align="right">1203</td><td align="right">412</td><td align="right">1049</td><td align="right">1129</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">33</td><td align="right">5</td><td align="right">8</td><td align="right">23</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">15</td><td align="right">50</td><td align="right">6</td><td align="right">20</td><td align="right">39</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">5</td><td align="right">49</td><td align="right">8</td><td align="right">20</td><td align="right">33</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">797</td><td align="right">691</td><td align="right">954</td><td align="right">58</td><td align="right">831</td><td align="right">909</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">25</td><td align="right">3</td><td align="right">9</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2226</td><td align="right">1766</td><td align="right">2638</td><td align="right">210</td><td align="right">2376</td><td align="right">2552</td></tr><tr><td>load</td><td align="right">1719</td><td align="right">1373</td><td align="right">2197</td><td align="right">161</td><td align="right">1835</td><td align="right">1959</td></tr><tr><td>domContentLoaded</td><td align="right">1712</td><td align="right">1369</td><td align="right">2191</td><td align="right">160</td><td align="right">1829</td><td align="right">1949</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">12</td><td align="right">65</td><td align="right">11</td><td align="right">14</td><td align="right">44</td></tr><tr><td>firstPaint</td><td align="right">169</td><td align="right">62</td><td align="right">405</td><td align="right">66</td><td align="right">200</td><td align="right">298</td></tr><tr><td>backgroundConnect</td><td align="right">31</td><td align="right">9</td><td align="right">242</td><td align="right">33</td><td align="right">32</td><td align="right">67</td></tr><tr><td>firstReactRender</td><td align="right">155</td><td align="right">45</td><td align="right">363</td><td align="right">107</td><td align="right">291</td><td align="right">336</td></tr><tr><td>getState</td><td align="right">27</td><td align="right">4</td><td align="right">340</td><td align="right">60</td><td align="right">17</td><td align="right">57</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">8</td><td align="right">1</td><td align="right">4</td><td align="right">6</td></tr><tr><td>loadScripts</td><td align="right">1709</td><td align="right">1367</td><td align="right">2189</td><td align="right">159</td><td align="right">1826</td><td align="right">1938</td></tr><tr><td>setupStore</td><td align="right">42</td><td align="right">7</td><td align="right">308</td><td align="right">78</td><td align="right">24</td><td align="right">306</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1359</td><td align="right">1165</td><td align="right">1882</td><td align="right">143</td><td align="right">1419</td><td align="right">1705</td></tr><tr><td>load</td><td align="right">1196</td><td align="right">1034</td><td align="right">1595</td><td align="right">120</td><td align="right">1262</td><td align="right">1458</td></tr><tr><td>domContentLoaded</td><td align="right">1196</td><td align="right">1034</td><td align="right">1595</td><td align="right">120</td><td align="right">1262</td><td align="right">1458</td></tr><tr><td>domInteractive</td><td align="right">106</td><td align="right">37</td><td align="right">677</td><td align="right">72</td><td align="right">114</td><td align="right">182</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">108</td><td align="right">12</td><td align="right">22</td><td align="right">46</td></tr><tr><td>firstReactRender</td><td align="right">26</td><td align="right">21</td><td align="right">66</td><td align="right">9</td><td align="right">24</td><td align="right">54</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">261</td><td align="right">26</td><td align="right">9</td><td align="right">28</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1176</td><td align="right">1020</td><td align="right">1574</td><td align="right">117</td><td align="right">1240</td><td align="right">1435</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">4</td><td align="right">170</td><td align="right">16</td><td align="right">7</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1559</td><td align="right">1322</td><td align="right">2189</td><td align="right">166</td><td align="right">1623</td><td align="right">1908</td></tr><tr><td>load</td><td align="right">1348</td><td align="right">1149</td><td align="right">1764</td><td align="right">144</td><td align="right">1441</td><td align="right">1645</td></tr><tr><td>domContentLoaded</td><td align="right">1348</td><td align="right">1149</td><td align="right">1763</td><td align="right">144</td><td align="right">1441</td><td align="right">1645</td></tr><tr><td>domInteractive</td><td align="right">79</td><td align="right">37</td><td align="right">214</td><td align="right">22</td><td align="right">84</td><td align="right">122</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">245</td><td align="right">29</td><td align="right">23</td><td align="right">40</td></tr><tr><td>firstReactRender</td><td align="right">40</td><td align="right">28</td><td align="right">52</td><td align="right">4</td><td align="right">43</td><td align="right">48</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">5</td><td align="right">244</td><td align="right">25</td><td align="right">9</td><td align="right">32</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">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">1325</td><td align="right">1134</td><td align="right">1736</td><td align="right">137</td><td align="right">1421</td><td align="right">1620</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">5</td><td align="right">68</td><td align="right">7</td><td align="right">8</td><td align="right">20</td></tr></tbody></table>Benchmark value 24 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 2226 exceeds gate value 2192 for chrome webpack home mean uiStartup<br>
Benchmark value 1720 exceeds gate value 1711 for chrome webpack home mean load<br>
Benchmark value 1713 exceeds gate value 1704 for chrome webpack home mean domContentLoaded<br>
Benchmark value 1709 exceeds gate value 1699 for chrome webpack home mean loadScripts<br>
Benchmark value 43 exceeds gate value 32 for chrome webpack home mean setupStore<br>
Benchmark value 2552 exceeds gate value 2454 for chrome webpack home p95 uiStartup<br>
Benchmark value 306 exceeds gate value 65 for chrome webpack home p95 setupStore<br>
Benchmark value 26 exceeds gate value 25 for firefox browserify home mean firstReactRender<br>
Benchmark value 12 exceeds gate value 11 for firefox browserify home mean getState<br>
Benchmark value 1705 exceeds gate value 1660 for firefox browserify home p95 uiStartup<br>
Benchmark value 28 exceeds gate value 24 for firefox browserify home p95 getState<br>
Benchmark value 41 exceeds gate value 38 for firefox webpack home mean firstReactRender<br>
<b>Sum of mean exceeds: 78ms | Sum of p95 exceeds: 394ms<br>
Sum of all benchmark exceeds: 472ms</b><br>
</details>

<details><summary>Bundle size diffs [🚨 Warning! Bundle size has increased!]</summary><ul><li>background: 4.38 KiB (0.08%)</li>
<li>ui: 4.01 KiB (0.06%)</li>
<li>common: 50.11 KiB (0.62%)</li></ul></details>


author_association: COLLABORATOR