فهرست منبع

feat(example): mint-token example

thesimplekid 10 ماه پیش
والد
کامیت
535802aa14
5فایلهای تغییر یافته به همراه75 افزوده شده و 0 حذف شده
  1. 1 0
      Cargo.toml
  2. 8 0
      crates/cdk/Cargo.toml
  3. 62 0
      crates/cdk/examples/mint-token.rs
  4. 3 0
      crates/cdk/src/cdk_database/mod.rs
  5. 1 0
      crates/cdk/src/lib.rs

+ 1 - 0
Cargo.toml

@@ -26,6 +26,7 @@ keywords = ["bitcoin", "e-cash", "cashu"]
 async-trait = "0.1.74"
 cdk = { path = "./crates/cdk", default-features = false }
 cdk-rexie = { path = "./crates/cdk-rexie", default-features = false }
+cdk-redb = { path = "./crates/cdk-redb", default-features = false }
 tokio = { version = "1.32", default-features = false }
 thiserror = "1"
 tracing = { version = "0.1", default-features = false, features = ["attributes"] }

+ 8 - 0
crates/cdk/Cargo.toml

@@ -15,6 +15,7 @@ mint = []
 wallet = ["dep:reqwest"]
 nostr = ["dep:nostr-sdk"]
 
+
 [dependencies]
 async-trait = "0.1"
 base64 = "0.22" # bitcoin uses v0.13 (optional dep)
@@ -59,3 +60,10 @@ tokio = { workspace = true, features = [
 tokio = { workspace = true, features = ["rt", "macros", "sync", "time"] }
 getrandom = { version = "0.2", features = ["js"] }
 instant = { version = "0.1", features = ["wasm-bindgen", "inaccurate"] }
+
+[[example]]
+name = "mint-token"
+required-features = ["wallet"]
+
+[dev-dependencies]
+rand = "0.8.5"

+ 62 - 0
crates/cdk/examples/mint-token.rs

@@ -0,0 +1,62 @@
+use std::str::FromStr;
+use std::sync::Arc;
+use std::time::Duration;
+
+use cdk::amount::SplitTarget;
+use cdk::error::Error;
+use cdk::nuts::CurrencyUnit;
+use cdk::wallet::Wallet;
+use cdk::{Amount, UncheckedUrl};
+use rand::Rng;
+use tokio::time::sleep;
+
+#[tokio::main]
+async fn main() -> Result<(), Error> {
+    let localstore = cdk::cdk_database::wallet_memory::WalletMemoryDatabase::default();
+    let seed = rand::thread_rng().gen::<[u8; 32]>();
+
+    let mint_url = UncheckedUrl::from_str("https://testnut.cashu.space").unwrap();
+    let unit = CurrencyUnit::Sat;
+    let amount = Amount::from(10);
+
+    let mut wallet = Wallet::new(Arc::new(localstore), &seed, vec![]);
+
+    let quote = wallet
+        .mint_quote(mint_url.clone(), amount, unit.clone())
+        .await
+        .unwrap();
+
+    println!("Quote: {:#?}", quote);
+
+    loop {
+        let status = wallet
+            .mint_quote_status(mint_url.clone(), &quote.id)
+            .await
+            .unwrap();
+
+        println!("Quote status: {}", status.paid);
+
+        if status.paid {
+            break;
+        }
+
+        sleep(Duration::from_secs(5)).await;
+    }
+
+    let receive_amount = wallet
+        .mint(mint_url.clone(), &quote.id, SplitTarget::default(), None)
+        .await
+        .unwrap();
+
+    println!("Received {receive_amount} from mint {mint_url}");
+
+    let token = wallet
+        .send(&mint_url, unit, None, amount, &SplitTarget::None, None)
+        .await
+        .unwrap();
+
+    println!("Token:");
+    println!("{}", token);
+
+    Ok(())
+}

+ 3 - 0
crates/cdk/src/cdk_database/mod.rs

@@ -31,6 +31,9 @@ pub mod mint_memory;
 #[cfg(feature = "wallet")]
 pub mod wallet_memory;
 
+#[cfg(feature = "wallet")]
+pub use wallet_memory::WalletMemoryDatabase;
+
 #[derive(Debug, Error)]
 pub enum Error {
     #[error(transparent)]

+ 1 - 0
crates/cdk/src/lib.rs

@@ -21,6 +21,7 @@ pub mod util;
 pub mod wallet;
 
 pub use self::amount::Amount;
+pub use self::url::UncheckedUrl;
 pub use self::util::SECP256K1;
 #[cfg(feature = "wallet")]
 pub use self::wallet::client::HttpClient;