@aztec/p2p 0.0.1-commit.b6e433891 → 0.0.1-commit.b8a057fa

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 (413) hide show
  1. package/README.md +7 -6
  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 +35 -25
  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 +105 -46
  13. package/dest/config.d.ts +143 -107
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +72 -26
  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 +98 -56
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +269 -196
  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 +218 -59
  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.js +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  53. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -5
  54. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  56. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
  57. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  59. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +31 -0
  62. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -3
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +19 -8
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -4
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +208 -118
  68. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  69. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  70. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -16
  71. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  72. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  73. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  74. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -3
  75. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
  77. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
  78. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  79. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
  80. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
  81. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  82. package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
  83. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  84. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  86. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  87. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  88. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  89. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  90. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  91. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  92. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  93. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  94. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  95. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  97. package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
  98. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  99. package/dest/msg_validators/tx_validator/factory.js +36 -17
  100. package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
  101. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
  103. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  104. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/index.js +2 -0
  106. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  107. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  108. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  110. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  111. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  112. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  113. package/dest/services/data_store.d.ts +1 -1
  114. package/dest/services/data_store.d.ts.map +1 -1
  115. package/dest/services/data_store.js +5 -5
  116. package/dest/services/discv5/discV5_service.d.ts +13 -2
  117. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  118. package/dest/services/discv5/discV5_service.js +119 -23
  119. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  120. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  121. package/dest/services/discv5/persisted_enr_store.js +145 -0
  122. package/dest/services/dummy_service.d.ts +15 -15
  123. package/dest/services/dummy_service.d.ts.map +1 -1
  124. package/dest/services/dummy_service.js +15 -16
  125. package/dest/services/encoding.d.ts +19 -6
  126. package/dest/services/encoding.d.ts.map +1 -1
  127. package/dest/services/encoding.js +25 -15
  128. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  129. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  130. package/dest/services/gossipsub/topic_score_params.js +4 -14
  131. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  132. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  133. package/dest/services/libp2p/instrumentation.js +14 -0
  134. package/dest/services/libp2p/libp2p_service.d.ts +45 -40
  135. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  136. package/dest/services/libp2p/libp2p_service.js +388 -279
  137. package/dest/services/peer-manager/peer_manager.d.ts +20 -3
  138. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  139. package/dest/services/peer-manager/peer_manager.js +79 -23
  140. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  141. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  142. package/dest/services/peer-manager/peer_scoring.js +102 -13
  143. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -8
  144. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  145. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +38 -44
  146. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
  147. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  148. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  149. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  150. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  151. package/dest/services/reqresp/config.d.ts +15 -3
  152. package/dest/services/reqresp/config.d.ts.map +1 -1
  153. package/dest/services/reqresp/config.js +11 -0
  154. package/dest/services/reqresp/interface.d.ts +16 -18
  155. package/dest/services/reqresp/interface.d.ts.map +1 -1
  156. package/dest/services/reqresp/interface.js +10 -20
  157. package/dest/services/reqresp/metrics.d.ts +1 -1
  158. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  159. package/dest/services/reqresp/metrics.js +0 -1
  160. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  161. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  162. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  163. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  164. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  165. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  166. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  167. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  168. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  169. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  170. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  171. package/dest/services/reqresp/protocols/index.js +0 -1
  172. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  173. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  174. package/dest/services/reqresp/protocols/tx.js +1 -3
  175. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  176. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  177. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  178. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  179. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  180. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  181. package/dest/services/reqresp/reqresp.d.ts +7 -29
  182. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  183. package/dest/services/reqresp/reqresp.js +59 -209
  184. package/dest/services/service.d.ts +25 -12
  185. package/dest/services/service.d.ts.map +1 -1
  186. package/dest/services/tx_collection/config.d.ts +2 -23
  187. package/dest/services/tx_collection/config.d.ts.map +1 -1
  188. package/dest/services/tx_collection/config.js +2 -55
  189. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  190. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  191. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  192. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  193. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  194. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  195. package/dest/services/tx_collection/index.d.ts +2 -3
  196. package/dest/services/tx_collection/index.d.ts.map +1 -1
  197. package/dest/services/tx_collection/index.js +0 -1
  198. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  199. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  200. package/dest/services/tx_collection/instrumentation.js +0 -2
  201. package/dest/services/tx_collection/tx_collection.d.ts +35 -51
  202. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  203. package/dest/services/tx_collection/tx_collection.js +275 -119
  204. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  205. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  206. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  207. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  208. package/dest/services/tx_collection/tx_source.js +13 -8
  209. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  210. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  211. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  212. package/dest/services/tx_provider.d.ts +3 -1
  213. package/dest/services/tx_provider.d.ts.map +1 -1
  214. package/dest/services/tx_provider.js +3 -0
  215. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  216. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  217. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  218. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  219. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  220. package/dest/test-helpers/mock-pubsub.js +44 -44
  221. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  222. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  223. package/dest/test-helpers/reqresp-nodes.js +16 -18
  224. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  225. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  226. package/dest/test-helpers/test_tx_provider.js +3 -0
  227. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  228. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  229. package/dest/test-helpers/testbench-utils.js +28 -13
  230. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  231. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  232. package/dest/testbench/p2p_client_testbench_worker.js +102 -41
  233. package/dest/testbench/worker_client_manager.d.ts +10 -6
  234. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  235. package/dest/testbench/worker_client_manager.js +51 -9
  236. package/dest/util.d.ts +11 -6
  237. package/dest/util.d.ts.map +1 -1
  238. package/dest/util.js +35 -14
  239. package/dest/versioning.d.ts +3 -6
  240. package/dest/versioning.d.ts.map +1 -1
  241. package/dest/versioning.js +3 -24
  242. package/package.json +16 -16
  243. package/src/bootstrap/bootstrap.ts +17 -3
  244. package/src/client/factory.ts +53 -24
  245. package/src/client/interface.ts +44 -17
  246. package/src/client/p2p_client.ts +125 -79
  247. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  248. package/src/config.ts +146 -34
  249. package/src/errors/p2p-service.error.ts +11 -0
  250. package/src/errors/reqresp.error.ts +13 -19
  251. package/src/index.ts +0 -1
  252. package/src/mem_pools/attestation_pool/attestation_pool.ts +324 -239
  253. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +238 -63
  254. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  255. package/src/mem_pools/index.ts +0 -3
  256. package/src/mem_pools/instrumentation.ts +18 -12
  257. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  258. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  259. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +1 -1
  260. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  261. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  262. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  263. package/src/mem_pools/tx_pool_v2/interfaces.ts +31 -4
  264. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +20 -8
  265. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
  266. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +22 -8
  267. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +233 -123
  268. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -15
  269. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  270. package/src/msg_validators/proposal_validator/README.md +1 -1
  271. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
  272. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
  273. package/src/msg_validators/proposal_validator/proposal_validator.ts +94 -12
  274. package/src/msg_validators/tx_validator/README.md +13 -3
  275. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  276. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  277. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  278. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  279. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  280. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  281. package/src/msg_validators/tx_validator/factory.ts +44 -20
  282. package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
  283. package/src/msg_validators/tx_validator/index.ts +2 -0
  284. package/src/msg_validators/tx_validator/phases_validator.ts +3 -3
  285. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  286. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  287. package/src/services/data_store.ts +5 -13
  288. package/src/services/discv5/discV5_service.ts +126 -14
  289. package/src/services/discv5/persisted_enr_store.ts +158 -0
  290. package/src/services/dummy_service.ts +20 -39
  291. package/src/services/encoding.ts +28 -20
  292. package/src/services/gossipsub/README.md +33 -11
  293. package/src/services/gossipsub/topic_score_params.ts +9 -18
  294. package/src/services/libp2p/instrumentation.ts +14 -0
  295. package/src/services/libp2p/libp2p_service.ts +439 -313
  296. package/src/services/peer-manager/peer_manager.ts +86 -22
  297. package/src/services/peer-manager/peer_scoring.ts +102 -8
  298. package/src/services/reqresp/README.md +2 -37
  299. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +42 -52
  300. package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
  301. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  302. package/src/services/reqresp/config.ts +19 -2
  303. package/src/services/reqresp/interface.ts +21 -47
  304. package/src/services/reqresp/metrics.ts +0 -1
  305. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  306. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  307. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  308. package/src/services/reqresp/protocols/index.ts +0 -1
  309. package/src/services/reqresp/protocols/tx.ts +1 -3
  310. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  311. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  312. package/src/services/reqresp/reqresp.ts +69 -252
  313. package/src/services/service.ts +31 -28
  314. package/src/services/tx_collection/config.ts +3 -80
  315. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  316. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  317. package/src/services/tx_collection/index.ts +1 -6
  318. package/src/services/tx_collection/instrumentation.ts +1 -7
  319. package/src/services/tx_collection/tx_collection.ts +330 -173
  320. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  321. package/src/services/tx_collection/tx_source.ts +10 -8
  322. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  323. package/src/services/tx_provider.ts +5 -0
  324. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  325. package/src/test-helpers/mock-pubsub.ts +46 -60
  326. package/src/test-helpers/reqresp-nodes.ts +12 -22
  327. package/src/test-helpers/test_tx_provider.ts +5 -0
  328. package/src/test-helpers/testbench-utils.ts +35 -26
  329. package/src/testbench/p2p_client_testbench_worker.ts +110 -55
  330. package/src/testbench/worker_client_manager.ts +59 -20
  331. package/src/util.ts +32 -17
  332. package/src/versioning.ts +3 -33
  333. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  334. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  335. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
  336. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  337. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  338. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  339. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  340. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  341. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  342. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  343. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  344. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  345. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  346. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  347. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  348. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  349. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  350. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  351. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  352. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  353. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  354. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  355. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  356. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  357. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  358. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  359. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  360. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  361. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  362. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  363. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  364. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  365. package/dest/mem_pools/tx_pool/index.js +0 -2
  366. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  367. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  368. package/dest/mem_pools/tx_pool/priority.js +0 -15
  369. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  370. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  372. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  373. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  375. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  376. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  377. package/dest/msg_validators/clock_tolerance.js +0 -38
  378. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  379. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  380. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  381. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  382. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  383. package/dest/services/reqresp/protocols/block.js +0 -32
  384. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  385. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  386. package/dest/services/tx_collection/fast_tx_collection.js +0 -311
  387. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
  388. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  389. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  390. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  391. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  392. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  393. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -344
  394. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  395. package/src/mem_pools/tx_pool/README.md +0 -270
  396. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  397. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  398. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  399. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  400. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  401. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  402. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  403. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  404. package/src/mem_pools/tx_pool/index.ts +0 -2
  405. package/src/mem_pools/tx_pool/priority.ts +0 -20
  406. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  407. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  408. package/src/msg_validators/clock_tolerance.ts +0 -52
  409. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  410. package/src/services/reqresp/protocols/block.ts +0 -37
  411. package/src/services/tx_collection/fast_tx_collection.ts +0 -361
  412. package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
  413. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -53,9 +53,11 @@ import type { TxMetaData } from '../../mem_pools/tx_pool_v2/tx_metadata.js';
