1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use borsh::BorshDeserialize;
use tabled::Tabled;

use crate::contract::state::clmmpools::Clmmpool;
use crate::math::{MAX_TICK, MIN_TICK};

#[derive(BorshDeserialize, Tabled, Copy, Clone)]
pub struct Tick {
    //
    pub is_initialized: bool,

    pub index: i32,

    pub sqrt_price: u128,

    pub liquidity_net: i128,
    // 16
    pub liquidity_gross: u128, // 16

    // Q64.64
    pub fee_growth_outside_a: u128,
    // 16
    // Q64.64
    pub fee_growth_outside_b: u128, // 16

    pub reward_growth_outside: TickRewarder,
}
#[derive(Copy, Clone, BorshDeserialize, Default, Debug, Eq, PartialEq)]
pub struct TickRewarder([u128; 3]);

impl std::fmt::Display for TickRewarder {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "reserved")
    }
}

impl Tick {
    pub const LEN: usize = 1 + 4 + 16 + 16 + 16 + 16 + 16 + Clmmpool::REWARD_NUM * 16;

    #[inline]
    pub fn min(tick_spacing: u16) -> i32 {
        MIN_TICK + MIN_TICK.abs() % tick_spacing as i32
    }

    #[inline]
    pub fn max(tick_spacing: u16) -> i32 {
        MAX_TICK - MAX_TICK % tick_spacing as i32
    }

    pub fn update(&mut self, tick: &Tick) {
        self.is_initialized = tick.is_initialized;
        self.index = tick.index;
        self.sqrt_price = tick.sqrt_price;
        self.liquidity_net = tick.liquidity_net;
        self.liquidity_gross = tick.liquidity_gross;
        self.fee_growth_outside_a = tick.fee_growth_outside_a;
        self.fee_growth_outside_b = tick.fee_growth_outside_b;
    }
}