{"version":3,"sources":["../src/stacksUtils/createBridgeOrder.ts"],"sourcesContent":["import { callReadOnlyFunction } from \"@stacks/transactions\"\nimport { CallReadOnlyFunctionFn, unwrapResponse } from \"clarity-codegen\"\nimport { toCorrespondingStacksToken } from \"../evmUtils/peggingHelpers\"\nimport { hasLength } from \"../utils/arrayHelpers\"\nimport { UnsupportedBridgeRouteError } from \"../utils/errors\"\nimport { decodeHex } from \"../utils/hexHelpers\"\nimport { checkNever } from \"../utils/typeHelpers\"\nimport { KnownChainId, KnownTokenId } from \"../utils/types/knownIds\"\nimport { StacksContractAddress } from \"../xlinkSdkUtils/types\"\nimport { contractAssignedChainIdFromKnownChain } from \"./crossContractDataMapping\"\nimport { getTerminatingStacksTokenContractAddress } from \"./stxContractAddresses\"\nimport {\n  addressToBuffer,\n  executeReadonlyCallXLINK,\n  getStacksContractCallInfo,\n  getStacksTokenContractInfo,\n} from \"./xlinkContractHelpers\"\n\nexport interface BridgeSwapRouteNode {\n  poolId: bigint\n  tokenContractAddress: `${string}.${string}::${string}`\n}\n\n// prettier-ignore\nexport type BridgeSwapRoute_FromBitcoin =\n  | []\n// | [BridgeSwapRouteNode]\n// | [BridgeSwapRouteNode, BridgeSwapRouteNode]\n// | [BridgeSwapRouteNode, BridgeSwapRouteNode, BridgeSwapRouteNode]\n\nexport interface CreateBridgeOrderResult {\n  terminatingStacksToken: StacksContractAddress\n  data: Uint8Array\n}\n\nexport async function createBridgeOrder_BitcoinToStacks(info: {\n  fromChain: KnownChainId.BitcoinChain\n  fromBitcoinScriptPubKey: Uint8Array\n  toChain: KnownChainId.StacksChain\n  toToken: KnownTokenId.StacksToken\n  toStacksAddress: string\n  swapRoute: BridgeSwapRoute_FromBitcoin\n  swapSlippedAmount?: bigint\n}): Promise<undefined | CreateBridgeOrderResult> {\n  let data: undefined | Uint8Array\n\n  const contractCallInfo = getStacksContractCallInfo(\n    info.toChain,\n    \"btc-peg-in-endpoint-v2-05\",\n  )\n  if (contractCallInfo == null) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      KnownTokenId.Bitcoin.BTC,\n      info.toToken,\n    )\n  }\n\n  const { swapRoute, toStacksAddress /*, swapSlippedAmount = 0n */ } = info\n  const executeOptions = {\n    deployerAddress: contractCallInfo.deployerAddress,\n    callReadOnlyFunction: (callOptions =>\n      callReadOnlyFunction({\n        ...callOptions,\n        network: contractCallInfo.network,\n      })) satisfies CallReadOnlyFunctionFn,\n  }\n\n  const targetTokenContractInfo = getStacksTokenContractInfo(\n    info.toChain,\n    info.toToken,\n  )\n  if (targetTokenContractInfo == null) {\n    return undefined\n  }\n\n  if (hasLength(swapRoute, 0)) {\n    data = await executeReadonlyCallXLINK(\n      contractCallInfo.contractName,\n      \"create-order-cross-or-fail\",\n      {\n        order: {\n          from: info.fromBitcoinScriptPubKey,\n          to: addressToBuffer(info.toChain, toStacksAddress),\n          \"chain-id\": undefined,\n          token: `${targetTokenContractInfo.deployerAddress}.${targetTokenContractInfo.contractName}`,\n          \"token-out\": `${targetTokenContractInfo.deployerAddress}.${targetTokenContractInfo.contractName}`,\n        },\n      },\n      executeOptions,\n    ).then(unwrapResponse)\n  } else {\n    checkNever(swapRoute)\n  }\n\n  return {\n    terminatingStacksToken: targetTokenContractInfo,\n    data: data!,\n  }\n}\n\nexport async function createBridgeOrder_BitcoinToEVM(info: {\n  fromChain: KnownChainId.BitcoinChain\n  fromBitcoinScriptPubKey: Uint8Array\n  toChain: KnownChainId.EVMChain\n  toToken: KnownTokenId.EVMToken\n  toEVMAddress: string\n  swapRoute: BridgeSwapRoute_FromBitcoin\n  swapSlippedAmount?: bigint\n}): Promise<undefined | CreateBridgeOrderResult> {\n  const contractCallInfo = getStacksContractCallInfo(\n    info.fromChain === KnownChainId.Bitcoin.Mainnet\n      ? KnownChainId.Stacks.Mainnet\n      : KnownChainId.Stacks.Testnet,\n    \"btc-peg-in-endpoint-v2-05\",\n  )\n  if (contractCallInfo == null) {\n    throw new UnsupportedBridgeRouteError(\n      info.fromChain,\n      info.toChain,\n      KnownTokenId.Bitcoin.BTC,\n      info.toToken,\n    )\n  }\n\n  const { swapRoute, toEVMAddress /*, swapSlippedAmount = 0n */ } = info\n  const executeOptions = {\n    deployerAddress: contractCallInfo.deployerAddress,\n    callReadOnlyFunction: (callOptions =>\n      callReadOnlyFunction({\n        ...callOptions,\n        network: contractCallInfo.network,\n      })) satisfies CallReadOnlyFunctionFn,\n  }\n\n  const targetChainId = contractAssignedChainIdFromKnownChain(info.toChain)\n\n  const swappedStacksToken = await toCorrespondingStacksToken(info.toToken)\n  if (swappedStacksToken == null) return undefined\n  const swappedStacksTokenAddress = getStacksTokenContractInfo(\n    contractCallInfo.network.isMainnet()\n      ? KnownChainId.Stacks.Mainnet\n      : KnownChainId.Stacks.Testnet,\n    swappedStacksToken,\n  )\n  if (swappedStacksTokenAddress == null) return undefined\n\n  const terminatingStacksTokenAddress =\n    getTerminatingStacksTokenContractAddress({\n      fromChain: contractCallInfo.network.isMainnet()\n        ? KnownChainId.Stacks.Mainnet\n        : KnownChainId.Stacks.Testnet,\n      fromToken: swappedStacksToken,\n      toChain: info.toChain,\n      toToken: info.toToken,\n    }) ?? swappedStacksTokenAddress\n\n  let data: undefined | Uint8Array\n  if (hasLength(swapRoute, 0)) {\n    data = await executeReadonlyCallXLINK(\n      contractCallInfo.contractName,\n      \"create-order-cross-or-fail\",\n      {\n        order: {\n          from: info.fromBitcoinScriptPubKey,\n          to: decodeHex(toEVMAddress),\n          \"chain-id\": targetChainId,\n          token: `${swappedStacksTokenAddress.deployerAddress}.${swappedStacksTokenAddress.contractName}`,\n          \"token-out\": `${terminatingStacksTokenAddress.deployerAddress}.${terminatingStacksTokenAddress.contractName}`,\n        },\n      },\n      executeOptions,\n    ).then(unwrapResponse)\n  } else {\n    checkNever(swapRoute)\n  }\n\n  return {\n    terminatingStacksToken: {\n      deployerAddress: terminatingStacksTokenAddress.deployerAddress,\n      contractName: terminatingStacksTokenAddress.contractName,\n    },\n    data: data!,\n  }\n}\n"],"mappings":"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","names":[]}