53
53
  import { AggregateTxValidator } from './aggregate_tx_validator.js';
54
54
  import { ArchiveCache } from './archive_cache.js';
55
55
  import { type ArchiveSource, BlockHeaderTxValidator } from './block_header_validator.js';
56
+ import { CachedTxValidator } from './cached_tx_validator.js';
57
+ import { ContractInstanceTxValidator } from './contract_instance_validator.js';
56
58
  import { DataTxValidator } from './data_validator.js';
57
59
  import { DoubleSpendTxValidator, type NullifierSource } from './double_spend_validator.js';
58
- import { GasLimitsValidator, GasTxValidator } from './gas_validator.js';
60
+ import { GasLimitsValidator, GasTxValidator, MaxFeePerGasValidator } from './gas_validator.js';
59
61
  import { MetadataTxValidator } from './metadata_validator.js';
60
62
  import { NullifierCache } from './nullifier_cache.js';
61
63
  import { AllowedSetupCallsMetaValidator, PhasesTxValidator } from './phases_validator.js';
@@ -63,6 +65,7 @@ import { SizeTxValidator } from './size_validator.js';
63
65
  import { TimestampTxValidator } from './timestamp_validator.js';
64
66
  import { TxPermittedValidator } from './tx_permitted_validator.js';
65
67
  import { TxProofValidator } from './tx_proof_validator.js';
