@aztec/p2p 0.0.1-commit.e558bd1c → 0.0.1-commit.e5a3663dd

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 (468) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +10 -9
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +54 -15
  5. package/dest/client/interface.d.ts +47 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +39 -51
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +173 -226
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +23 -10
  11. package/dest/config.d.ts +137 -92
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +113 -40
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +24 -13
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +80 -43
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +57 -57
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +7 -5
  35. package/dest/mem_pools/index.d.ts +2 -2
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts +4 -2
  38. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  39. package/dest/mem_pools/instrumentation.js +33 -15
  40. package/dest/mem_pools/interface.d.ts +3 -3
  41. package/dest/mem_pools/interface.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  61. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  74. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  75. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  77. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  78. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  80. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -12
  81. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  83. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +81 -15
  84. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +147 -19
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  93. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  94. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +365 -189
  95. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  96. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  98. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  99. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  101. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  102. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  103. package/dest/msg_validators/clock_tolerance.js +61 -3
  104. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -4
  105. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  107. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -4
  108. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  110. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +19 -8
  111. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  112. package/dest/msg_validators/proposal_validator/proposal_validator.js +88 -44
  113. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  114. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  116. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  117. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  119. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  120. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  121. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  122. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  123. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  124. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  126. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  127. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  128. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  129. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  130. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  132. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  133. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  135. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  136. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/factory.js +247 -60
  138. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  139. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  141. package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
  142. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  144. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  145. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/index.js +2 -0
  147. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  148. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  150. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  151. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  152. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  153. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  154. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  155. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  156. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  157. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  159. package/dest/services/data_store.d.ts +1 -1
  160. package/dest/services/data_store.d.ts.map +1 -1
  161. package/dest/services/data_store.js +5 -5
  162. package/dest/services/dummy_service.d.ts +13 -6
  163. package/dest/services/dummy_service.d.ts.map +1 -1
  164. package/dest/services/dummy_service.js +13 -5
  165. package/dest/services/encoding.d.ts +7 -3
  166. package/dest/services/encoding.d.ts.map +1 -1
  167. package/dest/services/encoding.js +18 -11
  168. package/dest/services/gossipsub/index.d.ts +3 -0
  169. package/dest/services/gossipsub/index.d.ts.map +1 -0
  170. package/dest/services/gossipsub/index.js +2 -0
  171. package/dest/services/gossipsub/scoring.d.ts +21 -3
  172. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  173. package/dest/services/gossipsub/scoring.js +24 -7
  174. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  175. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  176. package/dest/services/gossipsub/topic_score_params.js +363 -0
  177. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  178. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  179. package/dest/services/libp2p/instrumentation.js +14 -0
  180. package/dest/services/libp2p/libp2p_service.d.ts +42 -39
  181. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  182. package/dest/services/libp2p/libp2p_service.js +336 -269
  183. package/dest/services/peer-manager/metrics.d.ts +3 -1
  184. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  185. package/dest/services/peer-manager/metrics.js +6 -0
  186. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  187. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  188. package/dest/services/peer-manager/peer_manager.js +39 -11
  189. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  190. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  191. package/dest/services/peer-manager/peer_scoring.js +57 -12
  192. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  193. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  194. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  195. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  196. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  197. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  198. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  199. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  200. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  201. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  202. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  203. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  204. package/dest/services/reqresp/config.d.ts +3 -3
  205. package/dest/services/reqresp/config.d.ts.map +1 -1
  206. package/dest/services/reqresp/interface.d.ts +23 -9
  207. package/dest/services/reqresp/interface.d.ts.map +1 -1
  208. package/dest/services/reqresp/interface.js +23 -10
  209. package/dest/services/reqresp/metrics.d.ts +1 -1
  210. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  211. package/dest/services/reqresp/metrics.js +0 -1
  212. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  213. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  215. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  216. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  217. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  218. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  219. package/dest/services/reqresp/protocols/index.js +0 -1
  220. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  221. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  222. package/dest/services/reqresp/protocols/tx.js +21 -3
  223. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  224. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  225. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  226. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  227. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  228. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  229. package/dest/services/reqresp/reqresp.d.ts +4 -2
  230. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  231. package/dest/services/reqresp/reqresp.js +40 -15
  232. package/dest/services/service.d.ts +26 -4
  233. package/dest/services/service.d.ts.map +1 -1
  234. package/dest/services/tx_collection/config.d.ts +19 -1
  235. package/dest/services/tx_collection/config.d.ts.map +1 -1
  236. package/dest/services/tx_collection/config.js +46 -0
  237. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -4
  238. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  239. package/dest/services/tx_collection/fast_tx_collection.js +80 -76
  240. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  241. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  242. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  243. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  244. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  245. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  246. package/dest/services/tx_collection/index.d.ts +2 -1
  247. package/dest/services/tx_collection/index.d.ts.map +1 -1
  248. package/dest/services/tx_collection/index.js +1 -0
  249. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  250. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  251. package/dest/services/tx_collection/instrumentation.js +2 -1
  252. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  253. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  254. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  255. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  256. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  257. package/dest/services/tx_collection/request_tracker.js +84 -0
  258. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  259. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  260. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  261. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  262. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  263. package/dest/services/tx_collection/tx_collection.js +75 -3
  264. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  265. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  266. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  267. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  268. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  269. package/dest/services/tx_collection/tx_source.js +26 -7
  270. package/dest/services/tx_file_store/config.d.ts +1 -3
  271. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  272. package/dest/services/tx_file_store/config.js +0 -4
  273. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  274. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  275. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  276. package/dest/services/tx_provider.d.ts +4 -4
  277. package/dest/services/tx_provider.d.ts.map +1 -1
  278. package/dest/services/tx_provider.js +9 -8
  279. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  280. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  281. package/dest/test-helpers/make-test-p2p-clients.js +4 -2
  282. package/dest/test-helpers/mock-pubsub.d.ts +40 -6
  283. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  284. package/dest/test-helpers/mock-pubsub.js +139 -13
  285. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  286. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  287. package/dest/test-helpers/reqresp-nodes.js +8 -5
  288. package/dest/test-helpers/testbench-utils.d.ts +35 -24
  289. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  290. package/dest/test-helpers/testbench-utils.js +125 -38
  291. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  292. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  293. package/dest/testbench/p2p_client_testbench_worker.js +84 -27
  294. package/dest/testbench/worker_client_manager.d.ts +10 -1
  295. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  296. package/dest/testbench/worker_client_manager.js +55 -3
  297. package/dest/util.d.ts +3 -3
  298. package/dest/util.d.ts.map +1 -1
  299. package/package.json +14 -14
  300. package/src/client/factory.ts +108 -26
  301. package/src/client/interface.ts +52 -34
  302. package/src/client/p2p_client.ts +201 -269
  303. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +35 -14
  304. package/src/config.ts +181 -46
  305. package/src/errors/p2p-service.error.ts +11 -0
  306. package/src/errors/tx-pool.error.ts +12 -0
  307. package/src/index.ts +1 -1
  308. package/src/mem_pools/attestation_pool/attestation_pool.ts +109 -53
  309. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +61 -57
  310. package/src/mem_pools/attestation_pool/index.ts +3 -3
  311. package/src/mem_pools/attestation_pool/mocks.ts +14 -8
  312. package/src/mem_pools/index.ts +1 -1
  313. package/src/mem_pools/instrumentation.ts +22 -14
  314. package/src/mem_pools/interface.ts +2 -2
  315. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  316. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  317. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  318. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  319. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  320. package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
  321. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  322. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  323. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  324. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  325. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  326. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  327. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  328. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  329. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  330. package/src/mem_pools/tx_pool_v2/interfaces.ts +35 -12
  331. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +215 -27
  332. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  333. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  334. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +412 -187
  335. package/src/msg_validators/attestation_validator/README.md +49 -0
  336. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  337. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +12 -2
  338. package/src/msg_validators/clock_tolerance.ts +79 -3
  339. package/src/msg_validators/proposal_validator/README.md +123 -0
  340. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +23 -4
  341. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +34 -7
  342. package/src/msg_validators/proposal_validator/proposal_validator.ts +111 -47
  343. package/src/msg_validators/tx_validator/README.md +127 -0
  344. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  345. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  346. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  347. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  348. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  349. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  350. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  351. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  352. package/src/msg_validators/tx_validator/factory.ts +396 -78
  353. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  354. package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
  355. package/src/msg_validators/tx_validator/index.ts +2 -0
  356. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  357. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  358. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  359. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  360. package/src/services/data_store.ts +5 -13
  361. package/src/services/dummy_service.ts +19 -7
  362. package/src/services/encoding.ts +18 -10
  363. package/src/services/gossipsub/README.md +641 -0
  364. package/src/services/gossipsub/index.ts +2 -0
  365. package/src/services/gossipsub/scoring.ts +29 -5
  366. package/src/services/gossipsub/topic_score_params.ts +519 -0
  367. package/src/services/libp2p/instrumentation.ts +14 -0
  368. package/src/services/libp2p/libp2p_service.ts +358 -298
  369. package/src/services/peer-manager/metrics.ts +7 -0
  370. package/src/services/peer-manager/peer_manager.ts +45 -11
  371. package/src/services/peer-manager/peer_scoring.ts +52 -5
  372. package/src/services/reqresp/README.md +229 -0
  373. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  374. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  375. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  376. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  377. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  378. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  379. package/src/services/reqresp/config.ts +2 -2
  380. package/src/services/reqresp/interface.ts +45 -10
  381. package/src/services/reqresp/metrics.ts +0 -1
  382. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
  383. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  384. package/src/services/reqresp/protocols/index.ts +0 -1
  385. package/src/services/reqresp/protocols/tx.ts +23 -3
  386. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  387. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  388. package/src/services/reqresp/reqresp.ts +53 -16
  389. package/src/services/service.ts +37 -3
  390. package/src/services/tx_collection/config.ts +68 -0
  391. package/src/services/tx_collection/fast_tx_collection.ts +83 -76
  392. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  393. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  394. package/src/services/tx_collection/index.ts +1 -0
  395. package/src/services/tx_collection/instrumentation.ts +7 -1
  396. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  397. package/src/services/tx_collection/request_tracker.ts +127 -0
  398. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  399. package/src/services/tx_collection/tx_collection.ts +114 -19
  400. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  401. package/src/services/tx_collection/tx_source.ts +28 -8
  402. package/src/services/tx_file_store/config.ts +0 -6
  403. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  404. package/src/services/tx_provider.ts +10 -9
  405. package/src/test-helpers/make-test-p2p-clients.ts +6 -6
  406. package/src/test-helpers/mock-pubsub.ts +180 -14
  407. package/src/test-helpers/reqresp-nodes.ts +9 -9
  408. package/src/test-helpers/testbench-utils.ts +147 -43
  409. package/src/testbench/p2p_client_testbench_worker.ts +93 -30
  410. package/src/testbench/worker_client_manager.ts +68 -6
  411. package/src/util.ts +8 -2
  412. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  413. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  414. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  415. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  416. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  417. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  418. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  419. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  420. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  421. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  422. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  423. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  424. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  425. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  426. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  427. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  428. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  429. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  430. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  431. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  432. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  433. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  434. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  435. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  436. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  437. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  438. package/dest/mem_pools/tx_pool/index.js +0 -2
  439. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  440. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  441. package/dest/mem_pools/tx_pool/priority.js +0 -15
  442. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  443. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  444. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  445. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  446. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  447. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  448. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  449. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  450. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  451. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  452. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  453. package/dest/services/reqresp/protocols/block.js +0 -32
  454. package/src/mem_pools/tx_pool/README.md +0 -270
  455. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  456. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  457. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  458. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  459. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  460. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  461. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  462. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  463. package/src/mem_pools/tx_pool/index.ts +0 -2
  464. package/src/mem_pools/tx_pool/priority.ts +0 -20
  465. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  466. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  467. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  468. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,4 +1,10 @@
