diff --git a/crates/cashu/src/nuts/mod.rs b/crates/cashu/src/nuts/mod.rs index 93ac6c87..c59a0e1b 100644 --- a/crates/cashu/src/nuts/mod.rs +++ b/crates/cashu/src/nuts/mod.rs @@ -4,12 +4,11 @@ pub mod nut02; pub mod nut03; pub mod nut04; pub mod nut05; +pub mod nut06; #[cfg(feature = "nut07")] pub mod nut07; #[cfg(feature = "nut08")] pub mod nut08; -#[cfg(feature = "nut09")] -pub mod nut09; #[cfg(feature = "wallet")] pub use nut00::wallet::{PreMint, PreMintSecrets, Token}; @@ -26,12 +25,11 @@ pub use nut04::{ #[cfg(not(feature = "nut08"))] pub use nut05::{MeltBolt11Request, MeltBolt11Response}; pub use nut05::{MeltQuoteBolt11Request, MeltQuoteBolt11Response}; +pub use nut06::{MintInfo, MintVersion}; #[cfg(feature = "wallet")] #[cfg(feature = "nut07")] pub use nut07::{CheckSpendableRequest, CheckSpendableResponse}; #[cfg(feature = "nut08")] pub use nut08::{MeltBolt11Request, MeltBolt11Response}; -#[cfg(feature = "nut09")] -pub use nut09::MintInfo; pub type Proofs = Vec; diff --git a/crates/cashu/src/nuts/nut04.rs b/crates/cashu/src/nuts/nut04.rs index ab83d4ca..644eea0c 100644 --- a/crates/cashu/src/nuts/nut04.rs +++ b/crates/cashu/src/nuts/nut04.rs @@ -51,3 +51,10 @@ pub struct MintBolt11Response { /// Blinded Signatures pub signatures: Vec, } + +/// Mint Settings +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct Settings { + methods: Vec<(String, CurrencyUnit)>, + disabled: bool, +} diff --git a/crates/cashu/src/nuts/nut05.rs b/crates/cashu/src/nuts/nut05.rs index fffd1270..ddc95e78 100644 --- a/crates/cashu/src/nuts/nut05.rs +++ b/crates/cashu/src/nuts/nut05.rs @@ -54,3 +54,10 @@ pub struct MeltBolt11Response { /// Bolt11 preimage pub payment_preimage: String, } + +/// Melt Settings +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(transparent)] +pub struct Settings { + methods: Vec<(String, CurrencyUnit)>, +} diff --git a/crates/cashu/src/nuts/nut09.rs b/crates/cashu/src/nuts/nut06.rs similarity index 56% rename from crates/cashu/src/nuts/nut09.rs rename to crates/cashu/src/nuts/nut06.rs index 0ed5f56d..b62d5817 100644 --- a/crates/cashu/src/nuts/nut09.rs +++ b/crates/cashu/src/nuts/nut06.rs @@ -1,9 +1,13 @@ //! Mint Information // https://github.com/cashubtc/nuts/blob/main/09.md +use std::collections::HashMap; + use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde_json::Value; use super::nut01::PublicKey; +use super::{nut04, nut05}; /// Mint Version #[derive(Debug, Clone, PartialEq, Eq)] @@ -61,9 +65,64 @@ pub struct MintInfo { #[serde(skip_serializing_if = "Option::is_none")] pub contact: Option>>, /// shows which NUTs the mint supports - #[serde(skip_serializing_if = "Vec::is_empty")] - pub nuts: Vec, + #[serde(deserialize_with = "deserialize_nuts")] + pub nuts: HashMap, /// message of the day that the wallet must display to the user #[serde(skip_serializing_if = "Option::is_none")] pub motd: Option, } + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(untagged)] +pub enum NutSettings { + Nut04(nut04::Settings), + Nut05(nut05::Settings), + Optional(OptionalSettings), + UnknownNut(Value), +} + +fn deserialize_nuts<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let b: Vec<_> = Deserialize::deserialize(deserializer)?; + + let h: HashMap = HashMap::from_iter(b); + + let mut nuts: HashMap = HashMap::with_capacity(h.capacity()); + + for (num, nut) in h { + let nut_settings = match num { + 4 => { + let settings: nut04::Settings = serde_json::from_str(&nut).unwrap(); + + NutSettings::Nut04(settings) + } + 5 => { + let settings: nut05::Settings = serde_json::from_str(&nut).unwrap(); + + NutSettings::Nut05(settings) + } + 7..=10 | 12 => { + let settings: OptionalSettings = serde_json::from_str(&nut).unwrap(); + + NutSettings::Optional(settings) + } + _ => { + let settings: Value = serde_json::from_str(&nut).unwrap(); + + NutSettings::UnknownNut(settings) + } + }; + nuts.insert(num, nut_settings); + } + + Ok(nuts) +} + +/// Spendable Settings +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(transparent)] +pub struct OptionalSettings { + supported: bool, +}