UNPKG

@xlink-network/xlink-sdk

Version:
1 lines 7.47 kB
{"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":[]}