diff --git a/bindings/cashu-ffi/src/cashu.udl b/bindings/cashu-ffi/src/cashu.udl index 5281bc07..262c2274 100644 --- a/bindings/cashu-ffi/src/cashu.udl +++ b/bindings/cashu-ffi/src/cashu.udl @@ -88,7 +88,7 @@ interface MintProofs { interface Token { [Throws=CashuError] - constructor(string mint, sequence token, string? memo); + constructor(string mint, sequence token, string? unit, string? memo); sequence token(); string? memo(); [Throws=CashuError] diff --git a/bindings/cashu-ffi/src/nuts/nut00/proof.rs b/bindings/cashu-ffi/src/nuts/nut00/proof.rs index 9cd408b5..5072a9e2 100644 --- a/bindings/cashu-ffi/src/nuts/nut00/proof.rs +++ b/bindings/cashu-ffi/src/nuts/nut00/proof.rs @@ -113,7 +113,7 @@ pub mod mint { } pub fn id(&self) -> Option> { - self.inner.id.clone().map(|id| Arc::new(id.into())) + self.inner.id.map(|id| Arc::new(id.into())) } } diff --git a/bindings/cashu-ffi/src/nuts/nut00/token.rs b/bindings/cashu-ffi/src/nuts/nut00/token.rs index f554489e..1377a09d 100644 --- a/bindings/cashu-ffi/src/nuts/nut00/token.rs +++ b/bindings/cashu-ffi/src/nuts/nut00/token.rs @@ -12,11 +12,16 @@ pub struct Token { } impl Token { - pub fn new(mint: String, proofs: Vec>, memo: Option) -> Result { + pub fn new( + mint: String, + proofs: Vec>, + unit: Option, + memo: Option, + ) -> Result { let mint = UncheckedUrl::from_str(&mint)?; let proofs = proofs.into_iter().map(|p| p.as_ref().into()).collect(); Ok(Self { - inner: TokenSdk::new(mint, proofs, memo)?, + inner: TokenSdk::new(mint, proofs, unit, memo)?, }) } diff --git a/bindings/cashu-js/src/nuts/nut00/token.rs b/bindings/cashu-js/src/nuts/nut00/token.rs index 3207d8d6..1cfa1b70 100644 --- a/bindings/cashu-js/src/nuts/nut00/token.rs +++ b/bindings/cashu-js/src/nuts/nut00/token.rs @@ -28,11 +28,16 @@ impl From for JsToken { #[wasm_bindgen(js_class = Token)] impl JsToken { #[wasm_bindgen(constructor)] - pub fn new(mint: String, proofs: JsValue, memo: Option) -> Result { + pub fn new( + mint: String, + proofs: JsValue, + unit: Option, + memo: Option, + ) -> Result { let mint = UncheckedUrl::from_str(&mint).map_err(into_err)?; let proofs = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?; Ok(Self { - inner: Token::new(mint, proofs, memo).map_err(into_err)?, + inner: Token::new(mint, proofs, unit, memo).map_err(into_err)?, }) } diff --git a/bindings/cashu-sdk-ffi/src/cashu_sdk.udl b/bindings/cashu-sdk-ffi/src/cashu_sdk.udl index 708c2b8e..a32bb636 100644 --- a/bindings/cashu-sdk-ffi/src/cashu_sdk.udl +++ b/bindings/cashu-sdk-ffi/src/cashu_sdk.udl @@ -91,7 +91,7 @@ interface MintProofs { interface Token { [Throws=CashuError] - constructor(string mint, sequence token, string? memo); + constructor(string mint, sequence token, string? unit, string? memo); sequence token(); string? memo(); [Throws=CashuError] diff --git a/bindings/cashu-sdk-js/src/wallet.rs b/bindings/cashu-sdk-js/src/wallet.rs index 80cb43d5..66d3aebc 100644 --- a/bindings/cashu-sdk-js/src/wallet.rs +++ b/bindings/cashu-sdk-js/src/wallet.rs @@ -68,10 +68,16 @@ impl JsWallet { /// Mint Token #[wasm_bindgen(js_name = mintToken)] - pub async fn mint_token(&self, amount: JsAmount, hash: String) -> Result { + pub async fn mint_token( + &self, + amount: JsAmount, + hash: String, + unit: Option, + memo: Option, + ) -> Result { Ok(self .inner - .mint_token(*amount.deref(), &hash) + .mint_token(*amount.deref(), &hash, unit, memo) .await .map_err(into_err)? .into()) @@ -159,9 +165,16 @@ impl JsWallet { /// Proofs to token #[wasm_bindgen(js_name = proofsToToken)] - pub fn proofs_to_token(&self, proofs: JsValue, memo: Option) -> Result { + pub fn proofs_to_token( + &self, + proofs: JsValue, + unit: Option, + memo: Option, + ) -> Result { let proofs = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?; - self.inner.proofs_to_token(proofs, memo).map_err(into_err) + self.inner + .proofs_to_token(proofs, unit, memo) + .map_err(into_err) } } diff --git a/crates/cashu-sdk/src/wallet.rs b/crates/cashu-sdk/src/wallet.rs index daf8bab5..e050db23 100644 --- a/crates/cashu-sdk/src/wallet.rs +++ b/crates/cashu-sdk/src/wallet.rs @@ -89,10 +89,18 @@ impl Wallet { .await?) } - pub async fn mint_token(&self, amount: Amount, hash: &str) -> Result { + // TODO: Need to use the unit, check keyset is of the same unit of attempting to + // mint + pub async fn mint_token( + &self, + amount: Amount, + hash: &str, + unit: Option, + memo: Option, + ) -> Result { let proofs = self.mint(amount, hash).await?; - let token = Token::new(self.mint_url.clone(), proofs, None); + let token = Token::new(self.mint_url.clone(), proofs, unit, memo); Ok(token?) } @@ -338,8 +346,13 @@ impl Wallet { Ok(melted) } - pub fn proofs_to_token(&self, proofs: Proofs, memo: Option) -> Result { - Ok(Token::new(self.mint_url.clone(), proofs, memo)?.convert_to_string()?) + pub fn proofs_to_token( + &self, + proofs: Proofs, + unit: Option, + memo: Option, + ) -> Result { + Ok(Token::new(self.mint_url.clone(), proofs, unit, memo)?.convert_to_string()?) } } diff --git a/crates/cashu/src/nuts/nut00.rs b/crates/cashu/src/nuts/nut00.rs index 4fba8a0b..39426b86 100644 --- a/crates/cashu/src/nuts/nut00.rs +++ b/crates/cashu/src/nuts/nut00.rs @@ -116,13 +116,19 @@ pub mod wallet { #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Token { pub token: Vec, + /// Memo for token + #[serde(skip_serializing_if = "Option::is_none")] pub memo: Option, + #[serde(skip_serializing_if = "Option::is_none")] + /// Unit of the token eg: sats, usd + pub unit: Option, } impl Token { pub fn new( mint_url: UncheckedUrl, proofs: Proofs, + unit: Option, memo: Option, ) -> Result { if proofs.is_empty() { @@ -135,6 +141,7 @@ pub mod wallet { Ok(Self { token: vec![MintProofs::new(mint_url, proofs)], memo, + unit, }) } @@ -316,6 +323,7 @@ mod tests { UncheckedUrl::from_str("https://localhost:5000/cashu").unwrap(), proof, None, + None, ) .unwrap();