UNPKG

butterjs-sdk

Version:
145 lines (144 loc) 7.85 kB
"use strict"; 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;