@aztec/p2p 0.0.1-commit.343b43af6 → 0.0.1-commit.350e0a4d

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 (435) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +4 -3
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +36 -19
  8. package/dest/client/interface.d.ts +48 -11
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +34 -19
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +115 -50
  13. package/dest/config.d.ts +147 -105
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +80 -24
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +272 -199
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +224 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +9 -4
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +28 -9
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -2
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  55. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +39 -9
  56. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  58. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +13 -3
  59. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +20 -7
  61. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  62. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +31 -0
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -4
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +22 -8
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -4
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +217 -120
  70. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  71. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  72. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  73. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  74. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  75. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  76. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  77. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  79. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  80. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  81. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  82. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  83. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
  85. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  86. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  88. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  89. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  90. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  91. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  92. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  93. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  94. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  95. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  96. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  97. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  99. package/dest/msg_validators/tx_validator/factory.d.ts +22 -15
  100. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/factory.js +51 -19
  102. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  103. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  105. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  106. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/index.js +2 -0
  108. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  109. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/phases_validator.js +30 -3
  111. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  112. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  114. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  115. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  116. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  117. package/dest/services/data_store.d.ts +1 -1
  118. package/dest/services/data_store.d.ts.map +1 -1
  119. package/dest/services/data_store.js +5 -5
  120. package/dest/services/discv5/discV5_service.d.ts +13 -2
  121. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  122. package/dest/services/discv5/discV5_service.js +119 -23
  123. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  124. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  125. package/dest/services/discv5/persisted_enr_store.js +145 -0
  126. package/dest/services/dummy_service.d.ts +15 -15
  127. package/dest/services/dummy_service.d.ts.map +1 -1
  128. package/dest/services/dummy_service.js +15 -16
  129. package/dest/services/encoding.d.ts +23 -6
  130. package/dest/services/encoding.d.ts.map +1 -1
  131. package/dest/services/encoding.js +32 -16
  132. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  133. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  134. package/dest/services/gossipsub/topic_score_params.js +4 -14
  135. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  136. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  137. package/dest/services/libp2p/instrumentation.js +14 -0
  138. package/dest/services/libp2p/libp2p_service.d.ts +45 -47
  139. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  140. package/dest/services/libp2p/libp2p_service.js +392 -300
  141. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  142. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  143. package/dest/services/peer-manager/peer_manager.js +81 -25
  144. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  145. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  146. package/dest/services/peer-manager/peer_scoring.js +102 -13
  147. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  148. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  149. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +81 -86
  150. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  151. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  152. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  153. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  154. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  155. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  156. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  157. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  158. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  159. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  160. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  161. package/dest/services/reqresp/config.d.ts +15 -3
  162. package/dest/services/reqresp/config.d.ts.map +1 -1
  163. package/dest/services/reqresp/config.js +11 -0
  164. package/dest/services/reqresp/interface.d.ts +16 -18
  165. package/dest/services/reqresp/interface.d.ts.map +1 -1
  166. package/dest/services/reqresp/interface.js +10 -20
  167. package/dest/services/reqresp/metrics.d.ts +1 -1
  168. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  169. package/dest/services/reqresp/metrics.js +0 -1
  170. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  171. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  172. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  173. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  174. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  175. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  176. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  177. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  178. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  179. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  180. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  181. package/dest/services/reqresp/protocols/index.js +0 -1
  182. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  183. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  184. package/dest/services/reqresp/protocols/tx.js +1 -3
  185. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  186. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  187. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  188. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  189. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  190. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  191. package/dest/services/reqresp/reqresp.d.ts +7 -29
  192. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  193. package/dest/services/reqresp/reqresp.js +73 -215
  194. package/dest/services/service.d.ts +25 -12
  195. package/dest/services/service.d.ts.map +1 -1
  196. package/dest/services/tx_collection/config.d.ts +2 -23
  197. package/dest/services/tx_collection/config.d.ts.map +1 -1
  198. package/dest/services/tx_collection/config.js +2 -55
  199. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  200. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  201. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  202. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  203. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  204. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  205. package/dest/services/tx_collection/index.d.ts +2 -3
  206. package/dest/services/tx_collection/index.d.ts.map +1 -1
  207. package/dest/services/tx_collection/index.js +0 -1
  208. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  209. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  210. package/dest/services/tx_collection/instrumentation.js +0 -2
  211. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  212. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  213. package/dest/services/tx_collection/request_tracker.js +84 -0
  214. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  215. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  216. package/dest/services/tx_collection/tx_collection.js +275 -119
  217. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  218. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  219. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  220. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  221. package/dest/services/tx_collection/tx_source.js +13 -8
  222. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  223. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  224. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  225. package/dest/services/tx_provider.d.ts +3 -1
  226. package/dest/services/tx_provider.d.ts.map +1 -1
  227. package/dest/services/tx_provider.js +3 -0
  228. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  229. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  230. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  231. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  232. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  233. package/dest/test-helpers/mock-pubsub.js +44 -44
  234. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  235. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  236. package/dest/test-helpers/reqresp-nodes.js +16 -18
  237. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  238. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  239. package/dest/test-helpers/test_tx_provider.js +3 -0
  240. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  241. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  242. package/dest/test-helpers/testbench-utils.js +47 -14
  243. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  244. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  245. package/dest/testbench/p2p_client_testbench_worker.js +102 -40
  246. package/dest/testbench/worker_client_manager.d.ts +10 -6
  247. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  248. package/dest/testbench/worker_client_manager.js +51 -9
  249. package/dest/util.d.ts +11 -6
  250. package/dest/util.d.ts.map +1 -1
  251. package/dest/util.js +35 -14
  252. package/dest/versioning.d.ts +3 -6
  253. package/dest/versioning.d.ts.map +1 -1
  254. package/dest/versioning.js +3 -24
  255. package/package.json +16 -16
  256. package/src/bootstrap/bootstrap.ts +17 -3
  257. package/src/client/factory.ts +57 -11
  258. package/src/client/interface.ts +44 -17
  259. package/src/client/p2p_client.ts +138 -83
  260. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  261. package/src/config.ts +160 -31
  262. package/src/errors/p2p-service.error.ts +11 -0
  263. package/src/errors/reqresp.error.ts +13 -19
  264. package/src/index.ts +0 -1
  265. package/src/mem_pools/attestation_pool/attestation_pool.ts +327 -242
  266. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
  267. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  268. package/src/mem_pools/index.ts +0 -3
  269. package/src/mem_pools/instrumentation.ts +18 -12
  270. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  271. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  272. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -2
  273. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  274. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  275. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  276. package/src/mem_pools/tx_pool_v2/interfaces.ts +37 -8
  277. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +31 -9
  278. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
  279. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +35 -9
  280. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +243 -125
  281. package/src/msg_validators/attestation_validator/README.md +49 -0
  282. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  283. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  284. package/src/msg_validators/proposal_validator/README.md +123 -0
  285. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  286. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  287. package/src/msg_validators/proposal_validator/proposal_validator.ts +95 -12
  288. package/src/msg_validators/tx_validator/README.md +17 -3
  289. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  290. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  291. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  292. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  293. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  294. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  295. package/src/msg_validators/tx_validator/factory.ts +65 -21
  296. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  297. package/src/msg_validators/tx_validator/index.ts +2 -0
  298. package/src/msg_validators/tx_validator/phases_validator.ts +33 -3
  299. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  300. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  301. package/src/services/data_store.ts +5 -13
  302. package/src/services/discv5/discV5_service.ts +126 -14
  303. package/src/services/discv5/persisted_enr_store.ts +158 -0
  304. package/src/services/dummy_service.ts +20 -39
  305. package/src/services/encoding.ts +35 -19
  306. package/src/services/gossipsub/README.md +33 -11
  307. package/src/services/gossipsub/topic_score_params.ts +9 -18
  308. package/src/services/libp2p/instrumentation.ts +14 -0
  309. package/src/services/libp2p/libp2p_service.ts +444 -339
  310. package/src/services/peer-manager/peer_manager.ts +89 -24
  311. package/src/services/peer-manager/peer_scoring.ts +102 -8
  312. package/src/services/reqresp/README.md +194 -0
  313. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  314. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
  315. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  316. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  317. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  318. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  319. package/src/services/reqresp/config.ts +19 -2
  320. package/src/services/reqresp/interface.ts +21 -47
  321. package/src/services/reqresp/metrics.ts +0 -1
  322. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  323. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  324. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  325. package/src/services/reqresp/protocols/index.ts +0 -1
  326. package/src/services/reqresp/protocols/tx.ts +1 -3
  327. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  328. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  329. package/src/services/reqresp/reqresp.ts +84 -259
  330. package/src/services/service.ts +31 -28
  331. package/src/services/tx_collection/config.ts +3 -80
  332. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  333. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  334. package/src/services/tx_collection/index.ts +1 -6
  335. package/src/services/tx_collection/instrumentation.ts +1 -7
  336. package/src/services/tx_collection/request_tracker.ts +127 -0
  337. package/src/services/tx_collection/tx_collection.ts +331 -176
  338. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  339. package/src/services/tx_collection/tx_source.ts +10 -8
  340. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  341. package/src/services/tx_provider.ts +5 -0
  342. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  343. package/src/test-helpers/mock-pubsub.ts +46 -60
  344. package/src/test-helpers/reqresp-nodes.ts +12 -22
  345. package/src/test-helpers/test_tx_provider.ts +5 -0
  346. package/src/test-helpers/testbench-utils.ts +62 -28
  347. package/src/testbench/p2p_client_testbench_worker.ts +109 -56
  348. package/src/testbench/worker_client_manager.ts +59 -20
  349. package/src/util.ts +32 -17
  350. package/src/versioning.ts +3 -33
  351. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  352. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  353. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  354. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  355. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  356. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  357. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  358. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  359. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  360. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  361. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  362. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  363. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  364. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  365. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  366. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  367. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  368. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  369. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  370. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  372. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  373. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  375. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  376. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  377. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  378. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  379. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  380. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  381. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  382. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  383. package/dest/mem_pools/tx_pool/index.js +0 -2
  384. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  385. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  386. package/dest/mem_pools/tx_pool/priority.js +0 -16
  387. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  388. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  389. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  390. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  391. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  392. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  393. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  394. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  395. package/dest/msg_validators/clock_tolerance.js +0 -37
  396. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  397. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  398. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  399. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  400. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  401. package/dest/services/reqresp/protocols/block.js +0 -32
  402. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  403. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  404. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  405. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  406. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  407. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  408. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  409. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  410. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  411. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  412. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  413. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  414. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  415. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  416. package/src/mem_pools/tx_pool/README.md +0 -270
  417. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  418. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  419. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  420. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  421. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  422. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  423. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  424. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  425. package/src/mem_pools/tx_pool/index.ts +0 -2
  426. package/src/mem_pools/tx_pool/priority.ts +0 -23
  427. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  428. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  429. package/src/msg_validators/clock_tolerance.ts +0 -51
  430. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  431. package/src/services/reqresp/protocols/block.ts +0 -37
  432. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  433. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  434. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  435. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,6 +1,5 @@
