24#include <validation.h>
33#include <boost/test/unit_test.hpp>
63 opts.limits.cluster_size_vbytes = 1'200'000;
79constexpr static struct {
82}
BLOCKINFO[]{{0, 3552706918}, {500, 37506755}, {1000, 948987788}, {400, 524762339}, {800, 258510074}, {300, 102309278},
83 {1300, 54365202}, {600, 1107740426}, {1000, 203094491}, {900, 391178848}, {800, 381177271}, {600, 87188412},
84 {0, 66522866}, {800, 874942736}, {1000, 89200838}, {400, 312638088}, {400, 66263693}, {500, 924648304},
85 {400, 369913599}, {500, 47630099}, {500, 115045364}, {100, 277026602}, {1100, 809621409}, {700, 155345322},
86 {800, 943579953}, {400, 28200730}, {900, 77200495}, {0, 105935488}, {400, 698721821}, {500, 111098863},
87 {1300, 445389594}, {500, 621849894}, {1400, 56010046}, {1100, 370669776}, {1200, 380301940}, {1200, 110654905},
88 {400, 213771024}, {1500, 120014726}, {1200, 835019014}, {1500, 624817237}, {900, 1404297}, {400, 189414558},
89 {400, 293178348}, {1100, 15393789}, {600, 396764180}, {800, 1387046371}, {800, 199368303}, {700, 111496662},
90 {100, 129759616}, {200, 536577982}, {500, 125881300}, {500, 101053391}, {1200, 471590548}, {900, 86957729},
91 {1200, 179604104}, {600, 68658642}, {1000, 203295701}, {500, 139615361}, {900, 233693412}, {300, 153225163},
92 {0, 27616254}, {1200, 9856191}, {100, 220392722}, {200, 66257599}, {1100, 145489641}, {1300, 37859442},
93 {400, 5816075}, {1200, 215752117}, {1400, 32361482}, {1400, 6529223}, {500, 143332977}, {800, 878392},
94 {700, 159290408}, {400, 123197595}, {700, 43988693}, {300, 304224916}, {700, 214771621}, {1100, 274148273},
95 {400, 285632418}, {1100, 923451065}, {600, 12818092}, {1200, 736282054}, {1000, 246683167}, {600, 92950402},
96 {1400, 29223405}, {1000, 841327192}, {700, 174301283}, {1400, 214009854}, {1000, 6989517}, {1200, 278226956},
97 {700, 540219613}, {400, 93663104}, {1100, 152345635}, {1500, 464194499}, {1300, 333850111}, {600, 258311263},
98 {600, 90173162}, {1000, 33590797}, {1500, 332866027}, {100, 204704427}, {1000, 463153545}, {800, 303244785},
99 {600, 88096214}, {0, 137477892}, {1200, 195514506}, {300, 704114595}, {900, 292087369}, {1400, 758684870},
100 {1300, 163493028}, {1200, 53151293}};
104 auto index{std::make_unique<CBlockIndex>()};
106 index->pprev = active_chain_tip;
113void MinerTestingSetup::TestPackageSelection(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
117 BlockAssembler::Options options;
118 options.coinbase_output_script = scriptPubKey;
119 options.include_dummy_extranonce =
true;
125 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options);
126 BOOST_REQUIRE(block_template);
127 CBlock block{block_template->getBlock()};
128 BOOST_REQUIRE_EQUAL(block.vtx.size(), 1U);
131 auto should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
132 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
135 block_template = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 0});
136 BOOST_REQUIRE(block_template);
146 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
147 tx.
vin[0].prevout.n = 0;
149 tx.
vout[0].nValue = 5000000000LL - 1000;
156 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
157 tx.
vout[0].nValue = 5000000000LL - 10000;
163 tx.
vin[0].prevout.hash = hashParentTx;
164 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
169 block_template = mining->createNewBlock(options);
170 BOOST_REQUIRE(block_template);
171 block = block_template->getBlock();
172 BOOST_REQUIRE_EQUAL(block.vtx.size(), 4U);
173 BOOST_CHECK(block.vtx[1]->GetHash() == hashParentTx);
174 BOOST_CHECK(block.vtx[2]->GetHash() == hashHighFeeTx);
175 BOOST_CHECK(block.vtx[3]->GetHash() == hashMediumFeeTx);
178 const auto block_package_feerates =
BlockAssembler{
m_node.
chainman->ActiveChainstate(), &tx_mempool, options}.CreateNewBlock()->m_package_feerates;
182 const auto combined_txs_fee = parent_tx.GetFee() + high_fee_tx.GetFee();
183 const auto combined_txs_size = parent_tx.GetTxSize() + high_fee_tx.GetTxSize();
184 FeeFrac package_feefrac{combined_txs_fee, combined_txs_size};
186 BOOST_CHECK(block_package_feerates[0] == package_feefrac);
189 FeeFrac medium_tx_feefrac{medium_fee_tx.GetFee(), medium_fee_tx.GetTxSize()};
190 BOOST_CHECK(block_package_feerates[1] == medium_tx_feefrac);
193 tx.
vin[0].prevout.hash = hashHighFeeTx;
194 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
203 tx.
vin[0].prevout.hash = hashFreeTx;
204 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse;
209 should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
210 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
212 block = block_template->getBlock();
214 for (
size_t i=0; i<block.vtx.size(); ++i) {
215 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx);
216 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx);
223 tx.
vout[0].nValue -= 2;
228 block_template = block_template->waitNext({.fee_threshold = 1});
229 BOOST_REQUIRE(block_template);
230 block = block_template->getBlock();
231 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
232 BOOST_CHECK(block.vtx[4]->GetHash() == hashFreeTx);
233 BOOST_CHECK(block.vtx[5]->GetHash() == hashLowFeeTx);
238 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
240 tx.
vout[0].nValue = 5000000000LL - 100000000;
241 tx.
vout[1].nValue = 100000000;
250 tx.
vin[0].prevout.hash = hashFreeTx2;
253 tx.
vout[0].nValue = 5000000000LL - 100000000 - feeToUse;
256 block_template = mining->createNewBlock(options);
257 BOOST_REQUIRE(block_template);
258 block = block_template->getBlock();
261 for (
size_t i=0; i<block.vtx.size(); ++i) {
262 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx2);
263 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx2);
268 tx.
vin[0].prevout.n = 1;
269 tx.
vout[0].nValue = 100000000 - 10000;
271 block_template = mining->createNewBlock(options);
272 BOOST_REQUIRE(block_template);
273 block = block_template->getBlock();
274 BOOST_REQUIRE_EQUAL(block.vtx.size(), 9U);
275 BOOST_CHECK(block.vtx[8]->GetHash() == hashLowFeeTx2);
280 std::vector<CTransactionRef>
ret;
287 tx.
vin[0].prevout.hash = first_tx->GetHash();
288 tx.
vin[0].prevout.n = 0;
291 out.nValue = first_tx->vout[0].nValue / 50;
297 ret.push_back(parent_tx);
303 for (
unsigned int i = 0; i < 50; ++i) {
306 tx2.vin[0].prevout.hash = parent_tx->GetHash();
307 tx2.vin[0].prevout.n = i;
310 tx2.vout[0].nValue = parent_tx->vout[i].nValue -
CENT;
311 for (
auto &
out : tx2.vout) {
320void MinerTestingSetup::TestBasicMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst,
int baseheight)
334 BOOST_REQUIRE(mining);
336 BlockAssembler::Options options;
337 options.coinbase_output_script = scriptPubKey;
338 options.include_dummy_extranonce =
true;
345 auto block_template{mining->createNewBlock(options)};
346 BOOST_REQUIRE(block_template);
347 CBlock block{block_template->getBlock()};
351 int64_t legacy_sigops = 0;
352 for (
auto& t : txs) {
357 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
359 assert(tx_mempool.mapTx.size() == 51);
360 assert(legacy_sigops == 20001);
361 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-blk-sigops"));
369 assert(tx_mempool.mapTx.empty());
372 auto block_template{mining->createNewBlock(options)};
373 BOOST_REQUIRE(block_template);
374 CBlock block{block_template->getBlock()};
378 int64_t legacy_sigops = 0;
379 for (
auto& t : txs) {
382 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
384 assert(tx_mempool.mapTx.size() == 51);
385 assert(legacy_sigops == 20001);
387 BOOST_REQUIRE(mining->createNewBlock(options));
397 tx.
vout[0].nValue = BLOCKSUBSIDY;
399 std::vector<unsigned char> vchData(520);
400 for (
unsigned int i = 0; i < 18; ++i) {
406 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
407 tx.
vin[0].prevout.n = 0;
408 tx.
vout[0].nValue = BLOCKSUBSIDY;
409 for (
unsigned int i = 0; i < 63; ++i) {
410 tx.
vout[0].nValue -= LOWFEE;
415 tx.
vin[0].prevout.hash = hash;
417 BOOST_REQUIRE(mining->createNewBlock(options));
427 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
436 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
437 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
440 tx.
vin[0].prevout.hash = hash;
443 tx.
vin[1].prevout.hash = txFirst[0]->GetHash();
444 tx.
vin[1].prevout.n = 0;
445 tx.
vout[0].nValue = tx.
vout[0].nValue + BLOCKSUBSIDY - HIGHERFEE;
448 BOOST_REQUIRE(mining->createNewBlock(options));
457 tx.
vin[0].prevout.SetNull();
459 tx.
vout[0].nValue = 0;
464 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-cb-multiple"));
472 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
474 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
481 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
501 BOOST_REQUIRE(mining->createNewBlock(options));
513 BOOST_REQUIRE(mining->createNewBlock(options));
516 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
517 tx.
vin[0].prevout.n = 0;
519 tx.
vout[0].nValue = BLOCKSUBSIDY - LOWFEE;
524 tx.
vin[0].prevout.hash = hash;
526 tx.
vout[0].nValue -= LOWFEE;
529 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"block-script-verify-flag-failed"));
548 std::vector<int> prevheights;
553 prevheights.resize(1);
554 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
555 tx.
vin[0].prevout.n = 0;
558 prevheights[0] = baseheight + 1;
560 tx.
vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
574 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
576 prevheights[0] = baseheight + 2;
582 const int SEQUENCE_LOCK_TIME = 512;
592 ancestor->nTime -= SEQUENCE_LOCK_TIME;
596 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
598 prevheights[0] = baseheight + 3;
611 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
613 prevheights.resize(1);
614 prevheights[0] = baseheight + 4;
622 tx.
vin[0].prevout.hash = hash;
623 prevheights[0] =
m_node.
chainman->ActiveChain().Tip()->nHeight + 1;
625 tx.
vin[0].nSequence = 0;
628 tx.
vin[0].nSequence = 1;
635 auto block_template = mining->createNewBlock(options);
636 BOOST_REQUIRE(block_template);
642 CBlock block{block_template->getBlock()};
647 ancestor->nTime += SEQUENCE_LOCK_TIME;
652 block_template = mining->createNewBlock(options);
653 BOOST_REQUIRE(block_template);
654 block = block_template->getBlock();
658void MinerTestingSetup::TestPrioritisedMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
661 BOOST_REQUIRE(mining);
663 BlockAssembler::Options options;
664 options.coinbase_output_script = scriptPubKey;
665 options.include_dummy_extranonce =
true;
675 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
676 tx.
vin[0].prevout.n = 0;
679 tx.
vout[0].nValue = 5000000000LL;
682 tx_mempool.PrioritiseTransaction(hashFreePrioritisedTx, 5 *
COIN);
684 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
685 tx.
vin[0].prevout.n = 0;
686 tx.
vout[0].nValue = 5000000000LL - 1000;
692 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
693 tx.
vout[0].nValue = 5000000000LL - 10000;
696 tx_mempool.PrioritiseTransaction(hashMediumFeeTx, -5 *
COIN);
699 tx.
vin[0].prevout.hash = hashParentTx;
700 tx.
vout[0].nValue = 5000000000LL - 1000 - 1000;
703 tx_mempool.PrioritiseTransaction(hashPrioritsedChild, 2 *
COIN);
711 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
712 tx.
vout[0].nValue = 5000000000LL;
715 tx_mempool.PrioritiseTransaction(hashFreeParent, 10 *
COIN);
717 tx.
vin[0].prevout.hash = hashFreeParent;
718 tx.
vout[0].nValue = 5000000000LL;
721 tx_mempool.PrioritiseTransaction(hashFreeChild, 1 *
COIN);
723 tx.
vin[0].prevout.hash = hashFreeChild;
724 tx.
vout[0].nValue = 5000000000LL;
728 auto block_template = mining->createNewBlock(options);
729 BOOST_REQUIRE(block_template);
730 CBlock block{block_template->getBlock()};
731 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
732 BOOST_CHECK(block.vtx[1]->GetHash() == hashFreeParent);
733 BOOST_CHECK(block.vtx[2]->GetHash() == hashFreePrioritisedTx);
734 BOOST_CHECK(block.vtx[3]->GetHash() == hashParentTx);
735 BOOST_CHECK(block.vtx[4]->GetHash() == hashPrioritsedChild);
736 BOOST_CHECK(block.vtx[5]->GetHash() == hashFreeChild);
737 for (
size_t i=0; i<block.vtx.size(); ++i) {
739 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeGrandchild);
741 BOOST_CHECK(block.vtx[i]->GetHash() != hashMediumFeeTx);
749 BOOST_REQUIRE(mining);
752 CScript scriptPubKey =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
753 BlockAssembler::Options options;
754 options.coinbase_output_script = scriptPubKey;
755 options.include_dummy_extranonce =
true;
758 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options);
759 BOOST_REQUIRE(block_template);
761 CBlock block{block_template->getBlock()};
765 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = false}, reason, debug));
766 BOOST_REQUIRE_EQUAL(reason,
"bad-txnmrklroot");
767 BOOST_REQUIRE_EQUAL(debug,
"hashMerkleRoot mismatch");
775 BOOST_REQUIRE(mining->checkBlock(block, {.check_pow = false}, reason, debug));
776 BOOST_REQUIRE_EQUAL(reason,
"");
777 BOOST_REQUIRE_EQUAL(debug,
"");
789 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = true}, reason, debug));
790 BOOST_REQUIRE_EQUAL(reason,
"high-hash");
791 BOOST_REQUIRE_EQUAL(debug,
"proof of work failed");
797 static_assert(std::size(
BLOCKINFO) == 110,
"Should have 110 blocks to import");
799 std::vector<CTransactionRef> txFirst;
801 const int current_height{mining->getTip()->height};
808 if (current_height % 2 == 0) {
809 block_template = mining->createNewBlock(options);
810 BOOST_REQUIRE(block_template);
813 CBlock block{block_template->getBlock()};
820 txCoinbase.
vin[0].scriptSig =
CScript{} << (current_height + 1) << bi.extranonce;
821 txCoinbase.
vout.resize(1);
824 if (txFirst.size() == 0)
825 baseheight = current_height;
826 if (txFirst.size() < 4)
827 txFirst.push_back(block.vtx[0]);
829 block.nNonce = bi.nonce;
831 std::shared_ptr<const CBlock> shared_pblock = std::make_shared<const CBlock>(block);
835 if (current_height % 2 == 0) {
838 BOOST_REQUIRE(block_template->submitSolution(block.nVersion, block.nTime, block.nNonce,
MakeTransactionRef(txCoinbase)));
845 BOOST_REQUIRE_EQUAL(maybe_new_tip->GetBlockHash(), block.GetHash());
847 if (current_height % 2 == 0) {
848 block_template = block_template->waitNext();
849 BOOST_REQUIRE(block_template);
852 mining->waitTipChanged(block.hashPrevBlock);
858 TestBasicMining(scriptPubKey, txFirst, baseheight);
863 TestPackageSelection(scriptPubKey, txFirst);
868 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.
TryAddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(), 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.
static const int WITNESS_SCALE_FACTOR
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.
std::vector< CTransactionRef > CreateBigSigOpsCluster(const CTransactionRef &first_tx)
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)
std::shared_ptr< const CTransaction > CTransactionRef
uint64_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)
unsigned int GetLegacySigOpCount(const CTransaction &tx)
Auxiliary functions for transaction validation (ideally should not be exposed)
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.