@aztec/p2p 0.0.1-commit.d6f2b3f94 → 0.0.1-commit.d939eb5aa

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +7 -7
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +37 -30
  5. package/dest/client/interface.d.ts +22 -20
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +11 -19
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +92 -104
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
  11. package/dest/config.d.ts +128 -96
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +97 -38
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +1 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +0 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +10 -6
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +21 -9
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  27. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  30. package/dest/mem_pools/index.d.ts +1 -2
  31. package/dest/mem_pools/index.d.ts.map +1 -1
  32. package/dest/mem_pools/instrumentation.d.ts +4 -2
  33. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  34. package/dest/mem_pools/instrumentation.js +16 -14
  35. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +30 -13
  36. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +91 -20
  38. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  39. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  51. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  54. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  61. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  62. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  64. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  65. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  67. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  68. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  70. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +28 -10
  71. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  73. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +56 -15
  74. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +113 -20
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +319 -147
  85. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  86. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  88. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  90. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  91. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  92. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  93. package/dest/msg_validators/clock_tolerance.js +54 -3
  94. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  95. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  97. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  98. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  100. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  101. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  103. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  104. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  106. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  107. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  109. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  110. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  112. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  113. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  114. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  116. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  117. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  119. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  120. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/factory.js +247 -60
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  126. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/gas_validator.js +112 -43
  128. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  129. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/index.js +2 -0
  131. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  132. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  134. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  135. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  136. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  137. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  138. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  140. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  141. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  143. package/dest/services/data_store.d.ts +1 -1
  144. package/dest/services/data_store.d.ts.map +1 -1
  145. package/dest/services/data_store.js +5 -5
  146. package/dest/services/dummy_service.d.ts +8 -5
  147. package/dest/services/dummy_service.d.ts.map +1 -1
  148. package/dest/services/dummy_service.js +10 -5
  149. package/dest/services/encoding.d.ts +6 -2
  150. package/dest/services/encoding.d.ts.map +1 -1
  151. package/dest/services/encoding.js +16 -9
  152. package/dest/services/gossipsub/topic_score_params.d.ts +30 -7
  153. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  154. package/dest/services/gossipsub/topic_score_params.js +53 -14
  155. package/dest/services/libp2p/libp2p_service.d.ts +29 -36
  156. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  157. package/dest/services/libp2p/libp2p_service.js +224 -197
  158. package/dest/services/peer-manager/metrics.d.ts +3 -1
  159. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  160. package/dest/services/peer-manager/metrics.js +6 -0
  161. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  162. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  163. package/dest/services/peer-manager/peer_manager.js +39 -11
  164. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  165. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  166. package/dest/services/peer-manager/peer_scoring.js +32 -10
  167. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  168. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  169. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  170. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  171. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  172. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  173. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  174. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  175. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  176. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  178. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  179. package/dest/services/reqresp/config.d.ts +3 -3
  180. package/dest/services/reqresp/config.d.ts.map +1 -1
  181. package/dest/services/reqresp/interface.d.ts +14 -9
  182. package/dest/services/reqresp/interface.d.ts.map +1 -1
  183. package/dest/services/reqresp/interface.js +10 -11
  184. package/dest/services/reqresp/metrics.d.ts +1 -1
  185. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  186. package/dest/services/reqresp/metrics.js +0 -1
  187. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  188. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  189. package/dest/services/reqresp/protocols/index.js +0 -1
  190. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/tx.js +1 -3
  193. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  194. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  195. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  196. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  197. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  199. package/dest/services/reqresp/reqresp.d.ts +4 -2
  200. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  201. package/dest/services/reqresp/reqresp.js +30 -12
  202. package/dest/services/service.d.ts +9 -4
  203. package/dest/services/service.d.ts.map +1 -1
  204. package/dest/services/tx_collection/config.d.ts +13 -1
  205. package/dest/services/tx_collection/config.d.ts.map +1 -1
  206. package/dest/services/tx_collection/config.js +30 -0
  207. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  208. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  210. package/dest/services/tx_collection/file_store_tx_collection.d.ts +38 -29
  211. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  212. package/dest/services/tx_collection/file_store_tx_collection.js +126 -77
  213. package/dest/services/tx_collection/file_store_tx_source.d.ts +17 -6
  214. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  215. package/dest/services/tx_collection/file_store_tx_source.js +53 -10
  216. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  217. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  218. package/dest/services/tx_collection/instrumentation.js +2 -1
  219. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  220. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  221. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  222. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  223. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  224. package/dest/services/tx_collection/request_tracker.js +84 -0
  225. package/dest/services/tx_collection/slow_tx_collection.d.ts +5 -3
  226. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  227. package/dest/services/tx_collection/slow_tx_collection.js +17 -12
  228. package/dest/services/tx_collection/tx_collection.d.ts +9 -9
  229. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  230. package/dest/services/tx_collection/tx_collection.js +26 -10
  231. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  232. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  233. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  234. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  235. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  236. package/dest/services/tx_collection/tx_source.js +26 -7
  237. package/dest/services/tx_file_store/tx_file_store.d.ts +3 -2
  238. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  239. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  240. package/dest/services/tx_provider.d.ts +3 -3
  241. package/dest/services/tx_provider.d.ts.map +1 -1
  242. package/dest/services/tx_provider.js +4 -4
  243. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  244. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  245. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  246. package/dest/test-helpers/mock-pubsub.d.ts +14 -6
  247. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  248. package/dest/test-helpers/mock-pubsub.js +43 -12
  249. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  250. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  251. package/dest/test-helpers/reqresp-nodes.js +3 -4
  252. package/dest/test-helpers/testbench-utils.d.ts +8 -3
  253. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  254. package/dest/test-helpers/testbench-utils.js +30 -4
  255. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  256. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  257. package/dest/testbench/p2p_client_testbench_worker.js +78 -26
  258. package/dest/testbench/worker_client_manager.d.ts +10 -1
  259. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  260. package/dest/testbench/worker_client_manager.js +55 -3
  261. package/dest/util.d.ts +3 -3
  262. package/dest/util.d.ts.map +1 -1
  263. package/package.json +14 -14
  264. package/src/client/factory.ts +68 -48
  265. package/src/client/interface.ts +26 -21
  266. package/src/client/p2p_client.ts +102 -135
  267. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
  268. package/src/config.ts +146 -44
  269. package/src/errors/p2p-service.error.ts +11 -0
  270. package/src/errors/tx-pool.error.ts +12 -0
  271. package/src/index.ts +0 -1
  272. package/src/mem_pools/attestation_pool/attestation_pool.ts +25 -12
  273. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  274. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  275. package/src/mem_pools/index.ts +0 -3
  276. package/src/mem_pools/instrumentation.ts +17 -13
  277. package/src/mem_pools/tx_pool_v2/README.md +52 -28
  278. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +109 -22
  279. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  280. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  281. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  282. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  283. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  284. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  285. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  286. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  287. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  288. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  289. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  290. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  291. package/src/mem_pools/tx_pool_v2/interfaces.ts +30 -10
  292. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +164 -28
  293. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  294. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  295. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +353 -143
  296. package/src/msg_validators/attestation_validator/README.md +49 -0
  297. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  298. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  299. package/src/msg_validators/clock_tolerance.ts +72 -3
  300. package/src/msg_validators/proposal_validator/README.md +123 -0
  301. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  302. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  303. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  304. package/src/msg_validators/tx_validator/README.md +119 -0
  305. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  306. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  307. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  308. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  309. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  310. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  311. package/src/msg_validators/tx_validator/factory.ts +394 -78
  312. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  313. package/src/msg_validators/tx_validator/gas_validator.ts +145 -33
  314. package/src/msg_validators/tx_validator/index.ts +2 -0
  315. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  316. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  317. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  318. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  319. package/src/services/data_store.ts +5 -13
  320. package/src/services/dummy_service.ts +13 -7
  321. package/src/services/encoding.ts +16 -8
  322. package/src/services/gossipsub/README.md +29 -14
  323. package/src/services/gossipsub/topic_score_params.ts +85 -17
  324. package/src/services/libp2p/libp2p_service.ts +240 -225
  325. package/src/services/peer-manager/metrics.ts +7 -0
  326. package/src/services/peer-manager/peer_manager.ts +45 -11
  327. package/src/services/peer-manager/peer_scoring.ts +27 -5
  328. package/src/services/reqresp/README.md +229 -0
  329. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  330. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  331. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  332. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  333. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  334. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  335. package/src/services/reqresp/config.ts +2 -2
  336. package/src/services/reqresp/interface.ts +21 -11
  337. package/src/services/reqresp/metrics.ts +0 -1
  338. package/src/services/reqresp/protocols/index.ts +0 -1
  339. package/src/services/reqresp/protocols/tx.ts +1 -3
  340. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  341. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  342. package/src/services/reqresp/reqresp.ts +40 -13
  343. package/src/services/service.ts +17 -3
  344. package/src/services/tx_collection/config.ts +42 -0
  345. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  346. package/src/services/tx_collection/file_store_tx_collection.ts +143 -93
  347. package/src/services/tx_collection/file_store_tx_source.ts +69 -10
  348. package/src/services/tx_collection/instrumentation.ts +7 -1
  349. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  350. package/src/services/tx_collection/request_tracker.ts +127 -0
  351. package/src/services/tx_collection/slow_tx_collection.ts +17 -13
  352. package/src/services/tx_collection/tx_collection.ts +46 -17
  353. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  354. package/src/services/tx_collection/tx_source.ts +28 -8
  355. package/src/services/tx_file_store/tx_file_store.ts +6 -4
  356. package/src/services/tx_provider.ts +2 -2
  357. package/src/test-helpers/make-test-p2p-clients.ts +1 -3
  358. package/src/test-helpers/mock-pubsub.ts +44 -11
  359. package/src/test-helpers/reqresp-nodes.ts +5 -8
  360. package/src/test-helpers/testbench-utils.ts +41 -6
  361. package/src/testbench/p2p_client_testbench_worker.ts +89 -29
  362. package/src/testbench/worker_client_manager.ts +68 -6
  363. package/src/util.ts +8 -2
  364. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  365. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  366. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  367. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  368. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  369. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  370. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  371. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  372. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  373. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  374. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  375. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  376. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  377. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  378. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  379. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  380. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  381. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  382. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  383. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  384. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  385. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  386. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  387. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  388. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  389. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  390. package/dest/mem_pools/tx_pool/index.js +0 -2
  391. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  392. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  393. package/dest/mem_pools/tx_pool/priority.js +0 -15
  394. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  395. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  396. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  397. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  398. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  399. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  400. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  401. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  402. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  403. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  404. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  405. package/dest/services/reqresp/protocols/block.js +0 -32
  406. package/src/mem_pools/tx_pool/README.md +0 -270
  407. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  408. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  409. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  410. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  411. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  412. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  413. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  414. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  415. package/src/mem_pools/tx_pool/index.ts +0 -2
  416. package/src/mem_pools/tx_pool/priority.ts +0 -20
  417. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  418. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  419. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  420. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,5 +1,6 @@
