32 static const auto testing_setup = MakeNoLogFileContext<>();
33 g_setup = testing_setup.get();
38 static const auto testing_setup = MakeNoLogFileContext<>();
39 g_setup = testing_setup.get();
54 std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider,
TX_WITH_WITNESS);
63 const std::optional<CMutableTransaction> another_mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider,
TX_WITH_WITNESS);
68 if (fuzzed_data_provider.
ConsumeBool() && !mtx->vin.empty()) {
69 mtx->
vin[0].prevout =
COutPoint{another_tx.GetHash(), 0};
88 FeeFrac last_chunk = diagram.front();
89 for (
size_t i = 1; i<diagram.size(); ++i) {
90 FeeFrac next_chunk = diagram[i] - diagram[i-1];
91 assert(next_chunk <= last_chunk);
92 last_chunk = next_chunk;
101 std::optional<CMutableTransaction> child = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider,
TX_WITH_WITNESS);
107 std::vector<CTransaction> mempool_txs;
114 int64_t running_vsize_total{replacement_vsize};
121 std::optional<CMutableTransaction> parent = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider,
TX_WITH_WITNESS);
126 parent->vin.resize(1);
129 mempool_txs.emplace_back(*parent);
131 running_vsize_total += parent_entry.GetTxSize();
132 if (running_vsize_total > std::numeric_limits<int32_t>::max()) {
134 mempool_txs.pop_back();
137 pool.addUnchecked(parent_entry);
138 if (fuzzed_data_provider.
ConsumeBool() && !child->vin.empty()) {
139 child->vin[0].prevout =
COutPoint{mempool_txs.back().GetHash(), 0};
141 mempool_txs.emplace_back(*child);
143 running_vsize_total += child_entry.GetTxSize();
144 if (running_vsize_total > std::numeric_limits<int32_t>::max()) {
146 mempool_txs.pop_back();
149 pool.addUnchecked(child_entry);
152 pool.PrioritiseTransaction(mempool_txs.back().GetHash().ToUint256(), fuzzed_data_provider.
ConsumeIntegralInRange<int32_t>(-100000, 100000));
158 for (
auto& tx : mempool_txs) {
160 direct_conflicts.insert(*pool.GetIter(tx.GetHash()));
166 for (
auto& txiter : direct_conflicts) {
167 pool.CalculateDescendants(txiter, all_conflicts);
172 auto calc_results{pool.CalculateFeerateDiagramsForRBF(replacement_fees, replacement_vsize, direct_conflicts, all_conflicts)};
174 if (calc_results.has_value()) {
178 assert(calc_results->first.front().size == 0);
179 assert(calc_results->first.front().fee == 0);
180 assert(calc_results->second.front().size == 0);
181 assert(calc_results->second.front().fee == 0);
187 int64_t replaced_size{0};
188 for (
auto txiter : all_conflicts) {
189 replaced_fee += txiter->GetModifiedFee();
190 replaced_size += txiter->GetTxSize();
194 assert(calc_results->first.back().fee - replaced_fee + replacement_fees == calc_results->second.back().fee);
195 assert(calc_results->first.back().size - replaced_size + replacement_vsize == calc_results->second.back().size);
199 auto err_tuple{
ImprovesFeerateDiagram(pool, direct_conflicts, all_conflicts, replacement_fees, replacement_vsize)};
200 if (!calc_results.has_value()) {
204 if (!err_tuple.has_value()) {
206 assert(calc_results->first.back().fee <= calc_results->second.back().fee);
207 }
else if (calc_results->first.back().fee > calc_results->second.back().fee) {
int64_t CAmount
Amount in satoshis (Can be negative)
An outpoint - a combination of a transaction hash and an index n into its vout.
The basic transaction that is broadcasted on the network and contained in blocks.
const std::vector< CTxIn > vin
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
std::set< txiter, CompareIteratorByHash > setEntries
T ConsumeIntegralInRange(T min, T max)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
std::optional< std::pair< DiagramCheckError, std::string > > ImprovesFeerateDiagram(CTxMemPool &pool, const CTxMemPool::setEntries &direct_conflicts, const CTxMemPool::setEntries &all_conflicts, CAmount replacement_fees, int64_t replacement_vsize)
The replacement transaction must improve the feerate diagram of the mempool.
RBFTransactionState IsRBFOptIn(const CTransaction &tx, const CTxMemPool &pool)
Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This inv...
@ FAILURE
New diagram wasn't strictly superior
@ UNCALCULABLE
Unable to calculate due to topology or other reason.
static constexpr TransactionSerParams TX_WITH_WITNESS
Data structure storing a fee and size, ordered by increasing fee/size.
FUZZ_TARGET(rbf,.init=initialize_rbf)
std::vector< COutPoint > g_outpoints
void CheckDiagramConcave(std::vector< FeeFrac > &diagram)
void initialize_package_rbf()
CTxMemPoolEntry ConsumeTxMemPoolEntry(FuzzedDataProvider &fuzzed_data_provider, const CTransaction &tx) noexcept
int64_t ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
CAmount ConsumeMoney(FuzzedDataProvider &fuzzed_data_provider, const std::optional< CAmount > &max) noexcept
CTxMemPool::Options MemPoolOptionsForTest(const NodeContext &node)
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.