UNPKG

@xlink-network/xlink-sdk

Version:
188 lines (186 loc) 6.63 kB
import { BridgeConfigAbi } from "./chunk-NZDFZ5GI.mjs"; import { EVMEndpointContract, evmContractAddresses } from "./chunk-RHGELTWO.mjs"; import { KnownChainId, KnownTokenId, _allKnownEVMTokens } from "./chunk-GZDQGY7B.mjs"; import { BigNumber } from "./chunk-KHTJNOQE.mjs"; // src/evmUtils/xlinkContractHelpers.ts import { isAddress, zeroAddress } from "viem"; import { readContract } from "viem/actions"; var CONTRACT_COMMON_NUMBER_SCALE = 18; var numberFromSolidityContractNumber = (num, decimals) => { return BigNumber.leftMoveDecimals( decimals ?? CONTRACT_COMMON_NUMBER_SCALE, num ); }; var numberToSolidityContractNumber = (num, decimals) => { return BigNumber.toBigInt( {}, BigNumber.rightMoveDecimals(decimals ?? CONTRACT_COMMON_NUMBER_SCALE, num) ); }; async function getEVMContractCallInfo(sdkContext, chainId) { const addresses = await getAllAddresses(sdkContext, chainId); if (addresses == null) return; const bridgeEndpointContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.BridgeEndpoint] ?? addresses.localAddresses[EVMEndpointContract.BridgeEndpoint]; if (bridgeEndpointContractAddress == null) return; const nativeBridgeEndpointContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.NativeBridgeEndpoint] ?? addresses.localAddresses[EVMEndpointContract.NativeBridgeEndpoint]; const registryContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.Registry] ?? addresses.localAddresses[EVMEndpointContract.Registry]; const timeLockContractAddress = addresses.onChainAddresses?.[EVMEndpointContract.TimeLock] ?? addresses.localAddresses[EVMEndpointContract.TimeLock]; return { client: addresses.client, bridgeEndpointContractAddress, nativeBridgeEndpointContractAddress, registryContractAddress, timeLockContractAddress }; } async function getEVMTokenContractInfo(sdkContext, chainId, tokenId) { const addresses = await getAllAddresses(sdkContext, chainId); if (addresses == null) return; const tokenContractAddress = addresses.onChainAddresses?.[tokenId] ?? addresses.localAddresses[tokenId]; if (tokenContractAddress == null) return; return { client: addresses.client, tokenContractAddress }; } async function getEVMToken(sdkContext, chain, tokenAddress) { const addresses = await getAllAddresses(sdkContext, chain); if (addresses == null) return; tokenAddress = tokenAddress.toLowerCase(); return Object.values(_allKnownEVMTokens).find( (token) => (addresses.onChainAddresses?.[token] ?? addresses.localAddresses?.[token])?.toLowerCase() === tokenAddress ); } async function getAllAddresses(sdkContext, chainId) { const client = sdkContext.evm.viemClients[chainId]; const localAddresses = evmContractAddresses[chainId]; const configContractAddress = localAddresses[EVMEndpointContract.BridgeConfig]; if (client == null) return; let onChainAddresses; if (configContractAddress != null) { onChainAddresses = await getOnChainConfigs( sdkContext, chainId, configContractAddress ); } return { client, onChainAddresses, localAddresses }; } var getOnChainConfigs = async (sdkContext, chain, configContractAddress) => { const cache = sdkContext.evm.onChainConfigCache; const cacheKey = `${chain}:${configContractAddress}`; if (cache != null) { const cachedPromise = cache.get(cacheKey); if (cachedPromise != null) return cachedPromise; } const client = sdkContext.evm.viemClients[chain]; if (client == null) return; const promise = _getOnChainConfigsImpl( client, chain, configContractAddress ).catch((err) => { queueMicrotask(() => { if (cache != null && promise === cache.get(cacheKey)) { cache.delete(cacheKey); } }); throw err; }); if (cache != null) { cache.set(cacheKey, promise); } return promise; }; var _getOnChainConfigsImpl = async (client, chain, configContractAddress) => { const configs = await readContract(client, { abi: BridgeConfigAbi, address: configContractAddress, functionName: "getConfigs", args: [ [ "ENDPOINT" /* ENDPOINT */, "REGISTRY" /* REGISTRY */, "TIMELOCK" /* TIMELOCK */, "TOKEN_ABTC" /* TOKEN_ABTC */, "TOKEN_ALEX" /* TOKEN_ALEX */, "TOKEN_ATALEX" /* TOKEN_ATALEX */, "TOKEN_LISTX" /* TOKEN_LISTX */, "TOKEN_USDT" /* TOKEN_USDT */, "TOKEN_BTC" /* TOKEN_BTC */, "TOKEN_LUNR" /* TOKEN_LUNR */, "TOKEN_SKO" /* TOKEN_SKO */, "TOKEN_SUSDT" /* TOKEN_SUSDT */, "TOKEN_UBTC" /* TOKEN_UBTC */, "TOKEN_WUBTC" /* TOKEN_WUBTC */, "TOKEN_DB20" /* TOKEN_DB20 */, "TOKEN_DOG" /* TOKEN_DOG */, "ENDPOINT_NATIVE" /* ENDPOINT_NATIVE */ ] ] }).catch((err) => { console.groupCollapsed( `Failed to read on-chain configs from ${configContractAddress} (${chain})` ); console.debug(err); console.groupEnd(); return null; }); if (configs == null) { return {}; } const EVMToken = KnownTokenId.EVM; return { [EVMEndpointContract.BridgeEndpoint]: maybeAddress(configs[0]), [EVMEndpointContract.Registry]: maybeAddress(configs[1]), [EVMEndpointContract.TimeLock]: maybeAddress(configs[2]), [EVMToken.aBTC]: maybeAddress(configs[3]), [EVMToken.ALEX]: maybeAddress(configs[4]), [EVMToken.vLiALEX]: maybeAddress(configs[5]), [EVMToken.vLiSTX]: maybeAddress(configs[6]), // prettier-ignore [chain === KnownChainId.EVM.Base ? EVMToken.USDC : EVMToken.USDT]: maybeAddress(configs[7]), // prettier-ignore [chain === KnownChainId.EVM.BSC ? EVMToken.BTCB : chain === KnownChainId.EVM.Base ? EVMToken.cbBTC : EVMToken.WBTC]: maybeAddress(configs[8]), [EVMToken.LUNR]: maybeAddress(configs[9]), [EVMToken.SKO]: maybeAddress(configs[10]), [EVMToken.sUSDT]: maybeAddress(configs[11]), [EVMToken.uBTC]: maybeAddress(configs[12]), [EVMToken.wuBTC]: maybeAddress(configs[13]), [EVMToken.DB20]: maybeAddress(configs[14]), [EVMToken.DOG]: maybeAddress(configs[15]), [EVMEndpointContract.NativeBridgeEndpoint]: maybeAddress(configs[16]) }; }; function maybeAddress(value) { if (value == null) return void 0; if (value === "") return void 0; if (!isAddress(value)) return void 0; if (value === zeroAddress) return void 0; return value; } export { numberFromSolidityContractNumber, numberToSolidityContractNumber, getEVMContractCallInfo, getEVMTokenContractInfo, getEVMToken, getAllAddresses }; //# sourceMappingURL=chunk-UJDCORME.mjs.map