1
1
  import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import type { Logger } from '@aztec/foundation/log';
3
+ import type { DateProvider } from '@aztec/foundation/timer';
3
4
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
4
5
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
5
6
  import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
@@ -8,6 +9,7 @@ import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
8
9
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
9
10
  import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
10
11
  import { BlockHeader, Tx, TxHash, type TxValidator } from '@aztec/stdlib/tx';
12
+ import type { TelemetryClient } from '@aztec/telemetry-client';
11
13
 
12
14
  import { TxArchive } from './archive/index.js';
13
15
  import { DeletedPool } from './deleted_pool.js';
@@ -21,8 +23,12 @@ import {
21
23
  LowPriorityPreAddRule,
22
24
  NullifierConflictRule,
23
25
  type PoolOperations,
26
+ type PreAddContext,
24
27
  type PreAddPoolAccess,
28
+ TxPoolRejectionCode,
29
+ type TxPoolRejectionError,
25
30
  } from './eviction/index.js';
31
+ import { TxPoolV2Instrumentation } from './instrumentation.js';
26
32
  import {
27
33
  type AddTxsResult,
28
34
  DEFAULT_TX_POOL_V2_CONFIG,
@@ -39,6 +45,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
39
45
  export interface TxPoolV2Callbacks {
40
46
  onTxsAdded: (txs: Tx[], opts: { source?: string }) => void;
41
47
  onTxsRemoved: (txHashes: string[] | bigint[]) => void;
48
+ onTxsMined: (txHashes: string[]) => void;
42
49
  }
43
50
 
44
51
  /**
@@ -55,6 +62,7 @@ export class TxPoolV2Impl {
55
62
  #l2BlockSource: L2BlockSource;
56
63
  #worldStateSynchronizer: WorldStateSynchronizer;
57
64
  #createTxValidator: TxPoolV2Dependencies['createTxValidator'];
65
+ #checkAllowedSetupCalls: TxPoolV2Dependencies['checkAllowedSetupCalls'];
58
66
 
59
67
  // === In-Memory Indices ===
60
68
  #indices: TxPoolIndices = new TxPoolIndices();
@@ -64,6 +72,9 @@ export class TxPoolV2Impl {
64
72
  #archive: TxArchive;
65
73
  #deletedPool: DeletedPool;
66
74
  #evictionManager: EvictionManager;
75
+ #dateProvider: DateProvider;
76
+ #instrumentation: TxPoolV2Instrumentation;
77
+ #evictedTxHashes: Set<string> = new Set();
67
78
  #log: Logger;
68
79
  #callbacks: TxPoolV2Callbacks;
69
80
 
@@ -72,7 +83,9 @@ export class TxPoolV2Impl {
72
83
  archiveStore: AztecAsyncKVStore,
73
84
  deps: TxPoolV2Dependencies,
74
85
  callbacks: TxPoolV2Callbacks,
86
+ telemetry: TelemetryClient,
75
87
  config: Partial<TxPoolV2Config> = {},
88
+ dateProvider: DateProvider,
76
89
  log: Logger,
77
90
  ) {
78
91
  this.#store = store;
@@ -81,10 +94,13 @@ export class TxPoolV2Impl {
81
94
  this.#l2BlockSource = deps.l2BlockSource;
82
95
  this.#worldStateSynchronizer = deps.worldStateSynchronizer;
83
96
  this.#createTxValidator = deps.createTxValidator;
97
+ this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
84
98
 
85
99
  this.#config = { ...DEFAULT_TX_POOL_V2_CONFIG, ...config };
86
100
  this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
87
101
  this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
102
+ this.#dateProvider = dateProvider;
103
+ this.#instrumentation = new TxPoolV2Instrumentation(telemetry, () => this.#indices.getTotalMetadataBytes());
88
104
  this.#log = log;
89
105
  this.#callbacks = callbacks;
90
106
 
@@ -164,16 +180,45 @@ export class TxPoolV2Impl {
164
180
  await this.#txsDB.delete(txHashStr);
165
181
  }
166
182
  });
167
- this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup`);
183
+ this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup`, { txHashes: toDelete });
168
184
  }
169
185
 
170
- async addPendingTxs(txs: Tx[], opts: { source?: string }): Promise<AddTxsResult> {
186
+ async addPendingTxs(txs: Tx[], opts: { source?: string; feeComparisonOnly?: boolean }): Promise<AddTxsResult> {
171
187
  const accepted: TxHash[] = [];
172
188
  const ignored: TxHash[] = [];
173
189
  const rejected: TxHash[] = [];
190
+ const errors = new Map<string, TxPoolRejectionError>();
174
191
  const acceptedPending = new Set<string>();
175
192
 
193
+ // Phase 1: Pre-compute all throwable I/O outside the transaction.
194
+ // If any pre-computation throws, the entire call fails before mutations happen.
195
+ const precomputed = new Map<string, { meta: TxMetaData; minedBlockId: L2BlockId | undefined; isValid: boolean }>();
196
+
197
+ const validator = await this.#createTxValidator();
198
+
199
+ for (const tx of txs) {
200
+ const txHash = tx.getTxHash();
201
+ const txHashStr = txHash.toString();
202
+
203
+ const meta = await buildTxMetaData(tx);
204
+ const minedBlockId = await this.#getMinedBlockId(txHash);
205
+
206
+ // Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction)
207
+ let isValid = true;
208
+ if (!minedBlockId) {
209
+ isValid = await this.#validateMeta(meta, validator);
210
+ }
211
+
212
+ precomputed.set(txHashStr, { meta, minedBlockId, isValid });
213
+ }
214
+
215
+ // Phase 2: Apply mutations inside the transaction using only pre-computed results,
216
+ // in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
176
217
  const poolAccess = this.#createPreAddPoolAccess();
218
+ const preAddContext: PreAddContext | undefined =
219
+ opts.feeComparisonOnly !== undefined
220
+ ? { feeComparisonOnly: opts.feeComparisonOnly, priceBumpPercentage: this.#config.priceBumpPercentage }
221
+ : undefined;
177
222
 
178
223
  await this.#store.transactionAsync(async () => {
179
224
  for (const tx of txs) {
@@ -186,30 +231,46 @@ export class TxPoolV2Impl {
186
231
  continue;
187
232
  }
188
233
 
189
- // Check mined status first (applies to all paths)
190
- const minedBlockId = await this.#getMinedBlockId(txHash);
234
+ const { meta, minedBlockId, isValid } = precomputed.get(txHashStr)!;
191
235
  const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr);
192
236
 
193
237
  if (minedBlockId) {
194
238
  // Already mined - add directly (protection already set if pre-protected)
195
- await this.#addTx(tx, { mined: minedBlockId }, opts);
239
+ await this.#addTx(tx, { mined: minedBlockId }, opts, meta);
196
240
  accepted.push(txHash);
197
241
  } else if (preProtectedSlot !== undefined) {
198
242
  // Pre-protected and not mined - add as protected (bypass validation)
199
- await this.#addTx(tx, { protected: preProtectedSlot }, opts);
243
+ await this.#addTx(tx, { protected: preProtectedSlot }, opts, meta);
200
244
  accepted.push(txHash);
245
+ } else if (!isValid) {
246
+ // Failed pre-computed validation
247
+ rejected.push(txHash);
201
248
  } else {
202
- // Regular pending tx - validate and run pre-add rules
203
- const result = await this.#tryAddRegularPendingTx(tx, opts, poolAccess, acceptedPending, ignored);
249
+ // Regular pending tx - run pre-add rules using pre-computed metadata
250
+ const result = await this.#tryAddRegularPendingTx(
251
+ tx,
252
+ meta,
253
+ opts,
254
+ poolAccess,
255
+ acceptedPending,
256
+ ignored,
257
+ errors,
258
+ preAddContext,
259
+ );
204
260
  if (result.status === 'accepted') {
205
261
  acceptedPending.add(txHashStr);
206
- } else if (result.status === 'rejected') {
207
- rejected.push(txHash);
208
262
  } else {
209
263
  ignored.push(txHash);
210
264
  }
211
265
  }
212
266
  }
267
+
268
+ // Run post-add eviction rules for pending txs (inside transaction for atomicity)
269
+ if (acceptedPending.size > 0) {
270
+ const feePayers = Array.from(acceptedPending).map(txHash => this.#indices.getMetadata(txHash)!.feePayer);
271
+ const uniqueFeePayers = new Set<string>(feePayers);
272
+ await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [...uniqueFeePayers]);
273
+ }
213
274
  });
214
275
 
215
276
  // Build final accepted list for pending txs (excludes intra-batch evictions)
@@ -217,96 +278,124 @@ export class TxPoolV2Impl {
217
278
  accepted.push(TxHash.fromString(txHashStr));
218
279
  }
219
280
 
220
- // Run post-add eviction rules for pending txs
221
- if (acceptedPending.size > 0) {
222
- const feePayers = Array.from(acceptedPending).map(txHash => this.#indices.getMetadata(txHash)!.feePayer);
223
- const uniqueFeePayers = new Set<string>(feePayers);
224
- await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [...uniqueFeePayers]);
281
+ // Record metrics
282
+ if (ignored.length > 0) {
283
+ this.#instrumentation.recordIgnored(ignored.length);
284
+ }
285
+ if (rejected.length > 0) {
286
+ this.#instrumentation.recordRejected(rejected.length);
225
287
  }
226
288
 
227
- return { accepted, ignored, rejected };
289
+ return { accepted, ignored, rejected, ...(errors.size > 0 ? { errors } : {}) };
228
290
  }
229
291
 
230
- /** Validates and adds a regular pending tx. Returns status. */
292
+ /** Adds a validated pending tx, running pre-add rules and evicting conflicts. */
231
293
  async #tryAddRegularPendingTx(
232
294
  tx: Tx,
295
+ precomputedMeta: TxMetaData,
233
296
  opts: { source?: string },
234
297
  poolAccess: PreAddPoolAccess,
235
298
  acceptedPending: Set<string>,
236
299
  ignored: TxHash[],
237
- ): Promise<{ status: 'accepted' | 'ignored' | 'rejected' }> {
238
- const txHash = tx.getTxHash();
239
- const txHashStr = txHash.toString();
240
-
241
- // Build metadata and validate using metadata
242
- const meta = await buildTxMetaData(tx);
243
- if (!(await this.#validateMeta(meta))) {
244
- return { status: 'rejected' };
245
- }
300
+ errors: Map<string, TxPoolRejectionError>,
301
+ preAddContext?: PreAddContext,
302
+ ): Promise<{ status: 'accepted' | 'ignored' }> {
303
+ const txHashStr = tx.getTxHash().toString();
246
304
 
247
305
  // Run pre-add rules
248
- const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
306
+ const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext);
249
307
 
250
308
  if (preAddResult.shouldIgnore) {
251
- this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason}`);
309
+ this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`);
310
+ if (preAddResult.reason && preAddResult.reason.code !== TxPoolRejectionCode.INTERNAL_ERROR) {
311
+ errors.set(txHashStr, preAddResult.reason);
312
+ }
252
313
  return { status: 'ignored' };
