@aztec/p2p 0.0.1-commit.934299a21 → 0.0.1-commit.949a33fd8

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 (366) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +6 -6
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +29 -14
  5. package/dest/client/interface.d.ts +12 -5
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +6 -5
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +47 -39
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +21 -8
  11. package/dest/config.d.ts +128 -100
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +97 -34
  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/index.d.ts +1 -2
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +0 -1
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  24. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  25. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  26. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  27. package/dest/mem_pools/index.d.ts +1 -2
  28. package/dest/mem_pools/index.d.ts.map +1 -1
  29. package/dest/mem_pools/instrumentation.d.ts +4 -2
  30. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  31. package/dest/mem_pools/instrumentation.js +33 -15
  32. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  33. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  35. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  36. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +2 -0
  38. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  39. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  41. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  42. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  43. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  44. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  45. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  47. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  50. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  51. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  53. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  54. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  56. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +12 -5
  57. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  59. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +44 -12
  60. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +81 -22
  62. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -44
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +62 -29
  71. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  72. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  73. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  74. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  75. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  77. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  78. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  79. package/dest/msg_validators/clock_tolerance.js +61 -3
  80. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -4
  81. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  82. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  83. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -4
  84. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  86. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +17 -8
  87. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  88. package/dest/msg_validators/proposal_validator/proposal_validator.js +83 -48
  89. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  90. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  91. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  92. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  93. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  94. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  95. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  96. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  97. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  99. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  100. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  102. package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
  103. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/factory.js +37 -11
  105. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  106. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  108. package/dest/msg_validators/tx_validator/gas_validator.d.ts +48 -7
  109. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  111. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  112. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/index.js +1 -0
  114. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  115. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  117. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  118. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  120. package/dest/services/data_store.d.ts +1 -1
  121. package/dest/services/data_store.d.ts.map +1 -1
  122. package/dest/services/data_store.js +5 -5
  123. package/dest/services/dummy_service.d.ts +6 -3
  124. package/dest/services/dummy_service.d.ts.map +1 -1
  125. package/dest/services/dummy_service.js +6 -1
  126. package/dest/services/encoding.d.ts +6 -2
  127. package/dest/services/encoding.d.ts.map +1 -1
  128. package/dest/services/encoding.js +14 -8
  129. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  130. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  131. package/dest/services/gossipsub/topic_score_params.js +21 -4
  132. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  133. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  134. package/dest/services/libp2p/instrumentation.js +14 -0
  135. package/dest/services/libp2p/libp2p_service.d.ts +23 -32
  136. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  137. package/dest/services/libp2p/libp2p_service.js +202 -151
  138. package/dest/services/peer-manager/metrics.d.ts +3 -1
  139. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  140. package/dest/services/peer-manager/metrics.js +6 -0
  141. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  142. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  143. package/dest/services/peer-manager/peer_manager.js +39 -11
  144. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  145. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  146. package/dest/services/peer-manager/peer_scoring.js +32 -10
  147. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  148. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  149. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +69 -65
  150. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
  151. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  152. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  153. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  154. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  155. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  156. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  157. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  158. package/dest/services/reqresp/config.d.ts +3 -3
  159. package/dest/services/reqresp/config.d.ts.map +1 -1
  160. package/dest/services/reqresp/interface.d.ts +14 -9
  161. package/dest/services/reqresp/interface.d.ts.map +1 -1
  162. package/dest/services/reqresp/interface.js +10 -11
  163. package/dest/services/reqresp/metrics.d.ts +1 -1
  164. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  165. package/dest/services/reqresp/metrics.js +0 -1
  166. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  167. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  168. package/dest/services/reqresp/protocols/index.js +0 -1
  169. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  170. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  171. package/dest/services/reqresp/protocols/tx.js +1 -3
  172. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  173. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  174. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  175. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  176. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  177. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  178. package/dest/services/reqresp/reqresp.d.ts +4 -2
  179. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  180. package/dest/services/reqresp/reqresp.js +30 -12
  181. package/dest/services/service.d.ts +5 -2
  182. package/dest/services/service.d.ts.map +1 -1
  183. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  184. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  185. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  186. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  187. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  188. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  189. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  190. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  191. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  192. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  193. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  194. package/dest/services/tx_collection/request_tracker.js +84 -0
  195. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  196. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  197. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  198. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  199. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  200. package/dest/services/tx_collection/tx_source.js +9 -7
  201. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  202. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  203. package/dest/test-helpers/make-test-p2p-clients.js +4 -2
  204. package/dest/test-helpers/mock-pubsub.d.ts +12 -5
  205. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  206. package/dest/test-helpers/mock-pubsub.js +37 -12
  207. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  208. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  209. package/dest/test-helpers/reqresp-nodes.js +6 -4
  210. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  211. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  212. package/dest/test-helpers/testbench-utils.js +23 -3
  213. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  214. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  215. package/dest/testbench/p2p_client_testbench_worker.js +78 -21
  216. package/dest/testbench/worker_client_manager.d.ts +10 -1
  217. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  218. package/dest/testbench/worker_client_manager.js +55 -3
  219. package/dest/util.d.ts +1 -1
  220. package/package.json +14 -14
  221. package/src/client/factory.ts +48 -19
  222. package/src/client/interface.ts +12 -10
  223. package/src/client/p2p_client.ts +52 -51
  224. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +22 -11
  225. package/src/config.ts +146 -36
  226. package/src/errors/p2p-service.error.ts +11 -0
  227. package/src/index.ts +0 -1
  228. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  229. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  230. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  231. package/src/mem_pools/index.ts +0 -3
  232. package/src/mem_pools/instrumentation.ts +22 -14
  233. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  234. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  235. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
  236. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  237. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  238. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  239. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  240. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  241. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  242. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  243. package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
  244. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +121 -27
  245. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  246. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
  247. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +70 -26
  248. package/src/msg_validators/attestation_validator/README.md +49 -0
  249. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  250. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +12 -2
  251. package/src/msg_validators/clock_tolerance.ts +79 -3
  252. package/src/msg_validators/proposal_validator/README.md +123 -0
  253. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +22 -4
  254. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +33 -7
  255. package/src/msg_validators/proposal_validator/proposal_validator.ts +99 -49
  256. package/src/msg_validators/tx_validator/README.md +15 -3
  257. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  258. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  259. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  260. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  261. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  262. package/src/msg_validators/tx_validator/factory.ts +46 -4
  263. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  264. package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
  265. package/src/msg_validators/tx_validator/index.ts +1 -0
  266. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  267. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  268. package/src/services/data_store.ts +5 -13
  269. package/src/services/dummy_service.ts +8 -2
  270. package/src/services/encoding.ts +14 -7
  271. package/src/services/gossipsub/topic_score_params.ts +36 -4
  272. package/src/services/libp2p/instrumentation.ts +14 -0
  273. package/src/services/libp2p/libp2p_service.ts +206 -164
  274. package/src/services/peer-manager/metrics.ts +7 -0
  275. package/src/services/peer-manager/peer_manager.ts +45 -11
  276. package/src/services/peer-manager/peer_scoring.ts +27 -5
  277. package/src/services/reqresp/README.md +229 -0
  278. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  279. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
  280. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  281. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  282. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  283. package/src/services/reqresp/config.ts +2 -2
  284. package/src/services/reqresp/interface.ts +21 -11
  285. package/src/services/reqresp/metrics.ts +0 -1
  286. package/src/services/reqresp/protocols/index.ts +0 -1
  287. package/src/services/reqresp/protocols/tx.ts +1 -3
  288. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  289. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  290. package/src/services/reqresp/reqresp.ts +40 -13
  291. package/src/services/service.ts +6 -1
  292. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  293. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  294. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  295. package/src/services/tx_collection/request_tracker.ts +127 -0
  296. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  297. package/src/services/tx_collection/tx_collection.ts +3 -5
  298. package/src/services/tx_collection/tx_source.ts +8 -7
  299. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  300. package/src/test-helpers/mock-pubsub.ts +37 -11
  301. package/src/test-helpers/reqresp-nodes.ts +7 -8
  302. package/src/test-helpers/testbench-utils.ts +30 -3
  303. package/src/testbench/p2p_client_testbench_worker.ts +77 -21
  304. package/src/testbench/worker_client_manager.ts +68 -6
  305. package/src/util.ts +1 -1
  306. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  307. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  308. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  309. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  310. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  311. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  312. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  313. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  314. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  315. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  316. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  317. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  318. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  319. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  320. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  321. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  322. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  323. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  324. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  325. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  326. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  327. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  328. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  329. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  330. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  331. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  332. package/dest/mem_pools/tx_pool/index.js +0 -2
  333. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  334. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  335. package/dest/mem_pools/tx_pool/priority.js +0 -15
  336. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  337. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  338. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  339. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  340. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  341. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  342. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  343. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  344. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  345. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  346. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  347. package/dest/services/reqresp/protocols/block.js +0 -32
  348. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  349. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  350. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  351. package/src/mem_pools/tx_pool/README.md +0 -270
  352. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  353. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  354. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  355. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  356. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  357. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  358. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  359. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  360. package/src/mem_pools/tx_pool/index.ts +0 -2
  361. package/src/mem_pools/tx_pool/priority.ts +0 -20
  362. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  363. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  364. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  365. package/src/services/reqresp/protocols/block.ts +0 -37
  366. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -1,10 +1,28 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import type { BlockProposal, P2PValidator } from '@aztec/stdlib/p2p';
