fsl-js-sdk
Version:
sdk for web
107 lines (106 loc) • 5.03 kB
JavaScript
;
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;