use cryptopay::{EtherscanClient, Currency, PaymentMonitor, PaymentRequest, PaymentStatus};
use rust_decimal::Decimal;
use std::str::FromStr;
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv::dotenv().ok();
let api_key = std::env::var("ETHERSCAN_API_KEY")
.expect("ETHERSCAN_API_KEY environment variable not set");
let client = EtherscanClient::new(api_key)?;
let monitor = PaymentMonitor::builder()
.client(client)
.poll_interval(Duration::from_secs(10))
.build();
let payment_request = PaymentRequest {
amount: Decimal::from_str("0.1")?,
currency: Currency::ETH,
recipient_address: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0".to_string(),
required_confirmations: 12,
timeout_seconds: Some(1800), };
println!("🔍 Monitoring payment...");
println!("Send {} ETH to: {}", payment_request.amount, payment_request.recipient_address);
println!("Polling every 10 seconds...");
println!();
monitor
.start_monitoring(payment_request, |status| {
match status {
PaymentStatus::Pending => {
println!("⏳ Status: Waiting for payment...");
}
PaymentStatus::Detected { tx_hash, confirmations } => {
println!("📥 Payment detected!");
println!(" Transaction: {}", tx_hash);
println!(" Confirmations: {}", confirmations);
}
PaymentStatus::Confirmed { tx_hash, confirmations } => {
println!("✅ Payment confirmed!");
println!(" Transaction: {}", tx_hash);
println!(" Final confirmations: {}", confirmations);
}
PaymentStatus::Failed { reason } => {
println!("❌ Payment failed: {}", reason);
}
PaymentStatus::Expired => {
println!("⏰ Payment expired");
}
}
})
.await?;
println!("\n✨ Monitoring complete!");
Ok(())
}