Repository: MetaMask/metamask-extension
Pull request #32013: feat: multichain api analytics
Author: login: adonesky1
Labels: name: team-wallet-api-platform-deprecated
description: DEPRECATED: please use "team-wallet-integrations" instead
name: INVALID-PR-TEMPLATE
description: PR's body doesn't match template
name: no-changelog
description: no-changelog Indicates no external facing user changes, therefore no changelog documentation needed
Created: 2025-04-15T19:39:33Z | Merged: 2025-04-21T17:25:22Z

<!--
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?
-->

Adds Multichain API Analytics support:

## `wallet_createSession` -> modify chains to connect in connection flow
https://github.com/user-attachments/assets/5ea24968-d799-4b6f-885e-be005a70c639

## `wallet_invokeMethod (signTypedData_v4)`
https://github.com/user-attachments/assets/a90cfd46-ad60-4104-8bff-699e80538afc

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32013?quickstart=1)

## **Related issues**

Fixes: https://github.com/MetaMask/MetaMask-planning/issues/4440 , https://github.com/MetaMask/MetaMask-planning/issues/4438, https://github.com/MetaMask/MetaMask-planning/issues/4439, https://github.com/MetaMask/MetaMask-planning/issues/4441

## **Manual testing steps**
See videos above fo☝️ al testing tips :point