2
+ import type { BlockProposal, CoordinationSignatureContext, P2PValidator, ValidationResult } from '@aztec/stdlib/p2p';
3
3
 
4
4
  import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
5
5
 
6
- export class BlockProposalValidator extends ProposalValidator<BlockProposal> implements P2PValidator<BlockProposal> {
7
- constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) {
8
- super(epochCache, opts, 'p2p:block_proposal_validator');
6
+ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
7
+ private proposalValidator: ProposalValidator;
8
+
9
+ constructor(
10
+ epochCache: EpochCacheInterface,
11
+ opts: {
12
+ txsPermitted: boolean;
13
+ maxTxsPerBlock?: number;
14
+ p2pPropagationTime?: number;
15
+ signatureContext: CoordinationSignatureContext;
16
+ },
17
+ ) {
18
+ this.proposalValidator = new ProposalValidator(epochCache, opts, 'p2p:block_proposal_validator');
19
+ }
20
+
21
+ async validate(proposal: BlockProposal): Promise<ValidationResult> {
22
+ const headerResult = await this.proposalValidator.validate(proposal);
23
+ if (headerResult.result !== 'accept') {
24
+ return headerResult;
25
+ }
26
+ return this.proposalValidator.validateTxs(proposal);
9
27
  }
10
28
  }
