@aztec/p2p 0.0.1-commit.96bb3f7 → 0.0.1-commit.993d240

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 (573) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +13 -5
  5. package/dest/client/factory.d.ts +13 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +65 -20
  8. package/dest/client/interface.d.ts +58 -36
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +52 -58
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +236 -236
  13. package/dest/config.d.ts +163 -84
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +156 -43
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  22. package/dest/errors/tx-pool.error.d.ts +8 -0
  23. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  24. package/dest/errors/tx-pool.error.js +9 -0
  25. package/dest/index.d.ts +2 -2
  26. package/dest/index.d.ts.map +1 -1
  27. package/dest/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +162 -106
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -3
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +525 -132
  34. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  35. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/index.js +1 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +4 -2
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/mocks.js +13 -8
  40. package/dest/mem_pools/index.d.ts +3 -3
  41. package/dest/mem_pools/index.d.ts.map +1 -1
  42. package/dest/mem_pools/index.js +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts +4 -2
  44. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  45. package/dest/mem_pools/instrumentation.js +35 -17
  46. package/dest/mem_pools/interface.d.ts +5 -5
  47. package/dest/mem_pools/interface.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  90. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  91. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  94. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +218 -0
  97. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +914 -0
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -4
  115. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/attestation_validator/attestation_validator.js +69 -13
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +9 -5
  118. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -11
  120. package/dest/msg_validators/clock_tolerance.d.ts +32 -0
  121. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  122. package/dest/msg_validators/clock_tolerance.js +95 -0
  123. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
  124. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  126. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
  127. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  129. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
  130. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/proposal_validator/proposal_validator.js +123 -53
  132. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  133. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  135. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  136. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  138. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  139. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  140. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  141. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  142. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  144. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  145. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  146. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  147. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  149. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  150. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  152. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  153. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/data_validator.js +40 -3
  155. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  156. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  158. package/dest/msg_validators/tx_validator/factory.d.ts +138 -5
  159. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  160. package/dest/msg_validators/tx_validator/factory.js +259 -58
  161. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  162. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  163. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  164. package/dest/msg_validators/tx_validator/gas_validator.d.ts +100 -3
  165. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  166. package/dest/msg_validators/tx_validator/gas_validator.js +146 -67
  167. package/dest/msg_validators/tx_validator/index.d.ts +6 -1
  168. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/index.js +5 -0
  170. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  171. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  172. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  173. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  174. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  175. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  176. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  177. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  178. package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
  179. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  180. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  181. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  182. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  183. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  184. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  185. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  186. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  187. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  188. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  189. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  190. package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
  191. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  192. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  193. package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
  194. package/dest/services/data_store.d.ts +1 -1
  195. package/dest/services/data_store.d.ts.map +1 -1
  196. package/dest/services/data_store.js +14 -10
  197. package/dest/services/discv5/discV5_service.d.ts +2 -1
  198. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  199. package/dest/services/discv5/discV5_service.js +36 -9
  200. package/dest/services/dummy_service.d.ts +33 -17
  201. package/dest/services/dummy_service.d.ts.map +1 -1
  202. package/dest/services/dummy_service.js +56 -15
  203. package/dest/services/encoding.d.ts +7 -3
  204. package/dest/services/encoding.d.ts.map +1 -1
  205. package/dest/services/encoding.js +20 -14
  206. package/dest/services/gossipsub/index.d.ts +3 -0
  207. package/dest/services/gossipsub/index.d.ts.map +1 -0
  208. package/dest/services/gossipsub/index.js +2 -0
  209. package/dest/services/gossipsub/scoring.d.ts +21 -3
  210. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  211. package/dest/services/gossipsub/scoring.js +24 -7
  212. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  213. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  214. package/dest/services/gossipsub/topic_score_params.js +363 -0
  215. package/dest/services/index.d.ts +2 -1
  216. package/dest/services/index.d.ts.map +1 -1
  217. package/dest/services/index.js +1 -0
  218. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  219. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  220. package/dest/services/libp2p/instrumentation.js +33 -8
  221. package/dest/services/libp2p/libp2p_service.d.ts +107 -59
  222. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  223. package/dest/services/libp2p/libp2p_service.js +683 -539
  224. package/dest/services/peer-manager/metrics.d.ts +4 -2
  225. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  226. package/dest/services/peer-manager/metrics.js +26 -5
  227. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  228. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  229. package/dest/services/peer-manager/peer_manager.js +40 -11
  230. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  231. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  232. package/dest/services/peer-manager/peer_scoring.js +65 -14
  233. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +51 -0
  234. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  235. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +552 -0
  236. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  237. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  238. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  239. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  240. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  241. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  242. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  243. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  244. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  245. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  246. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  247. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  248. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  249. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  251. package/dest/services/reqresp/config.d.ts +3 -3
  252. package/dest/services/reqresp/config.d.ts.map +1 -1
  253. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  254. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  255. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  256. package/dest/services/reqresp/constants.d.ts +12 -0
  257. package/dest/services/reqresp/constants.d.ts.map +1 -0
  258. package/dest/services/reqresp/constants.js +7 -0
  259. package/dest/services/reqresp/interface.d.ts +27 -18
  260. package/dest/services/reqresp/interface.d.ts.map +1 -1
  261. package/dest/services/reqresp/interface.js +23 -19
  262. package/dest/services/reqresp/metrics.d.ts +6 -5
  263. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  264. package/dest/services/reqresp/metrics.js +16 -5
  265. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  266. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  267. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  268. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  269. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  270. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +29 -9
  271. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  272. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  273. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  274. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  275. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  276. package/dest/services/reqresp/protocols/index.js +0 -1
  277. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  278. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  279. package/dest/services/reqresp/protocols/status.js +2 -1
  280. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  281. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  282. package/dest/services/reqresp/protocols/tx.js +21 -3
  283. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  284. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  285. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  286. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  287. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  288. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  289. package/dest/services/reqresp/reqresp.d.ts +12 -29
  290. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  291. package/dest/services/reqresp/reqresp.js +58 -187
  292. package/dest/services/service.d.ts +49 -13
  293. package/dest/services/service.d.ts.map +1 -1
  294. package/dest/services/tx_collection/config.d.ts +11 -11
  295. package/dest/services/tx_collection/config.d.ts.map +1 -1
  296. package/dest/services/tx_collection/config.js +27 -26
  297. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  298. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  299. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  300. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  301. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  302. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  303. package/dest/services/tx_collection/index.d.ts +3 -2
  304. package/dest/services/tx_collection/index.d.ts.map +1 -1
  305. package/dest/services/tx_collection/index.js +1 -0
  306. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  307. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  308. package/dest/services/tx_collection/instrumentation.js +8 -2
  309. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  310. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  311. package/dest/services/tx_collection/request_tracker.js +84 -0
  312. package/dest/services/tx_collection/tx_collection.d.ts +50 -56
  313. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  314. package/dest/services/tx_collection/tx_collection.js +298 -70
  315. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  316. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  317. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  318. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  319. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  320. package/dest/services/tx_collection/tx_source.js +26 -7
  321. package/dest/services/tx_file_store/config.d.ts +16 -0
  322. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  323. package/dest/services/tx_file_store/config.js +22 -0
  324. package/dest/services/tx_file_store/index.d.ts +4 -0
  325. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  326. package/dest/services/tx_file_store/index.js +3 -0
  327. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  328. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  329. package/dest/services/tx_file_store/instrumentation.js +29 -0
  330. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  331. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  332. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  333. package/dest/services/tx_provider.d.ts +8 -6
  334. package/dest/services/tx_provider.d.ts.map +1 -1
  335. package/dest/services/tx_provider.js +12 -8
  336. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  337. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  338. package/dest/services/tx_provider_instrumentation.js +5 -5
  339. package/dest/test-helpers/index.d.ts +3 -1
  340. package/dest/test-helpers/index.d.ts.map +1 -1
  341. package/dest/test-helpers/index.js +2 -0
  342. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  343. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  344. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  345. package/dest/test-helpers/mock-pubsub.d.ts +46 -6
  346. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  347. package/dest/test-helpers/mock-pubsub.js +115 -14
  348. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  349. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  350. package/dest/test-helpers/reqresp-nodes.js +19 -20
  351. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  352. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  353. package/dest/test-helpers/test_tx_provider.js +44 -0
  354. package/dest/test-helpers/testbench-utils.d.ts +161 -0
  355. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  356. package/dest/test-helpers/testbench-utils.js +393 -0
  357. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  358. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  359. package/dest/testbench/p2p_client_testbench_worker.js +270 -144
  360. package/dest/testbench/worker_client_manager.d.ts +57 -6
  361. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  362. package/dest/testbench/worker_client_manager.js +277 -49
  363. package/dest/util.d.ts +13 -8
  364. package/dest/util.d.ts.map +1 -1
  365. package/dest/util.js +35 -14
  366. package/dest/versioning.d.ts +3 -6
  367. package/dest/versioning.d.ts.map +1 -1
  368. package/dest/versioning.js +3 -24
  369. package/package.json +17 -16
  370. package/src/bootstrap/bootstrap.ts +16 -5
  371. package/src/client/factory.ts +135 -39
  372. package/src/client/interface.ts +70 -44
  373. package/src/client/p2p_client.ts +283 -302
  374. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  375. package/src/config.ts +274 -48
  376. package/src/errors/p2p-service.error.ts +11 -0
  377. package/src/errors/reqresp.error.ts +0 -25
  378. package/src/errors/tx-pool.error.ts +12 -0
  379. package/src/index.ts +1 -1
  380. package/src/mem_pools/attestation_pool/attestation_pool.ts +575 -94
  381. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +633 -149
  382. package/src/mem_pools/attestation_pool/index.ts +9 -2
  383. package/src/mem_pools/attestation_pool/mocks.ts +19 -11
  384. package/src/mem_pools/index.ts +2 -2
  385. package/src/mem_pools/instrumentation.ts +24 -15
  386. package/src/mem_pools/interface.ts +4 -4
  387. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  388. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  389. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  390. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  391. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  392. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  393. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  394. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  395. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  396. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  397. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  398. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  399. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  400. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  401. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  402. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  403. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  404. package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
  405. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  406. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  407. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  408. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  409. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
  410. package/src/msg_validators/attestation_validator/README.md +49 -0
  411. package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -16
  412. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +29 -16
  413. package/src/msg_validators/clock_tolerance.ts +127 -0
  414. package/src/msg_validators/proposal_validator/README.md +123 -0
  415. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
  416. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
  417. package/src/msg_validators/proposal_validator/proposal_validator.ts +129 -62
  418. package/src/msg_validators/tx_validator/README.md +127 -0
  419. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  420. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  421. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  422. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  423. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  424. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  425. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  426. package/src/msg_validators/tx_validator/data_validator.ts +50 -3
  427. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  428. package/src/msg_validators/tx_validator/factory.ts +424 -56
  429. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  430. package/src/msg_validators/tx_validator/gas_validator.ts +211 -77
  431. package/src/msg_validators/tx_validator/index.ts +5 -0
  432. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  433. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  434. package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
  435. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  436. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  437. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  438. package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
  439. package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
  440. package/src/services/data_store.ts +14 -19
  441. package/src/services/discv5/discV5_service.ts +39 -6
  442. package/src/services/dummy_service.ts +71 -39
  443. package/src/services/encoding.ts +20 -13
  444. package/src/services/gossipsub/README.md +641 -0
  445. package/src/services/gossipsub/index.ts +2 -0
  446. package/src/services/gossipsub/scoring.ts +29 -5
  447. package/src/services/gossipsub/topic_score_params.ts +519 -0
  448. package/src/services/index.ts +1 -0
  449. package/src/services/libp2p/instrumentation.ts +34 -7
  450. package/src/services/libp2p/libp2p_service.ts +753 -597
  451. package/src/services/peer-manager/metrics.ts +28 -4
  452. package/src/services/peer-manager/peer_manager.ts +46 -11
  453. package/src/services/peer-manager/peer_scoring.ts +56 -6
  454. package/src/services/reqresp/README.md +215 -0
  455. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  456. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +684 -0
  457. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  458. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  459. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  460. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  461. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  462. package/src/services/reqresp/config.ts +2 -2
  463. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  464. package/src/services/reqresp/constants.ts +14 -0
  465. package/src/services/reqresp/interface.ts +48 -46
  466. package/src/services/reqresp/metrics.ts +33 -9
  467. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  468. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +37 -12
  469. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  470. package/src/services/reqresp/protocols/index.ts +0 -1
  471. package/src/services/reqresp/protocols/status.ts +5 -3
  472. package/src/services/reqresp/protocols/tx.ts +23 -3
  473. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  474. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  475. package/src/services/reqresp/reqresp.ts +68 -224
  476. package/src/services/service.ts +66 -29
  477. package/src/services/tx_collection/config.ts +41 -36
  478. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  479. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  480. package/src/services/tx_collection/index.ts +2 -1
  481. package/src/services/tx_collection/instrumentation.ts +11 -2
  482. package/src/services/tx_collection/request_tracker.ts +127 -0
  483. package/src/services/tx_collection/tx_collection.ts +367 -115
  484. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  485. package/src/services/tx_collection/tx_source.ts +28 -8
  486. package/src/services/tx_file_store/config.ts +37 -0
  487. package/src/services/tx_file_store/index.ts +3 -0
  488. package/src/services/tx_file_store/instrumentation.ts +36 -0
  489. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  490. package/src/services/tx_provider.ts +17 -11
  491. package/src/services/tx_provider_instrumentation.ts +11 -5
  492. package/src/test-helpers/index.ts +2 -0
  493. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  494. package/src/test-helpers/mock-pubsub.ts +137 -14
  495. package/src/test-helpers/reqresp-nodes.ts +17 -29
  496. package/src/test-helpers/test_tx_provider.ts +69 -0
  497. package/src/test-helpers/testbench-utils.ts +455 -0
  498. package/src/testbench/p2p_client_testbench_worker.ts +370 -138
  499. package/src/testbench/worker_client_manager.ts +355 -51
  500. package/src/util.ts +40 -19
  501. package/src/versioning.ts +3 -33
  502. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  503. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  504. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  505. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  506. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  507. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  508. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -120
  509. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  510. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -555
  511. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -18
  512. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  513. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -56
  514. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -83
  515. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  516. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -5
  517. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
  518. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
  519. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
  520. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  521. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  522. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  523. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  524. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -76
  525. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  526. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  527. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  528. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  529. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  530. package/dest/mem_pools/tx_pool/index.js +0 -2
  531. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  532. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  533. package/dest/mem_pools/tx_pool/priority.js +0 -15
  534. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  535. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  536. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  537. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  538. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  539. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  540. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  541. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  542. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -183
  543. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  544. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  545. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
  546. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  547. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  548. package/dest/services/reqresp/protocols/block.js +0 -32
  549. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  550. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  551. package/dest/services/tx_collection/fast_tx_collection.js +0 -300
  552. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
  553. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  554. package/dest/services/tx_collection/slow_tx_collection.js +0 -177
  555. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  556. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  557. package/src/mem_pools/tx_pool/README.md +0 -255
  558. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -691
  559. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -71
  560. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -93
  561. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
  562. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  563. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -91
  564. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  565. package/src/mem_pools/tx_pool/index.ts +0 -2
  566. package/src/mem_pools/tx_pool/priority.ts +0 -20
  567. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  568. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  569. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -206
  570. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
  571. package/src/services/reqresp/protocols/block.ts +0 -37
  572. package/src/services/tx_collection/fast_tx_collection.ts +0 -341
  573. package/src/services/tx_collection/slow_tx_collection.ts +0 -233
