@@ -82,17 +82,6 @@ FUZZ_TARGET(rbf, .init = initialize_rbf)
8282 }
8383}
8484
85- void CheckDiagramConcave (std::vector<FeeFrac>& diagram)
86- {
87- // Diagrams are in monotonically-decreasing feerate order.
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;
93- }
94- }
95-
9685FUZZ_TARGET (package_rbf, .init = initialize_package_rbf)
9786{
9887 FuzzedDataProvider fuzzed_data_provider (buffer.data (), buffer.size ());
@@ -107,7 +96,7 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
10796 std::vector<CTransaction> mempool_txs;
10897 size_t iter{0 };
10998
110- int64_t replacement_vsize = fuzzed_data_provider.ConsumeIntegralInRange <int64_t >(1 , 1000000 );
99+ int32_t replacement_vsize = fuzzed_data_provider.ConsumeIntegralInRange <int32_t >(1 , 1000000 );
111100
112101 // Keep track of the total vsize of CTxMemPoolEntry's being added to the mempool to avoid overflow
113102 // Add replacement_vsize since this is added to new diagram during RBF check
@@ -167,32 +156,33 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
167156 pool.CalculateDescendants (txiter, all_conflicts);
168157 }
169158
170- // Calculate the feerate diagrams for a replacement.
159+ // Calculate the chunks for a replacement.
171160 CAmount replacement_fees = ConsumeMoney (fuzzed_data_provider);
172- auto calc_results{pool.CalculateFeerateDiagramsForRBF (replacement_fees, replacement_vsize, direct_conflicts, all_conflicts)};
161+ auto calc_results{pool.CalculateChunksForRBF (replacement_fees, replacement_vsize, direct_conflicts, all_conflicts)};
173162
174163 if (calc_results.has_value ()) {
175- // Sanity checks on the diagrams .
164+ // Sanity checks on the chunks .
176165
177- // Diagrams start at 0.
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 );
182-
183- CheckDiagramConcave (calc_results->first );
184- CheckDiagramConcave (calc_results->second );
166+ // Feerates are monotonically decreasing.
167+ FeeFrac first_sum;
168+ for (size_t i = 0 ; i < calc_results->first .size (); ++i) {
169+ first_sum += calc_results->first [i];
170+ if (i) assert (!(calc_results->first [i - 1 ] << calc_results->first [i]));
171+ }
172+ FeeFrac second_sum;
173+ for (size_t i = 0 ; i < calc_results->second .size (); ++i) {
174+ second_sum += calc_results->second [i];
175+ if (i) assert (!(calc_results->second [i - 1 ] << calc_results->second [i]));
176+ }
185177
186- CAmount replaced_fee{0 };
187- int64_t replaced_size{0 };
178+ FeeFrac replaced;
188179 for (auto txiter : all_conflicts) {
189- replaced_fee += txiter->GetModifiedFee ();
190- replaced_size += txiter->GetTxSize ();
180+ replaced. fee += txiter->GetModifiedFee ();
181+ replaced. size += txiter->GetTxSize ();
191182 }
192- // The total fee of the new diagram should be the total fee of the old
193- // diagram - replaced_fee + replacement_fees
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 );
183+ // The total fee & size of the new diagram minus replaced fee & size should be the total
184+ // fee & size of the old diagram minus replacement fee & size.
185+ assert ((first_sum - replaced) == (second_sum - FeeFrac{replacement_fees, replacement_vsize}));
196186 }
197187
198188 // If internals report error, wrapper should too
@@ -201,10 +191,12 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
201191 assert (err_tuple.value ().first == DiagramCheckError::UNCALCULABLE);
202192 } else {
203193 // Diagram check succeeded
194+ auto old_sum = std::accumulate (calc_results->first .begin (), calc_results->first .end (), FeeFrac{});
195+ auto new_sum = std::accumulate (calc_results->second .begin (), calc_results->second .end (), FeeFrac{});
204196 if (!err_tuple.has_value ()) {
205197 // New diagram's final fee should always match or exceed old diagram's
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 ) {
198+ assert (old_sum. fee <= new_sum .fee );
199+ } else if (old_sum. fee > new_sum .fee ) {
208200 // Or it failed, and if old diagram had higher fees, it should be a failure
209201 assert (err_tuple.value ().first == DiagramCheckError::FAILURE);
210202 }
0 commit comments