@aztec/p2p 0.0.1-commit.001888fc → 0.0.1-commit.017a351

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 (403) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +9 -1
  4. package/dest/client/factory.d.ts +4 -3
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +28 -23
  7. package/dest/client/interface.d.ts +14 -5
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +13 -9
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +78 -20
  12. package/dest/config.d.ts +135 -99
  13. package/dest/config.d.ts.map +1 -1
  14. package/dest/config.js +62 -7
  15. package/dest/errors/p2p-service.error.d.ts +9 -0
  16. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  17. package/dest/errors/p2p-service.error.js +10 -0
  18. package/dest/errors/reqresp.error.d.ts +1 -20
  19. package/dest/errors/reqresp.error.d.ts.map +1 -1
  20. package/dest/errors/reqresp.error.js +0 -21
  21. package/dest/index.d.ts +1 -2
  22. package/dest/index.d.ts.map +1 -1
  23. package/dest/index.js +0 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  26. package/dest/mem_pools/attestation_pool/attestation_pool.js +265 -199
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
  30. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  33. package/dest/mem_pools/index.d.ts +1 -2
  34. package/dest/mem_pools/index.d.ts.map +1 -1
  35. package/dest/mem_pools/instrumentation.d.ts +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.js +17 -1
  38. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  41. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  44. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  48. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +8 -5
  49. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
  51. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  53. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
  54. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +75 -84
  56. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  57. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  58. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  59. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  60. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  61. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  62. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  63. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  64. package/dest/msg_validators/clock_tolerance.js +56 -3
  65. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -2
  66. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -2
  68. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  69. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +10 -2
  70. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  71. package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -12
  72. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  73. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  75. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  76. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  77. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  78. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  79. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  80. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  81. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  82. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  83. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  84. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  86. package/dest/msg_validators/tx_validator/factory.d.ts +6 -5
  87. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  88. package/dest/msg_validators/tx_validator/factory.js +21 -11
  89. package/dest/msg_validators/tx_validator/gas_validator.d.ts +36 -4
  90. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  91. package/dest/msg_validators/tx_validator/gas_validator.js +50 -33
  92. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  93. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  94. package/dest/msg_validators/tx_validator/index.js +2 -0
  95. package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
  96. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  97. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  99. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  100. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  101. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  102. package/dest/services/data_store.d.ts +1 -1
  103. package/dest/services/data_store.d.ts.map +1 -1
  104. package/dest/services/data_store.js +5 -5
  105. package/dest/services/discv5/discV5_service.d.ts +2 -1
  106. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  107. package/dest/services/discv5/discV5_service.js +35 -8
  108. package/dest/services/dummy_service.d.ts +11 -15
  109. package/dest/services/dummy_service.d.ts.map +1 -1
  110. package/dest/services/dummy_service.js +12 -16
  111. package/dest/services/encoding.d.ts +5 -1
  112. package/dest/services/encoding.d.ts.map +1 -1
  113. package/dest/services/encoding.js +7 -1
  114. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  115. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  116. package/dest/services/gossipsub/topic_score_params.js +21 -4
  117. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  118. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  119. package/dest/services/libp2p/instrumentation.js +14 -0
  120. package/dest/services/libp2p/libp2p_service.d.ts +36 -46
  121. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  122. package/dest/services/libp2p/libp2p_service.js +272 -262
  123. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  124. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  125. package/dest/services/peer-manager/peer_manager.js +38 -10
  126. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  127. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  128. package/dest/services/peer-manager/peer_scoring.js +32 -10
  129. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -14
  130. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  131. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +78 -100
  132. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -6
  133. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  134. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +4 -4
  135. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  136. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +7 -7
  137. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  138. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  139. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  140. package/dest/services/reqresp/config.d.ts +3 -3
  141. package/dest/services/reqresp/config.d.ts.map +1 -1
  142. package/dest/services/reqresp/interface.d.ts +16 -18
  143. package/dest/services/reqresp/interface.d.ts.map +1 -1
  144. package/dest/services/reqresp/interface.js +10 -20
  145. package/dest/services/reqresp/metrics.d.ts +1 -1
  146. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  147. package/dest/services/reqresp/metrics.js +0 -1
  148. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  149. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  150. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  151. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  152. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  153. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  154. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  155. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  156. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  157. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  158. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  159. package/dest/services/reqresp/protocols/index.js +0 -1
  160. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  161. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  162. package/dest/services/reqresp/protocols/tx.js +1 -3
  163. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  164. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  165. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  166. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  167. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  168. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  169. package/dest/services/reqresp/reqresp.d.ts +7 -29
  170. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  171. package/dest/services/reqresp/reqresp.js +41 -214
  172. package/dest/services/service.d.ts +9 -12
  173. package/dest/services/service.d.ts.map +1 -1
  174. package/dest/services/tx_collection/config.d.ts +2 -23
  175. package/dest/services/tx_collection/config.d.ts.map +1 -1
  176. package/dest/services/tx_collection/config.js +2 -55
  177. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  178. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  179. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  180. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  181. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  182. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  183. package/dest/services/tx_collection/index.d.ts +2 -3
  184. package/dest/services/tx_collection/index.d.ts.map +1 -1
  185. package/dest/services/tx_collection/index.js +0 -1
  186. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  187. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  188. package/dest/services/tx_collection/instrumentation.js +0 -2
  189. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  190. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  191. package/dest/services/tx_collection/request_tracker.js +84 -0
  192. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  193. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  194. package/dest/services/tx_collection/tx_collection.js +275 -119
  195. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  196. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  197. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  198. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  199. package/dest/services/tx_collection/tx_source.js +9 -7
  200. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  201. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  202. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  203. package/dest/services/tx_provider.d.ts +3 -1
  204. package/dest/services/tx_provider.d.ts.map +1 -1
  205. package/dest/services/tx_provider.js +3 -0
  206. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  207. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  208. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  209. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  210. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  211. package/dest/test-helpers/mock-pubsub.js +44 -44
  212. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  213. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  214. package/dest/test-helpers/reqresp-nodes.js +16 -18
  215. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  216. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  217. package/dest/test-helpers/test_tx_provider.js +3 -0
  218. package/dest/test-helpers/testbench-utils.d.ts +12 -14
  219. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  220. package/dest/test-helpers/testbench-utils.js +38 -14
  221. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  222. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  223. package/dest/testbench/p2p_client_testbench_worker.js +83 -38
  224. package/dest/testbench/worker_client_manager.d.ts +10 -6
  225. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  226. package/dest/testbench/worker_client_manager.js +51 -9
  227. package/dest/util.d.ts +11 -6
  228. package/dest/util.d.ts.map +1 -1
  229. package/dest/util.js +35 -14
  230. package/dest/versioning.d.ts +3 -6
  231. package/dest/versioning.d.ts.map +1 -1
  232. package/dest/versioning.js +3 -24
  233. package/package.json +15 -14
  234. package/src/bootstrap/bootstrap.ts +9 -1
  235. package/src/client/factory.ts +48 -23
  236. package/src/client/interface.ts +15 -11
  237. package/src/client/p2p_client.ts +91 -41
  238. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  239. package/src/config.ts +123 -6
  240. package/src/errors/p2p-service.error.ts +11 -0
  241. package/src/errors/reqresp.error.ts +0 -25
  242. package/src/index.ts +0 -1
  243. package/src/mem_pools/attestation_pool/attestation_pool.ts +316 -241
  244. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  245. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  246. package/src/mem_pools/index.ts +0 -3
  247. package/src/mem_pools/instrumentation.ts +5 -1
  248. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  249. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  250. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  251. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  252. package/src/mem_pools/tx_pool_v2/interfaces.ts +7 -4
  253. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +20 -8
  254. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +75 -90
  255. package/src/msg_validators/attestation_validator/README.md +1 -1
  256. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  257. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  258. package/src/msg_validators/clock_tolerance.ts +73 -3
  259. package/src/msg_validators/proposal_validator/README.md +4 -4
  260. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +12 -2
  261. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +17 -2
  262. package/src/msg_validators/proposal_validator/proposal_validator.ts +54 -10
  263. package/src/msg_validators/tx_validator/README.md +11 -3
  264. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  265. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  266. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  267. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  268. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  269. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  270. package/src/msg_validators/tx_validator/factory.ts +25 -7
  271. package/src/msg_validators/tx_validator/gas_validator.ts +82 -33
  272. package/src/msg_validators/tx_validator/index.ts +2 -0
  273. package/src/msg_validators/tx_validator/phases_validator.ts +1 -1
  274. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  275. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  276. package/src/services/data_store.ts +5 -13
  277. package/src/services/discv5/discV5_service.ts +38 -5
  278. package/src/services/dummy_service.ts +14 -39
  279. package/src/services/encoding.ts +9 -1
  280. package/src/services/gossipsub/topic_score_params.ts +36 -4
  281. package/src/services/libp2p/instrumentation.ts +14 -0
  282. package/src/services/libp2p/libp2p_service.ts +302 -300
  283. package/src/services/peer-manager/peer_manager.ts +44 -10
  284. package/src/services/peer-manager/peer_scoring.ts +27 -5
  285. package/src/services/reqresp/README.md +0 -14
  286. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  287. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +74 -112
  288. package/src/services/reqresp/batch-tx-requester/interface.ts +11 -5
  289. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +6 -6
  290. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  291. package/src/services/reqresp/config.ts +2 -2
  292. package/src/services/reqresp/interface.ts +21 -47
  293. package/src/services/reqresp/metrics.ts +0 -1
  294. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  295. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  296. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  297. package/src/services/reqresp/protocols/index.ts +0 -1
  298. package/src/services/reqresp/protocols/tx.ts +1 -3
  299. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  300. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  301. package/src/services/reqresp/reqresp.ts +45 -260
  302. package/src/services/service.ts +12 -28
  303. package/src/services/tx_collection/config.ts +3 -80
  304. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  305. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  306. package/src/services/tx_collection/index.ts +1 -6
  307. package/src/services/tx_collection/instrumentation.ts +1 -7
  308. package/src/services/tx_collection/request_tracker.ts +127 -0
  309. package/src/services/tx_collection/tx_collection.ts +331 -176
  310. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  311. package/src/services/tx_collection/tx_source.ts +8 -7
  312. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  313. package/src/services/tx_provider.ts +5 -0
  314. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  315. package/src/test-helpers/mock-pubsub.ts +46 -60
  316. package/src/test-helpers/reqresp-nodes.ts +12 -22
  317. package/src/test-helpers/test_tx_provider.ts +5 -0
  318. package/src/test-helpers/testbench-utils.ts +50 -28
  319. package/src/testbench/p2p_client_testbench_worker.ts +87 -54
  320. package/src/testbench/worker_client_manager.ts +59 -20
  321. package/src/util.ts +32 -17
  322. package/src/versioning.ts +3 -33
  323. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  324. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  325. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  326. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  327. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  328. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  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 -123
  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 -402
  365. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  366. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  367. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  368. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  369. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  370. package/dest/services/reqresp/protocols/block.js +0 -32
  371. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  372. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  373. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  374. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  375. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  376. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  377. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  378. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  379. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  380. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  381. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  382. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  383. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  384. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  385. package/src/mem_pools/tx_pool/README.md +0 -270
  386. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  387. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  388. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  389. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  390. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  391. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  392. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  393. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  394. package/src/mem_pools/tx_pool/index.ts +0 -2
  395. package/src/mem_pools/tx_pool/priority.ts +0 -20
  396. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  397. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  398. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  399. package/src/services/reqresp/protocols/block.ts +0 -37
  400. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  401. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  402. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  403. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -0,0 +1,65 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import type { BlockMinFeesProvider } from '@aztec/stdlib/gas';
