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 vault_data = rpc_client.get_account(&vault_pubkey)?;
let vault_state = from_account_data::<VaultState>(&vault_data.data)?;
let mut reserve_infos = Vec::new();
for reserve_pubkey in VaultInfo::active_reserve_addresses(vault_state) {
let reserve_data = rpc_client.get_account(&reserve_pubkey)?;
reserve_infos.push(ReserveInfo::from_account_data(
reserve_pubkey,
&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::deposit::deposit(
&vault,
owner,
user_token_ata, user_shares_ata, 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!("Deposit successful! Signature: {signature}");
Ok(())
}