diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 0bdf09e87..705ce698d 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -202,7 +202,14 @@ fn sanity_check_psbt( } // Check the feerate isn't insane. - let tx_vb = (tx.vsize() + spent_desc.max_sat_vbytes() * tx.input.len()) as u64; + // Add weights together before converting to vbytes to avoid rounding up multiple times + // and increasing the result, which could lead to the feerate in sats/vb falling below 1. + let tx_wu = tx.weight().to_wu() + (spent_desc.max_sat_weight() * tx.input.len()) as u64; + let tx_vb = tx_wu + .checked_add(descriptors::WITNESS_FACTOR as u64 - 1) + .unwrap() + .checked_div(descriptors::WITNESS_FACTOR as u64) + .unwrap(); let feerate_sats_vb = abs_fee .checked_div(tx_vb) .ok_or(CommandError::InsaneFees(InsaneFeeInfo::InvalidFeerate))?; diff --git a/src/descriptors/mod.rs b/src/descriptors/mod.rs index 72f1a9191..f5b1564e6 100644 --- a/src/descriptors/mod.rs +++ b/src/descriptors/mod.rs @@ -17,7 +17,7 @@ pub use keys::*; pub mod analysis; pub use analysis::*; -const WITNESS_FACTOR: usize = 4; +pub const WITNESS_FACTOR: usize = 4; #[derive(Debug)] pub enum LianaDescError {