defituna_client/gpa/
market.rs

1use crate::accounts::Market;
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_program::pubkey::Pubkey;
8use std::error::Error;
9
10pub const MARKET_DISCRIMINATOR: &[u8] = &[219, 190, 213, 55, 0, 227, 198, 154];
11
12#[derive(Debug, Clone)]
13pub enum MarketFilter {
14    MarketMaker(MarketMaker),
15    Mint(Pubkey),
16}
17
18impl From<MarketFilter> for RpcFilterType {
19    fn from(val: MarketFilter) -> Self {
20        match val {
21            MarketFilter::MarketMaker(market_maker) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(11, &[market_maker as u8])),
22            MarketFilter::Mint(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(12, &address.to_bytes())),
23        }
24    }
25}
26
27pub fn fetch_all_market_with_filter(rpc: &RpcClient, filters: Vec<MarketFilter>) -> Result<Vec<DecodedAccount<Market>>, Box<dyn Error>> {
28    let mut filters: Vec<RpcFilterType> = filters.into_iter().map(|filter| filter.into()).collect();
29    filters.push(RpcFilterType::Memcmp(Memcmp::new_base58_encoded(0, MARKET_DISCRIMINATOR)));
30    fetch_decoded_program_accounts(rpc, filters)
31}