{"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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,eAAsB,qCACpB,KACA,MACqD;AACrD,QAAM,QAAQ,MAAM,gBAAgB,gBAAgB,KAAK,IAAI;AAE7D,MAAI,aAAa,eAAe,MAAM,SAAS,GAAG;AAChD,QAAI,aAAa,cAAc,MAAM,OAAO,GAAG;AAC7C,UACE,aAAa,eAAe,MAAM,SAAS,KAC3C,aAAa,cAAc,MAAM,OAAO,GACxC;AACA,eAAO,6BAA6B,KAAK;AAAA,UACvC,GAAG;AAAA,UACH,WAAW,MAAM;AAAA,UACjB,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF,WAAW,aAAa,WAAW,MAAM,OAAO,GAAG;AACjD,UACE,aAAa,eAAe,MAAM,SAAS,KAC3C,aAAa,WAAW,MAAM,OAAO,GACrC;AACA,eAAO,0BAA0B,KAAK;AAAA,UACpC,GAAG;AAAA,UACH,WAAW,MAAM;AAAA,UACjB,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF,WACE,aAAa,aAAa,MAAM,OAAO,KACvC,aAAa,aAAa,MAAM,OAAO,GACvC;AACA,oBAAc,MAAM,SAAS,cAAc,EAA2B,CAAC;AACvE,oBAAc,MAAM,SAAS,cAAc,EAA2B,CAAC;AAAA,IAEzE,OAAO;AACL,oBAAc,MAAM,SAAS,cAAc,EAA6B,CAAC;AACzE,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,OAAO;AACL,kBAAc,MAAM,WAAW,cAAc,EAAyB,CAAC;AACvE,kBAAc,MAAM,WAAW,cAAc,EAA4B,CAAC;AAC1E,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,IAAI;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;AAEA,eAAe,6BACb,YACA,MASqD;AACrD,QAAM,eAAe,mBAAmB,KAAK,WAAW,KAAK,OAAO;AACpE,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,aAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,kCAAkC;AAAA,IAC3D,WAAW,KAAK;AAAA,IAChB,yBAAyB,KAAK;AAAA,IAC9B,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,iBAAiB,KAAK;AAAA,IACtB,mBAAmB,6BAA6B,KAAK,MAAM;AAAA,IAC3D,WAAW,CAAC;AAAA,EACd,CAAC;AACD,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,aAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,0BAA0B,YAAY;AAAA,IACvD,GAAG;AAAA,IACH,WAAW,aAAa;AAAA,IACxB;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,KAAK,uBAAuB,KAAK,GAAG;AAAA,IACpC,gBAAgB,uBAAuB,KAAK,cAAc;AAAA,EAC5D;AACF;AAEA,eAAe,0BACb,YACA,MASqD;AACrD,QAAM,eAAe,mBAAmB,KAAK,WAAW,KAAK,OAAO;AACpE,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,aAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,+BAA+B;AAAA,IACxD,WAAW,KAAK;AAAA,IAChB,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,yBAAyB,KAAK;AAAA,IAC9B,cAAc,KAAK;AAAA,IACnB,mBAAmB,6BAA6B,KAAK,MAAM;AAAA,IAC3D,WAAW,CAAC;AAAA,EACd,CAAC;AACD,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,aAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,0BAA0B,YAAY;AAAA,IACvD,GAAG;AAAA,IACH,WAAW,aAAa;AAAA,IACxB;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,KAAK,uBAAuB,KAAK,GAAG;AAAA,IACpC,gBAAgB,uBAAuB,KAAK,cAAc;AAAA,EAC5D;AACF;","names":[]}