@@ -1,13 +1,39 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import type { CheckpointProposal, P2PValidator } from '@aztec/stdlib/p2p';
2
+ import type {
3
+ CheckpointProposal,
4
+ CoordinationSignatureContext,
5
+ P2PValidator,
6
+ ValidationResult,
7
+ } from '@aztec/stdlib/p2p';
3
8
 
4
9
  import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
5
10
 
6
- export class CheckpointProposalValidator
7
- extends ProposalValidator<CheckpointProposal>
8
- implements P2PValidator<CheckpointProposal>
9
- {
10
- constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) {
11
- super(epochCache, opts, 'p2p:checkpoint_proposal_validator');
11
+ export class CheckpointProposalValidator implements P2PValidator<CheckpointProposal> {
12
+ private proposalValidator: ProposalValidator;
13
+
14
+ constructor(
15
+ epochCache: EpochCacheInterface,
16
+ opts: {
17
+ txsPermitted: boolean;
18
+ maxTxsPerBlock?: number;
19
+ p2pPropagationTime?: number;
20
+ signatureContext: CoordinationSignatureContext;
21
+ },
22
+ ) {
23
+ this.proposalValidator = new ProposalValidator(epochCache, opts, 'p2p:checkpoint_proposal_validator');
24
+ }
25
+
26
+ async validate(proposal: CheckpointProposal): Promise<ValidationResult> {
27
+ const headerResult = await this.proposalValidator.validate(proposal);
28
+ if (headerResult.result !== 'accept') {
29
+ return headerResult;
30
+ }
31
+
32
+ const blockProposal = proposal.getBlockProposal();
33
+ if (blockProposal) {
34
+ return this.proposalValidator.validateTxs(blockProposal);
35
+ }
36
+
37
+ return { result: 'accept' };
12
38
  }
13
39
  }
@@ -1,34 +1,74 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { NoCommitteeError } from '@aztec/ethereum/contracts';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
- import { BlockProposal, CheckpointProposal, PeerErrorSeverity, type ValidationResult } from '@aztec/stdlib/p2p';
4
+ import {
5
+ type BlockProposal,
6
+ type CheckpointProposalCore,
7
+ type CoordinationSignatureContext,
8
+ PeerErrorSeverity,
9
+ type ValidationResult,
10
+ hasValidSignatureContext,
11
+ } from '@aztec/stdlib/p2p';
5
12
 
6
- import { isWithinClockTolerance } from '../clock_tolerance.js';
13
+ import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
7
14
 
8
- export abstract class ProposalValidator<TProposal extends BlockProposal | CheckpointProposal> {
9
- protected epochCache: EpochCacheInterface;
10
- protected logger: Logger;
11
- protected txsPermitted: boolean;
15
+ /** Validates header-level and tx-level fields of block and checkpoint proposals. */
16
+ export class ProposalValidator {
17
+ private epochCache: EpochCacheInterface;
18
+ private logger: Logger;
19
+ private txsPermitted: boolean;
20
+ private maxTxsPerBlock?: number;
21
+ private pipeliningWindow: PipeliningWindow;
22
+ private signatureContext: CoordinationSignatureContext;
12
23
 
13
- constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }, loggerName: string) {
24
+ constructor(
25
+ epochCache: EpochCacheInterface,
26
+ opts: {
27
+ txsPermitted: boolean;
28
+ maxTxsPerBlock?: number;
29
+ p2pPropagationTime?: number;
30
+ signatureContext: CoordinationSignatureContext;
31
+ },
32
+ loggerName: string,
33
+ ) {
14
34
  this.epochCache = epochCache;
15
35
  this.txsPermitted = opts.txsPermitted;
36
+ this.maxTxsPerBlock = opts.maxTxsPerBlock;
37
+ this.pipeliningWindow = new PipeliningWindow(epochCache, { p2pPropagationTime: opts.p2pPropagationTime });
38
+ this.signatureContext = opts.signatureContext;
16
39
  this.logger = createLogger(loggerName);
17
40
  }
18
41
 
19
- public async validate(proposal: TProposal): Promise<ValidationResult> {
42
+ /** Validates header-level fields: slot, signature, and proposer. */
43
+ public async validate(proposal: BlockProposal | CheckpointProposalCore): Promise<ValidationResult> {
20
44
  try {
21
- // Slot check
22
- const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
45
+ // Cross-chain replay check: reject proposals that carry a foreign signing domain.
46
+ if (!hasValidSignatureContext(proposal, this.signatureContext)) {
47
+ this.logger.warn(`Penalizing peer for proposal with foreign signature context`, {
48
+ chainId: proposal.signatureContext.chainId,
49
+ rollupAddress: proposal.signatureContext.rollupAddress.toString(),
50
+ expectedChainId: this.signatureContext.chainId,
51
+ expectedRollupAddress: this.signatureContext.rollupAddress.toString(),
52
+ });
53
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
54
+ }
55
+
56
+ // Slot check: use target slots since proposals target pipeline slots (slot + 1 when pipelining).
57
+ const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
58
+
23
59
  const slotNumber = proposal.slotNumber;
24
- if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
25
- // Check if message is for previous slot and within clock tolerance
26
- if (!isWithinClockTolerance(slotNumber, currentSlot, this.epochCache)) {
27
- this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, { currentSlot, nextSlot });
60
+ if (slotNumber !== targetSlot && slotNumber !== nextSlot) {
61
+ // When pipelining, accept proposals for the current slot (built in the previous slot)
62
+ // if they're still within the shared proposal acceptance window.
63
+ if (this.pipeliningWindow.acceptsProposal(slotNumber)) {
64
+ // Fall through to remaining validation (signature, proposer, etc.)
65
+ } else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
66
+ this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, { targetSlot, nextSlot });
28
67
  return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
68
+ } else {
69
+ this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
70
+ return { result: 'ignore' };
29
71
  }
30
- this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
31
- return { result: 'ignore' };
32
72
  }
33
73
 
34
74
  // Signature validity
@@ -38,30 +78,6 @@ export abstract class ProposalValidator<TProposal extends BlockProposal | Checkp
38
78
  return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
39
79
  }
40
80
 
41
- // Transactions permitted check
42
- const embeddedTxCount = proposal.txs?.length ?? 0;
43
- if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
44
- this.logger.warn(
45
- `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`,
46
- );
47
- return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
48
- }
49
-
50
- // Embedded txs must be listed in txHashes
51
- const hashSet = new Set(proposal.txHashes.map(h => h.toString()));
52
- const missingTxHashes =
53
- embeddedTxCount > 0
54
- ? proposal.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
55
- : [];
56
- if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
57
- this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
58
- embeddedTxCount,
59
- txHashesLength: proposal.txHashes.length,
60
- missingTxHashes,
61
- });
62
- return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
63
- }
64
-
65
81
  // Proposer check