@@ -1,92 +1,159 @@
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 } 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
- export abstract class ProposalValidator<TProposal extends BlockProposal | CheckpointProposal> {
7
- protected epochCache: EpochCacheInterface;
8
- protected logger: Logger;
9
- protected txsPermitted: boolean;
13
+ import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
10
14
 
11
- constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }, loggerName: string) {
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 maxBlocksPerCheckpoint?: number;
22
+ private pipeliningWindow: PipeliningWindow;
23
+ private skipSlotValidation: boolean;
24
+ private signatureContext: CoordinationSignatureContext;
25
+
26
+ constructor(
27
+ epochCache: EpochCacheInterface,
28
+ opts: {
29
+ txsPermitted: boolean;
30
+ maxTxsPerBlock?: number;
31
+ maxBlocksPerCheckpoint?: number;
32
+ p2pPropagationTime?: number;
33
+ skipSlotValidation?: boolean;
34
+ signatureContext: CoordinationSignatureContext;
35
+ },
36
+ loggerName: string,
37
+ ) {
12
38
  this.epochCache = epochCache;
13
39
  this.txsPermitted = opts.txsPermitted;
40
+ this.maxTxsPerBlock = opts.maxTxsPerBlock;
41
+ this.maxBlocksPerCheckpoint = opts.maxBlocksPerCheckpoint;
42
+ this.pipeliningWindow = new PipeliningWindow(epochCache, { p2pPropagationTime: opts.p2pPropagationTime });
43
+ this.skipSlotValidation = opts.skipSlotValidation ?? false;
44
+ this.signatureContext = opts.signatureContext;
14
45
  this.logger = createLogger(loggerName);
15
46
  }
16
47
 
17
- public async validate(proposal: TProposal): Promise<PeerErrorSeverity | undefined> {
48
+ /** Validates header-level fields: slot, signature, and proposer. */
49
+ public async validate(proposal: BlockProposal | CheckpointProposalCore): Promise<ValidationResult> {
18
50
  try {
19
- // Signature validity
20
- const proposer = proposal.getSender();
21
- if (!proposer) {
22
- this.logger.debug(`Penalizing peer for proposal with invalid signature`);
23
- return PeerErrorSeverity.MidToleranceError;
24
- }
25
-
26
- // Transactions permitted check
27
- const embeddedTxCount = proposal.txs?.length ?? 0;
28
- if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
29
- this.logger.debug(
30
- `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`,
31
- );
32
- return PeerErrorSeverity.MidToleranceError;
33
- }
34
-
35
- // Embedded txs must be listed in txHashes
36
- const hashSet = new Set(proposal.txHashes.map(h => h.toString()));
37
- const missingTxHashes =
38
- embeddedTxCount > 0
39
- ? proposal.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
40
- : [];
41
- if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
42
- this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
43
- embeddedTxCount,
44
- txHashesLength: proposal.txHashes.length,
45
- missingTxHashes,
51
+ // Cross-chain replay check: reject proposals that carry a foreign signing domain.
52
+ if (!hasValidSignatureContext(proposal, this.signatureContext)) {
53
+ this.logger.warn(`Penalizing peer for proposal with foreign signature context`, {
54
+ chainId: proposal.signatureContext.chainId,
55
+ rollupAddress: proposal.signatureContext.rollupAddress.toString(),
56
+ expectedChainId: this.signatureContext.chainId,
57
+ expectedRollupAddress: this.signatureContext.rollupAddress.toString(),
46
58
  });
47
- return PeerErrorSeverity.MidToleranceError;
59
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
48
60
  }
49
61
 
50
- // Slot and proposer checks
51
- const { currentProposer, nextProposer, currentSlot, nextSlot } =
52
- await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
62
+ // Slot check: use target slots since proposals target pipeline slots (slot + 1 when pipelining).
63
+ const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
64
+
53
65
  const slotNumber = proposal.slotNumber;
54
- if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
55
- this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, { currentSlot, nextSlot });
56
- return PeerErrorSeverity.HighToleranceError;
66
+ if (!this.skipSlotValidation && slotNumber !== targetSlot && slotNumber !== nextSlot) {
67
+ // When pipelining, accept proposals for the current slot (built in the previous slot)
68
+ // if they're still within the shared proposal acceptance window.
69
+ if (this.pipeliningWindow.acceptsProposal(slotNumber)) {
70
+ // Fall through to remaining validation (signature, proposer, etc.)
71
+ } else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
72
+ this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, { targetSlot, nextSlot });
73
+ return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
74
+ } else {
75
+ this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
76
+ return { result: 'ignore' };
77
+ }
57
78
  }