68
+ import { TxValidationCache } from './tx_validation_cache.js';
66
69
 
67
70
  /**
68
71
  * A validator paired with a peer penalty severity.
@@ -97,7 +100,7 @@ export function createFirstStageTxValidationsForGossipedTransactions(
97
100
  txsPermitted: boolean,
98
101
  allowedInSetup: AllowedElement[] = [],
99
102
  bindings?: LoggerBindings,
100
- gasLimitOpts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
103
+ gasLimitOpts?: { maxTxL2Gas?: number; maxTxDAGas?: number },
101
104
  ): Record<string, TransactionValidator> {
102
105
  const merkleTree = worldStateSynchronizer.getCommitted();
103
106
 
@@ -167,6 +170,10 @@ export function createFirstStageTxValidationsForGossipedTransactions(
167
170
  validator: new DataTxValidator(bindings),
168
171
  severity: PeerErrorSeverity.MidToleranceError,
169
172
  },
173
+ contractInstanceValidator: {
174
+ validator: new ContractInstanceTxValidator(bindings),
175
+ severity: PeerErrorSeverity.MidToleranceError,
176
+ },
170
177
  };
171
178
  }
172
179
 
@@ -205,8 +212,9 @@ function createTxValidatorForMinimumTxIntegrityChecks(
205
212
  rollupVersion: number;
206
213
  },
207
214
  bindings?: LoggerBindings,
215
+ cache?: TxValidationCache,
208
216
  ): TxValidator {
209
- return new AggregateTxValidator(
217
+ const aggregate = new AggregateTxValidator(
210
218
  new MetadataTxValidator(
211
219
  {
212
220
  l1ChainId: new Fr(l1ChainId),
@@ -217,9 +225,14 @@ function createTxValidatorForMinimumTxIntegrityChecks(
217
225
  bindings,
218
226
  ),
219
227
  new SizeTxValidator(bindings),
220
- new DataTxValidator(bindings),
221
- new TxProofValidator(verifier, bindings),
228
+ CachedTxValidator.new(new DataTxValidator(bindings), cache),
229
+ new ContractInstanceTxValidator(bindings),
230
+ CachedTxValidator.new(new TxProofValidator(verifier, bindings), cache),
222
231
  );
232
+
233
+ // This validator is not state-dependent so we can cache it.
234
+ const identifier = Symbol('TxValidatorForMinimumTxIntegrityChecks');
235
+ return CachedTxValidator.newWithIdentifier(aggregate, identifier, cache);
223
236
  }
224
237
 
225
238
  /**
@@ -228,7 +241,7 @@ function createTxValidatorForMinimumTxIntegrityChecks(
228
241
  * are invalid against current state. State-dependent checks happen when the tx
229
242
  * enters the pending pool or during block building.
230
243
  */
231
- export function createTxValidatorForReqResponseReceivedTxs(
244
+ export function createTxValidatorForOnDemandReceivedTxs(
232
245
  verifier: ClientProtocolCircuitVerifier,
233
246
  {
234
247
  l1ChainId,
@@ -238,8 +251,9 @@ export function createTxValidatorForReqResponseReceivedTxs(
238
251
  rollupVersion: number;
239
252
  },
240
253
  bindings?: LoggerBindings,
254
+ cache?: TxValidationCache,
241
255
  ): TxValidator {
242
- return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings);
256
+ return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings, cache);
243
257
  }
