{"version":3,"file":"caip-formatters.mjs","sourceRoot":"","sources":["../../src/utils/caip-formatters.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { getAddress } from '@ethersproject/address';\nimport { AddressZero } from '@ethersproject/constants';\nimport {\n  convertHexToDecimal,\n  toChecksumHexAddress,\n} from '@metamask/controller-utils';\nimport { BtcScope, SolScope, TrxScope } from '@metamask/keyring-api';\nimport { toEvmCaipChainId } from '@metamask/multichain-network-controller';\nimport {\n  isCaipChainId,\n  isStrictHexString,\n  parseCaipChainId,\n  isCaipReference,\n  isCaipAssetType,\n  CaipAssetTypeStruct,\n  numberToHex,\n} from '@metamask/utils';\nimport type { CaipAssetType, CaipChainId, Hex } from '@metamask/utils';\n\nimport type { GenericQuoteRequest } from '../types';\nimport { ChainId } from '../types';\nimport {\n  getNativeAssetForChainId,\n  isBitcoinChainId,\n  isNativeAddress,\n  isSolanaChainId,\n  isTronChainId,\n} from './bridge';\n\n/**\n * Converts a chainId to a CaipChainId\n *\n * @param chainId - The chainId to convert\n * @returns The CaipChainId\n */\nexport const formatChainIdToCaip = (\n  chainId: Hex | number | CaipChainId | string,\n): CaipChainId => {\n  if (isCaipChainId(chainId)) {\n    return chainId;\n  }\n  if (isStrictHexString(chainId)) {\n    return toEvmCaipChainId(chainId);\n  }\n  if (isSolanaChainId(chainId)) {\n    return SolScope.Mainnet;\n  }\n  if (isBitcoinChainId(chainId)) {\n    return BtcScope.Mainnet;\n  }\n  if (isTronChainId(chainId)) {\n    return TrxScope.Mainnet;\n  }\n  return toEvmCaipChainId(numberToHex(Number(chainId)));\n};\n\n/**\n * Converts a chainId to a decimal number that can be used for bridge-api requests\n *\n * @param chainId - The chainId to convert\n * @returns The decimal number\n */\nexport const formatChainIdToDec = (\n  chainId: number | Hex | CaipChainId | string,\n) => {\n  if (isStrictHexString(chainId)) {\n    return convertHexToDecimal(chainId);\n  }\n  if (chainId === SolScope.Mainnet) {\n    return ChainId.SOLANA;\n  }\n  if (chainId === BtcScope.Mainnet) {\n    return ChainId.BTC;\n  }\n  if (chainId === TrxScope.Mainnet) {\n    return ChainId.TRON;\n  }\n  if (isCaipChainId(chainId)) {\n    return Number(chainId.split(':').at(-1));\n  }\n  if (typeof chainId === 'string') {\n    return parseInt(chainId, 10);\n  }\n  return chainId;\n};\n\n/**\n * Converts a chainId to a hex string used to read controller data within the app\n * Hex chainIds are also used for fetching exchange rates\n *\n * @param chainId - The chainId to convert\n * @returns The hex string\n */\nexport const formatChainIdToHex = (\n  chainId: Hex | CaipChainId | string | number,\n): Hex => {\n  if (isStrictHexString(chainId)) {\n    return chainId;\n  }\n  if (typeof chainId === 'number' || parseInt(chainId, 10)) {\n    return numberToHex(Number(chainId));\n  }\n  if (isCaipChainId(chainId)) {\n    const { reference } = parseCaipChainId(chainId);\n    if (isCaipReference(reference) && !isNaN(Number(reference))) {\n      return numberToHex(Number(reference));\n    }\n  }\n  // Throw an error if a non-evm chainId is passed to this function\n  // This should never happen, but it's a sanity check\n  throw new Error(`Invalid cross-chain swaps chainId: ${chainId}`);\n};\n\n/**\n * Converts an asset or account address to a string that can be used for bridge-api requests\n *\n * @param address - The address to convert\n * @returns The converted address\n */\nexport const formatAddressToCaipReference = (address: string) => {\n  if (isStrictHexString(address)) {\n    return getAddress(address);\n  }\n  // If the address looks like a native token, return the zero address because it's\n  // what bridge-api uses to represent a native asset\n  if (isNativeAddress(address)) {\n    return AddressZero;\n  }\n  const addressWithoutPrefix = address.split(':').at(-1);\n  // If the address is not a valid hex string or CAIP address, throw an error\n  // This should never happen, but it's a sanity check\n  if (!addressWithoutPrefix) {\n    throw new Error('Invalid address');\n  }\n  return addressWithoutPrefix;\n};\n\n/**\n * Converts an address or assetId to a checksummed CaipAssetType\n *\n * @param addressOrAssetId - The address or assetId to convert\n * @param chainId - The chainId of the asset\n * @returns The CaipAssetType\n */\nexport const formatAddressToAssetId = (\n  addressOrAssetId: Hex | CaipAssetType | string,\n  chainId?: GenericQuoteRequest['srcChainId'],\n): CaipAssetType | undefined => {\n  if (isCaipAssetType(addressOrAssetId)) {\n    return addressOrAssetId;\n  }\n  if (!chainId) {\n    return undefined;\n  }\n\n  const chainIdCaip = formatChainIdToCaip(chainId);\n  if (isNativeAddress(addressOrAssetId)) {\n    return getNativeAssetForChainId(chainIdCaip).assetId;\n  }\n  if (chainIdCaip === SolScope.Mainnet) {\n    return CaipAssetTypeStruct.create(\n      `${chainIdCaip}/token:${addressOrAssetId}`,\n    );\n  }\n\n  if (chainIdCaip === TrxScope.Mainnet) {\n    return CaipAssetTypeStruct.create(\n      `${chainIdCaip}/trc20:${addressOrAssetId}`,\n    );\n  }\n\n  // EVM assets\n  if (!isStrictHexString(addressOrAssetId)) {\n    return undefined;\n  }\n\n  // EVM assets\n  const checksummedAddress = toChecksumHexAddress(addressOrAssetId);\n  return CaipAssetTypeStruct.create(\n    `${chainIdCaip}/erc20:${checksummedAddress}`,\n  );\n};\n"]}