253
314
  }
254
315
 
255
- // Evict conflicts
256
- for (const evictHashStr of preAddResult.txHashesToEvict) {
257
- await this.#deleteTx(evictHashStr);
258
- this.#log.debug(`Evicted tx ${evictHashStr} due to higher-fee tx ${txHashStr}`);
259
- if (acceptedPending.has(evictHashStr)) {
260
- // Evicted tx was from this batch - mark as ignored in result
261
- acceptedPending.delete(evictHashStr);
262
- ignored.push(TxHash.fromString(evictHashStr));
316
+ // Evict conflicts, grouped by rule name for metrics
317
+ if (preAddResult.evictions && preAddResult.evictions.length > 0) {
318
+ const byReason = new Map<string, string[]>();
319
+ for (const { txHash: evictHash, reason } of preAddResult.evictions) {
320
+ const group = byReason.get(reason);
321
+ if (group) {
322
+ group.push(evictHash);
323
+ } else {
324
+ byReason.set(reason, [evictHash]);
325
+ }
326
+ }
327
+ for (const [reason, hashes] of byReason) {
328
+ await this.#evictTxs(hashes, reason);
329
+ }
330
+ for (const evictHashStr of preAddResult.txHashesToEvict) {
331
+ this.#log.debug(`Evicted tx ${evictHashStr} due to higher-fee tx ${txHashStr}`, {
332
+ evictedTxHash: evictHashStr,
333
+ replacementTxHash: txHashStr,
334
+ });
335
+ if (acceptedPending.has(evictHashStr)) {
336
+ // Evicted tx was from this batch - mark as ignored in result
337
+ acceptedPending.delete(evictHashStr);
338
+ ignored.push(TxHash.fromString(evictHashStr));
339
+ }
263
340
  }
264
341
  }
