diff --git a/crates/esploda/src/bitcoind/tx.rs b/crates/esploda/src/bitcoind/tx.rs index ee889a2..9f126e0 100644 --- a/crates/esploda/src/bitcoind/tx.rs +++ b/crates/esploda/src/bitcoind/tx.rs @@ -200,7 +200,9 @@ impl Transaction { /// /// # Panics /// - /// Asserts that `previous_outputs` and `self.inputs` have the same number of non-coinbase TXOs. + /// - Asserts that the computed `fee` is not negative. + /// - Asserts that `previous_outputs` and `self.inputs` have the same number of non-coinbase + /// TXOs. /// /// [`esplora::Transaction`]: crate::esplora::Transaction pub fn into_esplora( @@ -208,7 +210,12 @@ impl Transaction { block_height: u32, previous_outputs: Vec, ) -> crate::esplora::Transaction { - let fee = previous_outputs.iter().map(|txo| txo.value).sum(); + let prev_outputs: Decimal = previous_outputs.iter().map(|txo| txo.value).sum(); + let outputs: Decimal = self.outputs.iter().map(|txo| txo.value).sum(); + + let fee = prev_outputs - outputs; + assert!(!fee.is_sign_negative(), "Fee must never be negative"); + let mut previous_outputs = previous_outputs.into_iter(); let inputs = self .inputs