UNPKG

@xlink-network/xlink-sdk

Version:
1 lines 39.8 kB
{"version":3,"sources":["../src/xlinkSdkUtils/bridgeFromEVM.ts"],"sourcesContent":["import { encodeFunctionData, Hex, toHex } from \"viem\"\nimport { estimateGas } from \"viem/actions\"\nimport { nativeCurrencyAddress } from \"../evmUtils/addressHelpers\"\nimport { BridgeEndpointAbi } from \"../evmUtils/contractAbi/bridgeEndpoint\"\nimport { NativeBridgeEndpointAbi } from \"../evmUtils/contractAbi/nativeBridgeEndpoint\"\nimport { sendMessageAbi } from \"../evmUtils/contractMessageHelpers\"\nimport { isSupportedEVMRoute } from \"../evmUtils/peggingHelpers\"\nimport {\n getEVMContractCallInfo,\n getEVMTokenContractInfo,\n numberToSolidityContractNumber,\n} from \"../evmUtils/xlinkContractHelpers\"\nimport { contractAssignedChainIdFromKnownChain } from \"../stacksUtils/crossContractDataMapping\"\nimport {\n addressToBuffer,\n getStacksTokenContractInfo,\n} from \"../stacksUtils/xlinkContractHelpers\"\nimport { BigNumber } from \"../utils/BigNumber\"\nimport {\n buildSupportedRoutes,\n defineRoute,\n KnownRoute_FromEVM_ToBitcoin,\n KnownRoute_FromEVM_ToBRC20,\n KnownRoute_FromEVM_ToEVM,\n KnownRoute_FromEVM_ToRunes,\n KnownRoute_FromEVM_ToStacks,\n} from \"../utils/buildSupportedRoutes\"\nimport {\n InvalidMethodParametersError,\n UnsupportedBridgeRouteError,\n} from \"../utils/errors\"\nimport { decodeHex, encodeZeroPrefixedHex } from \"../utils/hexHelpers\"\nimport { assertExclude, checkNever } from \"../utils/typeHelpers\"\nimport {\n _allKnownEVMMainnetChains,\n _allKnownEVMTestnetChains,\n _knownChainIdToErrorMessagePart,\n KnownChainId,\n KnownTokenId,\n} from \"../utils/types/knownIds\"\nimport {\n ChainId,\n EVMAddress,\n SDKNumber,\n TokenId,\n toSDKNumberOrUndefined,\n} from \"./types\"\nimport { SDKGlobalContext } from \"./types.internal\"\nimport { metaTokenToCorrespondingStacksToken } from \"../metaUtils/peggingHelpers\"\n\nexport const supportedRoutes = buildSupportedRoutes(\n [\n // from mainnet\n ...defineRoute(\n // to Bitcoin\n [[..._allKnownEVMMainnetChains], [KnownChainId.Bitcoin.Mainnet]],\n [\n [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.Bitcoin.BTC],\n [KnownTokenId.EVM.BTCB, KnownTokenId.Bitcoin.BTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.Bitcoin.BTC],\n ],\n ),\n ...defineRoute(\n // to Stacks\n [[..._allKnownEVMMainnetChains], [KnownChainId.Stacks.Mainnet]],\n [\n // BTCs\n [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.Stacks.aBTC],\n [KnownTokenId.EVM.BTCB, KnownTokenId.Stacks.aBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.Stacks.aBTC],\n // USDTs\n [KnownTokenId.EVM.USDT, KnownTokenId.Stacks.sUSDT],\n [KnownTokenId.EVM.sUSDT, KnownTokenId.Stacks.sUSDT],\n // others\n [KnownTokenId.EVM.SKO, KnownTokenId.Stacks.sSKO],\n [KnownTokenId.EVM.ALEX, KnownTokenId.Stacks.ALEX],\n [KnownTokenId.EVM.vLiSTX, KnownTokenId.Stacks.vLiSTX],\n [KnownTokenId.EVM.vLiALEX, KnownTokenId.Stacks.vLiALEX],\n [KnownTokenId.EVM.uBTC, KnownTokenId.Stacks.uBTC],\n [KnownTokenId.EVM.wuBTC, KnownTokenId.Stacks.uBTC],\n [KnownTokenId.EVM.DB20, KnownTokenId.Stacks.DB20],\n [KnownTokenId.EVM.DOG, KnownTokenId.Stacks.DOG],\n ],\n ),\n ...defineRoute(\n // to EVM\n [[..._allKnownEVMMainnetChains], [..._allKnownEVMMainnetChains]],\n [\n // BTCs\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.cbBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.WBTC],\n\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.cbBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.BTCB],\n\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.cbBTC],\n\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.BTCB],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.cbBTC],\n\n // USDTs\n [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.USDT],\n [KnownTokenId.EVM.USDT, KnownTokenId.EVM.sUSDT],\n\n [KnownTokenId.EVM.USDT, KnownTokenId.EVM.USDT],\n [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.sUSDT],\n\n // others\n [KnownTokenId.EVM.SKO, KnownTokenId.EVM.SKO],\n [KnownTokenId.EVM.ALEX, KnownTokenId.EVM.ALEX],\n [KnownTokenId.EVM.vLiSTX, KnownTokenId.EVM.vLiSTX],\n [KnownTokenId.EVM.vLiALEX, KnownTokenId.EVM.vLiALEX],\n\n [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.uBTC],\n [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.wuBTC],\n [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.wuBTC],\n [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.uBTC],\n\n [KnownTokenId.EVM.DB20, KnownTokenId.EVM.DB20],\n [KnownTokenId.EVM.DOG, KnownTokenId.EVM.DOG],\n ],\n ),\n\n // from testnet\n ...defineRoute(\n // to Bitcoin\n [[..._allKnownEVMTestnetChains], [KnownChainId.Bitcoin.Testnet]],\n [\n [KnownTokenId.EVM.aBTC, KnownTokenId.Bitcoin.BTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.Bitcoin.BTC],\n [KnownTokenId.EVM.BTCB, KnownTokenId.Bitcoin.BTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.Bitcoin.BTC],\n ],\n ),\n ...defineRoute(\n // to Stacks\n [[..._allKnownEVMTestnetChains], [KnownChainId.Stacks.Testnet]],\n [\n // BTCs\n [KnownTokenId.EVM.aBTC, KnownTokenId.Stacks.aBTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.Stacks.aBTC],\n [KnownTokenId.EVM.BTCB, KnownTokenId.Stacks.aBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.Stacks.aBTC],\n // USDTs\n [KnownTokenId.EVM.USDT, KnownTokenId.Stacks.sUSDT],\n [KnownTokenId.EVM.sUSDT, KnownTokenId.Stacks.sUSDT],\n // others\n [KnownTokenId.EVM.SKO, KnownTokenId.Stacks.sSKO],\n [KnownTokenId.EVM.ALEX, KnownTokenId.Stacks.ALEX],\n [KnownTokenId.EVM.vLiSTX, KnownTokenId.Stacks.vLiSTX],\n [KnownTokenId.EVM.vLiALEX, KnownTokenId.Stacks.vLiALEX],\n [KnownTokenId.EVM.uBTC, KnownTokenId.Stacks.uBTC],\n [KnownTokenId.EVM.wuBTC, KnownTokenId.Stacks.uBTC],\n [KnownTokenId.EVM.DB20, KnownTokenId.Stacks.DB20],\n [KnownTokenId.EVM.DOG, KnownTokenId.Stacks.DOG],\n ],\n ),\n ...defineRoute(\n // to EVM\n [[..._allKnownEVMTestnetChains], [..._allKnownEVMTestnetChains]],\n [\n // BTCs\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.WBTC],\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.cbBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.WBTC],\n\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.cbBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.BTCB],\n\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.cbBTC],\n\n [KnownTokenId.EVM.WBTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.EVM.BTCB, KnownTokenId.EVM.BTCB],\n [KnownTokenId.EVM.aBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.EVM.cbBTC, KnownTokenId.EVM.cbBTC],\n\n // USDTs\n [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.USDT],\n [KnownTokenId.EVM.USDT, KnownTokenId.EVM.sUSDT],\n\n [KnownTokenId.EVM.USDT, KnownTokenId.EVM.USDT],\n [KnownTokenId.EVM.sUSDT, KnownTokenId.EVM.sUSDT],\n\n // others\n [KnownTokenId.EVM.SKO, KnownTokenId.EVM.SKO],\n [KnownTokenId.EVM.ALEX, KnownTokenId.EVM.ALEX],\n [KnownTokenId.EVM.vLiSTX, KnownTokenId.EVM.vLiSTX],\n [KnownTokenId.EVM.vLiALEX, KnownTokenId.EVM.vLiALEX],\n\n [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.uBTC],\n [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.wuBTC],\n [KnownTokenId.EVM.uBTC, KnownTokenId.EVM.wuBTC],\n [KnownTokenId.EVM.wuBTC, KnownTokenId.EVM.uBTC],\n\n [KnownTokenId.EVM.DB20, KnownTokenId.EVM.DB20],\n [KnownTokenId.EVM.DOG, KnownTokenId.EVM.DOG],\n ],\n ),\n ],\n {\n isSupported: isSupportedEVMRoute,\n },\n)\n\nexport type BridgeFromEVMInput = {\n fromChain: ChainId\n toChain: ChainId\n fromToken: TokenId\n toToken: TokenId\n fromAddress: EVMAddress\n toAddress: string\n /**\n * **Required** when `toChain` is one of bitcoin chains\n */\n toAddressScriptPubKey?: Uint8Array\n amount: SDKNumber\n sendTransaction: (tx: {\n from: EVMAddress\n to: EVMAddress\n data: Uint8Array\n recommendedGasLimit: SDKNumber\n value?: SDKNumber\n }) => Promise<{\n txHash: string\n }>\n}\n\nexport interface BridgeFromEVMOutput {\n txHash: string\n}\n\nexport async function bridgeFromEVM(\n ctx: SDKGlobalContext,\n info: BridgeFromEVMInput,\n): Promise<BridgeFromEVMOutput> {\n const route = await supportedRoutes.checkRouteValid(ctx, info)\n\n if (KnownChainId.isEVMChain(route.fromChain)) {\n if (KnownChainId.isStacksChain(route.toChain)) {\n if (\n KnownTokenId.isEVMToken(route.fromToken) &&\n KnownTokenId.isStacksToken(route.toToken)\n ) {\n return bridgeFromEVM_toStacks(ctx, {\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else if (KnownChainId.isBitcoinChain(route.toChain)) {\n if (\n KnownTokenId.isEVMToken(route.fromToken) &&\n KnownTokenId.isBitcoinToken(route.toToken)\n ) {\n return bridgeFromEVM_toBitcoin(ctx, {\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else if (KnownChainId.isEVMChain(route.toChain)) {\n if (\n KnownTokenId.isEVMToken(route.fromToken) &&\n KnownTokenId.isEVMToken(route.toToken)\n ) {\n return bridgeFromEVM_toEVM(ctx, {\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else if (KnownChainId.isBRC20Chain(route.toChain)) {\n if (\n KnownTokenId.isEVMToken(route.fromToken) &&\n KnownTokenId.isBRC20Token(route.toToken)\n ) {\n return bridgeFromEVM_toMeta(ctx, {\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else if (KnownChainId.isRunesChain(route.toChain)) {\n if (\n KnownTokenId.isEVMToken(route.fromToken) &&\n KnownTokenId.isRunesToken(route.toToken)\n ) {\n return bridgeFromEVM_toMeta(ctx, {\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else {\n checkNever(route.toChain)\n }\n } else {\n assertExclude(route.fromChain, assertExclude.i<KnownChainId.BitcoinChain>())\n assertExclude(route.fromChain, assertExclude.i<KnownChainId.StacksChain>())\n checkNever(route)\n }\n\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n}\n\nasync function bridgeFromEVM_toStacks(\n ctx: SDKGlobalContext,\n info: Omit<\n BridgeFromEVMInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n KnownRoute_FromEVM_ToStacks,\n): Promise<BridgeFromEVMOutput> {\n const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n const fromTokenContractInfo = await getEVMTokenContractInfo(\n ctx,\n info.fromChain,\n info.fromToken,\n )\n const toTokenContractInfo = await getStacksTokenContractInfo(\n info.toChain,\n info.toToken,\n )\n if (\n bridgeEndpointAddress == null ||\n fromTokenContractInfo == null ||\n toTokenContractInfo == null ||\n fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress\n ) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n const message = await encodeFunctionData({\n abi: sendMessageAbi,\n functionName: \"transferToStacks\",\n args: [info.toAddress],\n })\n\n const functionData = await encodeFunctionData({\n abi: BridgeEndpointAbi,\n functionName: \"sendMessageWithToken\",\n args: [\n fromTokenContractInfo.tokenContractAddress,\n numberToSolidityContractNumber(info.amount),\n message,\n ],\n })\n\n const fallbackGasLimit = 200_000\n const estimated = await estimateGas(fromTokenContractInfo.client, {\n account: info.fromAddress,\n to: bridgeEndpointAddress,\n data: functionData,\n })\n .then(n =>\n BigNumber.round(\n { precision: 0 },\n BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n ),\n )\n .catch(\n // add a fallback in case estimate failed\n () => fallbackGasLimit,\n )\n\n return await info.sendTransaction({\n from: info.fromAddress,\n to: bridgeEndpointAddress,\n data: decodeHex(functionData),\n recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n })\n}\n\nasync function bridgeFromEVM_toBitcoin(\n ctx: SDKGlobalContext,\n info: Omit<\n BridgeFromEVMInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n KnownRoute_FromEVM_ToBitcoin,\n): Promise<BridgeFromEVMOutput> {\n const { bridgeEndpointContractAddress, nativeBridgeEndpointContractAddress } =\n (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n\n const fromTokenContractInfo = await getEVMTokenContractInfo(\n ctx,\n info.fromChain,\n info.fromToken,\n )\n if (fromTokenContractInfo == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n if (info.toAddressScriptPubKey == null) {\n throw new InvalidMethodParametersError(\n [\"XLinkSDK\", \"bridgeFromEVM (to Bitcoin)\"],\n [\n {\n name: \"toAddressScriptPubKey\",\n expected: \"Uint8Array\",\n received: \"undefined\",\n },\n ],\n )\n }\n\n const toAddressHex = toHex(info.toAddressScriptPubKey)\n\n const message = await encodeFunctionData({\n abi: sendMessageAbi,\n functionName: \"transferToBTC\",\n args: [toAddressHex],\n })\n let bridgeEndpointAddress: undefined | EVMAddress\n let functionData: Hex\n let value: undefined | SDKNumber\n if (fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress) {\n functionData = await encodeFunctionData({\n abi: NativeBridgeEndpointAbi,\n functionName: \"withdraw\",\n args: [\n encodeZeroPrefixedHex(addressToBuffer(info.toChain, info.toAddress)),\n ],\n })\n\n const nativeCurrencyDecimals =\n fromTokenContractInfo.client.chain?.nativeCurrency.decimals\n if (nativeCurrencyDecimals == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n bridgeEndpointAddress = nativeBridgeEndpointContractAddress\n value = toSDKNumberOrUndefined(\n BigNumber.rightMoveDecimals(nativeCurrencyDecimals, info.amount),\n )\n } else {\n functionData = await encodeFunctionData({\n abi: BridgeEndpointAbi,\n functionName: \"sendMessageWithToken\",\n args: [\n fromTokenContractInfo.tokenContractAddress,\n numberToSolidityContractNumber(info.amount),\n message,\n ],\n })\n\n bridgeEndpointAddress = bridgeEndpointContractAddress\n }\n\n if (bridgeEndpointAddress == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n const fallbackGasLimit = 200_000\n const estimated = await estimateGas(fromTokenContractInfo.client, {\n account: info.fromAddress,\n to: bridgeEndpointAddress,\n data: functionData,\n })\n .then(n =>\n BigNumber.round(\n { precision: 0 },\n BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n ),\n )\n .catch(\n // add a fallback in case estimate failed\n () => fallbackGasLimit,\n )\n\n return await info.sendTransaction({\n from: info.fromAddress,\n to: bridgeEndpointAddress,\n data: decodeHex(functionData),\n value,\n recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n })\n}\n\nasync function bridgeFromEVM_toEVM(\n ctx: SDKGlobalContext,\n info: Omit<\n BridgeFromEVMInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n KnownRoute_FromEVM_ToEVM,\n): Promise<BridgeFromEVMOutput> {\n const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n const fromTokenContractInfo = await getEVMTokenContractInfo(\n ctx,\n info.fromChain,\n info.fromToken,\n )\n const toTokenContractInfo = await getEVMTokenContractInfo(\n ctx,\n info.toChain,\n info.toToken,\n )\n if (\n bridgeEndpointAddress == null ||\n fromTokenContractInfo == null ||\n toTokenContractInfo == null ||\n fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress\n ) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n const message = await encodeFunctionData({\n abi: sendMessageAbi,\n functionName: \"transferToEVM\",\n args: [\n contractAssignedChainIdFromKnownChain(info.toChain),\n toTokenContractInfo.tokenContractAddress,\n info.toAddress as EVMAddress,\n ],\n })\n const functionData = await encodeFunctionData({\n abi: BridgeEndpointAbi,\n functionName: \"sendMessageWithToken\",\n args: [\n fromTokenContractInfo.tokenContractAddress,\n numberToSolidityContractNumber(info.amount),\n message,\n ],\n })\n\n const fallbackGasLimit = 200_000\n const estimated = await estimateGas(fromTokenContractInfo.client, {\n account: info.fromAddress,\n to: bridgeEndpointAddress,\n data: functionData,\n })\n .then(n =>\n BigNumber.round(\n { precision: 0 },\n BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n ),\n )\n .catch(\n // add a fallback in case estimate failed\n () => fallbackGasLimit,\n )\n\n return await info.sendTransaction({\n from: info.fromAddress,\n to: bridgeEndpointAddress,\n data: decodeHex(functionData),\n recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n })\n}\n\nasync function bridgeFromEVM_toMeta(\n ctx: SDKGlobalContext,\n info: Omit<\n BridgeFromEVMInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n (KnownRoute_FromEVM_ToBRC20 | KnownRoute_FromEVM_ToRunes),\n): Promise<BridgeFromEVMOutput> {\n const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n const fromTokenContractInfo = await getEVMTokenContractInfo(\n ctx,\n info.fromChain,\n info.fromToken,\n )\n\n const toTokenCorrespondingStacksToken =\n await metaTokenToCorrespondingStacksToken(ctx, {\n chain: info.toChain as any,\n token: info.toToken as any,\n })\n const toTokenStacksAddress =\n toTokenCorrespondingStacksToken == null\n ? undefined\n : await getStacksTokenContractInfo(\n KnownChainId.isEVMMainnetChain(info.fromChain)\n ? KnownChainId.Stacks.Mainnet\n : KnownChainId.Stacks.Testnet,\n toTokenCorrespondingStacksToken,\n )\n\n if (\n bridgeEndpointAddress == null ||\n fromTokenContractInfo == null ||\n fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress ||\n toTokenCorrespondingStacksToken == null ||\n toTokenStacksAddress == null\n ) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n if (info.toAddressScriptPubKey == null) {\n throw new InvalidMethodParametersError(\n [\n \"XLinkSDK\",\n `bridgeFromEVM (to ${_knownChainIdToErrorMessagePart(info.toChain)})`,\n ],\n [\n {\n name: \"toAddressScriptPubKey\",\n expected: \"Uint8Array\",\n received: \"undefined\",\n },\n ],\n )\n }\n\n const toAddressHex = toHex(info.toAddressScriptPubKey)\n\n const message = await encodeFunctionData({\n abi: sendMessageAbi,\n functionName: KnownChainId.isBRC20Chain(info.toChain)\n ? \"transferToBRC20\"\n : \"transferToRunes\",\n args: [\n toAddressHex,\n `${toTokenStacksAddress.deployerAddress}.${toTokenStacksAddress.contractName}`,\n ],\n })\n const functionData = await encodeFunctionData({\n abi: BridgeEndpointAbi,\n functionName: \"sendMessageWithToken\",\n args: [\n fromTokenContractInfo.tokenContractAddress,\n numberToSolidityContractNumber(info.amount),\n message,\n ],\n })\n\n const fallbackGasLimit = 200_000\n const estimated = await estimateGas(fromTokenContractInfo.client, {\n account: info.fromAddress,\n to: bridgeEndpointAddress,\n data: functionData,\n })\n .then(n =>\n BigNumber.round(\n { precision: 0 },\n BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n ),\n )\n .catch(\n // add a fallback in case estimate failed\n () => fallbackGasLimit,\n )\n\n return await info.sendTransaction({\n from: info.fromAddress,\n to: bridgeEndpointAddress,\n data: decodeHex(functionData),\n recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n })\n}\n\nexport async function bridgeFromEVM_toLaunchpad(\n ctx: SDKGlobalContext,\n info: {\n fromChain: KnownChainId.EVMChain\n fromToken: KnownTokenId.EVMToken\n fromAddress: EVMAddress\n receiverChain: KnownChainId.KnownChain\n receiverAddress: string\n /**\n * **Required** when `receiverChain` is one of bitcoin chains\n */\n receiverAddressScriptPubKey?: Uint8Array\n launchId: SDKNumber\n amount: SDKNumber\n sendTransaction: (tx: {\n from: EVMAddress\n to: EVMAddress\n data: Uint8Array\n recommendedGasLimit: SDKNumber\n }) => Promise<{\n txHash: string\n }>\n },\n): Promise<BridgeFromEVMOutput> {\n const { bridgeEndpointContractAddress: bridgeEndpointAddress } =\n (await getEVMContractCallInfo(ctx, info.fromChain)) ?? {}\n const fromTokenContractInfo = await getEVMTokenContractInfo(\n ctx,\n info.fromChain,\n info.fromToken,\n )\n if (\n bridgeEndpointAddress == null ||\n fromTokenContractInfo == null ||\n fromTokenContractInfo.tokenContractAddress === nativeCurrencyAddress\n ) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.receiverChain,\n info.fromToken,\n )\n }\n\n if (\n KnownChainId.isBitcoinChain(info.receiverChain) &&\n info.receiverAddressScriptPubKey == null\n ) {\n throw new InvalidMethodParametersError(\n [\n \"XLinkSDK\",\n `bridgeFromEVM_toLaunchpad (to ${_knownChainIdToErrorMessagePart(info.receiverChain)})`,\n ],\n [\n {\n name: \"toAddressScriptPubKey\",\n expected: \"Uint8Array\",\n received: \"undefined\",\n },\n ],\n )\n }\n\n const toAddressHex =\n info.receiverAddressScriptPubKey != null\n ? toHex(info.receiverAddressScriptPubKey)\n : toHex(addressToBuffer(info.receiverChain, info.receiverAddress))\n\n const message = await encodeFunctionData({\n abi: sendMessageAbi,\n functionName: \"transferToLaunchpad\",\n args: [\n BigNumber.toBigInt({ roundingMode: BigNumber.roundDown }, info.launchId),\n toAddressHex,\n ],\n })\n const functionData = await encodeFunctionData({\n abi: BridgeEndpointAbi,\n functionName: \"sendMessageWithToken\",\n args: [\n fromTokenContractInfo.tokenContractAddress,\n numberToSolidityContractNumber(info.amount),\n message,\n ],\n })\n\n const fallbackGasLimit = 200_000\n const estimated = await estimateGas(fromTokenContractInfo.client, {\n account: info.fromAddress,\n to: bridgeEndpointAddress,\n data: functionData,\n })\n .then(n =>\n BigNumber.round(\n { precision: 0 },\n BigNumber.max([fallbackGasLimit, BigNumber.mul(n, 1.2)]),\n ),\n )\n .catch(\n // add a fallback in case estimate failed\n () => fallbackGasLimit,\n )\n\n return await info.sendTransaction({\n from: info.fromAddress,\n to: bridgeEndpointAddress,\n data: decodeHex(functionData),\n recommendedGasLimit: toSDKNumberOrUndefined(estimated),\n })\n}\n"],"mappings":"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","names":[]}