use std::sync::Arc; use cdk::amount::SplitTarget; use cdk::error::Error; use cdk::nuts::nut00::ProofsMethods; use cdk::nuts::{CurrencyUnit, MintQuoteState, NotificationPayload}; use cdk::wallet::{SendOptions, Wallet, WalletSubscription}; use cdk::Amount; use cdk_sqlite::wallet::memory; use rand::random; use tracing_subscriber::EnvFilter; #[tokio::main] async fn main() -> Result<(), Error> { let default_filter = "debug"; let sqlx_filter = "sqlx=warn,hyper_util=warn,reqwest=warn,rustls=warn"; let env_filter = EnvFilter::new(format!("{},{}", default_filter, sqlx_filter)); // Parse input tracing_subscriber::fmt().with_env_filter(env_filter).init(); // Initialize the memory store for the wallet let localstore = Arc::new(memory::empty().await?); // Generate a random seed for the wallet let seed = random::<[u8; 64]>(); // Define the mint URL and currency unit let mint_url = "https://fake.thesimplekid.dev"; let unit = CurrencyUnit::Sat; let amount = Amount::from(10); // Create a new wallet let wallet = Wallet::new(mint_url, unit, localstore, seed, None)?; // Request a mint quote from the wallet let quote = wallet.mint_quote(amount, None).await?; println!("Quote: {:#?}", quote); // Subscribe to updates on the mint quote state let mut subscription = wallet .subscribe(WalletSubscription::Bolt11MintQuoteState(vec![quote .id .clone()])) .await; // Wait for the mint quote to be paid while let Some(msg) = subscription.recv().await { if let NotificationPayload::MintQuoteBolt11Response(response) = msg { if response.state == MintQuoteState::Paid { break; } } } // Mint the received amount let proofs = wallet.mint("e.id, SplitTarget::default(), None).await?; let receive_amount = proofs.total_amount()?; println!("Received {} from mint {}", receive_amount, mint_url); // Send a token with the specified amount let prepared_send = wallet.prepare_send(amount, SendOptions::default()).await?; let token = prepared_send.confirm(None).await?; println!("Token:"); println!("{}", token); Ok(()) }