From ed219e29455a9d38487f50d3862888b73cdb211c Mon Sep 17 00:00:00 2001 From: valued mammal Date: Sat, 22 Jun 2024 16:51:45 -0400 Subject: [PATCH 1/2] fix: don't return default 1.0 feerate if not found by `convert_fee_rate` --- src/lib.rs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1523dff9..c039ed10 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -88,17 +88,14 @@ pub use r#async::AsyncClient; /// Get a fee value in sats/vbytes from the estimates /// that matches the confirmation target set as parameter. -pub fn convert_fee_rate(target: usize, estimates: HashMap) -> Result { - let fee_val = { - let mut pairs = estimates.into_iter().collect::>(); - pairs.sort_unstable_by_key(|(k, _)| std::cmp::Reverse(*k)); - pairs - .into_iter() - .find(|(k, _)| *k as usize <= target) - .map(|(_, v)| v) - .unwrap_or(1.0) - }; - Ok(fee_val as f32) +/// +/// Returns `None` if no feerate estimate is found at or below `target` confirmations. +pub fn convert_fee_rate(target: usize, estimates: HashMap) -> Option { + estimates + .into_iter() + .filter(|(k, _)| *k as usize <= target) + .max_by_key(|(k, _)| *k) + .map(|(_, v)| v as f32) } #[derive(Debug, Clone)] From ec5ee8233011269b2d0bbdf8a1647e27e61b9050 Mon Sep 17 00:00:00 2001 From: valued mammal Date: Thu, 22 Aug 2024 13:58:23 -0400 Subject: [PATCH 2/2] test: improve test `feerate_parsing` --- src/lib.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index c039ed10..9c2658ff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -388,12 +388,17 @@ mod test { "#, ) .unwrap(); + assert!(convert_fee_rate(1, HashMap::new()).is_none()); assert_eq!(convert_fee_rate(6, esplora_fees.clone()).unwrap(), 2.236); assert_eq!( - convert_fee_rate(26, esplora_fees).unwrap(), + convert_fee_rate(26, esplora_fees.clone()).unwrap(), 1.015, "should inherit from value for 25" ); + assert!( + convert_fee_rate(0, esplora_fees).is_none(), + "should not return feerate for 0 target" + ); } #[cfg(all(feature = "blocking", feature = "async"))]