265
342
 
343
+ // Randomly drop the transaction for testing purposes (report as accepted so it propagates)
344
+ if (this.#config.dropTransactionsProbability > 0 && Math.random() < this.#config.dropTransactionsProbability) {
345
+ this.#log.debug(`Dropping tx ${txHashStr} (simulated drop for testing)`);
346
+ return { status: 'accepted' };
347
+ }
348
+
266
349
  // Add the transaction
267
- await this.#addTx(tx, 'pending', opts);
350
+ await this.#addTx(tx, 'pending', opts, precomputedMeta);
268
351
  return { status: 'accepted' };
269
352
  }
270
353
 
271
- async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'> {
354
+ async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> {
272
355
  const txHashStr = tx.getTxHash().toString();
273
356
 
274
357
  // Check if already in pool
275
358
  if (this.#indices.has(txHashStr)) {
359
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
276
360
  return 'ignored';
277
361
  }
278
362
 
279
- // Build metadata and validate using metadata
363
+ // Build metadata and check pre-add rules
280
364
  const meta = await buildTxMetaData(tx);
281
- const validationResult = await this.#validateMeta(meta, undefined, 'can add pending');
282
- if (validationResult !== true) {
283
- return 'rejected';
284
- }
285
-
286
- // Use pre-add rules
287
365
  const poolAccess = this.#createPreAddPoolAccess();
288
366
  const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
289
367
 
290
- return preAddResult.shouldIgnore ? 'ignored' : 'accepted';
368
+ if (preAddResult.shouldIgnore) {
369
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
370
+ reason: preAddResult.reason?.message ?? 'no reason provided',
371
+ });
372
+ return 'ignored';
373
+ }
374
+ return 'accepted';
291
375
  }
