UNPKG

moonwalkerswap-v1-sdk

Version:

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

142 lines 8.64 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 lodash_clonedeepwith_1 = __importDefault(require("lodash.clonedeepwith")); var types_1 = require("../types"); var constants_1 = require("../constants"); var _utils_1 = require("../_utils"); var _utils_2 = require("./_utils"); var market_1 = require("./market"); function getInputPrice(inputAmount, inputReserve, outputReserve) { _utils_1.ensureAllUInt256([inputAmount, inputReserve, outputReserve]); if (inputReserve.isLessThanOrEqualTo(constants_1._0) || outputReserve.isLessThanOrEqualTo(constants_1._0)) { throw Error("Both inputReserve '" + inputReserve + "' and outputReserve '" + outputReserve + "' must be non-zero."); } var inputAmountWithFee = inputAmount.multipliedBy(constants_1._997); var numerator = inputAmountWithFee.multipliedBy(outputReserve); var denominator = inputReserve.multipliedBy(constants_1._1000).plus(inputAmountWithFee); var outputAmount = numerator.dividedToIntegerBy(denominator); _utils_1.ensureAllUInt256([inputAmountWithFee, numerator, denominator, outputAmount]); return outputAmount; } function getOutputPrice(outputAmount, inputReserve, outputReserve) { _utils_1.ensureAllUInt256([outputAmount, inputReserve, outputReserve]); if (inputReserve.isLessThanOrEqualTo(constants_1._0) || outputReserve.isLessThanOrEqualTo(constants_1._0)) { throw Error("Both inputReserve '" + inputReserve + "' and outputReserve '" + outputReserve + "' must be non-zero."); } var numerator = inputReserve.multipliedBy(outputAmount).multipliedBy(constants_1._1000); var denominator = outputReserve.minus(outputAmount).multipliedBy(constants_1._997); var inputAmount = numerator.dividedToIntegerBy(denominator).plus(constants_1._1); _utils_1.ensureAllUInt256([numerator, denominator, inputAmount]); return inputAmount; } function getSingleTradeTransput(tradeType, tradeExact, tradeAmount, reserves) { if (!types_1.areTokenReservesNormalized(reserves)) { throw Error; } var inputReserve = tradeType === constants_1.TRADE_TYPE.AVAX_TO_TOKEN ? reserves.avaxReserve.amount : reserves.tokenReserve.amount; var outputReserve = tradeType === constants_1.TRADE_TYPE.AVAX_TO_TOKEN ? reserves.tokenReserve.amount : reserves.avaxReserve.amount; var calculatedAmount = tradeExact === constants_1.TRADE_EXACT.INPUT ? getInputPrice(tradeAmount, inputReserve, outputReserve) : getOutputPrice(tradeAmount, inputReserve, outputReserve); return calculatedAmount; } function customizer(value) { if (bignumber_js_1.default.isBigNumber(value)) { return new bignumber_js_1.default(value); } } function getTradeTransput(tradeType, tradeExact, tradeAmount, inputReserves, outputReserves) { var inputReservesPost = lodash_clonedeepwith_1.default(inputReserves, customizer); var outputReservesPost = lodash_clonedeepwith_1.default(outputReserves, customizer); if (tradeType === constants_1.TRADE_TYPE.TOKEN_TO_TOKEN) { if (!types_1.areTokenReservesNormalized(inputReservesPost) || !types_1.areTokenReservesNormalized(outputReservesPost)) { throw Error; } if (tradeExact === constants_1.TRADE_EXACT.INPUT) { var intermediateTransput = getSingleTradeTransput(constants_1.TRADE_TYPE.TOKEN_TO_AVAX, constants_1.TRADE_EXACT.INPUT, tradeAmount, inputReserves); var finalTransput = getSingleTradeTransput(constants_1.TRADE_TYPE.AVAX_TO_TOKEN, constants_1.TRADE_EXACT.INPUT, intermediateTransput, outputReserves); inputReservesPost.avaxReserve.amount = inputReservesPost.avaxReserve.amount.minus(intermediateTransput); inputReservesPost.tokenReserve.amount = inputReservesPost.tokenReserve.amount.plus(tradeAmount); outputReservesPost.avaxReserve.amount = outputReservesPost.avaxReserve.amount.plus(intermediateTransput); outputReservesPost.tokenReserve.amount = outputReservesPost.tokenReserve.amount.minus(finalTransput); return { transput: finalTransput, inputReservesPost: inputReservesPost, outputReservesPost: outputReservesPost }; } else { var intermediateTransput = getSingleTradeTransput(constants_1.TRADE_TYPE.AVAX_TO_TOKEN, constants_1.TRADE_EXACT.OUTPUT, tradeAmount, outputReserves); var finalTransput = getSingleTradeTransput(constants_1.TRADE_TYPE.TOKEN_TO_AVAX, constants_1.TRADE_EXACT.OUTPUT, intermediateTransput, inputReserves); inputReservesPost.avaxReserve.amount = inputReservesPost.avaxReserve.amount.minus(intermediateTransput); inputReservesPost.tokenReserve.amount = inputReservesPost.tokenReserve.amount.plus(finalTransput); outputReservesPost.avaxReserve.amount = outputReservesPost.avaxReserve.amount.plus(intermediateTransput); outputReservesPost.tokenReserve.amount = outputReservesPost.tokenReserve.amount.minus(tradeAmount); return { transput: finalTransput, inputReservesPost: inputReservesPost, outputReservesPost: outputReservesPost }; } } else { var reserves = tradeType === constants_1.TRADE_TYPE.AVAX_TO_TOKEN ? outputReserves : inputReserves; var finalTransput = getSingleTradeTransput(tradeType, tradeExact, tradeAmount, reserves); if (tradeType === constants_1.TRADE_TYPE.AVAX_TO_TOKEN) { if (!types_1.areTokenReservesNormalized(outputReservesPost)) { throw Error; } outputReservesPost.avaxReserve.amount = outputReservesPost.avaxReserve.amount.plus(tradeExact === constants_1.TRADE_EXACT.INPUT ? tradeAmount : finalTransput); outputReservesPost.tokenReserve.amount = outputReservesPost.tokenReserve.amount.minus(tradeExact === constants_1.TRADE_EXACT.INPUT ? finalTransput : tradeAmount); } else { if (!types_1.areTokenReservesNormalized(inputReservesPost)) { throw Error; } inputReservesPost.avaxReserve.amount = inputReservesPost.avaxReserve.amount.minus(tradeExact === constants_1.TRADE_EXACT.INPUT ? finalTransput : tradeAmount); inputReservesPost.tokenReserve.amount = inputReservesPost.tokenReserve.amount.plus(tradeExact === constants_1.TRADE_EXACT.INPUT ? tradeAmount : finalTransput); } return { transput: finalTransput, inputReservesPost: inputReservesPost, outputReservesPost: outputReservesPost }; } } function calculateSlippage(baseRate, newRate) { var difference = baseRate.minus(newRate).absoluteValue(); return difference.multipliedBy(constants_1._10000).dividedBy(baseRate); } function getTradeDetails(tradeExact, _tradeAmount, marketDetails) { var tradeAmount = _utils_1.normalizeBigNumberish(_tradeAmount); var _a = getTradeTransput(marketDetails.tradeType, tradeExact, tradeAmount, marketDetails.inputReserves, marketDetails.outputReserves), transput = _a.transput, inputReservesPost = _a.inputReservesPost, outputReservesPost = _a.outputReservesPost; var inputAmount = { token: marketDetails.inputReserves.token, amount: tradeExact === constants_1.TRADE_EXACT.INPUT ? tradeAmount : transput }; var outputAmount = { token: marketDetails.outputReserves.token, amount: tradeExact === constants_1.TRADE_EXACT.INPUT ? transput : tradeAmount }; var marketDetailsPost = market_1.getMarketDetails(inputReservesPost, outputReservesPost); var executionRate = _utils_2.calculateDecimalRate(outputAmount, inputAmount); var marketRateSlippage = calculateSlippage(marketDetails.marketRate.rate, marketDetailsPost.marketRate.rate); var executionRateSlippage = calculateSlippage(marketDetails.marketRate.rate, executionRate.rate); return { marketDetailsPre: marketDetails, marketDetailsPost: marketDetailsPost, tradeType: marketDetails.tradeType, tradeExact: tradeExact, inputAmount: inputAmount, outputAmount: outputAmount, executionRate: executionRate, marketRateSlippage: marketRateSlippage, executionRateSlippage: executionRateSlippage }; } exports.getTradeDetails = getTradeDetails; //# sourceMappingURL=trade.js.map