defituna_client/gpa/
tuna_position.rs

1use std::error::Error;
2
3pub const TUNA_POSITION_DISCRIMINATOR: &[u8] = &[76, 197, 161, 51, 232, 15, 137, 220];
4
5use solana_client::{
6    rpc_client::RpcClient,
7    rpc_filter::{Memcmp, RpcFilterType},
8};
9use solana_program::pubkey::Pubkey;
10
11use crate::accounts::TunaPosition;
12use crate::generated::shared::DecodedAccount;
13use crate::gpa::utils::fetch_decoded_program_accounts;
14
15#[derive(Debug, Clone)]
16pub enum TunaPositionFilter {
17    Authority(Pubkey),
18    Pool(Pubkey),
19    MintA(Pubkey),
20    MintB(Pubkey),
21    Mint(Pubkey),
22}
23
24impl From<TunaPositionFilter> for RpcFilterType {
25    fn from(val: TunaPositionFilter) -> Self {
26        match val {
27            TunaPositionFilter::Authority(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(11, &address.to_bytes())),
28            TunaPositionFilter::Pool(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(43, &address.to_bytes())),
29            TunaPositionFilter::MintA(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(75, &address.to_bytes())),
30            TunaPositionFilter::MintB(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(107, &address.to_bytes())),
31            TunaPositionFilter::Mint(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(139, &address.to_bytes())),
32        }
33    }
34}
35
36pub fn fetch_all_tuna_position_with_filter(rpc: &RpcClient, filters: Vec<TunaPositionFilter>) -> Result<Vec<DecodedAccount<TunaPosition>>, Box<dyn Error>> {
37    let mut filters: Vec<RpcFilterType> = filters.into_iter().map(|filter| filter.into()).collect();
38    filters.push(RpcFilterType::Memcmp(Memcmp::new_base58_encoded(0, TUNA_POSITION_DISCRIMINATOR)));
39    fetch_decoded_program_accounts(rpc, filters)
40}