From 4148ee83651ca725cb9f2109a10a5aebe8d0d02e Mon Sep 17 00:00:00 2001 From: thesimplekid Date: Sun, 1 Oct 2023 09:03:40 +0100 Subject: [PATCH] `bindings/cashu-sdk` add wallet --- .helix/languages.toml | 2 +- bindings/cashu-js/src/nuts/nut00/mod.rs | 1 + bindings/cashu-js/src/types/mod.rs | 2 + bindings/cashu-js/src/types/proofs_status.rs | 47 ++++++ bindings/cashu-sdk-js/src/lib.rs | 4 + bindings/cashu-sdk-js/src/mint.rs | 2 +- bindings/cashu-sdk-js/src/types/mod.rs | 4 +- .../cashu-sdk-js/src/types/proof_status.rs | 48 ------ bindings/cashu-sdk-js/src/wallet.rs | 143 +++++++++++++++++- 9 files changed, 199 insertions(+), 54 deletions(-) delete mode 100644 bindings/cashu-sdk-js/src/types/proof_status.rs diff --git a/.helix/languages.toml b/.helix/languages.toml index a7c3f804..188aa050 100644 --- a/.helix/languages.toml +++ b/.helix/languages.toml @@ -1,4 +1,4 @@ [[language]] name = "rust" -config = { cargo = { features = [ "blocking", "wallet", "mint" ] } } +config = { cargo = { features = [ "wallet", "mint" ] } } diff --git a/bindings/cashu-js/src/nuts/nut00/mod.rs b/bindings/cashu-js/src/nuts/nut00/mod.rs index 4647b944..f5246ba9 100644 --- a/bindings/cashu-js/src/nuts/nut00/mod.rs +++ b/bindings/cashu-js/src/nuts/nut00/mod.rs @@ -8,3 +8,4 @@ pub use blinded_message::JsBlindedMessage; pub use blinded_messages::JsBlindedMessages; pub use blinded_signature::JsBlindedSignature; pub use proof::JsProof; +pub use token::JsToken; diff --git a/bindings/cashu-js/src/types/mod.rs b/bindings/cashu-js/src/types/mod.rs index 23bbf66d..d456f501 100644 --- a/bindings/cashu-js/src/types/mod.rs +++ b/bindings/cashu-js/src/types/mod.rs @@ -1,7 +1,9 @@ pub mod amount; pub mod bolt11_invoice; +pub mod proofs_status; pub mod secret; pub use amount::JsAmount; pub use bolt11_invoice::JsBolt11Invoice; +pub use proofs_status::JsProofsStatus; pub use secret::JsSecret; diff --git a/bindings/cashu-js/src/types/proofs_status.rs b/bindings/cashu-js/src/types/proofs_status.rs index 8b137891..bce6c89f 100644 --- a/bindings/cashu-js/src/types/proofs_status.rs +++ b/bindings/cashu-js/src/types/proofs_status.rs @@ -1 +1,48 @@ +use std::ops::Deref; +use cashu::types::ProofsStatus; +use wasm_bindgen::prelude::*; + +use crate::error::{into_err, Result}; + +#[wasm_bindgen(js_name = ProofsStatus)] +pub struct JsProofsStatus { + inner: ProofsStatus, +} + +impl Deref for JsProofsStatus { + type Target = ProofsStatus; + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl From for JsProofsStatus { + fn from(inner: ProofsStatus) -> JsProofsStatus { + JsProofsStatus { inner } + } +} + +#[wasm_bindgen(js_class = ProofsStatus)] +impl JsProofsStatus { + #[wasm_bindgen(constructor)] + pub fn new(spent_proofs: JsValue, spendable_proofs: JsValue) -> Result { + let spent = serde_wasm_bindgen::from_value(spent_proofs).map_err(into_err)?; + let spendable = serde_wasm_bindgen::from_value(spendable_proofs).map_err(into_err)?; + Ok(JsProofsStatus { + inner: ProofsStatus { spent, spendable }, + }) + } + + /// Get Spendable Proofs + #[wasm_bindgen(getter)] + pub fn spendable(&self) -> Result { + serde_wasm_bindgen::to_value(&self.inner.spendable).map_err(into_err) + } + + /// Get Spent Proofs + #[wasm_bindgen(getter)] + pub fn spent_proofs(&self) -> Result { + serde_wasm_bindgen::to_value(&self.inner.spent).map_err(into_err) + } +} diff --git a/bindings/cashu-sdk-js/src/lib.rs b/bindings/cashu-sdk-js/src/lib.rs index 3392f6f0..05177df1 100644 --- a/bindings/cashu-sdk-js/src/lib.rs +++ b/bindings/cashu-sdk-js/src/lib.rs @@ -3,3 +3,7 @@ mod error; mod mint; mod types; mod wallet; + +pub use client::JsClient; +pub use mint::JsMint; +pub use wallet::JsWallet; diff --git a/bindings/cashu-sdk-js/src/mint.rs b/bindings/cashu-sdk-js/src/mint.rs index 8d7c84c4..24e2d90c 100644 --- a/bindings/cashu-sdk-js/src/mint.rs +++ b/bindings/cashu-sdk-js/src/mint.rs @@ -69,7 +69,7 @@ impl JsMint { } /// Get Keysets - #[wasm_bindgen(js_name = KeySets)] + #[wasm_bindgen(js_name = keySets)] pub fn keysets(&self) -> JsKeySetsResponse { self.inner.keysets().into() } diff --git a/bindings/cashu-sdk-js/src/types/mod.rs b/bindings/cashu-sdk-js/src/types/mod.rs index 10186643..4d12b0d5 100644 --- a/bindings/cashu-sdk-js/src/types/mod.rs +++ b/bindings/cashu-sdk-js/src/types/mod.rs @@ -1,3 +1,5 @@ mod melted; -mod proof_status; mod send_proofs; + +pub use melted::JsMelted; +pub use send_proofs::JsSendProofs; diff --git a/bindings/cashu-sdk-js/src/types/proof_status.rs b/bindings/cashu-sdk-js/src/types/proof_status.rs deleted file mode 100644 index 07e5a0d6..00000000 --- a/bindings/cashu-sdk-js/src/types/proof_status.rs +++ /dev/null @@ -1,48 +0,0 @@ -use std::ops::Deref; - -use cashu_sdk::types::ProofsStatus; -use wasm_bindgen::prelude::*; - -use crate::error::{into_err, Result}; - -#[wasm_bindgen(js_name = ProofStatus)] -pub struct JsProofsStatus { - inner: ProofsStatus, -} - -impl Deref for JsProofsStatus { - type Target = ProofsStatus; - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -impl From for JsProofsStatus { - fn from(inner: ProofsStatus) -> JsProofsStatus { - JsProofsStatus { inner } - } -} - -#[wasm_bindgen(js_class = ProofsStatus)] -impl JsProofsStatus { - #[wasm_bindgen(constructor)] - pub fn new(spendable: JsValue, spent: JsValue) -> Result { - let spendable = serde_wasm_bindgen::from_value(spendable).map_err(into_err)?; - let spent = serde_wasm_bindgen::from_value(spent).map_err(into_err)?; - Ok(JsProofsStatus { - inner: ProofsStatus { spendable, spent }, - }) - } - - /// Get Spendable - #[wasm_bindgen(getter)] - pub fn spendable(&self) -> Result { - serde_wasm_bindgen::to_value(&self.inner.spendable).map_err(into_err) - } - - /// Get Spent - #[wasm_bindgen(getter)] - pub fn spent(&self) -> Result { - serde_wasm_bindgen::to_value(&self.inner.spent).map_err(into_err) - } -} diff --git a/bindings/cashu-sdk-js/src/wallet.rs b/bindings/cashu-sdk-js/src/wallet.rs index 3575c3ce..27f4af5b 100644 --- a/bindings/cashu-sdk-js/src/wallet.rs +++ b/bindings/cashu-sdk-js/src/wallet.rs @@ -1,9 +1,17 @@ use std::ops::Deref; +use cashu_js::nuts::nut00::{JsBlindedMessages, JsToken}; +use cashu_js::nuts::nut03::JsRequestMintResponse; +use cashu_js::types::{JsBolt11Invoice, JsProofsStatus}; +use cashu_js::{nuts::nut01::JsKeys, types::JsAmount}; use cashu_sdk::wallet::Wallet; use wasm_bindgen::prelude::*; -use crate::error::{into_err, Result}; +use crate::types::{JsMelted, JsSendProofs}; +use crate::{ + error::{into_err, Result}, + JsClient, +}; #[wasm_bindgen(js_name = Wallet)] pub struct JsWallet { @@ -26,7 +34,136 @@ impl From for JsWallet { #[wasm_bindgen(js_class = Wallet)] impl JsWallet { #[wasm_bindgen(constructor)] - pub fn new() -> Result { - todo!() + pub fn new(client: JsClient, mint_keys: JsKeys) -> JsWallet { + JsWallet { + inner: Wallet::new(client.deref().clone(), mint_keys.deref().clone()), + } + } + + /// Check Proofs spent + #[wasm_bindgen(js_name = checkProofsSpent)] + pub async fn check_proofs_spent(&self, proofs: JsValue) -> Result { + let proofs = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?; + + Ok(self + .inner + .check_proofs_spent(&proofs) + .await + .map_err(into_err)? + .into()) + } + + /// Request Mint + #[wasm_bindgen(js_name = requestMint)] + pub async fn request_mint(&self, amount: JsAmount) -> Result { + Ok(self + .inner + .request_mint(*amount.deref()) + .await + .map_err(into_err)? + .into()) + } + + /// Mint Token + #[wasm_bindgen(js_name = mintToken)] + pub async fn mint_token(&self, amount: JsAmount, hash: String) -> Result { + Ok(self + .inner + .mint_token(*amount.deref(), &hash) + .await + .map_err(into_err)? + .into()) + } + + /// Mint + #[wasm_bindgen(js_name = mint)] + pub async fn mint(&self, amount: JsAmount, hash: String) -> Result { + serde_wasm_bindgen::to_value( + &self + .inner + .mint(*amount.deref(), &hash) + .await + .map_err(into_err)?, + ) + .map_err(into_err) + } + + /// Check Fee + #[wasm_bindgen(js_name = checkFee)] + pub async fn check_fee(&self, invoice: JsBolt11Invoice) -> Result { + Ok(self + .inner + .check_fee(invoice.deref().clone()) + .await + .map_err(into_err)? + .into()) + } + + /// Receive + #[wasm_bindgen(js_name = receive)] + pub async fn receive(&self, token: String) -> Result { + serde_wasm_bindgen::to_value(&self.inner.receive(&token).await.map_err(into_err)?) + .map_err(into_err) + } + + /// Process Split + #[wasm_bindgen(js_name = processSplitResponse)] + pub fn process_split_response( + &self, + blinded_messages: JsBlindedMessages, + promises: JsValue, + ) -> Result { + let promises = serde_wasm_bindgen::from_value(promises).map_err(into_err)?; + + serde_wasm_bindgen::to_value( + &self + .inner + .process_split_response(blinded_messages.deref().clone(), promises) + .map_err(into_err)?, + ) + .map_err(into_err) + } + + /// Send + #[wasm_bindgen(js_name = processSplitResponse)] + pub async fn send(&self, amount: JsAmount, proofs: JsValue) -> Result { + let proofs = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?; + + Ok(self + .inner + .send(*amount.deref(), proofs) + .await + .map_err(into_err)? + .into()) + } + + /// Melt + #[wasm_bindgen(js_name = melt)] + pub async fn melt( + &self, + invoice: JsBolt11Invoice, + proofs: JsValue, + fee_reserve: JsAmount, + ) -> Result { + let proofs = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?; + + Ok(self + .inner + .melt(invoice.deref().clone(), proofs, *fee_reserve.deref()) + .await + .map_err(into_err)? + .into()) + } + + /// Proofs to token + #[wasm_bindgen(js_name = proofsToToken)] + pub fn proofs_to_token(&self, proofs: JsValue, memo: Option) -> Result { + let proofs = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?; + + Ok(self + .inner + .proofs_to_token(proofs, memo) + .map_err(into_err)? + .into()) } }