292
376
 
293
377
  async addProtectedTxs(txs: Tx[], block: BlockHeader, opts: { source?: string }): Promise<void> {
294
378
  const slotNumber = block.globalVariables.slotNumber;
295
379
 
380
+ // Precompute setup-call allow-list flags outside the store transaction
381
+ const allowedFlags = await Promise.all(txs.map(tx => this.#checkAllowedSetupCalls(tx)));
382
+
296
383
  await this.#store.transactionAsync(async () => {
297
- for (const tx of txs) {
384
+ for (let i = 0; i < txs.length; i++) {
385
+ const tx = txs[i];
298
386
  const txHash = tx.getTxHash();
299
387
  const txHashStr = txHash.toString();
300
388
  const isNew = !this.#indices.has(txHashStr);
301
389
  const minedBlockId = await this.#getMinedBlockId(txHash);
302
390
 
303
391
  if (isNew) {
392
+ const meta = await buildTxMetaData(tx, allowedFlags[i]);
304
393
  // New tx - add as mined or protected (callback emitted by #addTx)
305
394
  if (minedBlockId) {
306
- await this.#addTx(tx, { mined: minedBlockId }, opts);
395
+ await this.#addTx(tx, { mined: minedBlockId }, opts, meta);
307
396
  this.#indices.setProtection(txHashStr, slotNumber);
308
397
  } else {
309
- await this.#addTx(tx, { protected: slotNumber }, opts);
398
+ await this.#addTx(tx, { protected: slotNumber }, opts, meta);
310
399
  }
311
400
  } else {
312
401
  // Existing tx - update protection and mined status
@@ -320,23 +409,58 @@ export class TxPoolV2Impl {
320
409
  });
321
410
  }
322
411
 
323
- protectTxs(txHashes: TxHash[], block: BlockHeader): TxHash[] {
412
+ async protectTxs(txHashes: TxHash[], block: BlockHeader): Promise<TxHash[]> {
324
413
  const slotNumber = block.globalVariables.slotNumber;
325
414
  const missing: TxHash[] = [];
415
+ let softDeletedHits = 0;
416
+ let missingPreviouslyEvicted = 0;
326
417
 
327
- for (const txHash of txHashes) {
328
- const txHashStr = txHash.toString();
418
+ await this.#store.transactionAsync(async () => {
419
+ for (const txHash of txHashes) {
420
+ const txHashStr = txHash.toString();
329
421
 
330
- if (this.#indices.has(txHashStr)) {
331
- // Update protection for existing tx
332
- this.#indices.updateProtection(txHashStr, slotNumber);
333
- } else {
334
- // Pre-record protection for tx we don't have yet
335
- this.#indices.setProtection(txHashStr, slotNumber);
336
- missing.push(txHash);
422
+ if (this.#indices.has(txHashStr)) {
423
+ // Update protection for existing tx
424
+ this.#indices.updateProtection(txHashStr, slotNumber);
425
+ } else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
426
+ // Resurrect soft-deleted tx as protected
427
+ const buffer = await this.#txsDB.getAsync(txHashStr);
428
+ if (buffer) {
429
+ const tx = Tx.fromBuffer(buffer);
430
+ await this.#addTx(tx, { protected: slotNumber });
431
+ softDeletedHits++;
432
+ } else {
433
+ // Data missing despite soft-delete flag — treat as truly missing
434
+ this.#indices.setProtection(txHashStr, slotNumber);
435
+ missing.push(txHash);
436
+ }
437
+ } else {
438
+ // Truly missing — pre-record protection for tx we don't have yet
439
+ this.#indices.setProtection(txHashStr, slotNumber);
440
+ missing.push(txHash);
441
+ if (this.#evictedTxHashes.has(txHashStr)) {
442
+ missingPreviouslyEvicted++;
443
+ }
444
+ }
337
445
  }
446
+ });
447
+
448
+ // Record metrics
449
+ if (softDeletedHits > 0) {
450
+ this.#instrumentation.recordSoftDeletedHits(softDeletedHits);
451
+ }
452
+ if (missing.length > 0) {
453
+ this.#log.debug(`protectTxs missing tx hashes: ${missing.map(h => h.toString()).join(', ')}`);
454
+ this.#instrumentation.recordMissingOnProtect(missing.length);
455
+ }
456
+ if (missingPreviouslyEvicted > 0) {
457
+ this.#instrumentation.recordMissingPreviouslyEvicted(missingPreviouslyEvicted);
338
458
  }
339
459
 
460
+ this.#log.info(
461
+ `Protected ${txHashes.length} txs, missing: ${missing.length}, soft-deleted hits: ${softDeletedHits}`,
462
+ );
463
+
340
464
  return missing;
341
465
  }
342
466
 
@@ -380,54 +504,67 @@ export class TxPoolV2Impl {
380
504
  }
381
505
  }
382
506
 
383
- // Step 4: Mark txs as mined (only those we have in the pool)
384
- for (const meta of found) {
385
- this.#indices.markAsMined(meta, blockId);
386
- await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
387
- }
507
+ await this.#store.transactionAsync(async () => {
508
+ // Step 4: Mark txs as mined (only those we have in the pool)
509
+ for (const meta of found) {
510
+ this.#indices.markAsMined(meta, blockId);
511
+ await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
512
+ }
388
513
 
389
- // Step 5: Run eviction rules (remove pending txs with conflicting nullifiers/expired timestamps)
390
- await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
514
+ // Step 5: Run post-event eviction rules (inside transaction for atomicity)
515
+ await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
516
+ });
517
+
518
+ if (found.length > 0) {
519
+ this.#callbacks.onTxsMined(found.map(m => m.txHash));
520
+ }
391
521
 
