use borsh::BorshDeserialize;
use solana_client::rpc_client::RpcClient;
use solana_sdk::pubkey::Pubkey;
use tabled::Tabled;
use crate::program::PROGRAM_ID;
#[derive(BorshDeserialize, Tabled)]
pub struct Clmmpool {
pub clmm_config: Pubkey,
pub token_a: Pubkey,
pub token_b: Pubkey,
pub token_a_vault: Pubkey,
pub token_b_vault: Pubkey,
pub tick_spacing: u16,
pub tick_spacing_seed: u16,
pub fee_rate: u16,
pub protocol_fee_rate: u16,
pub liquidity: u128,
pub current_sqrt_price: u128,
pub current_tick_index: i32,
pub fee_growth_global_a: u128,
pub fee_growth_global_b: u128,
pub fee_protocol_token_a: u64,
pub fee_protocol_token_b: u64,
pub bump: u8,
pub reward_infos: Rewarders,
pub reward_last_updated_time: u64, }
#[derive(Copy, Clone, BorshDeserialize, Default, Debug, PartialEq)]
pub struct Rewarder {
pub mint_wrapper: Pubkey,
pub minter: Pubkey,
pub mint: Pubkey,
pub authority: Pubkey,
pub emissions_per_second: u128,
pub growth_global: u128,
}
impl Rewarder {
pub const LEN: usize = 32 + 32 + 32 + 32 + 16 + 16;
}
#[derive(Copy, Clone, BorshDeserialize, Default, Debug, PartialEq)]
pub struct Rewarders([Rewarder; 3]);
impl std::fmt::Display for Rewarders {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "reserved")
}
}
impl Clmmpool {
pub const REWARD_NUM: usize = 3;
pub const LEN: usize =
5 * 32 + 4 * 2 + 2 * 16 + 4 + 2 * 16 + 2 * 8 + 1 + Clmmpool::REWARD_NUM * Rewarder::LEN + 8;
pub fn get_info(rpc_client: &RpcClient, pubkey: &Pubkey) -> Self {
let data_slice = &rpc_client.get_account_data(pubkey).unwrap()[8..];
Clmmpool::try_from_slice(data_slice).unwrap()
}
pub fn get_tick_map_address(pool: &Pubkey) -> Pubkey {
let (expect_address, _) =
Pubkey::find_program_address(&[b"tick_array_map", pool.as_ref()], &PROGRAM_ID);
expect_address
}
}