From 4b3eca23e980bf96cacb6139ea396ace09986365 Mon Sep 17 00:00:00 2001 From: thesimplekid Date: Tue, 20 Aug 2024 12:08:35 +0200 Subject: [PATCH] fix: check mint and melt quotes are within settings --- crates/cdk/src/mint/error.rs | 18 ++++++++++++ crates/cdk/src/mint/mod.rs | 54 ++++++++++++++++++++++++++++++++++++ crates/cdk/src/nuts/nut04.rs | 15 ++++++++++ crates/cdk/src/nuts/nut05.rs | 15 ++++++++++ 4 files changed, 102 insertions(+) diff --git a/crates/cdk/src/mint/error.rs b/crates/cdk/src/mint/error.rs index 619d24ae..52d91b7c 100644 --- a/crates/cdk/src/mint/error.rs +++ b/crates/cdk/src/mint/error.rs @@ -62,6 +62,24 @@ pub enum Error { /// Sig all cannot be used in melt #[error("Sig all cannot be used in melt")] SigAllUsedInMelt, + /// Minting is disabled + #[error("Minting is disabled")] + MintingDisabled, + /// Minting request is over mint limit + #[error("Mint request is over mint limit")] + MintOverLimit, + /// Mint request is uver mint limit + #[error("Mint request is under mint limit")] + MintUnderLimit, + /// Melting is disabled + #[error("Minting is disabled")] + MeltingDisabled, + /// Melting request is over mint limit + #[error("Mint request is over mint limit")] + MeltOverLimit, + /// Melt request is uver mint limit + #[error("Mint request is under mint limit")] + MeltUnderLimit, /// Cashu Error #[error(transparent)] Cashu(#[from] crate::error::Error), diff --git a/crates/cdk/src/mint/mod.rs b/crates/cdk/src/mint/mod.rs index ce2268c4..214fa020 100644 --- a/crates/cdk/src/mint/mod.rs +++ b/crates/cdk/src/mint/mod.rs @@ -201,6 +201,33 @@ impl Mint { expiry: u64, ln_lookup: String, ) -> Result { + let nut04 = &self.mint_info.nuts.nut04; + + if nut04.disabled { + return Err(Error::MintingDisabled); + } + + match nut04.get_settings(&unit, &PaymentMethod::Bolt11) { + Some(settings) => { + if settings + .max_amount + .map_or(false, |max_amount| amount > max_amount) + { + return Err(Error::MintOverLimit); + } + + if settings + .min_amount + .map_or(false, |min_amount| amount < min_amount) + { + return Err(Error::MintUnderLimit); + } + } + None => { + return Err(Error::UnsupportedUnit); + } + } + let quote = MintQuote::new(mint_url, request, unit, amount, expiry, ln_lookup.clone()); tracing::debug!( "New mint quote {} for {} {} with request id {}", @@ -320,6 +347,33 @@ impl Mint { expiry: u64, request_lookup_id: String, ) -> Result { + let nut05 = &self.mint_info.nuts.nut05; + + if nut05.disabled { + return Err(Error::MeltingDisabled); + } + + match nut05.get_settings(&unit, &PaymentMethod::Bolt11) { + Some(settings) => { + if settings + .max_amount + .map_or(false, |max_amount| amount > max_amount) + { + return Err(Error::MeltOverLimit); + } + + if settings + .min_amount + .map_or(false, |min_amount| amount < min_amount) + { + return Err(Error::MeltUnderLimit); + } + } + None => { + return Err(Error::UnsupportedUnit); + } + } + let quote = MeltQuote::new( request, unit, diff --git a/crates/cdk/src/nuts/nut04.rs b/crates/cdk/src/nuts/nut04.rs index 4ce0da75..79216bec 100644 --- a/crates/cdk/src/nuts/nut04.rs +++ b/crates/cdk/src/nuts/nut04.rs @@ -222,6 +222,21 @@ impl Settings { pub fn new(methods: Vec, disabled: bool) -> Self { Self { methods, disabled } } + + /// Get [`MintMethodSettings`] for unit method pair + pub fn get_settings( + &self, + unit: &CurrencyUnit, + method: &PaymentMethod, + ) -> Option { + for method_settings in self.methods.iter() { + if method_settings.method.eq(method) && method_settings.unit.eq(unit) { + return Some(method_settings.clone()); + } + } + + None + } } impl Default for Settings { diff --git a/crates/cdk/src/nuts/nut05.rs b/crates/cdk/src/nuts/nut05.rs index 0b7015cb..63041278 100644 --- a/crates/cdk/src/nuts/nut05.rs +++ b/crates/cdk/src/nuts/nut05.rs @@ -257,6 +257,21 @@ impl Settings { pub fn new(methods: Vec, disabled: bool) -> Self { Self { methods, disabled } } + + /// Get [`MeltMethodSettings`] for unit method pair + pub fn get_settings( + &self, + unit: &CurrencyUnit, + method: &PaymentMethod, + ) -> Option { + for method_settings in self.methods.iter() { + if method_settings.method.eq(method) && method_settings.unit.eq(unit) { + return Some(method_settings.clone()); + } + } + + None + } } /// Melt Settings