@renec-foundation/redex-sdk
Version:
Typescript SDK to interact with Orca's Whirlpool program.
104 lines (103 loc) • 5.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.decreaseLiquidityQuoteByLiquidityWithParams = exports.decreaseLiquidityQuoteByLiquidity = void 0;
const common_sdk_1 = require("@orca-so/common-sdk");
const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
const position_util_1 = require("../../utils/position-util");
const public_1 = require("../../utils/public");
/**
* Get an estimated quote on the minimum tokens receivable based on the desired withdraw liquidity value.
*
* @category Quotes
* @param liquidity - The desired liquidity to withdraw from the Whirlpool
* @param slippageTolerance - The maximum slippage allowed when calculating the minimum tokens received.
* @param position - A Position helper class to help interact with the Position account.
* @param whirlpool - A Whirlpool helper class to help interact with the Whirlpool account.
* @returns An DecreaseLiquidityQuote object detailing the tokenMin & liquidity values to use when calling decrease-liquidity-ix.
*/
function decreaseLiquidityQuoteByLiquidity(liquidity, slippageTolerance, position, whirlpool) {
const positionData = position.getData();
const whirlpoolData = whirlpool.getData();
(0, tiny_invariant_1.default)(liquidity.lte(positionData.liquidity), "Quote liquidity is more than the position liquidity.");
return decreaseLiquidityQuoteByLiquidityWithParams({
liquidity,
slippageTolerance,
tickLowerIndex: positionData.tickLowerIndex,
tickUpperIndex: positionData.tickUpperIndex,
sqrtPrice: whirlpoolData.sqrtPrice,
tickCurrentIndex: whirlpoolData.tickCurrentIndex,
});
}
exports.decreaseLiquidityQuoteByLiquidity = decreaseLiquidityQuoteByLiquidity;
/**
* Get an estimated quote on the minimum tokens receivable based on the desired withdraw liquidity value.
*
* @category Quotes
* @param param DecreaseLiquidityQuoteParam
* @returns An DecreaseLiquidityInput object detailing the tokenMin & liquidity values to use when calling decrease-liquidity-ix.
*/
function decreaseLiquidityQuoteByLiquidityWithParams(param) {
(0, tiny_invariant_1.default)(public_1.TickUtil.checkTickInBounds(param.tickLowerIndex), "tickLowerIndex is out of bounds.");
(0, tiny_invariant_1.default)(public_1.TickUtil.checkTickInBounds(param.tickUpperIndex), "tickUpperIndex is out of bounds.");
(0, tiny_invariant_1.default)(public_1.TickUtil.checkTickInBounds(param.tickCurrentIndex), "tickCurrentIndex is out of bounds.");
const positionStatus = position_util_1.PositionUtil.getPositionStatus(param.tickCurrentIndex, param.tickLowerIndex, param.tickUpperIndex);
switch (positionStatus) {
case position_util_1.PositionStatus.BelowRange:
return quotePositionBelowRange(param);
case position_util_1.PositionStatus.InRange:
return quotePositionInRange(param);
case position_util_1.PositionStatus.AboveRange:
return quotePositionAboveRange(param);
default:
throw new Error(`type ${positionStatus} is an unknown PositionStatus`);
}
}
exports.decreaseLiquidityQuoteByLiquidityWithParams = decreaseLiquidityQuoteByLiquidityWithParams;
function quotePositionBelowRange(param) {
const { tickLowerIndex, tickUpperIndex, liquidity, slippageTolerance } = param;
const sqrtPriceLowerX64 = public_1.PriceMath.tickIndexToSqrtPriceX64(tickLowerIndex);
const sqrtPriceUpperX64 = public_1.PriceMath.tickIndexToSqrtPriceX64(tickUpperIndex);
const tokenEstA = (0, position_util_1.getTokenAFromLiquidity)(liquidity, sqrtPriceLowerX64, sqrtPriceUpperX64, false);
const tokenMinA = (0, position_util_1.adjustForSlippage)(tokenEstA, slippageTolerance, false);
return {
tokenMinA,
tokenMinB: common_sdk_1.ZERO,
tokenEstA,
tokenEstB: common_sdk_1.ZERO,
liquidityAmount: liquidity,
};
}
function quotePositionInRange(param) {
const { sqrtPrice, tickLowerIndex, tickUpperIndex, liquidity, slippageTolerance } = param;
const sqrtPriceX64 = sqrtPrice;
const sqrtPriceLowerX64 = public_1.PriceMath.tickIndexToSqrtPriceX64(tickLowerIndex);
const sqrtPriceUpperX64 = public_1.PriceMath.tickIndexToSqrtPriceX64(tickUpperIndex);
const tokenEstA = (0, position_util_1.getTokenAFromLiquidity)(liquidity, sqrtPriceX64, sqrtPriceUpperX64, false);
const tokenMinA = (0, position_util_1.adjustForSlippage)(tokenEstA, slippageTolerance, false);
const tokenEstB = (0, position_util_1.getTokenBFromLiquidity)(liquidity, sqrtPriceLowerX64, sqrtPriceX64, false);
const tokenMinB = (0, position_util_1.adjustForSlippage)(tokenEstB, slippageTolerance, false);
return {
tokenMinA,
tokenMinB,
tokenEstA,
tokenEstB,
liquidityAmount: liquidity,
};
}
function quotePositionAboveRange(param) {
const { tickLowerIndex, tickUpperIndex, liquidity, slippageTolerance: slippageTolerance } = param;
const sqrtPriceLowerX64 = public_1.PriceMath.tickIndexToSqrtPriceX64(tickLowerIndex);
const sqrtPriceUpperX64 = public_1.PriceMath.tickIndexToSqrtPriceX64(tickUpperIndex);
const tokenEstB = (0, position_util_1.getTokenBFromLiquidity)(liquidity, sqrtPriceLowerX64, sqrtPriceUpperX64, false);
const tokenMinB = (0, position_util_1.adjustForSlippage)(tokenEstB, slippageTolerance, false);
return {
tokenMinA: common_sdk_1.ZERO,
tokenMinB,
tokenEstA: common_sdk_1.ZERO,
tokenEstB,
liquidityAmount: liquidity,
};
}