valiant_vortex_client 0.2.1

Rust client to interact with Valiant's on-chain Vortex program.
Documentation
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_client::rpc_filter::Memcmp;
use solana_client::rpc_filter::RpcFilterType;
use solana_program::pubkey::Pubkey;
use std::error::Error;

use crate::generated::shared::DecodedAccount;
use crate::FeeTier;

use super::utils::fetch_decoded_program_accounts;

pub const FEE_TIER_DISCRIMINATOR: &[u8] = &[56, 75, 159, 76, 142, 68, 190, 105];
pub const CYCLONE_FEE_TIER_DISCRIMINATOR: &[u8] = &[101, 81, 210, 7, 200, 238, 204, 193];

#[derive(Debug, Clone)]
pub enum FeeTierFilter {
    VortexConfig(Pubkey),
    TickSpacing(u16),
    FeeRate(u16),
}

impl From<FeeTierFilter> for RpcFilterType {
    fn from(val: FeeTierFilter) -> Self {
        match val {
            FeeTierFilter::VortexConfig(address) => {
                RpcFilterType::Memcmp(Memcmp::new_raw_bytes(8, address.to_bytes().to_vec()))
            }
            FeeTierFilter::TickSpacing(tick_spacing) => RpcFilterType::Memcmp(
                Memcmp::new_raw_bytes(40, tick_spacing.to_le_bytes().to_vec()),
            ),
            FeeTierFilter::FeeRate(fee_rate) => {
                RpcFilterType::Memcmp(Memcmp::new_raw_bytes(42, fee_rate.to_le_bytes().to_vec()))
            }
        }
    }
}

pub async fn fetch_all_fee_tier_with_filter(
    rpc: &RpcClient,
    filters: Vec<FeeTierFilter>,
) -> Result<Vec<DecodedAccount<FeeTier>>, Box<dyn Error>> {
    let mut filters: Vec<RpcFilterType> = filters.into_iter().map(|filter| filter.into()).collect();
    filters.push(RpcFilterType::Memcmp(Memcmp::new_raw_bytes(
        0,
        FEE_TIER_DISCRIMINATOR.to_vec(),
    )));
    fetch_decoded_program_accounts(rpc, filters).await
}

pub async fn fetch_cyclone_fee_tier_with_filter(
    rpc: &RpcClient,
) -> Result<Vec<DecodedAccount<FeeTier>>, Box<dyn Error>> {
    let mut filters: Vec<RpcFilterType> = vec![];
    filters.push(RpcFilterType::Memcmp(Memcmp::new_raw_bytes(
        0,
        CYCLONE_FEE_TIER_DISCRIMINATOR.to_vec(),
    )));
    fetch_decoded_program_accounts(rpc, filters).await
}