use std::sync::Arc;
use cdk::amount::SplitTarget;
use cdk::error::Error;
use cdk::nuts::{CurrencyUnit, MintQuoteState, NotificationPayload, SecretKey, SpendingConditions};
use cdk::wallet::{SendOptions, Wallet, WalletSubscription};
use cdk::Amount;
use cdk_sqlite::wallet::memory;
use rand::Rng;
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));
tracing_subscriber::fmt().with_env_filter(env_filter).init();
let localstore = memory::empty().await?;
let seed = rand::thread_rng().gen::<[u8; 32]>();
let mint_url = "https://testnut.cashu.space";
let unit = CurrencyUnit::Sat;
let amount = Amount::from(100);
let wallet = Wallet::new(mint_url, unit, Arc::new(localstore), &seed, None).unwrap();
let quote = wallet.mint_quote(amount, None).await?;
println!("Minting nuts ...");
let mut subscription = wallet
.subscribe(WalletSubscription::Bolt11MintQuoteState(vec![quote
.id
.clone()]))
.await;
while let Some(msg) = subscription.recv().await {
if let NotificationPayload::MintQuoteBolt11Response(response) = msg {
if response.state == MintQuoteState::Paid {
break;
}
}
}
let received_proofs = wallet.mint("e.id, SplitTarget::default(), None).await?;
println!(
"Minted nuts: {:?}",
received_proofs
.into_iter()
.map(|p| p.amount)
.collect::<Vec<_>>()
);
let secret = SecretKey::generate();
let spending_conditions = SpendingConditions::new_p2pk(secret.public_key(), None);
let bal = wallet.total_balance().await?;
println!("Total balance: {}", bal);
let prepared_send = wallet
.prepare_send(
10.into(),
SendOptions {
conditions: Some(spending_conditions),
include_fee: true,
..Default::default()
},
)
.await?;
println!("Fee: {}", prepared_send.fee());
let token = wallet.send(prepared_send, None).await?;
println!("Created token locked to pubkey: {}", secret.public_key());
println!("{}", token);
let amount = wallet
.receive(&token.to_string(), SplitTarget::default(), &[secret], &[])
.await?;
println!("Redeemed locked token worth: {}", u64::from(amount));
Ok(())
}