use crate::SolanaAgentKit;
use base64::{engine::general_purpose, Engine};
use solana_sdk::{commitment_config::CommitmentConfig, transaction::VersionedTransaction};
pub async fn stake_with_jup(agent: &SolanaAgentKit, amount: f64) -> Result<String, Box<dyn std::error::Error>> {
let amount_lamports = (amount * 1e9) as u64;
let stake_url = format!(
"https://worker.jup.ag/blinks/swap/So11111111111111111111111111111111111111112/jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v/{}",
amount_lamports
);
let client = reqwest::Client::new();
let stake_request = serde_json::json!({
"account": agent.wallet.address.to_string(),
});
let response = client.post(&stake_url).json(&stake_request).send().await?;
let data: serde_json::Value = response.json().await?;
let transaction_data =
general_purpose::STANDARD.decode(data["transaction"].as_str().expect("decode transaction"))?;
let mut versioned_transaction: VersionedTransaction = bincode::deserialize(&transaction_data)?;
let blockhash = agent.connection.get_latest_blockhash()?;
versioned_transaction.message.set_recent_blockhash(blockhash);
let signed_transaction = VersionedTransaction::try_new(versioned_transaction.message, &[&agent.wallet.wallet])?;
let signature = agent.connection.send_transaction(&signed_transaction)?;
let latest_blockhash = agent.connection.get_latest_blockhash()?;
agent.connection.confirm_transaction_with_spinner(&signature, &latest_blockhash, CommitmentConfig::confirmed())?;
Ok(signature.to_string())
}