defituna_client/gpa/
lending_position.rs

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