@xlink-network/xlink-sdk
Version:
1 lines • 19.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/xlinkSdkUtils/bridgeFromBitcoin.ts"],"sourcesContent":["import * as btc from \"@scure/btc-signer\"\nimport { broadcastRevealableTransaction } from \"../bitcoinUtils/apiHelpers/broadcastRevealableTransaction\"\nimport { createBitcoinPegInRecipients } from \"../bitcoinUtils/apiHelpers/createBitcoinPegInRecipients\"\nimport { createRevealTx } from \"../bitcoinUtils/apiHelpers/createRevealTx\"\nimport { bitcoinToSatoshi } from \"../bitcoinUtils/bitcoinHelpers\"\nimport { getBTCPegInAddress } from \"../bitcoinUtils/btcAddresses\"\nimport { createTransaction } from \"../bitcoinUtils/createTransaction\"\nimport { isSupportedBitcoinRoute } from \"../bitcoinUtils/peggingHelpers\"\nimport {\n BitcoinTransactionPrepareResult,\n ReselectSpendableUTXOsFn,\n prepareTransaction,\n} from \"../bitcoinUtils/prepareTransaction\"\nimport {\n BridgeSwapRoute_FromBitcoin,\n CreateBridgeOrderResult,\n createBridgeOrder_BitcoinToEVM,\n createBridgeOrder_BitcoinToStacks,\n} from \"../stacksUtils/createBridgeOrder\"\nimport { validateBridgeOrder } from \"../stacksUtils/validateBridgeOrder\"\nimport {\n getStacksTokenContractInfo,\n numberToStacksContractNumber,\n} from \"../stacksUtils/xlinkContractHelpers\"\nimport { range } from \"../utils/arrayHelpers\"\nimport { BigNumber } from \"../utils/BigNumber\"\nimport {\n KnownRoute_FromBitcoin,\n KnownRoute_FromBitcoin_ToEVM,\n KnownRoute_FromBitcoin_ToStacks,\n buildSupportedRoutes,\n defineRoute,\n} from \"../utils/buildSupportedRoutes\"\nimport {\n BridgeValidateFailedError,\n UnsupportedBridgeRouteError,\n} from \"../utils/errors\"\nimport { decodeHex } from \"../utils/hexHelpers\"\nimport { assertExclude, checkNever } from \"../utils/typeHelpers\"\nimport {\n KnownChainId,\n KnownTokenId,\n _allKnownEVMMainnetChains,\n _allKnownEVMTestnetChains,\n} from \"../utils/types/knownIds\"\nimport { ChainId, SDKNumber, TokenId } from \"./types\"\nimport { SDKGlobalContext } from \"./types.internal\"\n\nexport const supportedRoutes = buildSupportedRoutes(\n [\n // from mainnet\n // to Stacks\n ...defineRoute(\n [[KnownChainId.Bitcoin.Mainnet], [KnownChainId.Stacks.Mainnet]],\n [[KnownTokenId.Bitcoin.BTC, KnownTokenId.Stacks.aBTC]],\n ),\n // to EVM\n ...defineRoute(\n [[KnownChainId.Bitcoin.Mainnet], [..._allKnownEVMMainnetChains]],\n [\n [KnownTokenId.Bitcoin.BTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.Bitcoin.BTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.Bitcoin.BTC, KnownTokenId.EVM.aBTC],\n ],\n ),\n\n // from testnet\n // to Stacks\n ...defineRoute(\n [[KnownChainId.Bitcoin.Testnet], [KnownChainId.Stacks.Testnet]],\n [[KnownTokenId.Bitcoin.BTC, KnownTokenId.Stacks.aBTC]],\n ),\n // to EVM\n ...defineRoute(\n [[KnownChainId.Bitcoin.Testnet], [..._allKnownEVMTestnetChains]],\n [\n [KnownTokenId.Bitcoin.BTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.Bitcoin.BTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.Bitcoin.BTC, KnownTokenId.EVM.aBTC],\n ],\n ),\n ],\n {\n isSupported: isSupportedBitcoinRoute,\n },\n)\n\nexport type BridgeFromBitcoinInput_signPsbtFn = (tx: {\n psbt: Uint8Array\n signInputs: number[]\n}) => Promise<{ psbt: Uint8Array }>\n\nexport interface BridgeFromBitcoinInput {\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 signPsbt: BridgeFromBitcoinInput_signPsbtFn\n sendTransaction: (tx: { hex: string }) => Promise<{\n txid: string\n }>\n}\n\nexport interface BridgeFromBitcoinOutput {\n txid: string\n}\n\nexport async function bridgeFromBitcoin(\n ctx: SDKGlobalContext,\n info: BridgeFromBitcoinInput,\n): Promise<BridgeFromBitcoinOutput> {\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 bridgeFromBitcoin_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 bridgeFromBitcoin_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 bridgeFromBitcoin_toStacks(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: Omit<\n BridgeFromBitcoinInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n KnownRoute_FromBitcoin_ToStacks,\n): Promise<BridgeFromBitcoinOutput> {\n const pegInAddress = getBTCPegInAddress(info.fromChain, info.toChain)\n const toTokenContractInfo = getStacksTokenContractInfo(\n info.toChain,\n info.toToken,\n )\n if (pegInAddress == null || toTokenContractInfo == 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 return broadcastBitcoinTransaction(sdkContext, info, createdOrder)\n}\n\nasync function bridgeFromBitcoin_toEVM(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: Omit<\n BridgeFromBitcoinInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n KnownRoute_FromBitcoin_ToEVM,\n): Promise<BridgeFromBitcoinOutput> {\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 return broadcastBitcoinTransaction(sdkContext, info, createdOrder)\n}\n\nasync function broadcastBitcoinTransaction(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: Omit<\n ConstructBitcoinTransactionInput,\n \"validateBridgeOrder\" | \"orderData\" | \"pegInAddress\"\n > & {\n sendTransaction: BridgeFromBitcoinInput[\"sendTransaction\"]\n },\n createdOrder: CreateBridgeOrderResult,\n): Promise<{ txid: string }> {\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 tx = await constructBitcoinTransaction(sdkContext, {\n ...(info as any),\n validateBridgeOrder: (btcTx, revealTx, swapRoute) => {\n if (revealTx == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n KnownTokenId.Bitcoin.BTC,\n )\n }\n\n return validateBridgeOrder({\n chainId: info.fromChain,\n commitTx: btcTx,\n revealTx,\n terminatingStacksToken: createdOrder.terminatingStacksToken,\n swapRoute,\n })\n },\n orderData: createdOrder.data,\n pegInAddress,\n })\n\n if (tx.revealOutput == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n KnownTokenId.Bitcoin.BTC,\n )\n }\n\n const { txid: apiBroadcastedTxId } = await broadcastRevealableTransaction(\n sdkContext,\n {\n fromChain: info.fromChain,\n transactionHex: `0x${tx.hex}`,\n orderData: createdOrder.data,\n orderOutputIndex: tx.revealOutput.index,\n orderOutputSatsAmount: tx.revealOutput.satsAmount,\n xlinkPegInAddress: pegInAddress,\n },\n )\n\n const { txid: delegateBroadcastedTxId } = await info.sendTransaction({\n hex: tx.hex,\n })\n\n if (apiBroadcastedTxId !== delegateBroadcastedTxId) {\n console.warn(\n \"[xlink-sdk] Transaction id broadcasted by API and delegatee are different:\",\n `API: ${apiBroadcastedTxId}, `,\n `Delegatee: ${delegateBroadcastedTxId}`,\n )\n }\n\n return { txid: delegateBroadcastedTxId }\n}\n\ntype ConstructBitcoinTransactionInput = PrepareBitcoinTransactionInput & {\n signPsbt: BridgeFromBitcoinInput[\"signPsbt\"]\n pegInAddress: {\n address: string\n scriptPubKey: Uint8Array\n }\n validateBridgeOrder: (\n pegInTx: Uint8Array,\n revealTx: undefined | Uint8Array,\n swapRoute: BridgeSwapRoute_FromBitcoin,\n ) => Promise<void>\n}\nasync function constructBitcoinTransaction(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: ConstructBitcoinTransactionInput,\n): Promise<{\n hex: string\n revealOutput?: {\n index: number\n satsAmount: bigint\n }\n}> {\n const txOptions = await prepareBitcoinTransaction(sdkContext, info)\n\n const tx = createTransaction(\n txOptions.inputs,\n txOptions.recipients.concat({\n addressScriptPubKey: info.fromAddressScriptPubKey,\n satsAmount: txOptions.changeAmount,\n }),\n txOptions.revealOutput ? [] : [info.orderData],\n )\n\n const { psbt } = await info.signPsbt({\n psbt: tx.toPSBT(),\n signInputs: range(0, tx.inputsLength),\n })\n\n const signedTx = btc.Transaction.fromPSBT(psbt, {\n allowUnknownInputs: true,\n allowUnknownOutputs: true,\n })\n if (!signedTx.isFinal) {\n signedTx.finalize()\n }\n\n let revealTx: undefined | Uint8Array\n if (txOptions.revealOutput != null) {\n const created = await createRevealTx(sdkContext, {\n fromChain: info.fromChain,\n txId: signedTx.id,\n vout: txOptions.revealOutput.index,\n satsAmount: txOptions.revealOutput.satsAmount,\n orderData: info.orderData,\n xlinkPegInAddress: info.pegInAddress,\n })\n revealTx = decodeHex(created.txHex)\n }\n\n await info\n .validateBridgeOrder(signedTx.extract(), revealTx, [])\n .catch(err => {\n throw new BridgeValidateFailedError(err)\n })\n\n return {\n hex: signedTx.hex,\n revealOutput: txOptions.revealOutput,\n }\n}\n\nexport type PrepareBitcoinTransactionInput = KnownRoute_FromBitcoin & {\n fromAddressScriptPubKey: BridgeFromBitcoinInput[\"fromAddressScriptPubKey\"]\n fromAddress: BridgeFromBitcoinInput[\"fromAddress\"]\n toAddress: BridgeFromBitcoinInput[\"toAddress\"]\n amount: BridgeFromBitcoinInput[\"amount\"]\n networkFeeRate: BridgeFromBitcoinInput[\"networkFeeRate\"]\n reselectSpendableUTXOs: BridgeFromBitcoinInput[\"reselectSpendableUTXOs\"]\n orderData: Uint8Array\n pegInAddress: {\n address: string\n scriptPubKey: Uint8Array\n }\n}\nexport async function prepareBitcoinTransaction(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: PrepareBitcoinTransactionInput,\n): Promise<\n BitcoinTransactionPrepareResult & {\n bitcoinNetwork: typeof btc.NETWORK\n revealOutput?: {\n index: number\n satsAmount: bigint\n }\n }\n> {\n const bitcoinNetwork =\n info.fromChain === KnownChainId.Bitcoin.Mainnet\n ? btc.NETWORK\n : btc.TEST_NETWORK\n\n const recipient = await createBitcoinPegInRecipients(sdkContext, {\n fromChain: info.fromChain,\n toChain: info.toChain,\n fromToken: info.fromToken,\n toToken: info.toToken,\n fromAddress: {\n address: info.fromAddress,\n scriptPubKey: info.fromAddressScriptPubKey,\n },\n toAddress: info.toAddress,\n fromAmount: BigNumber.from(info.amount),\n orderData: info.orderData,\n feeRate: info.networkFeeRate,\n })\n\n const result = await prepareTransaction({\n recipients: [\n {\n addressScriptPubKey: recipient.scriptPubKey,\n satsAmount: recipient.satsAmount,\n },\n {\n addressScriptPubKey: info.pegInAddress.scriptPubKey,\n satsAmount: bitcoinToSatoshi(info.amount),\n },\n ],\n changeAddressScriptPubKey: info.fromAddressScriptPubKey,\n feeRate: info.networkFeeRate,\n reselectSpendableUTXOs: info.reselectSpendableUTXOs,\n })\n\n return {\n ...result,\n bitcoinNetwork,\n revealOutput: {\n index: 0,\n satsAmount: recipient.satsAmount,\n },\n }\n}\n"],"mappings":"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","names":[]}