{"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 { TrxScope } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { hexToBigInt, parseCaipAssetType } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { createSelector, weakMapMemoize } from 'reselect';\nimport { TokenRwaData } from 'src/token-service';\n\nimport { shouldIncludeNativeToken } from '../constants';\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';\nimport {\n  parseBalanceWithDecimals,\n  stringifyBalanceWithDecimals,\n} from './stringify-balance';\n\n// Asset Tron Filters\nexport const TRON_RESOURCE = {\n  ENERGY: 'energy',\n  BANDWIDTH: 'bandwidth',\n  MAX_ENERGY: 'max-energy',\n  MAX_BANDWIDTH: 'max-bandwidth',\n  STRX_ENERGY: 'strx-energy',\n  STRX_BANDWIDTH: 'strx-bandwidth',\n  TRX_READY_FOR_WITHDRAWAL: 'trx-ready-for-withdrawal',\n  TRX_STAKING_REWARDS: 'trx-staking-rewards',\n  TRX_IN_LOCK_PERIOD: 'trx-in-lock-period',\n} as const;\n\nexport type TronResourceSymbol =\n  (typeof TRON_RESOURCE)[keyof typeof TRON_RESOURCE];\n\nexport const TRON_RESOURCE_SYMBOLS = Object.values(\n  TRON_RESOURCE,\n) as readonly TronResourceSymbol[];\n\nexport const TRON_RESOURCE_SYMBOLS_SET: ReadonlySet<TronResourceSymbol> =\n  new Set(TRON_RESOURCE_SYMBOLS);\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  rwaData?: TokenRwaData;\n};\n\nexport type AssetListState = {\n  accountTree: AccountTreeControllerState['accountTree'];\n  selectedAccountGroup: AccountTreeControllerState['selectedAccountGroup'];\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      // Skip native tokens on Tempo networks\n      if (!shouldIncludeNativeToken(chainId)) {\n        continue;\n      }\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          nativeCurrency, // Pass native currency symbol for fallback when market data is missing\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            ...(token.rwaData && { rwaData: token.rwaData }),\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\nexport const 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 type SelectAccountGroupAssetOpts = {\n  filterTronStakedTokens: boolean;\n};\n\nconst defaultSelectAccountGroupAssetOpts: SelectAccountGroupAssetOpts = {\n  filterTronStakedTokens: true,\n};\n\nconst filterTronStakedTokens = (assetsByAccountGroup: AccountGroupAssets) => {\n  const newAssetsByAccountGroup = { ...assetsByAccountGroup };\n\n  Object.values(TrxScope).forEach((tronChainId) => {\n    if (!newAssetsByAccountGroup[tronChainId]) {\n      return;\n    }\n\n    newAssetsByAccountGroup[tronChainId] = newAssetsByAccountGroup[\n      tronChainId\n    ].filter((asset: Asset) => {\n      if (\n        asset.chainId.startsWith('tron:') &&\n        TRON_RESOURCE_SYMBOLS_SET.has(\n          asset.symbol?.toLowerCase() as TronResourceSymbol,\n        )\n      ) {\n        return false;\n      }\n      return true;\n    });\n  });\n\n  return newAssetsByAccountGroup;\n};\n\nexport const selectAssetsBySelectedAccountGroup = createAssetListSelector(\n  [\n    selectAllAssets,\n    (state) => state.selectedAccountGroup,\n    (\n      _state,\n      opts: SelectAccountGroupAssetOpts = defaultSelectAccountGroupAssetOpts,\n    ) => opts,\n  ],\n  (groupAssets, selectedAccountGroup, opts) => {\n    if (!selectedAccountGroup) {\n      return {};\n    }\n\n    let result = groupAssets[selectedAccountGroup] || {};\n\n    if (opts.filterTronStakedTokens) {\n      result = filterTronStakedTokens(result);\n    }\n\n    return result;\n  },\n  {\n    memoize: weakMapMemoize,\n    argsMemoize: weakMapMemoize,\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 * @param nativeCurrencySymbol - The native currency symbol (e.g., 'ETH', 'BNB') - used for fallback when market data is missing for native tokens\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  nativeCurrencySymbol?: string,\n) {\n  const tokenMarketData = marketData[chainId]?.[tokenAddress];\n\n  // For native tokens: if no market data exists, use price=1 and look up currency rate directly\n  // This is because native tokens are priced in themselves (1 ETH = 1 ETH)\n  if (!tokenMarketData && nativeCurrencySymbol) {\n    const currencyRate = currencyRates[nativeCurrencySymbol];\n\n    if (!currencyRate?.conversionRate) {\n      return undefined;\n    }\n\n    const fiatBalance =\n      (convertHexToDecimal(rawBalance) / 10 ** decimals) *\n      currencyRate.conversionRate;\n\n    return {\n      balance: fiatBalance,\n      conversionRate: currencyRate.conversionRate,\n    };\n  }\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"]}