66
82
  const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
67
83
  if (expectedProposer !== undefined && !proposer.equals(expectedProposer)) {
@@ -72,15 +88,6 @@ export abstract class ProposalValidator<TProposal extends BlockProposal | Checkp
72
88
  return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
73
89
  }
74
90
 
75
- // Validate tx hashes for all txs embedded in the proposal
76
- if (!(await Promise.all(proposal.txs?.map(tx => tx.validateTxHash()) ?? [])).every(v => v)) {
77
- this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`, {
78
- proposer,
79
- slotNumber,
80
- });
81
- return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
82
- }
83
-
84
91
  return { result: 'accept' };
85
92
  } catch (e) {
86
93
  if (e instanceof NoCommitteeError) {
@@ -89,4 +96,47 @@ export abstract class ProposalValidator<TProposal extends BlockProposal | Checkp
89
96
  throw e;
90
97
  }
91
98
  }
99
+
100
+ /** Validates transaction-related fields of a block proposal. */
101
+ public async validateTxs(proposal: BlockProposal): Promise<ValidationResult> {
102
+ // Transactions permitted check
103
+ const embeddedTxCount = proposal.txs?.length ?? 0;
104
+ if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
105
+ this.logger.warn(
106
+ `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`,
107
+ );
108
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
109
+ }
110
+
111
+ // Max txs per block check
112
+ if (this.maxTxsPerBlock !== undefined && proposal.txHashes.length > this.maxTxsPerBlock) {
113
+ this.logger.warn(
114
+ `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when max is ${this.maxTxsPerBlock}`,
115
+ );
116
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
117
+ }
118
+
119
+ // Embedded txs must be listed in txHashes
120
+ const hashSet = new Set(proposal.txHashes.map(h => h.toString()));
121
+ const missingTxHashes =
122
+ embeddedTxCount > 0
123
+ ? proposal.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
124
+ : [];
125
+ if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
126
+ this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
127
+ embeddedTxCount,
128
+ txHashesLength: proposal.txHashes.length,
129
+ missingTxHashes,
130
+ });
131
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
132
+ }
133
+
134
+ // Validate tx hashes for all txs embedded in the proposal
135
+ if (!(await Promise.all(proposal.txs?.map(tx => tx.validateTxHash()) ?? [])).every(v => v)) {
136
+ this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`);
137
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
138
+ }
139
+
140
+ return { result: 'accept' };
141
+ }
92
142
  }
