110 std::vector<CTransaction> mempool_txs;
116 if (!replacement_tx) {
119 replacement_tx->vin.resize(1);
120 replacement_tx->vin[0].prevout =
g_outpoints.at(iter++);
123 int32_t replacement_weight = replacement_entry.GetAdjustedWeight();
125 int64_t running_vsize_total{replacement_entry.GetTxSize()};
134 parent.
vin.resize(1);
138 mempool_txs.emplace_back(parent);
140 running_vsize_total += parent_entry.GetTxSize();
143 mempool_txs.pop_back();
151 if(!pool.
GetIter(parent_entry.GetTx().GetHash())) {
152 mempool_txs.pop_back();
156 child.
vin[0].prevout =
COutPoint{mempool_txs.back().GetHash(), 0};
157 mempool_txs.emplace_back(child);
159 running_vsize_total += child_entry.GetTxSize();
162 mempool_txs.pop_back();
165 if (!pool.
GetIter(child_entry.GetTx().GetHash())) {
169 if(!pool.
GetIter(child_entry.GetTx().GetHash())) {
170 mempool_txs.pop_back();
182 for (
auto& tx : mempool_txs) {
184 direct_conflicts.insert(*pool.
GetIter(tx.GetHash()));
190 for (
auto& txiter : direct_conflicts) {
196 for (
auto& txiter : all_conflicts) {
197 changeset->StageRemoval(txiter);
199 changeset->StageAddition(replacement_entry.GetSharedTx(), replacement_fees,
200 replacement_entry.GetTime().count(), replacement_entry.GetHeight(),
201 replacement_entry.GetSequence(), replacement_entry.GetSpendsCoinbase(),
202 replacement_entry.GetSigOpCost(), replacement_entry.GetLockPoints());
204 auto calc_results{changeset->CalculateChunksForRBF()};
206 if (calc_results.has_value()) {
211 for (
size_t i = 0; i < calc_results->first.size(); ++i) {
212 first_sum += calc_results->first[i];
213 if (i)
assert(!(calc_results->first[i - 1] << calc_results->first[i]));
216 for (
size_t i = 0; i < calc_results->second.size(); ++i) {
217 second_sum += calc_results->second[i];
218 if (i)
assert(!(calc_results->second[i - 1] << calc_results->second[i]));
222 for (
auto txiter : all_conflicts) {
223 replaced.
fee += txiter->GetModifiedFee();
224 replaced.
size += txiter->GetAdjustedWeight();
228 assert((first_sum - replaced) == (second_sum -
FeeFrac{replacement_fees, replacement_weight}));
233 if (!calc_results.has_value()) {
237 auto old_sum = std::accumulate(calc_results->first.begin(), calc_results->first.end(),
FeeFrac{});
238 auto new_sum = std::accumulate(calc_results->second.begin(), calc_results->second.end(),
FeeFrac{});
239 if (!err_tuple.has_value()) {
241 assert(old_sum.fee <= new_sum.fee);
242 }
else if (old_sum.fee > new_sum.fee) {
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.