{"version":3,"sources":["../src/xlinkSdkUtils/bridgeInfoFromBitcoin.ts"],"sourcesContent":["import { getBtc2StacksFeeInfo } from \"../bitcoinUtils/peggingHelpers\"\nimport { getStacks2EvmFeeInfo } from \"../evmUtils/peggingHelpers\"\nimport { BigNumber } from \"../utils/BigNumber\"\nimport {\n  KnownRoute,\n  KnownRoute_FromBitcoin_ToEVM,\n  KnownRoute_FromBitcoin_ToStacks,\n} from \"../utils/buildSupportedRoutes\"\nimport { UnsupportedBridgeRouteError } from \"../utils/errors\"\nimport { assertExclude, checkNever } from \"../utils/typeHelpers\"\nimport {\n  PublicTransferProphetAggregated,\n  transformToPublicTransferProphet,\n  transformToPublicTransferProphetAggregated,\n} from \"../utils/types/TransferProphet\"\nimport { KnownChainId, KnownTokenId } from \"../utils/types/knownIds\"\nimport { supportedRoutes } from \"./bridgeFromBitcoin\"\nimport { ChainId, SDKNumber, TokenId } from \"./types\"\nimport { SDKGlobalContext } from \"./types.internal\"\n\nexport interface BridgeInfoFromBitcoinInput {\n  fromChain: ChainId\n  toChain: ChainId\n  fromToken: TokenId\n  toToken: TokenId\n  amount: SDKNumber\n}\n\nexport interface BridgeInfoFromBitcoinOutput\n  extends PublicTransferProphetAggregated {}\n\nexport const bridgeInfoFromBitcoin = async (\n  ctx: SDKGlobalContext,\n  info: BridgeInfoFromBitcoinInput,\n): Promise<BridgeInfoFromBitcoinOutput> => {\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 bridgeInfoFromBitcoin_toStacks({\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 bridgeInfoFromBitcoin_toEVM({\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.StacksChain>())\n    assertExclude(route.fromChain, assertExclude.i<KnownChainId.EVMChain>())\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 bridgeInfoFromBitcoin_toStacks(\n  info: Omit<\n    BridgeInfoFromBitcoinInput,\n    \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n  > &\n    KnownRoute_FromBitcoin_ToStacks,\n): Promise<BridgeInfoFromBitcoinOutput> {\n  const step1 = await getBtc2StacksFeeInfo(info)\n  if (step1 == null) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      info.fromToken,\n      info.toToken,\n    )\n  }\n\n  return {\n    ...transformToPublicTransferProphet(info, info.amount, step1),\n    transferProphets: [],\n  }\n}\n\nasync function bridgeInfoFromBitcoin_toEVM(\n  info: Omit<\n    BridgeInfoFromBitcoinInput,\n    \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n  > &\n    KnownRoute_FromBitcoin_ToEVM,\n): Promise<BridgeInfoFromBitcoinOutput> {\n  const transitStacksChainId =\n    info.fromChain === KnownChainId.Bitcoin.Mainnet\n      ? KnownChainId.Stacks.Mainnet\n      : KnownChainId.Stacks.Testnet\n\n  const step1Route: KnownRoute = {\n    fromChain: info.fromChain,\n    fromToken: KnownTokenId.Bitcoin.BTC,\n    toChain: transitStacksChainId,\n    toToken: KnownTokenId.Stacks.aBTC,\n  }\n  const step2Route: KnownRoute = {\n    fromChain: transitStacksChainId,\n    fromToken: KnownTokenId.Stacks.aBTC,\n    toChain: info.toChain,\n    toToken: info.toToken,\n  }\n\n  const [step1, step2] = await Promise.all([\n    getBtc2StacksFeeInfo(step1Route),\n    getStacks2EvmFeeInfo(step2Route),\n  ])\n  if (step1 == null || step2 == null) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      info.fromToken,\n      info.toToken,\n    )\n  }\n\n  const step1TransferProphet = transformToPublicTransferProphet(\n    step1Route,\n    info.amount,\n    step1,\n  )\n  const step2TransferProphet = transformToPublicTransferProphet(\n    step2Route,\n    step1TransferProphet.toAmount,\n    step2,\n  )\n\n  return {\n    ...transformToPublicTransferProphetAggregated(\n      [step1TransferProphet, step2TransferProphet],\n      [BigNumber.ONE],\n    ),\n    transferProphets: [step1TransferProphet, step2TransferProphet],\n  }\n}\n"],"mappings":"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","names":[]}