1
- import { AVM_MAX_PROCESSABLE_L2_GAS, FIXED_DA_GAS, FIXED_L2_GAS } from '@aztec/constants';
1
+ import {
2
+ MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT,
3
+ MAX_PROCESSABLE_L2_GAS,
4
+ PRIVATE_TX_L2_GAS_OVERHEAD,
5
+ PUBLIC_TX_L2_GAS_OVERHEAD,
6
+ TX_DA_GAS_OVERHEAD,
7
+ } from '@aztec/constants';
2
8
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
9
  import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
4
10
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
@@ -16,84 +22,220 @@ import {
16
22
 
17
23
  import { getFeePayerClaimAmount, getTxFeeLimit } from './fee_payer_balance.js';
18
24
 
25
+ /** Structural interface for types that carry gas limit data, used by {@link GasLimitsValidator}. */
26
+ export interface HasGasLimitData {
27
+ txHash: { toString(): string };
28
+ data: {
29
+ // We just need to know whether there is something here or not
30
+ forPublic?: unknown;
31
+ constants: {
32
+ txContext: {
33
+ gasSettings: { gasLimits: Gas };
34
+ };
35
+ };
36
+ };
37
+ }
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
+
51
+ /**
52
+ * Validates that a transaction's gas limits are within acceptable bounds.
53
+ *
54
+ * Rejects transactions whose gas limits fall below the fixed minimums (FIXED_DA_GAS,
55
+ * FIXED_L2_GAS) or exceed the AVM's maximum processable L2 gas. This is a cheap,
56
+ * stateless check that operates on gas settings alone.
57
+ *
58
+ * Generic over T so it can validate both full {@link Tx} objects and {@link TxMetaData}
59
+ * (used during pending pool migration).
60
+ *
61
+ * Used by: pending pool migration (via factory), and indirectly by {@link GasTxValidator}.
62
+ */
63
+ export class GasLimitsValidator<T extends HasGasLimitData> implements TxValidator<T> {
64
+ #log: Logger;
65
+ #effectiveMaxL2Gas: number;
66
+ #effectiveMaxDAGas: number;
67
+ #rollupManaLimit: number;
68
+ #maxBlockL2Gas: number;
69
+ #maxBlockDAGas: number;
70
+
71
+ constructor(opts?: {
72
+ rollupManaLimit?: number;
73
+ maxBlockL2Gas?: number;
74
+ maxBlockDAGas?: number;
75
+ bindings?: LoggerBindings;
76
+ }) {
77
+ this.#log = createLogger('sequencer:tx_validator:tx_gas', opts?.bindings);
78
+ this.#rollupManaLimit = opts?.rollupManaLimit ?? Infinity;
79
+ this.#maxBlockL2Gas = opts?.maxBlockL2Gas ?? Infinity;
80
+ this.#maxBlockDAGas = opts?.maxBlockDAGas ?? Infinity;
81
+ this.#effectiveMaxL2Gas = Math.min(MAX_PROCESSABLE_L2_GAS, this.#rollupManaLimit, this.#maxBlockL2Gas);
82
+ this.#effectiveMaxDAGas = Math.min(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, this.#maxBlockDAGas);
83
+ }
84
+
85
+ validateTx(tx: T): Promise<TxValidationResult> {
86
+ return Promise.resolve(this.validateGasLimit(tx));
87
+ }
88
+
89
+ /** Checks gas limits are >= fixed minimums and <= effective max gas (L2 and DA). */
90
+ validateGasLimit(tx: T): TxValidationResult {
91
+ const gasLimits = tx.data.constants.txContext.gasSettings.gasLimits;
92
+ const minGasLimits = new Gas(
93
+ TX_DA_GAS_OVERHEAD,
94
+ tx.data.forPublic ? PUBLIC_TX_L2_GAS_OVERHEAD : PRIVATE_TX_L2_GAS_OVERHEAD,
95
+ );
96
+
97
+ if (minGasLimits.gtAny(gasLimits)) {
98
+ this.#log.verbose(`Rejecting transaction due to the gas limit(s) not being above the minimum gas limit`, {
99
+ gasLimits,
100
+ minGasLimits,
101
+ });
102
+ return {
103
+ result: 'invalid',
104
+ reason: [
105
+ `${TX_ERROR_INSUFFICIENT_GAS_LIMIT} (required=da:${minGasLimits.daGas},l2:${minGasLimits.l2Gas} got=da:${gasLimits.daGas},l2:${gasLimits.l2Gas})`,
106
+ ],
107
+ };
108
+ }
109
+
110
+ if (gasLimits.l2Gas > this.#effectiveMaxL2Gas) {
111
+ this.#log.verbose(`Rejecting transaction due to the L2 gas limit being higher than the effective maximum`, {
112
+ gasLimits,
113
+ effectiveMaxL2Gas: this.#effectiveMaxL2Gas,
114
+ rollupManaLimit: this.#rollupManaLimit,
115
+ maxBlockL2Gas: this.#maxBlockL2Gas,
116
+ });
117
+ return {
118
+ result: 'invalid',
119
+ reason: [`${TX_ERROR_GAS_LIMIT_TOO_HIGH} (l2Gas=${gasLimits.l2Gas}, max=${this.#effectiveMaxL2Gas})`],
120
+ };
121
+ }
122
+
123
+ if (gasLimits.daGas > this.#effectiveMaxDAGas) {
124
+ this.#log.verbose(`Rejecting transaction due to the DA gas limit being higher than the effective maximum`, {
125
+ gasLimits,
126
+ effectiveMaxDAGas: this.#effectiveMaxDAGas,
127
+ maxBlockDAGas: this.#maxBlockDAGas,
128
+ });
129
+ return {
130
+ result: 'invalid',
131
+ reason: [`${TX_ERROR_GAS_LIMIT_TOO_HIGH} (daGas=${gasLimits.daGas}, max=${this.#effectiveMaxDAGas})`],
132
+ };
133
+ }
134
+
135
+ return { result: 'valid' };
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Validates that a transaction's max fee per gas meets the current block's gas fees.
141
+ *
142
+ * Rejects transactions whose maxFeesPerGas is below the current block's gas fees
143
+ * on either dimension (DA or L2). This is a cheap, stateless check.
144
+ *
145
+ * Generic over T so it can validate both full {@link Tx} objects and {@link TxMetaData}
146
+ * (used during pending pool migration).
147
+ *
148
+ * Used by: pending pool migration (via factory), and indirectly by {@link GasTxValidator}.
149
+ */
150
+ export class MaxFeePerGasValidator<T extends HasMaxFeePerGasData> implements TxValidator<T> {
151
+ #log: Logger;
152
+ #gasFees: GasFees;
153
+
154
+ constructor(gasFees: GasFees, bindings?: LoggerBindings) {
155
+ this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
156
+ this.#gasFees = gasFees;
157
+ }
158
+
159
+ validateTx(tx: T): Promise<TxValidationResult> {
160
+ return Promise.resolve(this.validateMaxFeePerGas(tx));
161
+ }
162
+
163
+ /** Checks maxFeesPerGas >= current block gas fees on both dimensions. */
164
+ validateMaxFeePerGas(tx: T): TxValidationResult {
165
+ const maxFeesPerGas = tx.data.constants.txContext.gasSettings.maxFeesPerGas;
166
+ const notEnoughMaxFees =
167
+ maxFeesPerGas.feePerDaGas < this.#gasFees.feePerDaGas || maxFeesPerGas.feePerL2Gas < this.#gasFees.feePerL2Gas;
168
+
169
+ if (notEnoughMaxFees) {
170
+ this.#log.verbose(`Rejecting transaction ${tx.txHash.toString()} due to insufficient fee per gas`, {
171
+ txMaxFeesPerGas: maxFeesPerGas.toInspect(),
172
+ currentGasFees: this.#gasFees.toInspect(),
173
+ });
174
+ return {
175
+ result: 'invalid',
176
+ reason: [
177
+ `${TX_ERROR_INSUFFICIENT_FEE_PER_GAS} (maxFee=da:${maxFeesPerGas.feePerDaGas},l2:${maxFeesPerGas.feePerL2Gas} required=da:${this.#gasFees.feePerDaGas},l2:${this.#gasFees.feePerL2Gas})`,
178
+ ],
179
+ };
180
+ }
181
+ return { result: 'valid' };
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Validates that a transaction can pay its gas fees.
187
+ *
188
+ * Runs three checks in order:
189
+ * 1. **Gas limits** (delegates to {@link GasLimitsValidator}) — rejects if limits are
190
+ * out of bounds.
191
+ * 2. **Max fee per gas** — rejects the tx if its maxFeesPerGas is below
192
+ * the current block's gas fees.
193
+ * 3. **Fee payer balance** — reads the fee payer's FeeJuice balance from public state,
194
+ * adds any pending claim from a setup-phase `_increase_public_balance` call, and
195
+ * rejects if the total is less than the tx's fee limit (gasLimits * maxFeePerGas).
196
+ *
197
+ * Used by: gossip (stage 1), RPC, and block building validators.
198
+ */
19
199
  export class GasTxValidator implements TxValidator<Tx> {
20
200
  #log: Logger;
21
201
  #publicDataSource: PublicStateSource;
22
202
  #feeJuiceAddress: AztecAddress;
23
203
  #gasFees: GasFees;
204
+ #gasLimitOpts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number };
24
205
 
25
206
  constructor(
26
207
  publicDataSource: PublicStateSource,
27
208
  feeJuiceAddress: AztecAddress,
28
209
  gasFees: GasFees,
29
- bindings?: LoggerBindings,
210
+ private bindings?: LoggerBindings,
211
+ opts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
30
212
  ) {
31
213
  this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
32
214
  this.#publicDataSource = publicDataSource;
33
215
  this.#feeJuiceAddress = feeJuiceAddress;
34
216
  this.#gasFees = gasFees;
217
+ this.#gasLimitOpts = opts;
35
218
  }
36
219
 
37
220
  async validateTx(tx: Tx): Promise<TxValidationResult> {
38
- const gasLimitValidation = this.#validateGasLimit(tx);
221
+ const gasLimitValidation = new GasLimitsValidator({
222
+ ...this.#gasLimitOpts,
223
+ bindings: this.bindings,
224
+ }).validateGasLimit(tx);
39
225
  if (gasLimitValidation.result === 'invalid') {
40
- return Promise.resolve(gasLimitValidation);
226
+ return gasLimitValidation;
41
227
  }
42
- if (this.#shouldSkip(tx)) {
43
- return Promise.resolve({ result: 'skipped', reason: [TX_ERROR_INSUFFICIENT_FEE_PER_GAS] });
228
+ const maxFeeValidation = new MaxFeePerGasValidator(this.#gasFees, this.bindings).validateMaxFeePerGas(tx);
229
+ if (maxFeeValidation.result === 'invalid') {
230
+ return maxFeeValidation;
44
231
  }
45
232
  return await this.validateTxFee(tx);
46
233
  }
47
234
 
48
235
  /**
49
- * Check whether the tx's max fees are valid for the current block, and skip if not.
50
- * We skip instead of invalidating since the tx may become eligible later.
51
- * Note that circuits check max fees even if fee payer is unset, so we
52
- * keep this validation even if the tx does not pay fees.
53
- */
54
- #shouldSkip(tx: Tx): boolean {
55
- const gasSettings = tx.data.constants.txContext.gasSettings;
56
-
57
- // Skip the tx if its max fees are not enough for the current block's gas fees.
58
- const maxFeesPerGas = gasSettings.maxFeesPerGas;
59
- const notEnoughMaxFees =
60
- maxFeesPerGas.feePerDaGas < this.#gasFees.feePerDaGas || maxFeesPerGas.feePerL2Gas < this.#gasFees.feePerL2Gas;
61
-
62
- if (notEnoughMaxFees) {
63
- this.#log.verbose(`Skipping transaction ${tx.getTxHash().toString()} due to insufficient fee per gas`, {
64
- txMaxFeesPerGas: maxFeesPerGas.toInspect(),
65
- currentGasFees: this.#gasFees.toInspect(),
66
- });
67
- }
68
- return notEnoughMaxFees;
69
- }
70
-
71
- /**
72
- * Check whether the tx's gas limit is above the minimum amount.
236
+ * Checks the fee payer has enough FeeJuice balance to cover the tx's fee limit.
237
+ * Accounts for any pending claim from a setup-phase `_increase_public_balance` call.
73
238
  */