244
258
 
245
259
  /**
@@ -257,8 +271,9 @@ export function createTxValidatorForBlockProposalReceivedTxs(
257
271
  rollupVersion: number;
258
272
  },
259
273
  bindings?: LoggerBindings,
274
+ cache?: TxValidationCache,
260
275
  ): TxValidator {
261
- return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings);
276
+ return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings, cache);
262
277
  }
263
278
 
264
279
  /**
@@ -277,24 +292,24 @@ export function createTxValidatorForAcceptingTxsOverRPC(
277
292
  setupAllowList,
278
293
  gasFees,
279
294
  skipFeeEnforcement,
295
+ isSimulation,
280
296
  timestamp,
281
297
  blockNumber,
282
298
  txsPermitted,
283
- rollupManaLimit,
284
- maxBlockL2Gas,
285
- maxBlockDAGas,
299
+ maxTxL2Gas,
300
+ maxTxDAGas,
286
301
  }: {
287
302
  l1ChainId: number;
288
303
  rollupVersion: number;
289
304
  setupAllowList: AllowedElement[];
290
305
  gasFees: GasFees;
291
306
  skipFeeEnforcement?: boolean;
307
+ isSimulation?: boolean;
292
308
  timestamp: UInt64;
293
309
  blockNumber: BlockNumber;
294
310
  txsPermitted: boolean;
295
- rollupManaLimit: number;
296
- maxBlockL2Gas?: number;
297
- maxBlockDAGas?: number;
311
+ maxTxL2Gas?: number;
312
+ maxTxDAGas?: number;
298
313
  },
299
314
  bindings?: LoggerBindings,
300
315
  ): TxValidator<Tx> {
@@ -321,15 +336,22 @@ export function createTxValidatorForAcceptingTxsOverRPC(
321
336
  new BlockHeaderTxValidator(new ArchiveCache(db), bindings),
322
337
  new DoubleSpendTxValidator(new NullifierCache(db), bindings),
323
338
  new DataTxValidator(bindings),
339
+ new ContractInstanceTxValidator(bindings),
324
340
  ];
325
341
 
342
+ // Declared gas-limit admission is not fee enforcement, so it runs even when fees are skipped, but it is
343
+ // skipped during simulation: gas estimation submits intentionally-inflated `forEstimation` limits (above
344
+ // the per-tx max) and the wallet clamps the real tx to the admission limit afterward, so enforcing the
345
+ // limit on the estimation tx would reject a valid estimation. The fee-balance check below stays behind
346
+ // `skipFeeEnforcement`, and GasTxValidator is constructed without the limit opts so it does not re-run
347
+ // this same check.
348
+ if (!isSimulation) {
349
+ validators.push(new GasLimitsValidator<Tx>({ maxTxL2Gas, maxTxDAGas, bindings }));
350
+ }
351
+
326
352
  if (!skipFeeEnforcement) {
327
353
  validators.push(
328
- new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings, {
329
- rollupManaLimit,
330
- maxBlockL2Gas,
331
- maxBlockDAGas,
332
- }),
354
+ new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings),
333
355
  );
334
356
  }
335
357
 
@@ -415,7 +437,8 @@ export async function createTxValidatorForTransactionsEnteringPendingTxPool(
415
437
  worldStateSynchronizer: WorldStateSynchronizer,
416
438
  timestamp: bigint,
417
439
  blockNumber: BlockNumber,
418
- gasLimitOpts: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
440
+ gasLimitOpts: { maxTxL2Gas?: number; maxTxDAGas?: number },
441
+ gasFees: GasFees,
419
442
  bindings?: LoggerBindings,
420
443
  ): Promise<TxValidator<TxMetaData>> {
421
444
  await worldStateSynchronizer.syncImmediate();
@@ -433,6 +456,7 @@ export async function createTxValidatorForTransactionsEnteringPendingTxPool(
433
456
  };
434
457
  return new AggregateTxValidator<TxMetaData>(
435
458
  new GasLimitsValidator<TxMetaData>({ ...gasLimitOpts, bindings }),
459
+ new MaxFeePerGasValidator<TxMetaData>(gasFees, bindings),
436
460
  new TimestampTxValidator<TxMetaData>({ timestamp, blockNumber }, bindings),
437
461
  new DoubleSpendTxValidator<TxMetaData>(nullifierSource, bindings),
438
462
  new BlockHeaderTxValidator<TxMetaData>(archiveSource, bindings),
@@ -1,6 +1,6 @@
1
1
  import {
2
- MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT,
3
2
  MAX_PROCESSABLE_L2_GAS,
3
+ MAX_TX_DA_GAS,
4
4
  PRIVATE_TX_L2_GAS_OVERHEAD,
5
5
  PUBLIC_TX_L2_GAS_OVERHEAD,
6
6
  TX_DA_GAS_OVERHEAD,
@@ -36,6 +36,18 @@ export interface HasGasLimitData {
36
36
  };
37
37
  }
38
38
 
39
+ /** Structural interface for types that carry max fee per gas data, used by {@link MaxFeePerGasValidator}. */
40
+ export interface HasMaxFeePerGasData {
41
+ txHash: { toString(): string };
42
+ data: {
43
+ constants: {
44
+ txContext: {
45
+ gasSettings: { maxFeesPerGas: GasFees };
46
+ };
47
+ };
48
+ };
49
+ }
50
+
39
51
  /**
40
52
  * Validates that a transaction's gas limits are within acceptable bounds.
41
53
  *
@@ -52,22 +64,21 @@ export class GasLimitsValidator<T extends HasGasLimitData> implements TxValidato
52
64
  #log: Logger;
53
65
  #effectiveMaxL2Gas: number;
54
66
  #effectiveMaxDAGas: number;
55
- #rollupManaLimit: number;
56
- #maxBlockL2Gas: number;
57
- #maxBlockDAGas: number;
58
-
59
- constructor(opts?: {
60
- rollupManaLimit?: number;
61
- maxBlockL2Gas?: number;
62
- maxBlockDAGas?: number;
63
- bindings?: LoggerBindings;
64
- }) {
67
+
68
+ /**
69
+ * @param maxTxL2Gas - The network admission limit on L2 gas a single tx may declare (the per-block mana
70
+ * allocation, see {@link computeNetworkTxGasLimits}). Defaults to the per-tx protocol maximum, so callers
71
+ * that pass nothing (e.g. block building) enforce only the protocol ceiling.
72
+ * @param maxTxDAGas - The network admission limit on DA gas a single tx may declare. Defaults to the
73
+ * per-tx protocol maximum {@link MAX_TX_DA_GAS}.
74
+ */
75
+ constructor(opts?: { maxTxL2Gas?: number; maxTxDAGas?: number; bindings?: LoggerBindings }) {
65
76
  this.#log = createLogger('sequencer:tx_validator:tx_gas', opts?.bindings);
66
- this.#rollupManaLimit = opts?.rollupManaLimit ?? Infinity;
67
- this.#maxBlockL2Gas = opts?.maxBlockL2Gas ?? Infinity;
68
- this.#maxBlockDAGas = opts?.maxBlockDAGas ?? Infinity;
69
- this.#effectiveMaxL2Gas = Math.min(MAX_PROCESSABLE_L2_GAS, this.#rollupManaLimit, this.#maxBlockL2Gas);
70
- this.#effectiveMaxDAGas = Math.min(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, this.#maxBlockDAGas);
77
+ // The passed limits are network admission limits; clamp to the per-tx protocol maxima as a hard ceiling.
78
+ // MAX_TX_DA_GAS bounds DA by what a single tx can actually post to a blob; declaring more is meaningless
79
+ // and would let a tx reserve checkpoint/block DA budget during proposal building it can't use.
80
+ this.#effectiveMaxL2Gas = Math.min(MAX_PROCESSABLE_L2_GAS, opts?.maxTxL2Gas ?? Infinity);
81
+ this.#effectiveMaxDAGas = Math.min(MAX_TX_DA_GAS, opts?.maxTxDAGas ?? Infinity);
71
82
  }
