From 944f23207d3e8b1c7fe02470218883d91d6a06f6 Mon Sep 17 00:00:00 2001 From: Patryk Lucka <5708018+PatrykLucka@users.noreply.github.com> Date: Wed, 3 Dec 2025 16:02:36 +0100 Subject: [PATCH] refactor: update network switching metrics to include chain ID and custom network status --- .../network-list-menu/network-list-menu.tsx | 31 ++++++++++++++++++- .../hooks/useNetworkChangeHandlers.ts | 30 ++++++++++++++++++ .../confirmation/confirmation.js | 25 ++++++++++++++- 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/ui/components/multichain/network-list-menu/network-list-menu.tsx b/ui/components/multichain/network-list-menu/network-list-menu.tsx index 966267f6ed20..1773c0985fc8 100644 --- a/ui/components/multichain/network-list-menu/network-list-menu.tsx +++ b/ui/components/multichain/network-list-menu/network-list-menu.tsx @@ -54,8 +54,12 @@ import { FEATURED_RPCS, TEST_CHAINS, CHAIN_ID_PORTFOLIO_LANDING_PAGE_URL_MAP, + BUILT_IN_NETWORKS, } from '../../../../shared/constants/network'; -import { MULTICHAIN_NETWORK_TO_ACCOUNT_TYPE_NAME } from '../../../../shared/constants/multichain/networks'; +import { + MULTICHAIN_NETWORK_TO_ACCOUNT_TYPE_NAME, + MultichainNetworks, +} from '../../../../shared/constants/multichain/networks'; import { getShowTestNetworks, getOriginOfCurrentTab, @@ -423,6 +427,28 @@ export const NetworkListMenu = ({ onClose }: NetworkListMenuProps) => { ? convertCaipToHexChainId(currentChainId) : currentChainId; + // Check if the destination network is custom (not built-in, featured, or multichain) + const hexChainId = chain.isEvm + ? convertCaipToHexChainId(chain.chainId) + : chain.chainId; + + const isBuiltInNetwork = Object.values(BUILT_IN_NETWORKS).some( + (builtInNetwork) => builtInNetwork.chainId === hexChainId, + ); + const isFeaturedRpc = FEATURED_RPCS.some( + (featuredRpc) => featuredRpc.chainId === hexChainId, + ); + const isMultichainProviderConfig = Object.values(MultichainNetworks).some( + (multichainNetwork) => + multichainNetwork === chain.chainId || + (chain.isEvm + ? convertCaipToHexChainId(chain.chainId) + : chain.chainId) === multichainNetwork, + ); + + const isCustomNetwork = + !isBuiltInNetwork && !isFeaturedRpc && !isMultichainProviderConfig; + trackEvent({ event: MetaMetricsEventName.NavNetworkSwitched, category: MetaMetricsEventCategory.Network, @@ -437,6 +463,9 @@ export const NetworkListMenu = ({ onClose }: NetworkListMenuProps) => { // TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860 // eslint-disable-next-line @typescript-eslint/naming-convention to_network: chainIdToTrack, + // TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860 + // eslint-disable-next-line @typescript-eslint/naming-convention + custom_network: isCustomNetwork, }, }); }; diff --git a/ui/components/multichain/network-manager/hooks/useNetworkChangeHandlers.ts b/ui/components/multichain/network-manager/hooks/useNetworkChangeHandlers.ts index daf495fa0d8e..abd4f7f6fa3f 100644 --- a/ui/components/multichain/network-manager/hooks/useNetworkChangeHandlers.ts +++ b/ui/components/multichain/network-manager/hooks/useNetworkChangeHandlers.ts @@ -23,6 +23,11 @@ import { getSelectedMultichainNetworkChainId, } from '../../../../selectors'; import { MetaMetricsContext } from '../../../../contexts/metametrics'; +import { + BUILT_IN_NETWORKS, + FEATURED_RPCS, +} from '../../../../../shared/constants/network'; +import { MultichainNetworks } from '../../../../../shared/constants/multichain/networks'; // TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860 // eslint-disable-next-line @typescript-eslint/naming-convention @@ -143,6 +148,28 @@ export const useNetworkChangeHandlers = () => { ? convertCaipToHexChainId(currentChainId) : currentChainId; + // Check if the destination network is custom (not built-in, featured, or multichain) + const hexChainId = chain.isEvm + ? convertCaipToHexChainId(chain.chainId) + : chain.chainId; + + const isBuiltInNetwork = Object.values(BUILT_IN_NETWORKS).some( + (builtInNetwork) => builtInNetwork.chainId === hexChainId, + ); + const isFeaturedRpc = FEATURED_RPCS.some( + (featuredRpc) => featuredRpc.chainId === hexChainId, + ); + const isMultichainProviderConfig = Object.values(MultichainNetworks).some( + (multichainNetwork) => + multichainNetwork === chain.chainId || + (chain.isEvm + ? convertCaipToHexChainId(chain.chainId) + : chain.chainId) === multichainNetwork, + ); + + const isCustomNetwork = + !isBuiltInNetwork && !isFeaturedRpc && !isMultichainProviderConfig; + trackEvent({ event: MetaMetricsEventName.NavNetworkSwitched, category: MetaMetricsEventCategory.Network, @@ -157,6 +184,9 @@ export const useNetworkChangeHandlers = () => { // TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860 // eslint-disable-next-line @typescript-eslint/naming-convention to_network: chainIdToTrack, + // TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860 + // eslint-disable-next-line @typescript-eslint/naming-convention + custom_network: isCustomNetwork, }, }); }, diff --git a/ui/pages/confirmations/confirmation/confirmation.js b/ui/pages/confirmations/confirmation/confirmation.js index 3c6b72af4943..a80ac8d59980 100644 --- a/ui/pages/confirmations/confirmation/confirmation.js +++ b/ui/pages/confirmations/confirmation/confirmation.js @@ -18,7 +18,12 @@ import { NETWORKS_BYPASSING_VALIDATION, } from '@metamask/controller-utils'; import { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods'; -import { CHAIN_SPEC_URL } from '../../../../shared/constants/network'; +import { + CHAIN_SPEC_URL, + BUILT_IN_NETWORKS, + FEATURED_RPCS, +} from '../../../../shared/constants/network'; +import { MultichainNetworks } from '../../../../shared/constants/multichain/networks'; import fetchWithCache from '../../../../shared/lib/fetch-with-cache'; import { MetaMetricsEventCategory, @@ -476,6 +481,23 @@ export default function ConfirmationPage({ pendingConfirmation?.requestData?.fromNetworkConfiguration?.chainId && pendingConfirmation?.requestData?.toNetworkConfiguration?.chainId ) { + // Check if the destination network is custom (not built-in, featured, or multichain) + const toChainId = + pendingConfirmation.requestData.toNetworkConfiguration.chainId; + + const isBuiltInNetwork = Object.values(BUILT_IN_NETWORKS).some( + (builtInNetwork) => builtInNetwork.chainId === toChainId, + ); + const isFeaturedRpc = FEATURED_RPCS.some( + (featuredRpc) => featuredRpc.chainId === toChainId, + ); + const isMultichainProviderConfig = Object.values(MultichainNetworks).some( + (multichainNetwork) => multichainNetwork === toChainId, + ); + + const isCustomNetwork = + !isBuiltInNetwork && !isFeaturedRpc && !isMultichainProviderConfig; + trackEvent({ category: MetaMetricsEventCategory.Network, event: MetaMetricsEventName.NavNetworkSwitched, @@ -485,6 +507,7 @@ export default function ConfirmationPage({ pendingConfirmation.requestData.fromNetworkConfiguration.chainId, to_network: pendingConfirmation.requestData.toNetworkConfiguration.chainId, + custom_network: isCustomNetwork, referrer: { url: window.location.origin, },