Module orca_whirlpool.internal.utils.pool_util
Expand source code
import dataclasses
from typing import Tuple, List
from solders.pubkey import Pubkey
from ..accounts.types import TickArray, Whirlpool
from ..types.percentage import Percentage
from ..constants import FEE_RATE_MUL_VALUE, PROTOCOL_FEE_RATE_MUL_VALUE, DEFAULT_PUBKEY, MIN_TICK_INDEX
from ..anchor.types import WhirlpoolRewardInfo
from ..invariant import invariant
@dataclasses.dataclass(frozen=True)
class LiquidityDistribution:
tick_lower_index: int
tick_upper_index: int
liquidity: int
class PoolUtil:
# https://orca-so.github.io/whirlpools/classes/PoolUtil.html#isRewardInitialized
# https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/pool-utils.ts#L16
@staticmethod
def is_reward_initialized(reward_info: WhirlpoolRewardInfo) -> bool:
if reward_info.mint == DEFAULT_PUBKEY or reward_info.vault == DEFAULT_PUBKEY:
return False
return True
# https://orca-so.github.io/whirlpools/classes/PoolUtil.html#getFeeRate
# https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/pool-utils.ts#L38
@staticmethod
def get_fee_rate(fee_rate: int) -> Percentage:
return Percentage.from_fraction(fee_rate, FEE_RATE_MUL_VALUE)
# https://orca-so.github.io/whirlpools/classes/PoolUtil.html#getProtocolFeeRate
# https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/pool-utils.ts#L48
@staticmethod
def get_protocol_fee_rate(protocol_fee_rate: int) -> Percentage:
return Percentage.from_fraction(protocol_fee_rate, PROTOCOL_FEE_RATE_MUL_VALUE)
@staticmethod
def order_mints(mint_x: Pubkey, mint_y: Pubkey) -> Tuple[Pubkey, Pubkey]:
for x, y in zip(bytes(mint_x), bytes(mint_y)):
if x < y:
return mint_x, mint_y
elif x > y:
return mint_y, mint_x
invariant(False, "mint_x and mint_y must be different")
@staticmethod
def get_liquidity_distribution(whirlpool: Whirlpool, tick_arrays: List[TickArray]) -> List[LiquidityDistribution]:
tick_spacing = whirlpool.tick_spacing
sorted_tick_arrays = sorted(tick_arrays, key=lambda ta: ta.start_tick_index)
distribution = []
current_lower_tick_index = MIN_TICK_INDEX
current_liquidity = 0
for ta in sorted_tick_arrays:
for i, tick in enumerate(ta.ticks):
if tick.liquidity_net == 0:
continue
if current_liquidity > 0:
tick_index = ta.start_tick_index + i * tick_spacing
distribution.append(LiquidityDistribution(
tick_lower_index=current_lower_tick_index,
tick_upper_index=tick_index,
liquidity=current_liquidity,
))
current_lower_tick_index = tick_index
current_liquidity += tick.liquidity_net
return distribution
Classes
class LiquidityDistribution (tick_lower_index: int, tick_upper_index: int, liquidity: int)
-
LiquidityDistribution(tick_lower_index: int, tick_upper_index: int, liquidity: int)
Expand source code
@dataclasses.dataclass(frozen=True) class LiquidityDistribution: tick_lower_index: int tick_upper_index: int liquidity: int
Class variables
var liquidity : int
var tick_lower_index : int
var tick_upper_index : int
class PoolUtil
-
Expand source code
class PoolUtil: # https://orca-so.github.io/whirlpools/classes/PoolUtil.html#isRewardInitialized # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/pool-utils.ts#L16 @staticmethod def is_reward_initialized(reward_info: WhirlpoolRewardInfo) -> bool: if reward_info.mint == DEFAULT_PUBKEY or reward_info.vault == DEFAULT_PUBKEY: return False return True # https://orca-so.github.io/whirlpools/classes/PoolUtil.html#getFeeRate # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/pool-utils.ts#L38 @staticmethod def get_fee_rate(fee_rate: int) -> Percentage: return Percentage.from_fraction(fee_rate, FEE_RATE_MUL_VALUE) # https://orca-so.github.io/whirlpools/classes/PoolUtil.html#getProtocolFeeRate # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/pool-utils.ts#L48 @staticmethod def get_protocol_fee_rate(protocol_fee_rate: int) -> Percentage: return Percentage.from_fraction(protocol_fee_rate, PROTOCOL_FEE_RATE_MUL_VALUE) @staticmethod def order_mints(mint_x: Pubkey, mint_y: Pubkey) -> Tuple[Pubkey, Pubkey]: for x, y in zip(bytes(mint_x), bytes(mint_y)): if x < y: return mint_x, mint_y elif x > y: return mint_y, mint_x invariant(False, "mint_x and mint_y must be different") @staticmethod def get_liquidity_distribution(whirlpool: Whirlpool, tick_arrays: List[TickArray]) -> List[LiquidityDistribution]: tick_spacing = whirlpool.tick_spacing sorted_tick_arrays = sorted(tick_arrays, key=lambda ta: ta.start_tick_index) distribution = [] current_lower_tick_index = MIN_TICK_INDEX current_liquidity = 0 for ta in sorted_tick_arrays: for i, tick in enumerate(ta.ticks): if tick.liquidity_net == 0: continue if current_liquidity > 0: tick_index = ta.start_tick_index + i * tick_spacing distribution.append(LiquidityDistribution( tick_lower_index=current_lower_tick_index, tick_upper_index=tick_index, liquidity=current_liquidity, )) current_lower_tick_index = tick_index current_liquidity += tick.liquidity_net return distribution
Static methods
def get_fee_rate(fee_rate: int) ‑> Percentage
-
Expand source code
@staticmethod def get_fee_rate(fee_rate: int) -> Percentage: return Percentage.from_fraction(fee_rate, FEE_RATE_MUL_VALUE)
def get_liquidity_distribution(whirlpool: Whirlpool, tick_arrays: List[TickArray]) ‑> List[LiquidityDistribution]
-
Expand source code
@staticmethod def get_liquidity_distribution(whirlpool: Whirlpool, tick_arrays: List[TickArray]) -> List[LiquidityDistribution]: tick_spacing = whirlpool.tick_spacing sorted_tick_arrays = sorted(tick_arrays, key=lambda ta: ta.start_tick_index) distribution = [] current_lower_tick_index = MIN_TICK_INDEX current_liquidity = 0 for ta in sorted_tick_arrays: for i, tick in enumerate(ta.ticks): if tick.liquidity_net == 0: continue if current_liquidity > 0: tick_index = ta.start_tick_index + i * tick_spacing distribution.append(LiquidityDistribution( tick_lower_index=current_lower_tick_index, tick_upper_index=tick_index, liquidity=current_liquidity, )) current_lower_tick_index = tick_index current_liquidity += tick.liquidity_net return distribution
def get_protocol_fee_rate(protocol_fee_rate: int) ‑> Percentage
-
Expand source code
@staticmethod def get_protocol_fee_rate(protocol_fee_rate: int) -> Percentage: return Percentage.from_fraction(protocol_fee_rate, PROTOCOL_FEE_RATE_MUL_VALUE)
def is_reward_initialized(reward_info: WhirlpoolRewardInfo) ‑> bool
-
Expand source code
@staticmethod def is_reward_initialized(reward_info: WhirlpoolRewardInfo) -> bool: if reward_info.mint == DEFAULT_PUBKEY or reward_info.vault == DEFAULT_PUBKEY: return False return True
def order_mints(mint_x: solders.pubkey.Pubkey, mint_y: solders.pubkey.Pubkey) ‑> Tuple[solders.pubkey.Pubkey, solders.pubkey.Pubkey]
-
Expand source code
@staticmethod def order_mints(mint_x: Pubkey, mint_y: Pubkey) -> Tuple[Pubkey, Pubkey]: for x, y in zip(bytes(mint_x), bytes(mint_y)): if x < y: return mint_x, mint_y elif x > y: return mint_y, mint_x invariant(False, "mint_x and mint_y must be different")