72
83
 
73
84
  validateTx(tx: T): Promise<TxValidationResult> {
@@ -87,41 +98,94 @@ export class GasLimitsValidator<T extends HasGasLimitData> implements TxValidato
87
98
  gasLimits,
88
99
  minGasLimits,
89
100
  });
90
- return { result: 'invalid', reason: [TX_ERROR_INSUFFICIENT_GAS_LIMIT] };
101
+ return {
102
+ result: 'invalid',
103
+ reason: [
104
+ `${TX_ERROR_INSUFFICIENT_GAS_LIMIT} (required=da:${minGasLimits.daGas},l2:${minGasLimits.l2Gas} got=da:${gasLimits.daGas},l2:${gasLimits.l2Gas})`,
105
+ ],
106
+ };
91
107
  }
92
108
 
93
109
  if (gasLimits.l2Gas > this.#effectiveMaxL2Gas) {
94
110
  this.#log.verbose(`Rejecting transaction due to the L2 gas limit being higher than the effective maximum`, {
95
111
  gasLimits,
96
112
  effectiveMaxL2Gas: this.#effectiveMaxL2Gas,
97
- rollupManaLimit: this.#rollupManaLimit,
98
- maxBlockL2Gas: this.#maxBlockL2Gas,
99
113
  });
100
- return { result: 'invalid', reason: [TX_ERROR_GAS_LIMIT_TOO_HIGH] };
114
+ return {
115
+ result: 'invalid',
116
+ reason: [`${TX_ERROR_GAS_LIMIT_TOO_HIGH} (l2Gas=${gasLimits.l2Gas}, max=${this.#effectiveMaxL2Gas})`],
117
+ };
101
118
  }
102
119
 
103
120
  if (gasLimits.daGas > this.#effectiveMaxDAGas) {
104
121
  this.#log.verbose(`Rejecting transaction due to the DA gas limit being higher than the effective maximum`, {
105
122
  gasLimits,
106
123
  effectiveMaxDAGas: this.#effectiveMaxDAGas,
107
- maxBlockDAGas: this.#maxBlockDAGas,
108
124
  });
109
- return { result: 'invalid', reason: [TX_ERROR_GAS_LIMIT_TOO_HIGH] };
125
+ return {
126
+ result: 'invalid',
127
+ reason: [`${TX_ERROR_GAS_LIMIT_TOO_HIGH} (daGas=${gasLimits.daGas}, max=${this.#effectiveMaxDAGas})`],
128
+ };
110
129
  }
