Repository: MetaMask/metamask-extension
Pull request #32679: fix: (cp-12.18.0) solana devnet non-native asset view should disable swap and bridge
Author: login: Prithpal-Sooriya
Labels: name: team-assets
Created: 2025-05-08T13:33:13Z | Merged: 2025-05-08T20:41:54Z

## **Description**

We were using a selector that relied on a hack that only returns Solana mainnet chainID.

https://github.com/MetaMask/metamask-extension/blob/2d96e51c13844590d80e0fb422b7f1828dc4f0a5/ui/selectors/multichain.ts#L206-L216

Replacing this selector with a different selector to get multichain chainId succeeded.

NOTE - we can probably add another fix on the original selector and remove the hack.

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32679?quickstart=1)

## **Related issues**

Fixes: https://github.com/MetaMask/metamask-extension/issues/32619

## **Manual testing steps**

1. Select Solana DevNet
2. Select an ERC/non-native token from this devnet
3. EXPECTED - see swap and bridge disabled

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

https://www.loom.com/share/9a532c02dabf4f34a4114a9ed17bf14e?sid=0035bdc6-5ed9-47c7-a47e-d1cdb76289ef

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable
- [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.



Diff:
diff --git a/ui/pages/asset/components/asset-page.test.tsx b/ui/pages/asset/components/asset-page.test.tsx
index e1471eeed550..ad4896050bd0 100644
--- a/ui/pages/asset/components/asset-page.test.tsx
+++ b/ui/pages/asset/components/asset-page.test.tsx
@@ -308,7 +308,7 @@ describe('AssetPage', () => {
     });
   });
 
