24#include <validation.h>
33#include <boost/test/unit_test.hpp>
74constexpr static struct {
77}
BLOCKINFO[]{{0, 3552706918}, {500, 37506755}, {1000, 948987788}, {400, 524762339}, {800, 258510074}, {300, 102309278},
78 {1300, 54365202}, {600, 1107740426}, {1000, 203094491}, {900, 391178848}, {800, 381177271}, {600, 87188412},
79 {0, 66522866}, {800, 874942736}, {1000, 89200838}, {400, 312638088}, {400, 66263693}, {500, 924648304},
80 {400, 369913599}, {500, 47630099}, {500, 115045364}, {100, 277026602}, {1100, 809621409}, {700, 155345322},
81 {800, 943579953}, {400, 28200730}, {900, 77200495}, {0, 105935488}, {400, 698721821}, {500, 111098863},
82 {1300, 445389594}, {500, 621849894}, {1400, 56010046}, {1100, 370669776}, {1200, 380301940}, {1200, 110654905},
83 {400, 213771024}, {1500, 120014726}, {1200, 835019014}, {1500, 624817237}, {900, 1404297}, {400, 189414558},
84 {400, 293178348}, {1100, 15393789}, {600, 396764180}, {800, 1387046371}, {800, 199368303}, {700, 111496662},
85 {100, 129759616}, {200, 536577982}, {500, 125881300}, {500, 101053391}, {1200, 471590548}, {900, 86957729},
86 {1200, 179604104}, {600, 68658642}, {1000, 203295701}, {500, 139615361}, {900, 233693412}, {300, 153225163},
87 {0, 27616254}, {1200, 9856191}, {100, 220392722}, {200, 66257599}, {1100, 145489641}, {1300, 37859442},
88 {400, 5816075}, {1200, 215752117}, {1400, 32361482}, {1400, 6529223}, {500, 143332977}, {800, 878392},
89 {700, 159290408}, {400, 123197595}, {700, 43988693}, {300, 304224916}, {700, 214771621}, {1100, 274148273},
90 {400, 285632418}, {1100, 923451065}, {600, 12818092}, {1200, 736282054}, {1000, 246683167}, {600, 92950402},
91 {1400, 29223405}, {1000, 841327192}, {700, 174301283}, {1400, 214009854}, {1000, 6989517}, {1200, 278226956},
92 {700, 540219613}, {400, 93663104}, {1100, 152345635}, {1500, 464194499}, {1300, 333850111}, {600, 258311263},
93 {600, 90173162}, {1000, 33590797}, {1500, 332866027}, {100, 204704427}, {1000, 463153545}, {800, 303244785},
94 {600, 88096214}, {0, 137477892}, {1200, 195514506}, {300, 704114595}, {900, 292087369}, {1400, 758684870},
95 {1300, 163493028}, {1200, 53151293}};
99 auto index{std::make_unique<CBlockIndex>()};
101 index->pprev = active_chain_tip;
108void MinerTestingSetup::TestPackageSelection(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
112 BlockAssembler::Options options;
113 options.coinbase_output_script = scriptPubKey;
119 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options);
120 BOOST_REQUIRE(block_template);
121 CBlock block{block_template->getBlock()};
122 BOOST_REQUIRE_EQUAL(block.vtx.size(), 1U);
125 auto should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
126 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
129 block_template = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 0});
130 BOOST_REQUIRE(block_template);
140 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
141 tx.
vin[0].prevout.n = 0;
143 tx.
vout[0].nValue = 5000000000LL - 1000;
150 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
151 tx.
vout[0].nValue = 5000000000LL - 10000;
157 tx.
vin[0].prevout.hash = hashParentTx;
158 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
163 block_template = mining->createNewBlock(options);
164 BOOST_REQUIRE(block_template);
165 block = block_template->getBlock();
166 BOOST_REQUIRE_EQUAL(block.vtx.size(), 4U);
167 BOOST_CHECK(block.vtx[1]->GetHash() == hashParentTx);
168 BOOST_CHECK(block.vtx[2]->GetHash() == hashHighFeeTx);
169 BOOST_CHECK(block.vtx[3]->GetHash() == hashMediumFeeTx);
172 const auto block_package_feerates =
BlockAssembler{
m_node.
chainman->ActiveChainstate(), &tx_mempool, options}.CreateNewBlock()->m_package_feerates;
176 const auto combined_txs_fee = parent_tx.GetFee() + high_fee_tx.GetFee();
177 const auto combined_txs_size = parent_tx.GetTxSize() + high_fee_tx.GetTxSize();
178 FeeFrac package_feefrac{combined_txs_fee, combined_txs_size};
180 BOOST_CHECK(block_package_feerates[0] == package_feefrac);
183 FeeFrac medium_tx_feefrac{medium_fee_tx.GetFee(), medium_fee_tx.GetTxSize()};
184 BOOST_CHECK(block_package_feerates[1] == medium_tx_feefrac);
187 tx.
vin[0].prevout.hash = hashHighFeeTx;
188 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
197 tx.
vin[0].prevout.hash = hashFreeTx;
198 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse;
203 should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
204 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
206 block = block_template->getBlock();
208 for (
size_t i=0; i<block.vtx.size(); ++i) {
209 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx);
210 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx);
217 tx.
vout[0].nValue -= 2;
222 block_template = block_template->waitNext({.fee_threshold = 1});
223 BOOST_REQUIRE(block_template);
224 block = block_template->getBlock();
225 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
226 BOOST_CHECK(block.vtx[4]->GetHash() == hashFreeTx);
227 BOOST_CHECK(block.vtx[5]->GetHash() == hashLowFeeTx);
232 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
234 tx.
vout[0].nValue = 5000000000LL - 100000000;
235 tx.
vout[1].nValue = 100000000;
244 tx.
vin[0].prevout.hash = hashFreeTx2;
247 tx.
vout[0].nValue = 5000000000LL - 100000000 - feeToUse;
250 block_template = mining->createNewBlock(options);
251 BOOST_REQUIRE(block_template);
252 block = block_template->getBlock();
255 for (
size_t i=0; i<block.vtx.size(); ++i) {
256 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx2);
257 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx2);
262 tx.
vin[0].prevout.n = 1;
263 tx.
vout[0].nValue = 100000000 - 10000;
265 block_template = mining->createNewBlock(options);
266 BOOST_REQUIRE(block_template);
267 block = block_template->getBlock();
268 BOOST_REQUIRE_EQUAL(block.vtx.size(), 9U);
269 BOOST_CHECK(block.vtx[8]->GetHash() == hashLowFeeTx2);
272void MinerTestingSetup::TestBasicMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst,
int baseheight)
286 BOOST_REQUIRE(mining);
288 BlockAssembler::Options options;
289 options.coinbase_output_script = scriptPubKey;
296 auto block_template{mining->createNewBlock(options)};
297 BOOST_REQUIRE(block_template);
298 CBlock block{block_template->getBlock()};
304 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
305 tx.
vin[0].prevout.n = 0;
307 tx.
vout[0].nValue = BLOCKSUBSIDY;
308 for (
unsigned int i = 0; i < 1001; ++i) {
309 tx.
vout[0].nValue -= LOWFEE;
314 tx.
vin[0].prevout.hash = hash;
317 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-blk-sigops"));
324 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
325 tx.
vout[0].nValue = BLOCKSUBSIDY;
326 for (
unsigned int i = 0; i < 1001; ++i) {
327 tx.
vout[0].nValue -= LOWFEE;
332 tx.
vin[0].prevout.hash = hash;
334 BOOST_REQUIRE(mining->createNewBlock(options));
344 std::vector<unsigned char> vchData(520);
345 for (
unsigned int i = 0; i < 18; ++i) {
349 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
350 tx.
vout[0].nValue = BLOCKSUBSIDY;
351 for (
unsigned int i = 0; i < 128; ++i) {
352 tx.
vout[0].nValue -= LOWFEE;
356 tx.
vin[0].prevout.hash = hash;
358 BOOST_REQUIRE(mining->createNewBlock(options));
368 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
377 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
378 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
381 tx.
vin[0].prevout.hash = hash;
384 tx.
vin[1].prevout.hash = txFirst[0]->GetHash();
385 tx.
vin[1].prevout.n = 0;
386 tx.
vout[0].nValue = tx.
vout[0].nValue + BLOCKSUBSIDY - HIGHERFEE;
389 BOOST_REQUIRE(mining->createNewBlock(options));
398 tx.
vin[0].prevout.SetNull();
400 tx.
vout[0].nValue = 0;
405 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-cb-multiple"));
413 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
415 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
422 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
442 BOOST_REQUIRE(mining->createNewBlock(options));
454 BOOST_REQUIRE(mining->createNewBlock(options));
457 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
458 tx.
vin[0].prevout.n = 0;
460 tx.
vout[0].nValue = BLOCKSUBSIDY - LOWFEE;
465 tx.
vin[0].prevout.hash = hash;
467 tx.
vout[0].nValue -= LOWFEE;
470 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"block-script-verify-flag-failed"));
489 std::vector<int> prevheights;
494 prevheights.resize(1);
495 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
496 tx.
vin[0].prevout.n = 0;
499 prevheights[0] = baseheight + 1;
501 tx.
vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
515 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
517 prevheights[0] = baseheight + 2;
523 const int SEQUENCE_LOCK_TIME = 512;
533 ancestor->nTime -= SEQUENCE_LOCK_TIME;
537 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
539 prevheights[0] = baseheight + 3;
552 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
554 prevheights.resize(1);
555 prevheights[0] = baseheight + 4;
563 tx.
vin[0].prevout.hash = hash;
564 prevheights[0] =
m_node.
chainman->ActiveChain().Tip()->nHeight + 1;
566 tx.
vin[0].nSequence = 0;
569 tx.
vin[0].nSequence = 1;
576 auto block_template = mining->createNewBlock(options);
577 BOOST_REQUIRE(block_template);
583 CBlock block{block_template->getBlock()};
588 ancestor->nTime += SEQUENCE_LOCK_TIME;
593 block_template = mining->createNewBlock(options);
594 BOOST_REQUIRE(block_template);
595 block = block_template->getBlock();
599void MinerTestingSetup::TestPrioritisedMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
602 BOOST_REQUIRE(mining);
604 BlockAssembler::Options options;
605 options.coinbase_output_script = scriptPubKey;
615 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
616 tx.
vin[0].prevout.n = 0;
619 tx.
vout[0].nValue = 5000000000LL;
622 tx_mempool.PrioritiseTransaction(hashFreePrioritisedTx, 5 *
COIN);
624 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
625 tx.
vin[0].prevout.n = 0;
626 tx.
vout[0].nValue = 5000000000LL - 1000;
632 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
633 tx.
vout[0].nValue = 5000000000LL - 10000;
636 tx_mempool.PrioritiseTransaction(hashMediumFeeTx, -5 *
COIN);
639 tx.
vin[0].prevout.hash = hashParentTx;
640 tx.
vout[0].nValue = 5000000000LL - 1000 - 1000;
643 tx_mempool.PrioritiseTransaction(hashPrioritsedChild, 2 *
COIN);
651 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
652 tx.
vout[0].nValue = 5000000000LL;
655 tx_mempool.PrioritiseTransaction(hashFreeParent, 10 *
COIN);
657 tx.
vin[0].prevout.hash = hashFreeParent;
658 tx.
vout[0].nValue = 5000000000LL;
661 tx_mempool.PrioritiseTransaction(hashFreeChild, 1 *
COIN);
663 tx.
vin[0].prevout.hash = hashFreeChild;
664 tx.
vout[0].nValue = 5000000000LL;
668 auto block_template = mining->createNewBlock(options);
669 BOOST_REQUIRE(block_template);
670 CBlock block{block_template->getBlock()};
671 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
672 BOOST_CHECK(block.vtx[1]->GetHash() == hashFreeParent);
673 BOOST_CHECK(block.vtx[2]->GetHash() == hashFreePrioritisedTx);
674 BOOST_CHECK(block.vtx[3]->GetHash() == hashParentTx);
675 BOOST_CHECK(block.vtx[4]->GetHash() == hashPrioritsedChild);
676 BOOST_CHECK(block.vtx[5]->GetHash() == hashFreeChild);
677 for (
size_t i=0; i<block.vtx.size(); ++i) {
679 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeGrandchild);
681 BOOST_CHECK(block.vtx[i]->GetHash() != hashMediumFeeTx);
689 BOOST_REQUIRE(mining);
692 CScript scriptPubKey =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
693 BlockAssembler::Options options;
694 options.coinbase_output_script = scriptPubKey;
697 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options);
698 BOOST_REQUIRE(block_template);
700 CBlock block{block_template->getBlock()};
704 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = false}, reason, debug));
705 BOOST_REQUIRE_EQUAL(reason,
"bad-txnmrklroot");
706 BOOST_REQUIRE_EQUAL(debug,
"hashMerkleRoot mismatch");
714 BOOST_REQUIRE(mining->checkBlock(block, {.check_pow = false}, reason, debug));
715 BOOST_REQUIRE_EQUAL(reason,
"");
716 BOOST_REQUIRE_EQUAL(debug,
"");
728 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = true}, reason, debug));
729 BOOST_REQUIRE_EQUAL(reason,
"high-hash");
730 BOOST_REQUIRE_EQUAL(debug,
"proof of work failed");
736 static_assert(std::size(
BLOCKINFO) == 110,
"Should have 110 blocks to import");
738 std::vector<CTransactionRef> txFirst;
740 const int current_height{mining->getTip()->height};
747 if (current_height % 2 == 0) {
748 block_template = mining->createNewBlock(options);
749 BOOST_REQUIRE(block_template);
752 CBlock block{block_template->getBlock()};
759 txCoinbase.
vin[0].scriptSig =
CScript{} << (current_height + 1) << bi.extranonce;
760 txCoinbase.
vout.resize(1);
763 if (txFirst.size() == 0)
764 baseheight = current_height;
765 if (txFirst.size() < 4)
766 txFirst.push_back(block.vtx[0]);
768 block.nNonce = bi.nonce;
770 std::shared_ptr<const CBlock> shared_pblock = std::make_shared<const CBlock>(block);
774 if (current_height % 2 == 0) {
777 BOOST_REQUIRE(block_template->submitSolution(block.nVersion, block.nTime, block.nNonce,
MakeTransactionRef(txCoinbase)));
784 BOOST_REQUIRE_EQUAL(maybe_new_tip->GetBlockHash(), block.GetHash());
786 if (current_height % 2 == 0) {
787 block_template = block_template->waitNext();
788 BOOST_REQUIRE(block_template);
791 mining->waitTipChanged(block.hashPrevBlock);
797 TestBasicMining(scriptPubKey, txFirst, baseheight);
802 TestPackageSelection(scriptPubKey, txFirst);
807 TestPrioritisedMining(scriptPubKey, txFirst);
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
int64_t CAmount
Amount in satoshis (Can be negative)
static constexpr CAmount COIN
The amount of satoshis in one BTC.
AddToMempool(pool, CTxMemPoolEntry(tx, fee, 0, 1, 0, false, 4, lp))
#define Assert(val)
Identity function.
The block chain is a tree shaped structure starting with the genesis block at the root,...
CBlockIndex * pprev
pointer to the index of the predecessor of this block
void BuildSkip()
Build the skiplist pointer for this entry.
uint256 GetBlockHash() const
int nHeight
height of the entry in the chain. The genesis block has height 0
static constexpr int nMedianTimeSpan
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
CCoinsView that brings transactions from a mempool into view.
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
CAmount GetFee(int32_t virtual_bytes) const
Return the fee in satoshis for the given vsize in vbytes.
Serialized script, used inside transaction inputs and outputs.
The basic transaction that is broadcasted on the network and contained in blocks.
static const uint32_t MAX_SEQUENCE_NONFINAL
This is the maximum sequence number that enables both nLockTime and OP_CHECKLOCKTIMEVERIFY (BIP 65).
static const uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG
If CTxIn::nSequence encodes a relative lock-time and this flag is set, the relative lock-time has uni...
static const int SEQUENCE_LOCKTIME_GRANULARITY
In order to use the same number of bits to encode roughly the same wall-clock duration,...
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
BOOST_CHECK_EXCEPTION predicates to check the specific validation error.
Block template interface.
Interface giving clients (RPC, Stratum v2 Template Provider in the future) ability to create block te...
Generate a new block, without valid proof-of-work.
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
static constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE
Flags for nSequence and nLockTime locks.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
@ REPLACED
Removed for replacement.
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
static constexpr struct @13 BLOCKINFO[]
static std::unique_ptr< CBlockIndex > CreateBlockIndex(int nHeight, CBlockIndex *active_chain_tip) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
static CFeeRate blockMinFeeRate
std::unique_ptr< Mining > MakeMining(node::NodeContext &node)
Return implementation of Mining interface.
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
static constexpr unsigned int DEFAULT_BLOCK_MIN_TX_FEE
Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by min...
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params ¶ms)
Check whether a block hash satisfies the proof-of-work requirement specified by nBits.
static constexpr TransactionSerParams TX_WITH_WITNESS
static CTransactionRef MakeTransactionRef(Tx &&txIn)
size_t GetSerializeSize(const T &t)
static constexpr CAmount CENT
A mutable version of CTransaction.
std::vector< CTxOut > vout
Txid GetHash() const
Compute the hash of this CMutableTransaction.
Data structure storing a fee and size, ordered by increasing fee/size.
TestMemPoolEntryHelper & SigOpsCost(unsigned int _sigopsCost)
TestMemPoolEntryHelper & Time(NodeSeconds tp)
CTxMemPoolEntry FromTx(const CMutableTransaction &tx) const
TestMemPoolEntryHelper & SpendsCoinbase(bool _flag)
TestMemPoolEntryHelper & Fee(CAmount _fee)
Testing setup that configures a complete environment.
std::unique_ptr< Mining > MakeMining()
CTxMemPool & MakeMempool()
void TestPackageSelection(const CScript &scriptPubKey, const std::vector< CTransactionRef > &txFirst) EXCLUSIVE_LOCKS_REQUIRED(void TestBasicMining(const CScript &scriptPubKey, const std::vector< CTransactionRef > &txFirst, int baseheight) EXCLUSIVE_LOCKS_REQUIRED(void TestPrioritisedMining(const CScript &scriptPubKey, const std::vector< CTransactionRef > &txFirst) EXCLUSIVE_LOCKS_REQUIRED(bool TestSequenceLocks(const CTransaction &tx, CTxMemPool &tx_mempool) EXCLUSIVE_LOCKS_REQUIRED(
std::unique_ptr< CTxMemPool > mempool
std::unique_ptr< ChainstateManager > chainman
CTxMemPool::Options MemPoolOptionsForTest(const NodeContext &node)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
void BulkTransaction(CMutableTransaction &tx, int32_t target_weight)
bool SequenceLocks(const CTransaction &tx, int flags, std::vector< int > &prevHeights, const CBlockIndex &block)
Check if transaction is final per BIP 68 sequence numbers and can be included in a block.
bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
Check if transaction is final and can be included in a block with the specified height and time.
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
bool CheckSequenceLocksAtTip(CBlockIndex *tip, const LockPoints &lock_points)
Check if transaction will be BIP68 final in the next block to be created on top of tip.
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx) EXCLUSIVE_LOCKS_REQUIRED(std::optional< LockPoints > CalculateLockPointsAtTip(CBlockIndex *tip, const CCoinsView &coins_view, const CTransaction &tx)
Check if transaction will be final in the next block to be created.
static const int32_t VERSIONBITS_TOP_BITS
What bits to set in version for versionbits blocks.