UNPKG

@alcorexchange/alcor-swap-sdk

Version:

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

83 lines (79 loc) 3.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.maxLiquidityForAmounts = maxLiquidityForAmounts; var _internalConstants = require("../internalConstants"); /** * Returns an imprecise maximum amount of liquidity received for a given amount of token 0. * This function is available to accommodate LiquidityAmounts#getLiquidityForAmountA in the v3 periphery, * which could be more precise by at least 32 bits by dividing by Q64 instead of Q64 in the intermediate step, * and shifting the subtracted ratio left by 32 bits. This imprecise calculation will likely be replaced in a future * v3 router contract. * @param sqrtRatioLX64 The price at the lower boundary * @param sqrtRatioUX64 The price at the upper boundary * @param amountA The token0 amount * @returns liquidity for amountA, imprecise */ function maxLiquidityForAmountAImprecise(sqrtRatioLX64, sqrtRatioUX64, amountA) { if (sqrtRatioLX64 > sqrtRatioUX64) { [sqrtRatioLX64, sqrtRatioUX64] = [sqrtRatioUX64, sqrtRatioLX64]; } const intermediate = sqrtRatioLX64 * sqrtRatioUX64 / _internalConstants.Q64; return BigInt(amountA) * intermediate / (sqrtRatioUX64 - sqrtRatioLX64); } /** * Returns a precise maximum amount of liquidity received for a given amount of token 0 by dividing by Q64 instead of Q64 in the intermediate step, * and shifting the subtracted ratio left by 32 bits. * @param sqrtRatioLX64 The price at the lower boundary * @param sqrtRatioUX64 The price at the upper boundary * @param amountA The token0 amount * @returns liquidity for amountA, precise */ function maxLiquidityForAmountAPrecise(sqrtRatioLX64, sqrtRatioUX64, amountA) { if (sqrtRatioLX64 > sqrtRatioUX64) { [sqrtRatioLX64, sqrtRatioUX64] = [sqrtRatioUX64, sqrtRatioLX64]; } const numerator = BigInt(amountA) * sqrtRatioLX64 * sqrtRatioUX64; const denominator = _internalConstants.Q64 * (sqrtRatioUX64 - sqrtRatioLX64); return numerator / denominator; } /** * Computes the maximum amount of liquidity received for a given amount of token1 * @param sqrtRatioLX64 The price at the lower tick boundary * @param sqrtRatioUX64 The price at the upper tick boundary * @param amountB The token1 amount * @returns liquidity for amountB */ function maxLiquidityForAmountB(sqrtRatioLX64, sqrtRatioUX64, amountB) { if (sqrtRatioLX64 > sqrtRatioUX64) { [sqrtRatioLX64, sqrtRatioUX64] = [sqrtRatioUX64, sqrtRatioLX64]; } return BigInt(amountB) * _internalConstants.Q64 / (sqrtRatioUX64 - sqrtRatioLX64); } /** * Computes the maximum amount of liquidity received for a given amount of token0, token1, * and the prices at the tick boundaries. * @param sqrtRatioCurrentX64 the current price * @param sqrtRatioLX64 price at lower boundary * @param sqrtRatioUX64 price at upper boundary * @param amountA token0 amount * @param amountB token1 amount * @param useFullPrecision if false, liquidity will be maximized according to what the router can calculate, * not what core can theoretically support */ function maxLiquidityForAmounts(sqrtRatioCurrentX64, sqrtRatioLX64, sqrtRatioUX64, amountA, amountB, useFullPrecision) { if (sqrtRatioLX64 > sqrtRatioUX64) { [sqrtRatioLX64, sqrtRatioUX64] = [sqrtRatioUX64, sqrtRatioLX64]; } const maxLiquidityForAmountA = useFullPrecision ? maxLiquidityForAmountAPrecise : maxLiquidityForAmountAImprecise; if (sqrtRatioCurrentX64 <= sqrtRatioLX64) { return maxLiquidityForAmountA(sqrtRatioLX64, sqrtRatioUX64, amountA); } else if (sqrtRatioCurrentX64 < sqrtRatioUX64) { const liquidityA = maxLiquidityForAmountA(sqrtRatioCurrentX64, sqrtRatioUX64, amountA); const liquidityB = maxLiquidityForAmountB(sqrtRatioLX64, sqrtRatioCurrentX64, amountB); return liquidityA < liquidityB ? liquidityA : liquidityB; } else { return maxLiquidityForAmountB(sqrtRatioLX64, sqrtRatioUX64, amountB); } }