defituna_client/gpa/
tuna_position.rs1use 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}