diff --git a/src/lib.rs b/src/lib.rs index 1523dff9..9c2658ff 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)] @@ -391,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"))]