From 18fdbcaf3793271be682b1e8eeec77fc1dba6890 Mon Sep 17 00:00:00 2001 From: Bernardo Garces Chapero Date: Wed, 1 Apr 2026 10:03:44 +0200 Subject: [PATCH 1/6] fix assetId in token selector --- .../src/selectors/token-selectors.ts | 131 +++++++++++------- 1 file changed, 79 insertions(+), 52 deletions(-) diff --git a/packages/assets-controllers/src/selectors/token-selectors.ts b/packages/assets-controllers/src/selectors/token-selectors.ts index aa78ff38f10..ef9fa61f902 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.ts @@ -5,8 +5,14 @@ import { convertHexToDecimal } from '@metamask/controller-utils'; import { TrxScope } from '@metamask/keyring-api'; import type { InternalAccount } from '@metamask/keyring-internal-api'; import type { NetworkState } from '@metamask/network-controller'; -import { hexToBigInt, parseCaipAssetType } from '@metamask/utils'; -import type { Hex } from '@metamask/utils'; +import { + KnownCaipNamespace, + hexToBigInt, + hexToNumber, + parseCaipAssetType, + toCaipAssetType, +} from '@metamask/utils'; +import type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils'; import { createSelector, weakMapMemoize } from 'reselect'; import { TokenRwaData } from 'src/token-service'; @@ -19,7 +25,10 @@ import type { CurrencyRateState } from '../CurrencyRateController'; import type { MultichainAssetsControllerState } from '../MultichainAssetsController'; import type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController'; import type { MultichainBalancesControllerState } from '../MultichainBalancesController'; -import { getNativeTokenAddress } from '../token-prices-service/codefi-v2'; +import { + SPOT_PRICES_SUPPORT_INFO, + getNativeTokenAddress, +} from '../token-prices-service/codefi-v2'; import type { TokenBalancesControllerState } from '../TokenBalancesController'; import type { Token, TokenRatesControllerState } from '../TokenRatesController'; import type { TokensControllerState } from '../TokensController'; @@ -64,14 +73,15 @@ type MultichainAccountType = Exclude< export type Asset = ( | { accountType: EvmAccountType; - assetId: Hex; // This is also the address for EVM tokens + assetId: CaipAssetType; address: Hex; chainId: Hex; } | { accountType: MultichainAccountType; - assetId: `${string}:${string}/${string}:${string}`; - chainId: `${string}:${string}`; + assetId: CaipAssetType; + address: CaipAssetType; + chainId: CaipChainId; } ) & { accountId: string; @@ -125,7 +135,10 @@ export type AssetListState = { const createAssetListSelector = createSelector.withTypes(); const selectAccountsToGroupIdMap = createAssetListSelector( - [(state) => state.accountTree, (state) => state.internalAccounts], + [ + (state): AssetListState['accountTree'] => state.accountTree, + (state): AssetListState['internalAccounts'] => state.internalAccounts, + ], (accountTree, internalAccounts) => { const accountsMap: Record< string, @@ -158,11 +171,12 @@ const selectAccountsToGroupIdMap = createAssetListSelector( const selectAllEvmAccountNativeBalances = createAssetListSelector( [ selectAccountsToGroupIdMap, - (state) => state.accountsByChainId, - (state) => state.marketData, - (state) => state.currencyRates, - (state) => state.currentCurrency, - (state) => state.networkConfigurationsByChainId, + (state): AssetListState['accountsByChainId'] => state.accountsByChainId, + (state): AssetListState['marketData'] => state.marketData, + (state): AssetListState['currencyRates'] => state.currencyRates, + (state): AssetListState['currentCurrency'] => state.currentCurrency, + (state): AssetListState['networkConfigurationsByChainId'] => + state.networkConfigurationsByChainId, ], ( accountsMap, @@ -196,7 +210,7 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector( const groupChainAssets = groupAssets[accountGroupId][chainId]; // If a native balance is missing, we still want to show it as 0 - const rawBalance = accountBalance.balance || '0x0'; + const rawBalance = accountBalance.balance ?? '0x0'; const nativeCurrency = networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE'; @@ -222,7 +236,10 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector( groupChainAssets.push({ accountType: type as EvmAccountType, - assetId: nativeToken.address, + assetId: + SPOT_PRICES_SUPPORT_INFO[ + chainId as keyof typeof SPOT_PRICES_SUPPORT_INFO + ] ?? SPOT_PRICES_SUPPORT_INFO['0x1'], isNative: true, address: nativeToken.address, image: nativeToken.image, @@ -254,12 +271,12 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector( const selectAllEvmAssets = createAssetListSelector( [ selectAccountsToGroupIdMap, - (state) => state.allTokens, - (state) => state.allIgnoredTokens, - (state) => state.tokenBalances, - (state) => state.marketData, - (state) => state.currencyRates, - (state) => state.currentCurrency, + (state): AssetListState['allTokens'] => state.allTokens, + (state): AssetListState['allIgnoredTokens'] => state.allIgnoredTokens, + (state): AssetListState['tokenBalances'] => state.tokenBalances, + (state): AssetListState['marketData'] => state.marketData, + (state): AssetListState['currencyRates'] => state.currencyRates, + (state): AssetListState['currentCurrency'] => state.currentCurrency, ], ( accountsMap, @@ -316,7 +333,12 @@ const selectAllEvmAssets = createAssetListSelector( groupChainAssets.push({ accountType: type as EvmAccountType, - assetId: tokenAddress, + assetId: toCaipAssetType( + KnownCaipNamespace.Eip155, + hexToNumber(chainId).toString(), + 'erc20', + tokenAddress.toLowerCase(), + ), isNative: false, address: tokenAddress, image: token.image ?? '', @@ -350,12 +372,12 @@ const selectAllEvmAssets = createAssetListSelector( const selectAllMultichainAssets = createAssetListSelector( [ selectAccountsToGroupIdMap, - (state) => state.accountsAssets, - (state) => state.allIgnoredAssets, - (state) => state.assetsMetadata, - (state) => state.balances, - (state) => state.conversionRates, - (state) => state.currentCurrency, + (state): AssetListState['accountsAssets'] => state.accountsAssets, + (state): AssetListState['allIgnoredAssets'] => state.allIgnoredAssets, + (state): AssetListState['assetsMetadata'] => state.assetsMetadata, + (state): AssetListState['balances'] => state.balances, + (state): AssetListState['conversionRates'] => state.conversionRates, + (state): AssetListState['currentCurrency'] => state.currentCurrency, ], ( accountsMap, @@ -431,6 +453,7 @@ const selectAllMultichainAssets = createAssetListSelector( accountType: type as MultichainAccountType, assetId, isNative: caipAsset.assetNamespace === 'slip44', + address: assetId, image: assetMetadata.iconUrl, name: assetMetadata.name ?? assetMetadata.symbol ?? asset, symbol: assetMetadata.symbol ?? asset, @@ -454,24 +477,25 @@ const selectAllMultichainAssets = createAssetListSelector( }, ); -export const selectAllAssets = createAssetListSelector( - [ - selectAllEvmAssets, - selectAllMultichainAssets, - selectAllEvmAccountNativeBalances, - ], - (evmAssets, multichainAssets, evmAccountNativeBalances) => { - const groupAssets: AssetsByAccountGroup = {}; +export const selectAllAssets: (state: AssetListState) => AssetsByAccountGroup = + createAssetListSelector( + [ + selectAllEvmAssets, + selectAllMultichainAssets, + selectAllEvmAccountNativeBalances, + ], + (evmAssets, multichainAssets, evmAccountNativeBalances) => { + const groupAssets: AssetsByAccountGroup = {}; - mergeAssets(groupAssets, evmAssets); + mergeAssets(groupAssets, evmAssets); - mergeAssets(groupAssets, multichainAssets); + mergeAssets(groupAssets, multichainAssets); - mergeAssets(groupAssets, evmAccountNativeBalances); + mergeAssets(groupAssets, evmAccountNativeBalances); - return groupAssets; - }, -); + return groupAssets; + }, + ); export type SelectAccountGroupAssetOpts = { filterTronStakedTokens: boolean; @@ -481,7 +505,9 @@ const defaultSelectAccountGroupAssetOpts: SelectAccountGroupAssetOpts = { filterTronStakedTokens: true, }; -const filterTronStakedTokens = (assetsByAccountGroup: AccountGroupAssets) => { +const filterTronStakedTokens = ( + assetsByAccountGroup: AccountGroupAssets, +): AccountGroupAssets => { const newAssetsByAccountGroup = { ...assetsByAccountGroup }; Object.values(TrxScope).forEach((tronChainId) => { @@ -510,11 +536,12 @@ const filterTronStakedTokens = (assetsByAccountGroup: AccountGroupAssets) => { export const selectAssetsBySelectedAccountGroup = createAssetListSelector( [ selectAllAssets, - (state) => state.selectedAccountGroup, + (state): AssetListState['selectedAccountGroup'] => + state.selectedAccountGroup, ( _state, opts: SelectAccountGroupAssetOpts = defaultSelectAccountGroupAssetOpts, - ) => opts, + ): SelectAccountGroupAssetOpts => opts, ], (groupAssets, selectedAccountGroup, opts) => { if (!selectedAccountGroup) { @@ -545,22 +572,22 @@ export const selectAssetsBySelectedAccountGroup = createAssetListSelector( function mergeAssets( existingAssets: AssetsByAccountGroup, newAssets: AssetsByAccountGroup, -) { +): void { for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [ AccountGroupId, AccountGroupAssets, ][]) { const existingAccountGroupAssets = existingAssets[accountGroupId]; - if (!existingAccountGroupAssets) { - existingAssets[accountGroupId] = {}; + if (existingAccountGroupAssets) { for (const [network, chainAssets] of Object.entries(accountAssets)) { - existingAssets[accountGroupId][network] = [...chainAssets]; + existingAccountGroupAssets[network] ??= []; + existingAccountGroupAssets[network].push(...chainAssets); } } else { + existingAssets[accountGroupId] = {}; for (const [network, chainAssets] of Object.entries(accountAssets)) { - existingAccountGroupAssets[network] ??= []; - existingAccountGroupAssets[network].push(...chainAssets); + existingAssets[accountGroupId][network] = [...chainAssets]; } } } @@ -584,7 +611,7 @@ function getFiatBalanceForEvmToken( chainId: Hex, tokenAddress: Hex, nativeCurrencySymbol?: string, -) { +): { balance: number; conversionRate: number } | undefined { const tokenMarketData = marketData[chainId]?.[tokenAddress]; // For native tokens: if no market data exists, use price=1 and look up currency rate directly @@ -639,7 +666,7 @@ function getFiatBalanceForMultichainAsset( balance: { amount: string; unit: string }, multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'], assetId: `${string}:${string}/${string}:${string}`, -) { +): { balance: number; conversionRate: number } | undefined { const assetMarketData = multichainConversionRates[assetId]; if (!assetMarketData?.rate) { From 4014adfd172236bfd59fd589cd73a9be01741615 Mon Sep 17 00:00:00 2001 From: Bernardo Garces Chapero Date: Wed, 1 Apr 2026 10:12:24 +0200 Subject: [PATCH 2/6] tests --- .../src/selectors/token-selectors.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/assets-controllers/src/selectors/token-selectors.test.ts b/packages/assets-controllers/src/selectors/token-selectors.test.ts index 145b933cb2c..6239d2d69a7 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.test.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.test.ts @@ -310,7 +310,7 @@ const mockAccountTreeControllerState = { selectedAccountGroup: 'entropy:01K1TJY9QPSCKNBSVGZNG510GJ/0', } as unknown as AccountTreeControllerState; -const mockAccountControllerState: AccountsControllerState = { +const mockAccountControllerState = { internalAccounts: { accounts: { 'd7f11451-9d79-4df4-a012-afd253443639': { @@ -467,7 +467,7 @@ const mockAccountControllerState: AccountsControllerState = { }, selectedAccount: 'd7f11451-9d79-4df4-a012-afd253443639', }, -}; +} as unknown as AccountsControllerState; const mockMultichainBalancesControllerState = { balances: { @@ -728,7 +728,7 @@ describe('token-selectors', () => { const ignoredTokenAddress = '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee'; expect( - result['0x1'].find((asset) => asset.assetId === ignoredTokenAddress), + result['0x1'].find((asset) => asset.address === ignoredTokenAddress), ).toBeUndefined(); }); @@ -738,7 +738,7 @@ describe('token-selectors', () => { const tokenWithNoBalance = '0x6B175474E89094C44Da98b954EedeAC495271d0F'; expect( - result['0x1'].find((asset) => asset.assetId === tokenWithNoBalance), + result['0x1'].find((asset) => asset.address === tokenWithNoBalance), ).toBeUndefined(); }); @@ -750,7 +750,7 @@ describe('token-selectors', () => { const tokenWithNoFiatBalance = result['0x1'].find( (asset) => - asset.assetId === '0xae7ab96520de3a18e5e111b5eaab095312d7fe84', + asset.address === '0xae7ab96520de3a18e5e111b5eaab095312d7fe84', ); expect(tokenWithNoFiatBalance).toStrictEqual({ @@ -780,7 +780,7 @@ describe('token-selectors', () => { const tokenWithNoFiatBalance = result['0x1'].find( (asset) => - asset.assetId === '0x514910771AF9Ca656af840dff83E8264EcF986CA', + asset.address === '0x514910771AF9Ca656af840dff83E8264EcF986CA', ); expect(tokenWithNoFiatBalance).toStrictEqual({ @@ -907,7 +907,7 @@ describe('token-selectors', () => { expect(result).toStrictEqual(expectedMockResult); }); - const arrangeTronState = () => { + const arrangeTronState = (): typeof mockedMergedState => { const state = cloneDeep(mockedMergedState); // Add Tron account to the selected account group From e37d6838e983ae88e4b63e0ad1b43d9effea5002 Mon Sep 17 00:00:00 2001 From: Bernardo Garces Chapero Date: Wed, 1 Apr 2026 10:39:17 +0200 Subject: [PATCH 3/6] fix tests --- .../src/selectors/token-selectors.test.ts | 23 +++++++++++-------- .../src/selectors/token-selectors.ts | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/assets-controllers/src/selectors/token-selectors.test.ts b/packages/assets-controllers/src/selectors/token-selectors.test.ts index 6239d2d69a7..67c7999c963 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.test.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.test.ts @@ -580,7 +580,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0x1', - assetId: '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f', + assetId: 'eip155:1/erc20:0x40d16fc0246ad3160ccc09B8d0d3a2cd28ae6c2f', address: '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f', image: 'https://static.cx.metamask.io/api/v1/tokenIcons/1/0x40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f.png', @@ -600,7 +600,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0x1', - assetId: '0x6B3595068778DD592e39A122f4f5a5cF09C90fE2', + assetId: 'eip155:1/erc20:0x6b3595068778dd592e39a122f4f5a5cf09c90fe2', address: '0x6B3595068778DD592e39A122f4f5a5cF09C90fE2', image: 'https://static.cx.metamask.io/api/v1/tokenIcons/1/0x6b3595068778dd592e39a122f4f5a5cf09c90fe2.png', @@ -620,7 +620,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0x1', - assetId: '0x0000000000000000000000000000000000000000', + assetId: 'eip155:1/slip44:60', address: '0x0000000000000000000000000000000000000000', image: '', name: 'Ethereum', @@ -641,7 +641,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0xa', - assetId: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', + assetId: 'eip155:1/erc20:0x0b2c639c533813f4aa9d7837caf62653d097ff85', address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', image: 'https://static.cx.metamask.io/api/v1/tokenIcons/10/0x0b2c639c533813f4aa9d7837caf62653d097ff85.png', @@ -661,7 +661,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0xa', - assetId: '0x0000000000000000000000000000000000000000', + assetId: 'eip155:1/slip44:60', address: '0x0000000000000000000000000000000000000000', image: '', name: 'Ethereum', @@ -683,6 +683,7 @@ const expectedMockResult = { accountId: '2d89e6a0-b4e6-45a8-a707-f10cef143b42', chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', assetId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501', + address: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501', image: 'https://static.cx.metamask.io/api/v2/tokenIcons/assets/solana/5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44/501.png', name: 'Solana', @@ -703,6 +704,8 @@ const expectedMockResult = { chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', assetId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN', + address: + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN', image: 'https://static.cx.metamask.io/api/v2/tokenIcons/assets/solana/5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN.png', name: 'Jupiter', @@ -756,7 +759,7 @@ describe('token-selectors', () => { expect(tokenWithNoFiatBalance).toStrictEqual({ accountId: '2c311cc8-eeeb-48c7-a629-bb1d9c146b47', address: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84', - assetId: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84', + assetId: 'eip155:1/erc20:0xae7ab96520de3a18e5e111b5eaab095312d7fe84', rawBalance: '0x56BC75E2D63100000', balance: '100', chainId: '0x1', @@ -786,7 +789,7 @@ describe('token-selectors', () => { expect(tokenWithNoFiatBalance).toStrictEqual({ accountId: '2c311cc8-eeeb-48c7-a629-bb1d9c146b47', address: '0x514910771AF9Ca656af840dff83E8264EcF986CA', - assetId: '0x514910771AF9Ca656af840dff83E8264EcF986CA', + assetId: 'eip155:1/erc20:0x514910771af9ca656af840dff83e8264ecf986ca', rawBalance: '0x56BC75E2D63100000', balance: '100', chainId: '0x1', @@ -832,6 +835,8 @@ describe('token-selectors', () => { accountId: '40fe5e20-525a-4434-bb83-c51ce5560a8c', assetId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:2zMMhcVQEXDtdE6vsFS7S7D5oUodfJHE8vd1gnBouauv', + address: + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:2zMMhcVQEXDtdE6vsFS7S7D5oUodfJHE8vd1gnBouauv', rawBalance: '0x5f5e100', balance: '100', chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', @@ -856,7 +861,7 @@ describe('token-selectors', () => { expect(nativeToken).toStrictEqual({ accountId: '2c311cc8-eeeb-48c7-a629-bb1d9c146b47', - assetId: '0x0000000000000000000000000000000000001010', + assetId: 'eip155:137/slip44:966', address: '0x0000000000000000000000000000000000001010', rawBalance: '0x8AC7230489E80000', chainId: '0x89', @@ -1047,7 +1052,7 @@ describe('token-selectors', () => { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: inkChainId, - assetId: '0x0000000000000000000000000000000000000000', + assetId: `eip155:${inkChainId}/slip44:60`, address: '0x0000000000000000000000000000000000000000', image: '', name: 'Ethereum', diff --git a/packages/assets-controllers/src/selectors/token-selectors.ts b/packages/assets-controllers/src/selectors/token-selectors.ts index ef9fa61f902..59bc6f7020a 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.ts @@ -239,7 +239,7 @@ const selectAllEvmAccountNativeBalances = createAssetListSelector( assetId: SPOT_PRICES_SUPPORT_INFO[ chainId as keyof typeof SPOT_PRICES_SUPPORT_INFO - ] ?? SPOT_PRICES_SUPPORT_INFO['0x1'], + ] ?? `eip155:${hexToNumber(chainId)}/slip44:60`, isNative: true, address: nativeToken.address, image: nativeToken.image, From 951943017142c2a599d7d2769bbf4f15d7d60744 Mon Sep 17 00:00:00 2001 From: Bernardo Garces Chapero Date: Wed, 1 Apr 2026 10:51:35 +0200 Subject: [PATCH 4/6] fixes --- .../src/selectors/token-selectors.test.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/assets-controllers/src/selectors/token-selectors.test.ts b/packages/assets-controllers/src/selectors/token-selectors.test.ts index 67c7999c963..070e6343516 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.test.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.test.ts @@ -7,6 +7,7 @@ import type { import type { AccountsControllerState } from '@metamask/accounts-controller'; import { TrxScope } from '@metamask/keyring-api'; import type { NetworkState } from '@metamask/network-controller'; +import { hexToNumber } from '@metamask/utils'; import type { Hex } from '@metamask/utils'; import { cloneDeep } from 'lodash'; @@ -580,7 +581,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0x1', - assetId: 'eip155:1/erc20:0x40d16fc0246ad3160ccc09B8d0d3a2cd28ae6c2f', + assetId: 'eip155:1/erc20:0x40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f', address: '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f', image: 'https://static.cx.metamask.io/api/v1/tokenIcons/1/0x40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f.png', @@ -641,7 +642,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0xa', - assetId: 'eip155:1/erc20:0x0b2c639c533813f4aa9d7837caf62653d097ff85', + assetId: 'eip155:10/erc20:0x0b2c639c533813f4aa9d7837caf62653d097ff85', address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', image: 'https://static.cx.metamask.io/api/v1/tokenIcons/10/0x0b2c639c533813f4aa9d7837caf62653d097ff85.png', @@ -661,7 +662,7 @@ const expectedMockResult = { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: '0xa', - assetId: 'eip155:1/slip44:60', + assetId: 'eip155:10/slip44:60', address: '0x0000000000000000000000000000000000000000', image: '', name: 'Ethereum', @@ -1017,7 +1018,7 @@ describe('token-selectors', () => { it('calculates fiat for native token using currency rate fallback when market data is missing', () => { // Setup: Add a new chain (Ink chain 0xdef1) with native balance but NO market data - const inkChainId = '0xdef1' as Hex; + const inkChainId: Hex = '0xdef1'; const stateWithInkChain = { ...mockedMergedState, // Add Ink chain to network configuration @@ -1052,7 +1053,7 @@ describe('token-selectors', () => { accountType: 'eip155:eoa', accountId: 'd7f11451-9d79-4df4-a012-afd253443639', chainId: inkChainId, - assetId: `eip155:${inkChainId}/slip44:60`, + assetId: `eip155:${hexToNumber(inkChainId)}/slip44:60`, address: '0x0000000000000000000000000000000000000000', image: '', name: 'Ethereum', @@ -1070,7 +1071,7 @@ describe('token-selectors', () => { }); it('returns undefined fiat for native token when both market data and currency rate are missing', () => { - const inkChainId = '0xdef1' as Hex; + const inkChainId: Hex = '0xdef1'; const stateWithMissingCurrencyRate = { ...mockedMergedState, networkConfigurationsByChainId: { @@ -1103,7 +1104,7 @@ describe('token-selectors', () => { }); it('hides native tokens on Tempo testnet (0xa5bf)', () => { - const tempoTestnetChainId = '0xa5bf' as Hex; // 42431 in decimal + const tempoTestnetChainId: Hex = '0xa5bf'; // 42431 in decimal const stateWithTempoTestnet = { ...mockedMergedState, networkConfigurationsByChainId: { @@ -1132,7 +1133,7 @@ describe('token-selectors', () => { }); it('hides native tokens on Tempo mainnet (0x1079)', () => { - const tempoMainnetChainId = '0x1079' as Hex; // 4217 in decimal + const tempoMainnetChainId: Hex = '0x1079'; // 4217 in decimal const stateWithTempoMainnet = { ...mockedMergedState, networkConfigurationsByChainId: { @@ -1161,7 +1162,7 @@ describe('token-selectors', () => { }); it('does not hide native tokens on non-Tempo networks', () => { - const ethereumChainId = '0x1' as Hex; + const ethereumChainId: Hex = '0x1'; const result = selectAssetsBySelectedAccountGroup(mockedMergedState); // Native token should still be visible on Ethereum From 6003599d8e8c47c2e79bdf927f32622caaa2f01f Mon Sep 17 00:00:00 2001 From: Bernardo Garces Chapero Date: Wed, 1 Apr 2026 11:21:05 +0200 Subject: [PATCH 5/6] supressions --- eslint-suppressions.json | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 546bda917aa..75095dacf0d 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -474,22 +474,6 @@ "count": 1 } }, - "packages/assets-controllers/src/selectors/token-selectors.test.ts": { - "@typescript-eslint/explicit-function-return-type": { - "count": 1 - } - }, - "packages/assets-controllers/src/selectors/token-selectors.ts": { - "@typescript-eslint/explicit-function-return-type": { - "count": 25 - }, - "@typescript-eslint/prefer-nullish-coalescing": { - "count": 1 - }, - "no-negated-condition": { - "count": 1 - } - }, "packages/assets-controllers/src/utils/formatters.ts": { "@typescript-eslint/explicit-function-return-type": { "count": 9 From 7bc465a238a63a6a4cbaa6f1c837a6286fad6f5f Mon Sep 17 00:00:00 2001 From: Bernardo Garces Chapero Date: Thu, 2 Apr 2026 17:58:43 +0200 Subject: [PATCH 6/6] remove lowercase conversion --- packages/assets-controllers/src/selectors/token-selectors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/assets-controllers/src/selectors/token-selectors.ts b/packages/assets-controllers/src/selectors/token-selectors.ts index 59bc6f7020a..569fc952431 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.ts @@ -337,7 +337,7 @@ const selectAllEvmAssets = createAssetListSelector( KnownCaipNamespace.Eip155, hexToNumber(chainId).toString(), 'erc20', - tokenAddress.toLowerCase(), + tokenAddress, ), isNative: false, address: tokenAddress,