1
1
  import { type Logger, createLogger } from '@aztec/foundation/log';
2
2
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
3
- import { ChonkProof } from '@aztec/stdlib/proofs';
4
3
  import { Tx, TxHash } from '@aztec/stdlib/tx';
5
4
 
6
5
  /**
@@ -70,7 +69,7 @@ export class TxArchive {
70
69
  }
71
70
 
72
71
  // Archive the transaction with stripped proof
73
- const archivedTx = this.stripProof(tx);
72
+ const archivedTx = tx.withoutProof();
74
73
  const txHash = tx.getTxHash().toString();
75
74
  await this.#txs.set(txHash, archivedTx.toBuffer());
76
75
  await this.#indices.set(headIdx, txHash);
@@ -101,13 +100,6 @@ export class TxArchive {
101
100
  return head - tail;
102
101
  }
103
102
 
104
- /**
105
- * Strips the proof from a transaction for archival.
106
- */
107
- private stripProof(tx: Tx): Tx {
108
- return new Tx(tx.txHash, tx.data, ChonkProof.empty(), tx.contractClassLogFields, tx.publicFunctionCalldata);
109
- }
110
-
111
103
  private async getHeadIndex(): Promise<number> {
112
104
  const entry = await this.#indices.entriesAsync({ limit: 1, reverse: true }).next();
113
105
  return (entry.value?.[0] ?? -1) + 1;
@@ -52,8 +52,8 @@ export class DeletedPool {
52
52
  /** Persisted map: txHash -> DeletedTxState (serialized) - for prune-based soft deletions */
53
53
  #deletedTxsDB: AztecAsyncMap<string, Buffer>;
54
54
 
55
- /** Reference to the main txs database for hard deletion */
56
- #txsDB: AztecAsyncMap<string, Buffer>;
55
+ /** Hard-deletes a tx's stored data (tx blob and proof) from the pool's stores. */
56
+ #deleteTxData: (txHash: string) => Promise<void>;
57
57
 
58
58
  /** In-memory state for transactions from pruned blocks */
59
59
  #state: Map<string, DeletedTxState> = new Map();
@@ -69,10 +69,10 @@ export class DeletedPool {
69
69
 
70
70
  #log: Logger;
71
71
 
72
- constructor(store: AztecAsyncKVStore, txsDB: AztecAsyncMap<string, Buffer>, log: Logger) {
72
+ constructor(store: AztecAsyncKVStore, deleteTxData: (txHash: string) => Promise<void>, log: Logger) {
73
73
  this.#deletedTxsDB = store.openMap('deleted_txs');
74
74
  this.#slotDeletedDB = store.openSet('slot_deleted_txs');
75
- this.#txsDB = txsDB;
75
+ this.#deleteTxData = deleteTxData;
76
76
  this.#log = log;
77
77
  }
78
78
 
@@ -100,7 +100,7 @@ export class DeletedPool {
100
100
  // Slot-deleted txs are stale after restart - hard-delete them all
101
101
  let slotDeletedCount = 0;
102
102
  for await (const txHash of this.#slotDeletedDB.entriesAsync()) {
103
- await this.#txsDB.delete(txHash);
103
+ await this.#deleteTxData(txHash);
104
104
  await this.#slotDeletedDB.delete(txHash);
105
105
  slotDeletedCount++;
106
106
  }
@@ -234,7 +234,7 @@ export class DeletedPool {
234
234
  for (const txHash of toHardDelete) {
235
235
  this.#state.delete(txHash);
236
236
  await this.#deletedTxsDB.delete(txHash);
237
- await this.#txsDB.delete(txHash);
237
+ await this.#deleteTxData(txHash);
238
238
  }
239
239
 
240
240
  this.#log.debug(`Finalized ${toHardDelete.length} txs from pruned blocks at block ${finalizedBlockNumber}`, {
@@ -266,7 +266,7 @@ export class DeletedPool {
266
266
  for (const txHash of toHardDelete) {
267
267
  this.#slotDeletedTxs.delete(txHash);
268
268
  await this.#slotDeletedDB.delete(txHash);
269
- await this.#txsDB.delete(txHash);
269
+ await this.#deleteTxData(txHash);
270
270
  }
271
271
 
272
272
  this.#log.debug(
@@ -29,7 +29,8 @@ export class FeePayerBalanceEvictionRule implements EvictionRule {
29
29
 
30
30
  if (context.event === EvictionEvent.BLOCK_MINED) {
31
31
  const blockNumber = context.block.getBlockNumber();
32
- await this.worldState.syncImmediate(blockNumber);
32
+ const blockHash = await context.block.hash();
33
+ await this.worldState.syncImmediate(blockNumber, blockHash);
33
34
  return await this.evictForFeePayers(context.feePayers, this.worldState.getSnapshot(blockNumber), pool);
34
35
  }
35
36
 
@@ -85,7 +86,7 @@ export class FeePayerBalanceEvictionRule implements EvictionRule {
85
86
  publicStateSource: DatabasePublicStateSource,
86
87
  pool: PoolOperations,
87
88
  ): Promise<string[]> {
88
- const feePayer = AztecAddress.fromString(feePayerStr);
89
+ const feePayer = AztecAddress.fromStringUnsafe(feePayerStr);
89
90
  const initialBalance = (
90
91
  await publicStateSource.storageRead(
91
92
  ProtocolContractAddress.FeeJuice,
@@ -21,6 +21,7 @@ export { FeePayerBalancePreAddRule } from './fee_payer_balance_pre_add_rule.js';
21
21
  export { LowPriorityPreAddRule } from './low_priority_pre_add_rule.js';
22
22
 
23
23
  // Post-event eviction rules
24
+ export { InsufficientFeePerGasEvictionRule } from './insufficient_fee_per_gas_eviction_rule.js';
24
25
  export { InvalidTxsAfterMiningRule } from './invalid_txs_after_mining_rule.js';
25
26
  export { InvalidTxsAfterReorgRule } from './invalid_txs_after_reorg_rule.js';
26
27
  export { FeePayerBalanceEvictionRule } from './fee_payer_balance_eviction_rule.js';
@@ -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
 
@@ -48,6 +49,11 @@ export type TxPoolV2Config = {
48
49
  dropTransactionsProbability: number;
49
50
  /** Minimum percentage fee increase required to replace an existing tx via RPC (0 = no bump). */
50
51
  priceBumpPercentage: bigint;
52
+ /**
53
+ * Number of slots behind the finalized tip to keep finalized txs for before deleting them. 0 deletes
54
+ * at the finalized tip (default).
55
+ */
56
+ keepFinalizedTxsForSlots: number;
51
57
  };
52
58
 
53
59
  /**
@@ -60,6 +66,7 @@ export const DEFAULT_TX_POOL_V2_CONFIG: TxPoolV2Config = {
60
66
  evictedTxCacheSize: 10_000,
61
67
  dropTransactionsProbability: 0,
62
68
  priceBumpPercentage: 10n,
69
+ keepFinalizedTxsForSlots: 0,
63
70
  };
64
71
 
65
72
  /**
@@ -72,6 +79,10 @@ export type TxPoolV2Dependencies = {
72
79
  worldStateSynchronizer: WorldStateSynchronizer;
73
80
  /** Factory that creates a validator for re-validating pool transactions using metadata */
74
81
  createTxValidator: () => Promise<TxValidator<TxMetaData>>;
82
+ /** Checks whether a tx's setup-phase calls are on the allow list. Precomputed at receipt time. */
83
+ checkAllowedSetupCalls: (tx: Tx) => Promise<boolean>;
84
+ /** Provides projected minimum fees for the next block. Used by eviction rules instead of stale block header fees. */
85
+ blockMinFeesProvider: BlockMinFeesProvider;
75
86
  };
76
87
 
77
88
  /**
@@ -158,13 +169,24 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
158
169
  handleMinedBlock(block: L2Block): Promise<void>;
159
170
 
160
171
  /**
161
- * Prepares the pool for a new slot.
162
- * Unprotects transactions from earlier slots and validates them before
163
- * returning to pending state.
164
- * @param slotNumber - The slot number to prepare for
172
+ * Prepares the pool for a new slot by unprotecting transactions from earlier
173
+ * slots and re-validating them before returning to pending state.
174
+ * @param slotNumber - The pipeline slot we are building for (i.e. the slot
175
+ * the resulting blocks will target on L1).
165
176
  */
166
177
  prepareForSlot(slotNumber: SlotNumber): Promise<void>;
167
178
 
179
+ /**
180
+ * Releases the protections a failed block proposal created and restores the txs to pending.
181
+ * Only clears protection entries still recorded at exactly the given slot: a tx that another,
182
+ * still-live proposal raised to a higher slot via {@link protectTxs} keeps its protection, and
183
+ * mined txs (which carry no protection entry) are left untouched. Restored txs are re-validated
184
+ * and resolved against nullifier conflicts before re-entering the pending indices.
185
+ * @param txHashes - Hashes of the proposal's txs to release.
186
+ * @param slotNumber - The slot the failed proposal targeted; protection is released only for this slot.
187
+ */
188
+ unprotectTxs(txHashes: TxHash[], slotNumber: SlotNumber): Promise<void>;
189
+
168
190
  /**
169
191
  * Handles pruned blocks during a reorg.
170
192
  * Un-mines all transactions mined in blocks beyond the given latest block
@@ -187,11 +209,11 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
187
209
  */
188
210
  handleFinalizedBlock(block: BlockHeader): Promise<void>;
189
211
 
190
- /** Gets a transaction by its hash */
191
- getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
212
+ /** Gets a transaction by its hash. Set `includeProof: false` to skip loading the proof from the DB. */
213
+ getTxByHash(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined>;
192
214
 
193
- /** Gets multiple transactions by their hashes */
194
- getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
215
+ /** Gets multiple transactions by their hashes. Set `includeProof: false` to skip loading proofs from the DB. */
216
+ getTxsByHash(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]>;
195
217
 
196
218
  /** Checks if transactions exist in the pool */
197
219
  hasTxs(txHashes: TxHash[]): Promise<boolean[]>;
@@ -208,6 +230,13 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
208
230
  /** Gets the count of pending transactions */
209
231
  getPendingTxCount(): Promise<number>;
210
232
 
233
+ /**
234
+ * Returns whether at least `minCount` pending transactions are old enough per minTxPoolAgeMs to be eligible
235
+ * for block building. Stops scanning once the threshold is reached, so it is cheaper than counting all
236
+ * eligible txs when only a few are needed.
237
+ */
238
+ hasEligiblePendingTxs(minCount: number): Promise<boolean>;
239
+
211
240
  /** Gets mined transaction hashes with their block IDs */
212
241
  getMinedTxHashes(): Promise<[TxHash, L2BlockId][]>;
213
242
 
@@ -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
  };
@@ -67,6 +67,9 @@ export type TxMetaData = {
67
67
  /** Timestamp by which the transaction must be included (for expiration checks) */
68
68
  readonly expirationTimestamp: bigint;
69
69
 
70
+ /** Whether the tx's setup-phase calls pass the allow list check. Computed at receipt time. */
71
+ readonly allowedSetupCalls: boolean;
72
+
70
73
  /** Validator-compatible data, providing the same access patterns as Tx.data */
71
74
  readonly data: TxMetaValidationData;
72
75
 
@@ -84,8 +87,12 @@ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
84
87
  * Builds TxMetaData from a full Tx object.
85
88
  * Extracts all relevant fields for efficient in-memory storage and querying.
86
89
  * Fr values are captured in closures for zero-cost re-validation.
90
+ *
91
+ * @param allowedSetupCalls - Whether the tx's setup-phase calls pass the allow list.
92
+ * For gossip/RPC txs this is always `true` (already validated by PhasesTxValidator).
93
+ * For req/resp txs this should be computed by the caller using the phases validator.
87
94
  */
88
- export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
95
+ export async function buildTxMetaData(tx: Tx, allowedSetupCalls: boolean = true): Promise<TxMetaData> {
89
96
  const txHashObj = tx.getTxHash();
90
97
  const txHash = txHashObj.toString();
91
98
  const txHashBigInt = txHashObj.toBigInt();
@@ -112,6 +119,7 @@ export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
112
119
  feeLimit,
113
120
  nullifiers,
114
121
  expirationTimestamp,
122
+ allowedSetupCalls,
115
123
  receivedAt: 0,
116
124
  estimatedSizeBytes,
117
125
  data: {
@@ -124,7 +132,10 @@ export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
124
132
  globalVariables: { blockNumber: anchorBlockNumber },
125
133
  },
126
134
  txContext: {
127
- 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
+ },
128
139
  },
129
140
  },
130
141
  },
@@ -277,17 +288,19 @@ export function checkNullifierConflict(
277
288
  }
278
289
 
279
290
  /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
280
- export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigint } = {}): TxMetaValidationData {
291
+ export function stubTxMetaValidationData(
292
+ overrides: { expirationTimestamp?: bigint; maxFeesPerGas?: GasFees } = {},
293
+ ): TxMetaValidationData {
281
294
  return {
282
295
  getNonEmptyNullifiers: () => [],
283
296
  expirationTimestamp: overrides.expirationTimestamp ?? 0n,
284
297
  constants: {
285
298
  anchorBlockHeader: {
286
- hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
299
+ hash: () => Promise.resolve(BlockHash.ZERO),
287
300
  globalVariables: { blockNumber: BlockNumber(0) },
288
301
  },
289
302
  txContext: {
290
- gasSettings: { gasLimits: Gas.empty() },
303
+ gasSettings: { gasLimits: Gas.empty(), maxFeesPerGas: overrides.maxFeesPerGas ?? GasFees.empty() },
291
304
  },
292
305
  },
293
306
  };
@@ -304,6 +317,8 @@ export function stubTxMetaData(
304
317
  nullifiers?: string[];
305
318
  expirationTimestamp?: bigint;
306
319
  anchorBlockHeaderHash?: string;
320
+ allowedSetupCalls?: boolean;
321
+ maxFeesPerGas?: GasFees;
307
322
  } = {},
308
323
  ): TxMetaData {
309
324
  const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
@@ -320,8 +335,15 @@ export function stubTxMetaData(
320
335
  feeLimit: overrides.feeLimit ?? 100n,
321
336
  nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
322
337
  expirationTimestamp,
338
+ allowedSetupCalls: overrides.allowedSetupCalls ?? true,
323
339
  receivedAt: 0,
324
340
  estimatedSizeBytes: 0,
325
- data: stubTxMetaValidationData({ expirationTimestamp }),
341
+ data: stubTxMetaValidationData({ expirationTimestamp, maxFeesPerGas: overrides.maxFeesPerGas }),
326
342
  };
327
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
+ }
@@ -131,6 +131,9 @@ export class TxPoolIndices {
131
131
  meta.minedL2BlockId = blockId;
132
132
  // Safe to call unconditionally - removeFromPendingIndices is idempotent
133
133
  this.#removeFromPendingIndices(meta);
134
+ // A mined tx supersedes any protection: drop the stale entry so it can't linger in the map and
135
+ // be matched by later protection scans.
136
+ this.#protectedTransactions.delete(meta.txHash);
134
137
  }
135
138
 
136
139
  /** Clears the mined status from a transaction */
@@ -225,6 +228,29 @@ export class TxPoolIndices {
225
228
  return this.#pendingByPriority.length;
226
229
  }
227
230
 
231
+ /**
232
+ * Returns whether at least `minCount` pending transactions were received at or before maxReceivedAt,
233
+ * i.e. are old enough to be eligible for block building. Stops as soon as the threshold is met, so it
234
+ * does not scan the whole pool when only a handful of eligible txs are needed. The total pending count
235
+ * is an upper bound on the eligible count, so a pool with fewer than `minCount` pending can never
236
+ * satisfy the threshold and short-circuits without scanning.
237
+ */
238
+ hasEligiblePendingTxs(maxReceivedAt: number, minCount: number): boolean {
239
+ if (minCount <= 0) {
240
+ return true;
241
+ }
242
+ if (this.#pendingByPriority.length < minCount) {
243
+ return false;
244
+ }
245
+ let count = 0;
246
+ for (const _ of this.iterateEligiblePendingByPriority('desc', maxReceivedAt)) {
247
+ if (++count >= minCount) {
248
+ return true;
249
+ }
250
+ }
251
+ return false;
252
+ }
253
+
228
254
  /** Gets the lowest priority pending transaction hashes (up to limit) */
229
255
  getLowestPriorityPending(limit: number): string[] {
230
256
  if (limit <= 0) {
@@ -316,6 +342,15 @@ export class TxPoolIndices {
316
342
  return result;
317
343
  }
318
344
 
345
+ /**
346
+ * From the given hashes, returns those whose protection is recorded at exactly the given slot.
347
+ * Used to release the protections a single block proposal created without disturbing entries a
348
+ * later proposal raised to a higher slot via updateProtection.
349
+ */
350
+ findProtectedTxsAtSlot(txHashes: string[], slotNumber: SlotNumber): string[] {
351
+ return txHashes.filter(txHash => this.#protectedTransactions.get(txHash) === slotNumber);
352
+ }
353
+
319
354
  /** Filters out transactions that are currently protected */
320
355
  filterUnprotected(txs: TxMetaData[]): TxMetaData[] {
321
356
  return txs.filter(meta => !this.#protectedTransactions.has(meta.txHash));
@@ -11,8 +11,16 @@ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-clien
11
11
  import EventEmitter from 'node:events';
12
12
 
13
13
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
14
- import type { AddTxsResult, TxPoolV2, TxPoolV2Config, TxPoolV2Dependencies, TxPoolV2Events } from './interfaces.js';
14
+ import type {
15
+ AddTxsResult,
16
+ PoolReadAccess,
17
+ TxPoolV2,
18
+ TxPoolV2Config,
19
+ TxPoolV2Dependencies,
20
+ TxPoolV2Events,
21
+ } from './interfaces.js';
15
22
  import type { TxState } from './tx_metadata.js';
23
+ import type { MinedTxInfo } from './tx_pool_v2_impl.js';
16
24
  import { TxPoolV2Impl } from './tx_pool_v2_impl.js';
17
25
 
18
26
  /**
@@ -49,17 +57,22 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
49
57
  // Create callbacks that the impl uses to notify us about events and metrics
50
58
  const callbacks = {
51
59
  onTxsAdded: (txs: Tx[], opts: { source?: string }) => {
52
- this.#metrics?.transactionsAdded(txs);
53
60
  this.emit('txs-added', { txs, ...opts });
54
61
  },
55
62
  onTxsRemoved: (txHashes: string[] | bigint[]) => {
56
- this.#metrics?.transactionsRemoved(txHashes);
57
63
  // Convert to TxHash objects for the event
58
64
  const hashes = txHashes.map(h => (typeof h === 'string' ? TxHash.fromString(h) : TxHash.fromBigInt(h)));
59
65
  this.emit('txs-removed', { txHashes: hashes });
60
66
  },
61
- onTxsMined: (txHashes: string[]) => {
62
- this.#metrics?.transactionsRemoved(txHashes);
67
+ onTxsMined: (minedTxs: MinedTxInfo[]) => {
68
+ // Pending-to-mined delay is derived from the tx's persisted receivedAt at the mined
69
+ // transition (see TxPoolV2Impl.handleMinedBlock), not the add/remove timestamp map —
70
+ // so eviction no longer pollutes MEMPOOL_TX_MINED_DELAY.
71
+ for (const { minedDelayMs } of minedTxs) {
72
+ if (minedDelayMs !== undefined) {
73
+ this.#metrics?.recordMinedDelay(minedDelayMs);
74
+ }
75
+ }
63
76
  },
64
77
  };
65
78
 
@@ -103,6 +116,10 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
103
116
  return this.#queue.put(() => this.#impl.prepareForSlot(slotNumber));
104
117
  }
105
118
 
119
+ unprotectTxs(txHashes: TxHash[], slotNumber: SlotNumber): Promise<void> {
120
+ return this.#queue.put(() => this.#impl.unprotectTxs(txHashes, slotNumber));
121
+ }
122
+
106
123
  handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void> {
107
124
  return this.#queue.put(() => this.#impl.handlePrunedBlocks(latestBlock, options));
108
125
  }
@@ -117,12 +134,12 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
117
134
 
118
135
  // === Queries ===
119
136
 
120
- getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
121
- return this.#queue.put(() => this.#impl.getTxByHash(txHash));
137
+ getTxByHash(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
138
+ return this.#queue.put(() => this.#impl.getTxByHash(txHash, opts));
122
139
  }
123
140
 
124
- getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
125
- return this.#queue.put(() => this.#impl.getTxsByHash(txHashes));
141
+ getTxsByHash(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
142
+ return this.#queue.put(() => this.#impl.getTxsByHash(txHashes, opts));
126
143
  }
127
144
 
128
145
  hasTxs(txHashes: TxHash[]): Promise<boolean[]> {
@@ -145,6 +162,10 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
145
162
  return this.#queue.put(() => Promise.resolve(this.#impl.getPendingTxCount()));
146
163
  }
147
164
 
165
+ hasEligiblePendingTxs(minCount: number): Promise<boolean> {
166
+ return this.#queue.put(() => Promise.resolve(this.#impl.hasEligiblePendingTxs(minCount)));
167
+ }
168
+
148
169
  getMinedTxHashes(): Promise<[TxHash, L2BlockId][]> {
149
170
  return this.#queue.put(() => Promise.resolve(this.#impl.getMinedTxHashes()));
150
171
  }
@@ -165,6 +186,11 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
165
186
  return this.#queue.put(() => Promise.resolve(this.#impl.getLowestPriorityPending(limit)));
166
187
  }
167
188
 
189
+ /** Returns read-only access to the pool. Used for testing. */
190
+ getPoolReadAccess(): PoolReadAccess {
191
+ return this.#impl.getPoolReadAccess();
192
+ }
193
+
168
194
  // === Configuration ===
169
195
 
170
196
  updateConfig(config: Partial<TxPoolV2Config>): Promise<void> {