defituna_client/gpa/
lending_position.rs1use std::error::Error;
2
3use solana_client::{
4 rpc_client::RpcClient,
5 rpc_filter::{Memcmp, RpcFilterType},
6};
7use solana_pubkey::Pubkey;
8
9use crate::accounts::{LendingPosition, LENDING_POSITION_DISCRIMINATOR};
10use crate::generated::shared::DecodedAccount;
11use crate::gpa::utils::fetch_decoded_program_accounts;
12
13#[derive(Debug, Clone)]
14pub enum LendingPositionFilter {
15 Authority(Pubkey),
16 Mint(Pubkey),
17}
18
19impl From<LendingPositionFilter> for RpcFilterType {
20 fn from(val: LendingPositionFilter) -> Self {
21 match val {
22 LendingPositionFilter::Authority(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(11, &address.to_bytes())),
23 LendingPositionFilter::Mint(address) => RpcFilterType::Memcmp(Memcmp::new_base58_encoded(43, &address.to_bytes())),
24 }
25 }
26}
27
28pub fn fetch_all_lending_position_with_filter(
29 rpc: &RpcClient,
30 filters: Vec<LendingPositionFilter>,
31) -> Result<Vec<DecodedAccount<LendingPosition>>, Box<dyn Error>> {
32 let mut filters: Vec<RpcFilterType> = filters.into_iter().map(|filter| filter.into()).collect();
33 filters.push(RpcFilterType::Memcmp(Memcmp::new_base58_encoded(0, &LENDING_POSITION_DISCRIMINATOR)));
34 fetch_decoded_program_accounts(rpc, filters)
35}