diff --git a/verification/src/accept_block.rs b/verification/src/accept_block.rs index 5e158a33..9dfaaf59 100644 --- a/verification/src/accept_block.rs +++ b/verification/src/accept_block.rs @@ -127,8 +127,16 @@ impl<'a> BlockRule for BlockCoinbaseClaim<'a> { let claim = self.block.transactions[0].raw.total_spends(); let (fees, overflow) = available.overflowing_sub(spends); - let (reward, overflow2) = fees.overflowing_add(block_reward_satoshi(self.height)); - if overflow || overflow2 || claim > reward { + if overflow { + return Err(Error::TransactionFeesOverflow); + } + + let (reward, overflow) = fees.overflowing_add(block_reward_satoshi(self.height)); + if overflow { + return Err(Error::TransactionFeeAndRewardOverflow); + } + + if claim > reward { Err(Error::CoinbaseOverspend { expected_max: reward, actual: claim }) } else { Ok(()) diff --git a/verification/src/error.rs b/verification/src/error.rs index 3bbfb1e6..72b2f8f0 100644 --- a/verification/src/error.rs +++ b/verification/src/error.rs @@ -36,6 +36,10 @@ pub enum Error { NonFinalBlock, /// Old version block. OldVersionBlock, + /// Sum of the transaction fees in block + coinbase reward exceeds u64::max + TransactionFeeAndRewardOverflow, + /// Sum of the transaction fees in block exceeds u64::max + TransactionFeesOverflow, } #[derive(Debug, PartialEq)]