From 85ea5fff742451c323d7a3530a0021808364c0fd Mon Sep 17 00:00:00 2001 From: thesimplekid Date: Wed, 12 Feb 2025 12:27:05 +0000 Subject: [PATCH] feat: use checked addition for u64 --- crates/cdk-lnbits/src/error.rs | 3 +++ crates/cdk-lnbits/src/lib.rs | 8 +++++++- crates/cdk-lnd/src/error.rs | 3 +++ crates/cdk-lnd/src/lib.rs | 8 +++++++- crates/cdk-phoenixd/src/error.rs | 3 +++ crates/cdk-phoenixd/src/lib.rs | 2 +- crates/cdk/src/fees.rs | 8 +++++--- 7 files changed, 29 insertions(+), 6 deletions(-) diff --git a/crates/cdk-lnbits/src/error.rs b/crates/cdk-lnbits/src/error.rs index c968376d..dd906f96 100644 --- a/crates/cdk-lnbits/src/error.rs +++ b/crates/cdk-lnbits/src/error.rs @@ -11,6 +11,9 @@ pub enum Error { /// Unknown invoice #[error("Unknown invoice")] UnknownInvoice, + /// Amount overflow + #[error("Amount overflow")] + AmountOverflow, /// Anyhow error #[error(transparent)] Anyhow(#[from] anyhow::Error), diff --git a/crates/cdk-lnbits/src/lib.rs b/crates/cdk-lnbits/src/lib.rs index b9c07159..a4938229 100644 --- a/crates/cdk-lnbits/src/lib.rs +++ b/crates/cdk-lnbits/src/lib.rs @@ -205,7 +205,13 @@ impl MintLightning for LNbits { false => MeltQuoteState::Paid, }; - let total_spent = Amount::from((invoice_info.amount + invoice_info.fee).unsigned_abs()); + let total_spent = Amount::from( + (invoice_info + .amount + .checked_add(invoice_info.fee) + .ok_or(Error::AmountOverflow)?) + .unsigned_abs(), + ); Ok(PayInvoiceResponse { payment_lookup_id: pay_response.payment_hash, diff --git a/crates/cdk-lnd/src/error.rs b/crates/cdk-lnd/src/error.rs index 7dad0c83..197705c9 100644 --- a/crates/cdk-lnd/src/error.rs +++ b/crates/cdk-lnd/src/error.rs @@ -27,6 +27,9 @@ pub enum Error { /// Missing last hop in route #[error("LND missing last hop in route")] MissingLastHop, + /// Amount overflow + #[error("Amount overflow")] + AmountOverflow, /// Errors coming from the backend #[error("LND error: `{0}`")] LndError(Status), diff --git a/crates/cdk-lnd/src/lib.rs b/crates/cdk-lnd/src/lib.rs index ae2a36ed..9b1770d9 100644 --- a/crates/cdk-lnd/src/lib.rs +++ b/crates/cdk-lnd/src/lib.rs @@ -506,7 +506,13 @@ impl MintLightning for Lnd { payment_lookup_id: payment_hash.to_string(), payment_preimage: Some(update.payment_preimage), status: MeltQuoteState::Paid, - total_spent: Amount::from((update.value_sat + update.fee_sat) as u64), + total_spent: Amount::from( + (update + .value_sat + .checked_add(update.fee_sat) + .ok_or(Error::AmountOverflow)?) + as u64, + ), unit: CurrencyUnit::Sat, }, PaymentStatus::Failed => PayInvoiceResponse { diff --git a/crates/cdk-phoenixd/src/error.rs b/crates/cdk-phoenixd/src/error.rs index 85e56c4e..aa91d34f 100644 --- a/crates/cdk-phoenixd/src/error.rs +++ b/crates/cdk-phoenixd/src/error.rs @@ -14,6 +14,9 @@ pub enum Error { /// Unsupported unit #[error("Unit Unsupported")] UnsupportedUnit, + /// Amount overflow + #[error("Amount overflow")] + AmountOverflow, /// phd error #[error(transparent)] Phd(#[from] phoenixd_rs::Error), diff --git a/crates/cdk-phoenixd/src/lib.rs b/crates/cdk-phoenixd/src/lib.rs index 151ab2e7..b0993341 100644 --- a/crates/cdk-phoenixd/src/lib.rs +++ b/crates/cdk-phoenixd/src/lib.rs @@ -176,7 +176,7 @@ impl MintLightning for Phoenixd { }; // Fee in phoenixd is always 0.04 + 4 sat - fee += 4; + fee = fee.checked_add(4).ok_or(Error::AmountOverflow)?; Ok(PaymentQuoteResponse { request_lookup_id: melt_quote_request.request.payment_hash().to_string(), diff --git a/crates/cdk/src/fees.rs b/crates/cdk/src/fees.rs index 42abb8a3..69cb39f7 100644 --- a/crates/cdk/src/fees.rs +++ b/crates/cdk/src/fees.rs @@ -15,7 +15,7 @@ pub fn calculate_fee( proofs_count: &HashMap, keyset_fee: &HashMap, ) -> Result { - let mut sum_fee = 0; + let mut sum_fee: u64 = 0; for (keyset_id, proof_count) in proofs_count { let keyset_fee_ppk = keyset_fee @@ -24,10 +24,12 @@ pub fn calculate_fee( let proofs_fee = keyset_fee_ppk * proof_count; - sum_fee += proofs_fee; + sum_fee = sum_fee + .checked_add(proofs_fee) + .ok_or(Error::AmountOverflow)?; } - let fee = (sum_fee + 999) / 1000; + let fee = (sum_fee.checked_add(999).ok_or(Error::AmountOverflow)?) / 1000; Ok(fee.into()) }