]> Untitled Git - bdk/commitdiff
refactor(bdk): display CreateTxError::FeeRateTooLow in sat/vb
authorvmammal <valuedmammal@protonmail.com>
Thu, 16 Nov 2023 23:13:44 +0000 (18:13 -0500)
committervmammal <valuedmammal@protonmail.com>
Fri, 22 Mar 2024 03:32:00 +0000 (23:32 -0400)
Also modify a unit test `test_bump_fee_low_fee_rate` to
additionally assert the expected error message

crates/bdk/src/wallet/error.rs
crates/bdk/src/wallet/mod.rs
crates/bdk/tests/wallet.rs

index 548dc783fa30ab29b6feb60f44629dd904593c9c..46cf8ef3c706ef47df3ab509c7ee44f9a64fc484 100644 (file)
@@ -168,8 +168,10 @@ where
             CreateTxError::FeeRateTooLow { required } => {
                 write!(
                     f,
-                    "Fee rate too low: required {} sat/kwu",
-                    required.to_sat_per_kwu()
+                    // Note: alternate fmt as sat/vb (ceil) available in bitcoin-0.31
+                    //"Fee rate too low: required {required:#}"
+                    "Fee rate too low: required {} sat/vb",
+                    crate::floating_rate!(required)
                 )
             }
             CreateTxError::NoUtxosSelected => {
index 3b133602f7a7d21bf4b4e5a719f7cbe30473e95e..8cb1bbebc8906fc9396dba1ad4a5b77cff2e0579 100644 (file)
@@ -2563,6 +2563,17 @@ fn create_signers<E: IntoWalletDescriptor>(
     Ok((signers, change_signers))
 }
 
+/// Transforms a [`FeeRate`] to `f64` with unit as sat/vb.
+#[macro_export]
+#[doc(hidden)]
+macro_rules! floating_rate {
+    ($rate:expr) => {{
+        use $crate::bitcoin::blockdata::constants::WITNESS_SCALE_FACTOR;
+        // sat_kwu / 250.0 -> sat_vb
+        $rate.to_sat_per_kwu() as f64 / ((1000 / WITNESS_SCALE_FACTOR) as f64)
+    }};
+}
+
 #[macro_export]
 #[doc(hidden)]
 /// Macro for getting a wallet for use in a doctest
index a0a91616119c36b6574dd056393a53c7b8488317..821afd7577a55f365382cc11d4697f0d7aaad4da 100644 (file)
@@ -1488,7 +1488,6 @@ fn test_bump_fee_confirmed_tx() {
 }
 
 #[test]
-#[should_panic(expected = "FeeRateTooLow")]
 fn test_bump_fee_low_fee_rate() {
     let (mut wallet, _) = get_funded_wallet(get_test_wpkh());
     let addr = wallet.get_address(New);
@@ -1497,6 +1496,7 @@ fn test_bump_fee_low_fee_rate() {
         .add_recipient(addr.script_pubkey(), 25_000)
         .enable_rbf();
     let psbt = builder.finish().unwrap();
+    let feerate = psbt.fee_rate().unwrap();
 
     let tx = psbt.extract_tx();
     let txid = tx.txid();
@@ -1506,8 +1506,18 @@ fn test_bump_fee_low_fee_rate() {
         .unwrap();
 
     let mut builder = wallet.build_fee_bump(txid).unwrap();
-    builder.fee_rate(FeeRate::from_sat_per_vb_unchecked(1));
-    builder.finish().unwrap();
+    builder.fee_rate(FeeRate::BROADCAST_MIN);
+    let res = builder.finish();
+    assert_matches!(
+        res,
+        Err(CreateTxError::FeeRateTooLow { .. }),
+        "expected FeeRateTooLow error"
+    );
+
+    let required = feerate.to_sat_per_kwu() + 250; // +1 sat/vb
+    let sat_vb = required as f64 / 250.0;
+    let expect = format!("Fee rate too low: required {} sat/vb", sat_vb);
+    assert_eq!(res.unwrap_err().to_string(), expect);
 }
 
 #[test]