UNPKG

@xlink-network/xlink-sdk

Version:
1 lines 15.7 kB
{"version":3,"sources":["../src/xlinkSdkUtils/bridgeFromStacks.ts"],"sourcesContent":["import * as btc from \"@scure/btc-signer\"\nimport { ContractCallOptions } from \"clarity-codegen\"\nimport { addressToScriptPubKey } from \"../bitcoinUtils/bitcoinHelpers\"\nimport { contractAssignedChainIdFromKnownChain } from \"../stacksUtils/crossContractDataMapping\"\nimport { isSupportedStacksRoute } from \"../stacksUtils/peggingHelpers\"\nimport {\n composeTxXLINK,\n getStacksContractCallInfo,\n getStacksTokenContractInfo,\n numberToStacksContractNumber,\n} from \"../stacksUtils/xlinkContractHelpers\"\nimport {\n buildSupportedRoutes,\n defineRoute,\n KnownRoute_FromStacks_ToBitcoin,\n KnownRoute_FromStacks_ToBRC20,\n KnownRoute_FromStacks_ToEVM,\n KnownRoute_FromStacks_ToRunes,\n} from \"../utils/buildSupportedRoutes\"\nimport { UnsupportedBridgeRouteError } 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\"\nimport { getTerminatingStacksTokenContractAddress } from \"../stacksUtils/stxContractAddresses\"\n\nexport const supportedRoutes = buildSupportedRoutes(\n [\n // from mainnet\n ...defineRoute(\n // to Bitcoin\n [[KnownChainId.Stacks.Mainnet], [KnownChainId.Bitcoin.Mainnet]],\n [[KnownTokenId.Stacks.aBTC, KnownTokenId.Bitcoin.BTC]],\n ),\n ...defineRoute(\n // to rest EVM chains\n [[KnownChainId.Stacks.Mainnet], [..._allKnownEVMMainnetChains]],\n [\n // BTCs\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.cbBTC],\n // USDTs\n [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.USDT],\n [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.sUSDT],\n // others\n [KnownTokenId.Stacks.sSKO, KnownTokenId.EVM.SKO],\n [KnownTokenId.Stacks.ALEX, KnownTokenId.EVM.ALEX],\n [KnownTokenId.Stacks.vLiSTX, KnownTokenId.EVM.vLiSTX],\n [KnownTokenId.Stacks.vLiALEX, KnownTokenId.EVM.vLiALEX],\n [KnownTokenId.Stacks.uBTC, KnownTokenId.EVM.uBTC],\n [KnownTokenId.Stacks.uBTC, KnownTokenId.EVM.wuBTC],\n [KnownTokenId.Stacks.DB20, KnownTokenId.EVM.DB20],\n [KnownTokenId.Stacks.DOG, KnownTokenId.EVM.DOG],\n ],\n ),\n\n // from testnet\n ...defineRoute(\n // to Bitcoin\n [[KnownChainId.Stacks.Testnet], [KnownChainId.Bitcoin.Testnet]],\n [[KnownTokenId.Stacks.aBTC, KnownTokenId.Bitcoin.BTC]],\n ),\n ...defineRoute(\n // to rest EVM chains\n [[KnownChainId.Stacks.Testnet], [..._allKnownEVMTestnetChains]],\n [\n // BTCs\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.aBTC],\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.WBTC],\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.BTCB],\n [KnownTokenId.Stacks.aBTC, KnownTokenId.EVM.cbBTC],\n // USDTs\n [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.USDT],\n [KnownTokenId.Stacks.sUSDT, KnownTokenId.EVM.sUSDT],\n // others\n [KnownTokenId.Stacks.sSKO, KnownTokenId.EVM.SKO],\n [KnownTokenId.Stacks.ALEX, KnownTokenId.EVM.ALEX],\n [KnownTokenId.Stacks.vLiSTX, KnownTokenId.EVM.vLiSTX],\n [KnownTokenId.Stacks.vLiALEX, KnownTokenId.EVM.vLiALEX],\n [KnownTokenId.Stacks.uBTC, KnownTokenId.EVM.uBTC],\n [KnownTokenId.Stacks.uBTC, KnownTokenId.EVM.wuBTC],\n [KnownTokenId.Stacks.DB20, KnownTokenId.EVM.DB20],\n [KnownTokenId.Stacks.DOG, KnownTokenId.EVM.DOG],\n ],\n ),\n ],\n {\n isSupported: isSupportedStacksRoute,\n },\n)\n\nexport interface BridgeFromStacksInput {\n fromChain: ChainId\n toChain: ChainId\n fromToken: TokenId\n toToken: TokenId\n fromAddress: string\n toAddress: string\n amount: SDKNumber\n sendTransaction: (tx: ContractCallOptions) => Promise<{\n txid: string\n }>\n}\n\nexport interface BridgeFromStacksOutput {\n txid: string\n}\n\nexport async function bridgeFromStacks(\n ctx: SDKGlobalContext,\n info: BridgeFromStacksInput,\n): Promise<BridgeFromStacksOutput> {\n const route = await supportedRoutes.checkRouteValid(ctx, info)\n\n if (KnownChainId.isStacksChain(route.fromChain)) {\n if (KnownChainId.isBitcoinChain(route.toChain)) {\n if (\n KnownTokenId.isStacksToken(route.fromToken) &&\n KnownTokenId.isBitcoinToken(route.toToken)\n ) {\n return bridgeFromStacks_toBitcoin({\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.isStacksToken(route.fromToken) &&\n KnownTokenId.isEVMToken(route.toToken)\n ) {\n return bridgeFromStacks_toEVM({\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else if (KnownChainId.isBRC20Chain(route.toChain)) {\n if (\n KnownTokenId.isStacksToken(route.fromToken) &&\n KnownTokenId.isBRC20Token(route.toToken)\n ) {\n return bridgeFromStacks_toMeta({\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else if (KnownChainId.isRunesChain(route.toChain)) {\n if (\n KnownTokenId.isStacksToken(route.fromToken) &&\n KnownTokenId.isRunesToken(route.toToken)\n ) {\n return bridgeFromStacks_toMeta({\n ...info,\n fromChain: route.fromChain,\n toChain: route.toChain,\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n }\n } else {\n assertExclude(route.toChain, assertExclude.i<KnownChainId.StacksChain>())\n checkNever(route)\n }\n } else {\n assertExclude(route.fromChain, assertExclude.i<KnownChainId.EVMChain>())\n assertExclude(route.fromChain, assertExclude.i<KnownChainId.BitcoinChain>())\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 bridgeFromStacks_toBitcoin(\n info: Omit<\n BridgeFromStacksInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n KnownRoute_FromStacks_ToBitcoin,\n): Promise<BridgeFromStacksOutput> {\n const contractCallInfo = getStacksContractCallInfo(\n info.fromChain,\n \"btc-peg-out-endpoint-v2-01\",\n )\n if (!contractCallInfo) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n const bitcoinNetwork =\n info.toChain === KnownChainId.Bitcoin.Mainnet\n ? btc.NETWORK\n : btc.TEST_NETWORK\n\n const options = composeTxXLINK(\n contractCallInfo.contractName,\n \"request-peg-out-0\",\n {\n \"peg-out-address\": addressToScriptPubKey(bitcoinNetwork, info.toAddress),\n amount: numberToStacksContractNumber(info.amount),\n },\n { deployerAddress: contractCallInfo.deployerAddress },\n )\n\n return await info.sendTransaction(options)\n}\n\nasync function bridgeFromStacks_toEVM(\n info: Omit<\n BridgeFromStacksInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n KnownRoute_FromStacks_ToEVM,\n): Promise<BridgeFromStacksOutput> {\n const contractCallInfo = getStacksContractCallInfo(\n info.fromChain,\n \"cross-peg-out-endpoint-v2-01\",\n )\n const fromTokenContractInfo = getStacksTokenContractInfo(\n info.fromChain,\n info.fromToken,\n )\n if (contractCallInfo == null || fromTokenContractInfo == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n const terminatingTokenContractAddress =\n getTerminatingStacksTokenContractAddress(info) ?? fromTokenContractInfo\n\n const options = composeTxXLINK(\n contractCallInfo.contractName,\n \"transfer-to-unwrap\",\n {\n \"token-trait\": `${terminatingTokenContractAddress.deployerAddress}.${terminatingTokenContractAddress.contractName}`,\n \"amount-in-fixed\": numberToStacksContractNumber(info.amount),\n \"dest-chain-id\": contractAssignedChainIdFromKnownChain(info.toChain),\n \"settle-address\": decodeHex(info.toAddress),\n },\n { deployerAddress: contractCallInfo.deployerAddress },\n )\n\n return await info.sendTransaction(options)\n}\n\nasync function bridgeFromStacks_toMeta(\n info: Omit<\n BridgeFromStacksInput,\n \"fromChain\" | \"toChain\" | \"fromToken\" | \"toToken\"\n > &\n (KnownRoute_FromStacks_ToBRC20 | KnownRoute_FromStacks_ToRunes),\n): Promise<BridgeFromStacksOutput> {\n const contractCallInfo = getStacksContractCallInfo(\n info.fromChain,\n \"meta-peg-out-endpoint-v2-04\",\n )\n const fromTokenContractInfo = getStacksTokenContractInfo(\n info.fromChain,\n info.fromToken,\n )\n if (contractCallInfo == null || fromTokenContractInfo == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n info.fromToken,\n info.toToken,\n )\n }\n\n const bitcoinNetwork =\n info.toChain === KnownChainId.BRC20.Mainnet ||\n info.toChain === KnownChainId.Runes.Mainnet\n ? btc.NETWORK\n : btc.TEST_NETWORK\n\n const options = composeTxXLINK(\n contractCallInfo.contractName,\n \"request-peg-out\",\n {\n \"peg-out-address\": addressToScriptPubKey(bitcoinNetwork, info.toAddress),\n \"the-chain-id\": contractAssignedChainIdFromKnownChain(info.toChain),\n \"token-trait\": `${fromTokenContractInfo.deployerAddress}.${fromTokenContractInfo.contractName}`,\n amount: numberToStacksContractNumber(info.amount),\n },\n { deployerAddress: contractCallInfo.deployerAddress },\n )\n\n return await info.sendTransaction(options)\n}\n"],"mappings":"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","names":[]}