74
- #validateGasLimit(tx: Tx): TxValidationResult {
75
- const gasLimits = tx.data.constants.txContext.gasSettings.gasLimits;
76
- const minGasLimits = new Gas(FIXED_DA_GAS, FIXED_L2_GAS);
77
-
78
- if (minGasLimits.gtAny(gasLimits)) {
79
- this.#log.verbose(`Rejecting transaction due to the gas limit(s) not being above the minimum gas limit`, {
80
- gasLimits,
81
- minGasLimits,
82
- });
83
- return { result: 'invalid', reason: [TX_ERROR_INSUFFICIENT_GAS_LIMIT] };
84
- }
85
-
86
- if (gasLimits.l2Gas > AVM_MAX_PROCESSABLE_L2_GAS) {
87
- this.#log.verbose(`Rejecting transaction due to the gas limit(s) being higher than the maximum processable gas`, {
88
- gasLimits,
89
- minGasLimits,
90
- });
91
- return { result: 'invalid', reason: [TX_ERROR_GAS_LIMIT_TOO_HIGH] };
92
- }
93
-
94
- return { result: 'valid' };
95
- }
96
-
97
239
  public async validateTxFee(tx: Tx): Promise<TxValidationResult> {
98
240
  const feePayer = tx.data.feePayer;
99
241
 
@@ -116,7 +258,10 @@ export class GasTxValidator implements TxValidator<Tx> {
116
258
  balance,
117
259
  feeLimit,
118
260
  });
