clmm-common 0.1.39

Blockchain, Clmm for Solana
Documentation
use crate::contract::state::tick::Tick;
use crate::contract::state::{Clmmpool, TickArray};
use borsh::BorshDeserialize;
use solana_client::rpc_client::RpcClient;
use solana_program::pubkey::Pubkey;
use std::ops::{Div, Sub};

pub fn get_tick_info(rpc_client: &RpcClient, tick_index: i32, pool: &Pubkey) -> Tick {
    let clmmpool_info: Clmmpool = Clmmpool::get_info(rpc_client, pool);

    let array_index = TickArray::array_index(tick_index, clmmpool_info.tick_spacing).unwrap();

    println!("array_index: {:?}", array_index);

    let tick_array_address = TickArray::find_address(pool, array_index);
    println!("tick array address: {:?}", tick_array_address);
    let data = rpc_client.get_account_data(&tick_array_address).unwrap();

    let array_spacing = clmmpool_info.tick_spacing as usize * TickArray::CAP;
    let start_tick_index =
        Tick::min(clmmpool_info.tick_spacing) + (array_index as usize * array_spacing) as i32;
    let tick_offset = tick_index
        .sub(start_tick_index)
        .div(clmmpool_info.tick_spacing as i32) as usize;
    Tick::try_from_slice(&data[tick_offset * Tick::LEN + 44..(tick_offset + 1) * Tick::LEN + 44])
        .unwrap()
}