Module orca_whirlpool.internal.quote.increase_liquidity
Expand source code
# https://github.com/orca-so/whirlpools/blob/main/sdk/src/quotes/public/increase-liquidity-quote.ts
import dataclasses
from solders.pubkey import Pubkey
from ..types.percentage import Percentage
from ..invariant import invariant
from ..utils.tick_util import TickUtil
from ..utils.liquidity_math import LiquidityMath
from ..utils.position_util import PositionUtil, PositionStatus
from ..utils.price_math import PriceMath
@dataclasses.dataclass(frozen=True)
class IncreaseLiquidityQuoteParams:
input_token_amount: int
input_token_mint: Pubkey
token_mint_a: Pubkey
token_mint_b: Pubkey
tick_current_index: int
sqrt_price: int
tick_lower_index: int
tick_upper_index: int
slippage_tolerance: Percentage
@dataclasses.dataclass(frozen=True)
class IncreaseLiquidityQuote:
liquidity: int
token_est_a: int
token_est_b: int
token_max_a: int
token_max_b: int
def increase_liquidity_quote_by_input_token_with_params(
params: IncreaseLiquidityQuoteParams
) -> IncreaseLiquidityQuote:
invariant(TickUtil.is_tick_index_in_bounds(params.tick_lower_index), "tick_lower_index is out of bounds")
invariant(TickUtil.is_tick_index_in_bounds(params.tick_upper_index), "tick_upper_index is out of bounds")
invariant(TickUtil.is_tick_index_in_bounds(params.tick_current_index), "tick_current_index is out of bounds")
invariant(params.tick_lower_index < params.tick_upper_index, "tick_lower_index < tick_upper_index")
invariant(
params.input_token_mint in [params.token_mint_a, params.token_mint_b],
"input_token_mint does not match either token_mint_a or token_mint_b"
)
input_token_is_a = params.input_token_mint == params.token_mint_a
input_token_is_b = not input_token_is_a
position_status = PositionUtil.get_position_status(
params.tick_current_index,
params.tick_lower_index,
params.tick_upper_index
)
if position_status == PositionStatus.PriceIsAboveRange and input_token_is_a:
return IncreaseLiquidityQuote(0, 0, 0, 0, 0)
if position_status == PositionStatus.PriceIsBelowRange and input_token_is_b:
return IncreaseLiquidityQuote(0, 0, 0, 0, 0)
lower = PriceMath.tick_index_to_sqrt_price_x64(params.tick_lower_index)
upper = PriceMath.tick_index_to_sqrt_price_x64(params.tick_upper_index)
current = min(max(params.sqrt_price, lower), upper) # bounded
liquidity = 0
if input_token_is_a:
liquidity = LiquidityMath.get_liquidity_from_token_a(current, upper, params.input_token_amount)
if input_token_is_b:
liquidity = LiquidityMath.get_liquidity_from_token_b(lower, current, params.input_token_amount)
estimate_amount = LiquidityMath.get_token_amounts_from_liquidity(
liquidity,
current,
lower,
upper,
True
)
return IncreaseLiquidityQuote(
liquidity=liquidity,
token_est_a=estimate_amount.token_a,
token_est_b=estimate_amount.token_b,
token_max_a=params.slippage_tolerance.adjust_add(estimate_amount.token_a),
token_max_b=params.slippage_tolerance.adjust_add(estimate_amount.token_b),
)
Functions
def increase_liquidity_quote_by_input_token_with_params(params: IncreaseLiquidityQuoteParams) ‑> IncreaseLiquidityQuote
-
Expand source code
def increase_liquidity_quote_by_input_token_with_params( params: IncreaseLiquidityQuoteParams ) -> IncreaseLiquidityQuote: invariant(TickUtil.is_tick_index_in_bounds(params.tick_lower_index), "tick_lower_index is out of bounds") invariant(TickUtil.is_tick_index_in_bounds(params.tick_upper_index), "tick_upper_index is out of bounds") invariant(TickUtil.is_tick_index_in_bounds(params.tick_current_index), "tick_current_index is out of bounds") invariant(params.tick_lower_index < params.tick_upper_index, "tick_lower_index < tick_upper_index") invariant( params.input_token_mint in [params.token_mint_a, params.token_mint_b], "input_token_mint does not match either token_mint_a or token_mint_b" ) input_token_is_a = params.input_token_mint == params.token_mint_a input_token_is_b = not input_token_is_a position_status = PositionUtil.get_position_status( params.tick_current_index, params.tick_lower_index, params.tick_upper_index ) if position_status == PositionStatus.PriceIsAboveRange and input_token_is_a: return IncreaseLiquidityQuote(0, 0, 0, 0, 0) if position_status == PositionStatus.PriceIsBelowRange and input_token_is_b: return IncreaseLiquidityQuote(0, 0, 0, 0, 0) lower = PriceMath.tick_index_to_sqrt_price_x64(params.tick_lower_index) upper = PriceMath.tick_index_to_sqrt_price_x64(params.tick_upper_index) current = min(max(params.sqrt_price, lower), upper) # bounded liquidity = 0 if input_token_is_a: liquidity = LiquidityMath.get_liquidity_from_token_a(current, upper, params.input_token_amount) if input_token_is_b: liquidity = LiquidityMath.get_liquidity_from_token_b(lower, current, params.input_token_amount) estimate_amount = LiquidityMath.get_token_amounts_from_liquidity( liquidity, current, lower, upper, True ) return IncreaseLiquidityQuote( liquidity=liquidity, token_est_a=estimate_amount.token_a, token_est_b=estimate_amount.token_b, token_max_a=params.slippage_tolerance.adjust_add(estimate_amount.token_a), token_max_b=params.slippage_tolerance.adjust_add(estimate_amount.token_b), )
Classes
class IncreaseLiquidityQuote (liquidity: int, token_est_a: int, token_est_b: int, token_max_a: int, token_max_b: int)
-
IncreaseLiquidityQuote(liquidity: int, token_est_a: int, token_est_b: int, token_max_a: int, token_max_b: int)
Expand source code
@dataclasses.dataclass(frozen=True) class IncreaseLiquidityQuote: liquidity: int token_est_a: int token_est_b: int token_max_a: int token_max_b: int
Class variables
var liquidity : int
var token_est_a : int
var token_est_b : int
var token_max_a : int
var token_max_b : int
class IncreaseLiquidityQuoteParams (input_token_amount: int, input_token_mint: solders.pubkey.Pubkey, token_mint_a: solders.pubkey.Pubkey, token_mint_b: solders.pubkey.Pubkey, tick_current_index: int, sqrt_price: int, tick_lower_index: int, tick_upper_index: int, slippage_tolerance: Percentage)
-
IncreaseLiquidityQuoteParams(input_token_amount: int, input_token_mint: solders.pubkey.Pubkey, token_mint_a: solders.pubkey.Pubkey, token_mint_b: solders.pubkey.Pubkey, tick_current_index: int, sqrt_price: int, tick_lower_index: int, tick_upper_index: int, slippage_tolerance: orca_whirlpool.internal.types.percentage.Percentage)
Expand source code
@dataclasses.dataclass(frozen=True) class IncreaseLiquidityQuoteParams: input_token_amount: int input_token_mint: Pubkey token_mint_a: Pubkey token_mint_b: Pubkey tick_current_index: int sqrt_price: int tick_lower_index: int tick_upper_index: int slippage_tolerance: Percentage
Class variables
var input_token_amount : int
var input_token_mint : solders.pubkey.Pubkey
var slippage_tolerance : Percentage
var sqrt_price : int
var tick_current_index : int
var tick_lower_index : int
var tick_upper_index : int
var token_mint_a : solders.pubkey.Pubkey
var token_mint_b : solders.pubkey.Pubkey