392
522
  this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
393
523
  }
394
524
 
395
525
  async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
396
- // Step 1: Find expired protected txs
397
- const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
526
+ await this.#store.transactionAsync(async () => {
527
+ // Step 0: Clean up slot-deleted txs from previous slots
528
+ await this.#deletedPool.cleanupSlotDeleted(slotNumber);
398
529
 
399
- // Step 2: Clear protection for all expired entries (including those without metadata)
400
- this.#indices.clearProtection(expiredProtected);
530
+ // Step 1: Find expired protected txs
531
+ const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
401
532
 
402
- // Step 3: Filter to only txs that have metadata and are not mined
403
- const txsToRestore = this.#indices.filterRestorable(expiredProtected);
404
- if (txsToRestore.length === 0) {
405
- return;
406
- }
533
+ // Step 2: Clear protection for all expired entries (including those without metadata)
534
+ this.#indices.clearProtection(expiredProtected);
407
535
 
408
- this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
536
+ // Step 3: Filter to only txs that have metadata and are not mined
537
+ const txsToRestore = this.#indices.filterRestorable(expiredProtected);
538
+ if (txsToRestore.length === 0) {
539
+ this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
540
+ return;
541
+ }
409
542
 
410
- // Step 4: Validate for pending pool
411
- const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
543
+ this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
412
544
 
413
- // Step 5: Resolve nullifier conflicts and add winners to pending indices
414
- const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
545
+ // Step 4: Validate for pending pool
546
+ const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
415
547
 
416
- // Step 6: Delete invalid and evicted txs
417
- await this.#deleteTxsBatch([...invalid, ...toEvict]);
548
+ // Step 5: Resolve nullifier conflicts and add winners to pending indices
549
+ const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
418
550
 
419
- // Step 7: Run eviction rules (enforce pool size limit)
420
- if (added.length > 0) {
421
- const feePayers = added.map(meta => meta.feePayer);
422
- const uniqueFeePayers = new Set<string>(feePayers);
423
- await this.#evictionManager.evictAfterNewTxs(
424
- added.map(m => m.txHash),
425
- [...uniqueFeePayers],
426
- );
427
- }
551
+ // Step 6: Delete invalid txs and evict conflict losers
552
+ await this.#deleteTxsBatch(invalid);
553
+ await this.#evictTxs(toEvict, 'NullifierConflict');
554
+
555
+ // Step 7: Run eviction rules (enforce pool size limit)
556
+ if (added.length > 0) {
557
+ const feePayers = added.map(meta => meta.feePayer);
558
+ const uniqueFeePayers = new Set<string>(feePayers);
559
+ await this.#evictionManager.evictAfterNewTxs(
560
+ added.map(m => m.txHash),
561
+ [...uniqueFeePayers],
562
+ );
563
+ }
564
+ });
428
565
  }
429
566
 
