proof-selection.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //! Wallet example with memory store
  2. use std::sync::Arc;
  3. use cdk::amount::SplitTarget;
  4. use cdk::cdk_database::WalletMemoryDatabase;
  5. use cdk::nuts::{CurrencyUnit, MintQuoteState, NotificationPayload};
  6. use cdk::wallet::{Wallet, WalletSubscription};
  7. use cdk::Amount;
  8. use rand::Rng;
  9. #[tokio::main]
  10. async fn main() {
  11. let seed = rand::thread_rng().gen::<[u8; 32]>();
  12. let mint_url = "https://testnut.cashu.space";
  13. let unit = CurrencyUnit::Sat;
  14. let localstore = WalletMemoryDatabase::default();
  15. let wallet = Wallet::new(mint_url, unit, Arc::new(localstore), &seed, None).unwrap();
  16. for amount in [64] {
  17. let amount = Amount::from(amount);
  18. let quote = wallet.mint_quote(amount, None).await.unwrap();
  19. println!("Pay request: {}", quote.request);
  20. let mut subscription = wallet
  21. .subscribe(WalletSubscription::Bolt11MintQuoteState(vec![quote
  22. .id
  23. .clone()]))
  24. .await;
  25. while let Some(msg) = subscription.recv().await {
  26. if let NotificationPayload::MintQuoteBolt11Response(response) = msg {
  27. if response.state == MintQuoteState::Paid {
  28. break;
  29. }
  30. }
  31. }
  32. let receive_amount = wallet
  33. .mint(&quote.id, SplitTarget::default(), None)
  34. .await
  35. .unwrap();
  36. println!("Minted {}", receive_amount);
  37. }
  38. let proofs = wallet.get_unspent_proofs().await.unwrap();
  39. let selected = wallet
  40. .select_proofs_to_send(Amount::from(64), proofs, false)
  41. .await
  42. .unwrap();
  43. for (i, proof) in selected.iter().enumerate() {
  44. println!("{}: {}", i, proof.amount);
  45. }
  46. }