@metamask/assets-controllers 86.0.0 → 87.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/dist/DeFiPositionsController/DeFiPositionsController.cjs +25 -36
  3. package/dist/DeFiPositionsController/DeFiPositionsController.cjs.map +1 -1
  4. package/dist/DeFiPositionsController/DeFiPositionsController.d.cts +3 -4
  5. package/dist/DeFiPositionsController/DeFiPositionsController.d.cts.map +1 -1
  6. package/dist/DeFiPositionsController/DeFiPositionsController.d.mts +3 -4
  7. package/dist/DeFiPositionsController/DeFiPositionsController.d.mts.map +1 -1
  8. package/dist/DeFiPositionsController/DeFiPositionsController.mjs +25 -36
  9. package/dist/DeFiPositionsController/DeFiPositionsController.mjs.map +1 -1
  10. package/dist/DeFiPositionsController/fetch-positions.cjs +4 -1
  11. package/dist/DeFiPositionsController/fetch-positions.cjs.map +1 -1
  12. package/dist/DeFiPositionsController/fetch-positions.d.cts.map +1 -1
  13. package/dist/DeFiPositionsController/fetch-positions.d.mts.map +1 -1
  14. package/dist/DeFiPositionsController/fetch-positions.mjs +4 -1
  15. package/dist/DeFiPositionsController/fetch-positions.mjs.map +1 -1
  16. package/dist/MultichainAssetsController/MultichainAssetsController.cjs +58 -0
  17. package/dist/MultichainAssetsController/MultichainAssetsController.cjs.map +1 -1
  18. package/dist/MultichainAssetsController/MultichainAssetsController.d.cts +15 -1
  19. package/dist/MultichainAssetsController/MultichainAssetsController.d.cts.map +1 -1
  20. package/dist/MultichainAssetsController/MultichainAssetsController.d.mts +15 -1
  21. package/dist/MultichainAssetsController/MultichainAssetsController.d.mts.map +1 -1
  22. package/dist/MultichainAssetsController/MultichainAssetsController.mjs +58 -0
  23. package/dist/MultichainAssetsController/MultichainAssetsController.mjs.map +1 -1
  24. package/dist/MultichainBalancesController/MultichainBalancesController.cjs +8 -0
  25. package/dist/MultichainBalancesController/MultichainBalancesController.cjs.map +1 -1
  26. package/dist/MultichainBalancesController/MultichainBalancesController.d.cts.map +1 -1
  27. package/dist/MultichainBalancesController/MultichainBalancesController.d.mts.map +1 -1
  28. package/dist/MultichainBalancesController/MultichainBalancesController.mjs +8 -0
  29. package/dist/MultichainBalancesController/MultichainBalancesController.mjs.map +1 -1
  30. package/dist/TokensController.cjs +3 -3
  31. package/dist/TokensController.cjs.map +1 -1
  32. package/dist/TokensController.d.cts.map +1 -1
  33. package/dist/TokensController.d.mts.map +1 -1
  34. package/dist/TokensController.mjs +3 -3
  35. package/dist/TokensController.mjs.map +1 -1
  36. package/dist/index.cjs +2 -1
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +3 -2
  39. package/dist/index.d.cts.map +1 -1
  40. package/dist/index.d.mts +3 -2
  41. package/dist/index.d.mts.map +1 -1
  42. package/dist/index.mjs +1 -1
  43. package/dist/index.mjs.map +1 -1
  44. package/dist/selectors/token-selectors.cjs +1 -6
  45. package/dist/selectors/token-selectors.cjs.map +1 -1
  46. package/dist/selectors/token-selectors.d.cts +1 -1
  47. package/dist/selectors/token-selectors.d.cts.map +1 -1
  48. package/dist/selectors/token-selectors.d.mts +1 -1
  49. package/dist/selectors/token-selectors.d.mts.map +1 -1
  50. package/dist/selectors/token-selectors.mjs +1 -6
  51. package/dist/selectors/token-selectors.mjs.map +1 -1
  52. package/dist/token-service.cjs +72 -9
  53. package/dist/token-service.cjs.map +1 -1
  54. package/dist/token-service.d.cts +48 -0
  55. package/dist/token-service.d.cts.map +1 -1
  56. package/dist/token-service.d.mts +48 -0
  57. package/dist/token-service.d.mts.map +1 -1
  58. package/dist/token-service.mjs +70 -8
  59. package/dist/token-service.mjs.map +1 -1
  60. package/dist/utils/timeout-with-retry.cjs +34 -0
  61. package/dist/utils/timeout-with-retry.cjs.map +1 -0
  62. package/dist/utils/timeout-with-retry.d.cts +9 -0
  63. package/dist/utils/timeout-with-retry.d.cts.map +1 -0
  64. package/dist/utils/timeout-with-retry.d.mts +9 -0
  65. package/dist/utils/timeout-with-retry.d.mts.map +1 -0
  66. package/dist/utils/timeout-with-retry.mjs +30 -0
  67. package/dist/utils/timeout-with-retry.mjs.map +1 -0
  68. package/package.json +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"token-selectors.cjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport {\n parseBalanceWithDecimals,\n stringifyBalanceWithDecimals,\n} from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\ntype AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\n// If this gets out of hand with other chains, we should probably have a permanent object that defines them\nconst MULTICHAIN_NATIVE_ASSET_IDS = [\n `bip122:000000000019d6689c085ae165831e93/slip44:0`,\n `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501`,\n];\n\ntype EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;\ntype MultichainAccountType = Exclude<\n InternalAccount['type'],\n `eip155:${string}`\n>;\n\nexport type Asset = (\n | {\n accountType: EvmAccountType;\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n accountType: MultichainAccountType;\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n accountId: string;\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n rawBalance: Hex;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n allIgnoredAssets: MultichainAssetsControllerState['allIgnoredAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<\n string,\n {\n accountGroupId: AccountGroupId;\n type: InternalAccount['type'];\n accountId: string;\n }\n > = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = { accountGroupId, type: internalAccount.type, accountId };\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const account = accountsMap[accountAddress.toLowerCase()];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n // If a native balance is missing, we still want to show it as 0\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n accountId,\n decimals: nativeToken.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const account = accountsMap[accountAddress];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n accountId,\n decimals: token.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.allIgnoredAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n ignoredMultichainAssets,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const account = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!account || !assetMetadata) {\n continue;\n }\n\n const { accountGroupId, type } = account;\n\n if (ignoredMultichainAssets?.[accountId]?.includes(assetId)) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n const decimals = assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals;\n\n if (!balance || decimals === undefined) {\n continue;\n }\n\n const rawBalance = parseBalanceWithDecimals(balance.amount, decimals);\n\n if (!rawBalance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n accountType: type as MultichainAccountType,\n assetId,\n isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n accountId,\n decimals,\n rawBalance,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = {};\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAssets[accountGroupId][network] = [...chainAssets];\n }\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
