@@ -131,6 +131,53 @@ CTxMemPool MakeMempool(FuzzedDataProvider& fuzzed_data_provider, const NodeConte
131131 return CTxMemPool{mempool_opts};
132132}
133133
134+ void CheckATMPInvariants (const MempoolAcceptResult& res, bool txid_in_mempool, bool wtxid_in_mempool)
135+ {
136+
137+ switch (res.m_result_type ) {
138+ case MempoolAcceptResult::ResultType::VALID:
139+ {
140+ Assert (txid_in_mempool);
141+ Assert (wtxid_in_mempool);
142+ Assert (res.m_state .IsValid ());
143+ Assert (!res.m_state .IsInvalid ());
144+ Assert (res.m_replaced_transactions );
145+ Assert (res.m_vsize );
146+ Assert (res.m_base_fees );
147+ Assert (res.m_effective_feerate );
148+ Assert (res.m_wtxids_fee_calculations );
149+ Assert (!res.m_other_wtxid );
150+ break ;
151+ }
152+ case MempoolAcceptResult::ResultType::INVALID:
153+ {
154+ // It may be already in the mempool since in ATMP cases we don't set MEMPOOL_ENTRY or DIFFERENT_WITNESS
155+ Assert (!res.m_state .IsValid ());
156+ Assert (res.m_state .IsInvalid ());
157+ Assert (!res.m_replaced_transactions );
158+ Assert (!res.m_vsize );
159+ Assert (!res.m_base_fees );
160+ // Unable or unwilling to calculate fees
161+ Assert (!res.m_effective_feerate );
162+ Assert (!res.m_wtxids_fee_calculations );
163+ Assert (!res.m_other_wtxid );
164+ break ;
165+ }
166+ case MempoolAcceptResult::ResultType::MEMPOOL_ENTRY:
167+ {
168+ // ATMP never sets this; only set in package settings
169+ Assert (false );
170+ break ;
171+ }
172+ case MempoolAcceptResult::ResultType::DIFFERENT_WITNESS:
173+ {
174+ // ATMP never sets this; only set in package settings
175+ Assert (false );
176+ break ;
177+ }
178+ }
179+ }
180+
134181FUZZ_TARGET (tx_pool_standard, .init = initialize_tx_pool)
135182{
136183 FuzzedDataProvider fuzzed_data_provider (buffer.data (), buffer.size ());
@@ -258,9 +305,11 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
258305 SyncWithValidationInterfaceQueue ();
259306 UnregisterSharedValidationInterface (txr);
260307
308+ bool txid_in_mempool = tx_pool.exists (GenTxid::Txid (tx->GetHash ()));
309+ bool wtxid_in_mempool = tx_pool.exists (GenTxid::Wtxid (tx->GetWitnessHash ()));
310+ CheckATMPInvariants (res, txid_in_mempool, wtxid_in_mempool);
311+
261312 Assert (accepted != added.empty ());
262- Assert (accepted == res.m_state .IsValid ());
263- Assert (accepted != res.m_state .IsInvalid ());
264313 if (accepted) {
265314 Assert (added.size () == 1 ); // For now, no package acceptance
266315 Assert (tx == *added.begin ());
0 commit comments