use aleo_rust_sdk::AleoAccount;
use aleo_rust_sdk::AleoClient;
use aleo_rust_sdk::AleoProgram;
use snarkvm::console::program::ProgramID;
use snarkvm::prelude::PrivateKey;
use std::str::FromStr;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
println!("=== Aleo Testnet Transfer Demo ===\n");
let pk_str = std::env::var("PRIVATE_KEY").expect("PRIVATE_KEY environment variable required");
let private_key = PrivateKey::from_str(&pk_str)?;
let account = AleoAccount::from_private_key_str(&pk_str)?;
println!("🔑 Account address: {}", account.address_str());
let self_addr = account.address_str();
let mut client = AleoClient::new("https://api.explorer.provable.com/v2/testnet")?;
client.set_account_from_private_key_str(&pk_str)?;
client.set_program(AleoProgram::credits()?);
println!("\n📝 Dry-run: executing transfer_public locally...");
let result = client.execute_local(
"credits.aleo",
"transfer_public",
&[self_addr.clone(), "1000000u64".to_string()],
)?;
println!("✅ Dry-run succeeded:\n {result}\n");
println!("📡 Full pipeline: proving and broadcasting...");
let program_id = ProgramID::<snarkvm::prelude::TestnetV0>::from_str("credits.aleo")?;
let tx_id = client
.execute_and_broadcast(
&private_key,
&program_id,
"transfer_public",
vec![self_addr.as_str(), "1000000u64"],
100_000, 0, )
.await?;
println!("\n🎉 Transaction ID: {tx_id}");
println!("🔗 Explorer: https://testnet.explorer.provable.com/transaction/{tx_id}");
println!("\n⏳ Waiting for confirmation...");
client.network.wait_for_confirmation(&tx_id).await?;
println!("\n=== Transfer complete ===");
Ok(())
}