@xlink-network/xlink-sdk
Version:
1 lines • 13.1 kB
Source Map (JSON)
{"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 [\n chain === KnownChainId.EVM.Base ? EVMToken.USDC :\n EVMToken.USDT\n ]: maybeAddress(configs[7]),\n // prettier-ignore\n [\n chain === KnownChainId.EVM.BSC ? EVMToken.BTCB :\n chain === KnownChainId.EVM.Base ? EVMToken.cbBTC :\n EVMToken.WBTC\n ]:\n maybeAddress(configs[8]),\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":[]}