119
- return { result: 'invalid', reason: [TX_ERROR_INSUFFICIENT_FEE_PAYER_BALANCE] };
261
+ return {
262
+ result: 'invalid',
263
+ reason: [`${TX_ERROR_INSUFFICIENT_FEE_PAYER_BALANCE} (required=${feeLimit}, available=${balance})`],
264
+ };
120
265
  }
121
266
  return { result: 'valid' };
122
267
  }
@@ -8,7 +8,9 @@ export * from './gas_validator.js';
8
8
  export * from './phases_validator.js';
9
9
  export * from './test_utils.js';
10
10
  export * from './allowed_public_setup.js';
11
+ export * from './allowed_setup_helpers.js';
11
12
  export * from './archive_cache.js';
12
13
  export * from './tx_permitted_validator.js';
13
14
  export * from './timestamp_validator.js';
14
15
  export * from './size_validator.js';
16
+ export * from './factory.js';
@@ -28,16 +28,24 @@ export class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
28
28
  validateTx(tx: T): Promise<TxValidationResult> {
29
29
  const errors = [];
30
30
  if (!this.#hasCorrectL1ChainId(tx)) {
31
- errors.push(TX_ERROR_INCORRECT_L1_CHAIN_ID);
31
+ errors.push(
32
+ `${TX_ERROR_INCORRECT_L1_CHAIN_ID} (tx: ${tx.data.constants.txContext.chainId.toNumber()}, expected: ${this.values.l1ChainId.toNumber()})`,
33
+ );
32
34
  }
33
35
  if (!this.#hasCorrectRollupVersion(tx)) {
34
- errors.push(TX_ERROR_INCORRECT_ROLLUP_VERSION);
36
+ errors.push(
37
+ `${TX_ERROR_INCORRECT_ROLLUP_VERSION} (tx: ${tx.data.constants.txContext.version.toNumber()}, expected: ${this.values.rollupVersion.toNumber()})`,
38
+ );
35
39
  }
36
40
  if (!this.#hasCorrectVkTreeRoot(tx)) {
37
- errors.push(TX_ERROR_INCORRECT_VK_TREE_ROOT);
41
+ errors.push(
42
+ `${TX_ERROR_INCORRECT_VK_TREE_ROOT} (tx: ${tx.data.constants.vkTreeRoot.toString()}, expected: ${this.values.vkTreeRoot.toString()})`,
43
+ );
38
44
  }
39
45
  if (!this.#hasCorrectprotocolContractsHash(tx)) {
40
- errors.push(TX_ERROR_INCORRECT_PROTOCOL_CONTRACTS_HASH);
46
+ errors.push(
47
+ `${TX_ERROR_INCORRECT_PROTOCOL_CONTRACTS_HASH} (tx: ${tx.data.constants.protocolContractsHash.toString()}, expected: ${this.values.protocolContractsHash.toString()})`,
48
+ );
41
49
  }
42
50
  return Promise.resolve(errors.length > 0 ? { result: 'invalid', reason: errors } : { result: 'valid' });
43
51
  }