3
+
4
+ import type { EvictionContext, EvictionResult, EvictionRule, PoolOperations } from './interfaces.js';
5
+ import { EvictionEvent } from './interfaces.js';
6
+
7
+ /**
8
+ * Eviction rule that removes transactions whose maxFeesPerGas no longer meets
9
+ * the projected minimum gas fees after a new block is mined.
10
+ * Uses the BlockMinFeesProvider (forward-looking) to get the projected minimum fees.
11
+ * Only triggers on BLOCK_MINED events.
12
+ */
13
+ export class InsufficientFeePerGasEvictionRule implements EvictionRule {
14
+ public readonly name = 'InsufficientFeePerGas';
15
+
16
+ private log = createLogger('p2p:tx_pool_v2:insufficient_fee_per_gas_eviction_rule');
17
+
18
+ constructor(private blockMinFeesProvider: BlockMinFeesProvider) {}
19
+
20
+ async evict(context: EvictionContext, pool: PoolOperations): Promise<EvictionResult> {
21
+ if (context.event !== EvictionEvent.BLOCK_MINED) {
22
+ return {
23
+ reason: 'insufficient_fee_per_gas',
24
+ success: true,
25
+ txsEvicted: [],
26
+ };
27
+ }
28
+
29
+ try {
30
+ const gasFees = await this.blockMinFeesProvider.getCurrentMinFees();
31
+ const txsToEvict: string[] = [];
32
+ const pendingTxs = pool.getPendingTxs();
33
+
34
+ for (const meta of pendingTxs) {
35
+ const maxFeesPerGas = meta.data.constants.txContext.gasSettings.maxFeesPerGas;
36
+ if (maxFeesPerGas.feePerDaGas < gasFees.feePerDaGas || maxFeesPerGas.feePerL2Gas < gasFees.feePerL2Gas) {
37
+ this.log.verbose(`Evicting tx ${meta.txHash} from pool due to insufficient fee per gas`, {
38
+ txMaxFeesPerGas: maxFeesPerGas.toInspect(),
39
+ blockGasFees: gasFees.toInspect(),
40
+ });
41
+ txsToEvict.push(meta.txHash);
42
+ }
43
+ }
44
+
45
+ if (txsToEvict.length > 0) {
46
+ this.log.info(`Evicted ${txsToEvict.length} txs with insufficient fee per gas after block mined`);
47
+ await pool.deleteTxs(txsToEvict, this.name);
48
+ }
49
+
50
+ return {
51
+ reason: 'insufficient_fee_per_gas',
52
+ success: true,
53
+ txsEvicted: txsToEvict,
54
+ };
55
+ } catch (err) {
56
+ this.log.error('Failed to evict transactions with insufficient fee per gas', { err });
57
+ return {
58
+ reason: 'insufficient_fee_per_gas',
59
+ success: false,
60
+ txsEvicted: [],
61
+ error: new Error('Failed to evict txs with insufficient fee per gas', { cause: err }),
62
+ };
63
+ }
64
+ }
65
+ }
@@ -1,5 +1,5 @@
1
- import { Fr } from '@aztec/foundation/curves/bn254';
2
1
  import { createLogger } from '@aztec/foundation/log';