111
130
 
112
131
  return { result: 'valid' };
113
132
  }
114
133
  }
115
134
 
135
+ /**
136
+ * Validates that a transaction's max fee per gas meets the current block's gas fees.
137
+ *
138
+ * Rejects transactions whose maxFeesPerGas is below the current block's gas fees
139
+ * on either dimension (DA or L2). This is a cheap, stateless check.
140
+ *
141
+ * Generic over T so it can validate both full {@link Tx} objects and {@link TxMetaData}
142
+ * (used during pending pool migration).
143
+ *
144
+ * Used by: pending pool migration (via factory), and indirectly by {@link GasTxValidator}.
145
+ */
146
+ export class MaxFeePerGasValidator<T extends HasMaxFeePerGasData> implements TxValidator<T> {
147
+ #log: Logger;
148
+ #gasFees: GasFees;
149
+
150
+ constructor(gasFees: GasFees, bindings?: LoggerBindings) {
151
+ this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
152
+ this.#gasFees = gasFees;
153
+ }
154
+
155
+ validateTx(tx: T): Promise<TxValidationResult> {
156
+ return Promise.resolve(this.validateMaxFeePerGas(tx));
157
+ }
158
+
159
+ /** Checks maxFeesPerGas >= current block gas fees on both dimensions. */
160
+ validateMaxFeePerGas(tx: T): TxValidationResult {
161
+ const maxFeesPerGas = tx.data.constants.txContext.gasSettings.maxFeesPerGas;
162
+ const notEnoughMaxFees =
163
+ maxFeesPerGas.feePerDaGas < this.#gasFees.feePerDaGas || maxFeesPerGas.feePerL2Gas < this.#gasFees.feePerL2Gas;
164
+
165
+ if (notEnoughMaxFees) {
166
+ this.#log.verbose(`Rejecting transaction ${tx.txHash.toString()} due to insufficient fee per gas`, {
167
+ txMaxFeesPerGas: maxFeesPerGas.toInspect(),
168
+ currentGasFees: this.#gasFees.toInspect(),
169
+ });
170
+ return {
171
+ result: 'invalid',
172
+ reason: [
173
+ `${TX_ERROR_INSUFFICIENT_FEE_PER_GAS} (maxFee=da:${maxFeesPerGas.feePerDaGas},l2:${maxFeesPerGas.feePerL2Gas} required=da:${this.#gasFees.feePerDaGas},l2:${this.#gasFees.feePerL2Gas})`,
174
+ ],
175
+ };
176
+ }
177
+ return { result: 'valid' };
178
+ }
179
+ }
180
+
116
181
  /**
117
182
  * Validates that a transaction can pay its gas fees.
118
183
  *
119
184
  * Runs three checks in order:
120
185
  * 1. **Gas limits** (delegates to {@link GasLimitsValidator}) — rejects if limits are
121
186
  * out of bounds.
122
- * 2. **Max fee per gas** — skips (not rejects) the tx if its maxFeesPerGas is below
123
- * the current block's gas fees. We skip rather than reject because the tx may
124
- * become eligible in a later block with lower fees.
187
+ * 2. **Max fee per gas** — rejects the tx if its maxFeesPerGas is below
188
+ * the current block's gas fees.
125
189
  * 3. **Fee payer balance** — reads the fee payer's FeeJuice balance from public state,
126
190
  * adds any pending claim from a setup-phase `_increase_public_balance` call, and
127
191
  * rejects if the total is less than the tx's fee limit (gasLimits * maxFeePerGas).
@@ -133,14 +197,14 @@ export class GasTxValidator implements TxValidator<Tx> {
133
197
  #publicDataSource: PublicStateSource;
134
198
  #feeJuiceAddress: AztecAddress;
135
199
  #gasFees: GasFees;
136
- #gasLimitOpts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number };
200
+ #gasLimitOpts?: { maxTxL2Gas?: number; maxTxDAGas?: number };
137
201
 
138
202
  constructor(
139
203
  publicDataSource: PublicStateSource,
140
204
  feeJuiceAddress: AztecAddress,
141
205
  gasFees: GasFees,
142
206
  private bindings?: LoggerBindings,
143
- opts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
207
+ opts?: { maxTxL2Gas?: number; maxTxDAGas?: number },
144
208
  ) {
145
209
  this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
146
210
  this.#publicDataSource = publicDataSource;
@@ -155,37 +219,15 @@ export class GasTxValidator implements TxValidator<Tx> {
155
219
  bindings: this.bindings,
156
220
  }).validateGasLimit(tx);
157
221
  if (gasLimitValidation.result === 'invalid') {
158
- return Promise.resolve(gasLimitValidation);
222
+ return gasLimitValidation;
159
223
  }
160
- if (this.#shouldSkip(tx)) {
161
- return Promise.resolve({ result: 'skipped', reason: [TX_ERROR_INSUFFICIENT_FEE_PER_GAS] });
224
+ const maxFeeValidation = new MaxFeePerGasValidator(this.#gasFees, this.bindings).validateMaxFeePerGas(tx);
225
+ if (maxFeeValidation.result === 'invalid') {
226
+ return maxFeeValidation;
162
227
  }
163
228
  return await this.validateTxFee(tx);
164
229
  }
165
230
 
166
- /**
167
- * Check whether the tx's max fees are valid for the current block, and skip if not.
168
- * We skip instead of invalidating since the tx may become eligible later.
169
- * Note that circuits check max fees even if fee payer is unset, so we
170
- * keep this validation even if the tx does not pay fees.
171
- */
172
- #shouldSkip(tx: Tx): boolean {
173
- const gasSettings = tx.data.constants.txContext.gasSettings;
174
-
175
- // Skip the tx if its max fees are not enough for the current block's gas fees.
176
- const maxFeesPerGas = gasSettings.maxFeesPerGas;
177
- const notEnoughMaxFees =
178
- maxFeesPerGas.feePerDaGas < this.#gasFees.feePerDaGas || maxFeesPerGas.feePerL2Gas < this.#gasFees.feePerL2Gas;
179
-
180
- if (notEnoughMaxFees) {
181
- this.#log.verbose(`Skipping transaction ${tx.getTxHash().toString()} due to insufficient fee per gas`, {
182
- txMaxFeesPerGas: maxFeesPerGas.toInspect(),
183
- currentGasFees: this.#gasFees.toInspect(),
184
- });
185
- }
186
- return notEnoughMaxFees;
187
- }
188
-
189
231
  /**
190
232
  * Checks the fee payer has enough FeeJuice balance to cover the tx's fee limit.
191
233
  * Accounts for any pending claim from a setup-phase `_increase_public_balance` call.
@@ -212,7 +254,10 @@ export class GasTxValidator implements TxValidator<Tx> {
212
254
  balance,
213
255
  feeLimit,
214
256
  });
215
- return { result: 'invalid', reason: [TX_ERROR_INSUFFICIENT_FEE_PAYER_BALANCE] };
257
+ return {
258
+ result: 'invalid',
259
+ reason: [`${TX_ERROR_INSUFFICIENT_FEE_PAYER_BALANCE} (required=${feeLimit}, available=${balance})`],
260
+ };
216
261
  }
217
262
  return { result: 'valid' };
218
263
  }
@@ -14,3 +14,5 @@ export * from './tx_permitted_validator.js';
14
14
  export * from './timestamp_validator.js';
15
15
  export * from './size_validator.js';
16
16
  export * from './factory.js';
17
+ export * from './tx_validation_cache.js';
18
+ export * from './cached_tx_validator.js';
@@ -40,7 +40,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
40
40
  // which are needed for public FPC flows, but fail if the account contract hasnt been deployed yet,
41
41
  // which is what we're trying to do as part of the current txs.
42
42
  // We only need to create/revert checkpoint here because of this addNewContracts call.
43
- await this.contractsDB.addNewContracts(tx);
43
+ this.contractsDB.addNewContracts(tx);
44
44
 
45
45
  if (!tx.data.forPublic) {
46
46
  this.#log.debug(
@@ -97,7 +97,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
97
97
  }
98
98
  if (
99
99
  entry.rejectNullMsgSender &&
100
- publicCall.request.msgSender.equals(AztecAddress.fromBigInt(NULL_MSG_SENDER_CONTRACT_ADDRESS))
100
+ publicCall.request.msgSender.equals(AztecAddress.fromBigIntUnsafe(NULL_MSG_SENDER_CONTRACT_ADDRESS))
101
101
  ) {
102
102
  return TX_ERROR_SETUP_NULL_MSG_SENDER;
103
103
  }
@@ -130,7 +130,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
130
130
  }
131
131
  if (
132
132
  entry.rejectNullMsgSender &&
133
- publicCall.request.msgSender.equals(AztecAddress.fromBigInt(NULL_MSG_SENDER_CONTRACT_ADDRESS))
133
+ publicCall.request.msgSender.equals(AztecAddress.fromBigIntUnsafe(NULL_MSG_SENDER_CONTRACT_ADDRESS))
134
134
  ) {
135
135
  return TX_ERROR_SETUP_NULL_MSG_SENDER;
136
136
  }
@@ -3,6 +3,8 @@ import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/ser
3
3
  import { TX_ERROR_INVALID_PROOF, Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
4
4
 
5
5
  export class TxProofValidator implements TxValidator<Tx> {
6
+ public readonly identifier: symbol = Symbol('TxProofValidator');
7
+
6
8
  #log: Logger;
7
9
 
8
10
  constructor(
@@ -0,0 +1,101 @@
1
+ import { LruMap } from '@aztec/foundation/collection';
2
+ import { type Logger, createLogger } from '@aztec/foundation/log';
3
+ import type { Tx, TxValidationResult } from '@aztec/stdlib/tx';
4
+
5
+ import { createHash } from 'node:crypto';
6
+
7
+ /**
8
+ * Minimal interface consumed by {@link CachedTxValidator}.
9
+ * Keeping the dependency on an interface lets callers (and tests) substitute any cache implementation.
10
+ */
11
+ export interface ITxValidationCache {
12
+ /** Returns the cached promise if present, otherwise calls `validate`, caches its promise, and returns it. */
13
+ getOrValidate(
14
+ validatorSymbol: symbol,
15
+ tx: Tx,
16
+ validate: () => Promise<TxValidationResult>,
17
+ ): Promise<TxValidationResult>;
18
+ }
19
+
20
+ /**
21
+ * Caches per-validator tx validation results to avoid redundant work across repeated validation calls.
22
+ *
23
+ * The cache key is composed from the validator symbol and tx hash, ensuring results are
24
+ * scoped to the specific validator that produced them.
25
+ *
26
+ * Promises are stored before they are awaited, so concurrent calls for the same pair share
27
+ * a single in-flight validation rather than launching duplicate work.
28
+ *
29
+ * Entries are evicted in least-recently-used order once the cache reaches `maxSize`.
30
+ */
31
+ export class TxValidationCache implements ITxValidationCache {
32
+ #log: Logger;
33
+
34
+ private readonly entries: LruMap<string, Promise<TxValidationResult>>;
35
+ // Remember hashes for known Tx object references to skip rehashing on subsequent lookups.
36
+ // WeakMap holds keys weakly, so an entry doesn't keep the Tx alive once nothing else references it.
37
+ private readonly txHashesCache: WeakMap<Tx, string> = new WeakMap();
38
+
39
+ constructor(maxSize: number) {
40
+ this.entries = new LruMap(maxSize);
41
+ this.#log = createLogger('p2p:tx_validation_cache');
42
+ }
43
+
44
+ /**
45
+ * Computes the cache key scoping a validation result to a specific validator and tx.
46
+ *
47
+ * @param validatorSymbol - The symbol of the validator.
48
+ * @param tx - The tx to compute the key for.
49
+ * @returns The cache key.
50
+ *
51
+ * Note: the key should NOT use the tx.hash because it can't be trusted at this point.
52
+ */
53
+ public key(validatorSymbol: symbol, tx: Tx): string {
54
+ // Serializing the tx dominates cost (~5 ms). If we have already hashed this object, skip toBuffer + hash.
55
+ let hash = this.txHashesCache.get(tx);
56
+ if (hash === undefined) {
57
+ hash = createHash('sha256').update(tx.toBuffer()).digest('hex');
58
+ this.txHashesCache.set(tx, hash);
59
+ }
60
+ return `${Symbol.keyFor(validatorSymbol) ?? validatorSymbol.toString()}:${hash}`;
61
+ }
62
+
63
+ /** Returns the cached promise for the given key, or undefined if not cached. Refreshes recency. */
64
+ public get(key: string): Promise<TxValidationResult> | undefined {
65
+ return this.entries.get(key);
66
+ }
67
+
68
+ /** Stores a validation promise under the given key, evicting the LRU entry if at capacity. */
69
+ public set(key: string, result: Promise<TxValidationResult>): void {
70
+ this.entries.set(key, result);
71
+ }
72
+
73
+ /** Removes the cached validation promise for the given key. */
74
+ public delete(key: string): void {
75
+ this.entries.delete(key);
76
+ }
77
+
78
+ /**
79
+ * Returns the cached promise if present, otherwise calls `validate`, stores its promise
80
+ * immediately (before awaiting), and returns it.
81
+ */
82
+ public getOrValidate(
83
+ validatorSymbol: symbol,
84
+ tx: Tx,
85
+ validate: () => Promise<TxValidationResult>,
86
+ ): Promise<TxValidationResult> {
87
+ const key = this.key(validatorSymbol, tx);
88
+ const cached = this.get(key);
89
+ if (cached !== undefined) {
90
+ this.#log.debug('Returning cached tx validation result', {
91
+ validator: validatorSymbol.toString(),
92
+ txHash: tx.txHash.toString(),
93
+ key: key,
94
+ });
95
+ return cached;
96
+ }
97
+ const promise = validate();
98
+ this.set(key, promise);
99
+ return promise;
100
+ }
101
+ }
@@ -28,8 +28,6 @@ export class AztecDatastore implements Datastore {
28
28
  #memoryDatastore: Map<string, MemoryItem>;
29
29
  #dbDatastore: AztecAsyncMap<string, Uint8Array>;
30
30
 
31
- #batchOps: BatchOp[] = [];
32
-
33
31
  private maxMemoryItems: number;
34
32
 
35
33
  constructor(db: AztecAsyncKVStore, { maxMemoryItems } = { maxMemoryItems: 50 }) {
@@ -92,23 +90,17 @@ export class AztecDatastore implements Datastore {
92
90
  }
93
91
 
94
92
  batch(): Batch {
93
+ const ops: BatchOp[] = [];
95
94
  return {
96
95
  put: (key, value) => {
97
- this.#batchOps.push({
98
- type: 'put',
99
- key,
100
- value,
101
- });
96
+ ops.push({ type: 'put', key, value });
102
97
  },
103
98
  delete: key => {
104
- this.#batchOps.push({
105
- type: 'del',
106
- key,
107
- });
99
+ ops.push({ type: 'del', key });
108
100
  },
109
101
  commit: async () => {
110
102
  await this.#db.transactionAsync(async () => {
111
- for (const op of this.#batchOps) {
103
+ for (const op of ops) {
112
104
  if (op.type === 'put' && op.value) {
113
105
  await this.put(op.key, op.value);
114
106
  } else if (op.type === 'del') {
@@ -116,7 +108,7 @@ export class AztecDatastore implements Datastore {
116
108
  }
117
109
  }
118
110
  });
119
- this.#batchOps = []; // Clear operations after commit
111
+ ops.length = 0;
120
112
  },
121
113
  };
122
114
  }