UNPKG

moonwalkerswap-v1-sdk

Version:

An SDK for building applications on top of the Moonwalkerswap V1 protocol

187 lines 8.13 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var bignumber_js_1 = __importDefault(require("bignumber.js")); var constants_1 = require("../constants"); var _utils_1 = require("../_utils"); function removeUndefined(methodArguments) { return methodArguments.filter(function (a) { return a !== undefined; }); } function calculateSlippage(value, maxSlippage) { var offset = value.multipliedBy(maxSlippage).dividedBy(constants_1._10000); var minimum = value.minus(offset).integerValue(bignumber_js_1.default.ROUND_FLOOR); var maximum = value.plus(offset).integerValue(bignumber_js_1.default.ROUND_CEIL); return { minimum: minimum.isLessThan(constants_1._0) ? constants_1._0 : minimum, maximum: maximum.isGreaterThan(constants_1._MAX_UINT256) ? constants_1._MAX_UINT256 : maximum }; } function getReserves(trade) { switch (trade.tradeType) { case constants_1.TRADE_TYPE.AVAX_TO_TOKEN: { return trade.marketDetailsPre.outputReserves; } case constants_1.TRADE_TYPE.TOKEN_TO_AVAX: { return trade.marketDetailsPre.inputReserves; } case constants_1.TRADE_TYPE.TOKEN_TO_TOKEN: { return trade.marketDetailsPre.inputReserves; } default: { throw Error("tradeType " + trade.tradeType + " is invalid."); } } } function getMethodName(trade, transfer) { if (transfer === void 0) { transfer = false; } switch (trade.tradeType) { case constants_1.TRADE_TYPE.AVAX_TO_TOKEN: { if (trade.tradeExact === constants_1.TRADE_EXACT.INPUT && !transfer) { return constants_1.TRADE_METHODS.avaxToTokenSwapInput; } else if (trade.tradeExact === constants_1.TRADE_EXACT.INPUT && transfer) { return constants_1.TRADE_METHODS.avaxToTokenTransferInput; } else if (trade.tradeExact === constants_1.TRADE_EXACT.OUTPUT && !transfer) { return constants_1.TRADE_METHODS.avaxToTokenSwapOutput; } else { return constants_1.TRADE_METHODS.avaxToTokenTransferOutput; } } case constants_1.TRADE_TYPE.TOKEN_TO_AVAX: { if (trade.tradeExact === constants_1.TRADE_EXACT.INPUT && !transfer) { return constants_1.TRADE_METHODS.tokenToAvaxSwapInput; } else if (trade.tradeExact === constants_1.TRADE_EXACT.INPUT && transfer) { return constants_1.TRADE_METHODS.tokenToAvaxTransferInput; } else if (trade.tradeExact === constants_1.TRADE_EXACT.OUTPUT && !transfer) { return constants_1.TRADE_METHODS.tokenToAvaxSwapOutput; } else { return constants_1.TRADE_METHODS.tokenToAvaxTransferOutput; } } case constants_1.TRADE_TYPE.TOKEN_TO_TOKEN: { if (trade.tradeExact === constants_1.TRADE_EXACT.INPUT && !transfer) { return constants_1.TRADE_METHODS.tokenToTokenSwapInput; } else if (trade.tradeExact === constants_1.TRADE_EXACT.INPUT && transfer) { return constants_1.TRADE_METHODS.tokenToTokenTransferInput; } else if (trade.tradeExact === constants_1.TRADE_EXACT.OUTPUT && !transfer) { return constants_1.TRADE_METHODS.tokenToTokenSwapOutput; } else { return constants_1.TRADE_METHODS.tokenToTokenTransferOutput; } } default: { throw Error("tradeType " + trade.tradeType + " is invalid."); } } } function getValueAndMethodArguments(trade, methodName, maxSlippage, deadline, recipient) { switch (methodName) { case constants_1.TRADE_METHODS.avaxToTokenSwapInput: case constants_1.TRADE_METHODS.avaxToTokenTransferInput: { return { value: trade.inputAmount.amount, methodArguments: removeUndefined([ calculateSlippage(trade.outputAmount.amount, maxSlippage).minimum, deadline, recipient ]) }; } case constants_1.TRADE_METHODS.avaxToTokenSwapOutput: case constants_1.TRADE_METHODS.avaxToTokenTransferOutput: { return { value: calculateSlippage(trade.inputAmount.amount, maxSlippage).maximum, methodArguments: removeUndefined([trade.outputAmount.amount, deadline, recipient]) }; } case constants_1.TRADE_METHODS.tokenToAvaxSwapInput: case constants_1.TRADE_METHODS.tokenToAvaxTransferInput: { return { value: constants_1._0, methodArguments: removeUndefined([ trade.inputAmount.amount, calculateSlippage(trade.outputAmount.amount, maxSlippage).minimum, deadline, recipient ]) }; } case constants_1.TRADE_METHODS.tokenToAvaxSwapOutput: case constants_1.TRADE_METHODS.tokenToAvaxTransferOutput: { return { value: constants_1._0, methodArguments: removeUndefined([ trade.outputAmount.amount, calculateSlippage(trade.inputAmount.amount, maxSlippage).maximum, deadline, recipient ]) }; } case constants_1.TRADE_METHODS.tokenToTokenSwapInput: case constants_1.TRADE_METHODS.tokenToTokenTransferInput: { if (!trade.outputAmount.token.address) { throw Error('trade does not include output token address.'); } return { value: constants_1._0, methodArguments: removeUndefined([ trade.inputAmount.amount, calculateSlippage(trade.outputAmount.amount, maxSlippage).minimum, constants_1._1, deadline, recipient, trade.outputAmount.token.address ]) }; } case constants_1.TRADE_METHODS.tokenToTokenSwapOutput: case constants_1.TRADE_METHODS.tokenToTokenTransferOutput: { if (!trade.outputAmount.token.address) { throw Error('trade does not include output token address.'); } return { value: constants_1._0, methodArguments: removeUndefined([ trade.outputAmount.amount, calculateSlippage(trade.inputAmount.amount, maxSlippage).maximum, constants_1._MAX_UINT256, deadline, recipient, trade.outputAmount.token.address ]) }; } default: { throw Error("methodName " + methodName + " is invalid."); } } } function getExecutionDetails(trade, maxSlippage, deadline, recipient) { var reserves = getReserves(trade); if (!reserves.exchange || !reserves.exchange.address) { throw Error('trade does not include exchange address.'); } var methodName = getMethodName(trade, !!recipient); var methodId = constants_1.TRADE_METHOD_IDS[methodName]; var _a = getValueAndMethodArguments(trade, methodName, maxSlippage || 200, deadline || Math.round(Date.now() / 1000 + 60 * 10), recipient && _utils_1.normalizeAddress(recipient)), value = _a.value, methodArguments = _a.methodArguments; return { exchangeAddress: reserves.exchange.address, methodName: methodName, methodId: methodId, value: value, methodArguments: methodArguments }; } exports.getExecutionDetails = getExecutionDetails; //# sourceMappingURL=index.js.map