diff --git a/src/avalanche/proof.cpp b/src/avalanche/proof.cpp --- a/src/avalanche/proof.cpp +++ b/src/avalanche/proof.cpp @@ -91,6 +91,14 @@ return state.Invalid(ProofValidationResult::MISSING_UTXO); } + if (s.isCoinbase() != coin.IsCoinBase()) { + return state.Invalid(ProofValidationResult::COINBASE_MISMATCH); + } + + if (s.getHeight() != coin.GetHeight()) { + return state.Invalid(ProofValidationResult::HEIGHT_MISMATCH); + } + const CTxOut &out = coin.GetTxOut(); if (s.getAmount() != out.nValue) { // Wrong amount. diff --git a/src/avalanche/test/proof_tests.cpp b/src/avalanche/test/proof_tests.cpp --- a/src/avalanche/test/proof_tests.cpp +++ b/src/avalanche/test/proof_tests.cpp @@ -376,6 +376,14 @@ runCheck(ProofValidationResult::NONE, pkh_outpoint, value, height, false, key); + // Coinbase mismatch + runCheck(ProofValidationResult::COINBASE_MISMATCH, pkh_outpoint, value, + height, true, key); + + // Height mismatch + runCheck(ProofValidationResult::HEIGHT_MISMATCH, pkh_outpoint, value, + height + 1, false, key); + // Amount mismatch runCheck(ProofValidationResult::AMOUNT_MISMATCH, pkh_outpoint, value + 1 * SATOSHI, height, false, key); diff --git a/src/avalanche/validation.h b/src/avalanche/validation.h --- a/src/avalanche/validation.h +++ b/src/avalanche/validation.h @@ -18,6 +18,8 @@ // UTXO based errors. MISSING_UTXO, + COINBASE_MISMATCH, + HEIGHT_MISMATCH, AMOUNT_MISMATCH, NON_STANDARD_DESTINATION, DESTINATION_NOT_SUPPORTED,