43 const size_t cap{
fdp.ConsumeIntegralInRange<
size_t>(1, 12)};
49 std::unordered_map<CTransactionRef, size_t, CTransactionRefHash, CTransactionRefComp> transactions;
51 std::unordered_map<CTransactionRef, size_t, CTransactionRefHash, CTransactionRefComp> planned_sends;
77 if (transactions.empty() ||
fdp.ConsumeBool()) {
78 tx = MakeTransactionRef(ConsumeTransaction(fdp, std::nullopt));
80 tx = PickIterator(fdp, transactions)->first;
87 std::erase_if(transactions, [&](
const auto& entry) {
89 planned_sends.erase(entry.first);
93 std::erase_if(
nodes_sent_to, [&](
const auto& entry) {
return !transactions.contains(entry.second); });
96 const auto res{
pb.Add(tx)};
98 auto tx_it{transactions.find(tx)};
109 }
else if (transactions.size() >=
cap) {
113 transactions.emplace(tx, 0);
118 if (transactions.empty()) {
132 planned_sends.erase(tx);
140 Assert(
pb.MarkResolved(tx) == transactions.contains(tx));
158 const size_t min_picked{std::ranges::min_element(
174 const auto opt_tx{
pb.GetTxForNode(nodeid)};
187 pb.NodeConfirmedReception(nodeid);
191 pb.NodeDisconnected(nodeid);
195 if (std::ranges::any_of(transactions,
is_pending)) {
196 Assert(
pb.HavePendingTransactions());
198 Assert(!
pb.HavePendingTransactions());
202 if (transactions.empty())
return;
210 const auto stale{
pb.GetStale()};
215 const auto it{transactions.find(
stale_tx)};
216 Assert(it != transactions.end());
227 const auto it{transactions.find(info.tx)};
228 Assert(it != transactions.end());
230 Assert(info.peers.size() == it->second);
CMutableTransaction ConsumeTransaction(FuzzedDataProvider &fuzzed_data_provider, const std::optional< std::vector< Txid > > &prevout_txids, const int max_num_in, const int max_num_out) noexcept