butterjs-sdk
Version:
Butter Network SDK
145 lines (144 loc) • 7.85 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ButterSwap = void 0;
const constants_1 = require("../../constants");
const utils_1 = require("../../utils");
const mosUtils_1 = require("../../libs/utils/mosUtils");
const ButterRouter_json_1 = __importDefault(require("../../abis/ButterRouter.json"));
const requestUtils_1 = require("../../utils/requestUtils");
const ButterRouter_1 = require("../../libs/butter-router/ButterRouter");
const constants_2 = require("../../constants/constants");
class ButterSwap {
/**
* The BridgeToken method is used to bridge token from one chain to another.
* see {@link BridgeRequestParam} for detail
* @param token source token, aka token that user provide
* @param toAddress target chain receiving address
* @param swapRoute best cross-chain swap route, see {@link ButterCrossChainRoute}
* @param options of bridging, check {@link SwapOptions} for more details
* @return ButterTransactionResponse
*/
async omnichainSwap({ fromAddress, fromToken, toAddress, toToken, amountIn, swapRouteStr, slippage, options, }) {
const toChainId = toToken.chainId;
const fromChainId = fromToken.chainId;
// check validity of toAddress according to toChainId
toAddress = (0, utils_1.validateAndParseAddressByChainId)(toAddress, toChainId);
// if src chain is evm chain, signer must be provided
if ((0, constants_1.IS_EVM)(fromToken.chainId) && options.signerOrProvider == undefined) {
throw new Error(`Signer must be provided for EVM blockchains`);
}
// if src chain is near chain, near network provider must be provided
if (constants_1.ChainId.NEAR_TESTNET == fromToken.chainId &&
options.nearProvider == undefined) {
throw new Error(`Network config must be provided for NEAR blockchain`);
}
let result;
// convert near address to hex
if ((0, constants_1.IS_NEAR)(toChainId)) {
const accountState = await (0, utils_1.verifyNearAccountId)(toAddress, toChainId);
if (!accountState.isValid) {
throw new Error(accountState.errMsg);
}
toAddress = (0, utils_1.getHexAddress)(toAddress, toChainId, false);
}
// assemble cross-chain swap route
if (slippage === undefined) {
slippage = constants_2.DEFAULT_SLIPPAGE;
}
const route = (0, requestUtils_1.assembleCrossChainRouteFromJson)(swapRouteStr, slippage);
let swapData = '';
if ((0, constants_1.IS_EVM)(fromChainId)) {
swapData = await (0, requestUtils_1.assembleTargetSwapDataFromRoute)(route, toToken);
}
// check if source chain needs to do agg-swap
if (route.srcChain != undefined &&
route.srcChain.length != 0 &&
route.srcChain[0].path.length != 0 &&
!(0, constants_1.IS_NEAR)(fromChainId)) {
const routerParam = await (0, requestUtils_1.assembleButterRouterParamFromRoute)(route, amountIn, fromChainId, toToken, toAddress);
const butterRouter = new ButterRouter_1.ButterRouter(constants_1.BUTTER_ROUTER_ADDRESS_SET[(0, constants_1.ID_TO_CHAIN_ID)(fromChainId)], ButterRouter_json_1.default.abi, options.signerOrProvider);
result = await butterRouter.entrance(fromAddress, routerParam.coreSwapData, routerParam.targetSwapData, routerParam.amount, routerParam.toChainId, routerParam.toAddress, fromToken.isNative, {
gas: options.gas,
});
return result;
}
if ((0, constants_1.IS_NEAR)(fromChainId)) {
swapData = (0, requestUtils_1.assembleNearSwapMsgFromRoute)(route, fromToken, toToken, toAddress);
}
// create mos instance base on src token chainId.
const mos = (0, mosUtils_1.createMOSInstance)(fromToken.chainId, options);
if (fromToken.isNative) {
// if input token is Native coin, call transferOutNative method
result = await mos.doSwapOutNative(fromAddress, toAddress, toChainId.toString(), amountIn, swapData, {
gas: options.gas,
});
}
else {
result = await mos.doSwapOutToken(fromAddress, fromToken.address, amountIn, toAddress, toChainId.toString(), swapData, {
gas: options.gas,
});
}
return result;
}
async gasEstimateSwap({ fromAddress, fromToken, toAddress, toToken, amountIn, swapRouteStr, slippage, options, }) {
const toChainId = toToken.chainId;
const fromChainId = fromToken.chainId;
// check validity of toAddress according to toChainId
toAddress = (0, utils_1.validateAndParseAddressByChainId)(toAddress, toChainId);
// if src chain is evm chain, signer must be provided
if ((0, constants_1.IS_EVM)(fromToken.chainId) && options.signerOrProvider == undefined) {
throw new Error(`provider must be provided`);
}
// if src chain is near chain, near network provider must be provided
if (constants_1.ChainId.NEAR_TESTNET == fromToken.chainId &&
options.nearProvider == undefined) {
throw new Error(`Network config must be provided for NEAR blockchain`);
}
// assemble cross-chain swap route
const route = (0, requestUtils_1.assembleCrossChainRouteFromJson)(swapRouteStr, constants_2.DEFAULT_SLIPPAGE);
let swapData = '';
// if (IS_NEAR(fromChainId)) {
// swapData = assembleNearSwapMsgFromRoute(
// route,
// fromToken,
// toToken,
// toAddress
// );
// return 'not supported near estimate';
// }
if ((0, constants_1.IS_EVM)(fromChainId)) {
swapData = await (0, requestUtils_1.assembleTargetSwapDataFromRoute)(route, toToken);
}
if ((0, constants_1.IS_NEAR)(toChainId)) {
toAddress = (0, utils_1.getHexAddress)(toAddress, toChainId, false);
}
let gas;
// check if source chain needs to do agg-swap
if (route.srcChain != undefined &&
route.srcChain.length != 0 &&
route.srcChain[0].path.length != 0 &&
!(0, constants_1.IS_NEAR)(fromChainId)) {
const routerParam = await (0, requestUtils_1.assembleButterRouterParamFromRoute)(route, amountIn, fromChainId, toToken, toAddress);
const butterRouter = new ButterRouter_1.ButterRouter(constants_1.BUTTER_ROUTER_ADDRESS_SET[(0, constants_1.ID_TO_CHAIN_ID)(fromChainId)], ButterRouter_json_1.default.abi, options.signerOrProvider);
gas = await butterRouter.gasEstimateEntrance(fromAddress, routerParam.coreSwapData, routerParam.targetSwapData, routerParam.amount, routerParam.toChainId, routerParam.toAddress, fromToken.isNative);
return gas;
}
// if no swap, direct call mos swap method
const mos = (0, mosUtils_1.createMOSInstance)(fromToken.chainId, options);
if ((0, constants_1.IS_NEAR)(toChainId)) {
toAddress = (0, utils_1.getHexAddress)(toAddress, toChainId, false);
}
// if input token is Native coin, call transferOutNative method
if (fromToken.isNative) {
gas = await mos.gasEstimateSwapOutNative(fromAddress, toAddress, toChainId.toString(), amountIn, swapData);
}
else {
gas = await mos.gasEstimateSwapOutToken(fromAddress, fromToken.address, amountIn, toAddress, toChainId.toString(), swapData);
}
return gas;
}
}
exports.ButterSwap = ButterSwap;
;