use solana_sdk::pubkey::Pubkey;
#[derive(Debug, Clone)]
pub struct LendingMarketAccounts {
pub program_id: Pubkey,
pub market_address: Pubkey,
pub reserves: Vec<ReserveAccounts>,
}
impl LendingMarketAccounts {
pub fn reserve_by_mint(&self, mint: &Pubkey) -> Option<&ReserveAccounts> {
self.reserves.iter().find(|r| r.token_mint == *mint)
}
}
#[derive(Debug, Clone)]
pub struct ReserveAccounts {
pub reserve_address: Pubkey,
pub token_mint: Pubkey,
pub liquidity_vault: Pubkey,
pub collateral_mint: Pubkey,
pub oracle: Pubkey,
pub payer_ata: Pubkey,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_reserve_by_mint_lookup() {
let mint_sol = Pubkey::new_unique();
let mint_usdc = Pubkey::new_unique();
let mint_usdt = Pubkey::new_unique();
let mint_unknown = Pubkey::new_unique();
let reserve_sol = ReserveAccounts {
reserve_address: Pubkey::new_unique(),
token_mint: mint_sol,
liquidity_vault: Pubkey::new_unique(),
collateral_mint: Pubkey::new_unique(),
oracle: Pubkey::new_unique(),
payer_ata: Pubkey::new_unique(),
};
let reserve_usdc = ReserveAccounts {
reserve_address: Pubkey::new_unique(),
token_mint: mint_usdc,
liquidity_vault: Pubkey::new_unique(),
collateral_mint: Pubkey::new_unique(),
oracle: Pubkey::new_unique(),
payer_ata: Pubkey::new_unique(),
};
let reserve_usdt = ReserveAccounts {
reserve_address: Pubkey::new_unique(),
token_mint: mint_usdt,
liquidity_vault: Pubkey::new_unique(),
collateral_mint: Pubkey::new_unique(),
oracle: Pubkey::new_unique(),
payer_ata: Pubkey::new_unique(),
};
let expected_sol_addr = reserve_sol.reserve_address;
let expected_usdc_addr = reserve_usdc.reserve_address;
let expected_usdt_addr = reserve_usdt.reserve_address;
let market = LendingMarketAccounts {
program_id: Pubkey::new_unique(),
market_address: Pubkey::new_unique(),
reserves: vec![reserve_sol, reserve_usdc, reserve_usdt],
};
let found_sol = market.reserve_by_mint(&mint_sol).expect("SOL reserve");
assert_eq!(found_sol.reserve_address, expected_sol_addr);
let found_usdc = market.reserve_by_mint(&mint_usdc).expect("USDC reserve");
assert_eq!(found_usdc.reserve_address, expected_usdc_addr);
let found_usdt = market.reserve_by_mint(&mint_usdt).expect("USDT reserve");
assert_eq!(found_usdt.reserve_address, expected_usdt_addr);
assert!(market.reserve_by_mint(&mint_unknown).is_none());
}
}