@@ -0,0 +1,30 @@
1
+ import type { NullifierSource } from '@aztec/p2p';
2
+ import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
3
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
4
+
5
+ /**
6
+ * Implements a nullifier source by checking a DB and an in-memory collection.
7
+ * Intended for validating transactions as they are added to a block.
8
+ */
9
+ export class NullifierCache implements NullifierSource {
10
+ nullifiers: Set<string>;
11
+
12
+ constructor(private db: MerkleTreeReadOperations) {
13
+ this.nullifiers = new Set();
14
+ }
15
+
16
+ public async nullifiersExist(nullifiers: Buffer[]): Promise<boolean[]> {
17
+ const cacheResults = nullifiers.map(n => this.nullifiers.has(n.toString()));
18
+ const toCheckDb = nullifiers.filter((_n, index) => !cacheResults[index]);
19
+ const dbHits = await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, toCheckDb);
20
+
21
+ let dbIndex = 0;
22
+ return nullifiers.map((_n, index) => cacheResults[index] || dbHits[dbIndex++] !== undefined);
23
+ }
24
+
25
+ public addNullifiers(nullifiers: Buffer[]) {
26
+ for (const nullifier of nullifiers) {
27
+ this.nullifiers.add(nullifier.toString());
28
+ }
29
+ }
30
+ }
@@ -1,11 +1,17 @@
1
+ import { NULL_MSG_SENDER_CONTRACT_ADDRESS } from '@aztec/constants';
1
2
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
2
3
  import { PublicContractsDB, getCallRequestsWithCalldataByPhase } from '@aztec/simulator/server';
