diff --git a/verification/src/accept_block.rs b/verification/src/accept_block.rs index 9843b1dd..3d7630a6 100644 --- a/verification/src/accept_block.rs +++ b/verification/src/accept_block.rs @@ -175,11 +175,21 @@ impl<'a> BlockCoinbaseClaim<'a> { let prevout = store.transaction_output(&input.previous_output, tx_idx); let (sum, overflow) = incoming.overflowing_add(prevout.map(|o| o.value).unwrap_or(0)); if overflow { - return Err(Error::ReferencedInputsSumOverflow); + return Err(Error::ReferencedInputsSumOverflow) } incoming = sum; } + let join_split_public_new = tx.raw.join_split.iter() + .flat_map(|js| &js.descriptions) + .map(|d| d.value_pub_new) + .sum::(); + + incoming = match incoming.overflowing_add(join_split_public_new) { + (_, true) => return Err(Error::ReferencedInputsSumOverflow), + (incoming, _) => incoming, + }; + // (2) Total sum of all outputs let spends = tx.raw.total_spends(); diff --git a/verification/src/accept_transaction.rs b/verification/src/accept_transaction.rs index d9c603e9..ee77380b 100644 --- a/verification/src/accept_transaction.rs +++ b/verification/src/accept_transaction.rs @@ -220,13 +220,20 @@ impl<'a> TransactionOverspent<'a> { return Ok(()); } - let available = self.transaction.raw.inputs.iter() + let available_public = self.transaction.raw.inputs.iter() .map(|input| self.store.transaction_output(&input.previous_output, usize::max_value()).map(|o| o.value).unwrap_or(0)) .sum::(); + let available_join_split = self.transaction.raw.join_split.iter() + .flat_map(|js| &js.descriptions) + .map(|d| d.value_pub_new) + .sum::(); + + let total_available = available_public + available_join_split; + let spends = self.transaction.raw.total_spends(); - if spends > available { + if spends > total_available { Err(TransactionError::Overspend) } else { Ok(()) @@ -458,5 +465,4 @@ mod tests { .verify_p2sh(true); assert_eq!(verify_script(&input_script, &output_script, &flags, &checker), Ok(())); } - } \ No newline at end of file