use std::str::FromStr;
use kvault_interface::{
from_account_data, helpers, pda, state::VaultState, ReserveInfo, VaultInfo, KVAULT_PROGRAM_ID,
};
use solana_client::rpc_client::RpcClient;
use solana_pubkey::Pubkey;
use solana_sdk::signer::{keypair::read_keypair_file, Signer};
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 signer = read_keypair_file("/path/to/your/keypair.json")?;
let owner = signer.pubkey();
let vault_pubkey = Pubkey::from_str("HDsayqAsDWy3QvANGqh2yNraqcD8Fnjgh73Mhb3WRS5E")?;
let reserve_pubkey = Pubkey::from_str("D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59")?;
let vault_data = rpc_client.get_account(&vault_pubkey)?;
let reserve_data = rpc_client.get_account(&reserve_pubkey)?;
let reserve = ReserveInfo::from_account_data(reserve_pubkey, &reserve_data.data)?;
let vault_state = from_account_data::<VaultState>(&vault_data.data)?;
let mut reserve_infos = Vec::new();
for active_reserve in VaultInfo::active_reserve_addresses(vault_state) {
if active_reserve == reserve.address {
reserve_infos.push(ReserveInfo::from_account_data(
reserve.address,
&reserve_data.data,
)?);
} else {
let data = rpc_client.get_account(&active_reserve)?;
reserve_infos.push(ReserveInfo::from_account_data(active_reserve, &data.data)?);
}
}
let vault = VaultInfo::from_account_data(vault_pubkey, &vault_data.data, &reserve_infos)?;
let user_token_ata = get_associated_token_address(&owner, &vault.token_mint);
let (shares_mint, _) = pda::shares_mint(&KVAULT_PROGRAM_ID, &vault_pubkey);
let user_shares_ata = get_associated_token_address(&owner, &shares_mint);
let ix = helpers::withdraw::withdraw(
&vault,
owner,
user_token_ata,
user_shares_ata,
&reserve,
1_000_000, );
let message = solana_sdk::message::Message::new(&[ix], Some(&owner));
let recent_blockhash = rpc_client.get_latest_blockhash()?;
let tx = solana_sdk::transaction::Transaction::new(&[&signer], message, recent_blockhash);
let signature = rpc_client.send_and_confirm_transaction(&tx)?;
println!("Withdrawal successful! Signature: {signature}");
Ok(())
}