430
- async handlePrunedBlocks(latestBlock: L2BlockId): Promise<void> {
567
+ async handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void> {
431
568
  // Step 1: Find transactions mined after the prune point
432
569
  const txsToUnmine = this.#indices.findTxsMinedAfter(latestBlock.number);
433
570
  if (txsToUnmine.length === 0) {
@@ -437,43 +574,62 @@ export class TxPoolV2Impl {
437
574
 
438
575
  this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`);
439
576
 
440
- // Step 2: Mark ALL un-mined txs with their original mined block number
441
- // This ensures they get soft-deleted if removed later, and only hard-deleted
442
- // when their original mined block is finalized
443
- await this.#deletedPool.markFromPrunedBlock(
444
- txsToUnmine.map(m => ({
445
- txHash: m.txHash,
446
- minedAtBlock: BlockNumber(m.minedL2BlockId!.number),
447
- })),
448
- );
577
+ await this.#store.transactionAsync(async () => {
578
+ // Step 2: Mark ALL un-mined txs with their original mined block number
579
+ // This ensures they get soft-deleted if removed later, and only hard-deleted
580
+ // when their original mined block is finalized
581
+ await this.#deletedPool.markFromPrunedBlock(
582
+ txsToUnmine.map(m => ({
583
+ txHash: m.txHash,
584
+ minedAtBlock: BlockNumber(m.minedL2BlockId!.number),
585
+ })),
586
+ );
449
587
 
450
- // Step 3: Unmine - clear mined status from metadata
451
- for (const meta of txsToUnmine) {
452
- this.#indices.markAsUnmined(meta);
453
- }
588
+ // Step 3: Unmine - clear mined status from metadata
589
+ for (const meta of txsToUnmine) {
590
+ this.#indices.markAsUnmined(meta);
591
+ }
592
+
593
+ // If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
594
+ if (options?.deleteAllTxs) {
595
+ const allTxHashes = txsToUnmine.map(m => m.txHash);
596
+ await this.#deleteTxsBatch(allTxHashes);
597
+ this.#log.info(
598
+ `Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`,
599
+ );
600
+ return;
601
+ }
602
+
603
+ // Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
604
+ const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
454
605
 
455
- // Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
456
- const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
606
+ // Step 5: Validate for pending pool
607
+ const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
457
608
 
458
- // Step 4: Validate for pending pool
459
- const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
609
+ // Step 6: Resolve nullifier conflicts and add winners to pending indices
610
+ const { toEvict } = this.#applyNullifierConflictResolution(valid);
460
611
 
461
- // Step 6: Resolve nullifier conflicts and add winners to pending indices
462
- const { toEvict } = this.#applyNullifierConflictResolution(valid);
612
+ // Step 7: Delete invalid txs and evict conflict losers
613
+ await this.#deleteTxsBatch(invalid);
614
+ await this.#evictTxs(toEvict, 'NullifierConflict');
463
615
 
464
- // Step 7: Delete invalid and evicted txs
465
- await this.#deleteTxsBatch([...invalid, ...toEvict]);
616
+ this.#log.info(
617
+ `Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`,
618
+ { txHashesRestored: valid.map(m => m.txHash), txHashesInvalid: invalid, txHashesEvicted: toEvict },
619
+ );
466
620
 
467
- // Step 8: Run eviction rules for ALL pending txs (not just restored ones)
468
- // This handles cases like existing pending txs with invalid fee payer balances
469
- await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
621
+ // Step 8: Run eviction rules for ALL pending txs (not just restored ones)
622
+ // This handles cases like existing pending txs with invalid fee payer balances
623
+ await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
624
+ });
470
625
  }
471
626
 
472
627
  async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
473
- // Delete failed txs
474
- await this.#deleteTxsBatch(txHashes.map(h => h.toString()));
628
+ await this.#store.transactionAsync(async () => {
629
+ await this.#deleteTxsBatch(txHashes.map(h => h.toString()));
630
+ });
475
631
 
476
- this.#log.info(`Deleted ${txHashes.length} failed txs`);
632
+ this.#log.info(`Deleted ${txHashes.length} failed txs`, { txHashes: txHashes.map(h => h.toString()) });
477
633
  }
478
634
 
479
635
  async handleFinalizedBlock(block: BlockHeader): Promise<void> {
@@ -482,30 +638,34 @@ export class TxPoolV2Impl {
482
638
  // Step 1: Find mined txs at or before finalized block
483
639
  const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
484
640
 
485
- // Step 2: Collect mined txs for archiving (before deletion)
486
- const txsToArchive: Tx[] = [];
487
- if (this.#archive.isEnabled()) {
488
- for (const txHashStr of minedTxsToFinalize) {
489
- const buffer = await this.#txsDB.getAsync(txHashStr);
490
- if (buffer) {
491
- txsToArchive.push(Tx.fromBuffer(buffer));
641
+ await this.#store.transactionAsync(async () => {
642
+ // Step 2: Collect mined txs for archiving (before deletion)
643
+ const txsToArchive: Tx[] = [];
644
+ if (this.#archive.isEnabled()) {
645
+ for (const txHashStr of minedTxsToFinalize) {
646
+ const buffer = await this.#txsDB.getAsync(txHashStr);
647
+ if (buffer) {
648
+ txsToArchive.push(Tx.fromBuffer(buffer));
649
+ }
492
650
  }
493
651
  }
494
- }
495
652
 
496
- // Step 3: Delete mined txs from active pool
497
- await this.#deleteTxsBatch(minedTxsToFinalize);
653
+ // Step 3: Delete mined txs from active pool
654
+ await this.#deleteTxsBatch(minedTxsToFinalize);
498
655
 
499
- // Step 4: Finalize soft-deleted txs
500
- await this.#deletedPool.finalizeBlock(blockNumber);
656
+ // Step 4: Finalize soft-deleted txs
657
+ await this.#deletedPool.finalizeBlock(blockNumber);
501
658
 
502
- // Step 5: Archive mined txs
503
- if (txsToArchive.length > 0) {
504
- await this.#archive.archiveTxs(txsToArchive);
505
- }
659
+ // Step 5: Archive mined txs
660
+ if (txsToArchive.length > 0) {
661
+ await this.#archive.archiveTxs(txsToArchive);
662
+ }
663
+ });
506
664
 
507
665
  if (minedTxsToFinalize.length > 0) {
508
- this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`);
666
+ this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
667
+ txHashes: minedTxsToFinalize,
668
+ });
509
669
  }
510
670
  }
511
671
 
