@xlink-network/xlink-sdk
Version:
1 lines • 8.72 kB
Source Map (JSON)
{"version":3,"sources":["../src/xlinkSdkUtils/estimateBridgeTransactionFromBitcoin.ts"],"sourcesContent":["import { getBTCPegInAddress } from \"../bitcoinUtils/btcAddresses\"\nimport { ReselectSpendableUTXOsFn } from \"../bitcoinUtils/prepareTransaction\"\nimport {\n createBridgeOrder_BitcoinToEVM,\n createBridgeOrder_BitcoinToStacks,\n} from \"../stacksUtils/createBridgeOrder\"\nimport { numberToStacksContractNumber } from \"../stacksUtils/xlinkContractHelpers\"\nimport { UnsupportedBridgeRouteError } from \"../utils/errors\"\nimport { assertExclude, checkNever } from \"../utils/typeHelpers\"\nimport { KnownChainId, KnownTokenId } from \"../utils/types/knownIds\"\nimport { prepareBitcoinTransaction, supportedRoutes } from \"./bridgeFromBitcoin\"\nimport { ChainId, SDKNumber, TokenId, toSDKNumberOrUndefined } from \"./types\"\nimport { SDKGlobalContext } from \"./types.internal\"\n\nexport interface EstimateBridgeTransactionFromBitcoinInput {\n fromChain: ChainId\n toChain: ChainId\n fromToken: TokenId\n toToken: TokenId\n fromAddress: string\n fromAddressScriptPubKey: Uint8Array\n toAddress: string\n amount: SDKNumber\n networkFeeRate: bigint\n reselectSpendableUTXOs: ReselectSpendableUTXOsFn\n}\n\nexport interface EstimateBridgeTransactionFromBitcoinOutput {\n fee: SDKNumber\n estimatedVSize: SDKNumber\n}\n\nexport async function estimateBridgeTransactionFromBitcoin(\n ctx: SDKGlobalContext,\n info: EstimateBridgeTransactionFromBitcoinInput,\n): Promise<EstimateBridgeTransactionFromBitcoinOutput> {\n const route = await supportedRoutes.checkRouteValid(ctx, info)\n\n if (KnownChainId.isBitcoinChain(route.fromChain)) {\n if (KnownChainId.isStacksChain(route.toChain)) {\n if (\n KnownTokenId.isBitcoinToken(route.fromToken) &&\n KnownTokenId.isStacksToken(route.toToken)\n ) {\n return estimateFromBitcoin_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.isEVMChain(route.toChain)) {\n if (\n KnownTokenId.isBitcoinToken(route.fromToken) &&\n KnownTokenId.isEVMToken(route.toToken)\n ) {\n return estimateFromBitcoin_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 (\n KnownChainId.isBRC20Chain(route.toChain) ||\n KnownChainId.isRunesChain(route.toChain)\n ) {\n assertExclude(route.toChain, assertExclude.i<KnownChainId.BRC20Chain>())\n assertExclude(route.toChain, assertExclude.i<KnownChainId.RunesChain>())\n // TODO: bitcoin to brc20/runes is not supported yet\n } else {\n assertExclude(route.toChain, assertExclude.i<KnownChainId.BitcoinChain>())\n checkNever(route)\n }\n } else {\n assertExclude(route.fromChain, assertExclude.i<KnownChainId.EVMChain>())\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 estimateFromBitcoin_toStacks(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: Omit<\n EstimateBridgeTransactionFromBitcoinInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > & {\n fromChain: KnownChainId.BitcoinChain\n toChain: KnownChainId.StacksChain\n fromToken: KnownTokenId.BitcoinToken\n toToken: KnownTokenId.StacksToken\n },\n): Promise<EstimateBridgeTransactionFromBitcoinOutput> {\n const pegInAddress = getBTCPegInAddress(info.fromChain, info.toChain)\n if (pegInAddress == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n KnownTokenId.Bitcoin.BTC,\n )\n }\n\n const createdOrder = await createBridgeOrder_BitcoinToStacks({\n fromChain: info.fromChain,\n fromBitcoinScriptPubKey: info.fromAddressScriptPubKey,\n toChain: info.toChain,\n toToken: info.toToken,\n toStacksAddress: info.toAddress,\n swapSlippedAmount: numberToStacksContractNumber(info.amount),\n swapRoute: [],\n })\n if (createdOrder == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n KnownTokenId.Bitcoin.BTC,\n )\n }\n\n const resp = await prepareBitcoinTransaction(sdkContext, {\n ...info,\n orderData: createdOrder.data,\n pegInAddress,\n })\n\n return {\n fee: toSDKNumberOrUndefined(resp.fee),\n estimatedVSize: toSDKNumberOrUndefined(resp.estimatedVSize),\n }\n}\n\nasync function estimateFromBitcoin_toEVM(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: Omit<\n EstimateBridgeTransactionFromBitcoinInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > & {\n fromChain: KnownChainId.BitcoinChain\n toChain: KnownChainId.EVMChain\n fromToken: KnownTokenId.BitcoinToken\n toToken: KnownTokenId.EVMToken\n },\n): Promise<EstimateBridgeTransactionFromBitcoinOutput> {\n const pegInAddress = getBTCPegInAddress(info.fromChain, info.toChain)\n if (pegInAddress == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n KnownTokenId.Bitcoin.BTC,\n )\n }\n\n const createdOrder = await createBridgeOrder_BitcoinToEVM({\n fromChain: info.fromChain,\n toChain: info.toChain,\n toToken: info.toToken,\n fromBitcoinScriptPubKey: info.fromAddressScriptPubKey,\n toEVMAddress: info.toAddress,\n swapSlippedAmount: numberToStacksContractNumber(info.amount),\n swapRoute: [],\n })\n if (createdOrder == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n KnownTokenId.Bitcoin.BTC,\n )\n }\n\n const resp = await prepareBitcoinTransaction(sdkContext, {\n ...info,\n orderData: createdOrder.data,\n pegInAddress,\n })\n\n return {\n fee: toSDKNumberOrUndefined(resp.fee),\n estimatedVSize: toSDKNumberOrUndefined(resp.estimatedVSize),\n }\n}\n"],"mappings":"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","names":[]}