Module orca_whirlpool.internal.utils.tick_util

Expand source code
import math
from typing import Tuple

from ..constants import TICK_ARRAY_SIZE, MIN_TICK_INDEX, MAX_TICK_INDEX
from ..invariant import invariant


def div_floor(a: int, b: int) -> int:
    return math.floor(a / b)


class TickUtil:
    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#getStartTickIndex
    # https://github.com/orca-so/whirlpools/blob/main/sdk/src/utils/public/tick-utils.ts#L33
    @staticmethod
    def get_start_tick_index(tick_index: int, tick_spacing: int, offset: int = 0) -> int:
        ticks_in_array = TICK_ARRAY_SIZE * tick_spacing
        real_index = div_floor(tick_index, ticks_in_array)
        start_tick_index = (real_index + offset) * ticks_in_array

        invariant(MIN_TICK_INDEX < start_tick_index + ticks_in_array, "too small start_tick_index")
        invariant(start_tick_index <= MAX_TICK_INDEX, "too large start_tick_index")
        return start_tick_index

    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#getInitializableTickIndex
    # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/tick-utils.ts#L49
    @staticmethod
    def get_initializable_tick_index(tick_index: int, tick_spacing: int) -> int:
        # Note: javascript: -5 % 3 = -2, python: -5 % 3 = 1
        initializable_tick_index_abs = abs(tick_index) - abs(tick_index) % tick_spacing
        if tick_index >= 0:
            return initializable_tick_index_abs
        else:
            return -1 * initializable_tick_index_abs

    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#isTickInitializable
    # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/tick-utils.ts#L142
    @staticmethod
    def is_initializable_tick_index(tick_index: int, tick_spacing: int) -> bool:
        return tick_index % tick_spacing == 0

    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#checkTickInBounds
    # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/tick-utils.ts#L138
    @staticmethod
    def is_tick_index_in_bounds(tick_index: int) -> bool:
        return MIN_TICK_INDEX <= tick_index <= MAX_TICK_INDEX

    @staticmethod
    def get_full_range_tick_index(tick_spacing: int) -> Tuple[int, int]:
        lower = math.ceil(MIN_TICK_INDEX / tick_spacing) * tick_spacing
        upper = math.floor(MAX_TICK_INDEX / tick_spacing) * tick_spacing
        return lower, upper

    @staticmethod
    def is_full_range(tick_spacing: int, tick_lower_index: int, tick_upper_index: int) -> bool:
        full_lower, full_upper = TickUtil.get_full_range_tick_index(tick_spacing)
        return tick_lower_index == full_lower and tick_upper_index == full_upper

Functions

def div_floor(a: int, b: int) ‑> int
Expand source code
def div_floor(a: int, b: int) -> int:
    return math.floor(a / b)

Classes

class TickUtil
Expand source code
class TickUtil:
    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#getStartTickIndex
    # https://github.com/orca-so/whirlpools/blob/main/sdk/src/utils/public/tick-utils.ts#L33
    @staticmethod
    def get_start_tick_index(tick_index: int, tick_spacing: int, offset: int = 0) -> int:
        ticks_in_array = TICK_ARRAY_SIZE * tick_spacing
        real_index = div_floor(tick_index, ticks_in_array)
        start_tick_index = (real_index + offset) * ticks_in_array

        invariant(MIN_TICK_INDEX < start_tick_index + ticks_in_array, "too small start_tick_index")
        invariant(start_tick_index <= MAX_TICK_INDEX, "too large start_tick_index")
        return start_tick_index

    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#getInitializableTickIndex
    # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/tick-utils.ts#L49
    @staticmethod
    def get_initializable_tick_index(tick_index: int, tick_spacing: int) -> int:
        # Note: javascript: -5 % 3 = -2, python: -5 % 3 = 1
        initializable_tick_index_abs = abs(tick_index) - abs(tick_index) % tick_spacing
        if tick_index >= 0:
            return initializable_tick_index_abs
        else:
            return -1 * initializable_tick_index_abs

    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#isTickInitializable
    # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/tick-utils.ts#L142
    @staticmethod
    def is_initializable_tick_index(tick_index: int, tick_spacing: int) -> bool:
        return tick_index % tick_spacing == 0

    # https://orca-so.github.io/whirlpools/classes/TickUtil.html#checkTickInBounds
    # https://github.com/orca-so/whirlpools/blob/7b9ec35/sdk/src/utils/public/tick-utils.ts#L138
    @staticmethod
    def is_tick_index_in_bounds(tick_index: int) -> bool:
        return MIN_TICK_INDEX <= tick_index <= MAX_TICK_INDEX

    @staticmethod
    def get_full_range_tick_index(tick_spacing: int) -> Tuple[int, int]:
        lower = math.ceil(MIN_TICK_INDEX / tick_spacing) * tick_spacing
        upper = math.floor(MAX_TICK_INDEX / tick_spacing) * tick_spacing
        return lower, upper

    @staticmethod
    def is_full_range(tick_spacing: int, tick_lower_index: int, tick_upper_index: int) -> bool:
        full_lower, full_upper = TickUtil.get_full_range_tick_index(tick_spacing)
        return tick_lower_index == full_lower and tick_upper_index == full_upper

Static methods

def get_full_range_tick_index(tick_spacing: int) ‑> Tuple[int, int]
Expand source code
@staticmethod
def get_full_range_tick_index(tick_spacing: int) -> Tuple[int, int]:
    lower = math.ceil(MIN_TICK_INDEX / tick_spacing) * tick_spacing
    upper = math.floor(MAX_TICK_INDEX / tick_spacing) * tick_spacing
    return lower, upper
def get_initializable_tick_index(tick_index: int, tick_spacing: int) ‑> int
Expand source code
@staticmethod
def get_initializable_tick_index(tick_index: int, tick_spacing: int) -> int:
    # Note: javascript: -5 % 3 = -2, python: -5 % 3 = 1
    initializable_tick_index_abs = abs(tick_index) - abs(tick_index) % tick_spacing
    if tick_index >= 0:
        return initializable_tick_index_abs
    else:
        return -1 * initializable_tick_index_abs
def get_start_tick_index(tick_index: int, tick_spacing: int, offset: int = 0) ‑> int
Expand source code
@staticmethod
def get_start_tick_index(tick_index: int, tick_spacing: int, offset: int = 0) -> int:
    ticks_in_array = TICK_ARRAY_SIZE * tick_spacing
    real_index = div_floor(tick_index, ticks_in_array)
    start_tick_index = (real_index + offset) * ticks_in_array

    invariant(MIN_TICK_INDEX < start_tick_index + ticks_in_array, "too small start_tick_index")
    invariant(start_tick_index <= MAX_TICK_INDEX, "too large start_tick_index")
    return start_tick_index
def is_full_range(tick_spacing: int, tick_lower_index: int, tick_upper_index: int) ‑> bool
Expand source code
@staticmethod
def is_full_range(tick_spacing: int, tick_lower_index: int, tick_upper_index: int) -> bool:
    full_lower, full_upper = TickUtil.get_full_range_tick_index(tick_spacing)
    return tick_lower_index == full_lower and tick_upper_index == full_upper
def is_initializable_tick_index(tick_index: int, tick_spacing: int) ‑> bool
Expand source code
@staticmethod
def is_initializable_tick_index(tick_index: int, tick_spacing: int) -> bool:
    return tick_index % tick_spacing == 0
def is_tick_index_in_bounds(tick_index: int) ‑> bool
Expand source code
@staticmethod
def is_tick_index_in_bounds(tick_index: int) -> bool:
    return MIN_TICK_INDEX <= tick_index <= MAX_TICK_INDEX