mirror of
https://github.com/Brotocol-xyz/bro-sdk.git
synced 2026-01-12 06:44:18 +08:00
181 lines
5.1 KiB
TypeScript
181 lines
5.1 KiB
TypeScript
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(ctx, {
|
|
...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, {
|
|
swappedFromRoute: null,
|
|
})
|
|
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(
|
|
ctx: SDKGlobalContext,
|
|
info: Omit<
|
|
BridgeInfoFromStacksInput,
|
|
"fromChain" | "toChain" | "fromToken" | "toToken"
|
|
> &
|
|
KnownRoute_FromStacks_ToEVM,
|
|
): Promise<BridgeInfoFromStacksOutput> {
|
|
const step1 = await getStacks2EvmFeeInfo(ctx, 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: [],
|
|
}
|
|
}
|