-  it('should not show the Bridge button if chain id is not supported', async () => {
+  it('should disable Bridge button if chain id is not supported', async () => {
     const { queryByTestId } = renderWithProvider(
       <AssetPage asset={token} optionsButton={null} />,
       configureMockStore([thunk])({
@@ -320,7 +320,7 @@ describe('AssetPage', () => {
       }),
     );
     const bridgeButton = queryByTestId('token-overview-bridge');
-    expect(bridgeButton).not.toBeInTheDocument();
+    expect(bridgeButton).toBeDisabled();
   });
 
   it('should render the network name', async () => {
diff --git a/ui/pages/asset/components/token-buttons.tsx b/ui/pages/asset/components/token-buttons.tsx
index 74f42267f379..94c4be99c06d 100644
--- a/ui/pages/asset/components/token-buttons.tsx
+++ b/ui/pages/asset/components/token-buttons.tsx
@@ -27,6 +27,7 @@ import {
   ///: END:ONLY_INCLUDE_IF
   getNetworkConfigurationIdByChainId,
   getSelectedInternalAccount,
+  getSelectedMultichainNetworkConfiguration,
 } from '../../../selectors';
 ///: BEGIN:ONLY_INCLUDE_IF(build-main,build-beta,build-flask)
 import useBridging from '../../../hooks/bridge/useBridging';
@@ -61,10 +62,7 @@ import {
 import { getIsNativeTokenBuyable } from '../../../ducks/ramps';
 ///: END:ONLY_INCLUDE_IF
 import { useMultichainSelector } from '../../../hooks/useMultichainSelector';
-import {
-  getMultichainIsEvm,
-  getMultichainNetwork,
-} from '../../../selectors/multichain';
+import { getMultichainIsEvm } from '../../../selectors/multichain';
 
 ///: BEGIN:ONLY_INCLUDE_IF(multichain)
 import { useHandleSendNonEvm } from '../../../components/app/wallet-overview/hooks/useHandleSendNonEvm';
@@ -95,8 +93,10 @@ const TokenButtons = ({
 
   const account = useSelector(getSelectedInternalAccount, isEqual);
 
-  const { chainId: multichainChainId } =
-    useMultichainSelector(getMultichainNetwork);
+  // This is only returning solana mainnet, not solana devnet?
+  const { chainId: multichainChainId } = useSelector(
+    getSelectedMultichainNetworkConfiguration,
+  );
 
   const currentChainId = useSelector(getCurrentChainId);
   const networks = useSelector(getNetworkConfigurationIdByChainId) as Record<
@@ -107,7 +107,9 @@ const TokenButtons = ({
     getIsSwapsChain(state, isEvm ? currentChainId : multichainChainId),
   );
   ///: BEGIN:ONLY_INCLUDE_IF(build-main,build-beta,build-flask)
-  const isBridgeChain = useSelector(getIsBridgeChain);
+  const isBridgeChain = useSelector((state) =>
+    getIsBridgeChain(state, isEvm ? currentChainId : multichainChainId),
+  );
   const isBuyableChain = useSelector(getIsNativeTokenBuyable);
   const { openBuyCryptoInPdapp } = useRamps();
   const { openBridgeExperience } = useBridging();
@@ -327,40 +329,39 @@ const TokenButtons = ({
         disabled={token.isERC721}
         tooltipRender={null}
       />
-      {isSwapsChain && (
+
+      <IconButton
+        className="token-overview__button"
+        Icon={
+          <Icon
+            name={IconName.SwapHorizontal}
+            color={IconColor.iconDefault}
+            size={IconSize.Sm}
+          />
+        }
+        onClick={handleSwapOnClick}
+        label={t('swap')}
+        tooltipRender={null}
+        disabled={!isSwapsChain}
+      />
+
+      {
+        ///: BEGIN:ONLY_INCLUDE_IF(build-main,build-beta,build-flask)
         <IconButton
           className="token-overview__button"
+          data-testid="token-overview-bridge"
           Icon={
             <Icon
-              name={IconName.SwapHorizontal}
+              name={IconName.Bridge}
               color={IconColor.iconDefault}
               size={IconSize.Sm}
             />
           }
-          onClick={handleSwapOnClick}
-          label={t('swap')}
+          label={t('bridge')}
+          onClick={() => handleBridgeOnClick(false)}
           tooltipRender={null}
+          disabled={!isBridgeChain}
         />
-      )}
-
-      {
-        ///: BEGIN:ONLY_INCLUDE_IF(build-main,build-beta,build-flask)
-        isBridgeChain && (
-          <IconButton
-            className="token-overview__button"
-            data-testid="token-overview-bridge"
-            Icon={
-              <Icon
-                name={IconName.Bridge}
-                color={IconColor.iconDefault}
-                size={IconSize.Sm}
-              />
-            }
-            label={t('bridge')}
-            onClick={() => handleBridgeOnClick(false)}
-            tooltipRender={null}
-          />
-        )
         ///: END:ONLY_INCLUDE_IF
       }
     </Box>


Reviews:
user: login: Prithpal-Sooriya
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T13:34:32Z
user: login: Prithpal-Sooriya
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T13:35:47Z
user: login: Prithpal-Sooriya
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T13:51:13Z
user: login: Prithpal-Sooriya
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T14:47:28Z
user: login: gambinish
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-08T16:22:57Z
user: login: sahar-fehri
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T16:44:50Z
user: login: Prithpal-Sooriya
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T21:17:28Z
user: login: Prithpal-Sooriya
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T21:36:27Z

Review comments:
diff_hunk: @@ -327,40 +329,39 @@ const TokenButtons = ({
         disabled={token.isERC721}
         tooltipRender={null}
       />
-      {isSwapsChain && (
path: ui/pages/asset/components/token-buttons.tsx
user: login: Prithpal-Sooriya
body: Instead of hiding the buttons, we are instead disabling them similar to other areas in the UI.
created_at: 2025-05-08T13:34:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -95,8 +93,10 @@ const TokenButtons = ({
 
   const account = useSelector(getSelectedInternalAccount, isEqual);
 
-  const { chainId: multichainChainId } =
-    useMultichainSelector(getMultichainNetwork);
+  // This is only returning solana mainnet, not solana devnet?
+  const { chainId: multichainChainId } = useSelector(
+    getSelectedMultichainNetworkConfiguration,
+  );
path: ui/pages/asset/components/token-buttons.tsx
user: login: Prithpal-Sooriya
body: Should I create a separate fix for the original selector?
As mentioned in the PR description, it uses a hack that doesn't work well with non-evm dev/testnets.
https://github.com/MetaMask/metamask-extension/blob/2d96e51c13844590d80e0fb422b7f1828dc4f0a5/ui/selectors/multichain.ts#L206-L216
created_at: 2025-05-08T13:35:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -95,8 +93,10 @@ const TokenButtons = ({
 
   const account = useSelector(getSelectedInternalAccount, isEqual);
 
-  const { chainId: multichainChainId } =
-    useMultichainSelector(getMultichainNetwork);
+  // This is only returning solana mainnet, not solana devnet?
+  const { chainId: multichainChainId } = useSelector(
+    getSelectedMultichainNetworkConfiguration,
+  );
path: ui/pages/asset/components/token-buttons.tsx
user: login: Prithpal-Sooriya
body: Hmmm unfortunately this isn't easy to fix the types do not match and the `MultichainNetworkController` doesn't seem to have some fields that this selector requires (ticker, isAddressCompatible, decimals, etc)
created_at: 2025-05-08T13:51:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -95,8 +93,10 @@ const TokenButtons = ({
 
   const account = useSelector(getSelectedInternalAccount, isEqual);
 
-  const { chainId: multichainChainId } =
-    useMultichainSelector(getMultichainNetwork);
+  // This is only returning solana mainnet, not solana devnet?
+  const { chainId: multichainChainId } = useSelector(
+    getSelectedMultichainNetworkConfiguration,
+  );
path: ui/pages/asset/components/token-buttons.tsx
user: login: Prithpal-Sooriya
body: OK fixed in a separate PR.
https://github.com/MetaMask/metamask-extension/pull/32686

As this selector is used in a few places I think we can keep this separate and determine how to QA this.
created_at: 2025-05-08T14:47:28Z
author_association: CONTRIBUTOR
diff_hunk: @@ -95,8 +93,10 @@ const TokenButtons = ({
 
   const account = useSelector(getSelectedInternalAccount, isEqual);
 
-  const { chainId: multichainChainId } =
-    useMultichainSelector(getMultichainNetwork);
+  // This is only returning solana mainnet, not solana devnet?
path: ui/pages/asset/components/token-buttons.tsx
user: login: Prithpal-Sooriya
body: Dummy, I forgot to remove this comment 🙊 

I'll do a cleanup PR on this with the PR below.
created_at: 2025-05-08T21:17:28Z
author_association: CONTRIBUTOR
diff_hunk: @@ -95,8 +93,10 @@ const TokenButtons = ({
 
   const account = useSelector(getSelectedInternalAccount, isEqual);
 
-  const { chainId: multichainChainId } =
-    useMultichainSelector(getMultichainNetwork);
+  // This is only returning solana mainnet, not solana devnet?
path: ui/pages/asset/components/token-buttons.tsx
user: login: Prithpal-Sooriya
body: Fixed in https://github.com/MetaMask/metamask-extension/pull/32720
created_at: 2025-05-08T21:36:27Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-08T13:33:26Z
body: **CLA Signature Action:** All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.
author_association: CONTRIBUTOR
user: login: metamaskbot
created_at: 2025-05-08T14:30:39Z
body: <details><summary>Builds ready [ead5b7a]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds/metamask-chrome-12.17.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds-mv2/metamask-firefox-12.17.2.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14908348689/builds-beta/metamask-beta-chrome-12.17.2-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds-flask/metamask-flask-chrome-12.17.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.2-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds-test/metamask-chrome-12.17.2.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds-test-mv2/metamask-firefox-12.17.2.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.2-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.2-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14908348689/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14908348689/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14908348689/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/14908348689/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4875767/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/background-9.html">9</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/403626c5-c422-44ef-b747-6b364691a03b/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/403626c5-c422-44ef-b747-6b364691a03b/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/403626c5-c422-44ef-b747-6b364691a03b/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1234 ± 59 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1234</td><td align="right">1102</td><td align="right">1390</td><td align="right">59</td><td align="right">1278</td><td align="right">1333</td></tr><tr><td>load</td><td align="right">1078</td><td align="right">967</td><td align="right">1211</td><td align="right">55</td><td align="right">1118</td><td align="right">1166</td></tr><tr><td>domContentLoaded</td><td align="right">1071</td><td align="right">962</td><td align="right">1206</td><td align="right">55</td><td align="right">1113</td><td align="right">1160</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">13</td><td align="right">27</td><td align="right">3</td><td align="right">17</td><td align="right">25</td></tr><tr><td>firstPaint</td><td align="right">747</td><td align="right">81</td><td align="right">1201</td><td align="right">432</td><td align="right">1096</td><td align="right">1154</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">32</td><td align="right">6</td><td align="right">7</td><td align="right">28</td></tr><tr><td>firstReactRender</td><td align="right">21</td><td align="right">16</td><td align="right">49</td><td align="right">7</td><td align="right">21</td><td align="right">35</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">6</td><td align="right">38</td><td align="right">8</td><td align="right">21</td><td align="right">32</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">825</td><td align="right">725</td><td align="right">949</td><td align="right">53</td><td align="right">864</td><td align="right">905</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">21</td><td align="right">3</td><td align="right">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">2148</td><td align="right">1729</td><td align="right">2363</td><td align="right">156</td><td align="right">2268</td><td align="right">2348</td></tr><tr><td>load</td><td align="right">1658</td><td align="right">1218</td><td align="right">2095</td><td align="right">135</td><td align="right">1739</td><td align="right">1860</td></tr><tr><td>domContentLoaded</td><td align="right">1651</td><td align="right">1211</td><td align="right">2091</td><td align="right">135</td><td align="right">1732</td><td align="right">1857</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">11</td><td align="right">61</td><td align="right">10</td><td align="right">13</td><td align="right">45</td></tr><tr><td>firstPaint</td><td align="right">165</td><td align="right">62</td><td align="right">343</td><td align="right">57</td><td align="right">183</td><td align="right">306</td></tr><tr><td>backgroundConnect</td><td align="right">29</td><td align="right">9</td><td align="right">345</td><td align="right">34</td><td align="right">35</td><td align="right">48</td></tr><tr><td>firstReactRender</td><td align="right">157</td><td align="right">53</td><td align="right">398</td><td align="right">96</td><td align="right">265</td><td align="right">329</td></tr><tr><td>getState</td><td align="right">11</td><td align="right">4</td><td align="right">31</td><td align="right">6</td><td align="right">14</td><td align="right">23</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">4</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1646</td><td align="right">1208</td><td align="right">2090</td><td align="right">137</td><td align="right">1729</td><td align="right">1855</td></tr><tr><td>setupStore</td><td align="right">21</td><td align="right">6</td><td align="right">273</td><td align="right">37</td><td align="right">19</td><td align="right">35</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1431</td><td align="right">1190</td><td align="right">1888</td><td align="right">135</td><td align="right">1504</td><td align="right">1721</td></tr><tr><td>load</td><td align="right">1273</td><td align="right">1058</td><td align="right">1697</td><td align="right">129</td><td align="right">1334</td><td align="right">1547</td></tr><tr><td>domContentLoaded</td><td align="right">1272</td><td align="right">1058</td><td align="right">1697</td><td align="right">129</td><td align="right">1334</td><td align="right">1547</td></tr><tr><td>domInteractive</td><td align="right">108</td><td align="right">36</td><td align="right">328</td><td align="right">36</td><td align="right">122</td><td align="right">180</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">13</td><td align="right">260</td><td align="right">25</td><td align="right">21</td><td align="right">34</td></tr><tr><td>firstReactRender</td><td align="right">25</td><td align="right">20</td><td align="right">76</td><td align="right">9</td><td align="right">24</td><td align="right">56</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">4</td><td align="right">193</td><td align="right">19</td><td align="right">9</td><td align="right">13</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">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">1253</td><td align="right">1049</td><td align="right">1673</td><td align="right">122</td><td align="right">1321</td><td align="right">1519</td></tr><tr><td>setupStore</td><td align="right">7</td><td align="right">4</td><td align="right">46</td><td align="right">5</td><td align="right">6</td><td align="right">11</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1597</td><td align="right">1404</td><td align="right">2106</td><td align="right">156</td><td align="right">1697</td><td align="right">1952</td></tr><tr><td>load</td><td align="right">1370</td><td align="right">1202</td><td align="right">1839</td><td align="right">139</td><td align="right">1462</td><td align="right">1652</td></tr><tr><td>domContentLoaded</td><td align="right">1369</td><td align="right">1201</td><td align="right">1839</td><td align="right">139</td><td align="right">1462</td><td align="right">1651</td></tr><tr><td>domInteractive</td><td align="right">82</td><td align="right">35</td><td align="right">300</td><td align="right">34</td><td align="right">86</td><td align="right">142</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">27</td><td align="right">15</td><td align="right">288</td><td align="right">31</td><td align="right">24</td><td align="right">53</td></tr><tr><td>firstReactRender</td><td align="right">36</td><td align="right">29</td><td align="right">52</td><td align="right">5</td><td align="right">38</td><td align="right">48</td></tr><tr><td>getState</td><td align="right">10</td><td align="right">6</td><td align="right">33</td><td align="right">6</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">1345</td><td align="right">1186</td><td align="right">1814</td><td align="right">136</td><td align="right">1435</td><td align="right">1633</td></tr><tr><td>setupStore</td><td align="right">12</td><td align="right">5</td><td align="right">293</td><td align="right">29</td><td align="right">8</td><td align="right">21</td></tr></tbody></table>cc: @HowardBraham<br>
Benchmark value 1079 exceeds gate value 1070 for chrome browserify home mean load<br>
Benchmark value 1072 exceeds gate value 1061 for chrome browserify home mean domContentLoaded<br>
Benchmark value 16 exceeds gate value 15 for chrome browserify home mean getState<br>
Benchmark value 29 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 1432 exceeds gate value 1405 for firefox browserify home mean uiStartup<br>
Benchmark value 1273 exceeds gate value 1245 for firefox browserify home mean load<br>
Benchmark value 1273 exceeds gate value 1239 for firefox browserify home mean domContentLoaded<br>
Benchmark value 26 exceeds gate value 25 for firefox browserify home mean firstReactRender<br>
Benchmark value 1253 exceeds gate value 1230 for firefox browserify home mean loadScripts<br>
Benchmark value 1721 exceeds gate value 1660 for firefox browserify home p95 uiStartup<br>
Benchmark value 1547 exceeds gate value 1495 for firefox browserify home p95 load<br>
Benchmark value 1547 exceeds gate value 1495 for firefox browserify home p95 domContentLoaded<br>
Benchmark value 56 exceeds gate value 55 for firefox browserify home p95 firstReactRender<br>
Benchmark value 1519 exceeds gate value 1475 for firefox browserify home p95 loadScripts<br>
Benchmark value 28 exceeds gate value 26 for firefox webpack home mean backgroundConnect<br>
Benchmark value 1952 exceeds gate value 1935 for firefox webpack home p95 uiStartup<br>
Benchmark value 53 exceeds gate value 49 for firefox webpack home p95 backgroundConnect<br>
Benchmark value 1633 exceeds gate value 1630 for firefox webpack home p95 loadScripts<br>
<b>Sum of mean exceeds: 136ms | Sum of p95 exceeds: 245ms<br>
Sum of all benchmark exceeds: 381ms</b><br>
</details>

<details><summary>Bundle size diffs</summary><ul><li>background: 0 Bytes (0%)</li>
<li>ui: 47 Bytes (0%)</li>
<li>common: 0 Bytes (0%)</li></ul></details>


author_association: COLLABORATOR