@xlink-network/xlink-sdk
Version:
1 lines • 8.66 kB
Source Map (JSON)
{"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":[]}