UNPKG

@alcorexchange/alcor-swap-sdk

Version:

​​ **npm** ``` npm i @alcorexchange/alcor-swap-sdk ``` **yarn** ``` yarn add @alcorexchange/alcor-swap-sdk ``` ## Usage ### Import:

99 lines 4.97 kB
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } import { ONE, ZERO, Q64, MaxUint128 } from "../internalConstants"; import { FullMath } from "./fullMath"; function multiplyIn128(x, y) { const product = x * y; return product & MaxUint128; } function addIn128(x, y) { const sum = x + y; return sum & MaxUint128; } export let SqrtPriceMath = /*#__PURE__*/function () { /** * Cannot be constructed. */ function SqrtPriceMath() { _classCallCheck(this, SqrtPriceMath); } return _createClass(SqrtPriceMath, null, [{ key: "getAmountADelta", value: function getAmountADelta(sqrtRatioLX64, sqrtRatioUX64, liquidity, roundUp) { if (sqrtRatioLX64 > sqrtRatioUX64) { [sqrtRatioLX64, sqrtRatioUX64] = [sqrtRatioUX64, sqrtRatioLX64]; } const numerator1 = liquidity << BigInt(64); const numerator2 = sqrtRatioUX64 - sqrtRatioLX64; if (roundUp) { const mul1 = FullMath.mulDivRoundingUp(numerator1, numerator2, sqrtRatioUX64); return FullMath.mulDivRoundingUp(mul1, ONE, sqrtRatioLX64); } else { const mul1 = numerator1 * numerator2 / sqrtRatioUX64; return mul1 / sqrtRatioLX64; } } }, { key: "getAmountBDelta", value: function getAmountBDelta(sqrtRatioLX64, sqrtRatioUX64, liquidity, roundUp) { if (sqrtRatioLX64 > sqrtRatioUX64) { [sqrtRatioLX64, sqrtRatioUX64] = [sqrtRatioUX64, sqrtRatioLX64]; } const diff = sqrtRatioUX64 - sqrtRatioLX64; if (roundUp) { return FullMath.mulDivRoundingUp(liquidity, diff, Q64); } else { return liquidity * diff / Q64; } } }, { key: "getNextSqrtPriceFromInput", value: function getNextSqrtPriceFromInput(sqrtPX64, liquidity, amountIn, zeroForOne) { // Убраны invariant для ускорения, если данные валидны return zeroForOne ? this.getNextSqrtPriceFromAmountARoundingUp(sqrtPX64, liquidity, amountIn, true) : this.getNextSqrtPriceFromAmountBRoundingDown(sqrtPX64, liquidity, amountIn, true); } }, { key: "getNextSqrtPriceFromOutput", value: function getNextSqrtPriceFromOutput(sqrtPX64, liquidity, amountOut, zeroForOne) { // Убраны invariant для ускорения, если данные валидны return zeroForOne ? this.getNextSqrtPriceFromAmountBRoundingDown(sqrtPX64, liquidity, amountOut, false) : this.getNextSqrtPriceFromAmountARoundingUp(sqrtPX64, liquidity, amountOut, false); } }, { key: "getNextSqrtPriceFromAmountARoundingUp", value: function getNextSqrtPriceFromAmountARoundingUp(sqrtPX64, liquidity, amount, add) { if (amount === ZERO) return sqrtPX64; const numerator1 = liquidity << BigInt(64); if (add) { const product = multiplyIn128(amount, sqrtPX64); if (product / amount === sqrtPX64) { const denominator = addIn128(numerator1, product); if (denominator >= numerator1) { return FullMath.mulDivRoundingUp(numerator1, sqrtPX64, denominator); } } const adjustedDenominator = numerator1 / sqrtPX64 + amount; return FullMath.mulDivRoundingUp(numerator1, ONE, adjustedDenominator); } else { const product = multiplyIn128(amount, sqrtPX64); // Убрана invariant, предполагаем, что numerator1 > product const denominator = numerator1 - product; return FullMath.mulDivRoundingUp(numerator1, sqrtPX64, denominator); } } }, { key: "getNextSqrtPriceFromAmountBRoundingDown", value: function getNextSqrtPriceFromAmountBRoundingDown(sqrtPX64, liquidity, amount, add) { if (add) { const quotient = amount <= MaxUint128 ? (amount << BigInt(64)) / liquidity : amount * Q64 / liquidity; return sqrtPX64 + quotient; } else { const quotient = FullMath.mulDivRoundingUp(amount, Q64, liquidity); // Убрана invariant, предполагаем, что sqrtPX64 > quotient return sqrtPX64 - quotient; } } }]); }();