@@ -75,10 +75,12 @@ This validator is invoked on **every** transaction potentially entering the pend
75
75
  - Startup hydration — revalidating persisted non-mined txs on node restart
76
76
 
77
77
  Runs:
78
- - DoubleSpend, BlockHeader, GasLimits, Timestamp
78
+ - DoubleSpend, BlockHeader, GasLimits, MaxFeePerGas, Timestamp, AllowedSetupCalls
79
79
 
80
80
  Operates on `TxMetaData` (pre-built by the pool) rather than full `Tx` objects.
81
81
 
82
+ The `AllowedSetupCallsMetaValidator` checks a precomputed boolean flag (`TxMetaData.allowedSetupCalls`) rather than re-running the full `PhasesTxValidator`. This flag is computed by `createCheckAllowedSetupCalls` when the tx first enters the pool (via `addProtectedTxs` or startup hydration), so the pool migration validator can reject txs with disallowed setup calls without needing the full `Tx` object or its dependencies.
83
+
82
84
  ## Individual Validators
83
85
 
84
86
  | Validator | What it checks | Benchmarked verification duration |
@@ -89,9 +91,11 @@ Operates on `TxMetaData` (pre-built by the pool) rather than full `Tx` objects.
89
91
  | `MetadataTxValidator` | Chain ID, rollup version, protocol contracts hash, VK tree root | 4.18 us |
90
92
  | `TimestampTxValidator` | Transaction has not expired (expiration timestamp vs next slot) | 1.56 us |
91
93
  | `DoubleSpendTxValidator` | Nullifiers do not already exist in the nullifier tree | 106.08 us |
92
- | `GasTxValidator` | Gas limits are within bounds (delegates to `GasLimitsValidator`), max fee per gas meets current block fees, and fee payer has sufficient FeeJuice balance | 1.02 ms |
94
+ | `GasTxValidator` | Gas limits are within bounds (delegates to `GasLimitsValidator`), max fee per gas meets current block fees (delegates to `MaxFeePerGasValidator`), and fee payer has sufficient FeeJuice balance | 1.02 ms |
93
95
  | `GasLimitsValidator` | Gas limits are >= fixed minimums and <= AVM max processable L2 gas. Used standalone in pool migration; also called internally by `GasTxValidator` | 3–10 us |
96
+ | `MaxFeePerGasValidator` | Max fee per gas >= current block gas fees on both dimensions (DA and L2). Used standalone in pool migration; also called internally by `GasTxValidator` | 3–10 us |
94
97
  | `PhasesTxValidator` | Public function calls in setup phase are on the allow list | 10.12–13.12 us |
