use std::str::FromStr;
use kvault_interface::{pda, state::VaultState, Fraction, KVAULT_PROGRAM_ID};
use solana_client::rpc_client::RpcClient;
use solana_pubkey::Pubkey;
use spl_associated_token_account::get_associated_token_address;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let rpc_client = RpcClient::new("https://api.mainnet-beta.solana.com");
let vault_pubkey = Pubkey::from_str("HDsayqAsDWy3QvANGqh2yNraqcD8Fnjgh73Mhb3WRS5E")?;
let user = Pubkey::from_str("EZC9wzVCvihCsCHEMGADYdsRhcpdRYWzSCZAVegSCfqY")?;
let vault_account = rpc_client.get_account(&vault_pubkey)?;
let vault = kvault_interface::from_account_data::<VaultState>(&vault_account.data)?;
let (shares_mint, _) = pda::shares_mint(&KVAULT_PROGRAM_ID, &vault_pubkey);
let user_shares_ata = get_associated_token_address(&user, &shares_mint);
let shares_account = rpc_client.get_account(&user_shares_ata)?;
let user_shares = u64::from_le_bytes(shares_account.data[64..72].try_into()?);
let aum = Fraction::from_bits(u128::from(vault.prev_aum_sf));
let total_shares = vault.shares_issued;
println!("Vault: {vault_pubkey}");
println!(" Total AUM: {aum:.6}");
println!(" Shares issued: {total_shares}");
println!("\nUser: {user}");
println!(" Shares held: {user_shares}");
if total_shares > 0 {
let exchange_rate = aum / Fraction::from_num(total_shares);
let position_value = Fraction::from_num(user_shares) * exchange_rate;
println!(" Exchange rate: {exchange_rate:.6} tokens/share");
println!(" Position value: {position_value:.6} tokens");
} else {
println!(" Vault has no shares issued");
}
Ok(())
}