{"version":3,"sources":["../src/evmUtils/xlinkContractHelpers.ts"],"sourcesContent":["import { Address, Client, isAddress, zeroAddress } from \"viem\"\nimport { readContract } from \"viem/actions\"\nimport { BigNumber, BigNumberSource } from \"../utils/BigNumber\"\nimport {\n  KnownChainId,\n  KnownTokenId,\n  _allKnownEVMTokens,\n} from \"../utils/types/knownIds\"\nimport { EVMAddress } from \"../xlinkSdkUtils/types\"\nimport { SDKGlobalContext } from \"../xlinkSdkUtils/types.internal\"\nimport { BridgeConfigAbi } from \"./contractAbi/bridgeConfig\"\nimport {\n  EVMEndpointContract,\n  EVMOnChainAddresses,\n  evmContractAddresses,\n} from \"./evmContractAddresses\"\n\nconst CONTRACT_COMMON_NUMBER_SCALE = 18\nexport const numberFromSolidityContractNumber = (\n  num: bigint,\n  decimals?: number,\n): BigNumber => {\n  return BigNumber.leftMoveDecimals(\n    decimals ?? CONTRACT_COMMON_NUMBER_SCALE,\n    num,\n  )\n}\nexport const numberToSolidityContractNumber = (\n  num: BigNumberSource,\n  decimals?: number,\n): bigint => {\n  return BigNumber.toBigInt(\n    {},\n    BigNumber.rightMoveDecimals(decimals ?? CONTRACT_COMMON_NUMBER_SCALE, num),\n  )\n}\n\nexport async function getEVMContractCallInfo(\n  sdkContext: SDKGlobalContext,\n  chainId: KnownChainId.EVMChain,\n): Promise<\n  | undefined\n  | {\n      client: Client\n      bridgeEndpointContractAddress: Address\n      nativeBridgeEndpointContractAddress?: Address\n      registryContractAddress?: Address\n      timeLockContractAddress?: Address\n    }\n> {\n  const addresses = await getAllAddresses(sdkContext, chainId)\n  if (addresses == null) return\n\n  const bridgeEndpointContractAddress =\n    addresses.onChainAddresses?.[EVMEndpointContract.BridgeEndpoint] ??\n    addresses.localAddresses[EVMEndpointContract.BridgeEndpoint]\n  if (bridgeEndpointContractAddress == null) return\n\n  const nativeBridgeEndpointContractAddress =\n    addresses.onChainAddresses?.[EVMEndpointContract.NativeBridgeEndpoint] ??\n    addresses.localAddresses[EVMEndpointContract.NativeBridgeEndpoint]\n  const registryContractAddress =\n    addresses.onChainAddresses?.[EVMEndpointContract.Registry] ??\n    addresses.localAddresses[EVMEndpointContract.Registry]\n  const timeLockContractAddress =\n    addresses.onChainAddresses?.[EVMEndpointContract.TimeLock] ??\n    addresses.localAddresses[EVMEndpointContract.TimeLock]\n\n  return {\n    client: addresses.client,\n    bridgeEndpointContractAddress,\n    nativeBridgeEndpointContractAddress,\n    registryContractAddress,\n    timeLockContractAddress,\n  }\n}\n\nexport async function getEVMTokenContractInfo(\n  sdkContext: SDKGlobalContext,\n  chainId: KnownChainId.EVMChain,\n  tokenId: KnownTokenId.EVMToken,\n): Promise<\n  | undefined\n  | {\n      client: Client\n      tokenContractAddress: Address\n    }\n> {\n  const addresses = await getAllAddresses(sdkContext, chainId)\n  if (addresses == null) return\n\n  const tokenContractAddress =\n    addresses.onChainAddresses?.[tokenId] ?? addresses.localAddresses[tokenId]\n\n  if (tokenContractAddress == null) return\n\n  return {\n    client: addresses.client,\n    tokenContractAddress,\n  }\n}\n\nexport async function getEVMToken(\n  sdkContext: SDKGlobalContext,\n  chain: KnownChainId.EVMChain,\n  tokenAddress: EVMAddress,\n): Promise<undefined | KnownTokenId.EVMToken> {\n  const addresses = await getAllAddresses(sdkContext, chain)\n  if (addresses == null) return\n\n  tokenAddress = tokenAddress.toLowerCase() as EVMAddress\n  return Object.values(_allKnownEVMTokens).find(\n    token =>\n      (\n        addresses.onChainAddresses?.[token] ?? addresses.localAddresses?.[token]\n      )?.toLowerCase() === tokenAddress,\n  )\n}\n\nexport async function getAllAddresses(\n  sdkContext: SDKGlobalContext,\n  chainId: KnownChainId.EVMChain,\n): Promise<\n  | undefined\n  | {\n      client: Client\n      onChainAddresses?: EVMOnChainAddresses\n      localAddresses: EVMOnChainAddresses\n    }\n> {\n  const client = sdkContext.evm.viemClients[chainId]\n  const localAddresses = evmContractAddresses[chainId]\n  const configContractAddress = localAddresses[EVMEndpointContract.BridgeConfig]\n\n  if (client == null) return\n\n  let onChainAddresses: undefined | EVMOnChainAddresses\n  if (configContractAddress != null) {\n    onChainAddresses = await getOnChainConfigs(\n      sdkContext,\n      chainId,\n      configContractAddress,\n    )\n  }\n\n  return {\n    client,\n    onChainAddresses,\n    localAddresses,\n  }\n}\n\nconst getOnChainConfigs = async (\n  sdkContext: SDKGlobalContext,\n  chain: KnownChainId.EVMChain,\n  configContractAddress: Address,\n): Promise<undefined | EVMOnChainAddresses> => {\n  const cache = sdkContext.evm.onChainConfigCache\n  const cacheKey = `${chain}:${configContractAddress}`\n\n  if (cache != null) {\n    const cachedPromise = cache.get(cacheKey)\n    if (cachedPromise != null) return cachedPromise\n  }\n\n  const client = sdkContext.evm.viemClients[chain]\n  if (client == null) return\n\n  const promise = _getOnChainConfigsImpl(\n    client,\n    chain,\n    configContractAddress,\n  ).catch(err => {\n    queueMicrotask(() => {\n      if (cache != null && promise === cache.get(cacheKey)) {\n        cache.delete(cacheKey)\n      }\n    })\n    throw err\n  })\n  if (cache != null) {\n    cache.set(cacheKey, promise)\n  }\n  return promise\n}\n\nconst _getOnChainConfigsImpl = async (\n  client: Client,\n  chain: KnownChainId.EVMChain,\n  configContractAddress: Address,\n): Promise<EVMOnChainAddresses> => {\n  const configs = await readContract(client, {\n    abi: BridgeConfigAbi,\n    address: configContractAddress,\n    functionName: \"getConfigs\",\n    args: [\n      [\n        ONCHAIN_CONFIG_KEY.ENDPOINT,\n        ONCHAIN_CONFIG_KEY.REGISTRY,\n        ONCHAIN_CONFIG_KEY.TIMELOCK,\n        ONCHAIN_CONFIG_KEY.TOKEN_ABTC,\n        ONCHAIN_CONFIG_KEY.TOKEN_ALEX,\n        ONCHAIN_CONFIG_KEY.TOKEN_ATALEX,\n        ONCHAIN_CONFIG_KEY.TOKEN_LISTX,\n        ONCHAIN_CONFIG_KEY.TOKEN_USDT,\n        ONCHAIN_CONFIG_KEY.TOKEN_BTC,\n        ONCHAIN_CONFIG_KEY.TOKEN_LUNR,\n        ONCHAIN_CONFIG_KEY.TOKEN_SKO,\n        ONCHAIN_CONFIG_KEY.TOKEN_SUSDT,\n        ONCHAIN_CONFIG_KEY.TOKEN_UBTC,\n        ONCHAIN_CONFIG_KEY.TOKEN_WUBTC,\n        ONCHAIN_CONFIG_KEY.TOKEN_DB20,\n        ONCHAIN_CONFIG_KEY.TOKEN_DOG,\n        ONCHAIN_CONFIG_KEY.ENDPOINT_NATIVE,\n      ],\n    ],\n  }).catch(err => {\n    console.groupCollapsed(\n      `Failed to read on-chain configs from ${configContractAddress} (${chain})`,\n    )\n    console.debug(err)\n    console.groupEnd()\n    return null\n  })\n\n  if (configs == null) {\n    return {}\n  }\n\n  const EVMToken = KnownTokenId.EVM\n  return {\n    [EVMEndpointContract.BridgeEndpoint]: maybeAddress(configs[0]),\n    [EVMEndpointContract.Registry]: maybeAddress(configs[1]),\n    [EVMEndpointContract.TimeLock]: maybeAddress(configs[2]),\n    [EVMToken.aBTC]: maybeAddress(configs[3]),\n    [EVMToken.ALEX]: maybeAddress(configs[4]),\n    [EVMToken.vLiALEX]: maybeAddress(configs[5]),\n    [EVMToken.vLiSTX]: maybeAddress(configs[6]),\n    // prettier-ignore\n    [EVMToken.USDC]:\n      chain === KnownChainId.EVM.Base\n        ? maybeAddress(configs[7])\n        : undefined,\n    // prettier-ignore\n    [EVMToken.USDT]:\n      chain === KnownChainId.EVM.Ethereum ||\n      chain === KnownChainId.EVM.BSC\n        ? maybeAddress(configs[7])\n        : undefined,\n    // prettier-ignore\n    [EVMToken.WBTC]:\n      chain === KnownChainId.EVM.Ethereum ||\n      chain === KnownChainId.EVM.Arbitrum\n        ? maybeAddress(configs[8])\n        : undefined,\n    // prettier-ignore\n    [EVMToken.BTCB]:\n      chain === KnownChainId.EVM.BSC\n        ? maybeAddress(configs[8])\n        : undefined,\n    // prettier-ignore\n    [EVMToken.cbBTC]:\n      chain === KnownChainId.EVM.Base\n        ? maybeAddress(configs[8])\n        : undefined,\n    [EVMToken.LUNR]: maybeAddress(configs[9]),\n    [EVMToken.SKO]: maybeAddress(configs[10]),\n    [EVMToken.sUSDT]: maybeAddress(configs[11]),\n    [EVMToken.uBTC]: maybeAddress(configs[12]),\n    [EVMToken.wuBTC]: maybeAddress(configs[13]),\n    [EVMToken.DB20]: maybeAddress(configs[14]),\n    [EVMToken.DOG]: maybeAddress(configs[15]),\n    [EVMEndpointContract.NativeBridgeEndpoint]: maybeAddress(configs[16]),\n  }\n}\nfunction maybeAddress(value: string | null): Address | undefined {\n  if (value == null) return undefined\n  if (value === \"\") return undefined\n  if (!isAddress(value)) return undefined\n  if (value === zeroAddress) return undefined\n  return value\n}\n\nenum ONCHAIN_CONFIG_KEY {\n  /**\n   * https://t.me/c/1599543687/57298\n   */\n  ENDPOINT = \"ENDPOINT\",\n  REGISTRY = \"REGISTRY\",\n  TOKEN_ABTC = \"TOKEN_ABTC\",\n  TOKEN_ALEX = \"TOKEN_ALEX\",\n  TOKEN_ATALEX = \"TOKEN_ATALEX\",\n  TOKEN_LISTX = \"TOKEN_LISTX\",\n  TOKEN_USDT = \"TOKEN_USDT\",\n  TOKEN_BTC = \"TOKEN_BTC\",\n  TOKEN_LUNR = \"TOKEN_LUNR\",\n  TOKEN_SKO = \"TOKEN_SKO\",\n  TOKEN_SUSDT = \"TOKEN_SUSDT\",\n  TOKEN_DB20 = \"TOKEN_DB20\",\n  TOKEN_DOG = \"TOKEN_DOG\",\n  TIMELOCK = \"TIMELOCK\",\n  MULTISIG = \"MULTISIG\",\n  MIGRATE = \"MIGRATE\",\n  MIGRATE_BOB = \"MIGRATE_BOB\",\n  MIGRATE_BOB_L2 = \"MIGRATE_BOB_L2\",\n  MIGRATE_BOB_L2_S = \"MIGRATE_BOB_L2_S\",\n\n  // https://github.com/xlink-network/xlink/blob/9e6e268d820f2f9756ca15a36f8580e4f98c087e/packages/contracts/bridge-solidity/scripts/params.ts\n  ENDPOINT_NATIVE = \"ENDPOINT_NATIVE\",\n\n  // https://github.com/xlink-network/xlink/pull/299/commits/22b23c9ff3ea65eeb7c632db4255afe803f97fef#diff-8302902f9863ee3c7928a0fa6eb6ca22edd10f5553708459cdd072c1ea3ef696\n  TOKEN_UBTC = \"TOKEN_UBTC\",\n  TOKEN_WUBTC = \"TOKEN_WUBTC\",\n}\n"],"mappings":"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","names":[]}