98
+ | `AllowedSetupCallsMetaValidator` | Checks the precomputed `allowedSetupCalls` flag on `TxMetaData`. Used in pool migration instead of the full `PhasesTxValidator` | — |
95
99
  | `BlockHeaderTxValidator` | Transaction's anchor block hash exists in the archive tree | 98.88 us |
96
100
  | `TxProofValidator` | Client proof verifies correctly | ~250ms |
97
101
 
@@ -107,9 +111,17 @@ Operates on `TxMetaData` (pre-built by the pool) rather than full `Tx` objects.
107
111
  | DoubleSpend | Stage 1 | Yes | — | Yes | Yes |
108
112
  | Gas (balance + limits) | Stage 1 | Optional* | — | Yes | — |
109
113
  | GasLimits (standalone) | — | — | — | — | Yes |
114
+ | MaxFeePerGas (standalone) | — | — | — | — | Yes |
110
115
  | Phases | Stage 1 | Yes | — | Yes | — |
116
+ | AllowedSetupCalls | — | — | — | — | Yes |
111
117
  | BlockHeader | Stage 1 | Yes | — | Yes | Yes |
112
118
  | Proof | Stage 2 | Optional** | Yes | — | — |
113
119
 
114
- \* Gas balance check is skipped when `skipFeeEnforcement` is set (testing/dev). `GasTxValidator` internally delegates to `GasLimitsValidator` as its first step, so gas limits are checked wherever `GasTxValidator` runs. Pool migration uses `GasLimitsValidator` standalone because it doesn't need the balance or fee-per-gas checks.
120
+ \* Gas balance check is skipped when `skipFeeEnforcement` is set (testing/dev). `GasTxValidator` internally delegates to `GasLimitsValidator` and `MaxFeePerGasValidator` as its first steps, so gas limits and fee-per-gas are checked wherever `GasTxValidator` runs. Pool migration uses `GasLimitsValidator` and `MaxFeePerGasValidator` standalone because it doesn't need the balance check.
115
121
  \** Proof verification is skipped for simulations (no verifier provided).
122
+
123
+ ## Fee-Per-Gas Rejection Strategy
124
+
125
+ The `MaxFeePerGasValidator` and `InsufficientFeePerGasEvictionRule` reject and evict transactions whose `maxFeesPerGas` falls below the current block's gas fees. This is a simple strategy: if a tx can't pay the current fees, it gets rejected on entry and evicted after each new block.
126
+
127
+ **Caveat**: This may evict transactions that would become valid again if block fees drop. A more nuanced approach would be to define a threshold (e.g., 50%) and only reject/evict when the tx's max fee falls below that fraction of the current fees. The current approach is simpler and ensures the pool doesn't accumulate transactions with low max fees that are unlikely to be mined soon.
@@ -1,35 +1,30 @@
1
- import { FPCContract } from '@aztec/noir-contracts.js/FPC';
2
- import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
3
1
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
- import { getContractClassFromArtifact } from '@aztec/stdlib/contract';
2
+ import { AuthRegistryArtifact } from '@aztec/protocol-contracts/auth-registry';
3
+ import { FeeJuiceArtifact } from '@aztec/protocol-contracts/fee-juice';
5
4
  import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
6
5
 
7
- let defaultAllowedSetupFunctions: AllowedElement[] | undefined = undefined;
6
+ import { buildAllowedElement } from './allowed_setup_helpers.js';
7
+
8
+ let defaultAllowedSetupFunctions: AllowedElement[] | undefined;
9
+
10
+ /** Returns the default list of functions allowed to run in the setup phase of a transaction. */
8
11
  export async function getDefaultAllowedSetupFunctions(): Promise<AllowedElement[]> {
9
12
  if (defaultAllowedSetupFunctions === undefined) {
10
- defaultAllowedSetupFunctions = [
11
- // needed for authwit support
12
- {
13
- address: ProtocolContractAddress.AuthRegistry,
14
- },
15
- // needed for claiming on the same tx as a spend
16
- {
17
- address: ProtocolContractAddress.FeeJuice,
18
- // We can't restrict the selector because public functions get routed via dispatch.
19
- // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),u128)'),
20
- },
21
- // needed for private transfers via FPC
22
- {
23
- classId: (await getContractClassFromArtifact(TokenContractArtifact)).id,
24
- // We can't restrict the selector because public functions get routed via dispatch.
25
- // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),u128)'),
26
- },
27
- {
28
- classId: (await getContractClassFromArtifact(FPCContract.artifact)).id,
29
- // We can't restrict the selector because public functions get routed via dispatch.
30
- // selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
31
- },
32
- ];
13
+ defaultAllowedSetupFunctions = await Promise.all([
14
+ // AuthRegistry: needed for authwit support via private path (set_authorized_private enqueues _set_authorized)
15
+ buildAllowedElement(AuthRegistryArtifact, { address: ProtocolContractAddress.AuthRegistry }, '_set_authorized', {
16
+ onlySelf: true,
17
+ rejectNullMsgSender: true,
18
+ }),
19
+ // AuthRegistry: needed for authwit support via public path (PublicFeePaymentMethod calls set_authorized directly)
20
+ buildAllowedElement(AuthRegistryArtifact, { address: ProtocolContractAddress.AuthRegistry }, 'set_authorized', {
21
+ rejectNullMsgSender: true,
22
+ }),
23
+ // FeeJuice: needed for claiming on the same tx as a spend (claim_and_end_setup enqueues this)
24
+ buildAllowedElement(FeeJuiceArtifact, { address: ProtocolContractAddress.FeeJuice }, '_increase_public_balance', {
25
+ onlySelf: true,
26
+ }),
27
+ ]);
33
28
  }
34
29
  return defaultAllowedSetupFunctions;
35
30
  }
