defituna_client/gpa/
lending_position.rs

1use 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}