58
- if (slotNumber === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
59
- this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
60
- currentProposer,
61
- nextProposer,
62
- proposer: proposer.toString(),
63
- });
64
- return PeerErrorSeverity.MidToleranceError;
79
+
80
+ // Signature validity
81
+ const proposer = proposal.getSender();
82
+ if (!proposer) {
83
+ this.logger.warn(`Penalizing peer for proposal with invalid signature`);
84
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
65
85
  }
66
- if (slotNumber === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
67
- this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumber}`, {
68
- currentProposer,
69
- nextProposer,
86
+
87
+ // Proposer check
88
+ const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
89
+ if (expectedProposer !== undefined && !proposer.equals(expectedProposer)) {
90
+ this.logger.warn(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
91
+ expectedProposer,
70
92
  proposer: proposer.toString(),
71
93
  });
72
- return PeerErrorSeverity.MidToleranceError;
94
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
73
95
  }
74
96
 
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 PeerErrorSeverity.LowToleranceError;
97
+ if (
98
+ this.maxBlocksPerCheckpoint !== undefined &&
99
+ 'indexWithinCheckpoint' in proposal &&
100
+ proposal.indexWithinCheckpoint >= this.maxBlocksPerCheckpoint
101
+ ) {
102
+ this.logger.warn(
103
+ `Penalizing peer for proposal with indexWithinCheckpoint ${proposal.indexWithinCheckpoint} >= max ${this.maxBlocksPerCheckpoint}`,
104
+ );
105
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
82
106
  }
83
107
 
84
- return undefined;
108
+ return { result: 'accept' };
85
109
  } catch (e) {
86
110
  if (e instanceof NoCommitteeError) {
87
- return PeerErrorSeverity.LowToleranceError;
111
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
88
112
  }
89
113
  throw e;
90
114
  }
91
115
  }
116
+
117
+ /** Validates transaction-related fields of a block proposal. */
118
+ public async validateTxs(proposal: BlockProposal): Promise<ValidationResult> {
119
+ // Transactions permitted check
120
+ const embeddedTxCount = proposal.txs?.length ?? 0;
121
+ if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
122
+ this.logger.warn(
123
+ `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`,
124
+ );
125
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
126
+ }
127
+
128
+ // Max txs per block check
129
+ if (this.maxTxsPerBlock !== undefined && proposal.txHashes.length > this.maxTxsPerBlock) {
130
+ this.logger.warn(
131
+ `Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when max is ${this.maxTxsPerBlock}`,
132
+ );
133
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
134
+ }
135
+
136
+ // Embedded txs must be listed in txHashes
137
+ const hashSet = new Set(proposal.txHashes.map(h => h.toString()));
138
+ const missingTxHashes =
139
+ embeddedTxCount > 0
140
+ ? proposal.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
141
+ : [];
142
+ if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
143
+ this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
144
+ embeddedTxCount,
145
+ txHashesLength: proposal.txHashes.length,
146
+ missingTxHashes,
147
+ });
148
+ return { result: 'reject', severity: PeerErrorSeverity.MidToleranceError };
149
+ }
150
+
151
+ // Validate tx hashes for all txs embedded in the proposal
152
+ if (!(await Promise.all(proposal.txs?.map(tx => tx.validateTxHash()) ?? [])).every(v => v)) {
153
+ this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`);
154
+ return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
155
+ }
156
+
157
+ return { result: 'accept' };
158
+ }
92
159
  }
