2022-07-16 05:37:15 -07:00
|
|
|
use anchor_client::{ClientError, Program};
|
2022-07-25 07:07:53 -07:00
|
|
|
use anchor_lang::Discriminator;
|
2022-07-16 05:37:15 -07:00
|
|
|
|
2022-07-25 07:07:53 -07:00
|
|
|
use mango_v4::state::{Bank, MangoAccount, MangoAccountValue, MintInfo, PerpMarket, Serum3Market};
|
2022-07-16 05:37:15 -07:00
|
|
|
|
2022-07-25 07:07:53 -07:00
|
|
|
use solana_account_decoder::UiAccountEncoding;
|
|
|
|
use solana_client::rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig};
|
2022-12-10 02:16:47 -08:00
|
|
|
use solana_client::rpc_filter::{Memcmp, RpcFilterType};
|
2022-07-16 05:37:15 -07:00
|
|
|
use solana_sdk::pubkey::Pubkey;
|
|
|
|
|
|
|
|
pub fn fetch_mango_accounts(
|
|
|
|
program: &Program,
|
|
|
|
group: Pubkey,
|
|
|
|
owner: Pubkey,
|
2022-07-25 07:07:53 -07:00
|
|
|
) -> Result<Vec<(Pubkey, MangoAccountValue)>, ClientError> {
|
|
|
|
let config = RpcProgramAccountsConfig {
|
|
|
|
filters: Some(vec![
|
2022-12-10 02:16:47 -08:00
|
|
|
RpcFilterType::Memcmp(Memcmp::new_base58_encoded(
|
|
|
|
0,
|
|
|
|
&MangoAccount::discriminator(),
|
|
|
|
)),
|
|
|
|
RpcFilterType::Memcmp(Memcmp::new_base58_encoded(8, &group.to_bytes())),
|
|
|
|
RpcFilterType::Memcmp(Memcmp::new_base58_encoded(40, &owner.to_bytes())),
|
2022-07-25 07:07:53 -07:00
|
|
|
]),
|
|
|
|
account_config: RpcAccountInfoConfig {
|
|
|
|
encoding: Some(UiAccountEncoding::Base64),
|
|
|
|
..RpcAccountInfoConfig::default()
|
|
|
|
},
|
|
|
|
..RpcProgramAccountsConfig::default()
|
|
|
|
};
|
|
|
|
program
|
|
|
|
.rpc()
|
|
|
|
.get_program_accounts_with_config(&program.id(), config)?
|
|
|
|
.into_iter()
|
|
|
|
.map(|(key, account)| Ok((key, MangoAccountValue::from_bytes(&account.data[8..])?)))
|
|
|
|
.collect::<Result<Vec<_>, _>>()
|
2022-07-16 05:37:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn fetch_banks(program: &Program, group: Pubkey) -> Result<Vec<(Pubkey, Bank)>, ClientError> {
|
2022-12-10 02:16:47 -08:00
|
|
|
program.accounts::<Bank>(vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded(
|
|
|
|
8,
|
|
|
|
&group.to_bytes(),
|
|
|
|
))])
|
2022-07-16 05:37:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn fetch_mint_infos(
|
|
|
|
program: &Program,
|
|
|
|
group: Pubkey,
|
|
|
|
) -> Result<Vec<(Pubkey, MintInfo)>, ClientError> {
|
2022-12-10 02:16:47 -08:00
|
|
|
program.accounts::<MintInfo>(vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded(
|
|
|
|
8,
|
|
|
|
&group.to_bytes(),
|
|
|
|
))])
|
2022-07-16 05:37:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn fetch_serum3_markets(
|
|
|
|
program: &Program,
|
|
|
|
group: Pubkey,
|
|
|
|
) -> Result<Vec<(Pubkey, Serum3Market)>, ClientError> {
|
2022-12-10 02:16:47 -08:00
|
|
|
program.accounts::<Serum3Market>(vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded(
|
|
|
|
8,
|
|
|
|
&group.to_bytes(),
|
|
|
|
))])
|
2022-07-16 05:37:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn fetch_perp_markets(
|
|
|
|
program: &Program,
|
|
|
|
group: Pubkey,
|
|
|
|
) -> Result<Vec<(Pubkey, PerpMarket)>, ClientError> {
|
2022-12-10 02:16:47 -08:00
|
|
|
program.accounts::<PerpMarket>(vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded(
|
|
|
|
8,
|
|
|
|
&group.to_bytes(),
|
|
|
|
))])
|
2022-07-16 05:37:15 -07:00
|
|
|
}
|