@@ -0,0 +1,31 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { FunctionSelector, countArgumentsSize, getAllFunctionAbis } from '@aztec/stdlib/abi';
3
+ import type { ContractArtifact } from '@aztec/stdlib/abi';
4
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+ import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
6
+
7
+ /**
8
+ * Builds an AllowedElement from a contract artifact, deriving both the function selector
9
+ * and calldata length from the artifact instead of hardcoding signature strings.
10
+ */
11
+ export async function buildAllowedElement(
12
+ artifact: ContractArtifact,
13
+ target: { address: AztecAddress } | { classId: Fr },
14
+ functionName: string,
15
+ opts?: { onlySelf?: boolean; rejectNullMsgSender?: boolean },
16
+ ): Promise<AllowedElement> {
17
+ const allFunctions = getAllFunctionAbis(artifact);
18
+ const fn = allFunctions.find(f => f.name === functionName);
19
+ if (!fn) {
20
+ throw new Error(`Unknown function ${functionName} in artifact ${artifact.name}`);
21
+ }
22
+ const selector = await FunctionSelector.fromNameAndParameters(fn.name, fn.parameters);
23
+ const calldataLength = 1 + countArgumentsSize(fn);
24
+ return {
25
+ ...target,
26
+ selector,
27
+ calldataLength,
28
+ ...(opts?.onlySelf ? { onlySelf: true } : {}),
29
+ ...(opts?.rejectNullMsgSender ? { rejectNullMsgSender: true } : {}),
30
+ } as AllowedElement;
31
+ }
@@ -15,7 +15,7 @@ export class ArchiveCache implements ArchiveSource {
15
15
  }
16
16
 