@@ -0,0 +1,127 @@
1
+ # Transaction Validation
2
+
3
+ This module defines the transaction validators and the factory functions that assemble them for each entry point into the system.
4
+
5
+ ## Validation Strategy
6
+
7
+ Transactions enter the system through different paths. **Unsolicited** transactions (gossip and RPC) are fully validated before acceptance. **Solicited** transactions (req/resp and block proposals) are only checked for well-formedness because we must store them for block re-execution — they may ultimately be invalid, which is caught during block building and reported as part of block validation/attestation.
8
+
9
+ When solicited transactions fail to be mined, they may be migrated to the pending pool. At that point, the pool runs the state-dependent checks that were skipped on initial receipt.
10
+
11
+ ## Entry Points
12
+
13
+ ### 1. Gossip (libp2p pubsub)
14
+
15
+ **Factory**: `createFirstStageTxValidationsForGossipedTransactions` + `createSecondStageTxValidationsForGossipedTransactions`
16
+ **Called from**: `LibP2PService.handleGossipedTx()` in `libp2p_service.ts`
17
+
18
+ Unsolicited transactions from any peer. Fully validated in two stages with a pool pre-check in between to avoid wasting CPU on proof verification for transactions the pool would reject:
19
+
20
+ | Step | What runs | On failure |
21
+ |------|-----------|------------|
22
+ | **Stage 1** (fast) | TxPermitted, Data, Metadata, Timestamp, DoubleSpend, Gas, Phases, BlockHeader | Penalize peer, reject tx |
23
+ | **Pool pre-check** | `canAddPendingTx` — checks for duplicates, pool capacity | Ignore tx (no penalty) |
24
+ | **Stage 2** (slow) | Proof verification | Penalize peer, reject tx |
25
+ | **Pool add** | `addPendingTxs` | Accept, ignore, or reject |
26
+
27
+ Each stage-1 and stage-2 validator is paired with a `PeerErrorSeverity`. If a validator fails, the sending peer is penalized with that severity. The `doubleSpendValidator` has special handling: its severity is determined by how recently the nullifier appeared (recent = high tolerance, old = low tolerance).
28
+
29
+ ### 2. JSON-RPC
30
+
31
+ **Factory**: `createTxValidatorForAcceptingTxsOverRPC`
32
+ **Called from**: `AztecNodeService.isValidTx()` in `aztec-node/server.ts`
33
+
34
+ Unsolicited transactions from a local wallet/PXE. Runs the full set of checks as a single aggregate validator:
35
+
36
+ - TxPermitted, Size, Data, Metadata, Timestamp, DoubleSpend, Phases, BlockHeader
37
+ - Gas (optional — skipped when `skipFeeEnforcement` is set)
38
+ - Proof verification (optional — skipped for simulations when no verifier is provided)
39
+
40
+ ### 3. Req/resp and block proposals
41
+
42
+ **Factories**: `createTxValidatorForReqResponseReceivedTxs`, `createTxValidatorForBlockProposalReceivedTxs`
43
+ **Called from**: `LibP2PService.validateRequestedTx()`, `LibP2PService.validateTxsReceivedInBlockProposal()`, and `BatchRequestTxValidator` in `batch-tx-requester/tx_validator.ts`
44
+
45
+ Solicited transactions — we requested these from peers or received them as part of a block proposal we need to validate. We must accept them for re-execution even if they are invalid against the current state. Only well-formedness is checked:
46
+
47
+ - Metadata, Size, Data, Proof
48
+
49
+ State-dependent checks are deferred to either the block building validator (for txs included in blocks) or the pending pool migration validator (for unmined txs migrating to pending).
50
+
51
+ ### 4. Block building
52
+
53
+ **Factory**: `createTxValidatorForBlockBuilding`
54
+ **Called from**: `CheckpointBuilder.makeBlockBuilderDeps()` in `validator-client/checkpoint_builder.ts`
55
+
56
+ Transactions already in the pool, about to be sequenced into a block. Re-validates against the current state of the block being built. **This is where invalid txs that entered via req/resp or block proposals are caught** — their invalidity is reported as part of block validation/attestation.
57
+
58
+ Runs:
59
+ - Timestamp, DoubleSpend, Phases, Gas, BlockHeader
60
+
61
+ Does **not** run:
62
+ - Proof, Data — already verified on entry (by gossip, RPC, or req/resp validators)
63
+
64
+ ### 5. Pending pool migration
65
+
66
+ **Factory**: `createTxValidatorForTransactionsEnteringPendingTxPool`
67
+ **Called from**: `TxPoolV2Impl` (injected as the `createTxValidator` factory via `TxPoolV2Dependencies`)
68
+
69
+ When transactions that arrived via req/resp or block proposals fail to be mined, they may need to be included in our pending pool. These txs only had well-formedness checks on receipt, so the pool runs the state-dependent checks they missed before accepting them.
70
+
71
+ This validator is invoked on **every** transaction potentially entering the pending pool:
72
+ - `addPendingTxs` — validating each tx before adding
73
+ - `prepareForSlot` — unprotecting txs back to pending after a slot ends
74
+ - `handlePrunedBlocks` — unmining txs from pruned blocks back to pending
75
+ - Startup hydration — revalidating persisted non-mined txs on node restart
76
+
77
+ Runs:
78
+ - DoubleSpend, BlockHeader, GasLimits, MaxFeePerGas, Timestamp, AllowedSetupCalls
79
+
80
+ Operates on `TxMetaData` (pre-built by the pool) rather than full `Tx` objects.
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
+
84
+ ## Individual Validators
85
+
86
+ | Validator | What it checks | Benchmarked verification duration |
87
+ |-----------|---------------|---------------|
88
+ | `TxPermittedValidator` | Whether the system is accepting transactions (controlled by config flag) | 1.56 us |
89
+ | `DataTxValidator` | Transaction data integrity — correct structure, non-empty fields | 4.10–18.18 ms |
90
+ | `SizeTxValidator` | Transaction does not exceed maximum size limits | 2.28 us |
91
+ | `MetadataTxValidator` | Chain ID, rollup version, protocol contracts hash, VK tree root | 4.18 us |
92
+ | `TimestampTxValidator` | Transaction has not expired (expiration timestamp vs next slot) | 1.56 us |
93
+ | `DoubleSpendTxValidator` | Nullifiers do not already exist in the nullifier tree | 106.08 us |
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 |
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 |
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` | — |
99
+ | `BlockHeaderTxValidator` | Transaction's anchor block hash exists in the archive tree | 98.88 us |
100
+ | `TxProofValidator` | Client proof verifies correctly | ~250ms |
101
+
102
+ ## Validator Coverage by Entry Point
103
+
104
+ | Validator | Gossip | RPC | Req/resp | Block building | Pool migration |
105
+ |-----------|--------|-----|----------|----------------|----------------|
106
+ | TxPermitted | Stage 1 | Yes | — | — | — |
107
+ | Data | Stage 1 | Yes | Yes | — | — |
108
+ | Size | — | Yes | Yes | — | — |
109
+ | Metadata | Stage 1 | Yes | Yes | — | — |
110
+ | Timestamp | Stage 1 | Yes | — | Yes | Yes |
111
+ | DoubleSpend | Stage 1 | Yes | — | Yes | Yes |
112
+ | Gas (balance + limits) | Stage 1 | Optional* | — | Yes | — |
113
+ | GasLimits (standalone) | — | — | — | — | Yes |
114
+ | MaxFeePerGas (standalone) | — | — | — | — | Yes |
115
+ | Phases | Stage 1 | Yes | — | Yes | — |
116
+ | AllowedSetupCalls | — | — | — | — | Yes |
117
+ | BlockHeader | Stage 1 | Yes | — | Yes | Yes |
118
+ | Proof | Stage 2 | Optional** | Yes | — | — |
119
+
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.
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,32 +1,23 @@
1
- import type { ProcessedTx, Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
1
+ import type { TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
2
2
 
3
- export class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
4
- #validators: TxValidator<T>[];
3
+ export class AggregateTxValidator<T> implements TxValidator<T> {
4
+ readonly validators: TxValidator<T>[];
5
5
  constructor(...validators: TxValidator<T>[]) {
6
6
  if (validators.length === 0) {
7
7
  throw new Error('At least one validator must be provided');
8
8
  }
9
9
 
10
- this.#validators = validators;
10
+ this.validators = validators;
11
11
  }
12
12
 
13
13
  async validateTx(tx: T): Promise<TxValidationResult> {
14
- const aggregate: { result: string; reason?: string[] } = { result: 'valid', reason: [] };
15
- for (const validator of this.#validators) {
14
+ const reasons: string[] = [];
15
+ for (const validator of this.validators) {
16
16
  const result = await validator.validateTx(tx);
17
17
  if (result.result === 'invalid') {
18
- aggregate.result = 'invalid';
19
- aggregate.reason!.push(...result.reason);
20
- } else if (result.result === 'skipped') {
21
- if (aggregate.result === 'valid') {
22
- aggregate.result = 'skipped';
23
- }
24
- aggregate.reason!.push(...result.reason);
18
+ reasons.push(...result.reason);
25
19
  }
26
20
  }
27
- if (aggregate.result === 'valid') {
28
- delete aggregate.reason;
29
- }
30
- return aggregate as TxValidationResult;
21
+ return reasons.length > 0 ? { result: 'invalid', reason: reasons } : { result: 'valid' };
31
22
  }
32
23
  }
@@ -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 { FeeJuiceArtifact } from '@aztec/protocol-contracts/fee-juice';
3
+ import { AuthRegistryArtifact, STANDARD_AUTH_REGISTRY_ADDRESS } from '@aztec/standard-contracts/auth-registry';
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: STANDARD_AUTH_REGISTRY_ADDRESS }, '_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: STANDARD_AUTH_REGISTRY_ADDRESS }, '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
+ }
@@ -1,5 +1,5 @@
1
- import type { Fr } from '@aztec/foundation/curves/bn254';
2
1
  import type { ArchiveSource } from '@aztec/p2p';
2
+ import type { BlockHash } from '@aztec/stdlib/block';
3
3
  import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
4
4
  import { MerkleTreeId } from '@aztec/stdlib/trees';
5
5
 
@@ -14,7 +14,7 @@ export class ArchiveCache implements ArchiveSource {
14
14
  this.archives = new Map<string, bigint>();
15
15
  }
16
16
 
17
- public async getArchiveIndices(archives: Fr[]): Promise<(bigint | undefined)[]> {
17
+ public async getArchiveIndices(archives: BlockHash[]): Promise<(bigint | undefined)[]> {
18
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) => {
@@ -1,23 +1,36 @@
1
- import type { Fr } from '@aztec/foundation/curves/bn254';
2
- import { createLogger } from '@aztec/foundation/log';
3
- import { type AnyTx, TX_ERROR_BLOCK_HEADER, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
1
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
2
+ import type { BlockHash } from '@aztec/stdlib/block';
3
+ import { TX_ERROR_BLOCK_HEADER, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
4
4
 
5
5
  export interface ArchiveSource {
6
- getArchiveIndices: (archives: Fr[]) => Promise<(bigint | undefined)[]>;
6
+ getArchiveIndices: (archives: BlockHash[]) => Promise<(bigint | undefined)[]>;
7
7
  }
8
8
 
9
- export class BlockHeaderTxValidator<T extends AnyTx> implements TxValidator<T> {
10
- #log = createLogger('p2p:tx_validator:tx_block_header');
9
+ /** Structural interface for block header validation. */
10
+ export interface HasBlockHeaderData {
11
+ txHash: { toString(): string };
12
+ data: {
13
+ constants: {
14
+ anchorBlockHeader: {
15
+ hash(): Promise<BlockHash>;
16
+ };
17
+ };
18
+ };
19
+ }
20
+
21
+ export class BlockHeaderTxValidator<T extends HasBlockHeaderData> implements TxValidator<T> {
22
+ #log: Logger;
11
23
  #archiveSource: ArchiveSource;
12
24
 
13
- constructor(archiveSource: ArchiveSource) {
25
+ constructor(archiveSource: ArchiveSource, bindings?: LoggerBindings) {
14
26
  this.#archiveSource = archiveSource;
27
+ this.#log = createLogger('p2p:tx_validator:tx_block_header', bindings);
15
28
  }
16
29
 
17
30
  async validateTx(tx: T): Promise<TxValidationResult> {
18
31
  const [index] = await this.#archiveSource.getArchiveIndices([await tx.data.constants.anchorBlockHeader.hash()]);
19
32
  if (index === undefined) {
20
- this.#log.verbose(`Rejecting tx ${'txHash' in tx ? tx.txHash : tx.hash} for referencing an unknown block header`);
33
+ this.#log.verbose(`Rejecting tx ${tx.txHash} for referencing an unknown block header`);
21
34
  return { result: 'invalid', reason: [TX_ERROR_BLOCK_HEADER] };
22
35
  }
23
36
  return { result: 'valid' };
@@ -0,0 +1,31 @@
1
+ import type { Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
2
+
3
+ import type { ITxValidationCache } from './tx_validation_cache.js';
4
+
5
+ /** Wraps a {@link TxValidator} to cache its results in a shared {@link ITxValidationCache}. */
6
+ export class CachedTxValidator<T extends Tx> implements TxValidator<T> {
7
+ constructor(
8
+ private readonly inner: TxValidator<T>,
9
+ private readonly validatorSymbol: symbol,
10
+ private readonly cache: ITxValidationCache,
11
+ ) {}
12
+
13
+ public static new<T extends Tx>(
14
+ inner: TxValidator<T> & { identifier: symbol },
15
+ cache?: ITxValidationCache,
16
+ ): TxValidator<T> {
17
+ return CachedTxValidator.newWithIdentifier(inner, inner.identifier, cache);
18
+ }
19
+
20
+ public static newWithIdentifier<T extends Tx>(
21
+ inner: TxValidator<T>,
22
+ identifier: symbol,
23
+ cache?: ITxValidationCache,
24
+ ): TxValidator<T> {
25
+ return cache ? new CachedTxValidator(inner, identifier, cache) : inner;
26
+ }
27
+
28
+ public validateTx(tx: T): Promise<TxValidationResult> {
29
+ return this.cache.getOrValidate(this.validatorSymbol, tx, () => this.inner.validateTx(tx));
30
+ }
31
+ }
@@ -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
+ }