From 8ca5fd9aeced14f6150ee9f76ca70ac9ce77dd53 Mon Sep 17 00:00:00 2001 From: Chris Guida Date: Tue, 22 Sep 2026 13:25:20 -0600 Subject: [PATCH 1/6] consensus: Release the long coinbase maturity rule by median time past --- src/chainparams.cpp | 18 ++--- src/chainparamsbase.cpp | 2 +- src/consensus/params.h | 35 ++++++-- src/consensus/tx_verify.cpp | 8 +- src/consensus/tx_verify.h | 6 +- src/interfaces/chain.h | 5 +- src/interfaces/node.h | 4 +- src/kernel/chainparams.cpp | 17 ++-- src/kernel/chainparams.h | 4 +- src/node/interfaces.cpp | 6 +- src/qt/transactiondesc.cpp | 2 +- src/rpc/blockchain.cpp | 12 +-- src/rpc/mining.cpp | 2 +- src/test/coinbase_maturity_tests.cpp | 80 ++++++++++++++----- src/test/fuzz/coins_view.cpp | 3 +- .../validation_chainstatemanager_tests.cpp | 19 +++-- src/txmempool.cpp | 3 +- src/validation.cpp | 24 +++--- src/wallet/wallet.cpp | 3 +- .../feature_chainstate_revalidation.py | 4 +- .../mempool_long_coinbase_maturity.py | 55 +++++++------ 21 files changed, 195 insertions(+), 117 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e2851d88c986..e9290743e872 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -104,28 +103,25 @@ void ReadRegTestArgs(const ArgsManager& args, CChainParams::RegTestOptions& opti if (const auto arg{args.GetArg("-testcoinbasematuritylong")}; arg) { const auto values{SplitString(*arg, ':')}; if (values.size() != 3) { - throw std::runtime_error(strprintf("Invalid format (%s) for -testcoinbasematuritylong=::.", *arg)); + throw std::runtime_error(strprintf("Invalid format (%s) for -testcoinbasematuritylong=::.", *arg)); } int32_t start_height; int32_t enforce_height; - int32_t release_height; + int64_t expiry_time; if (!ParseInt32(values[0], &start_height) || start_height < 0 || start_height >= std::numeric_limits::max()) { - throw std::runtime_error(strprintf("Invalid start height (%s) for -testcoinbasematuritylong=::.", values[0])); + throw std::runtime_error(strprintf("Invalid start height (%s) for -testcoinbasematuritylong=::.", values[0])); } if (!ParseInt32(values[1], &enforce_height) || enforce_height < 2 || enforce_height >= std::numeric_limits::max()) { - throw std::runtime_error(strprintf("Invalid enforce height (%s) for -testcoinbasematuritylong=::.", values[1])); + throw std::runtime_error(strprintf("Invalid enforce height (%s) for -testcoinbasematuritylong=::.", values[1])); } - if (!ParseInt32(values[2], &release_height) || release_height <= start_height || release_height <= enforce_height || release_height >= std::numeric_limits::max()) { - throw std::runtime_error(strprintf("Invalid release height (%s) for -testcoinbasematuritylong=::.", values[2])); - } - if (release_height - start_height <= COINBASE_MATURITY) { - throw std::runtime_error(strprintf("Invalid height range (%s) for -testcoinbasematuritylong=::: release_height - start_height must exceed COINBASE_MATURITY.", *arg)); + if (!ParseInt64(values[2], &expiry_time) || expiry_time <= 0) { + throw std::runtime_error(strprintf("Invalid expiry time (%s) for -testcoinbasematuritylong=::.", values[2])); } options.coinbase_maturity_long_start_height = start_height; options.coinbase_maturity_long_enforce_height = enforce_height; - options.coinbase_maturity_long_release_height = release_height; + options.coinbase_maturity_long_release_time = expiry_time; } for (const std::string& strDeployment : args.GetArgs("-vbparams")) { diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index de5a866c7c4f..7043197ea915 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -19,7 +19,7 @@ void SetupChainParamsBaseOptions(ArgsManager& argsman) argsman.AddArg("-testactivationheight=name@height.", "Set the activation height of 'name' (segwit, bip34, dersig, cltv, csv, blake2b). (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); argsman.AddArg("-rdtsexpiry=