@aztec/p2p 0.0.1-commit.4ad48494d → 0.0.1-commit.4d3c002

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