4
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
3
5
  import type { ContractDataSource } from '@aztec/stdlib/contract';
4
6
  import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
5
7
  import {
6
8
  type PublicCallRequestWithCalldata,
7
9
  TX_ERROR_DURING_VALIDATION,
8
10
  TX_ERROR_SETUP_FUNCTION_NOT_ALLOWED,
11
+ TX_ERROR_SETUP_FUNCTION_UNKNOWN_CONTRACT,
12
+ TX_ERROR_SETUP_NULL_MSG_SENDER,
13
+ TX_ERROR_SETUP_ONLY_SELF_WRONG_SENDER,
14
+ TX_ERROR_SETUP_WRONG_CALLDATA_LENGTH,
9
15
  Tx,
10
16
  TxExecutionPhase,
11
17
  type TxValidationResult,
@@ -34,7 +40,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
34
40
  // which are needed for public FPC flows, but fail if the account contract hasnt been deployed yet,
35
41
  // which is what we're trying to do as part of the current txs.
36
42
  // We only need to create/revert checkpoint here because of this addNewContracts call.
37
- await this.contractsDB.addNewContracts(tx);
43
+ this.contractsDB.addNewContracts(tx);
38
44
 
39
45
  if (!tx.data.forPublic) {
40
46
  this.#log.debug(
@@ -45,7 +51,8 @@ export class PhasesTxValidator implements TxValidator<Tx> {
45
51
 
46
52
  const setupFns = getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.SETUP);
47
53
  for (const setupFn of setupFns) {
48
- if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
54
+ const rejectionReason = await this.checkAllowList(setupFn, this.setupAllowList);
55
+ if (rejectionReason) {
49
56
  this.#log.verbose(
50
57
  `Rejecting tx ${tx.getTxHash().toString()} because it calls setup function not on allow list: ${
51
58
  setupFn.request.contractAddress
@@ -53,7 +60,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
53
60
  { allowList: this.setupAllowList },
54
61
  );
55
62
 
56
- return { result: 'invalid', reason: [TX_ERROR_SETUP_FUNCTION_NOT_ALLOWED] };
63
+ return { result: 'invalid', reason: [rejectionReason] };
57
64
  }
58
65
  }
59
66
 
@@ -66,53 +73,101 @@ export class PhasesTxValidator implements TxValidator<Tx> {
66
73
  }
67
74
  }
68
75
 
69
- private async isOnAllowList(
76
+ /** Returns a rejection reason if the call is not on the allow list, or undefined if it is allowed. */
77
+ private async checkAllowList(
70
78
  publicCall: PublicCallRequestWithCalldata,
71
79
  allowList: AllowedElement[],
72
- ): Promise<boolean> {
80
+ ): Promise<string | undefined> {
73
81
  if (publicCall.isEmpty()) {
74
- return true;
82
+ return undefined;
75
83
  }
76
84
 
77
85
  const contractAddress = publicCall.request.contractAddress;
78
86
  const functionSelector = publicCall.functionSelector;
79
87
 
80
- // do these checks first since they don't require the contract class
88
+ // Check address-based entries first since they don't require the contract class.
81
89
  for (const entry of allowList) {
82
- if ('address' in entry && !('selector' in entry)) {
83
- if (contractAddress.equals(entry.address)) {
84
- return true;
85
- }
86
- }
87
-
88
- if ('address' in entry && 'selector' in entry) {
90
+ if ('address' in entry) {
89
91
  if (contractAddress.equals(entry.address) && entry.selector.equals(functionSelector)) {
90
- return true;
92
+ if (entry.calldataLength !== undefined && publicCall.calldata.length !== entry.calldataLength) {
93
+ return TX_ERROR_SETUP_WRONG_CALLDATA_LENGTH;
94
+ }
95
+ if (entry.onlySelf && !publicCall.request.msgSender.equals(contractAddress)) {
96
+ return TX_ERROR_SETUP_ONLY_SELF_WRONG_SENDER;
97
+ }
98
+ if (
99
+ entry.rejectNullMsgSender &&
100
+ publicCall.request.msgSender.equals(AztecAddress.fromBigInt(NULL_MSG_SENDER_CONTRACT_ADDRESS))
101
+ ) {
102
+ return TX_ERROR_SETUP_NULL_MSG_SENDER;
103
+ }
104
+ return undefined;
91
105
  }
92
106
  }
107
+ }
93
108
 
94
- const contractClass = await this.contractsDB.getContractInstance(contractAddress, this.timestamp);
95
-
96
- if (!contractClass) {
97
- throw new Error(`Contract not found: ${contractAddress}`);
109
+ // Check class-based entries. Fetch the contract instance lazily (only once).
110
+ let contractClassId: undefined | { value: string | undefined };
111
+ for (const entry of allowList) {
112
+ if (!('classId' in entry)) {
113
+ continue;
98
114
  }
99
115
 
100
- if ('classId' in entry && !('selector' in entry)) {
101
- if (contractClass.currentContractClassId.equals(entry.classId)) {
102
- return true;
116
+ if (contractClassId === undefined) {
117
+ const instance = await this.contractsDB.getContractInstance(contractAddress, this.timestamp);
118
+ contractClassId = { value: instance?.currentContractClassId.toString() };
119
+ if (!contractClassId.value) {
120
+ return TX_ERROR_SETUP_FUNCTION_UNKNOWN_CONTRACT;
103
121
  }
104
122
  }
105
123
 
106
- if ('classId' in entry && 'selector' in entry) {
124
+ if (contractClassId.value === entry.classId.toString() && entry.selector.equals(functionSelector)) {
125
+ if (entry.calldataLength !== undefined && publicCall.calldata.length !== entry.calldataLength) {
126
+ return TX_ERROR_SETUP_WRONG_CALLDATA_LENGTH;
127
+ }
128
+ if (entry.onlySelf && !publicCall.request.msgSender.equals(contractAddress)) {
129
+ return TX_ERROR_SETUP_ONLY_SELF_WRONG_SENDER;
130
+ }
107
131
  if (
108
- contractClass.currentContractClassId.equals(entry.classId) &&
109
- (entry.selector === undefined || entry.selector.equals(functionSelector))
132
+ entry.rejectNullMsgSender &&
133
+ publicCall.request.msgSender.equals(AztecAddress.fromBigInt(NULL_MSG_SENDER_CONTRACT_ADDRESS))
110
134
  ) {
111
- return true;
135
+ return TX_ERROR_SETUP_NULL_MSG_SENDER;
112
136
  }
137
+ return undefined;
113
138
  }
114
139
  }
115
140
 
116
- return false;
141
+ return TX_ERROR_SETUP_FUNCTION_NOT_ALLOWED;
142
+ }
143
+ }
144
+
145
+ /** Structural interface for the allowed-setup-calls flag check. */
146
+ export interface HasAllowedSetupCallsData {
147
+ txHash: { toString(): string };
148
+ allowedSetupCalls: boolean;
149
+ }
150
+
151
+ /**
152
+ * Validates that a transaction's setup-phase calls were allowed at receipt time.
153
+ *
154
+ * Checks the precomputed `allowedSetupCalls` flag on TxMetaData. The flag is
155
+ * computed by running the PhasesTxValidator on the full Tx when it first enters
156
+ * the pool. This lightweight validator is used during pending pool migration to
157
+ * reject txs whose setup calls are not on the allow list.
158
+ */
159
+ export class AllowedSetupCallsMetaValidator<T extends HasAllowedSetupCallsData> implements TxValidator<T> {
160
+ #log: Logger;
161
+
162
+ constructor(bindings?: LoggerBindings) {
163
+ this.#log = createLogger('sequencer:tx_validator:tx_phases_meta', bindings);
164
+ }
165
+
166
+ validateTx(tx: T): Promise<TxValidationResult> {
167
+ if (!tx.allowedSetupCalls) {
168
+ this.#log.verbose(`Rejecting tx ${tx.txHash} because its setup calls are not on the allow list`);
169
+ return Promise.resolve({ result: 'invalid', reason: [TX_ERROR_SETUP_FUNCTION_NOT_ALLOWED] });
170
+ }
171
+ return Promise.resolve({ result: 'valid' });
117
172
  }
118
173
  }
@@ -1,15 +1,24 @@
1
- import { BlockNumber } from '@aztec/foundation/branded-types';
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
- import {
4
- type AnyTx,
5
- TX_ERROR_INVALID_INCLUDE_BY_TIMESTAMP,
6
- type TxValidationResult,
7
- type TxValidator,
8
- getTxHash,
9
- } from '@aztec/stdlib/tx';
3
+ import { TX_ERROR_INVALID_EXPIRATION_TIMESTAMP, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
10
4
  import type { UInt64 } from '@aztec/stdlib/types';
11
5
 
12
- export class TimestampTxValidator<T extends AnyTx> implements TxValidator<T> {
6
+ /** Structural interface for timestamp validation. */
7
+ export interface HasTimestampData {
8
+ txHash: { toString(): string };
9
+ data: {
10
+ expirationTimestamp: bigint;
11
+ constants: {
12
+ anchorBlockHeader: {
13
+ globalVariables: {
14
+ blockNumber: BlockNumber;
15
+ };
16
+ };
17
+ };
18
+ };
19
+ }
20
+
21
+ export class TimestampTxValidator<T extends HasTimestampData> implements TxValidator<T> {
13
22
  #log: Logger;
14
23
 
15
24
  constructor(
@@ -26,25 +35,21 @@ export class TimestampTxValidator<T extends AnyTx> implements TxValidator<T> {
26
35
  }
27
36
 
28
37
  validateTx(tx: T): Promise<TxValidationResult> {
29
- const includeByTimestamp = tx.data.includeByTimestamp;
30
- // If building block 1, we skip the expiration check. For details on why see the `validate_include_by_timestamp`
38
+ const expirationTimestamp = tx.data.expirationTimestamp;
39
+ // If building block 1, we skip the expiration check. For details on why see the `validate_expiration_timestamp`
31
40
  // function in `noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/validation_requests.nr`.
32
41
  const buildingBlock1 = this.values.blockNumber === 1;
33
42
 
34
- if (!buildingBlock1 && includeByTimestamp < this.values.timestamp) {
43
+ if (!buildingBlock1 && expirationTimestamp < this.values.timestamp) {
35
44
  if (tx.data.constants.anchorBlockHeader.globalVariables.blockNumber === 0) {
36
45
  this.#log.warn(
37
46
  `A tx built against a genesis block failed to be included in block 1 which is the only block in which txs built against a genesis block are allowed to be included.`,
38
47
  );
39
48
  }
40
49
  this.#log.verbose(
41
- `Rejecting tx ${getTxHash(
42
- tx,
43
- )} for low expiration timestamp. Tx expiration timestamp: ${includeByTimestamp}, timestamp: ${
44
- this.values.timestamp
45
- }.`,
50
+ `Rejecting tx ${tx.txHash} for low expiration timestamp. Tx expiration timestamp: ${expirationTimestamp}, timestamp: ${this.values.timestamp}.`,
46
51
  );
47
- return Promise.resolve({ result: 'invalid', reason: [TX_ERROR_INVALID_INCLUDE_BY_TIMESTAMP] });
52
+ return Promise.resolve({ result: 'invalid', reason: [TX_ERROR_INVALID_EXPIRATION_TIMESTAMP] });
48
53
  } else {
49
54
  return Promise.resolve({ result: 'valid' });
50
55
  }
@@ -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
  }