diff --git a/crates/cdk/Cargo.toml b/crates/cdk/Cargo.toml index d81e8efc..39d98759 100644 --- a/crates/cdk/Cargo.toml +++ b/crates/cdk/Cargo.toml @@ -61,6 +61,10 @@ required-features = ["wallet"] name = "p2pk" required-features = ["wallet"] +[[example]] +name = "wallet" +required-features = ["wallet"] + [dev-dependencies] rand = "0.8.5" bip39.workspace = true diff --git a/crates/cdk/README.md b/crates/cdk/README.md index 036beefe..dced2b9d 100644 --- a/crates/cdk/README.md +++ b/crates/cdk/README.md @@ -18,6 +18,70 @@ The following crate feature flags are available: See +## Examples + +```rust +//! Wallet example with memory store + +use std::sync::Arc; +use std::time::Duration; + +use cdk::amount::SplitTarget; +use cdk::cdk_database::WalletMemoryDatabase; +use cdk::nuts::{CurrencyUnit, MintQuoteState}; +use cdk::wallet::Wallet; +use cdk::Amount; +use rand::Rng; +use tokio::time::sleep; + +#[tokio::main] +async fn main() { + let seed = rand::thread_rng().gen::<[u8; 32]>(); + + let mint_url = "https://testnut.cashu.space"; + let unit = CurrencyUnit::Sat; + let amount = Amount::from(10); + + let localstore = WalletMemoryDatabase::default(); + + let wallet = Wallet::new(mint_url, unit.clone(), Arc::new(localstore), &seed); + + let quote = wallet.mint_quote(amount).await.unwrap(); + + println!("Pay request: {}", quote.request); + + loop { + let status = wallet.mint_quote_state("e.id).await.unwrap(); + + if status.state == MintQuoteState::Paid { + break; + } + + println!("Quote state: {}", status.state); + + sleep(Duration::from_secs(5)).await; + } + + let receive_amount = wallet + .mint("e.id, SplitTarget::default(), None) + .await + .unwrap(); + + println!("Minted {}", receive_amount); + + let token = wallet + .send(amount, None, None, &SplitTarget::None) + .await + .unwrap(); + + println!("{}", token); +} + +``` + +See more examples in the [examples](./examples) folder. + + ## License This project is distributed under the MIT software license - see the [LICENSE](../../LICENSE) file for details diff --git a/crates/cdk/examples/wallet.rs b/crates/cdk/examples/wallet.rs new file mode 100644 index 00000000..655bb6f8 --- /dev/null +++ b/crates/cdk/examples/wallet.rs @@ -0,0 +1,55 @@ +//! Wallet example with memory store + +use std::sync::Arc; +use std::time::Duration; + +use cdk::amount::SplitTarget; +use cdk::cdk_database::WalletMemoryDatabase; +use cdk::nuts::{CurrencyUnit, MintQuoteState}; +use cdk::wallet::Wallet; +use cdk::Amount; +use rand::Rng; +use tokio::time::sleep; + +#[tokio::main] +async fn main() { + let seed = rand::thread_rng().gen::<[u8; 32]>(); + + let mint_url = "https://testnut.cashu.space"; + let unit = CurrencyUnit::Sat; + let amount = Amount::from(10); + + let localstore = WalletMemoryDatabase::default(); + + let wallet = Wallet::new(mint_url, unit.clone(), Arc::new(localstore), &seed); + + let quote = wallet.mint_quote(amount).await.unwrap(); + + println!("Pay request: {}", quote.request); + + loop { + let status = wallet.mint_quote_state("e.id).await.unwrap(); + + if status.state == MintQuoteState::Paid { + break; + } + + println!("Quote state: {}", status.state); + + sleep(Duration::from_secs(5)).await; + } + + let receive_amount = wallet + .mint("e.id, SplitTarget::default(), None) + .await + .unwrap(); + + println!("Minted {}", receive_amount); + + let token = wallet + .send(amount, None, None, &SplitTarget::None) + .await + .unwrap(); + + println!("{}", token); +} diff --git a/crates/cdk/src/nuts/nut06.rs b/crates/cdk/src/nuts/nut06.rs index fd4ffca9..2a06150d 100644 --- a/crates/cdk/src/nuts/nut06.rs +++ b/crates/cdk/src/nuts/nut06.rs @@ -175,7 +175,6 @@ where let vec = value .as_array() .ok_or_else(|| de::Error::custom("expected a list of strings"))?; - println!("{:?}", vec[0]); for val in vec { let vec = val .as_array()