UNPKG

fsl-js-sdk

Version:
107 lines (106 loc) 5.03 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConstantProductPoolQuoteBuilder = void 0; var spl_token_v0_1 = require("@solana/spl-token-v0"); var decimal_js_1 = __importDefault(require("decimal.js")); var dooar_1 = require("../../dooar"); /** * ConstantProductPools * * Product price curve: * x = inputTokenCount * y = outputTokenCount * k = x * y */ function getRate(inputTradeAmountU64, params) { if (inputTradeAmountU64.eq(dooar_1.ZERO)) { return new decimal_js_1.default(0); } var expectedOutputAmountU64 = getExpectedOutputAmount(inputTradeAmountU64, params); var inputTradeAmount = dooar_1.DecimalUtil.fromU64(inputTradeAmountU64, params.inputToken.scale); var outputTradeAmount = dooar_1.DecimalUtil.fromU64(expectedOutputAmountU64, params.outputToken.scale); return outputTradeAmount .div(inputTradeAmount) .toDecimalPlaces(params.outputToken.scale); } function getPriceImpact(inputTradeAmount, params) { if (inputTradeAmount.eq(dooar_1.ZERO) || params.outputTokenCount.eq(dooar_1.ZERO)) { return new decimal_js_1.default(0); } var noSlippageOutputCountU64 = getExpectedOutputAmountWithNoSlippage(inputTradeAmount, params); var outputCountU64 = getExpectedOutputAmount(inputTradeAmount, params); var noSlippageOutputCount = dooar_1.DecimalUtil.fromU64(noSlippageOutputCountU64, params.outputToken.scale); var outputCount = dooar_1.DecimalUtil.fromU64(outputCountU64, params.outputToken.scale); var impact = noSlippageOutputCount .sub(outputCount) .div(noSlippageOutputCount); return impact.mul(100).toDecimalPlaces(params.outputToken.scale); } function getLPFees(inputTradeAmount, params) { var feeStructure = params.feeStructure; var tradingFee = inputTradeAmount .mul(feeStructure.traderFee.numerator) .div(feeStructure.traderFee.denominator); var ownerFee = inputTradeAmount .mul(feeStructure.ownerFee.numerator) .div(feeStructure.ownerFee.denominator); return new spl_token_v0_1.u64(tradingFee.add(ownerFee).toString()); } function getExpectedOutputAmount(inputTradeAmount, params) { var inputTradeLessFees = inputTradeAmount.sub(getLPFees(inputTradeAmount, params)); return getOutputAmount(inputTradeLessFees, params); } function getExpectedOutputAmountWithNoSlippage(inputTradeAmount, params) { if (params.inputTokenCount.eq(dooar_1.ZERO)) { return params.outputTokenCount; } var inputTradeLessFees = inputTradeAmount.sub(getLPFees(inputTradeAmount, params)); return inputTradeLessFees .mul(params.outputTokenCount) .div(params.inputTokenCount); } function getMinimumAmountOut(inputTradeAmount, params) { var slippageTolerance = params.slippageTolerance; var expectedOutputAmountFees = getExpectedOutputAmount(inputTradeAmount, params); var result = expectedOutputAmountFees .mul(slippageTolerance.denominator.sub(slippageTolerance.numerator)) .div(slippageTolerance.denominator); return result; } // Note: This function matches the calculation done on SERUM and on Web UI. // Given k = currInputTokenCount * currOutputTokenCount and k = newInputTokenCount * newOutputTokenCount, // solve for newOutputTokenCount function getOutputAmount(inputTradeAmount, params) { var _a = [ params.inputTokenCount, params.outputTokenCount, ], poolInputAmount = _a[0], poolOutputAmount = _a[1]; var invariant = poolInputAmount.mul(poolOutputAmount); var newPoolOutputAmount = dooar_1.U64Utils.ceilingDivision(invariant, poolInputAmount.add(inputTradeAmount))[0]; var outputAmount = poolOutputAmount.sub(newPoolOutputAmount); return new spl_token_v0_1.u64(outputAmount.toString()); } var ConstantProductPoolQuoteBuilder = /** @class */ (function () { function ConstantProductPoolQuoteBuilder() { } ConstantProductPoolQuoteBuilder.prototype.buildQuote = function (params, inputTradeAmount) { return { getRate: function () { return getRate(inputTradeAmount, params); }, getPriceImpact: function () { return getPriceImpact(inputTradeAmount, params); }, getLPFees: function () { return dooar_1.DooarU64.fromU64(getLPFees(inputTradeAmount, params), params.inputToken.scale); }, getExpectedOutputAmount: function () { return dooar_1.DooarU64.fromU64(getExpectedOutputAmount(inputTradeAmount, params), params.outputToken.scale); }, getMinOutputAmount: function () { return dooar_1.DooarU64.fromU64(getMinimumAmountOut(inputTradeAmount, params), params.outputToken.scale); }, }; }; return ConstantProductPoolQuoteBuilder; }()); exports.ConstantProductPoolQuoteBuilder = ConstantProductPoolQuoteBuilder;