Diff:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 242cacbc9fec..624f9c30b247 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Fixed
 - Fix NFT removal on different networks ([#32102](https://github.com/MetaMask/metamask-extension/pull/32102))
 - Fix exchange rate lookups on Solana Swap page to prevent crashing when values are undefined ([#32114](https://github.com/MetaMask/metamask-extension/pull/32114))
+- Add Multichain API analytics support ([#32013](https://github.com/MetaMask/metamask-extension/pull/32013))
 
 ## [12.15.2]
 ### Added
diff --git a/app/scripts/controllers/metametrics-controller.test.ts b/app/scripts/controllers/metametrics-controller.test.ts
index 65f1e991dbd6..730d63e01e1f 100644
--- a/app/scripts/controllers/metametrics-controller.test.ts
+++ b/app/scripts/controllers/metametrics-controller.test.ts
@@ -1413,6 +1413,22 @@ describe('MetaMetricsController', function () {
             },
             selectedAccount: 'mock1',
           },
+          multichainNetworkConfigurationsByChainId: {
+            'bip122:000000000019d6689c085ae165831e93': {
+              chainId: 'bip122:000000000019d6689c085ae165831e93',
+              isEvm: false,
+              name: 'Bitcoin Mainnet',
+              nativeCurrency:
+                'bip122:000000000019d6689c085ae165831e93/slip44:0',
+            },
+            'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {
+              chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
+              isEvm: false,
+              name: 'Solana Mainnet',
+              nativeCurrency:
+                'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
+            },
+          },
           ledgerTransportType: LedgerTransportTypes.webhid,
           openSeaEnabled: true,
           useNftDetection: false,
@@ -1464,6 +1480,13 @@ describe('MetaMetricsController', function () {
 
         expect(traits).toStrictEqual({
           [MetaMetricsUserTrait.AddressBookEntries]: 3,
+          [MetaMetricsUserTrait.ChainIdList]: [
+            'eip155:1',
+            'eip155:5',
+            'eip155:175',
+            'bip122:000000000019d6689c085ae165831e93',
+            'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
+          ],
           [MetaMetricsUserTrait.InstallDateExt]: '',
           [MetaMetricsUserTrait.LedgerConnectionType]:
             LedgerTransportTypes.webhid,
@@ -1561,6 +1584,7 @@ describe('MetaMetricsController', function () {
           ///: END:ONLY_INCLUDE_IF
           sessionData: undefined,
           keyrings: [],
+          multichainNetworkConfigurationsByChainId: {},
         });
 
         const updatedTraits = controller._buildUserTraitsObject({
@@ -1633,6 +1657,7 @@ describe('MetaMetricsController', function () {
             },
           },
           keyrings: [],
+          multichainNetworkConfigurationsByChainId: {},
         });
 
         expect(updatedTraits).toStrictEqual({
@@ -1714,6 +1739,7 @@ describe('MetaMetricsController', function () {
             },
           },
           keyrings: [],
+          multichainNetworkConfigurationsByChainId: {},
         });
 
         const updatedTraits = controller._buildUserTraitsObject({
@@ -1776,6 +1802,7 @@ describe('MetaMetricsController', function () {
             },
           },
           keyrings: [],
+          multichainNetworkConfigurationsByChainId: {},
         });
         expect(updatedTraits).toStrictEqual(null);
       });
diff --git a/app/scripts/controllers/metametrics-controller.ts b/app/scripts/controllers/metametrics-controller.ts
index daae9f9bd1c8..62319077dcae 100644
--- a/app/scripts/controllers/metametrics-controller.ts
+++ b/app/scripts/controllers/metametrics-controller.ts
@@ -38,6 +38,7 @@ import {
   ControllerStateChangeEvent,
   RestrictedMessenger,
 } from '@metamask/base-controller';
+import { MultichainNetworkControllerState } from '@metamask/multichain-network-controller';
 import { AddressBookControllerState } from '@metamask/address-book-controller';
 import { AuthenticationControllerState } from '@metamask/profile-sync-controller/auth';
 import { ENVIRONMENT_TYPE_BACKGROUND } from '../../../shared/constants/app';
@@ -179,6 +180,7 @@ export type MetaMaskState = {
   };
   ///: END:ONLY_INCLUDE_IF
   keyrings: { type: string; accounts: string[] }[];
+  multichainNetworkConfigurationsByChainId: MultichainNetworkControllerState['multichainNetworkConfigurationsByChainId'];
 };
 
 /**
@@ -1201,6 +1203,13 @@ export default class MetaMetricsController extends BaseController<
       )
         .filter(({ nativeCurrency }) => !nativeCurrency)
         .map(({ chainId }) => chainId),
+      // caip-2 formatted
+      [MetaMetricsUserTrait.ChainIdList]: [
+        ...Object.keys(metamaskState.networkConfigurationsByChainId).map(
+          (hexChainId) => `eip155:${parseInt(hexChainId, 16)}`,
+        ),
+        ...Object.keys(metamaskState.multichainNetworkConfigurationsByChainId), // the state here is already caip-2 formatted
+      ],
       [MetaMetricsUserTrait.NftAutodetectionEnabled]:
         metamaskState.useNftDetection,
       [MetaMetricsUserTrait.NumberOfAccounts]: Object.values(
diff --git a/app/scripts/lib/createRPCMethodTrackingMiddleware.js b/app/scripts/lib/createRPCMethodTrackingMiddleware.js
index f40f792419ac..4ed3e675282f 100644
--- a/app/scripts/lib/createRPCMethodTrackingMiddleware.js
+++ b/app/scripts/lib/createRPCMethodTrackingMiddleware.js
@@ -6,6 +6,7 @@ import {
   MetaMetricsEventCategory,
   MetaMetricsEventName,
   MetaMetricsEventUiCustomization,
+  MetaMetricsRequestedThrough,
 } from '../../../shared/constants/metametrics';
 import { parseTypedDataMessage } from '../../../shared/modules/transaction.utils';
 
@@ -63,6 +64,7 @@ const RATE_LIMIT_MAP = {
   [MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN]: RATE_LIMIT_TYPES.NON_RATE_LIMITED,
   [MESSAGE_TYPE.ETH_REQUEST_ACCOUNTS]: RATE_LIMIT_TYPES.TIMEOUT,
   [MESSAGE_TYPE.WALLET_REQUEST_PERMISSIONS]: RATE_LIMIT_TYPES.TIMEOUT,
+  [MESSAGE_TYPE.WALLET_CREATE_SESSION]: RATE_LIMIT_TYPES.NON_RATE_LIMITED,
   [MESSAGE_TYPE.SEND_METADATA]: RATE_LIMIT_TYPES.BLOCKED,
   [MESSAGE_TYPE.ETH_CHAIN_ID]: RATE_LIMIT_TYPES.BLOCKED,
   [MESSAGE_TYPE.ETH_ACCOUNTS]: RATE_LIMIT_TYPES.BLOCKED,
@@ -128,6 +130,11 @@ const EVENT_NAME_MAP = {
     REJECTED: MetaMetricsEventName.PermissionsRejected,
     REQUESTED: MetaMetricsEventName.PermissionsRequested,
   },
+  [MESSAGE_TYPE.WALLET_CREATE_SESSION]: {
+    APPROVED: MetaMetricsEventName.PermissionsApproved,
+    REJECTED: MetaMetricsEventName.PermissionsRejected,
+    REQUESTED: MetaMetricsEventName.PermissionsRequested,
+  },
   [MESSAGE_TYPE.WALLET_GET_CALLS_STATUS]: {
     REQUESTED: MetaMetricsEventName.Wallet5792Called,
   },
@@ -152,6 +159,7 @@ const TRANSFORM_PARAMS_MAP = {
 
 const CUSTOM_PROPERTIES_MAP = {
   [MESSAGE_TYPE.WALLET_SEND_CALLS]: getWalletSendCallsProperties,
+  [MESSAGE_TYPE.WALLET_CREATE_SESSION]: getWalletCreateSessionProperties,
 };
 
 const rateLimitTimeoutsByMethod = {};
@@ -163,10 +171,16 @@ let globalRateLimitCount = 0;
  * @param {MetaMetricsController} metaMetricsController
  * @param {OriginalRequest} req
  * @param {Partial<MetaMetricsEventFragment>} fragmentPayload
+ * @param {MetaMetricsEventCategory} eventCategory
  */
-function createSignatureFragment(metaMetricsController, req, fragmentPayload) {
+function createSignatureFragment(
+  metaMetricsController,
+  req,
+  fragmentPayload,
+  eventCategory,
+) {
   metaMetricsController.createEventFragment({
-    category: MetaMetricsEventCategory.InpageProvider,
+    category: eventCategory,
 
     initialEvent: MetaMetricsEventName.SignatureRequested,
     successEvent: MetaMetricsEventName.SignatureApproved,
@@ -205,6 +219,13 @@ function finalizeSignatureFragment(
   );
 }
 
+function isMultichainRequestMethod(method) {
+  return [
+    MESSAGE_TYPE.WALLET_CREATE_SESSION,
+    MESSAGE_TYPE.WALLET_INVOKE_METHOD,
+  ].includes(method);
+}
+
 /**
  * Returns a middleware that tracks inpage_provider usage using sampling for
  * each type of event except those that require user interaction, such as
@@ -248,13 +269,32 @@ export default function createRPCMethodTrackingMiddleware({
   ) {
     const { origin, method, params } = req;
 
-    const rateLimitType = RATE_LIMIT_MAP[method];
+    const isMultichainRequest = isMultichainRequestMethod(method);
+    // requestedThrough and eventCategory are currently redundant so we will want to
+    // disentangle them in the future
+    const requestedThrough = isMultichainRequest
+      ? MetaMetricsRequestedThrough.MultichainApi
+      : MetaMetricsRequestedThrough.EthereumProvider;
+
+    const eventCategory = isMultichainRequest
+      ? MetaMetricsEventCategory.MultichainApi
+      : MetaMetricsEventCategory.InpageProvider;
+
+    let invokedMethod = method;
+    let multichainApiRequestScope;
+    // if the request is through the multichain api, the method is nested in the params
+    if (method === MESSAGE_TYPE.WALLET_INVOKE_METHOD) {
+      invokedMethod = params?.request?.method;
+      multichainApiRequestScope = params?.scope;
+    }
+
+    const rateLimitType = RATE_LIMIT_MAP[invokedMethod];
 
     let isRateLimited;
     switch (rateLimitType) {
       case RATE_LIMIT_TYPES.TIMEOUT:
         isRateLimited =
-          typeof rateLimitTimeoutsByMethod[method] !== 'undefined';
+          typeof rateLimitTimeoutsByMethod[invokedMethod] !== 'undefined';
         break;
       case RATE_LIMIT_TYPES.NON_RATE_LIMITED:
         isRateLimited = false;
@@ -280,9 +320,16 @@ export default function createRPCMethodTrackingMiddleware({
 
     // Get the event type, each of which has APPROVED, REJECTED and REQUESTED
     // keys for the various events in the flow.
-    const eventType = EVENT_NAME_MAP[method];
+    const eventType = EVENT_NAME_MAP[invokedMethod];
+
+    const eventProperties = {
+      requested_through: requestedThrough,
+    };
+
+    if (multichainApiRequestScope) {
+      eventProperties.multichain_api_request_scope = multichainApiRequestScope;
+    }
 
-    const eventProperties = {};
     let sensitiveEventProperties;
 
     // Boolean variable that reduces code duplication and increases legibility
@@ -306,7 +353,7 @@ export default function createRPCMethodTrackingMiddleware({
         : MetaMetricsEventName.ProviderMethodCalled;
 
       if (event === MetaMetricsEventName.SignatureRequested) {
-        eventProperties.signature_type = method;
+        eventProperties.signature_type = invokedMethod;
         eventProperties.hd_entropy_index = getHDEntropyIndex();
 
         // In personal messages the first param is data while in typed messages second param is data
@@ -341,7 +388,7 @@ export default function createRPCMethodTrackingMiddleware({
 
         if (
           shouldUseRedesignForSignatures({
-            approvalType: MESSAGE_TYPE_TO_APPROVAL_TYPE[method],
+            approvalType: MESSAGE_TYPE_TO_APPROVAL_TYPE[invokedMethod],
           })
         ) {
           eventProperties.ui_customizations = [
@@ -361,7 +408,7 @@ export default function createRPCMethodTrackingMiddleware({
         Object.assign(eventProperties, snapAndHardwareInfo);
 
         try {
-          if (method === MESSAGE_TYPE.PERSONAL_SIGN) {
+          if (invokedMethod === MESSAGE_TYPE.PERSONAL_SIGN) {
             const { isSIWEMessage } = detectSIWE({ data });
             if (isSIWEMessage) {
               eventProperties.ui_customizations = [
@@ -369,7 +416,7 @@ export default function createRPCMethodTrackingMiddleware({
                 MetaMetricsEventUiCustomization.Siwe,
               ];
             }
-          } else if (method === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4) {
+          } else if (invokedMethod === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4) {
             const parsedMessageData = parseTypedDataMessage(data);
             sensitiveEventProperties = {};
 
@@ -399,15 +446,15 @@ export default function createRPCMethodTrackingMiddleware({
           console.warn(`createRPCMethodTrackingMiddleware: Errored - ${e}`);
         }
       } else {
-        eventProperties.method = method;
+        eventProperties.method = invokedMethod;
       }
 
-      const transformParams = TRANSFORM_PARAMS_MAP[method];
+      const transformParams = TRANSFORM_PARAMS_MAP[invokedMethod];
       if (transformParams) {
         eventProperties.params = transformParams(params);
       }
 
-      CUSTOM_PROPERTIES_MAP[method]?.(
+      CUSTOM_PROPERTIES_MAP[invokedMethod]?.(
         req,
         undefined,
         STAGE.REQUESTED,
@@ -420,11 +467,16 @@ export default function createRPCMethodTrackingMiddleware({
           sensitiveProperties: sensitiveEventProperties,
         };
 
-        createSignatureFragment(metaMetricsController, req, fragmentPayload);
+        createSignatureFragment(
+          metaMetricsController,
+          req,
+          fragmentPayload,
+          eventCategory,
+        );
       } else {
         metaMetricsController.trackEvent({
           event,
-          category: MetaMetricsEventCategory.InpageProvider,
+          category: eventCategory,
           referrer: {
             url: origin,
           },
@@ -433,8 +485,8 @@ export default function createRPCMethodTrackingMiddleware({
       }
 
       if (rateLimitType === RATE_LIMIT_TYPES.TIMEOUT) {
-        rateLimitTimeoutsByMethod[method] = setTimeout(() => {
-          delete rateLimitTimeoutsByMethod[method];
+        rateLimitTimeoutsByMethod[invokedMethod] = setTimeout(() => {
+          delete rateLimitTimeoutsByMethod[invokedMethod];
         }, rateLimitTimeout);
       }
 
@@ -477,10 +529,10 @@ export default function createRPCMethodTrackingMiddleware({
         return callback();
       }
 
-      CUSTOM_PROPERTIES_MAP[method]?.(req, res, stage, eventProperties);
+      CUSTOM_PROPERTIES_MAP[invokedMethod]?.(req, res, stage, eventProperties);
 
       let blockaidMetricProps = {};
-      if (SIGNING_METHODS.includes(method)) {
+      if (SIGNING_METHODS.includes(invokedMethod)) {
         const securityAlertResponse =
           appStateController.getSignatureSecurityAlertResponse(
             req.securityAlertResponse?.securityAlertId,
@@ -520,7 +572,7 @@ export default function createRPCMethodTrackingMiddleware({
       } else {
         metaMetricsController.trackEvent({
           event,
-          category: MetaMetricsEventCategory.InpageProvider,
+          category: eventCategory,
           referrer: {
             url: origin,
           },
@@ -544,3 +596,27 @@ function getWalletSendCallsProperties(req, _res, stage, eventProperties) {
     eventProperties.batch_transaction_count = callCount;
   }
 }
+
+function getWalletCreateSessionProperties(req, res, stage, eventProperties) {
+  if (stage === STAGE.REQUESTED) {
+    const { params } = req;
+    const requiredScopes = params?.requiredScopes || {};
+    const optionalScopes = params?.optionalScopes || {};
+
+    const scopeSet = new Set();
+
+    for (const key of Object.keys(requiredScopes)) {
+      scopeSet.add(key);
+    }
+
+    for (const key of Object.keys(optionalScopes)) {
+      scopeSet.add(key);
+    }
+
+    eventProperties.chain_id_list = Array.from(scopeSet);
+  } else if (stage === STAGE.APPROVED) {
+    const { result } = res;
+    const scopes = Object.keys(result?.sessionScopes || {});
+    eventProperties.chain_id_list = scopes;
+  }
+}
diff --git a/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js b/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js
index e7b04b63b37f..92d7303c0b68 100644
--- a/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js
+++ b/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js
@@ -8,6 +8,7 @@ import {
   MetaMetricsEventCategory,
   MetaMetricsEventName,
   MetaMetricsEventUiCustomization,
+  MetaMetricsRequestedThrough,
 } from '../../../shared/constants/metametrics';
 import { SECOND } from '../../../shared/constants/time';
 import {
@@ -239,6 +240,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         category: MetaMetricsEventCategory.InpageProvider,
         event: MetaMetricsEventName.SignatureRequested,
         properties: {
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
           signature_type: MESSAGE_TYPE.PERSONAL_SIGN,
           security_alert_response: BlockaidResultType.Malicious,
           security_alert_reason: BlockaidReason.maliciousDomain,
@@ -320,6 +322,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
           security_alert_reason: BlockaidReason.maliciousDomain,
           ppom_eth_call_count: 5,
           ppom_eth_getCode_count: 3,
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
           ui_customizations: [
             MetaMetricsEventUiCustomization.RedesignedConfirmation,
           ],
@@ -350,6 +353,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         event: MetaMetricsEventName.SignatureApproved,
         properties: {
           signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
         },
         sensitiveProperties: {
           eip712_verifyingContract:
@@ -384,6 +388,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         category: MetaMetricsEventCategory.InpageProvider,
         event: MetaMetricsEventName.SignatureRejected,
         properties: {
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
           signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
         },
         sensitiveProperties: {
@@ -418,6 +423,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         category: MetaMetricsEventCategory.InpageProvider,
         event: MetaMetricsEventName.SignatureRejected,
         properties: {
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
           signature_type: MESSAGE_TYPE.PERSONAL_SIGN,
           location: 'some_location',
         },
@@ -441,7 +447,10 @@ describe('createRPCMethodTrackingMiddleware', () => {
       expect(trackEventSpy.mock.calls[1][0]).toMatchObject({
         category: MetaMetricsEventCategory.InpageProvider,
         event: MetaMetricsEventName.PermissionsApproved,
-        properties: { method: MESSAGE_TYPE.ETH_REQUEST_ACCOUNTS },
+        properties: {
+          method: MESSAGE_TYPE.ETH_REQUEST_ACCOUNTS,
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
+        },
         referrer: { url: 'some.dapp' },
       });
     });
@@ -676,6 +685,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         event: MetaMetricsEventName.SignatureApproved,
         properties: {
           signature_type: MESSAGE_TYPE.PERSONAL_SIGN,
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
         },
         referrer: { url: 'some.dapp' },
       });
@@ -761,6 +771,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         category: MetaMetricsEventCategory.InpageProvider,
         event: MetaMetricsEventName.SignatureApproved,
         properties: {
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
           signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
           ui_customizations: [
             MetaMetricsEventUiCustomization.RedesignedConfirmation,
@@ -795,6 +806,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         category: MetaMetricsEventCategory.InpageProvider,
         event: MetaMetricsEventName.SignatureApproved,
         properties: {
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
           signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
           eip712_primary_type: 'Unknown',
           ui_customizations: [
@@ -826,6 +838,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
           category: MetaMetricsEventCategory.InpageProvider,
           event: MetaMetricsEventName.SignatureRequested,
           properties: {
+            requested_through: MetaMetricsRequestedThrough.EthereumProvider,
             signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
           },
           sensitiveProperties: {
@@ -960,6 +973,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         {
           batch_transaction_count: 2,
           method: MESSAGE_TYPE.WALLET_SEND_CALLS,
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
         },
       ],
       [
@@ -968,6 +982,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         ['0x123'],
         {
           method: MESSAGE_TYPE.WALLET_GET_CALLS_STATUS,
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
         },
       ],
       [
@@ -976,6 +991,7 @@ describe('createRPCMethodTrackingMiddleware', () => {
         ['0x123'],
         {
           method: MESSAGE_TYPE.WALLET_GET_CAPABILITIES,
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
         },
       ],
     ])(
@@ -1004,5 +1020,161 @@ describe('createRPCMethodTrackingMiddleware', () => {
         );
       },
     );
+    describe('Multichain API requests', () => {
+      beforeEach(() => {
+        metaMetricsController.setParticipateInMetaMetrics(true);
+      });
+
+      it('should track `wallet_createSession` events with multichain category and properties', async () => {
+        const req = {
+          id: MOCK_ID,
+          method: MESSAGE_TYPE.WALLET_CREATE_SESSION,
+          origin: 'multichain.dapp',
+          params: {
+            requiredScopes: {
+              'eip155:1': { eth_accounts: {} },
+              'eip155:137': { eth_accounts: {} },
+            },
+            optionalScopes: {
+              'eip155:56': { eth_accounts: {} },
+            },
+          },
+        };
+
+        const res = {
+          result: {
+            sessionScopes: {
+              'eip155:1': {},
+              'eip155:137': {},
+            },
+          },
+        };
+        const { next, executeMiddlewareStack } = getNext();
+        const handler = createHandler();
+        await handler(req, res, next);
+        expect(trackEventSpy).toHaveBeenCalledTimes(1);
+
+        expect(trackEventSpy.mock.calls[0][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.PermissionsRequested,
+          properties: {
+            method: MESSAGE_TYPE.WALLET_CREATE_SESSION,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            chain_id_list: expect.arrayContaining([
+              'eip155:1',
+              'eip155:137',
+              'eip155:56',
+            ]),
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+        await executeMiddlewareStack();
+        expect(trackEventSpy).toHaveBeenCalledTimes(2);
+
+        expect(trackEventSpy.mock.calls[1][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.PermissionsApproved,
+          properties: {
+            method: MESSAGE_TYPE.WALLET_CREATE_SESSION,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            chain_id_list: expect.arrayContaining(['eip155:1', 'eip155:137']),
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+      });
+
+      it('should track wallet_invokeMethod events with multichain_api category, requested_through, and multichain_api_request_scope properties', async () => {
+        const req = {
+          id: MOCK_ID,
+          method: MESSAGE_TYPE.WALLET_INVOKE_METHOD,
+          origin: 'multichain.dapp',
+          params: {
+            request: {
+              method: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
+              params: [],
+            },
+            scope: 'eip155:10',
+          },
+        };
+
+        const res = {};
+        const { next, executeMiddlewareStack } = getNext();
+        const handler = createHandler();
+        await handler(req, res, next);
+        await executeMiddlewareStack();
+
+        expect(trackEventSpy).toHaveBeenCalledTimes(2);
+        expect(trackEventSpy.mock.calls[0][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.SignatureRequested,
+          properties: {
+            signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            multichain_api_request_scope: 'eip155:10',
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+
+        expect(trackEventSpy.mock.calls[1][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.SignatureApproved,
+          properties: {
+            signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            multichain_api_request_scope: 'eip155:10',
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+      });
+
+      it('should track wallet_invokeMethod rejections with multichain_api category, requested_through, and multichain_api_request_scope properties', async () => {
+        const req = {
+          id: MOCK_ID,
+          method: MESSAGE_TYPE.WALLET_INVOKE_METHOD,
+          origin: 'multichain.dapp',
+          params: {
+            request: {
+              method: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
+              params: [],
+            },
+            scope: 'eip155:137',
+          },
+        };
+
+        const res = {
+          error: {
+            code: errorCodes.provider.userRejectedRequest,
+          },
+        };
+
+        const { next, executeMiddlewareStack } = getNext();
+        const handler = createHandler();
+        await handler(req, res, next);
+        await executeMiddlewareStack();
+
+        expect(trackEventSpy).toHaveBeenCalledTimes(2);
+        expect(trackEventSpy.mock.calls[0][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.SignatureRequested,
+          properties: {
+            signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            multichain_api_request_scope: 'eip155:137',
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+
+        expect(trackEventSpy.mock.calls[1][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.SignatureRejected,
+          properties: {
+            signature_type: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            multichain_api_request_scope: 'eip155:137',
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+      });
+    });
   });
 });
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index aabf6c15f9eb..3fa9c0245d57 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -7094,6 +7094,25 @@ export default class MetamaskController extends EventEmitter {
       return next();
     });
 
+    engine.push(
+      createRPCMethodTrackingMiddleware({
+        getAccountType: this.getAccountType.bind(this),
+        getDeviceModel: this.getDeviceModel.bind(this),
+        getHDEntropyIndex: this.getHDEntropyIndex.bind(this),
+        getHardwareTypeForMetric: this.getHardwareTypeForMetric.bind(this),
+        snapAndHardwareMessenger: this.controllerMessenger.getRestricted({
+          name: 'SnapAndHardwareMessenger',
+          allowedActions: [
+            'KeyringController:getKeyringForAccount',
+            'SnapController:get',
+            'AccountsController:getSelectedAccount',
+          ],
+        }),
+        appStateController: this.appStateController,
+        metaMetricsController: this.metaMetricsController,
+      }),
+    );
+
     engine.push(multichainMethodCallValidatorMiddleware);
     const middlewareMaker = makeMethodMiddlewareMaker([
       walletRevokeSession,
diff --git a/shared/constants/metametrics.ts b/shared/constants/metametrics.ts
index ddb4a9df1496..e6bce62902cf 100644
--- a/shared/constants/metametrics.ts
+++ b/shared/constants/metametrics.ts
@@ -614,6 +614,10 @@ export enum MetaMetricsUserTrait {
    * Identified when the user signs in
    */
   ProfileId = 'profile_id',
+  /**
+   * Identified when the user adds or removes configured chains (evm or non-evm)
+   */
+  ChainIdList = 'chain_id_list',
 }
 
 /**
@@ -947,6 +951,7 @@ export enum MetaMetricsEventCategory {
   Footer = 'Footer',
   Home = 'Home',
   InpageProvider = 'inpage_provider',
+  MultichainApi = 'multichain_api',
   Keys = 'Keys',
   Messages = 'Messages',
   Navigation = 'Navigation',
@@ -1020,6 +1025,11 @@ export enum MetaMetricsTransactionEventSource {
   User = 'user',
 }
 
+export enum MetaMetricsRequestedThrough {
+  EthereumProvider = 'ethereum_provider',
+  MultichainApi = 'multichain_api',
+}
+
 export enum MetaMetricsEventLocation {
   AlertFrictionModal = 'alert_friction_modal',
   Confirmation = 'confirmation',
diff --git a/test/e2e/tests/confirmations/signatures/malicious-signatures.spec.ts b/test/e2e/tests/confirmations/signatures/malicious-signatures.spec.ts
index 22ad00c977eb..4ae34f71a576 100644
--- a/test/e2e/tests/confirmations/signatures/malicious-signatures.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/malicious-signatures.spec.ts
@@ -14,6 +14,7 @@ import {
   BlockaidReason,
   BlockaidResultType,
 } from '../../../../../shared/constants/security-provider';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 import {
   assertRejectedSignature,
   assertSignatureRejectedMetrics,
@@ -22,7 +23,6 @@ import {
   openDappAndTriggerSignature,
   SignatureType,
 } from './signature-helpers';
-
 describe('Malicious Confirmation Signature - Bad Domain', function (this: Suite) {
   it('displays alert for domain binding and confirms', async function () {
     await withTransactionEnvelopeTypeFixtures(
@@ -91,6 +91,7 @@ describe('Malicious Confirmation Signature - Bad Domain', function (this: Suite)
           },
           securityAlertReason: BlockaidReason.notApplicable,
           securityAlertResponse: BlockaidResultType.NotApplicable,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
       mockSignatureRejected,
@@ -141,6 +142,7 @@ describe('Malicious Confirmation Signature - Bad Domain', function (this: Suite)
           },
           securityAlertReason: BlockaidReason.notApplicable,
           securityAlertResponse: BlockaidResultType.NotApplicable,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
       mockSignatureRejected,
diff --git a/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts b/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts
index cc83087b8c3a..63718d1ab62c 100644
--- a/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts
@@ -25,6 +25,7 @@ import {
   SignatureType,
   triggerSignature,
 } from './signature-helpers';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 
 describe('Confirmation Signature - NFT Permit', function (this: Suite) {
   it('initiates and confirms and emits the correct events', async function () {
@@ -74,6 +75,7 @@ describe('Confirmation Signature - NFT Permit', function (this: Suite) {
           decodingChangeTypes: ['LISTING', 'RECEIVE'],
           decodingResponse: 'CHANGE',
           decodingDescription: null,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
 
         await assertVerifiedResults(driver, publicAddress);
@@ -118,6 +120,7 @@ describe('Confirmation Signature - NFT Permit', function (this: Suite) {
           decodingChangeTypes: ['LISTING', 'RECEIVE'],
           decodingResponse: 'CHANGE',
           decodingDescription: null,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
       mockSignatureRejectedWithDecoding,
diff --git a/test/e2e/tests/confirmations/signatures/permit.spec.ts b/test/e2e/tests/confirmations/signatures/permit.spec.ts
index 2a0161aa01bc..f2ccd67abd7f 100644
--- a/test/e2e/tests/confirmations/signatures/permit.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/permit.spec.ts
@@ -28,6 +28,7 @@ import {
   openDappAndTriggerSignature,
   SignatureType,
 } from './signature-helpers';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 
 describe('Confirmation Signature - Permit', function (this: Suite) {
   it('initiates and confirms and emits the correct events', async function () {
@@ -71,6 +72,7 @@ describe('Confirmation Signature - Permit', function (this: Suite) {
           decodingChangeTypes: ['LISTING', 'RECEIVE'],
           decodingResponse: 'CHANGE',
           decodingDescription: null,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
 
         await assertVerifiedResults(driver, publicAddress);
@@ -110,6 +112,7 @@ describe('Confirmation Signature - Permit', function (this: Suite) {
           decodingChangeTypes: ['LISTING', 'RECEIVE'],
           decodingResponse: 'CHANGE',
           decodingDescription: null,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
       mockSignatureRejectedWithDecoding,
diff --git a/test/e2e/tests/confirmations/signatures/personal-sign.spec.ts b/test/e2e/tests/confirmations/signatures/personal-sign.spec.ts
index c941a419e493..7edccde28ef3 100644
--- a/test/e2e/tests/confirmations/signatures/personal-sign.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/personal-sign.spec.ts
@@ -25,6 +25,7 @@ import {
   openDappAndTriggerSignature,
   SignatureType,
 } from './signature-helpers';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 
 describe('Confirmation Signature - Personal Sign', function (this: Suite) {
   it('initiates and confirms', async function () {
@@ -63,6 +64,7 @@ describe('Confirmation Signature - Personal Sign', function (this: Suite) {
           driver,
           mockedEndpoints: mockedEndpoints as MockedEndpoint[],
           signatureType: 'personal_sign',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
       mockSignatureApproved,
@@ -93,6 +95,7 @@ describe('Confirmation Signature - Personal Sign', function (this: Suite) {
           mockedEndpoints: mockedEndpoints as MockedEndpoint[],
           signatureType: 'personal_sign',
           location: 'confirmation',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
       mockSignatureRejected,
diff --git a/test/e2e/tests/confirmations/signatures/sign-typed-data-v3.spec.ts b/test/e2e/tests/confirmations/signatures/sign-typed-data-v3.spec.ts
index 70282a739434..b7dc18d95eea 100644
--- a/test/e2e/tests/confirmations/signatures/sign-typed-data-v3.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/sign-typed-data-v3.spec.ts
@@ -25,6 +25,7 @@ import {
   openDappAndTriggerSignature,
   SignatureType,
 } from './signature-helpers';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 
 describe('Confirmation Signature - Sign Typed Data V3', function (this: Suite) {
   it('initiates and confirms', async function () {
@@ -65,6 +66,7 @@ describe('Confirmation Signature - Sign Typed Data V3', function (this: Suite) {
           driver,
           mockedEndpoints: mockedEndpoints as MockedEndpoint[],
           signatureType: 'eth_signTypedData_v3',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
         await assertVerifiedResults(driver, publicAddress);
       },
@@ -95,6 +97,7 @@ describe('Confirmation Signature - Sign Typed Data V3', function (this: Suite) {
           mockedEndpoints: mockedEndpoints as MockedEndpoint[],
           signatureType: 'eth_signTypedData_v3',
           location: 'confirmation',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
 
         await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp);
diff --git a/test/e2e/tests/confirmations/signatures/sign-typed-data-v4.spec.ts b/test/e2e/tests/confirmations/signatures/sign-typed-data-v4.spec.ts
index 8f210e1dcefb..924298ccf66a 100644
--- a/test/e2e/tests/confirmations/signatures/sign-typed-data-v4.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/sign-typed-data-v4.spec.ts
@@ -27,6 +27,7 @@ import {
   openDappAndTriggerSignature,
   SignatureType,
 } from './signature-helpers';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 
 describe('Confirmation Signature - Sign Typed Data V4', function (this: Suite) {
   it('initiates and confirms', async function () {
@@ -68,6 +69,7 @@ describe('Confirmation Signature - Sign Typed Data V4', function (this: Suite) {
           signatureType: 'eth_signTypedData_v4',
           primaryType: 'Mail',
           withAnonEvents: true,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
 
         await assertVerifiedResults(driver, publicAddress);
@@ -102,6 +104,7 @@ describe('Confirmation Signature - Sign Typed Data V4', function (this: Suite) {
           signatureType: 'eth_signTypedData_v4',
           primaryType: 'Mail',
           location: 'confirmation',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
 
         await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp);
diff --git a/test/e2e/tests/confirmations/signatures/sign-typed-data.spec.ts b/test/e2e/tests/confirmations/signatures/sign-typed-data.spec.ts
index ae3701475e7d..819b13b6eed7 100644
--- a/test/e2e/tests/confirmations/signatures/sign-typed-data.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/sign-typed-data.spec.ts
@@ -24,6 +24,7 @@ import {
   openDappAndTriggerSignature,
   SignatureType,
 } from './signature-helpers';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 
 describe('Confirmation Signature - Sign Typed Data', function (this: Suite) {
   it('initiates and confirms', async function () {
@@ -62,6 +63,7 @@ describe('Confirmation Signature - Sign Typed Data', function (this: Suite) {
           driver,
           mockedEndpoints: mockedEndpoints as MockedEndpoint[],
           signatureType: 'eth_signTypedData',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
 
         await assertVerifiedResults(driver, publicAddress);
@@ -90,6 +92,7 @@ describe('Confirmation Signature - Sign Typed Data', function (this: Suite) {
           mockedEndpoints: mockedEndpoints as MockedEndpoint[],
           signatureType: 'eth_signTypedData',
           location: 'confirmation',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
 
         await driver.waitUntilXWindowHandles(2);
diff --git a/test/e2e/tests/confirmations/signatures/signature-helpers.ts b/test/e2e/tests/confirmations/signatures/signature-helpers.ts
index fad38a1e5c02..96c51ed41129 100644
--- a/test/e2e/tests/confirmations/signatures/signature-helpers.ts
+++ b/test/e2e/tests/confirmations/signatures/signature-helpers.ts
@@ -44,6 +44,7 @@ type AssertSignatureMetricsOptions = {
   decodingChangeTypes?: string[];
   decodingResponse?: string;
   decodingDescription?: string | null;
+  requestedThrough?: string;
 };
 
 type SignatureEventProperty = {
@@ -63,6 +64,7 @@ type SignatureEventProperty = {
   ui_customizations?: string[];
   location?: string;
   hd_entropy_index?: number;
+  requested_through?: string;
 };
 
 const signatureAnonProperties = {
@@ -102,6 +104,7 @@ function getSignatureEventProperty(
   decodingChangeTypes?: string[],
   decodingResponse?: string,
   decodingDescription?: string | null,
+  requestedThrough?: string,
 ): SignatureEventProperty {
   const signatureEventProperty: SignatureEventProperty = {
     account_type: 'MetaMask',
@@ -115,6 +118,7 @@ function getSignatureEventProperty(
     security_alert_source: securityAlertSource,
     ui_customizations: uiCustomizations,
     hd_entropy_index: 0,
+    requested_through: requestedThrough,
   };
 
   if (primaryType !== '') {
@@ -163,6 +167,7 @@ export async function assertSignatureConfirmedMetrics({
   decodingChangeTypes,
   decodingResponse,
   decodingDescription,
+  requestedThrough,
 }: AssertSignatureMetricsOptions) {
   const events = await getEventPayloads(driver, mockedEndpoints);
   const signatureEventProperty = getSignatureEventProperty(
@@ -175,6 +180,7 @@ export async function assertSignatureConfirmedMetrics({
     decodingChangeTypes,
     decodingResponse,
     decodingDescription,
+    requestedThrough,
   );
 
   assertSignatureRequestedMetrics(
@@ -212,6 +218,7 @@ export async function assertSignatureRejectedMetrics({
   decodingChangeTypes,
   decodingResponse,
   decodingDescription,
+  requestedThrough,
 }: AssertSignatureMetricsOptions) {
   const events = await getEventPayloads(driver, mockedEndpoints);
   const signatureEventProperty = getSignatureEventProperty(
@@ -224,6 +231,7 @@ export async function assertSignatureRejectedMetrics({
     decodingChangeTypes,
     decodingResponse,
     decodingDescription,
+    requestedThrough,
   );
 
   assertSignatureRequestedMetrics(
diff --git a/test/e2e/tests/confirmations/signatures/siwe.spec.ts b/test/e2e/tests/confirmations/signatures/siwe.spec.ts
index a6b19356888a..cf6bdc670783 100644
--- a/test/e2e/tests/confirmations/signatures/siwe.spec.ts
+++ b/test/e2e/tests/confirmations/signatures/siwe.spec.ts
@@ -29,6 +29,7 @@ import {
   openDappAndTriggerSignature,
   SignatureType,
 } from './signature-helpers';
+import { MetaMetricsRequestedThrough } from '../../../../../shared/constants/metametrics';
 
 describe('Confirmation Signature - SIWE', function (this: Suite) {
   it('initiates and confirms', async function () {
@@ -78,6 +79,7 @@ describe('Confirmation Signature - SIWE', function (this: Suite) {
           ],
           securityAlertReason: BlockaidReason.notApplicable,
           securityAlertResponse: BlockaidResultType.NotApplicable,
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
       mockSignatureApproved,
@@ -110,6 +112,7 @@ describe('Confirmation Signature - SIWE', function (this: Suite) {
             'sign_in_with_ethereum',
           ],
           location: 'confirmation',
+          requestedThrough: MetaMetricsRequestedThrough.EthereumProvider,
           securityAlertReason: BlockaidReason.notApplicable,
           securityAlertResponse: BlockaidResultType.NotApplicable,
         });
diff --git a/test/e2e/tests/metrics/permissions-approved.spec.js b/test/e2e/tests/metrics/permissions-approved.spec.js
index 86033747344c..f8543c07c390 100644
--- a/test/e2e/tests/metrics/permissions-approved.spec.js
+++ b/test/e2e/tests/metrics/permissions-approved.spec.js
@@ -6,7 +6,9 @@ const {
   getEventPayloads,
 } = require('../../helpers');
 const FixtureBuilder = require('../../fixture-builder');
-
+const {
+  MetaMetricsRequestedThrough,
+} = require('../../../../shared/constants/metametrics');
 /**
  * mocks the segment api multiple times for specific payloads that we expect to
  * see when these tests are run. In this case we are looking for
@@ -67,6 +69,7 @@ describe('Permissions Approved Event', function () {
           locale: 'en',
           chain_id: '0x539',
           environment_type: 'background',
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
         });
         assert.deepStrictEqual(events[1].properties, {
           method: 'eth_requestAccounts',
@@ -74,6 +77,7 @@ describe('Permissions Approved Event', function () {
           locale: 'en',
           chain_id: '0x539',
           environment_type: 'background',
+          requested_through: MetaMetricsRequestedThrough.EthereumProvider,
         });
       },
     );
diff --git a/test/e2e/tests/metrics/signature-approved.spec.js b/test/e2e/tests/metrics/signature-approved.spec.js
index 8759f043f16e..b54a49dc9f6e 100644
--- a/test/e2e/tests/metrics/signature-approved.spec.js
+++ b/test/e2e/tests/metrics/signature-approved.spec.js
@@ -10,7 +10,9 @@ const {
 } = require('../../helpers');
 const FixtureBuilder = require('../../fixture-builder');
 const { MOCK_META_METRICS_ID } = require('../../constants');
-
+const {
+  MetaMetricsRequestedThrough,
+} = require('../../../../shared/constants/metametrics');
 /**
  * mocks the segment api multiple times for specific payloads that we expect to
  * see when these tests are run. In this case we are looking for
@@ -55,6 +57,7 @@ const expectedEventPropertiesBase = {
   security_alert_reason: 'validation_in_progress',
   security_alert_response: 'loading',
   ui_customizations: ['redesigned_confirmation'],
+  requested_through: MetaMetricsRequestedThrough.EthereumProvider,
 };
 
 describe('Signature Approved Event', function () {


Reviews:
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-17T22:01:50Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-17T22:07:57Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-17T22:14:19Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-17T22:23:22Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-18T18:16:39Z
user: login: jiexi
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-04-18T18:24:28Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-18T21:47:24Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-18T22:37:27Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-18T22:39:14Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-18T22:41:45Z
user: login: adonesky1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-21T15:05:51Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-21T15:48:54Z
user: login: jiexi
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-21T15:58:22Z
user: login: ffmcgee725
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-21T16:19:34Z

Review comments:
diff_hunk: @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Changes in account modal to switch to smart account type ([#31899](https://github.com/MetaMask/metamask-extension/pull/31899))
 - Support for Solana Devnet ([#31702](https://github.com/MetaMask/metamask-extension/pull/31702))
 - [Beta] Create Solana account automatically on wallet creation or SRP import [#32038](https://github.com/MetaMask/metamask-extension/pull/32038)
+- Add Multichain API analytics support ([#32013](https://github.com/MetaMask/metamask-extension/pull/32013))
path: CHANGELOG.md
user: login: jiexi
body: this isn't user facing
created_at: 2025-04-17T22:01:50Z
author_association: MEMBER
diff_hunk: @@ -63,6 +64,7 @@ const RATE_LIMIT_MAP = {
   [MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN]: RATE_LIMIT_TYPES.NON_RATE_LIMITED,
   [MESSAGE_TYPE.ETH_REQUEST_ACCOUNTS]: RATE_LIMIT_TYPES.TIMEOUT,
   [MESSAGE_TYPE.WALLET_REQUEST_PERMISSIONS]: RATE_LIMIT_TYPES.TIMEOUT,
+  [MESSAGE_TYPE.WALLET_CREATE_SESSION]: RATE_LIMIT_TYPES.NON_RATE_LIMITED, // TODO: should this be timeout?
path: app/scripts/lib/createRPCMethodTrackingMiddleware.js
user: login: jiexi
body: probably, to match wallet_requestPermissions right above it.
created_at: 2025-04-17T22:07:57Z
author_association: MEMBER
path: app/scripts/lib/createRPCMethodTrackingMiddleware.js
user: login: jiexi
body: we may need to track which scope wallet_invokeMethod is called with. I don't think this can be implied by other events/metrics any longer like it could with EVM
created_at: 2025-04-17T22:14:19Z
author_association: MEMBER
path: app/scripts/lib/createRPCMethodTrackingMiddleware.js
user: login: adonesky1
body: good shoutout. The `wallet_invokeMethod` part wasn't actually part of the initial scope of tickets, I just included it as a pass through, but I think we should include this here
created_at: 2025-04-17T22:23:22Z
author_association: CONTRIBUTOR
path: app/scripts/lib/createRPCMethodTrackingMiddleware.js
user: login: adonesky1
body: I've added this [here](https://github.com/MetaMask/metamask-extension/pull/32013/files#diff-e78ba84d4b27f8a33233149f7c076f773341ab940a409651508f75a2af6e67eeR288) and [here](https://github.com/MetaMask/metamask-extension/pull/32013/files#diff-e78ba84d4b27f8a33233149f7c076f773341ab940a409651508f75a2af6e67eeR335-R337) to this new property `multichain_api_request_scope` which I've made up. Will ask @vandan what he thinks
created_at: 2025-04-18T18:16:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Changes in account modal to switch to smart account type ([#31899](https://github.com/MetaMask/metamask-extension/pull/31899))
 - Support for Solana Devnet ([#31702](https://github.com/MetaMask/metamask-extension/pull/31702))
 - [Beta] Create Solana account automatically on wallet creation or SRP import [#32038](https://github.com/MetaMask/metamask-extension/pull/32038)
+- Add Multichain API analytics support ([#32013](https://github.com/MetaMask/metamask-extension/pull/32013))
path: CHANGELOG.md
user: login: adonesky1
body: removed
created_at: 2025-04-18T21:47:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Changes in account modal to switch to smart account type ([#31899](https://github.com/MetaMask/metamask-extension/pull/31899))
 - Support for Solana Devnet ([#31702](https://github.com/MetaMask/metamask-extension/pull/31702))
 - [Beta] Create Solana account automatically on wallet creation or SRP import [#32038](https://github.com/MetaMask/metamask-extension/pull/32038)
+- Add Multichain API analytics support ([#32013](https://github.com/MetaMask/metamask-extension/pull/32013))
path: CHANGELOG.md
user: login: jiexi
body: it's still here
created_at: 2025-04-18T22:37:27Z
author_association: MEMBER
diff_hunk: @@ -248,13 +269,32 @@ export default function createRPCMethodTrackingMiddleware({
   ) {
     const { origin, method, params } = req;
 
-    const rateLimitType = RATE_LIMIT_MAP[method];
+    const isMultichainRequest = isMultichainRequestMethod(method);
+    // requestedThrough and eventCategory are currently redundant so we will want to
+    // disentangle them in the future
+    const requestedThrough = isMultichainRequest
+      ? MetaMetricsRequestedThrough.MultichainApi
+      : MetaMetricsRequestedThrough.EthereumProvider;
+
+    const eventCategory = isMultichainRequest
+      ? MetaMetricsEventCategory.MultichainApi
+      : MetaMetricsEventCategory.InpageProvider;
+
+    let invokedMethod = method;
+    let multichainApiRequestScope;
+    // if the request is through the multichain api, the method is nested in the params
+    if (method === MESSAGE_TYPE.WALLET_INVOKE_METHOD) {
+      invokedMethod = params?.request?.method;
+      multichainApiRequestScope = params?.scope;
+    }
+
+    const rateLimitType = RATE_LIMIT_MAP[invokedMethod];
 
     let isRateLimited;
     switch (rateLimitType) {
       case RATE_LIMIT_TYPES.TIMEOUT:
         isRateLimited =
-          typeof rateLimitTimeoutsByMethod[method] !== 'undefined';
+          typeof rateLimitTimeoutsByMethod[invokedMethod] !== 'undefined';
path: app/scripts/lib/createRPCMethodTrackingMiddleware.js
user: login: jiexi
body: i know this was `'undefined'` before, but why lol. and is this correct even
created_at: 2025-04-18T22:39:14Z
author_association: MEMBER
diff_hunk: @@ -1004,5 +1020,157 @@ describe('createRPCMethodTrackingMiddleware', () => {
         );
       },
     );
+    describe('Multichain API requests', () => {
+      beforeEach(() => {
+        metaMetricsController.setParticipateInMetaMetrics(true);
+      });
+
+      it('should track `wallet_createSession` events with multichain category and properties', async () => {
+        const req = {
+          id: MOCK_ID,
+          method: MESSAGE_TYPE.WALLET_CREATE_SESSION,
+          origin: 'multichain.dapp',
+          params: {
+            requiredScopes: {
+              'eip155:1': { eth_accounts: {} },
+              'eip155:137': { eth_accounts: {} },
+            },
+            optionalScopes: {
+              'eip155:56': { eth_accounts: {} },
+            },
+          },
+        };
+
+        const res = {
+          result: {
+            sessionScopes: {
+              'eip155:1': {},
+              'eip155:137': {},
+            },
+          },
+        };
+        const { next, executeMiddlewareStack } = getNext();
+        const handler = createHandler();
+        await handler(req, res, next);
+        expect(trackEventSpy).toHaveBeenCalledTimes(1);
+
+        expect(trackEventSpy.mock.calls[0][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.PermissionsRequested,
+          properties: {
+            method: MESSAGE_TYPE.WALLET_CREATE_SESSION,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            chain_id_list: expect.arrayContaining([
+              'eip155:1',
+              'eip155:137',
+              'eip155:56',
+            ]),
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+        await executeMiddlewareStack();
+        expect(trackEventSpy).toHaveBeenCalledTimes(2);
+
+        expect(trackEventSpy.mock.calls[1][0]).toMatchObject({
+          category: MetaMetricsEventCategory.MultichainApi,
+          event: MetaMetricsEventName.PermissionsApproved,
+          properties: {
+            method: MESSAGE_TYPE.WALLET_CREATE_SESSION,
+            requested_through: MetaMetricsRequestedThrough.MultichainApi,
+            chain_id_list: expect.arrayContaining(['eip155:1', 'eip155:137']),
+          },
+          referrer: { url: 'multichain.dapp' },
+        });
+      });
+
+      it('should track wallet_invokeMethod events with multichain category and properties', async () => {
path: app/scripts/lib/createRPCMethodTrackingMiddleware.test.js
user: login: jiexi
body: multichain_api_request_scope?
created_at: 2025-04-18T22:41:45Z
author_association: MEMBER
diff_hunk: @@ -248,13 +269,32 @@ export default function createRPCMethodTrackingMiddleware({
   ) {
     const { origin, method, params } = req;
 
-    const rateLimitType = RATE_LIMIT_MAP[method];
+    const isMultichainRequest = isMultichainRequestMethod(method);
+    // requestedThrough and eventCategory are currently redundant so we will want to
+    // disentangle them in the future
+    const requestedThrough = isMultichainRequest
+      ? MetaMetricsRequestedThrough.MultichainApi
+      : MetaMetricsRequestedThrough.EthereumProvider;
+
+    const eventCategory = isMultichainRequest
+      ? MetaMetricsEventCategory.MultichainApi
+      : MetaMetricsEventCategory.InpageProvider;
+
+    let invokedMethod = method;
+    let multichainApiRequestScope;
+    // if the request is through the multichain api, the method is nested in the params
+    if (method === MESSAGE_TYPE.WALLET_INVOKE_METHOD) {
+      invokedMethod = params?.request?.method;
+      multichainApiRequestScope = params?.scope;
+    }
+
+    const rateLimitType = RATE_LIMIT_MAP[invokedMethod];
 
     let isRateLimited;
     switch (rateLimitType) {
       case RATE_LIMIT_TYPES.TIMEOUT:
         isRateLimited =
-          typeof rateLimitTimeoutsByMethod[method] !== 'undefined';
+          typeof rateLimitTimeoutsByMethod[invokedMethod] !== 'undefined';
path: app/scripts/lib/createRPCMethodTrackingMiddleware.js
user: login: adonesky1
body: Well this is just an object where [the timeout for that rate limited method is temporarily stored](https://github.com/MetaMask/metamask-extension/blob/8a492c9fbd263d0787b4f0f9aaa8637293cb3925/app/scripts/lib/createRPCMethodTrackingMiddleware.js#L436), so theoretically if its undefined it means its no longer rate limited on this execution?
created_at: 2025-04-21T15:05:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -248,13 +269,32 @@ export default function createRPCMethodTrackingMiddleware({
   ) {
     const { origin, method, params } = req;
 
-    const rateLimitType = RATE_LIMIT_MAP[method];
+    const isMultichainRequest = isMultichainRequestMethod(method);
+    // requestedThrough and eventCategory are currently redundant so we will want to
+    // disentangle them in the future
+    const requestedThrough = isMultichainRequest
+      ? MetaMetricsRequestedThrough.MultichainApi
+      : MetaMetricsRequestedThrough.EthereumProvider;
+
+    const eventCategory = isMultichainRequest
+      ? MetaMetricsEventCategory.MultichainApi
+      : MetaMetricsEventCategory.InpageProvider;
+
+    let invokedMethod = method;
+    let multichainApiRequestScope;
+    // if the request is through the multichain api, the method is nested in the params
+    if (method === MESSAGE_TYPE.WALLET_INVOKE_METHOD) {
+      invokedMethod = params?.request?.method;
+      multichainApiRequestScope = params?.scope;
+    }
+
+    const rateLimitType = RATE_LIMIT_MAP[invokedMethod];
 
     let isRateLimited;
     switch (rateLimitType) {
       case RATE_LIMIT_TYPES.TIMEOUT:
         isRateLimited =
-          typeof rateLimitTimeoutsByMethod[method] !== 'undefined';
+          typeof rateLimitTimeoutsByMethod[invokedMethod] !== 'undefined';
path: app/scripts/lib/createRPCMethodTrackingMiddleware.js
user: login: jiexi
body: i mean it's exact value comparing to the string `'undefined'`, not the actual undefined value `undefined`
created_at: 2025-04-21T15:48:54Z
author_association: MEMBER

PR comments:
user: login: sentry[bot]
created_at: 2025-04-15T19:39:47Z
body: ## 🔍 Existing Issues For Review
Your pull request is modifying functions with the following pre-existing issues:

📄 File: **app/scripts/lib/createRPCMethodTrackingMiddleware.js**

| Function | Unhandled Issue |
| :------- | :----- |
| **`finalizeSignatureFragment`** | [**Error: Event fragment with id signature-398544236 does not exist.**](https://metamask.sentry.io/issues/6442109345/?referrer=github-open-pr-bot) ... <br> `Event Count:` **1** `Affected Users:` **0** |
---

<sub>Did you find this useful? React with a 👍 or 👎</sub>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-15T19:39:49Z
body: **CLA Signature Action:** All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.
author_association: CONTRIBUTOR
user: login: metamaskbot
created_at: 2025-04-17T17:12:24Z
body: <details><summary>Builds ready [6d027d4]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14520435419/builds-beta/metamask-beta-chrome-12.15.2-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds-test/metamask-chrome-12.15.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds-test-mv2/metamask-firefox-12.15.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds-test-flask/metamask-flask-chrome-12.15.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.15.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14520435419/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14520435419/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14520435419/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4791991/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/18b93250-1862-46fb-9c32-c83040f506b5/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/18b93250-1862-46fb-9c32-c83040f506b5/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/18b93250-1862-46fb-9c32-c83040f506b5/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1200 ± 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">1200</td><td align="right">1100</td><td align="right">1500</td><td align="right">62</td><td align="right">1235</td><td align="right">1296</td></tr><tr><td>load</td><td align="right">1041</td><td align="right">948</td><td align="right">1272</td><td align="right">55</td><td align="right">1064</td><td align="right">1159</td></tr><tr><td>domContentLoaded</td><td align="right">1035</td><td align="right">941</td><td align="right">1261</td><td align="right">54</td><td align="right">1059</td><td align="right">1150</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">72</td><td align="right">7</td><td align="right">16</td><td align="right">29</td></tr><tr><td>firstPaint</td><td align="right">703</td><td align="right">137</td><td align="right">1164</td><td align="right">412</td><td align="right">1047</td><td align="right">1127</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">24</td><td align="right">3</td><td align="right">7</td><td align="right">10</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">15</td><td align="right">45</td><td align="right">5</td><td align="right">20</td><td align="right">30</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">31</td><td align="right">8</td><td align="right">20</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">796</td><td align="right">704</td><td align="right">1018</td><td align="right">51</td><td align="right">815</td><td align="right">894</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">21</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">2079</td><td align="right">1681</td><td align="right">2475</td><td align="right">161</td><td align="right">2188</td><td align="right">2302</td></tr><tr><td>load</td><td align="right">1604</td><td align="right">1302</td><td align="right">2004</td><td align="right">121</td><td align="right">1694</td><td align="right">1760</td></tr><tr><td>domContentLoaded</td><td align="right">1598</td><td align="right">1298</td><td align="right">1998</td><td align="right">120</td><td align="right">1688</td><td align="right">1756</td></tr><tr><td>domInteractive</td><td align="right">15</td><td align="right">11</td><td align="right">64</td><td align="right">10</td><td align="right">13</td><td align="right">47</td></tr><tr><td>firstPaint</td><td align="right">181</td><td align="right">67</td><td align="right">358</td><td align="right">58</td><td align="right">228</td><td align="right">283</td></tr><tr><td>backgroundConnect</td><td align="right">23</td><td align="right">10</td><td align="right">87</td><td align="right">13</td><td align="right">23</td><td align="right">55</td></tr><tr><td>firstReactRender</td><td align="right">207</td><td align="right">53</td><td align="right">367</td><td align="right">123</td><td align="right">346</td><td align="right">356</td></tr><tr><td>getState</td><td align="right">16</td><td align="right">4</td><td align="right">316</td><td align="right">41</td><td align="right">12</td><td align="right">18</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1593</td><td align="right">1296</td><td align="right">1975</td><td align="right">119</td><td align="right">1685</td><td align="right">1755</td></tr><tr><td>setupStore</td><td align="right">15</td><td align="right">7</td><td align="right">58</td><td align="right">7</td><td align="right">18</td><td align="right">32</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1360</td><td align="right">1180</td><td align="right">1826</td><td align="right">120</td><td align="right">1419</td><td align="right">1620</td></tr><tr><td>load</td><td align="right">1212</td><td align="right">1028</td><td align="right">1700</td><td align="right">123</td><td align="right">1277</td><td align="right">1475</td></tr><tr><td>domContentLoaded</td><td align="right">1212</td><td align="right">1027</td><td align="right">1700</td><td align="right">123</td><td align="right">1277</td><td align="right">1475</td></tr><tr><td>domInteractive</td><td align="right">106</td><td align="right">39</td><td align="right">240</td><td align="right">36</td><td align="right">116</td><td align="right">196</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">53</td><td align="right">6</td><td align="right">22</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">22</td><td align="right">19</td><td align="right">55</td><td align="right">5</td><td align="right">22</td><td align="right">29</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">3</td><td align="right">206</td><td align="right">21</td><td align="right">8</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">1</td></tr><tr><td>loadScripts</td><td align="right">1193</td><td align="right">1008</td><td align="right">1685</td><td align="right">123</td><td align="right">1260</td><td align="right">1458</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">35</td><td align="right">5</td><td align="right">6</td><td align="right">19</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1518</td><td align="right">1374</td><td align="right">1953</td><td align="right">127</td><td align="right">1588</td><td align="right">1791</td></tr><tr><td>load</td><td align="right">1295</td><td align="right">1167</td><td align="right">1767</td><td align="right">111</td><td align="right">1331</td><td align="right">1537</td></tr><tr><td>domContentLoaded</td><td align="right">1294</td><td align="right">1166</td><td align="right">1767</td><td align="right">111</td><td align="right">1330</td><td align="right">1536</td></tr><tr><td>domInteractive</td><td align="right">84</td><td align="right">46</td><td align="right">343</td><td align="right">34</td><td align="right">89</td><td align="right">140</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">23</td><td align="right">15</td><td align="right">55</td><td align="right">7</td><td align="right">24</td><td align="right">39</td></tr><tr><td>firstReactRender</td><td align="right">36</td><td align="right">29</td><td align="right">60</td><td align="right">5</td><td align="right">37</td><td align="right">46</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">55</td><td align="right">8</td><td align="right">10</td><td align="right">30</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">1274</td><td align="right">1149</td><td align="right">1746</td><td align="right">111</td><td align="right">1311</td><td align="right">1514</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">6</td><td align="right">35</td><td align="right">5</td><td align="right">8</td><td align="right">28</td></tr></tbody></table></details>

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


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

<details><summary>UI Startup Metrics (1198 ± 60 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">1198</td><td align="right">1101</td><td align="right">1460</td><td align="right">60</td><td align="right">1228</td><td align="right">1330</td></tr><tr><td>load</td><td align="right">1041</td><td align="right">934</td><td align="right">1301</td><td align="right">61</td><td align="right">1074</td><td align="right">1141</td></tr><tr><td>domContentLoaded</td><td align="right">1035</td><td align="right">930</td><td align="right">1296</td><td align="right">60</td><td align="right">1069</td><td align="right">1135</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">13</td><td align="right">62</td><td align="right">9</td><td align="right">16</td><td align="right">35</td></tr><tr><td>firstPaint</td><td align="right">670</td><td align="right">90</td><td align="right">1170</td><td align="right">414</td><td align="right">1039</td><td align="right">1136</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">20</td><td align="right">3</td><td align="right">7</td><td align="right">11</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">16</td><td align="right">43</td><td align="right">7</td><td align="right">23</td><td align="right">39</td></tr><tr><td>getState</td><td align="right">12</td><td align="right">5</td><td align="right">66</td><td align="right">9</td><td align="right">17</td><td align="right">26</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">799</td><td align="right">694</td><td align="right">1034</td><td align="right">57</td><td align="right">834</td><td align="right">897</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">21</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">2084</td><td align="right">1658</td><td align="right">2509</td><td align="right">182</td><td align="right">2207</td><td align="right">2373</td></tr><tr><td>load</td><td align="right">1612</td><td align="right">1284</td><td align="right">1971</td><td align="right">140</td><td align="right">1708</td><td align="right">1821</td></tr><tr><td>domContentLoaded</td><td align="right">1605</td><td align="right">1280</td><td align="right">1949</td><td align="right">138</td><td align="right">1701</td><td align="right">1812</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">61</td><td align="right">11</td><td align="right">13</td><td align="right">46</td></tr><tr><td>firstPaint</td><td align="right">181</td><td align="right">63</td><td align="right">373</td><td align="right">64</td><td align="right">219</td><td align="right">298</td></tr><tr><td>backgroundConnect</td><td align="right">25</td><td align="right">9</td><td align="right">79</td><td align="right">15</td><td align="right">25</td><td align="right">62</td></tr><tr><td>firstReactRender</td><td align="right">206</td><td align="right">54</td><td align="right">381</td><td align="right">118</td><td align="right">332</td><td align="right">369</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">4</td><td align="right">36</td><td align="right">6</td><td align="right">12</td><td align="right">26</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1600</td><td align="right">1279</td><td align="right">1925</td><td align="right">136</td><td align="right">1696</td><td align="right">1808</td></tr><tr><td>setupStore</td><td align="right">21</td><td align="right">6</td><td align="right">284</td><td align="right">35</td><td align="right">19</td><td align="right">34</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1327</td><td align="right">1161</td><td align="right">1658</td><td align="right">105</td><td align="right">1378</td><td align="right">1557</td></tr><tr><td>load</td><td align="right">1184</td><td align="right">1008</td><td align="right">1533</td><td align="right">109</td><td align="right">1251</td><td align="right">1395</td></tr><tr><td>domContentLoaded</td><td align="right">1183</td><td align="right">1008</td><td align="right">1532</td><td align="right">109</td><td align="right">1251</td><td align="right">1394</td></tr><tr><td>domInteractive</td><td align="right">100</td><td align="right">35</td><td align="right">265</td><td align="right">34</td><td align="right">111</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">21</td><td align="right">12</td><td align="right">117</td><td align="right">15</td><td align="right">19</td><td align="right">41</td></tr><tr><td>firstReactRender</td><td align="right">22</td><td align="right">19</td><td align="right">46</td><td align="right">4</td><td align="right">23</td><td align="right">27</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">32</td><td align="right">3</td><td align="right">7</td><td align="right">9</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1165</td><td align="right">994</td><td align="right">1517</td><td align="right">109</td><td align="right">1225</td><td align="right">1382</td></tr><tr><td>setupStore</td><td align="right">6</td><td align="right">4</td><td align="right">34</td><td align="right">4</td><td align="right">6</td><td align="right">8</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1506</td><td align="right">1330</td><td align="right">1935</td><td align="right">116</td><td align="right">1586</td><td align="right">1741</td></tr><tr><td>load</td><td align="right">1288</td><td align="right">1129</td><td align="right">1657</td><td align="right">102</td><td align="right">1354</td><td align="right">1465</td></tr><tr><td>domContentLoaded</td><td align="right">1287</td><td align="right">1129</td><td align="right">1657</td><td align="right">102</td><td align="right">1354</td><td align="right">1465</td></tr><tr><td>domInteractive</td><td align="right">81</td><td align="right">56</td><td align="right">230</td><td align="right">24</td><td align="right">87</td><td align="right">128</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">48</td><td align="right">6</td><td align="right">22</td><td align="right">34</td></tr><tr><td>firstReactRender</td><td align="right">35</td><td align="right">29</td><td align="right">76</td><td align="right">6</td><td align="right">37</td><td align="right">45</td></tr><tr><td>getState</td><td align="right">9</td><td align="right">4</td><td align="right">34</td><td align="right">6</td><td align="right">9</td><td align="right">29</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">2</td><td align="right">1</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1269</td><td align="right">1113</td><td align="right">1637</td><td align="right">100</td><td align="right">1333</td><td align="right">1446</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">40</td><td align="right">4</td><td align="right">8</td><td align="right">11</td></tr></tbody></table>Benchmark value 182 exceeds gate value 175 for chrome webpack home mean firstPaint<br>
<b>Sum of mean exceeds: 7ms | Sum of p95 exceeds: 0ms<br>
Sum of all benchmark exceeds: 7ms</b><br>
</details>

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


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

<details><summary>UI Startup Metrics (1209 ± 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">1209</td><td align="right">1089</td><td align="right">1428</td><td align="right">65</td><td align="right">1247</td><td align="right">1325</td></tr><tr><td>load</td><td align="right">1050</td><td align="right">930</td><td align="right">1229</td><td align="right">60</td><td align="right">1087</td><td align="right">1159</td></tr><tr><td>domContentLoaded</td><td align="right">1044</td><td align="right">927</td><td align="right">1222</td><td align="right">59</td><td align="right">1081</td><td align="right">1153</td></tr><tr><td>domInteractive</td><td align="right">18</td><td align="right">13</td><td align="right">60</td><td align="right">8</td><td align="right">16</td><td align="right">33</td></tr><tr><td>firstPaint</td><td align="right">781</td><td align="right">137</td><td align="right">1230</td><td align="right">391</td><td align="right">1072</td><td align="right">1143</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">29</td><td align="right">4</td><td align="right">7</td><td align="right">16</td></tr><tr><td>firstReactRender</td><td align="right">20</td><td align="right">16</td><td align="right">38</td><td align="right">4</td><td align="right">21</td><td align="right">32</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">37</td><td align="right">8</td><td align="right">18</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">807</td><td align="right">702</td><td align="right">975</td><td align="right">57</td><td align="right">836</td><td align="right">914</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">5</td><td align="right">16</td><td align="right">2</td><td align="right">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">2153</td><td align="right">1744</td><td align="right">2676</td><td align="right">179</td><td align="right">2306</td><td align="right">2406</td></tr><tr><td>load</td><td align="right">1672</td><td align="right">1336</td><td align="right">2087</td><td align="right">135</td><td align="right">1785</td><td align="right">1870</td></tr><tr><td>domContentLoaded</td><td align="right">1666</td><td align="right">1329</td><td align="right">2076</td><td align="right">134</td><td align="right">1779</td><td align="right">1859</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">70</td><td align="right">12</td><td align="right">13</td><td align="right">48</td></tr><tr><td>firstPaint</td><td align="right">175</td><td align="right">69</td><td align="right">376</td><td align="right">58</td><td align="right">204</td><td align="right">287</td></tr><tr><td>backgroundConnect</td><td align="right">26</td><td align="right">11</td><td align="right">77</td><td align="right">15</td><td align="right">30</td><td align="right">65</td></tr><tr><td>firstReactRender</td><td align="right">209</td><td align="right">56</td><td align="right">394</td><td align="right">123</td><td align="right">334</td><td align="right">362</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">92</td><td align="right">12</td><td align="right">16</td><td align="right">26</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1661</td><td align="right">1326</td><td align="right">2052</td><td align="right">133</td><td align="right">1774</td><td align="right">1855</td></tr><tr><td>setupStore</td><td align="right">26</td><td align="right">7</td><td align="right">291</td><td align="right">47</td><td align="right">22</td><td align="right">42</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1313</td><td align="right">1145</td><td align="right">1678</td><td align="right">107</td><td align="right">1370</td><td align="right">1539</td></tr><tr><td>load</td><td align="right">1173</td><td align="right">998</td><td align="right">1546</td><td align="right">112</td><td align="right">1250</td><td align="right">1385</td></tr><tr><td>domContentLoaded</td><td align="right">1173</td><td align="right">998</td><td align="right">1546</td><td align="right">112</td><td align="right">1250</td><td align="right">1385</td></tr><tr><td>domInteractive</td><td align="right">101</td><td align="right">37</td><td align="right">235</td><td align="right">32</td><td align="right">111</td><td align="right">165</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">19</td><td align="right">13</td><td align="right">78</td><td align="right">8</td><td align="right">20</td><td align="right">31</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">19</td><td align="right">29</td><td align="right">2</td><td align="right">22</td><td align="right">26</td></tr><tr><td>getState</td><td align="right">7</td><td align="right">4</td><td align="right">24</td><td align="right">3</td><td align="right">7</td><td align="right">10</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">2</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1155</td><td align="right">982</td><td align="right">1524</td><td align="right">113</td><td align="right">1234</td><td align="right">1366</td></tr><tr><td>setupStore</td><td align="right">5</td><td align="right">4</td><td align="right">34</td><td align="right">3</td><td align="right">6</td><td align="right">6</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1501</td><td align="right">1347</td><td align="right">1867</td><td align="right">106</td><td align="right">1572</td><td align="right">1680</td></tr><tr><td>load</td><td align="right">1284</td><td align="right">1155</td><td align="right">1631</td><td align="right">98</td><td align="right">1356</td><td align="right">1466</td></tr><tr><td>domContentLoaded</td><td align="right">1284</td><td align="right">1155</td><td align="right">1631</td><td align="right">98</td><td align="right">1356</td><td align="right">1466</td></tr><tr><td>domInteractive</td><td align="right">79</td><td align="right">35</td><td align="right">153</td><td align="right">22</td><td align="right">87</td><td align="right">125</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">15</td><td align="right">103</td><td align="right">10</td><td align="right">22</td><td align="right">37</td></tr><tr><td>firstReactRender</td><td align="right">34</td><td align="right">27</td><td align="right">55</td><td align="right">4</td><td align="right">35</td><td align="right">43</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">55</td><td align="right">7</td><td align="right">8</td><td align="right">29</td></tr><tr><td>initialActions</td><td align="right">1</td><td align="right">0</td><td align="right">40</td><td align="right">4</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1263</td><td align="right">1138</td><td align="right">1614</td><td align="right">97</td><td align="right">1334</td><td align="right">1447</td></tr><tr><td>setupStore</td><td align="right">12</td><td align="right">5</td><td align="right">256</td><td align="right">26</td><td align="right">8</td><td align="right">33</td></tr></tbody></table>Benchmark value 176 exceeds gate value 175 for chrome webpack home mean firstPaint<br>
Benchmark value 33 exceeds gate value 28 for firefox webpack home p95 setupStore<br>
<b>Sum of mean exceeds: 1ms | Sum of p95 exceeds: 5ms<br>
Sum of all benchmark exceeds: 6ms</b><br>
</details>

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


author_association: COLLABORATOR
user: login: vandan
created_at: 2025-04-18T22:51:39Z
body: Thanks for catching the other non-rate-limited confirmation-related methods that may be triggered through the Multichain API. That should help us monitor adoption on the EVM side as well. I'll add those to the [Segment Schema PR](https://github.com/Consensys/segment-schema/pull/256) associated with these changes.
author_association: NONE
user: login: vandan
created_at: 2025-04-18T23:19:57Z
body: If we're going to cover add a param to differentiate where the request came from on signatures, shouldn't we do the same for transactions?
author_association: NONE
user: login: adonesky1
created_at: 2025-04-21T16:10:26Z
body: > If we're going to cover add a param to differentiate where the request came from on signatures, shouldn't we do the same for transactions?

The `requested_through` param is added on for all method requests signatures, transactions, or read methods


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

<details><summary>UI Startup Metrics (1202 ± 60 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">1202</td><td align="right">1097</td><td align="right">1434</td><td align="right">60</td><td align="right">1230</td><td align="right">1317</td></tr><tr><td>load</td><td align="right">1037</td><td align="right">928</td><td align="right">1229</td><td align="right">55</td><td align="right">1068</td><td align="right">1137</td></tr><tr><td>domContentLoaded</td><td align="right">1031</td><td align="right">911</td><td align="right">1220</td><td align="right">55</td><td align="right">1061</td><td align="right">1132</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">14</td><td align="right">62</td><td align="right">6</td><td align="right">16</td><td align="right">26</td></tr><tr><td>firstPaint</td><td align="right">705</td><td align="right">142</td><td align="right">1225</td><td align="right">401</td><td align="right">1045</td><td align="right">1128</td></tr><tr><td>backgroundConnect</td><td align="right">7</td><td align="right">4</td><td align="right">14</td><td align="right">2</td><td align="right">7</td><td align="right">9</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">15</td><td align="right">130</td><td align="right">12</td><td align="right">20</td><td align="right">28</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">5</td><td align="right">42</td><td align="right">8</td><td align="right">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">0</td></tr><tr><td>loadScripts</td><td align="right">794</td><td align="right">676</td><td align="right">963</td><td align="right">52</td><td align="right">822</td><td align="right">892</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">19</td><td align="right">2</td><td align="right">8</td><td align="right">12</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2099</td><td align="right">1683</td><td align="right">2434</td><td align="right">183</td><td align="right">2242</td><td align="right">2331</td></tr><tr><td>load</td><td align="right">1616</td><td align="right">1302</td><td align="right">1863</td><td align="right">131</td><td align="right">1722</td><td align="right">1784</td></tr><tr><td>domContentLoaded</td><td align="right">1609</td><td align="right">1298</td><td align="right">1848</td><td align="right">129</td><td align="right">1716</td><td align="right">1781</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">77</td><td align="right">10</td><td align="right">13</td><td align="right">40</td></tr><tr><td>firstPaint</td><td align="right">178</td><td align="right">62</td><td align="right">408</td><td align="right">64</td><td align="right">223</td><td align="right">297</td></tr><tr><td>backgroundConnect</td><td align="right">27</td><td align="right">9</td><td align="right">212</td><td align="right">23</td><td align="right">31</td><td align="right">59</td></tr><tr><td>firstReactRender</td><td align="right">197</td><td align="right">55</td><td align="right">394</td><td align="right">119</td><td align="right">323</td><td align="right">361</td></tr><tr><td>getState</td><td align="right">14</td><td align="right">4</td><td align="right">265</td><td align="right">26</td><td align="right">14</td><td align="right">25</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">3</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1605</td><td align="right">1297</td><td align="right">1825</td><td align="right">128</td><td align="right">1713</td><td align="right">1776</td></tr><tr><td>setupStore</td><td align="right">24</td><td align="right">7</td><td align="right">280</td><td align="right">43</td><td align="right">22</td><td align="right">38</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1386</td><td align="right">1192</td><td align="right">1696</td><td align="right">98</td><td align="right">1434</td><td align="right">1580</td></tr><tr><td>load</td><td align="right">1232</td><td align="right">1053</td><td align="right">1541</td><td align="right">100</td><td align="right">1288</td><td align="right">1425</td></tr><tr><td>domContentLoaded</td><td align="right">1231</td><td align="right">1053</td><td align="right">1540</td><td align="right">100</td><td align="right">1288</td><td align="right">1425</td></tr><tr><td>domInteractive</td><td align="right">108</td><td align="right">37</td><td align="right">235</td><td align="right">32</td><td align="right">128</td><td align="right">160</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">102</td><td align="right">13</td><td align="right">22</td><td align="right">40</td></tr><tr><td>firstReactRender</td><td align="right">23</td><td align="right">20</td><td align="right">39</td><td align="right">3</td><td align="right">23</td><td align="right">31</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">36</td><td align="right">5</td><td align="right">8</td><td align="right">21</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">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">1212</td><td align="right">1022</td><td align="right">1524</td><td align="right">102</td><td align="right">1273</td><td align="right">1400</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">37</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">1566</td><td align="right">1340</td><td align="right">2096</td><td align="right">163</td><td align="right">1651</td><td align="right">1938</td></tr><tr><td>load</td><td align="right">1335</td><td align="right">1164</td><td align="right">1853</td><td align="right">148</td><td align="right">1403</td><td align="right">1641</td></tr><tr><td>domContentLoaded</td><td align="right">1335</td><td align="right">1164</td><td align="right">1853</td><td align="right">148</td><td align="right">1403</td><td align="right">1641</td></tr><tr><td>domInteractive</td><td align="right">80</td><td align="right">38</td><td align="right">145</td><td align="right">21</td><td align="right">91</td><td align="right">124</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">24</td><td align="right">14</td><td align="right">74</td><td align="right">9</td><td align="right">26</td><td align="right">45</td></tr><tr><td>firstReactRender</td><td align="right">36</td><td align="right">30</td><td align="right">54</td><td align="right">5</td><td align="right">38</td><td align="right">49</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">5</td><td align="right">74</td><td align="right">9</td><td align="right">10</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">1314</td><td align="right">1150</td><td align="right">1836</td><td align="right">147</td><td align="right">1386</td><td align="right">1625</td></tr><tr><td>setupStore</td><td align="right">9</td><td align="right">5</td><td align="right">53</td><td align="right">6</td><td align="right">9</td><td align="right">21</td></tr></tbody></table>Benchmark value 1938 exceeds gate value 1935 for firefox webpack home p95 uiStartup<br>
<b>Sum of mean exceeds: 0ms | Sum of p95 exceeds: 3ms<br>
Sum of all benchmark exceeds: 3ms</b><br>
</details>

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


author_association: COLLABORATOR