1
+ {"version":3,"file":"token-selectors.cjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport {\n parseBalanceWithDecimals,\n stringifyBalanceWithDecimals,\n} from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\nexport type AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\ntype EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;\ntype MultichainAccountType = Exclude<\n InternalAccount['type'],\n `eip155:${string}`\n>;\n\nexport type Asset = (\n | {\n accountType: EvmAccountType;\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n accountType: MultichainAccountType;\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n accountId: string;\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n rawBalance: Hex;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n allIgnoredAssets: MultichainAssetsControllerState['allIgnoredAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<\n string,\n {\n accountGroupId: AccountGroupId;\n type: InternalAccount['type'];\n accountId: string;\n }\n > = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = { accountGroupId, type: internalAccount.type, accountId };\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const account = accountsMap[accountAddress.toLowerCase()];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n // If a native balance is missing, we still want to show it as 0\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n accountId,\n decimals: nativeToken.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const account = accountsMap[accountAddress];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n accountId,\n decimals: token.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.allIgnoredAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n ignoredMultichainAssets,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const account = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!account || !assetMetadata) {\n continue;\n }\n\n const { accountGroupId, type } = account;\n\n if (ignoredMultichainAssets?.[accountId]?.includes(assetId)) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n const decimals = assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals;\n\n if (!balance || decimals === undefined) {\n continue;\n }\n\n const rawBalance = parseBalanceWithDecimals(balance.amount, decimals);\n\n if (!rawBalance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n accountType: type as MultichainAccountType,\n assetId,\n isNative: caipAsset.assetNamespace === 'slip44',\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n accountId,\n decimals,\n rawBalance,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = {};\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAssets[accountGroupId][network] = [...chainAssets];\n }\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
@@ -11,7 +11,7 @@ import type { MultichainBalancesControllerState } from "../MultichainBalancesCon
11
11
  import type { TokenBalancesControllerState } from "../TokenBalancesController.cjs";
12
12
  import type { Token, TokenRatesControllerState } from "../TokenRatesController.cjs";
13
13
  import type { TokensControllerState } from "../TokensController.cjs";
14
- type AssetsByAccountGroup = {
14
+ export type AssetsByAccountGroup = {
15
15
  [accountGroupId: AccountGroupId]: AccountGroupAssets;
16
16
  };
17
17
  export type AccountGroupAssets = {
@@ -1 +1 @@
1
- {"version":3,"file":"token-selectors.d.cts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAA0C;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AACjE,OAAO,EAAmC,KAAK,GAAG,EAAE,wBAAwB;AAO5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AACnE,OAAO,KAAK,EAAE,+BAA+B,EAAE,gDAAsC;AACrF,OAAO,KAAK,EAAE,oCAAoC,EAAE,qDAA2C;AAC/F,OAAO,KAAK,EAAE,iCAAiC,EAAE,kDAAwC;AAEzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,uCAAmC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,oCAAgC;AAChF,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,KAAK,oBAAoB,GAAG;IAC1B,CAAC,cAAc,EAAE,cAAc,GAAG,kBAAkB,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;CAC5B,CAAC;AAQF,KAAK,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;AAC3E,KAAK,qBAAqB,GAAG,OAAO,CAClC,eAAe,CAAC,MAAM,CAAC,EACvB,UAAU,MAAM,EAAE,CACnB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,CAChB;IACE,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;CACd,GACD;IACE,WAAW,EAAE,qBAAqB,CAAC;IACnC,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;IACnD,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;CAChC,CACJ,GAAG;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,GAAG,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EACA;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;KACxB,GACD,SAAS,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACvD,gBAAgB,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAC9D,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9C,gBAAgB,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IAC5D,aAAa,EAAE,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAC7D,UAAU,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACpD,aAAa,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAClD,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,gBAAgB,EAAE,+BAA+B,CAAC,kBAAkB,CAAC,CAAC;IACtE,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,QAAQ,EAAE,iCAAiC,CAAC,UAAU,CAAC,CAAC;IACxD,eAAe,EAAE,oCAAoC,CAAC,iBAAiB,CAAC,CAAC;IACzE,eAAe,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACtD,8BAA8B,EAAE,YAAY,CAAC,gCAAgC,CAAC,CAAC;IAI/E,iBAAiB,EAAE,MAAM,CACvB,GAAG,EACH,MAAM,CACJ,GAAG,EACH;QACE,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;KACrB,CACF,CACF,CAAC;CACH,CAAC;AA2VF,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAjVvB,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;gCAcH,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;;;;;;gCAcH,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwW1B,CAAC"}
1
+ {"version":3,"file":"token-selectors.d.cts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAA0C;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AACjE,OAAO,EAAmC,KAAK,GAAG,EAAE,wBAAwB;AAO5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AACnE,OAAO,KAAK,EAAE,+BAA+B,EAAE,gDAAsC;AACrF,OAAO,KAAK,EAAE,oCAAoC,EAAE,qDAA2C;AAC/F,OAAO,KAAK,EAAE,iCAAiC,EAAE,kDAAwC;AAEzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,uCAAmC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,oCAAgC;AAChF,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,CAAC,cAAc,EAAE,cAAc,GAAG,kBAAkB,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;CAC5B,CAAC;AAEF,KAAK,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;AAC3E,KAAK,qBAAqB,GAAG,OAAO,CAClC,eAAe,CAAC,MAAM,CAAC,EACvB,UAAU,MAAM,EAAE,CACnB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,CAChB;IACE,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;CACd,GACD;IACE,WAAW,EAAE,qBAAqB,CAAC;IACnC,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;IACnD,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;CAChC,CACJ,GAAG;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,GAAG,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EACA;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;KACxB,GACD,SAAS,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACvD,gBAAgB,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAC9D,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9C,gBAAgB,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IAC5D,aAAa,EAAE,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAC7D,UAAU,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACpD,aAAa,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAClD,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,gBAAgB,EAAE,+BAA+B,CAAC,kBAAkB,CAAC,CAAC;IACtE,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,QAAQ,EAAE,iCAAiC,CAAC,UAAU,CAAC,CAAC;IACxD,eAAe,EAAE,oCAAoC,CAAC,iBAAiB,CAAC,CAAC;IACzE,eAAe,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACtD,8BAA8B,EAAE,YAAY,CAAC,gCAAgC,CAAC,CAAC;IAI/E,iBAAiB,EAAE,MAAM,CACvB,GAAG,EACH,MAAM,CACJ,GAAG,EACH;QACE,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;KACrB,CACF,CACF,CAAC;CACH,CAAC;AA2VF,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAjVvB,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;gCAcH,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;;;;;;gCAcH,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwW1B,CAAC"}
@@ -11,7 +11,7 @@ import type { MultichainBalancesControllerState } from "../MultichainBalancesCon
11
11
  import type { TokenBalancesControllerState } from "../TokenBalancesController.mjs";
12
12
  import type { Token, TokenRatesControllerState } from "../TokenRatesController.mjs";
13
13
  import type { TokensControllerState } from "../TokensController.mjs";
14
- type AssetsByAccountGroup = {
14
+ export type AssetsByAccountGroup = {
15
15
  [accountGroupId: AccountGroupId]: AccountGroupAssets;
16
16
  };
17
17
  export type AccountGroupAssets = {
@@ -1 +1 @@
1
- {"version":3,"file":"token-selectors.d.mts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-selectors.d.mts","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA8B;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAA0C;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,sCAAsC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AACjE,OAAO,EAAmC,KAAK,GAAG,EAAE,wBAAwB;AAO5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AACnE,OAAO,KAAK,EAAE,+BAA+B,EAAE,gDAAsC;AACrF,OAAO,KAAK,EAAE,oCAAoC,EAAE,qDAA2C;AAC/F,OAAO,KAAK,EAAE,iCAAiC,EAAE,kDAAwC;AAEzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,uCAAmC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,oCAAgC;AAChF,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,CAAC,cAAc,EAAE,cAAc,GAAG,kBAAkB,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;CAC5B,CAAC;AAEF,KAAK,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;AAC3E,KAAK,qBAAqB,GAAG,OAAO,CAClC,eAAe,CAAC,MAAM,CAAC,EACvB,UAAU,MAAM,EAAE,CACnB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,CAChB;IACE,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;CACd,GACD;IACE,WAAW,EAAE,qBAAqB,CAAC;IACnC,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;IACnD,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;CAChC,CACJ,GAAG;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,GAAG,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EACA;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;KACxB,GACD,SAAS,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACvD,gBAAgB,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAC9D,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9C,gBAAgB,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IAC5D,aAAa,EAAE,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAC7D,UAAU,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACpD,aAAa,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAClD,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,gBAAgB,EAAE,+BAA+B,CAAC,kBAAkB,CAAC,CAAC;IACtE,cAAc,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAClE,QAAQ,EAAE,iCAAiC,CAAC,UAAU,CAAC,CAAC;IACxD,eAAe,EAAE,oCAAoC,CAAC,iBAAiB,CAAC,CAAC;IACzE,eAAe,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACtD,8BAA8B,EAAE,YAAY,CAAC,gCAAgC,CAAC,CAAC;IAI/E,iBAAiB,EAAE,MAAM,CACvB,GAAG,EACH,MAAM,CACJ,GAAG,EACH;QACE,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;KACrB,CACF,CACF,CAAC;CACH,CAAC;AA2VF,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAjVvB,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAFD,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;gCAcH,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;;;;;;gCAcH,cAAc;sBACxB,eAAe,CAAC,MAAM,CAAC;2BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;oCAFD,cAAc;0BACxB,eAAe,CAAC,MAAM,CAAC;+BAClB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAhBR,GAAG,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwW1B,CAAC"}
@@ -3,11 +3,6 @@ import { hexToBigInt, parseCaipAssetType } from "@metamask/utils";
3
3
  import { createSelector } from "reselect";
4
4
  import { parseBalanceWithDecimals, stringifyBalanceWithDecimals } from "./stringify-balance.mjs";
5
5
  import { getNativeTokenAddress } from "../token-prices-service/codefi-v2.mjs";
6
- // If this gets out of hand with other chains, we should probably have a permanent object that defines them
7
- const MULTICHAIN_NATIVE_ASSET_IDS = [
8
- `bip122:000000000019d6689c085ae165831e93/slip44:0`,
9
- `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501`,
10
- ];
11
6
  const createAssetListSelector = createSelector.withTypes();
12
7
  const selectAccountsToGroupIdMap = createAssetListSelector([(state) => state.accountTree, (state) => state.internalAccounts], (accountTree, internalAccounts) => {
13
8
  const accountsMap = {};
@@ -190,7 +185,7 @@ const selectAllMultichainAssets = createAssetListSelector([
190
185
  groupChainAssets.push({
191
186
  accountType: type,
192
187
  assetId,
193
- isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),
188
+ isNative: caipAsset.assetNamespace === 'slip44',
194
189
  image: assetMetadata.iconUrl,
195
190
  name: assetMetadata.name ?? assetMetadata.symbol ?? asset,
196
191
  symbol: assetMetadata.symbol ?? asset,
@@ -1 +1 @@
1
- {"version":3,"file":"token-selectors.mjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,mCAAmC;AAGjE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAY,wBAAwB;AAC5E,OAAO,EAAE,cAAc,EAAE,iBAAiB;AAE1C,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC7B,gCAA4B;AAK7B,OAAO,EAAE,qBAAqB,EAAE,8CAA0C;AAa1E,2GAA2G;AAC3G,MAAM,2BAA2B,GAAG;IAClC,kDAAkD;IAClD,oDAAoD;CACrD,CAAC;AAmEF,MAAM,uBAAuB,GAAG,cAAc,CAAC,SAAS,EAAkB,CAAC;AAE3E,MAAM,0BAA0B,GAAG,uBAAuB,CACxD,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EACjE,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE;IAChC,MAAM,WAAW,GAOb,EAAE,CAAC;IACP,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;QAC3D,KAAK,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACpE,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE;gBAChC,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAE7D,WAAW;gBACT,gFAAgF;gBAChF,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACvC,CAAC,CAAC,eAAe,CAAC,OAAO;oBACzB,CAAC,CAAC,SAAS,CACd,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;aAC/D;SACF;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,mGAAmG;AACnG,MAAM,iCAAiC,GAAG,uBAAuB,CAC/D;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB;IAClC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;IAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,8BAA8B;CAChD,EACD,CACE,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,iBAAiB,CAC+B,EAAE;QAClD,KAAK,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3D,aAAa,CACd,EAAE;YACD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,OAAO,EAAE;gBACZ,SAAS;aACV;YAED,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;YAEpD,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;YACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;YAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;YAE9D,gEAAgE;YAChE,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,IAAI,KAAK,CAAC;YAEnD,MAAM,cAAc,GAClB,8BAA8B,CAAC,OAAO,CAAC,EAAE,cAAc,IAAI,QAAQ,CAAC;YAEtE,MAAM,WAAW,GAAG;gBAClB,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC;gBACvC,QAAQ,EAAE,EAAE;gBACZ,IAAI,EAAE,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc;gBAC5D,MAAM,EAAE,cAAc;gBACtB,uDAAuD;gBACvD,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,QAAQ,GAAG,yBAAyB,CACxC,UAAU,EACV,WAAW,CAAC,QAAQ,EACpB,UAAU,EACV,aAAa,EACb,OAAO,EACP,WAAW,CAAC,OAAO,CACpB,CAAC;YAEF,gBAAgB,CAAC,IAAI,CAAC;gBACpB,WAAW,EAAE,IAAsB;gBACnC,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,SAAS;gBACT,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,UAAU;gBACV,OAAO,EAAE,4BAA4B,CACnC,WAAW,CAAC,UAAU,CAAC,EACvB,WAAW,CAAC,QAAQ,CACrB;gBACD,IAAI,EAAE,QAAQ;oBACZ,CAAC,CAAC;wBACE,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,QAAQ,EAAE,eAAe;wBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;qBACxC;oBACH,CAAC,CAAC,SAAS;gBACb,OAAO;aACR,CAAC,CAAC;SACJ;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,uBAAuB,CAChD;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB;IACjC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa;IAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;CACjC,EACD,CACE,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,aAAa,EACb,eAAe,EACf,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAG1D,EAAE;QACH,KAAK,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAC1D,WAAW,CACQ,EAAE;YACrB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;gBACjC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAc,CAAC;gBAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE;oBACZ,SAAS;iBACV;gBAED,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;gBAEpD,IACE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EACnE;oBACA,SAAS;iBACV;gBAED,MAAM,UAAU,GACd,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;gBAE3D,IAAI,CAAC,UAAU,EAAE;oBACf,SAAS;iBACV;gBAED,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;gBACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;gBAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;gBAE9D,MAAM,QAAQ,GAAG,yBAAyB,CACxC,UAAU,EACV,KAAK,CAAC,QAAQ,EACd,UAAU,EACV,aAAa,EACb,OAAO,EACP,YAAY,CACb,CAAC;gBAEF,gBAAgB,CAAC,IAAI,CAAC;oBACpB,WAAW,EAAE,IAAsB;oBACnC,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,YAAY;oBACrB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;oBACxB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM;oBAChC,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS;oBACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,UAAU;oBACV,OAAO,EAAE,4BAA4B,CACnC,WAAW,CAAC,UAAU,CAAC,EACvB,KAAK,CAAC,QAAQ,CACf;oBACD,IAAI,EAAE,QAAQ;wBACZ,CAAC,CAAC;4BACE,OAAO,EAAE,QAAQ,CAAC,OAAO;4BACzB,QAAQ,EAAE,eAAe;4BACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;yBACxC;wBACH,CAAC,CAAC,SAAS;oBACb,OAAO;iBACR,CAAC,CAAC;aACJ;SACF;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,yBAAyB,GAAG,uBAAuB,CACvD;IACE,0BAA0B;IAC1B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc;IAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB;IACjC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc;IAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;IACzB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;IAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe;CACjC,EACD,CACE,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,EAAE;;IACF,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;QACzE,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE;YACnC,IAAI,SAAgD,CAAC;YACrD,IAAI;gBACF,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;aACzC;YAAC,MAAM;gBACN,6FAA6F;gBAC7F,SAAS;aACV;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAExE,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,EAAE;gBAC9B,SAAS;aACV;YAED,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YAEzC,IAAI,uBAAuB,EAAE,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC3D,SAAS;aACV;YAED,WAAW,CAAC,cAAc,MAA1B,WAAW,CAAC,cAAc,IAAM,EAAE,EAAC;YACnC,MAAA,WAAW,CAAC,cAAc,CAAC,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,EAAC;YAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;YAE9D,MAAM,OAAO,GAKG,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAEzD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CACvC,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;gBAChC,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CACvC,EAAE,QAAQ,CAAC;YAEZ,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,SAAS,EAAE;gBACtC,SAAS;aACV;YAED,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEtE,IAAI,CAAC,UAAU,EAAE;gBACf,SAAS;aACV;YAED,MAAM,QAAQ,GAAG,gCAAgC,CAC/C,OAAO,EACP,yBAAyB,EACzB,OAAO,CACR,CAAC;YAEF,gGAAgG;YAChG,gBAAgB,CAAC,IAAI,CAAC;gBACpB,WAAW,EAAE,IAA6B;gBAC1C,OAAO;gBACP,QAAQ,EAAE,2BAA2B,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACvD,KAAK,EAAE,aAAa,CAAC,OAAO;gBAC5B,IAAI,EAAE,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK;gBACzD,MAAM,EAAE,aAAa,CAAC,MAAM,IAAI,KAAK;gBACrC,SAAS;gBACT,QAAQ;gBACR,UAAU;gBACV,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,IAAI,EAAE,QAAQ;oBACZ,CAAC,CAAC;wBACE,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,QAAQ,EAAE,eAAe;wBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;qBACxC;oBACH,CAAC,CAAC,SAAS;gBACb,OAAO;aACR,CAAC,CAAC;SACJ;KACF;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,eAAe,GAAG,uBAAuB,CAC7C;IACE,kBAAkB;IAClB,yBAAyB;IACzB,iCAAiC;CAClC,EACD,CAAC,SAAS,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,EAAE;IACxD,MAAM,WAAW,GAAyB,EAAE,CAAC;IAE7C,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEpC,WAAW,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAE3C,WAAW,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IAEnD,OAAO,WAAW,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kCAAkC,GAAG,uBAAuB,CACvE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAC/C,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE;IAC3B,MAAM,EAAE,oBAAoB,EAAE,GAAG,WAAW,CAAC;IAC7C,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,EAAE,CAAC;KACX;IACD,OAAO,WAAW,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC,CACF,CAAC;AAEF,6HAA6H;AAC7H;;;;;GAKG;AACH,SAAS,WAAW,CAClB,cAAoC,EACpC,SAA+B;IAE/B,KAAK,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAGnE,EAAE;QACH,MAAM,0BAA0B,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAElE,IAAI,CAAC,0BAA0B,EAAE;YAC/B,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YACpC,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBAClE,cAAc,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;aAC5D;SACF;aAAM;YACL,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBAClE,0BAA0B,CAAC,OAAO,MAAlC,0BAA0B,CAAC,OAAO,IAAM,EAAE,EAAC;gBAC3C,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;aAC1D;SACF;KACF;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,yBAAyB,CAChC,UAAe,EACf,QAAgB,EAChB,UAAmD,EACnD,aAAiD,EACjD,OAAY,EACZ,YAAiB;IAEjB,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5D,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE;QACjC,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,WAAW,GACf,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QAClD,eAAe,CAAC,KAAK;QACrB,YAAY,CAAC,cAAc,CAAC;IAE9B,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,cAAc,EAAE,YAAY,CAAC,cAAc;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gCAAgC,CACvC,OAAyC,EACzC,yBAAkF,EAClF,OAAkD;IAElD,MAAM,eAAe,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE;QAC1B,OAAO,SAAS,CAAC;KAClB;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;QAC9D,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport {\n parseBalanceWithDecimals,\n stringifyBalanceWithDecimals,\n} from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\ntype AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\n// If this gets out of hand with other chains, we should probably have a permanent object that defines them\nconst MULTICHAIN_NATIVE_ASSET_IDS = [\n `bip122:000000000019d6689c085ae165831e93/slip44:0`,\n `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501`,\n];\n\ntype EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;\ntype MultichainAccountType = Exclude<\n InternalAccount['type'],\n `eip155:${string}`\n>;\n\nexport type Asset = (\n | {\n accountType: EvmAccountType;\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n accountType: MultichainAccountType;\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n accountId: string;\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n rawBalance: Hex;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n allIgnoredAssets: MultichainAssetsControllerState['allIgnoredAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<\n string,\n {\n accountGroupId: AccountGroupId;\n type: InternalAccount['type'];\n accountId: string;\n }\n > = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = { accountGroupId, type: internalAccount.type, accountId };\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const account = accountsMap[accountAddress.toLowerCase()];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n // If a native balance is missing, we still want to show it as 0\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n accountId,\n decimals: nativeToken.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const account = accountsMap[accountAddress];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n accountId,\n decimals: token.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.allIgnoredAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n ignoredMultichainAssets,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const account = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!account || !assetMetadata) {\n continue;\n }\n\n const { accountGroupId, type } = account;\n\n if (ignoredMultichainAssets?.[accountId]?.includes(assetId)) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n const decimals = assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals;\n\n if (!balance || decimals === undefined) {\n continue;\n }\n\n const rawBalance = parseBalanceWithDecimals(balance.amount, decimals);\n\n if (!rawBalance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n accountType: type as MultichainAccountType,\n assetId,\n isNative: MULTICHAIN_NATIVE_ASSET_IDS.includes(assetId),\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n accountId,\n decimals,\n rawBalance,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = {};\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAssets[accountGroupId][network] = [...chainAssets];\n }\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
1
+ {"version":3,"file":"token-selectors.mjs","sourceRoot":"","sources":["../../src/selectors/token-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType, type Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport {\n parseBalanceWithDecimals,\n stringifyBalanceWithDecimals,\n} from './stringify-balance';\nimport type { CurrencyRateState } from '../CurrencyRateController';\nimport type { MultichainAssetsControllerState } from '../MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from '../MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from '../MultichainBalancesController';\nimport { getNativeTokenAddress } from '../token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from '../TokenBalancesController';\nimport type { Token, TokenRatesControllerState } from '../TokenRatesController';\nimport type { TokensControllerState } from '../TokensController';\n\nexport type AssetsByAccountGroup = {\n [accountGroupId: AccountGroupId]: AccountGroupAssets;\n};\n\nexport type AccountGroupAssets = {\n [network: string]: Asset[];\n};\n\ntype EvmAccountType = Extract<InternalAccount['type'], `eip155:${string}`>;\ntype MultichainAccountType = Exclude<\n InternalAccount['type'],\n `eip155:${string}`\n>;\n\nexport type Asset = (\n | {\n accountType: EvmAccountType;\n assetId: Hex; // This is also the address for EVM tokens\n address: Hex;\n chainId: Hex;\n }\n | {\n accountType: MultichainAccountType;\n assetId: `${string}:${string}/${string}:${string}`;\n chainId: `${string}:${string}`;\n }\n) & {\n accountId: string;\n image: string;\n name: string;\n symbol: string;\n decimals: number;\n isNative: boolean;\n rawBalance: Hex;\n balance: string;\n fiat:\n | {\n balance: number;\n currency: string;\n conversionRate: number;\n }\n | undefined;\n};\n\nexport type AssetListState = {\n accountTree: AccountTreeControllerState['accountTree'];\n internalAccounts: AccountsControllerState['internalAccounts'];\n allTokens: TokensControllerState['allTokens'];\n allIgnoredTokens: TokensControllerState['allIgnoredTokens'];\n tokenBalances: TokenBalancesControllerState['tokenBalances'];\n marketData: TokenRatesControllerState['marketData'];\n currencyRates: CurrencyRateState['currencyRates'];\n accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n allIgnoredAssets: MultichainAssetsControllerState['allIgnoredAssets'];\n assetsMetadata: MultichainAssetsControllerState['assetsMetadata'];\n balances: MultichainBalancesControllerState['balances'];\n conversionRates: MultichainAssetsRatesControllerState['conversionRates'];\n currentCurrency: CurrencyRateState['currentCurrency'];\n networkConfigurationsByChainId: NetworkState['networkConfigurationsByChainId'];\n // This is the state from AccountTrackerController. The state is different on mobile and extension\n // accountsByChainId with a balance is the only field that both clients have in common\n // This field could be removed once TokenBalancesController returns native balances\n accountsByChainId: Record<\n Hex,\n Record<\n Hex,\n {\n balance: Hex | null;\n }\n >\n >;\n};\n\nconst createAssetListSelector = createSelector.withTypes<AssetListState>();\n\nconst selectAccountsToGroupIdMap = createAssetListSelector(\n [(state) => state.accountTree, (state) => state.internalAccounts],\n (accountTree, internalAccounts) => {\n const accountsMap: Record<\n string,\n {\n accountGroupId: AccountGroupId;\n type: InternalAccount['type'];\n accountId: string;\n }\n > = {};\n for (const { groups } of Object.values(accountTree.wallets)) {\n for (const { id: accountGroupId, accounts } of Object.values(groups)) {\n for (const accountId of accounts) {\n const internalAccount = internalAccounts.accounts[accountId];\n\n accountsMap[\n // TODO: We would not need internalAccounts if evmTokens state had the accountId\n internalAccount.type.startsWith('eip155')\n ? internalAccount.address\n : accountId\n ] = { accountGroupId, type: internalAccount.type, accountId };\n }\n }\n }\n\n return accountsMap;\n },\n);\n\n// TODO: This selector will not be needed once the native balances are part of the evm tokens state\nconst selectAllEvmAccountNativeBalances = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsByChainId,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n (state) => state.networkConfigurationsByChainId,\n ],\n (\n accountsMap,\n accountsByChainId,\n marketData,\n currencyRates,\n currentCurrency,\n networkConfigurationsByChainId,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainAccounts] of Object.entries(\n accountsByChainId,\n ) as [Hex, Record<Hex, { balance: Hex | null }>][]) {\n for (const [accountAddress, accountBalance] of Object.entries(\n chainAccounts,\n )) {\n const account = accountsMap[accountAddress.toLowerCase()];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n // If a native balance is missing, we still want to show it as 0\n const rawBalance = accountBalance.balance || '0x0';\n\n const nativeCurrency =\n networkConfigurationsByChainId[chainId]?.nativeCurrency || 'NATIVE';\n\n const nativeToken = {\n address: getNativeTokenAddress(chainId),\n decimals: 18,\n name: nativeCurrency === 'ETH' ? 'Ethereum' : nativeCurrency,\n symbol: nativeCurrency,\n // This field need to be filled at client level for now\n image: '',\n };\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n nativeToken.decimals,\n marketData,\n currencyRates,\n chainId,\n nativeToken.address,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: nativeToken.address,\n isNative: true,\n address: nativeToken.address,\n image: nativeToken.image,\n name: nativeToken.name,\n symbol: nativeToken.symbol,\n accountId,\n decimals: nativeToken.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n nativeToken.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllEvmAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.allTokens,\n (state) => state.allIgnoredTokens,\n (state) => state.tokenBalances,\n (state) => state.marketData,\n (state) => state.currencyRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n evmTokens,\n ignoredEvmTokens,\n tokenBalances,\n marketData,\n currencyRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [chainId, chainTokens] of Object.entries(evmTokens) as [\n Hex,\n { [key: string]: Token[] },\n ][]) {\n for (const [accountAddress, addressTokens] of Object.entries(\n chainTokens,\n ) as [Hex, Token[]][]) {\n for (const token of addressTokens) {\n const tokenAddress = token.address as Hex;\n const account = accountsMap[accountAddress];\n if (!account) {\n continue;\n }\n\n const { accountGroupId, type, accountId } = account;\n\n if (\n ignoredEvmTokens[chainId]?.[accountAddress]?.includes(tokenAddress)\n ) {\n continue;\n }\n\n const rawBalance =\n tokenBalances[accountAddress]?.[chainId]?.[tokenAddress];\n\n if (!rawBalance) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const fiatData = getFiatBalanceForEvmToken(\n rawBalance,\n token.decimals,\n marketData,\n currencyRates,\n chainId,\n tokenAddress,\n );\n\n groupChainAssets.push({\n accountType: type as EvmAccountType,\n assetId: tokenAddress,\n isNative: false,\n address: tokenAddress,\n image: token.image ?? '',\n name: token.name ?? token.symbol,\n symbol: token.symbol,\n accountId,\n decimals: token.decimals,\n rawBalance,\n balance: stringifyBalanceWithDecimals(\n hexToBigInt(rawBalance),\n token.decimals,\n ),\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllMultichainAssets = createAssetListSelector(\n [\n selectAccountsToGroupIdMap,\n (state) => state.accountsAssets,\n (state) => state.allIgnoredAssets,\n (state) => state.assetsMetadata,\n (state) => state.balances,\n (state) => state.conversionRates,\n (state) => state.currentCurrency,\n ],\n (\n accountsMap,\n multichainTokens,\n ignoredMultichainAssets,\n multichainAssetsMetadata,\n multichainBalances,\n multichainConversionRates,\n currentCurrency,\n ) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n for (const [accountId, accountAssets] of Object.entries(multichainTokens)) {\n for (const assetId of accountAssets) {\n let caipAsset: ReturnType<typeof parseCaipAssetType>;\n try {\n caipAsset = parseCaipAssetType(assetId);\n } catch {\n // TODO: We should log this error when we have the ability to inject a logger from the client\n continue;\n }\n\n const { chainId } = caipAsset;\n const asset = `${caipAsset.assetNamespace}:${caipAsset.assetReference}`;\n\n const account = accountsMap[accountId];\n const assetMetadata = multichainAssetsMetadata[assetId];\n if (!account || !assetMetadata) {\n continue;\n }\n\n const { accountGroupId, type } = account;\n\n if (ignoredMultichainAssets?.[accountId]?.includes(assetId)) {\n continue;\n }\n\n groupAssets[accountGroupId] ??= {};\n groupAssets[accountGroupId][chainId] ??= [];\n const groupChainAssets = groupAssets[accountGroupId][chainId];\n\n const balance:\n | {\n amount: string;\n unit: string;\n }\n | undefined = multichainBalances[accountId]?.[assetId];\n\n const decimals = assetMetadata.units.find(\n (unit) =>\n unit.name === assetMetadata.name &&\n unit.symbol === assetMetadata.symbol,\n )?.decimals;\n\n if (!balance || decimals === undefined) {\n continue;\n }\n\n const rawBalance = parseBalanceWithDecimals(balance.amount, decimals);\n\n if (!rawBalance) {\n continue;\n }\n\n const fiatData = getFiatBalanceForMultichainAsset(\n balance,\n multichainConversionRates,\n assetId,\n );\n\n // TODO: We shouldn't have to rely on fallbacks for name and symbol, they should not be optional\n groupChainAssets.push({\n accountType: type as MultichainAccountType,\n assetId,\n isNative: caipAsset.assetNamespace === 'slip44',\n image: assetMetadata.iconUrl,\n name: assetMetadata.name ?? assetMetadata.symbol ?? asset,\n symbol: assetMetadata.symbol ?? asset,\n accountId,\n decimals,\n rawBalance,\n balance: balance.amount,\n fiat: fiatData\n ? {\n balance: fiatData.balance,\n currency: currentCurrency,\n conversionRate: fiatData.conversionRate,\n }\n : undefined,\n chainId,\n });\n }\n }\n\n return groupAssets;\n },\n);\n\nconst selectAllAssets = createAssetListSelector(\n [\n selectAllEvmAssets,\n selectAllMultichainAssets,\n selectAllEvmAccountNativeBalances,\n ],\n (evmAssets, multichainAssets, evmAccountNativeBalances) => {\n const groupAssets: AssetsByAccountGroup = {};\n\n mergeAssets(groupAssets, evmAssets);\n\n mergeAssets(groupAssets, multichainAssets);\n\n mergeAssets(groupAssets, evmAccountNativeBalances);\n\n return groupAssets;\n },\n);\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n [selectAllAssets, (state) => state.accountTree],\n (groupAssets, accountTree) => {\n const { selectedAccountGroup } = accountTree;\n if (!selectedAccountGroup) {\n return {};\n }\n return groupAssets[selectedAccountGroup] || {};\n },\n);\n\n// TODO: Once native assets are part of the evm tokens state, this function can be simplified as chains will always be unique\n/**\n * Merges the new assets into the existing assets\n *\n * @param existingAssets - The existing assets\n * @param newAssets - The new assets\n */\nfunction mergeAssets(\n existingAssets: AssetsByAccountGroup,\n newAssets: AssetsByAccountGroup,\n) {\n for (const [accountGroupId, accountAssets] of Object.entries(newAssets) as [\n AccountGroupId,\n AccountGroupAssets,\n ][]) {\n const existingAccountGroupAssets = existingAssets[accountGroupId];\n\n if (!existingAccountGroupAssets) {\n existingAssets[accountGroupId] = {};\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAssets[accountGroupId][network] = [...chainAssets];\n }\n } else {\n for (const [network, chainAssets] of Object.entries(accountAssets)) {\n existingAccountGroupAssets[network] ??= [];\n existingAccountGroupAssets[network].push(...chainAssets);\n }\n }\n }\n}\n\n/**\n * @param rawBalance - The balance of the token\n * @param decimals - The decimals of the token\n * @param marketData - The market data for the token\n * @param currencyRates - The currency rates for the token\n * @param chainId - The chain id of the token\n * @param tokenAddress - The address of the token\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the market data or currency rates.\n */\nfunction getFiatBalanceForEvmToken(\n rawBalance: Hex,\n decimals: number,\n marketData: TokenRatesControllerState['marketData'],\n currencyRates: CurrencyRateState['currencyRates'],\n chainId: Hex,\n tokenAddress: Hex,\n) {\n const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n if (!tokenMarketData) {\n return undefined;\n }\n\n const currencyRate = currencyRates[tokenMarketData.currency];\n\n if (!currencyRate?.conversionRate) {\n return undefined;\n }\n\n const fiatBalance =\n (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n tokenMarketData.price *\n currencyRate.conversionRate;\n\n return {\n balance: fiatBalance,\n conversionRate: currencyRate.conversionRate,\n };\n}\n\n/**\n * @param balance - The balance of the asset, in the format { amount: string; unit: string }\n * @param balance.amount - The amount of the balance\n * @param balance.unit - The unit of the balance\n * @param multichainConversionRates - The conversion rates for the multichain asset\n * @param assetId - The asset id of the asset\n * @returns The price and currency of the token in the current currency. Returns undefined if the asset is not found in the conversion rates.\n */\nfunction getFiatBalanceForMultichainAsset(\n balance: { amount: string; unit: string },\n multichainConversionRates: MultichainAssetsRatesControllerState['conversionRates'],\n assetId: `${string}:${string}/${string}:${string}`,\n) {\n const assetMarketData = multichainConversionRates[assetId];\n\n if (!assetMarketData?.rate) {\n return undefined;\n }\n\n return {\n balance: Number(balance.amount) * Number(assetMarketData.rate),\n conversionRate: Number(assetMarketData.rate),\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchTokenMetadata = exports.searchTokens = exports.fetchTokenListByChainId = exports.TOKEN_METADATA_NO_SUPPORT_ERROR = exports.TOKEN_END_POINT_API = void 0;
3
+ exports.fetchTokenMetadata = exports.getTrendingTokens = exports.searchTokens = exports.fetchTokenListByChainId = exports.TOKEN_METADATA_NO_SUPPORT_ERROR = exports.TOKEN_END_POINT_API = void 0;
4
4
  const controller_utils_1 = require("@metamask/controller-utils");
5
5
  const assetsUtil_1 = require("./assetsUtil.cjs");
6
6
  exports.TOKEN_END_POINT_API = 'https://token.api.cx.metamask.io';
@@ -13,8 +13,6 @@ exports.TOKEN_METADATA_NO_SUPPORT_ERROR = 'TokenService Error: Network does not
13
13
  */
14
14
  function getTokensURL(chainId) {
15
15
  const occurrenceFloor = chainId === controller_utils_1.ChainId['linea-mainnet'] ? 1 : 3;
16
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
17
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
18
16
  return `${exports.TOKEN_END_POINT_API}/tokens/${(0, controller_utils_1.convertHexToDecimal)(chainId)}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`;
19
17
  }
20
18
  /**
@@ -25,8 +23,6 @@ function getTokensURL(chainId) {
25
23
  * @returns The token metadata URL.
26
24
  */
27
25
  function getTokenMetadataURL(chainId, tokenAddress) {
28
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
29
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
30
26
  return `${exports.TOKEN_END_POINT_API}/token/${(0, controller_utils_1.convertHexToDecimal)(chainId)}?address=${tokenAddress}`;
31
27
  }
32
28
  /**
@@ -44,6 +40,33 @@ function getTokenSearchURL(chainIds, query, limit = 10) {
44
40
  .join(',');
45
41
  return `${exports.TOKEN_END_POINT_API}/tokens/search?chainIds=${encodedChainIds}&query=${encodedQuery}&limit=${limit}`;
46
42
  }
43
+ /**
44
+ * Get the trending tokens URL for the given networks and search query.
45
+ *
46
+ * @param options - Options for getting trending tokens.
47
+ * @param options.chainIds - Array of CAIP format chain IDs (e.g., ['eip155:1', 'eip155:137', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp']).
48
+ * @param options.sortBy - The sort by field.
49
+ * @param options.minLiquidity - The minimum liquidity.
50
+ * @param options.minVolume24hUsd - The minimum volume 24h in USD.
51
+ * @param options.maxVolume24hUsd - The maximum volume 24h in USD.
52
+ * @param options.minMarketCap - The minimum market cap.
53
+ * @param options.maxMarketCap - The maximum market cap.
54
+ * @returns The trending tokens URL.
55
+ */
56
+ function getTrendingTokensURL(options) {
57
+ const encodedChainIds = options.chainIds
58
+ .map((id) => encodeURIComponent(id))
59
+ .join(',');
60
+ // Add the rest of query params if they are defined
61
+ const queryParams = new URLSearchParams();
62
+ const { chainIds, ...rest } = options;
63
+ Object.entries(rest).forEach(([key, value]) => {
64
+ if (value !== undefined) {
65
+ queryParams.append(key, String(value));
66
+ }
67
+ });
68
+ return `${exports.TOKEN_END_POINT_API}/v3/tokens/trending?chainIds=${encodedChainIds}${queryParams.toString() ? `&${queryParams.toString()}` : ''}`;
69
+ }
47
70
  const tenSecondsInMilliseconds = 10000;
48
71
  // Token list averages 1.6 MB in size
49
72
  // timeoutFetch by default has a 500ms timeout, which will almost always timeout given the response size.
@@ -104,6 +127,50 @@ async function searchTokens(chainIds, query, { limit = 10 } = {}) {
104
127
  }
105
128
  }
106
129
  exports.searchTokens = searchTokens;
130
+ /**
131
+ * Get the trending tokens for the given chains.
132
+ *
133
+ * @param options - Options for getting trending tokens.
134
+ * @param options.chainIds - The chains to get the trending tokens for.
135
+ * @param options.sortBy - The sort by field.
136
+ * @param options.minLiquidity - The minimum liquidity.
137
+ * @param options.minVolume24hUsd - The minimum volume 24h in USD.
138
+ * @param options.maxVolume24hUsd - The maximum volume 24h in USD.
139
+ * @param options.minMarketCap - The minimum market cap.
140
+ * @param options.maxMarketCap - The maximum market cap.
141
+ * @returns The trending tokens.
142
+ * @throws Will throw if the request fails.
143
+ */
144
+ async function getTrendingTokens({ chainIds, sortBy, minLiquidity, minVolume24hUsd, maxVolume24hUsd, minMarketCap, maxMarketCap, }) {
145
+ if (chainIds.length === 0) {
146
+ console.error('No chains provided');
147
+ return [];
148
+ }
149
+ const trendingTokensURL = getTrendingTokensURL({
150
+ chainIds,
151
+ sortBy,
152
+ minLiquidity,
153
+ minVolume24hUsd,
154
+ maxVolume24hUsd,
155
+ minMarketCap,
156
+ maxMarketCap,
157
+ });
158
+ try {
159
+ const result = await (0, controller_utils_1.handleFetch)(trendingTokensURL);
160
+ // Validate that the API returned an array
161
+ if (Array.isArray(result)) {
162
+ return result;
163
+ }
164
+ // Handle non-expected responses
165
+ console.error('Trending tokens API returned non-array response:', result);
166
+ return [];
167
+ }
168
+ catch (error) {
169
+ console.error('Trending tokens request failed:', error);
170
+ return [];
171
+ }
172
+ }
173
+ exports.getTrendingTokens = getTrendingTokens;
107
174
  /**
108
175
  * Fetch metadata for the token address provided for a given network. This request is cancellable
109
176
  * using the abort signal passed in.
@@ -115,8 +182,6 @@ exports.searchTokens = searchTokens;
115
182
  * @param options.timeout - The fetch timeout.
116
183
  * @returns The token metadata, or `undefined` if the request was either aborted or failed.
117
184
  */
118
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
119
- // eslint-disable-next-line @typescript-eslint/naming-convention
120
185
  async function fetchTokenMetadata(chainId, tokenAddress, abortSignal, { timeout = defaultTimeout } = {}) {
121
186
  if (!(0, assetsUtil_1.isTokenListSupportedForNetwork)(chainId)) {
122
187
  throw new Error(exports.TOKEN_METADATA_NO_SUPPORT_ERROR);
@@ -169,8 +234,6 @@ async function parseJsonResponse(apiResponse) {
169
234
  const responseObj = await apiResponse.json();
170
235
  // api may return errors as json without setting an error http status code
171
236
  if (responseObj?.error) {
172
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
173
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
174
237
  throw new Error(`TokenService Error: ${responseObj.error}`);
175
238
  }
176
239
  return responseObj;
@@ -1 +1 @@
1
- {"version":3,"file":"token-service.cjs","sourceRoot":"","sources":["../src/token-service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChainId,\n convertHexToDecimal,\n handleFetch,\n timeoutFetch,\n} from '@metamask/controller-utils';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport { isTokenListSupportedForNetwork } from './assetsUtil';\n\nexport const TOKEN_END_POINT_API = 'https://token.api.cx.metamask.io';\nexport const TOKEN_METADATA_NO_SUPPORT_ERROR =\n 'TokenService Error: Network does not support fetchTokenMetadata';\n\n/**\n * Get the tokens URL for a specific network.\n *\n * @param chainId - The chain ID of the network the tokens requested are on.\n * @returns The tokens URL.\n */\nfunction getTokensURL(chainId: Hex) {\n const occurrenceFloor = chainId === ChainId['linea-mainnet'] ? 1 : 3;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${TOKEN_END_POINT_API}/tokens/${convertHexToDecimal(\n chainId,\n )}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`;\n}\n\n/**\n * Get the token metadata URL for the given network and token.\n *\n * @param chainId - The chain ID of the network the token is on.\n * @param tokenAddress - The token address.\n * @returns The token metadata URL.\n */\nfunction getTokenMetadataURL(chainId: Hex, tokenAddress: string) {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${TOKEN_END_POINT_API}/token/${convertHexToDecimal(\n chainId,\n )}?address=${tokenAddress}`;\n}\n\n/**\n * Get the token search URL for the given networks and search query.\n *\n * @param chainIds - Array of CAIP format chain IDs (e.g., 'eip155:1', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp').\n * @param query - The search query (token name, symbol, or address).\n * @param limit - Optional limit for the number of results (defaults to 10).\n * @returns The token search URL.\n */\nfunction getTokenSearchURL(chainIds: CaipChainId[], query: string, limit = 10) {\n const encodedQuery = encodeURIComponent(query);\n const encodedChainIds = chainIds\n .map((id) => encodeURIComponent(id))\n .join(',');\n return `${TOKEN_END_POINT_API}/tokens/search?chainIds=${encodedChainIds}&query=${encodedQuery}&limit=${limit}`;\n}\n\nconst tenSecondsInMilliseconds = 10_000;\n\n// Token list averages 1.6 MB in size\n// timeoutFetch by default has a 500ms timeout, which will almost always timeout given the response size.\nconst defaultTimeout = tenSecondsInMilliseconds;\n\n/**\n * Fetch the list of token metadata for a given network. This request is cancellable using the\n * abort signal passed in.\n *\n * @param chainId - The chain ID of the network the requested tokens are on.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param options - Additional fetch options.\n * @param options.timeout - The fetch timeout.\n * @returns The token list, or `undefined` if the request was cancelled.\n */\nexport async function fetchTokenListByChainId(\n chainId: Hex,\n abortSignal: AbortSignal,\n { timeout = defaultTimeout } = {},\n): Promise<unknown> {\n const tokenURL = getTokensURL(chainId);\n const response = await queryApi(tokenURL, abortSignal, timeout);\n if (response) {\n const result = await parseJsonResponse(response);\n if (Array.isArray(result) && chainId === ChainId['linea-mainnet']) {\n return result.filter(\n (elm) =>\n elm.aggregators.includes('lineaTeam') || elm.aggregators.length >= 3,\n );\n }\n return result;\n }\n return undefined;\n}\n\n/**\n * Search for tokens across one or more networks by query string using CAIP format chain IDs.\n *\n * @param chainIds - Array of CAIP format chain IDs (e.g., ['eip155:1', 'eip155:137', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp']).\n * @param query - The search query (token name, symbol, or address).\n * @param options - Additional fetch options.\n * @param options.limit - The maximum number of results to return.\n * @returns Object containing count and data array. Returns { count: 0, data: [] } if request fails.\n */\nexport async function searchTokens(\n chainIds: CaipChainId[],\n query: string,\n { limit = 10 } = {},\n): Promise<{ count: number; data: unknown[] }> {\n if (chainIds.length === 0) {\n return { count: 0, data: [] };\n }\n\n const tokenSearchURL = getTokenSearchURL(chainIds, query, limit);\n\n try {\n const result = await handleFetch(tokenSearchURL);\n\n // The API returns an object with structure: { count: number, data: array, pageInfo: object }\n if (result && typeof result === 'object' && Array.isArray(result.data)) {\n return {\n count: result.count || result.data.length,\n data: result.data,\n };\n }\n\n // Handle non-expected responses\n return { count: 0, data: [] };\n } catch (error) {\n // Handle 400 errors and other failures by returning count 0 and empty array\n console.log('Search request failed:', error);\n return { count: 0, data: [] };\n }\n}\n\n/**\n * Fetch metadata for the token address provided for a given network. This request is cancellable\n * using the abort signal passed in.\n *\n * @param chainId - The chain ID of the network the token is on.\n * @param tokenAddress - The address of the token to fetch metadata for.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param options - Additional fetch options.\n * @param options.timeout - The fetch timeout.\n * @returns The token metadata, or `undefined` if the request was either aborted or failed.\n */\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport async function fetchTokenMetadata<T>(\n chainId: Hex,\n tokenAddress: string,\n abortSignal: AbortSignal,\n { timeout = defaultTimeout } = {},\n): Promise<T | undefined> {\n if (!isTokenListSupportedForNetwork(chainId)) {\n throw new Error(TOKEN_METADATA_NO_SUPPORT_ERROR);\n }\n const tokenMetadataURL = getTokenMetadataURL(chainId, tokenAddress);\n const response = await queryApi(tokenMetadataURL, abortSignal, timeout);\n if (response) {\n return parseJsonResponse(response) as Promise<T>;\n }\n return undefined;\n}\n\n/**\n * Perform fetch request against the api.\n *\n * @param apiURL - The URL of the API to fetch.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param timeout - The fetch timeout.\n * @returns Promise resolving request response.\n */\nasync function queryApi(\n apiURL: string,\n abortSignal: AbortSignal,\n timeout: number,\n): Promise<Response | undefined> {\n const fetchOptions: RequestInit = {\n referrer: apiURL,\n referrerPolicy: 'no-referrer-when-downgrade',\n method: 'GET',\n mode: 'cors',\n signal: abortSignal,\n cache: 'default',\n };\n fetchOptions.headers = new window.Headers();\n fetchOptions.headers.set('Content-Type', 'application/json');\n try {\n return await timeoutFetch(apiURL, fetchOptions, timeout);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('Request is aborted');\n }\n }\n return undefined;\n}\n\n/**\n * Parse an API response and return the response JSON data.\n *\n * @param apiResponse - The API response to parse.\n * @returns The response JSON data.\n * @throws Will throw if the response includes an error.\n */\nasync function parseJsonResponse(apiResponse: Response): Promise<unknown> {\n const responseObj = await apiResponse.json();\n // api may return errors as json without setting an error http status code\n if (responseObj?.error) {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`TokenService Error: ${responseObj.error}`);\n }\n return responseObj;\n}\n"]}
1
+ {"version":3,"file":"token-service.cjs","sourceRoot":"","sources":["../src/token-service.ts"],"names":[],"mappings":";;;AAAA,iEAKoC;AAGpC,iDAA8D;AAEjD,QAAA,mBAAmB,GAAG,kCAAkC,CAAC;AACzD,QAAA,+BAA+B,GAC1C,iEAAiE,CAAC;AAEpE;;;;;GAKG;AACH,SAAS,YAAY,CAAC,OAAY;IAChC,MAAM,eAAe,GAAG,OAAO,KAAK,0BAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,GAAG,2BAAmB,WAAW,IAAA,sCAAmB,EACzD,OAAO,CACR,oBAAoB,eAAe,wHAAwH,CAAC;AAC/J,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,OAAY,EAAE,YAAoB;IAC7D,OAAO,GAAG,2BAAmB,UAAU,IAAA,sCAAmB,EACxD,OAAO,CACR,YAAY,YAAY,EAAE,CAAC;AAC9B,CAAC;AAWD;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,QAAuB,EAAE,KAAa,EAAE,KAAK,GAAG,EAAE;IAC3E,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,QAAQ;SAC7B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;SACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,2BAAmB,2BAA2B,eAAe,UAAU,YAAY,UAAU,KAAK,EAAE,CAAC;AACjH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,oBAAoB,CAAC,OAQ7B;IACC,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ;SACrC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;SACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,mDAAmD;IACnD,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;SACxC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,2BAAmB,gCAAgC,eAAe,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9I,CAAC;AAED,MAAM,wBAAwB,GAAG,KAAM,CAAC;AAExC,qCAAqC;AACrC,yGAAyG;AACzG,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAEhD;;;;;;;;;GASG;AACI,KAAK,UAAU,uBAAuB,CAC3C,OAAY,EACZ,WAAwB,EACxB,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,EAAE;IAEjC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,QAAQ,EAAE;QACZ,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,0BAAO,CAAC,eAAe,CAAC,EAAE;YACjE,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CACvE,CAAC;SACH;QACD,OAAO,MAAM,CAAC;KACf;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAlBD,0DAkBC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,YAAY,CAChC,QAAuB,EACvB,KAAa,EACb,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE;IAEnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KAC/B;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAEjE,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAW,EAAC,cAAc,CAAC,CAAC;QAEjD,6FAA6F;QAC7F,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACtE,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;gBACzC,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC;SACH;QAED,gCAAgC;QAChC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KAC/B;IAAC,OAAO,KAAK,EAAE;QACd,4EAA4E;QAC5E,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KAC/B;AACH,CAAC;AA7BD,oCA6BC;AAwBD;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,iBAAiB,CAAC,EACtC,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,GASb;IACC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpC,OAAO,EAAE,CAAC;KACX;IAED,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;QAC7C,QAAQ;QACR,MAAM;QACN,YAAY;QACZ,eAAe;QACf,eAAe;QACf,YAAY;QACZ,YAAY;KACb,CAAC,CAAC;IAEH,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAW,EAAC,iBAAiB,CAAC,CAAC;QAEpD,0CAA0C;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,OAAO,MAAM,CAAC;SACf;QAED,gCAAgC;QAChC,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,MAAM,CAAC,CAAC;QAC1E,OAAO,EAAE,CAAC;KACX;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AA/CD,8CA+CC;AAED;;;;;;;;;;GAUG;AACI,KAAK,UAAU,kBAAkB,CACtC,OAAY,EACZ,YAAoB,EACpB,WAAwB,EACxB,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,EAAE;IAEjC,IAAI,CAAC,IAAA,2CAA8B,EAAC,OAAO,CAAC,EAAE;QAC5C,MAAM,IAAI,KAAK,CAAC,uCAA+B,CAAC,CAAC;KAClD;IACD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACxE,IAAI,QAAQ,EAAE;QACZ,OAAO,iBAAiB,CAAC,QAAQ,CAAe,CAAC;KAClD;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAfD,gDAeC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,QAAQ,CACrB,MAAc,EACd,WAAwB,EACxB,OAAe;IAEf,MAAM,YAAY,GAAgB;QAChC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,4BAA4B;QAC5C,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,SAAS;KACjB,CAAC;IACF,YAAY,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IAC5C,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAC7D,IAAI;QACF,OAAO,MAAM,IAAA,+BAAY,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;KAC1D;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;YACzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;SACnC;KACF;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,iBAAiB,CAAC,WAAqB;IACpD,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC7C,0EAA0E;IAC1E,IAAI,WAAW,EAAE,KAAK,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;KAC7D;IACD,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import {\n ChainId,\n convertHexToDecimal,\n handleFetch,\n timeoutFetch,\n} from '@metamask/controller-utils';\nimport type { CaipChainId, Hex } from '@metamask/utils';\n\nimport { isTokenListSupportedForNetwork } from './assetsUtil';\n\nexport const TOKEN_END_POINT_API = 'https://token.api.cx.metamask.io';\nexport const TOKEN_METADATA_NO_SUPPORT_ERROR =\n 'TokenService Error: Network does not support fetchTokenMetadata';\n\n/**\n * Get the tokens URL for a specific network.\n *\n * @param chainId - The chain ID of the network the tokens requested are on.\n * @returns The tokens URL.\n */\nfunction getTokensURL(chainId: Hex) {\n const occurrenceFloor = chainId === ChainId['linea-mainnet'] ? 1 : 3;\n\n return `${TOKEN_END_POINT_API}/tokens/${convertHexToDecimal(\n chainId,\n )}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`;\n}\n\n/**\n * Get the token metadata URL for the given network and token.\n *\n * @param chainId - The chain ID of the network the token is on.\n * @param tokenAddress - The token address.\n * @returns The token metadata URL.\n */\nfunction getTokenMetadataURL(chainId: Hex, tokenAddress: string) {\n return `${TOKEN_END_POINT_API}/token/${convertHexToDecimal(\n chainId,\n )}?address=${tokenAddress}`;\n}\n\n/**\n * The sort by field for trending tokens.\n */\nexport type SortTrendingBy =\n | 'm5_trending'\n | 'h1_trending'\n | 'h6_trending'\n | 'h24_trending';\n\n/**\n * Get the token search URL for the given networks and search query.\n *\n * @param chainIds - Array of CAIP format chain IDs (e.g., 'eip155:1', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp').\n * @param query - The search query (token name, symbol, or address).\n * @param limit - Optional limit for the number of results (defaults to 10).\n * @returns The token search URL.\n */\nfunction getTokenSearchURL(chainIds: CaipChainId[], query: string, limit = 10) {\n const encodedQuery = encodeURIComponent(query);\n const encodedChainIds = chainIds\n .map((id) => encodeURIComponent(id))\n .join(',');\n return `${TOKEN_END_POINT_API}/tokens/search?chainIds=${encodedChainIds}&query=${encodedQuery}&limit=${limit}`;\n}\n\n/**\n * Get the trending tokens URL for the given networks and search query.\n *\n * @param options - Options for getting trending tokens.\n * @param options.chainIds - Array of CAIP format chain IDs (e.g., ['eip155:1', 'eip155:137', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp']).\n * @param options.sortBy - The sort by field.\n * @param options.minLiquidity - The minimum liquidity.\n * @param options.minVolume24hUsd - The minimum volume 24h in USD.\n * @param options.maxVolume24hUsd - The maximum volume 24h in USD.\n * @param options.minMarketCap - The minimum market cap.\n * @param options.maxMarketCap - The maximum market cap.\n * @returns The trending tokens URL.\n */\nfunction getTrendingTokensURL(options: {\n chainIds: CaipChainId[];\n sortBy?: SortTrendingBy;\n minLiquidity?: number;\n minVolume24hUsd?: number;\n maxVolume24hUsd?: number;\n minMarketCap?: number;\n maxMarketCap?: number;\n}): string {\n const encodedChainIds = options.chainIds\n .map((id) => encodeURIComponent(id))\n .join(',');\n // Add the rest of query params if they are defined\n const queryParams = new URLSearchParams();\n const { chainIds, ...rest } = options;\n Object.entries(rest).forEach(([key, value]) => {\n if (value !== undefined) {\n queryParams.append(key, String(value));\n }\n });\n\n return `${TOKEN_END_POINT_API}/v3/tokens/trending?chainIds=${encodedChainIds}${queryParams.toString() ? `&${queryParams.toString()}` : ''}`;\n}\n\nconst tenSecondsInMilliseconds = 10_000;\n\n// Token list averages 1.6 MB in size\n// timeoutFetch by default has a 500ms timeout, which will almost always timeout given the response size.\nconst defaultTimeout = tenSecondsInMilliseconds;\n\n/**\n * Fetch the list of token metadata for a given network. This request is cancellable using the\n * abort signal passed in.\n *\n * @param chainId - The chain ID of the network the requested tokens are on.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param options - Additional fetch options.\n * @param options.timeout - The fetch timeout.\n * @returns The token list, or `undefined` if the request was cancelled.\n */\nexport async function fetchTokenListByChainId(\n chainId: Hex,\n abortSignal: AbortSignal,\n { timeout = defaultTimeout } = {},\n): Promise<unknown> {\n const tokenURL = getTokensURL(chainId);\n const response = await queryApi(tokenURL, abortSignal, timeout);\n if (response) {\n const result = await parseJsonResponse(response);\n if (Array.isArray(result) && chainId === ChainId['linea-mainnet']) {\n return result.filter(\n (elm) =>\n elm.aggregators.includes('lineaTeam') || elm.aggregators.length >= 3,\n );\n }\n return result;\n }\n return undefined;\n}\n\n/**\n * Search for tokens across one or more networks by query string using CAIP format chain IDs.\n *\n * @param chainIds - Array of CAIP format chain IDs (e.g., ['eip155:1', 'eip155:137', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp']).\n * @param query - The search query (token name, symbol, or address).\n * @param options - Additional fetch options.\n * @param options.limit - The maximum number of results to return.\n * @returns Object containing count and data array. Returns { count: 0, data: [] } if request fails.\n */\nexport async function searchTokens(\n chainIds: CaipChainId[],\n query: string,\n { limit = 10 } = {},\n): Promise<{ count: number; data: unknown[] }> {\n if (chainIds.length === 0) {\n return { count: 0, data: [] };\n }\n\n const tokenSearchURL = getTokenSearchURL(chainIds, query, limit);\n\n try {\n const result = await handleFetch(tokenSearchURL);\n\n // The API returns an object with structure: { count: number, data: array, pageInfo: object }\n if (result && typeof result === 'object' && Array.isArray(result.data)) {\n return {\n count: result.count || result.data.length,\n data: result.data,\n };\n }\n\n // Handle non-expected responses\n return { count: 0, data: [] };\n } catch (error) {\n // Handle 400 errors and other failures by returning count 0 and empty array\n console.log('Search request failed:', error);\n return { count: 0, data: [] };\n }\n}\n\n/**\n * The trending asset type.\n */\nexport type TrendingAsset = {\n assetId: string;\n name: string;\n symbol: string;\n decimals: number;\n price: string;\n aggregatedUsdVolume: number;\n marketCap: number;\n priceChangePct?: {\n m5?: string;\n m15?: string;\n m30?: string;\n h1?: string;\n h6?: string;\n h24?: string;\n };\n labels?: string[];\n};\n\n/**\n * Get the trending tokens for the given chains.\n *\n * @param options - Options for getting trending tokens.\n * @param options.chainIds - The chains to get the trending tokens for.\n * @param options.sortBy - The sort by field.\n * @param options.minLiquidity - The minimum liquidity.\n * @param options.minVolume24hUsd - The minimum volume 24h in USD.\n * @param options.maxVolume24hUsd - The maximum volume 24h in USD.\n * @param options.minMarketCap - The minimum market cap.\n * @param options.maxMarketCap - The maximum market cap.\n * @returns The trending tokens.\n * @throws Will throw if the request fails.\n */\nexport async function getTrendingTokens({\n chainIds,\n sortBy,\n minLiquidity,\n minVolume24hUsd,\n maxVolume24hUsd,\n minMarketCap,\n maxMarketCap,\n}: {\n chainIds: CaipChainId[];\n sortBy?: SortTrendingBy;\n minLiquidity?: number;\n minVolume24hUsd?: number;\n maxVolume24hUsd?: number;\n minMarketCap?: number;\n maxMarketCap?: number;\n}): Promise<TrendingAsset[]> {\n if (chainIds.length === 0) {\n console.error('No chains provided');\n return [];\n }\n\n const trendingTokensURL = getTrendingTokensURL({\n chainIds,\n sortBy,\n minLiquidity,\n minVolume24hUsd,\n maxVolume24hUsd,\n minMarketCap,\n maxMarketCap,\n });\n\n try {\n const result = await handleFetch(trendingTokensURL);\n\n // Validate that the API returned an array\n if (Array.isArray(result)) {\n return result;\n }\n\n // Handle non-expected responses\n console.error('Trending tokens API returned non-array response:', result);\n return [];\n } catch (error) {\n console.error('Trending tokens request failed:', error);\n return [];\n }\n}\n\n/**\n * Fetch metadata for the token address provided for a given network. This request is cancellable\n * using the abort signal passed in.\n *\n * @param chainId - The chain ID of the network the token is on.\n * @param tokenAddress - The address of the token to fetch metadata for.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param options - Additional fetch options.\n * @param options.timeout - The fetch timeout.\n * @returns The token metadata, or `undefined` if the request was either aborted or failed.\n */\nexport async function fetchTokenMetadata<T>(\n chainId: Hex,\n tokenAddress: string,\n abortSignal: AbortSignal,\n { timeout = defaultTimeout } = {},\n): Promise<T | undefined> {\n if (!isTokenListSupportedForNetwork(chainId)) {\n throw new Error(TOKEN_METADATA_NO_SUPPORT_ERROR);\n }\n const tokenMetadataURL = getTokenMetadataURL(chainId, tokenAddress);\n const response = await queryApi(tokenMetadataURL, abortSignal, timeout);\n if (response) {\n return parseJsonResponse(response) as Promise<T>;\n }\n return undefined;\n}\n\n/**\n * Perform fetch request against the api.\n *\n * @param apiURL - The URL of the API to fetch.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param timeout - The fetch timeout.\n * @returns Promise resolving request response.\n */\nasync function queryApi(\n apiURL: string,\n abortSignal: AbortSignal,\n timeout: number,\n): Promise<Response | undefined> {\n const fetchOptions: RequestInit = {\n referrer: apiURL,\n referrerPolicy: 'no-referrer-when-downgrade',\n method: 'GET',\n mode: 'cors',\n signal: abortSignal,\n cache: 'default',\n };\n fetchOptions.headers = new window.Headers();\n fetchOptions.headers.set('Content-Type', 'application/json');\n try {\n return await timeoutFetch(apiURL, fetchOptions, timeout);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('Request is aborted');\n }\n }\n return undefined;\n}\n\n/**\n * Parse an API response and return the response JSON data.\n *\n * @param apiResponse - The API response to parse.\n * @returns The response JSON data.\n * @throws Will throw if the response includes an error.\n */\nasync function parseJsonResponse(apiResponse: Response): Promise<unknown> {\n const responseObj = await apiResponse.json();\n // api may return errors as json without setting an error http status code\n if (responseObj?.error) {\n throw new Error(`TokenService Error: ${responseObj.error}`);\n }\n return responseObj;\n}\n"]}
@@ -1,6 +1,10 @@
1
1
  import type { CaipChainId, Hex } from "@metamask/utils";
2
2
  export declare const TOKEN_END_POINT_API = "https://token.api.cx.metamask.io";
3
3
  export declare const TOKEN_METADATA_NO_SUPPORT_ERROR = "TokenService Error: Network does not support fetchTokenMetadata";
4
+ /**
5
+ * The sort by field for trending tokens.
6
+ */
7
+ export type SortTrendingBy = 'm5_trending' | 'h1_trending' | 'h6_trending' | 'h24_trending';
4
8
  /**
5
9
  * Fetch the list of token metadata for a given network. This request is cancellable using the
6
10
  * abort signal passed in.
@@ -29,6 +33,50 @@ export declare function searchTokens(chainIds: CaipChainId[], query: string, { l
29
33
  count: number;
30
34
  data: unknown[];
31
35
  }>;
36
+ /**
37
+ * The trending asset type.
38
+ */
39
+ export type TrendingAsset = {
40
+ assetId: string;
41
+ name: string;
42
+ symbol: string;
43
+ decimals: number;
44
+ price: string;
45
+ aggregatedUsdVolume: number;
46
+ marketCap: number;
47
+ priceChangePct?: {
48
+ m5?: string;
49
+ m15?: string;
50
+ m30?: string;
51
+ h1?: string;
52
+ h6?: string;
53
+ h24?: string;
54
+ };
55
+ labels?: string[];
56
+ };
57
+ /**
58
+ * Get the trending tokens for the given chains.
59
+ *
60
+ * @param options - Options for getting trending tokens.
61
+ * @param options.chainIds - The chains to get the trending tokens for.
62
+ * @param options.sortBy - The sort by field.
63
+ * @param options.minLiquidity - The minimum liquidity.
64
+ * @param options.minVolume24hUsd - The minimum volume 24h in USD.
65
+ * @param options.maxVolume24hUsd - The maximum volume 24h in USD.
66
+ * @param options.minMarketCap - The minimum market cap.
67
+ * @param options.maxMarketCap - The maximum market cap.
68
+ * @returns The trending tokens.
69
+ * @throws Will throw if the request fails.
70
+ */
71
+ export declare function getTrendingTokens({ chainIds, sortBy, minLiquidity, minVolume24hUsd, maxVolume24hUsd, minMarketCap, maxMarketCap, }: {
72
+ chainIds: CaipChainId[];
73
+ sortBy?: SortTrendingBy;
74
+ minLiquidity?: number;
75
+ minVolume24hUsd?: number;
76
+ maxVolume24hUsd?: number;
77
+ minMarketCap?: number;
78
+ maxMarketCap?: number;
79
+ }): Promise<TrendingAsset[]>;
32
80
  /**
33
81
  * Fetch metadata for the token address provided for a given network. This request is cancellable
34
82
  * using the abort signal passed in.