UNPKG

@xlink-network/xlink-sdk

Version:
178 lines (166 loc) 5.16 kB
import { getStacks2BtcFeeInfo } from "../bitcoinUtils/peggingHelpers" import { getStacks2EvmFeeInfo } from "../evmUtils/peggingHelpers" import { getStacks2MetaFeeInfo } from "../metaUtils/peggingHelpers" import { KnownRoute_FromStacks_ToBitcoin, KnownRoute_FromStacks_ToBRC20, KnownRoute_FromStacks_ToEVM, KnownRoute_FromStacks_ToRunes, } from "../utils/buildSupportedRoutes" import { UnsupportedBridgeRouteError } from "../utils/errors" import { assertExclude, checkNever } from "../utils/typeHelpers" import { PublicTransferProphetAggregated, transformToPublicTransferProphet, } from "../utils/types/TransferProphet" import { KnownChainId, KnownTokenId } from "../utils/types/knownIds" import { supportedRoutes } from "./bridgeFromStacks" import { ChainId, SDKNumber, TokenId } from "./types" import { SDKGlobalContext } from "./types.internal" export interface BridgeInfoFromStacksInput { fromChain: ChainId toChain: ChainId fromToken: TokenId toToken: TokenId amount: SDKNumber } export interface BridgeInfoFromStacksOutput extends PublicTransferProphetAggregated {} export async function bridgeInfoFromStacks( ctx: SDKGlobalContext, info: BridgeInfoFromStacksInput, ): Promise<BridgeInfoFromStacksOutput> { const route = await supportedRoutes.checkRouteValid(ctx, info) if (KnownChainId.isStacksChain(route.fromChain)) { if (KnownChainId.isBitcoinChain(route.toChain)) { if ( KnownTokenId.isStacksToken(route.fromToken) && KnownTokenId.isBitcoinToken(route.toToken) ) { return bridgeInfoFromStacks_toBitcoin({ ...info, fromChain: route.fromChain, toChain: route.toChain, fromToken: route.fromToken, toToken: route.toToken, }) } } else if (KnownChainId.isEVMChain(route.toChain)) { if ( KnownTokenId.isStacksToken(route.fromToken) && KnownTokenId.isEVMToken(route.toToken) ) { return bridgeInfoFromStacks_toEVM({ ...info, fromChain: route.fromChain, toChain: route.toChain, fromToken: route.fromToken, toToken: route.toToken, }) } } else if (KnownChainId.isBRC20Chain(route.toChain)) { if ( KnownTokenId.isStacksToken(route.fromToken) && KnownTokenId.isBRC20Token(route.toToken) ) { return bridgeInfoFromStacks_toMeta(ctx, { ...info, fromChain: route.fromChain, toChain: route.toChain, fromToken: route.fromToken, toToken: route.toToken, }) } } else if (KnownChainId.isRunesChain(route.toChain)) { if ( KnownTokenId.isStacksToken(route.fromToken) && KnownTokenId.isRunesToken(route.toToken) ) { return bridgeInfoFromStacks_toMeta(ctx, { ...info, fromChain: route.fromChain, toChain: route.toChain, fromToken: route.fromToken, toToken: route.toToken, }) } } else { assertExclude(route.toChain, assertExclude.i<KnownChainId.StacksChain>()) checkNever(route) } } else { assertExclude(route.fromChain, assertExclude.i<KnownChainId.EVMChain>()) assertExclude(route.fromChain, assertExclude.i<KnownChainId.BitcoinChain>()) checkNever(route) } throw new UnsupportedBridgeRouteError( info.fromChain, info.toChain, info.fromToken, info.toToken, ) } async function bridgeInfoFromStacks_toBitcoin( info: Omit< BridgeInfoFromStacksInput, "fromChain" | "toChain" | "fromToken" | "toToken" > & KnownRoute_FromStacks_ToBitcoin, ): Promise<BridgeInfoFromStacksOutput> { const step1 = await getStacks2BtcFeeInfo(info) if (step1 == null) { throw new UnsupportedBridgeRouteError( info.fromChain, info.toChain, info.fromToken, info.toToken, ) } return { ...transformToPublicTransferProphet(info, info.amount, step1), transferProphets: [], } } async function bridgeInfoFromStacks_toEVM( info: Omit< BridgeInfoFromStacksInput, "fromChain" | "toChain" | "fromToken" | "toToken" > & KnownRoute_FromStacks_ToEVM, ): Promise<BridgeInfoFromStacksOutput> { const step1 = await getStacks2EvmFeeInfo(info) if (step1 == null) { throw new UnsupportedBridgeRouteError( info.fromChain, info.toChain, info.fromToken, info.toToken, ) } return { ...transformToPublicTransferProphet(info, info.amount, step1), transferProphets: [], } } async function bridgeInfoFromStacks_toMeta( ctx: SDKGlobalContext, info: Omit< BridgeInfoFromStacksInput, "fromChain" | "toChain" | "fromToken" | "toToken" > & (KnownRoute_FromStacks_ToBRC20 | KnownRoute_FromStacks_ToRunes), ): Promise<BridgeInfoFromStacksOutput> { const step1 = await getStacks2MetaFeeInfo(ctx, info) if (step1 == null) { throw new UnsupportedBridgeRouteError( info.fromChain, info.toChain, info.fromToken, info.toToken, ) } return { ...transformToPublicTransferProphet(info, info.amount, step1), transferProphets: [], } }