2
+ import { BlockHash } from '@aztec/stdlib/block';
3
3
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
4
4
  import { MerkleTreeId } from '@aztec/stdlib/trees';
5
5
 
@@ -33,14 +33,14 @@ export class InvalidTxsAfterReorgRule implements EvictionRule {
33
33
  const pendingTxs = pool.getPendingTxs();
34
34
 
35
35
  // Deduplicate block hashes to reduce redundant DB lookups
36
- const uniqueBlockHashes = new Map<string, Fr>();
36
+ const uniqueBlockHashes = new Map<string, BlockHash>();
37
37
  const txsByBlockHash = new Map<string, string[]>();
38
38
 
39
39
  for (const meta of pendingTxs) {
40
40
  const blockHashStr = meta.anchorBlockHeaderHash;
41
41
  if (!txsByBlockHash.has(blockHashStr)) {
42
42
  txsByBlockHash.set(blockHashStr, []);
43
- uniqueBlockHashes.set(blockHashStr, Fr.fromHexString(blockHashStr));
43
+ uniqueBlockHashes.set(blockHashStr, BlockHash.fromString(blockHashStr));
44
44
  }
45
45
  txsByBlockHash.get(blockHashStr)!.push(meta.txHash);
46
46
  }
@@ -1,6 +1,7 @@
1
1
  import type { SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import type { TypedEventEmitter } from '@aztec/foundation/types';
3
3
  import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
4
+ import type { BlockMinFeesProvider } from '@aztec/stdlib/gas';
4
5
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
5
6
  import type { BlockHeader, Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
6
7
 
@@ -74,6 +75,8 @@ export type TxPoolV2Dependencies = {
74
75
  createTxValidator: () => Promise<TxValidator<TxMetaData>>;
75
76
  /** Checks whether a tx's setup-phase calls are on the allow list. Precomputed at receipt time. */
76
77
  checkAllowedSetupCalls: (tx: Tx) => Promise<boolean>;
78
+ /** Provides projected minimum fees for the next block. Used by eviction rules instead of stale block header fees. */
79
+ blockMinFeesProvider: BlockMinFeesProvider;
77
80
  };
78
81
 
79
82
  /**
@@ -160,10 +163,10 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
160
163
  handleMinedBlock(block: L2Block): Promise<void>;
161
164
 
162
165
  /**
163
- * Prepares the pool for a new slot.
164
- * Unprotects transactions from earlier slots and validates them before
165
- * returning to pending state.
166
- * @param slotNumber - The slot number to prepare for
166
+ * Prepares the pool for a new slot by unprotecting transactions from earlier
167
+ * slots and re-validating them before returning to pending state.
168
+ * @param slotNumber - The pipeline slot we are building for (i.e. the slot
169
+ * the resulting blocks will target on L1).
167
170
  */
168
171
  prepareForSlot(slotNumber: SlotNumber): Promise<void>;
169
172
 
@@ -1,12 +1,12 @@
1
+ import { minBigint } from '@aztec/foundation/bigint';
1
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
5
  import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
5
- import { Gas } from '@aztec/stdlib/gas';
6
+ import { Gas, GasFees } from '@aztec/stdlib/gas';
6
7
  import { type Tx, TxHash } from '@aztec/stdlib/tx';
7
8
 
8
9
  import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
9
- import { getTxPriorityFee } from '../tx_pool/priority.js';
10
10
  import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
11
11
 
12
12
  /** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
@@ -23,7 +23,7 @@ export type TxMetaValidationData = {
23
23
  };
24
24
  };
25
25
  txContext: {
26
- gasSettings: { gasLimits: Gas };
26
+ gasSettings: { gasLimits: Gas; maxFeesPerGas: GasFees };
27
27
  };
28
28
  };
29
29
  };
@@ -132,7 +132,10 @@ export async function buildTxMetaData(tx: Tx, allowedSetupCalls: boolean = true)
132
132
  globalVariables: { blockNumber: anchorBlockNumber },
133
133
  },
134
134
  txContext: {
135
- gasSettings: { gasLimits: tx.data.constants.txContext.gasSettings.gasLimits },
135
+ gasSettings: {
136
+ gasLimits: tx.data.constants.txContext.gasSettings.gasLimits,
137
+ maxFeesPerGas: tx.data.constants.txContext.gasSettings.maxFeesPerGas,
138
+ },
136
139
  },
137
140
  },
138
141
  },
@@ -285,17 +288,19 @@ export function checkNullifierConflict(
285
288
  }
286
289
 
287
290
  /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
288
- export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigint } = {}): TxMetaValidationData {
291
+ export function stubTxMetaValidationData(
292
+ overrides: { expirationTimestamp?: bigint; maxFeesPerGas?: GasFees } = {},
293
+ ): TxMetaValidationData {
289
294
  return {
290
295
  getNonEmptyNullifiers: () => [],
291
296
  expirationTimestamp: overrides.expirationTimestamp ?? 0n,
292
297
  constants: {
293
298
  anchorBlockHeader: {
294
- hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
299
+ hash: () => Promise.resolve(BlockHash.ZERO),
295
300
  globalVariables: { blockNumber: BlockNumber(0) },
296
301
  },
297
302
  txContext: {
298
- gasSettings: { gasLimits: Gas.empty() },
303
+ gasSettings: { gasLimits: Gas.empty(), maxFeesPerGas: overrides.maxFeesPerGas ?? GasFees.empty() },
299
304
  },
300
305
  },
301
306
  };
@@ -313,6 +318,7 @@ export function stubTxMetaData(
313
318
  expirationTimestamp?: bigint;
314
319
  anchorBlockHeaderHash?: string;
315
320
  allowedSetupCalls?: boolean;
321
+ maxFeesPerGas?: GasFees;
316
322
  } = {},
317
323
  ): TxMetaData {
318
324
  const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
@@ -332,6 +338,12 @@ export function stubTxMetaData(
332
338
  allowedSetupCalls: overrides.allowedSetupCalls ?? true,
333
339
  receivedAt: 0,
334
340
  estimatedSizeBytes: 0,
335
- data: stubTxMetaValidationData({ expirationTimestamp }),
341
+ data: stubTxMetaValidationData({ expirationTimestamp, maxFeesPerGas: overrides.maxFeesPerGas }),
336
342
  };
337
343
  }
344
+
345
+ /** Returns the priority fee for a tx, based on the L2 priority fee capped by the max fee per gas. */
346
+ function getTxPriorityFee(tx: Tx): bigint {
347
+ const { maxPriorityFeesPerGas: priorityFees, maxFeesPerGas } = tx.getGasSettings();
348
+ return minBigint(maxFeesPerGas.feePerL2Gas, priorityFees.feePerL2Gas);
349
+ }
@@ -1,4 +1,5 @@
1
1
  import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { FifoSet } from '@aztec/foundation/fifo-set';
2
3
  import type { Logger } from '@aztec/foundation/log';
3
4
  import type { DateProvider } from '@aztec/foundation/timer';
4
5
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
@@ -17,6 +18,7 @@ import {
17
18
  EvictionManager,
18
19
  FeePayerBalanceEvictionRule,
19
20
  FeePayerBalancePreAddRule,
21
+ InsufficientFeePerGasEvictionRule,
20
22
  InvalidTxsAfterMiningRule,
21
23
  InvalidTxsAfterReorgRule,
22
24
  LowPriorityEvictionRule,
@@ -39,6 +41,13 @@ import {
39
41
  import { type TxMetaData, type TxState, buildTxMetaData, checkNullifierConflict } from './tx_metadata.js';
40
42
  import { TxPoolIndices } from './tx_pool_indices.js';
41
43
 
44
+ /**
45
+ * Maximum number of full transactions to load into memory at once when finalizing a block.
46
+ * Bounds peak memory while archiving and hard-deleting mined txs (~23k txs/epoch at 10 TPS would
47
+ * otherwise OOM the node).
48
+ */
49
+ const FINALIZE_BLOCK_CHUNK_SIZE = 100;
50
+
42
51
  /**
43
52
  * Callbacks for the implementation to notify the outer class about events and metrics.
44
53
  */
@@ -74,7 +83,7 @@ export class TxPoolV2Impl {
74
83
  #evictionManager: EvictionManager;
75
84
  #dateProvider: DateProvider;
76
85
  #instrumentation: TxPoolV2Instrumentation;
77
- #evictedTxHashes: Set<string> = new Set();
86
+ #evictedTxHashes: FifoSet<string>;
78
87
  #log: Logger;
79
88
  #callbacks: TxPoolV2Callbacks;
80
89
 
@@ -97,6 +106,7 @@ export class TxPoolV2Impl {
97
106
  this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
98
107
 
99
108
  this.#config = { ...DEFAULT_TX_POOL_V2_CONFIG, ...config };
109
+ this.#evictedTxHashes = FifoSet.withLimit<string>(this.#config.evictedTxCacheSize);
100
110
  this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
101
111
  this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
102
112
  this.#dateProvider = dateProvider;
@@ -116,6 +126,7 @@ export class TxPoolV2Impl {
116
126
 
117
127
  // Post-event eviction rules (run after events to check ALL pending txs)
118
128
  this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
129
+ this.#evictionManager.registerRule(new InsufficientFeePerGasEvictionRule(deps.blockMinFeesProvider));
119
130
  this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(deps.worldStateSynchronizer));
120
131
  this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(deps.worldStateSynchronizer));
121
132
  // LowPriorityEvictionRule handles cases where txs become pending via prepareForSlot (unprotect)
@@ -138,39 +149,67 @@ export class TxPoolV2Impl {
138
149
  // Step 0: Hydrate deleted pool state
139
150
  await this.#deletedPool.hydrateFromDatabase();
140
151
 
141
- // Step 1: Load all transactions from DB (excluding soft-deleted)
142
- const { loaded, errors: deserializationErrors } = await this.#loadAllTxsFromDb();
152
+ // Step 1: Stream txs from DB, building metadata and mined status one at a time.
153
+ const minedMetas: TxMetaData[] = [];
154
+ const pendingMetas: TxMetaData[] = [];
155
+ const deserializationErrors: string[] = [];
156
+
157
+ for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()) {
158
+ // Skip soft-deleted transactions - they stay in DB but not in indices
159
+ if (this.#deletedPool.isSoftDeleted(txHashStr)) {
160
+ continue;
161
+ }
162
+
163
+ let meta: TxMetaData;
164
+ let txEffect: Awaited<ReturnType<L2BlockSource['getTxEffect']>>;
165
+ try {
166
+ const tx = Tx.fromBuffer(buffer);
167
+ // Resolve allowed-setup-calls and the tx effect concurrently
168
+ // getTxEffect failures are non-fatal (we just treat the tx as not-yet-mined), so
169
+ // its rejection is swallowed before the Promise.all so it can't fail-fast the batch.
170
+ const txEffectPromise = this.#l2BlockSource.getTxEffect(tx.getTxHash()).catch(err => {
171
+ this.#log.warn(`Failed to check mined status for tx ${txHashStr}`, { err });
172
+ return undefined;
173
+ });
174
+ const [allowedSetupCalls, fetchedTxEffect] = await Promise.all([
175
+ this.#checkAllowedSetupCalls(tx),
176
+ txEffectPromise,
177
+ ]);
178
+ meta = await buildTxMetaData(tx, allowedSetupCalls);
179
+ txEffect = fetchedTxEffect;
180
+ } catch (err) {
181
+ this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
182
+ deserializationErrors.push(txHashStr);
183
+ continue;
184
+ }
143
185
 
144
- // Step 2: Check mined status for each tx
145
- await this.#markMinedStatusBatch(loaded.map(l => l.meta));
186
+ if (txEffect) {
187
+ meta.minedL2BlockId = {
188
+ number: txEffect.l2BlockNumber,
189
+ hash: txEffect.l2BlockHash.toString(),
190
+ };
191
+ }
146
192
 
147
- // Step 3: Partition by mined status
148
- const mined: TxMetaData[] = [];
149
- const nonMined: { tx: Tx; meta: TxMetaData }[] = [];
150
- for (const entry of loaded) {
151
- if (entry.meta.minedL2BlockId !== undefined) {
152
- mined.push(entry.meta);
193
+ if (meta.minedL2BlockId !== undefined) {
194
+ minedMetas.push(meta);
153
195
  } else {
154
- nonMined.push(entry);
196
+ pendingMetas.push(meta);
155
197
  }
156
198
  }
157
199
 
158
- // Step 4: Validate non-mined transactions
159
- const { valid, invalid } = await this.#revalidateMetadata(
160
- nonMined.map(e => e.meta),
161
- 'on startup',
162
- );
200
+ // Step 2: Validate non-mined transactions
201
+ const { valid, invalid } = await this.#revalidateMetadata(pendingMetas, 'on startup');
163
202
 
164
- // Step 5: Populate mined indices (these don't need conflict resolution)
165
- for (const meta of mined) {
203
+ // Step 3: Populate mined indices (these don't need conflict resolution)
204
+ for (const meta of minedMetas) {
166
205
  this.#indices.addMined(meta);
167
206
  }
168
207
 
169
- // Step 6: Rebuild pending pool by running pre-add rules for each tx
208
+ // Step 4: Rebuild pending pool by running pre-add rules for each tx
170
209
  // This resolves nullifier conflicts, fee payer balance issues, and pool size limits
171
210
  const { rejected } = await this.#rebuildPendingPool(valid);
172
211
 
173
- // Step 7: Delete invalid and rejected txs from DB only (indices were never populated for these)
212
+ // Step 5: Delete invalid and rejected txs from DB only (indices were never populated for these)
174
213
  const toDelete = [...deserializationErrors, ...invalid, ...rejected];
175
214
  if (toDelete.length === 0) {
176
215
  return;
@@ -638,28 +677,29 @@ export class TxPoolV2Impl {
638
677
  // Step 1: Find mined txs at or before finalized block
639
678
  const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
640
679
 
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) {
680
+ // Step 2: Archive in chunks if archiving is enabled. Hydrating an entire epoch's worth of
681
+ // mined txs at once would OOM under load. When archiving is disabled there is no need to hydrate the txs at all.
682
+ if (this.#archive.isEnabled()) {
683
+ for (let i = 0; i < minedTxsToFinalize.length; i += FINALIZE_BLOCK_CHUNK_SIZE) {
684
+ const chunk = minedTxsToFinalize.slice(i, i + FINALIZE_BLOCK_CHUNK_SIZE);
685
+ const txsToArchive: Tx[] = [];
686
+ for (const txHashStr of chunk) {
646
687
  const buffer = await this.#txsDB.getAsync(txHashStr);
647
688
  if (buffer) {
648
689
  txsToArchive.push(Tx.fromBuffer(buffer));
649
690
  }
650
691
  }
692
+ if (txsToArchive.length > 0) {
693
+ await this.#archive.archiveTxs(txsToArchive);
694
+ }
651
695
  }
696
+ }
652
697
 
653
- // Step 3: Delete mined txs from active pool
698
+ // Step 3: Delete mined txs from the active pool and finalize soft-deleted txs in one
699
+ // transaction. Only tx hashes are touched here, so memory is bounded and atomicity is preserved.
700
+ await this.#store.transactionAsync(async () => {
654
701
  await this.#deleteTxsBatch(minedTxsToFinalize);
655
-
656
- // Step 4: Finalize soft-deleted txs
657
702
  await this.#deletedPool.finalizeBlock(blockNumber);
658
-
659
- // Step 5: Archive mined txs
660
- if (txsToArchive.length > 0) {
661
- await this.#archive.archiveTxs(txsToArchive);
662
- }
663
703
  });
664
704
 
665
705
  if (minedTxsToFinalize.length > 0) {
@@ -865,21 +905,11 @@ export class TxPoolV2Impl {
865
905
  this.#instrumentation.recordEvictions(txHashes.length, reason);
866
906
  for (const txHashStr of txHashes) {
867
907
  this.#log.debug(`Evicting tx ${txHashStr}`, { txHash: txHashStr, reason });
868
- this.#addToEvictedCache(txHashStr);
908
+ this.#evictedTxHashes.add(txHashStr);
869
909
  }
870
910
  await this.#deleteTxsBatch(txHashes);
871
911
  }
872
912
 
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
-
883
913
  // ============================================================================
884
914
  // PRIVATE HELPERS - Validation & Conflict Resolution
885
915
  // ============================================================================
@@ -974,51 +1004,6 @@ export class TxPoolV2Impl {
974
1004
  };
975
1005
  }
976
1006
 
977
- /** Loads all transactions from the database, returning loaded txs and deserialization errors */
978
- async #loadAllTxsFromDb(): Promise<{
979
- loaded: { tx: Tx; meta: TxMetaData }[];
980
- errors: string[];
981
- }> {
982
- const loaded: { tx: Tx; meta: TxMetaData }[] = [];
983
- const errors: string[] = [];
984
-
985
- for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()) {
986
- // Skip soft-deleted transactions - they stay in DB but not in indices
987
- if (this.#deletedPool.isSoftDeleted(txHashStr)) {
988
- continue;
989
- }
990
-
991
- try {
992
- const tx = Tx.fromBuffer(buffer);
993
- const allowedSetupCalls = await this.#checkAllowedSetupCalls(tx);
994
- const meta = await buildTxMetaData(tx, allowedSetupCalls);
995
- loaded.push({ tx, meta });
996
- } catch (err) {
997
- this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
998
- errors.push(txHashStr);
999
- }
1000
- }
1001
-
1002
- return { loaded, errors };
1003
- }
1004
-
1005
- /** Queries block source and marks mined status on transaction metadata */
1006
- async #markMinedStatusBatch(metas: TxMetaData[]): Promise<void> {
1007
- for (const meta of metas) {
1008
- try {
1009
- const txEffect = await this.#l2BlockSource.getTxEffect(TxHash.fromString(meta.txHash));
1010
- if (txEffect) {
1011
- meta.minedL2BlockId = {
1012
- number: txEffect.l2BlockNumber,
1013
- hash: txEffect.l2BlockHash.toString(),
1014
- };
1015
- }
1016
- } catch (err) {
1017
- this.#log.warn(`Failed to check mined status for tx ${meta.txHash}`, { err });
1018
- }
1019
- }
1020
- }
1021
-
1022
1007
  /**
1023
1008
  * Rebuilds the pending pool by processing each tx through pre-add rules.
1024
1009
  * Starts with an empty pending pool and adds txs one by one, resolving conflicts.
@@ -24,7 +24,7 @@ This module validates `CheckpointAttestation` gossipsub messages. Attestations a
24
24
  |---|------|-------------|
25
25
  | 8 | Sender recoverable (pool-side) | Silent drop |
26
26
  | 9 | Not a duplicate (same slot + proposalId + signer) | IGNORE |
27
- | 10 | Per-signer cap: `MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER` = 3 | IGNORE |
27
+ | 10 | Per-signer cap: `MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER` = 2 | IGNORE |
28
28
 
29
29
  Own attestations added via `addOwnCheckpointAttestations` bypass the per-signer cap.
30
30
 
@@ -3,19 +3,35 @@ import { NoCommitteeError } from '@aztec/ethereum/contracts';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import {
5
5
  type CheckpointAttestation,
6
+ type CoordinationSignatureContext,
6
7
  type P2PValidator,
7
8
  PeerErrorSeverity,
8
9
  type ValidationResult,
10
+ hasValidSignatureContext,
9
11
  } from '@aztec/stdlib/p2p';
10
12
 
11
- import { isWithinClockTolerance } from '../clock_tolerance.js';
13
+ import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
12
14
 
13
15
  export class CheckpointAttestationValidator implements P2PValidator<CheckpointAttestation> {
14
16
  protected epochCache: EpochCacheInterface;
15
17
  protected logger: Logger;
18
+ private readonly pipeliningWindow: PipeliningWindow;
19
+ protected readonly signatureContext: CoordinationSignatureContext;
16
20
 
17
- constructor(epochCache: EpochCacheInterface) {
21
+ constructor(
22
+ epochCache: EpochCacheInterface,
23
+ opts: {
24
+ l1PublishingTime?: number;
25
+ p2pPropagationTime?: number;
26
+ signatureContext: CoordinationSignatureContext;
27
+ },
28
+ ) {
18
29
  this.epochCache = epochCache;
30
+ this.pipeliningWindow = new PipeliningWindow(epochCache, {
31
+ l1PublishingTime: opts.l1PublishingTime,
32
+ p2pPropagationTime: opts.p2pPropagationTime,
33
+ });
34
+ this.signatureContext = opts.signatureContext;
19
35
  this.logger = createLogger('p2p:checkpoint-attestation-validator');
20
36
  }
21
37
 
@@ -23,18 +39,34 @@ export class CheckpointAttestationValidator implements P2PValidator<CheckpointAt
23
39
  const slotNumber = message.payload.header.slotNumber;
24
40
 
25
41
  try {
26
- const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
42
+ // Cross-chain replay check: reject attestations that carry a foreign signing domain.
43
+ if (!hasValidSignatureContext(message.payload, this.signatureContext)) {
44
+ this.logger.warn(`Rejecting checkpoint attestation with foreign signature context for slot ${slotNumber}`, {
45
+ chainId: message.payload.signatureContext.chainId,
46
+ rollupAddress: message.payload.signatureContext.rollupAddress.toString(),
47
+ expectedChainId: this.signatureContext.chainId,
48
+ expectedRollupAddress: this.signatureContext.rollupAddress.toString(),
49
+ });
50
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
51
+ }
52
+
53
+ // Use target slots since proposals target pipeline slots (slot + 1 when pipelining).
54
+ const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
27
55
 
28
- if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
29
- // Check if message is for previous slot and within clock tolerance
30
- if (!isWithinClockTolerance(slotNumber, currentSlot, this.epochCache)) {
56
+ if (slotNumber !== targetSlot && slotNumber !== nextSlot) {
57
+ // When pipelining, accept attestations for the current slot (built in the previous slot)
58
+ // until the target slot reaches its L1 publish cutoff.
59
+ if (this.pipeliningWindow.acceptsAttestation(slotNumber)) {
60
+ // Fall through to remaining validation (signature, committee, etc.)
61
+ } else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
31
62
  this.logger.warn(
32
- `Checkpoint attestation slot ${slotNumber} is not current (${currentSlot}) or next (${nextSlot}) slot`,
63
+ `Checkpoint attestation slot ${slotNumber} is not current (${targetSlot}) or next (${nextSlot}) slot`,
33
64
  );
34
65
  return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
66
+ } else {
67
+ this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
68
+ return { result: 'ignore' };
35
69
  }
36
- this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
37
- return { result: 'ignore' };
38
70
  }
39
71
 
40
72
  // Verify the signature is valid
@@ -1,5 +1,10 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import { type CheckpointAttestation, PeerErrorSeverity, type ValidationResult } from '@aztec/stdlib/p2p';
2
+ import {
3
+ type CheckpointAttestation,
4
+ type CoordinationSignatureContext,
5
+ PeerErrorSeverity,
6
+ type ValidationResult,
7
+ } from '@aztec/stdlib/p2p';
3
8
  import { Attributes, Metrics, type TelemetryClient, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
4
9
 
5
10
  import type { AttestationPoolApi } from '../../mem_pools/attestation_pool/attestation_pool.js';
@@ -20,8 +25,13 @@ export class FishermanAttestationValidator extends CheckpointAttestationValidato
20
25
  epochCache: EpochCacheInterface,
21
26
  private attestationPool: AttestationPoolApi,
22
27
  telemetryClient: TelemetryClient,
28
+ opts: {
29
+ l1PublishingTime?: number;
30
+ p2pPropagationTime?: number;
31
+ signatureContext: CoordinationSignatureContext;
32
+ },
23
33
  ) {
24
- super(epochCache);
34
+ super(epochCache, opts);
25
35
  this.logger = this.logger.createChild('[FISHERMAN]');
26
36
 
27
37
  const meter = telemetryClient.getMeter('FishermanAttestationValidator');
@@ -54,8 +64,7 @@ export class FishermanAttestationValidator extends CheckpointAttestationValidato
54
64
  return { result: 'accept' };
55
65
  }
56
66
 
57
- const proposalId = message.archive.toString();
58
- const proposal = await this.attestationPool.getCheckpointProposal(proposalId);
67
+ const proposal = await this.attestationPool.getCheckpointProposal(message.payload.header.slotNumber);
59
68
 
60
69
  if (proposal) {
61
70
  // Compare the attestation payload with the proposal payload
@@ -84,9 +93,7 @@ export class FishermanAttestationValidator extends CheckpointAttestationValidato
84
93
  }
85
94
  } else {
86
95
  // We might receive attestations before proposals in some cases
87
- this.logger.debug(
88
- `Received attestation for slot ${slotNumberBigInt} but proposal not found yet. ` + `Proposal ID: ${proposalId}`,
89
- );
96
+ this.logger.debug(`Received attestation for slot ${slotNumberBigInt} but proposal not found yet.`);
90
97
  }
91
98
 
92
99
  return { result: 'accept' };