{"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":[]}