@@ -549,6 +709,13 @@ export class TxPoolV2Impl {
549
709
  return [...this.#indices.iteratePendingByPriority('desc')].map(hash => TxHash.fromString(hash));
550
710
  }
551
711
 
712
+ getEligiblePendingTxHashes(): TxHash[] {
713
+ const maxReceivedAt = this.#dateProvider.now() - this.#config.minTxPoolAgeMs;
714
+ return [...this.#indices.iterateEligiblePendingByPriority('desc', maxReceivedAt)].map(hash =>
715
+ TxHash.fromString(hash),
716
+ );
717
+ }
718
+
552
719
  getPendingTxCount(): number {
553
720
  return this.#indices.getPendingTxCount();
554
721
  }
@@ -593,6 +760,9 @@ export class TxPoolV2Impl {
593
760
  this.#config.archivedTxLimit = config.archivedTxLimit;
594
761
  this.#archive.updateLimit(config.archivedTxLimit);
595
762
  }
763
+ if (config.minTxPoolAgeMs !== undefined) {
764
+ this.#config.minTxPoolAgeMs = config.minTxPoolAgeMs;
765
+ }
596
766
  // Update eviction rules with new config
597
767
  this.#evictionManager.updateConfig(config);
598
768
  }
@@ -610,8 +780,17 @@ export class TxPoolV2Impl {
610
780
 
611
781
  // === Metrics ===
612
782
 
613
- countTxs(): { pending: number; protected: number; mined: number } {
614
- return this.#indices.countTxs();
783
+ countTxs(): {
784
+ pending: number;
785
+ protected: number;
786
+ mined: number;
787
+ softDeleted: number;
788
+ totalMetadataBytes: number;
789
+ } {
790
+ return {
791
+ ...this.#indices.countTxs(),
792
+ softDeleted: this.#deletedPool.getSoftDeletedCount(),
793
+ };
615
794
  }
616
795
 
617
796
  // ============================================================================
@@ -626,11 +805,14 @@ export class TxPoolV2Impl {
626
805
  tx: Tx,
627
806
  state: 'pending' | { protected: SlotNumber } | { mined: L2BlockId },
628
807
  opts: { source?: string } = {},
808
+ precomputedMeta?: TxMetaData,
629
809
  ): Promise<TxMetaData> {
630
810
  const txHashStr = tx.getTxHash().toString();
631
- const meta = await buildTxMetaData(tx);
811
+ const meta = precomputedMeta ?? (await buildTxMetaData(tx));
812
+ meta.receivedAt = this.#dateProvider.now();
632
813
 
633
814
  await this.#txsDB.set(txHashStr, tx.toBuffer());
815
+ await this.#deletedPool.clearSoftDeleted(txHashStr);
634
816
  this.#callbacks.onTxsAdded([tx], opts);
635
817
 
636
818
  if (state === 'pending') {
@@ -643,9 +825,11 @@ export class TxPoolV2Impl {
643
825
  }
644
826
 
645
827
  const stateStr = typeof state === 'string' ? state : Object.keys(state)[0];
646
- this.#log.verbose(`Added ${stateStr} tx ${txHashStr}`, {
828
+ this.#log.debug(`Added tx ${txHashStr} as ${stateStr}`, {
647
829
  eventName: 'tx-added-to-pool',
830
+ txHash: txHashStr,
648
831
  state: stateStr,
832
+ source: opts.source,
649
833
  });
650
834
 
651
835
  return meta;
@@ -673,6 +857,29 @@ export class TxPoolV2Impl {
673
857
  }
674
858
  }
675
859
 
860
+ /** Evicts transactions: records eviction metric with reason, caches hashes, then deletes. */
861
+ async #evictTxs(txHashes: string[], reason: string): Promise<void> {
862
+ if (txHashes.length === 0) {
863
+ return;
864
+ }
865
+ this.#instrumentation.recordEvictions(txHashes.length, reason);
866
+ for (const txHashStr of txHashes) {
867
+ this.#log.debug(`Evicting tx ${txHashStr}`, { txHash: txHashStr, reason });
868
+ this.#addToEvictedCache(txHashStr);
869
+ }
870
+ await this.#deleteTxsBatch(txHashes);
871
+ }
872
+
873
+ /** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */
874
+ #addToEvictedCache(txHashStr: string): void {
875
+ if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
876
+ // FIFO eviction: remove the first (oldest) entry
877
+ const oldest = this.#evictedTxHashes.values().next().value!;
878
+ this.#evictedTxHashes.delete(oldest);
879
+ }
880
+ this.#evictedTxHashes.add(txHashStr);
881
+ }
882
+
676
883
  // ============================================================================
677
884
  // PRIVATE HELPERS - Validation & Conflict Resolution
678
885
  // ============================================================================
@@ -783,7 +990,8 @@ export class TxPoolV2Impl {
783
990
 
784
991
  try {
785
992
  const tx = Tx.fromBuffer(buffer);
786
- const meta = await buildTxMetaData(tx);
993
+ const allowedSetupCalls = await this.#checkAllowedSetupCalls(tx);
994
+ const meta = await buildTxMetaData(tx, allowedSetupCalls);
787
995
  loaded.push({ tx, meta });
788
996
  } catch (err) {
789
997
  this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
@@ -828,7 +1036,9 @@ export class TxPoolV2Impl {
828
1036
  if (preAddResult.shouldIgnore) {
829
1037
  // Transaction rejected - mark for deletion from DB
830
1038
  rejected.push(meta.txHash);
831
- this.#log.debug(`Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason}`);
1039
+ this.#log.debug(
1040
+ `Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason?.message ?? 'unknown reason'}`,
1041
+ );
832
1042
  continue;
833
1043
  }
834
1044
 
@@ -864,7 +1074,7 @@ export class TxPoolV2Impl {
864
1074
  getFeePayerPendingTxs: (feePayer: string) => this.#indices.getFeePayerPendingTxs(feePayer),
865
1075
  getPendingTxCount: () => this.#indices.getPendingTxCount(),
866
1076
  getLowestPriorityPending: (limit: number) => this.#indices.getLowestPriorityPending(limit),
867
- deleteTxs: (txHashes: string[]) => this.#deleteTxsBatch(txHashes),
1077
+ deleteTxs: (txHashes: string[], reason?: string) => this.#evictTxs(txHashes, reason ?? 'unknown'),
868
1078
  };
869
1079
  }
870
1080