@xlink-network/xlink-sdk
Version:
258 lines (256 loc) • 8.69 kB
JavaScript
import {
isSupportedStacksRoute
} from "./chunk-56RIW7A5.mjs";
import {
buildSupportedRoutes,
defineRoute
} from "./chunk-BSXD4QA3.mjs";
import {
contractAssignedChainIdFromKnownChain
} from "./chunk-RGOLYR47.mjs";
import {
composeTxXLINK,
getStacksContractCallInfo,
getStacksTokenContractInfo,
numberToStacksContractNumber
} from "./chunk-JJNS722O.mjs";
import {
getTerminatingStacksTokenContractAddress
} from "./chunk-6UKYXMCX.mjs";
import {
decodeHex
} from "./chunk-UZKY7HXV.mjs";
import {
UnsupportedBridgeRouteError
} from "./chunk-KTUPNUM5.mjs";
import {
KnownChainId,
KnownTokenId,
_allKnownEVMMainnetChains,
_allKnownEVMTestnetChains
} from "./chunk-GZDQGY7B.mjs";
import {
assertExclude,
checkNever
} from "./chunk-E5Y3FGR6.mjs";
import {
addressToScriptPubKey
} from "./chunk-VA3HOX5B.mjs";
// src/xlinkSdkUtils/bridgeFromStacks.ts
import * as btc from "@scure/btc-signer";
var supportedRoutes = buildSupportedRoutes(
[
// from mainnet
...defineRoute(
// to Bitcoin
[[KnownChainId.Stacks.Mainnet], [KnownChainId.Bitcoin.Mainnet]],
[[KnownTokenId.Stacks.aBTC, KnownTokenId.Bitcoin.BTC]]
),
...defineRoute(
// to rest EVM chains
[[KnownChainId.Stacks.Mainnet], [..._allKnownEVMMainnetChains]],
[
// BTCs
[],
[],
[],
[],
// USDTs
[],
[],
// others
[],
[],
[],
[],
[],
[],
[],
[]
]
),
// from testnet
...defineRoute(
// to Bitcoin
[[KnownChainId.Stacks.Testnet], [KnownChainId.Bitcoin.Testnet]],
[[KnownTokenId.Stacks.aBTC, KnownTokenId.Bitcoin.BTC]]
),
...defineRoute(
// to rest EVM chains
[[KnownChainId.Stacks.Testnet], [..._allKnownEVMTestnetChains]],
[
// BTCs
[],
[],
[],
[],
// USDTs
[],
[],
// others
[],
[],
[],
[],
[],
[],
[],
[]
]
)
],
{
isSupported: isSupportedStacksRoute
}
);
async function bridgeFromStacks(ctx, info) {
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 bridgeFromStacks_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 bridgeFromStacks_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 bridgeFromStacks_toMeta({
...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 bridgeFromStacks_toMeta({
...info,
fromChain: route.fromChain,
toChain: route.toChain,
fromToken: route.fromToken,
toToken: route.toToken
});
}
} else {
assertExclude(route.toChain, assertExclude.i());
checkNever(route);
}
} else {
assertExclude(route.fromChain, assertExclude.i());
assertExclude(route.fromChain, assertExclude.i());
checkNever(route);
}
throw new UnsupportedBridgeRouteError(
info.fromChain,
info.toChain,
info.fromToken,
info.toToken
);
}
async function bridgeFromStacks_toBitcoin(info) {
const contractCallInfo = getStacksContractCallInfo(
info.fromChain,
"btc-peg-out-endpoint-v2-01"
);
if (!contractCallInfo) {
throw new UnsupportedBridgeRouteError(
info.fromChain,
info.toChain,
info.fromToken,
info.toToken
);
}
const bitcoinNetwork = info.toChain === KnownChainId.Bitcoin.Mainnet ? btc.NETWORK : btc.TEST_NETWORK;
const options = composeTxXLINK(
contractCallInfo.contractName,
"request-peg-out-0",
{
"peg-out-address": addressToScriptPubKey(bitcoinNetwork, info.toAddress),
amount: numberToStacksContractNumber(info.amount)
},
{ deployerAddress: contractCallInfo.deployerAddress }
);
return await info.sendTransaction(options);
}
async function bridgeFromStacks_toEVM(info) {
const contractCallInfo = getStacksContractCallInfo(
info.fromChain,
"cross-peg-out-endpoint-v2-01"
);
const fromTokenContractInfo = getStacksTokenContractInfo(
info.fromChain,
info.fromToken
);
if (contractCallInfo == null || fromTokenContractInfo == null) {
throw new UnsupportedBridgeRouteError(
info.fromChain,
info.toChain,
info.fromToken,
info.toToken
);
}
const terminatingTokenContractAddress = getTerminatingStacksTokenContractAddress(info) ?? fromTokenContractInfo;
const options = composeTxXLINK(
contractCallInfo.contractName,
"transfer-to-unwrap",
{
"token-trait": `${terminatingTokenContractAddress.deployerAddress}.${terminatingTokenContractAddress.contractName}`,
"amount-in-fixed": numberToStacksContractNumber(info.amount),
"dest-chain-id": contractAssignedChainIdFromKnownChain(info.toChain),
"settle-address": decodeHex(info.toAddress)
},
{ deployerAddress: contractCallInfo.deployerAddress }
);
return await info.sendTransaction(options);
}
async function bridgeFromStacks_toMeta(info) {
const contractCallInfo = getStacksContractCallInfo(
info.fromChain,
"meta-peg-out-endpoint-v2-04"
);
const fromTokenContractInfo = getStacksTokenContractInfo(
info.fromChain,
info.fromToken
);
if (contractCallInfo == null || fromTokenContractInfo == null) {
throw new UnsupportedBridgeRouteError(
info.fromChain,
info.toChain,
info.fromToken,
info.toToken
);
}
const bitcoinNetwork = info.toChain === KnownChainId.BRC20.Mainnet || info.toChain === KnownChainId.Runes.Mainnet ? btc.NETWORK : btc.TEST_NETWORK;
const options = composeTxXLINK(
contractCallInfo.contractName,
"request-peg-out",
{
"peg-out-address": addressToScriptPubKey(bitcoinNetwork, info.toAddress),
"the-chain-id": contractAssignedChainIdFromKnownChain(info.toChain),
"token-trait": `${fromTokenContractInfo.deployerAddress}.${fromTokenContractInfo.contractName}`,
amount: numberToStacksContractNumber(info.amount)
},
{ deployerAddress: contractCallInfo.deployerAddress }
);
return await info.sendTransaction(options);
}
export {
supportedRoutes,
bridgeFromStacks
};
//# sourceMappingURL=chunk-52RRFT5Y.mjs.map