defituna_client/gpa/
market.rs

1use crate::accounts::{Market, MARKET_DISCRIMINATOR};
2use crate::gpa::utils::fetch_decoded_program_accounts;
3use crate::types::MarketMaker;
4use crate::DecodedAccount;
5use solana_client::rpc_client::RpcClient;
6use solana_client::rpc_filter::{Memcmp, RpcFilterType};
7use solana_pubkey::Pubkey;
8use std::error::Error;
9
10#[derive(Debug, Clone)]
11pub enum MarketFilter {
12    MarketMaker(MarketMaker),
13    Mint(Pubkey),
14}
15
16impl From<MarketFilter> for RpcFilterType {
17    fn from(val: MarketFilter) -> Self {
18        match val {
19            MarketFilter::MarketMaker(market_maker) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(11, &[market_maker as u8])),
20            MarketFilter::Mint(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(12, &address.to_bytes())),
21        }
22    }
23}
24
25pub fn fetch_all_market_with_filter(rpc: &RpcClient, filters: Vec<MarketFilter>) -> Result<Vec<DecodedAccount<Market>>, Box<dyn Error>> {
26    let mut filters: Vec<RpcFilterType> = filters.into_iter().map(|filter| filter.into()).collect();
27    filters.push(RpcFilterType::Memcmp(Memcmp::new_base58_encoded(0, &MARKET_DISCRIMINATOR)));
28    fetch_decoded_program_accounts(rpc, filters)
29}