@xlink-network/xlink-sdk
Version:
1 lines • 22.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/evmUtils/peggingHelpers.ts"],"sourcesContent":["import { callReadOnlyFunction } from \"@stacks/transactions\"\nimport { CallReadOnlyFunctionFn, unwrapResponse } from \"clarity-codegen\"\nimport { readContract } from \"viem/actions\"\nimport {\n getBRC20SupportedRoutes,\n getRunesSupportedRoutes,\n} from \"../metaUtils/xlinkContractHelpers\"\nimport { contractAssignedChainIdFromKnownChain } from \"../stacksUtils/crossContractDataMapping\"\nimport {\n getTerminatingStacksTokenContractAddress,\n stxTokenContractAddresses,\n} from \"../stacksUtils/stxContractAddresses\"\nimport {\n executeReadonlyCallXLINK,\n getStacksContractCallInfo,\n getStacksTokenContractInfo,\n numberFromStacksContractNumber,\n} from \"../stacksUtils/xlinkContractHelpers\"\nimport { BigNumber } from \"../utils/BigNumber\"\nimport {\n IsSupportedFn,\n KnownRoute_FromEVM_ToStacks,\n KnownRoute_FromStacks_ToEVM,\n} from \"../utils/buildSupportedRoutes\"\nimport { props } from \"../utils/promiseHelpers\"\nimport { assertExclude, checkNever } from \"../utils/typeHelpers\"\nimport { TransferProphet } from \"../utils/types/TransferProphet\"\nimport {\n _allNoLongerSupportedEVMChains,\n KnownChainId,\n KnownTokenId,\n} from \"../utils/types/knownIds\"\nimport { SDKGlobalContext } from \"../xlinkSdkUtils/types.internal\"\nimport { nativeCurrencyAddress } from \"./addressHelpers\"\nimport { BridgeEndpointAbi } from \"./contractAbi/bridgeEndpoint\"\nimport { BridgeRegistryAbi } from \"./contractAbi/bridgeRegistry\"\nimport {\n getEVMContractCallInfo,\n getEVMTokenContractInfo,\n numberFromSolidityContractNumber,\n} from \"./xlinkContractHelpers\"\n\nexport const getEvm2StacksFeeInfo = async (\n ctx: SDKGlobalContext,\n route: KnownRoute_FromEVM_ToStacks,\n): Promise<undefined | TransferProphet> => {\n const stacksContractCallInfo = getStacksContractCallInfo(\n route.toChain,\n \"cross-peg-in-endpoint-v2-04\",\n )\n const evmContractCallInfo = await getEVMContractCallInfo(ctx, route.fromChain)\n const evmTokenContractCallInfo = await getEVMTokenContractInfo(\n ctx,\n route.fromChain,\n route.fromToken,\n )\n if (\n stacksContractCallInfo == null ||\n evmContractCallInfo == null ||\n evmTokenContractCallInfo == null\n ) {\n return\n }\n\n if (evmTokenContractCallInfo.tokenContractAddress === nativeCurrencyAddress) {\n return getEvm2StacksNativeBridgeFeeInfo(ctx, route)\n }\n\n const executeOptions = {\n deployerAddress: stacksContractCallInfo.deployerAddress,\n callReadOnlyFunction: (callOptions =>\n callReadOnlyFunction({\n ...callOptions,\n network: stacksContractCallInfo.network,\n })) satisfies CallReadOnlyFunctionFn,\n }\n\n const { client, tokenContractAddress } = evmTokenContractCallInfo\n\n const registryAddr =\n evmContractCallInfo.registryContractAddress ??\n (await readContract(client, {\n abi: BridgeEndpointAbi,\n address: evmContractCallInfo.bridgeEndpointContractAddress,\n functionName: \"registry\",\n }))\n\n const resp = await props({\n isApproved: readContract(client, {\n abi: BridgeRegistryAbi,\n address: registryAddr,\n functionName: \"APPROVED_TOKEN\",\n }).then(key =>\n readContract(client, {\n abi: BridgeRegistryAbi,\n address: registryAddr,\n functionName: \"hasRole\",\n args: [key, tokenContractAddress],\n }),\n ),\n feeRate: readContract(client, {\n abi: BridgeRegistryAbi,\n address: registryAddr,\n functionName: \"feePctPerToken\",\n args: [tokenContractAddress],\n }).then(numberFromSolidityContractNumber),\n minFeeAmount: readContract(client, {\n abi: BridgeRegistryAbi,\n address: registryAddr,\n functionName: \"minFeePerToken\",\n args: [tokenContractAddress],\n }).then(numberFromSolidityContractNumber),\n minAmount: readContract(client, {\n abi: BridgeRegistryAbi,\n address: registryAddr,\n functionName: \"minAmountPerToken\",\n args: [tokenContractAddress],\n }).then(numberFromSolidityContractNumber),\n maxAmount: readContract(client, {\n abi: BridgeRegistryAbi,\n address: registryAddr,\n functionName: \"maxAmountPerToken\",\n args: [tokenContractAddress],\n }).then(numberFromSolidityContractNumber),\n isPaused: executeReadonlyCallXLINK(\n stacksContractCallInfo.contractName,\n \"get-paused\",\n {},\n executeOptions,\n ),\n })\n\n if (!resp.isApproved) return undefined\n\n const minAmount = BigNumber.max([resp.minAmount, resp.minFeeAmount])\n const maxAmount = BigNumber.min([resp.maxAmount])\n\n return {\n isPaused: resp.isPaused,\n bridgeToken: route.fromToken,\n fees: [\n {\n type: \"rate\",\n token: route.fromToken,\n rate: resp.feeRate,\n minimumAmount: resp.minFeeAmount,\n },\n ],\n minBridgeAmount: BigNumber.isZero(minAmount) ? null : minAmount,\n maxBridgeAmount: BigNumber.isZero(maxAmount) ? null : maxAmount,\n }\n}\n\nconst getEvm2StacksNativeBridgeFeeInfo = async (\n ctx: SDKGlobalContext,\n route: KnownRoute_FromEVM_ToStacks,\n): Promise<undefined | TransferProphet> => {\n const stacksContractCallInfo = getStacksContractCallInfo(\n route.toChain,\n \"cross-peg-in-endpoint-v2-04\",\n )\n const evmContractCallInfo = await getEVMContractCallInfo(ctx, route.fromChain)\n if (\n stacksContractCallInfo == null ||\n evmContractCallInfo?.nativeBridgeEndpointContractAddress == null\n ) {\n return\n }\n\n const executeOptions = {\n deployerAddress: stacksContractCallInfo.deployerAddress,\n callReadOnlyFunction: (callOptions =>\n callReadOnlyFunction({\n ...callOptions,\n network: stacksContractCallInfo.network,\n })) satisfies CallReadOnlyFunctionFn,\n }\n\n const resp = await props({\n isPaused: executeReadonlyCallXLINK(\n stacksContractCallInfo.contractName,\n \"get-paused\",\n {},\n executeOptions,\n ),\n })\n\n return {\n isPaused: resp.isPaused,\n bridgeToken: route.fromToken,\n fees: [],\n minBridgeAmount: null,\n maxBridgeAmount: null,\n }\n}\n\nexport const getStacks2EvmFeeInfo = async (\n route: KnownRoute_FromStacks_ToEVM,\n): Promise<undefined | TransferProphet> => {\n const stacksContractCallInfo = getStacksContractCallInfo(\n route.fromChain,\n \"cross-peg-out-endpoint-v2-01\",\n )\n const stacksTokenContractCallInfo = getStacksTokenContractInfo(\n route.fromChain,\n route.fromToken,\n )\n const toChainId = contractAssignedChainIdFromKnownChain(route.toChain)\n if (stacksContractCallInfo == null || stacksTokenContractCallInfo == null) {\n return\n }\n\n const terminatingStacksTokenAddress =\n getTerminatingStacksTokenContractAddress(route) ??\n stacksTokenContractCallInfo\n\n const executeOptions = {\n deployerAddress: stacksContractCallInfo.deployerAddress,\n callReadOnlyFunction: (callOptions =>\n callReadOnlyFunction({\n ...callOptions,\n network: stacksContractCallInfo.network,\n })) satisfies CallReadOnlyFunctionFn,\n }\n\n const tokenConf = await Promise.all([\n executeReadonlyCallXLINK(\n stacksContractCallInfo.contractName,\n \"get-approved-pair-or-fail\",\n {\n pair: {\n token: `${terminatingStacksTokenAddress.deployerAddress}.${terminatingStacksTokenAddress.contractName}`,\n \"chain-id\": toChainId,\n },\n },\n executeOptions,\n ),\n executeReadonlyCallXLINK(\n stacksContractCallInfo.contractName,\n \"get-paused\",\n {},\n executeOptions,\n ),\n ]).then(([resp, isPaused]) => {\n if (resp.type !== \"success\") return undefined\n\n return {\n ...unwrapResponse(resp),\n isPaused,\n }\n })\n\n if (tokenConf == null) return undefined\n\n const feeRate = numberFromStacksContractNumber(tokenConf.fee)\n const minFee = numberFromStacksContractNumber(tokenConf[\"min-fee\"])\n const reserve = numberFromStacksContractNumber(tokenConf.reserve)\n\n const minAmount = BigNumber.max([\n numberFromStacksContractNumber(tokenConf[\"min-amount\"]),\n minFee,\n ])\n const maxAmount = BigNumber.min([\n numberFromStacksContractNumber(tokenConf[\"max-amount\"]),\n reserve,\n ])\n\n return {\n isPaused: tokenConf.isPaused || tokenConf.approved === false,\n bridgeToken: route.fromToken,\n fees: [\n {\n type: \"rate\",\n token: route.fromToken,\n rate: feeRate,\n minimumAmount: minFee,\n },\n ],\n minBridgeAmount: BigNumber.isZero(minAmount) ? null : minAmount,\n maxBridgeAmount: BigNumber.isZero(maxAmount) ? null : maxAmount,\n }\n}\n\nexport async function fromCorrespondingStacksToken(\n toChain: KnownChainId.EVMChain,\n stacksToken: KnownTokenId.StacksToken,\n): Promise<KnownTokenId.EVMToken[]> {\n const EVMToken = KnownTokenId.EVM\n const StacksToken = KnownTokenId.Stacks\n\n const restEVMTokenPossibilities = assertExclude.i<KnownTokenId.EVMToken>()\n\n if (stacksToken === StacksToken.sLUNR) {\n return [EVMToken.LUNR]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.LUNR)\n\n if (stacksToken === StacksToken.ALEX) {\n return [EVMToken.ALEX]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.ALEX)\n\n if (stacksToken === StacksToken.sSKO) {\n return [EVMToken.SKO]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.SKO)\n\n if (stacksToken === StacksToken.vLiSTX) {\n return [EVMToken.vLiSTX]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.vLiSTX)\n\n if (stacksToken === StacksToken.vLiALEX) {\n return [EVMToken.vLiALEX]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.vLiALEX)\n\n if (stacksToken === StacksToken.sUSDT) {\n return [EVMToken.sUSDT, EVMToken.USDT, EVMToken.USDC]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.sUSDT)\n assertExclude(restEVMTokenPossibilities, EVMToken.USDT)\n assertExclude(restEVMTokenPossibilities, EVMToken.USDC)\n if (stacksToken === StacksToken.aBTC) {\n return [EVMToken.aBTC, EVMToken.WBTC, EVMToken.BTCB, EVMToken.cbBTC]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.aBTC)\n assertExclude(restEVMTokenPossibilities, EVMToken.WBTC)\n assertExclude(restEVMTokenPossibilities, EVMToken.BTCB)\n assertExclude(restEVMTokenPossibilities, EVMToken.cbBTC)\n\n if (stacksToken === StacksToken.uBTC) {\n return [EVMToken.uBTC, EVMToken.wuBTC]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.uBTC)\n assertExclude(restEVMTokenPossibilities, EVMToken.wuBTC)\n\n if (stacksToken === StacksToken.DB20) {\n return [EVMToken.DB20]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.DB20)\n\n if (stacksToken === StacksToken.DOG) {\n return [EVMToken.DOG]\n }\n assertExclude(restEVMTokenPossibilities, EVMToken.DOG)\n\n checkNever(restEVMTokenPossibilities)\n return []\n}\nexport async function toCorrespondingStacksToken(\n evmToken: KnownTokenId.EVMToken,\n): Promise<undefined | KnownTokenId.StacksToken> {\n const EVMToken = KnownTokenId.EVM\n const StacksToken = KnownTokenId.Stacks\n\n switch (evmToken) {\n case EVMToken.LUNR:\n return StacksToken.sLUNR\n case EVMToken.ALEX:\n return StacksToken.ALEX\n case EVMToken.SKO:\n return StacksToken.sSKO\n case EVMToken.vLiSTX:\n return StacksToken.vLiSTX\n case EVMToken.vLiALEX:\n return StacksToken.vLiALEX\n case EVMToken.sUSDT:\n case EVMToken.USDT:\n case EVMToken.USDC:\n return StacksToken.sUSDT\n case EVMToken.aBTC:\n case EVMToken.BTCB:\n case EVMToken.WBTC:\n case EVMToken.cbBTC:\n return StacksToken.aBTC\n case EVMToken.uBTC:\n case EVMToken.wuBTC:\n return StacksToken.uBTC\n case EVMToken.DB20:\n return StacksToken.DB20\n case EVMToken.DOG:\n return StacksToken.DOG\n default:\n checkNever(evmToken)\n return\n }\n}\n\nexport const isSupportedEVMRoute: IsSupportedFn = async (ctx, route) => {\n const { fromChain, fromToken, toChain, toToken } = route\n\n if (fromChain === toChain && fromToken === toToken) {\n return false\n }\n\n if (\n KnownChainId.isEVMChain(fromChain) &&\n _allNoLongerSupportedEVMChains.includes(fromChain)\n ) {\n return false\n }\n if (\n KnownChainId.isEVMChain(toChain) &&\n _allNoLongerSupportedEVMChains.includes(toChain)\n ) {\n return false\n }\n\n if (\n !KnownChainId.isEVMChain(fromChain) ||\n !KnownTokenId.isEVMToken(fromToken)\n ) {\n return false\n }\n if (!KnownChainId.isKnownChain(toChain)) return false\n\n const fromContractInfo = await getEVMContractCallInfo(ctx, fromChain)\n if (fromContractInfo == null) return false\n\n const fromTokenInfo = await getEVMTokenContractInfo(ctx, fromChain, fromToken)\n if (fromTokenInfo == null) return false\n\n if (fromTokenInfo.tokenContractAddress === nativeCurrencyAddress) {\n if (fromContractInfo.bridgeEndpointContractAddress == null) return false\n if (!KnownChainId.isBitcoinChain(toChain)) return false\n }\n\n if (KnownChainId.isStacksChain(toChain)) {\n if (!KnownTokenId.isStacksToken(toToken)) return false\n\n const stacksToken = await toCorrespondingStacksToken(fromToken)\n if (stacksToken == null) return false\n\n if (stxTokenContractAddresses[stacksToken]?.[toChain] == null) {\n return false\n }\n\n return stacksToken === toToken\n }\n\n if (KnownChainId.isEVMChain(toChain)) {\n if (!KnownTokenId.isEVMToken(toToken)) return false\n\n const toTokenInfo = await getEVMTokenContractInfo(ctx, toChain, toToken)\n if (toTokenInfo == null) return false\n\n const transitStacksToken = await toCorrespondingStacksToken(fromToken)\n if (transitStacksToken == null) return false\n\n const toEVMTokens = await fromCorrespondingStacksToken(\n toChain,\n transitStacksToken,\n )\n return toEVMTokens.includes(toToken)\n }\n\n if (KnownChainId.isBitcoinChain(toChain)) {\n if (!KnownTokenId.isBitcoinToken(toToken)) return false\n const stacksToken = await toCorrespondingStacksToken(fromToken)\n return stacksToken === KnownTokenId.Stacks.aBTC\n }\n\n if (KnownChainId.isRunesChain(toChain)) {\n if (!KnownTokenId.isRunesToken(toToken)) return false\n\n const transitStacksToken = await toCorrespondingStacksToken(fromToken)\n if (transitStacksToken == null) return false\n\n const runesRoutes = await getRunesSupportedRoutes(ctx, toChain)\n return runesRoutes.some(route => route.stacksToken === transitStacksToken)\n }\n\n if (KnownChainId.isBRC20Chain(toChain)) {\n if (!KnownTokenId.isBRC20Token(toToken)) return false\n\n const transitStacksToken = await toCorrespondingStacksToken(fromToken)\n if (transitStacksToken == null) return false\n\n const brc20Routes = await getBRC20SupportedRoutes(ctx, toChain)\n return brc20Routes.some(route => route.stacksToken === transitStacksToken)\n }\n\n checkNever(toChain)\n return false\n}\n"],"mappings":"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","names":["route"]}