17
17
  public async getArchiveIndices(archives: BlockHash[]): Promise<(bigint | undefined)[]> {
18
- const toCheckDb = archives.filter(n => !this.archives.has(n.toString())).map(n => n.toFr());
18
+ const toCheckDb = archives.filter(n => !this.archives.has(n.toString()));
19
19
  const dbHits = await this.db.findLeafIndices(MerkleTreeId.ARCHIVE, toCheckDb);
20
20
  dbHits.forEach((x, index) => {
21
21
  if (x !== undefined) {
@@ -0,0 +1,56 @@
1
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
2
+ import { ContractInstancePublishedEvent } from '@aztec/protocol-contracts/instance-registry';
3
+ import { computeContractAddressFromInstance } from '@aztec/stdlib/contract';
4
+ import {
5
+ TX_ERROR_INCORRECT_CONTRACT_ADDRESS,
6
+ TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG,
7
+ type Tx,
8
+ type TxValidationResult,
9
+ type TxValidator,
10
+ } from '@aztec/stdlib/tx';
11
+
12
+ /** Validates that contract instance deployment logs contain correct addresses. */
13
+ export class ContractInstanceTxValidator implements TxValidator<Tx> {
14
+ #log: Logger;
15
+
16
+ constructor(bindings?: LoggerBindings) {
17
+ this.#log = createLogger('p2p:tx_validator:contract_instance', bindings);
18
+ }
19
+
20
+ async validateTx(tx: Tx): Promise<TxValidationResult> {
21
+ const reason = await this.#hasCorrectContractInstanceAddresses(tx);
22
+ return reason ? { result: 'invalid', reason: [reason] } : { result: 'valid' };
23
+ }
24
+
25
+ async #hasCorrectContractInstanceAddresses(tx: Tx): Promise<string | undefined> {
26
+ const privateLogs = tx.data.getNonEmptyPrivateLogs();
27
+ for (const log of privateLogs) {
28
+ if (!ContractInstancePublishedEvent.isContractInstancePublishedEvent(log)) {
29
+ continue;
30
+ }
31
+
32
+ let event;
33
+ try {
34
+ event = ContractInstancePublishedEvent.fromLog(log);
35
+ } catch (e) {
36
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to parse contract instance event: ${e}`);
37
+ return TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG;
38
+ }
39
+
40
+ try {
41
+ const instance = event.toContractInstance();
42
+ const computedAddress = await computeContractAddressFromInstance(instance);
43
+ if (!computedAddress.equals(instance.address)) {
44
+ this.#log.warn(
45
+ `Rejecting tx ${tx.getTxHash()}: contract instance address mismatch. Claimed ${instance.address}, computed ${computedAddress}`,
46
+ );
47
+ return TX_ERROR_INCORRECT_CONTRACT_ADDRESS;
48
+ }
49
+ } catch (e) {
50
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to compute contract instance address: ${e}`);
51
+ return TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG;
52
+ }
53
+ }
54
+ return undefined;
55
+ }
56
+ }
@@ -1,5 +1,7 @@
1
1
  import { MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
2
2
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
+ import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
4
+ import { computeContractClassId } from '@aztec/stdlib/contract';
3
5
  import { computeCalldataHash } from '@aztec/stdlib/hash';
4
6
  import {
5
7
  TX_ERROR_CALLDATA_COUNT_MISMATCH,
@@ -9,7 +11,9 @@ import {
9
11
  TX_ERROR_CONTRACT_CLASS_LOG_LENGTH,
10
12
  TX_ERROR_CONTRACT_CLASS_LOG_SORTING,
11
13
  TX_ERROR_INCORRECT_CALLDATA,
14
+ TX_ERROR_INCORRECT_CONTRACT_CLASS_ID,
12
15
  TX_ERROR_INCORRECT_HASH,
16
+ TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG,
13
17
  Tx,
14
18
  type TxValidationResult,
15
19
  type TxValidator,
@@ -26,7 +30,8 @@ export class DataTxValidator implements TxValidator<Tx> {
26
30
  const reason =
27
31
  (await this.#hasCorrectHash(tx)) ??
28
32
  (await this.#hasCorrectCalldata(tx)) ??
29
- (await this.#hasCorrectContractClassLogs(tx));
33
+ (await this.#hasCorrectContractClassLogs(tx)) ??
34
+ (await this.#hasCorrectContractClassIds(tx));
30
35
  return reason ? { result: 'invalid', reason: [reason] } : { result: 'valid' };
31
36
  }
32
37
 
@@ -127,4 +132,40 @@ export class DataTxValidator implements TxValidator<Tx> {
127
132
 
128
133
  return undefined;
129
134
  }
135
+
136
+ async #hasCorrectContractClassIds(tx: Tx): Promise<string | undefined> {
137
+ const contractClassLogs = tx.getContractClassLogs();
138
+ for (const log of contractClassLogs) {
139
+ if (!ContractClassPublishedEvent.isContractClassPublishedEvent(log)) {
140
+ continue;
141
+ }
142
+
143
+ let event;
144
+ try {
145
+ event = ContractClassPublishedEvent.fromLog(log);
146
+ } catch (e) {
147
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to parse contract class event: ${e}`);
148
+ return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
149
+ }
150
+
151
+ try {
152
+ const { publicBytecodeCommitment } = await event.toContractClassPublicWithBytecodeCommitment();
153
+ const computedClassId = await computeContractClassId({
154
+ artifactHash: event.artifactHash,
155
+ privateFunctionsRoot: event.privateFunctionsRoot,
156
+ publicBytecodeCommitment,
157
+ });
158
+ if (!computedClassId.equals(event.contractClassId)) {
159
+ this.#log.warn(
160
+ `Rejecting tx ${tx.getTxHash()}: contract class id mismatch. Claimed ${event.contractClassId}, computed ${computedClassId}`,
161
+ );
162
+ return TX_ERROR_INCORRECT_CONTRACT_CLASS_ID;
163
+ }
164
+ } catch (e) {
165
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to compute contract class id: ${e}`);
166
+ return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
167
+ }
168
+ }
169
+ return undefined;
170
+ }
130
171
  }