@aztec/p2p 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5d02921e

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 (423) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +9 -9
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +52 -14
  5. package/dest/client/interface.d.ts +47 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +39 -51
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +164 -224
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
  11. package/dest/config.d.ts +52 -16
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +100 -37
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +75 -40
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +57 -57
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  35. package/dest/mem_pools/index.d.ts +2 -2
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts +4 -2
  38. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  39. package/dest/mem_pools/instrumentation.js +16 -14
  40. package/dest/mem_pools/interface.d.ts +3 -3
  41. package/dest/mem_pools/interface.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  46. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  62. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  63. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  68. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  69. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  71. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  72. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  74. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +30 -12
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +78 -15
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +144 -19
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +17 -6
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +364 -189
  92. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
  95. package/dest/msg_validators/clock_tolerance.d.ts +1 -1
  96. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  97. package/dest/msg_validators/clock_tolerance.js +4 -3
  98. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  101. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  104. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  105. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
  107. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  108. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  111. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  113. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  114. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  116. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  117. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  119. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  120. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  121. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  122. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  123. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  125. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  126. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  128. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  129. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/factory.js +247 -60
  131. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  132. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  134. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  135. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  137. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  138. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/index.js +2 -0
  140. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  141. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  143. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  144. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  146. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  147. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  148. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  149. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  150. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  152. package/dest/services/dummy_service.d.ts +12 -6
  153. package/dest/services/dummy_service.d.ts.map +1 -1
  154. package/dest/services/dummy_service.js +12 -5
  155. package/dest/services/encoding.d.ts +7 -3
  156. package/dest/services/encoding.d.ts.map +1 -1
  157. package/dest/services/encoding.js +18 -11
  158. package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
  159. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  160. package/dest/services/gossipsub/topic_score_params.js +32 -10
  161. package/dest/services/libp2p/libp2p_service.d.ts +37 -23
  162. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  163. package/dest/services/libp2p/libp2p_service.js +274 -173
  164. package/dest/services/peer-manager/metrics.d.ts +3 -1
  165. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  166. package/dest/services/peer-manager/metrics.js +6 -0
  167. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  168. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  169. package/dest/services/peer-manager/peer_manager.js +24 -9
  170. package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
  171. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  172. package/dest/services/peer-manager/peer_scoring.js +28 -10
  173. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  174. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  175. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  176. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  177. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  178. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  179. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  180. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  181. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  182. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  183. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  184. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  185. package/dest/services/reqresp/interface.d.ts +10 -1
  186. package/dest/services/reqresp/interface.d.ts.map +1 -1
  187. package/dest/services/reqresp/interface.js +15 -1
  188. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  189. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  190. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  191. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  193. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  194. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  195. package/dest/services/reqresp/protocols/tx.js +20 -0
  196. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  197. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  199. package/dest/services/reqresp/reqresp.d.ts +1 -1
  200. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  201. package/dest/services/reqresp/reqresp.js +30 -14
  202. package/dest/services/service.d.ts +26 -4
  203. package/dest/services/service.d.ts.map +1 -1
  204. package/dest/services/tx_collection/config.d.ts +19 -1
  205. package/dest/services/tx_collection/config.d.ts.map +1 -1
  206. package/dest/services/tx_collection/config.js +46 -0
  207. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -4
  208. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/fast_tx_collection.js +80 -76
  210. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  211. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  212. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  213. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  214. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  215. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  216. package/dest/services/tx_collection/index.d.ts +2 -1
  217. package/dest/services/tx_collection/index.d.ts.map +1 -1
  218. package/dest/services/tx_collection/index.js +1 -0
  219. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  220. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  221. package/dest/services/tx_collection/instrumentation.js +2 -1
  222. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  223. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  224. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  225. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  226. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  227. package/dest/services/tx_collection/request_tracker.js +84 -0
  228. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  229. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  230. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  231. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  232. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  233. package/dest/services/tx_collection/tx_collection.js +75 -3
  234. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  235. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  236. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  237. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  238. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  239. package/dest/services/tx_collection/tx_source.js +26 -7
  240. package/dest/services/tx_file_store/config.d.ts +1 -3
  241. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  242. package/dest/services/tx_file_store/config.js +0 -4
  243. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  244. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  245. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  246. package/dest/services/tx_provider.d.ts +4 -4
  247. package/dest/services/tx_provider.d.ts.map +1 -1
  248. package/dest/services/tx_provider.js +9 -8
  249. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  250. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  251. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  252. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  253. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  254. package/dest/test-helpers/mock-pubsub.js +105 -4
  255. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  256. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  257. package/dest/test-helpers/reqresp-nodes.js +2 -2
  258. package/dest/test-helpers/testbench-utils.d.ts +35 -24
  259. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  260. package/dest/test-helpers/testbench-utils.js +115 -38
  261. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  262. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  263. package/dest/testbench/p2p_client_testbench_worker.js +57 -27
  264. package/dest/testbench/worker_client_manager.d.ts +3 -1
  265. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  266. package/dest/testbench/worker_client_manager.js +6 -3
  267. package/dest/util.d.ts +3 -3
  268. package/dest/util.d.ts.map +1 -1
  269. package/package.json +14 -14
  270. package/src/client/factory.ts +102 -25
  271. package/src/client/interface.ts +52 -34
  272. package/src/client/p2p_client.ts +190 -266
  273. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
  274. package/src/config.ts +149 -43
  275. package/src/errors/p2p-service.error.ts +11 -0
  276. package/src/errors/tx-pool.error.ts +12 -0
  277. package/src/index.ts +1 -1
  278. package/src/mem_pools/attestation_pool/attestation_pool.ts +104 -50
  279. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +61 -57
  280. package/src/mem_pools/attestation_pool/index.ts +3 -3
  281. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  282. package/src/mem_pools/index.ts +1 -1
  283. package/src/mem_pools/instrumentation.ts +17 -13
  284. package/src/mem_pools/interface.ts +2 -2
  285. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  286. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  287. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  288. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
  289. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  290. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  291. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  292. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  293. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  294. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  295. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  296. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  297. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  298. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  299. package/src/mem_pools/tx_pool_v2/interfaces.ts +32 -12
  300. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +209 -27
  301. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  302. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
  303. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +410 -187
  304. package/src/msg_validators/attestation_validator/README.md +49 -0
  305. package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
  306. package/src/msg_validators/clock_tolerance.ts +4 -3
  307. package/src/msg_validators/proposal_validator/README.md +123 -0
  308. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  309. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  310. package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
  311. package/src/msg_validators/tx_validator/README.md +119 -0
  312. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  313. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  314. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  315. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  316. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  317. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  318. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  319. package/src/msg_validators/tx_validator/factory.ts +394 -78
  320. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  321. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  322. package/src/msg_validators/tx_validator/index.ts +2 -0
  323. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  324. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  325. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  326. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  327. package/src/services/dummy_service.ts +18 -7
  328. package/src/services/encoding.ts +18 -10
  329. package/src/services/gossipsub/README.md +29 -14
  330. package/src/services/gossipsub/topic_score_params.ts +49 -13
  331. package/src/services/libp2p/libp2p_service.ts +288 -198
  332. package/src/services/peer-manager/metrics.ts +7 -0
  333. package/src/services/peer-manager/peer_manager.ts +28 -9
  334. package/src/services/peer-manager/peer_scoring.ts +21 -5
  335. package/src/services/reqresp/README.md +229 -0
  336. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  337. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  338. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  339. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  340. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  341. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  342. package/src/services/reqresp/interface.ts +26 -1
  343. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
  344. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  345. package/src/services/reqresp/protocols/tx.ts +22 -0
  346. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  347. package/src/services/reqresp/reqresp.ts +35 -15
  348. package/src/services/service.ts +37 -3
  349. package/src/services/tx_collection/config.ts +68 -0
  350. package/src/services/tx_collection/fast_tx_collection.ts +83 -76
  351. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  352. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  353. package/src/services/tx_collection/index.ts +1 -0
  354. package/src/services/tx_collection/instrumentation.ts +7 -1
  355. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  356. package/src/services/tx_collection/request_tracker.ts +127 -0
  357. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  358. package/src/services/tx_collection/tx_collection.ts +114 -19
  359. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  360. package/src/services/tx_collection/tx_source.ts +28 -8
  361. package/src/services/tx_file_store/config.ts +0 -6
  362. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  363. package/src/services/tx_provider.ts +10 -9
  364. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  365. package/src/test-helpers/mock-pubsub.ts +146 -9
  366. package/src/test-helpers/reqresp-nodes.ts +3 -6
  367. package/src/test-helpers/testbench-utils.ts +137 -43
  368. package/src/testbench/p2p_client_testbench_worker.ts +63 -30
  369. package/src/testbench/worker_client_manager.ts +13 -6
  370. package/src/util.ts +8 -2
  371. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  372. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  373. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  374. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  375. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  376. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  377. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  378. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  379. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  380. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  381. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  382. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  383. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  384. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  385. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  386. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  387. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  388. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  389. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  390. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  391. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  392. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  393. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  394. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  395. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  396. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  397. package/dest/mem_pools/tx_pool/index.js +0 -2
  398. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  399. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  400. package/dest/mem_pools/tx_pool/priority.js +0 -15
  401. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  402. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  403. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  404. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  405. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  406. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  407. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  408. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  409. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  410. package/src/mem_pools/tx_pool/README.md +0 -270
  411. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  412. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  413. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  414. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  415. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  416. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  417. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  418. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  419. package/src/mem_pools/tx_pool/index.ts +0 -2
  420. package/src/mem_pools/tx_pool/priority.ts +0 -20
  421. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  422. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  423. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -5,4 +5,4 @@ export declare class DataTxValidator implements TxValidator<Tx> {
5
5
  constructor(bindings?: LoggerBindings);
6
6
  validateTx(tx: Tx): Promise<TxValidationResult>;
7
7
  }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV92YWxpZGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy90eF92YWxpZGF0b3IvZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFTTCxFQUFFLEVBQ0YsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyxXQUFXLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIscUJBQWEsZUFBZ0IsWUFBVyxXQUFXLENBQUMsRUFBRSxDQUFDOztJQUdyRCxZQUFZLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFFcEM7SUFFSyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FNcEQ7Q0FtR0YifQ==
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV92YWxpZGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy90eF92YWxpZGF0b3IvZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBSXZGLE9BQU8sRUFXTCxFQUFFLEVBQ0YsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyxXQUFXLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIscUJBQWEsZUFBZ0IsWUFBVyxXQUFXLENBQUMsRUFBRSxDQUFDOztJQUdyRCxZQUFZLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFFcEM7SUFFSyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FPcEQ7Q0F1SUYifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/data_validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,EASL,EAAE,EACF,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAGrD,YAAY,QAAQ,CAAC,EAAE,cAAc,EAEpC;IAEK,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAMpD;CAmGF"}
1
+ {"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/data_validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAIvF,OAAO,EAWL,EAAE,EACF,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAGrD,YAAY,QAAQ,CAAC,EAAE,cAAc,EAEpC;IAEK,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAOpD;CAuIF"}
@@ -1,14 +1,16 @@
1
1
  import { MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
2
2
  import { 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
- import { TX_ERROR_CALLDATA_COUNT_MISMATCH, TX_ERROR_CALLDATA_COUNT_TOO_LARGE, TX_ERROR_CONTRACT_CLASS_LOGS, TX_ERROR_CONTRACT_CLASS_LOG_COUNT, TX_ERROR_CONTRACT_CLASS_LOG_LENGTH, TX_ERROR_CONTRACT_CLASS_LOG_SORTING, TX_ERROR_INCORRECT_CALLDATA, TX_ERROR_INCORRECT_HASH, Tx } from '@aztec/stdlib/tx';
6
+ import { TX_ERROR_CALLDATA_COUNT_MISMATCH, TX_ERROR_CALLDATA_COUNT_TOO_LARGE, TX_ERROR_CONTRACT_CLASS_LOGS, TX_ERROR_CONTRACT_CLASS_LOG_COUNT, TX_ERROR_CONTRACT_CLASS_LOG_LENGTH, TX_ERROR_CONTRACT_CLASS_LOG_SORTING, TX_ERROR_INCORRECT_CALLDATA, TX_ERROR_INCORRECT_CONTRACT_CLASS_ID, TX_ERROR_INCORRECT_HASH, TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG, Tx } from '@aztec/stdlib/tx';
5
7
  export class DataTxValidator {
6
8
  #log;
7
9
  constructor(bindings){
8
10
  this.#log = createLogger('p2p:tx_validator:tx_data', bindings);
9
11
  }
10
12
  async validateTx(tx) {
11
- const reason = await this.#hasCorrectHash(tx) ?? await this.#hasCorrectCalldata(tx) ?? await this.#hasCorrectContractClassLogs(tx);
13
+ const reason = await this.#hasCorrectHash(tx) ?? await this.#hasCorrectCalldata(tx) ?? await this.#hasCorrectContractClassLogs(tx) ?? await this.#hasCorrectContractClassIds(tx);
12
14
  return reason ? {
13
15
  result: 'invalid',
14
16
  reason: [
@@ -77,4 +79,35 @@ export class DataTxValidator {
77
79
  }
78
80
  return undefined;
79
81
  }
82
+ async #hasCorrectContractClassIds(tx) {
83
+ const contractClassLogs = tx.getContractClassLogs();
84
+ for (const log of contractClassLogs){
85
+ if (!ContractClassPublishedEvent.isContractClassPublishedEvent(log)) {
86
+ continue;
87
+ }
88
+ let event;
89
+ try {
90
+ event = ContractClassPublishedEvent.fromLog(log);
91
+ } catch (e) {
92
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to parse contract class event: ${e}`);
93
+ return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
94
+ }
95
+ try {
96
+ const { publicBytecodeCommitment } = await event.toContractClassPublicWithBytecodeCommitment();
97
+ const computedClassId = await computeContractClassId({
98
+ artifactHash: event.artifactHash,
99
+ privateFunctionsRoot: event.privateFunctionsRoot,
100
+ publicBytecodeCommitment
101
+ });
102
+ if (!computedClassId.equals(event.contractClassId)) {
103
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: contract class id mismatch. Claimed ${event.contractClassId}, computed ${computedClassId}`);
104
+ return TX_ERROR_INCORRECT_CONTRACT_CLASS_ID;
105
+ }
106
+ } catch (e) {
107
+ this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to compute contract class id: ${e}`);
108
+ return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
109
+ }
110
+ }
111
+ return undefined;
112
+ }
80
113
  }
@@ -1,11 +1,21 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
1
2
  import { type LoggerBindings } from '@aztec/foundation/log';
2
- import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
+ import { type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
3
4
  export interface NullifierSource {
4
5
  nullifiersExist: (nullifiers: Buffer[]) => Promise<boolean[]>;
5
6
  }
6
- export declare class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
7
+ /** Structural interface for double-spend validation. */
8
+ export interface HasNullifierData {
9
+ txHash: {
10
+ toString(): string;
11
+ };
12
+ data: {
13
+ getNonEmptyNullifiers(): Fr[];
14
+ };
15
+ }
16
+ export declare class DoubleSpendTxValidator<T extends HasNullifierData> implements TxValidator<T> {
7
17
  #private;
8
18
  constructor(nullifierSource: NullifierSource, bindings?: LoggerBindings);
9
19
  validateTx(tx: T): Promise<TxValidationResult>;
10
20
  }
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlX3NwZW5kX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9kb3VibGVfc3BlbmRfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RixPQUFPLEVBQ0wsS0FBSyxLQUFLLEVBSVYsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyxXQUFXLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsTUFBTSxXQUFXLGVBQWU7SUFDOUIsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0NBQy9EO0FBRUQscUJBQWEsc0JBQXNCLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBRSxZQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUM7O0lBSTVFLFlBQVksZUFBZSxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsRUFBRSxjQUFjLEVBR3RFO0lBRUssVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBZ0JuRDtDQUNGIn0=
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlX3NwZW5kX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9kb3VibGVfc3BlbmRfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RixPQUFPLEVBR0wsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyxXQUFXLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsTUFBTSxXQUFXLGVBQWU7SUFDOUIsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0NBQy9EO0FBRUQsd0RBQXdEO0FBQ3hELE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsTUFBTSxFQUFFO1FBQUUsUUFBUSxJQUFJLE1BQU0sQ0FBQTtLQUFFLENBQUM7SUFDL0IsSUFBSSxFQUFFO1FBQUUscUJBQXFCLElBQUksRUFBRSxFQUFFLENBQUE7S0FBRSxDQUFDO0NBQ3pDO0FBRUQscUJBQWEsc0JBQXNCLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFFLFlBQVcsV0FBVyxDQUFDLENBQUMsQ0FBQzs7SUFJdkYsWUFBWSxlQUFlLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFHdEU7SUFFSyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FnQm5EO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/double_spend_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC/D;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAI5E,YAAY,eAAe,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,cAAc,EAGtE;IAEK,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgBnD;CACF"}
1
+ {"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/double_spend_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC/D;AAED,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,CAAC;IAC/B,IAAI,EAAE;QAAE,qBAAqB,IAAI,EAAE,EAAE,CAAA;KAAE,CAAC;CACzC;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,gBAAgB,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAIvF,YAAY,eAAe,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,cAAc,EAGtE;IAEK,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgBnD;CACF"}
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
- import { TX_ERROR_DUPLICATE_NULLIFIER_IN_TX, TX_ERROR_EXISTING_NULLIFIER, Tx } from '@aztec/stdlib/tx';
2
+ import { TX_ERROR_DUPLICATE_NULLIFIER_IN_TX, TX_ERROR_EXISTING_NULLIFIER } from '@aztec/stdlib/tx';
3
3
  export class DoubleSpendTxValidator {
4
4
  #log;
5
5
  #nullifierSource;
@@ -8,11 +8,11 @@ export class DoubleSpendTxValidator {
8
8
  this.#log = createLogger('p2p:tx_validator:tx_double_spend', bindings);
9
9
  }
10
10
  async validateTx(tx) {
11
- const nullifiers = tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers;
11
+ const nullifiers = tx.data.getNonEmptyNullifiers();
12
12
  // Ditch this tx if it has repeated nullifiers
13
13
  const uniqueNullifiers = new Set(nullifiers.map((n)=>n.toBigInt()));
14
14
  if (uniqueNullifiers.size !== nullifiers.length) {
15
- this.#log.verbose(`Rejecting tx ${'txHash' in tx ? tx.txHash : tx.hash} for emitting duplicate nullifiers`);
15
+ this.#log.verbose(`Rejecting tx ${tx.txHash} for emitting duplicate nullifiers`);
16
16
  return {
17
17
  result: 'invalid',
18
18
  reason: [
@@ -21,7 +21,7 @@ export class DoubleSpendTxValidator {
21
21
  };
22
22
  }
23
23
  if ((await this.#nullifierSource.nullifiersExist(nullifiers.map((n)=>n.toBuffer()))).some(Boolean)) {
24
- this.#log.verbose(`Rejecting tx ${'txHash' in tx ? tx.txHash : tx.hash} for repeating a nullifier`);
24
+ this.#log.verbose(`Rejecting tx ${tx.txHash} for repeating a nullifier`);
25
25
  return {
26
26
  result: 'invalid',
27
27
  reason: [
@@ -1,21 +1,148 @@
1
+ /**
2
+ * Transaction validator factories for each tx entry point.
3
+ *
4
+ * Unsolicited transactions (gossip and RPC) are fully validated before acceptance.
5
+ * Transactions received via req/resp or block proposals are only checked for
6
+ * well-formedness because we must include them for block re-execution — they may
7
+ * ultimately be invalid, which is caught during block building and reported as
8
+ * part of block validation/attestation. See the README in this directory for the
9
+ * full validation strategy.
10
+ *
11
+ * 1. **Gossip** — full validation in two stages with a pool pre-check in between.
12
+ * Stage 1 (fast): metadata, data, timestamps, double-spend, gas, phases, block header.
13
+ * Pool pre-check: `canAddPendingTx` — skips proof verification if pool would reject.
14
+ * Stage 2 (slow): proof verification.
15
+ * Orchestrated by `handleGossipedTx` in `libp2p_service.ts`.
16
+ *
17
+ * 2. **JSON-RPC** — full validation including all state-dependent checks.
18
+ * Proof verification and fee enforcement are configurable for testing purposes.
19
+ *
20
+ * 3. **Req/resp & block proposals** — well-formedness checks only (metadata, size,
21
+ * data, proof). Stored for re-execution; validity against state is not checked here.
22
+ *
23
+ * 4. **Block building** — re-validates against current state immediately before
24
+ * sequencing. Catches invalid txs that entered via req/resp or block proposals.
25
+ * Proof and data checks are skipped since they were verified on entry.
26
+ *
27
+ * 5. **Pending pool migration** — when unmined txs (e.g. from req/resp or block
28
+ * proposals) are migrated to the pending pool, the pool runs the state-dependent
29
+ * checks they missed: double-spend, block header, gas limits, and timestamps.
30
+ * This runs on every tx potentially entering the pending pool.
31
+ */
1
32
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
33
  import { Fr } from '@aztec/foundation/curves/bn254';
3
34
  import type { LoggerBindings } from '@aztec/foundation/log';
4
35
  import type { ContractDataSource } from '@aztec/stdlib/contract';
5
36
  import type { GasFees } from '@aztec/stdlib/gas';
6
- import type { AllowedElement, ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
37
+ import type { AllowedElement, ClientProtocolCircuitVerifier, MerkleTreeReadOperations, PublicProcessorValidator, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
7
38
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
8
- import type { Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
39
+ import type { GlobalVariables, Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
9
40
  import type { UInt64 } from '@aztec/stdlib/types';
10
- export interface MessageValidator {
41
+ import type { TxMetaData } from '../../mem_pools/tx_pool_v2/tx_metadata.js';
42
+ /**
43
+ * A validator paired with a peer penalty severity.
44
+ * Used for gossip validation where each validator's failure triggers a peer penalization
45
+ * with the associated severity level.
46
+ */
47
+ export interface TransactionValidator {
11
48
  validator: {
12
49
  validateTx(tx: Tx): Promise<TxValidationResult>;
13
50
  };
14
51
  severity: PeerErrorSeverity;
15
52
  }
16
- export declare function createTxMessageValidators(timestamp: UInt64, blockNumber: BlockNumber, worldStateSynchronizer: WorldStateSynchronizer, gasFees: GasFees, l1ChainId: number, rollupVersion: number, protocolContractsHash: Fr, contractDataSource: ContractDataSource, proofVerifier: ClientProtocolCircuitVerifier, txsPermitted: boolean, allowedInSetup?: AllowedElement[], bindings?: LoggerBindings): Record<string, MessageValidator>[];
17
- export declare function createTxReqRespValidator(verifier: ClientProtocolCircuitVerifier, { l1ChainId, rollupVersion }: {
53
+ /**
54
+ * First stage of gossip validation fast checks run before the pool pre-check.
55
+ *
56
+ * If any validator fails, the peer is penalized and the tx is rejected immediately,
57
+ * without consulting the pool or running proof verification.
58
+ *
59
+ * The `doubleSpendValidator` failure is special-cased by the caller (`handleGossipedTx`)
60
+ * to determine severity based on how recently the nullifier appeared.
61
+ */
62
+ export declare function createFirstStageTxValidationsForGossipedTransactions(timestamp: UInt64, blockNumber: BlockNumber, worldStateSynchronizer: WorldStateSynchronizer, gasFees: GasFees, l1ChainId: number, rollupVersion: number, protocolContractsHash: Fr, contractDataSource: ContractDataSource, txsPermitted: boolean, allowedInSetup?: AllowedElement[], bindings?: LoggerBindings, gasLimitOpts?: {
63
+ rollupManaLimit?: number;
64
+ maxBlockL2Gas?: number;
65
+ maxBlockDAGas?: number;
66
+ }): Record<string, TransactionValidator>;
67
+ /**
68
+ * Second stage of gossip validation — expensive proof verification.
69
+ *
70
+ * Only runs after the first stage passes AND `canAddPendingTx` confirms the pool would
71
+ * accept the tx. This avoids wasting CPU on proof verification for txs the pool would reject
72
+ * (e.g., duplicates, insufficient balance, pool full).
73
+ */
74
+ export declare function createSecondStageTxValidationsForGossipedTransactions(proofVerifier: ClientProtocolCircuitVerifier, bindings?: LoggerBindings): Record<string, TransactionValidator>;
75
+ /**
76
+ * Validators for txs received via req/resp or filestores.
77
+ * Checks well-formedness only — we must accept these for re-execution even if they
78
+ * are invalid against current state. State-dependent checks happen when the tx
79
+ * enters the pending pool or during block building.
80
+ */
81
+ export declare function createTxValidatorForReqResponseReceivedTxs(verifier: ClientProtocolCircuitVerifier, { l1ChainId, rollupVersion }: {
18
82
  l1ChainId: number;
19
83
  rollupVersion: number;
20
84
  }, bindings?: LoggerBindings): TxValidator;
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHNUQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssRUFDVixjQUFjLEVBQ2QsNkJBQTZCLEVBQzdCLHNCQUFzQixFQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRELE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWVsRCxNQUFNLFdBQVcsZ0JBQWdCO0lBQy9CLFNBQVMsRUFBRTtRQUNULFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBQ2pELENBQUM7SUFDRixRQUFRLEVBQUUsaUJBQWlCLENBQUM7Q0FDN0I7QUFFRCx3QkFBZ0IseUJBQXlCLENBQ3ZDLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLHNCQUFzQixFQUFFLHNCQUFzQixFQUM5QyxPQUFPLEVBQUUsT0FBTyxFQUNoQixTQUFTLEVBQUUsTUFBTSxFQUNqQixhQUFhLEVBQUUsTUFBTSxFQUNyQixxQkFBcUIsRUFBRSxFQUFFLEVBQ3pCLGtCQUFrQixFQUFFLGtCQUFrQixFQUN0QyxhQUFhLEVBQUUsNkJBQTZCLEVBQzVDLFlBQVksRUFBRSxPQUFPLEVBQ3JCLGNBQWMsR0FBRSxjQUFjLEVBQU8sRUFDckMsUUFBUSxDQUFDLEVBQUUsY0FBYyxHQUN4QixNQUFNLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsQ0F5RXBDO0FBRUQsd0JBQWdCLHdCQUF3QixDQUN0QyxRQUFRLEVBQUUsNkJBQTZCLEVBQ3ZDLEVBQ0UsU0FBUyxFQUNULGFBQWEsRUFDZCxFQUFFO0lBQ0QsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixhQUFhLEVBQUUsTUFBTSxDQUFDO0NBQ3ZCLEVBQ0QsUUFBUSxDQUFDLEVBQUUsY0FBYyxHQUN4QixXQUFXLENBZWIifQ==
85
+ /**
86
+ * Validators for txs received in block proposals.
87
+ * Same as req/resp — well-formedness only. We must store these for block
88
+ * re-execution; their validity against state is checked during block building.
89
+ */
90
+ export declare function createTxValidatorForBlockProposalReceivedTxs(verifier: ClientProtocolCircuitVerifier, { l1ChainId, rollupVersion }: {
91
+ l1ChainId: number;
92
+ rollupVersion: number;
93
+ }, bindings?: LoggerBindings): TxValidator;
94
+ /**
95
+ * Validators for unsolicited txs received over JSON-RPC (from a local wallet/PXE).
96
+ * Full validation — all state-dependent checks are run. Proof verification is optional
97
+ * (can be skipped for testing purposes). Fee enforcement is also optional (skipped for testing/dev).
98
+ * Called from `AztecNodeService.isValidTx()`.
99
+ */
100
+ export declare function createTxValidatorForAcceptingTxsOverRPC(db: MerkleTreeReadOperations, contractDataSource: ContractDataSource, verifier: ClientProtocolCircuitVerifier | undefined, { l1ChainId, rollupVersion, setupAllowList, gasFees, skipFeeEnforcement, timestamp, blockNumber, txsPermitted, rollupManaLimit, maxBlockL2Gas, maxBlockDAGas }: {
101
+ l1ChainId: number;
102
+ rollupVersion: number;
103
+ setupAllowList: AllowedElement[];
104
+ gasFees: GasFees;
105
+ skipFeeEnforcement?: boolean;
106
+ timestamp: UInt64;
107
+ blockNumber: BlockNumber;
108
+ txsPermitted: boolean;
109
+ rollupManaLimit: number;
110
+ maxBlockL2Gas?: number;
111
+ maxBlockDAGas?: number;
112
+ }, bindings?: LoggerBindings): TxValidator<Tx>;
113
+ /**
114
+ * Validators for txs about to be included in a block by the sequencer.
115
+ * Re-validates against current state. This is where invalid txs that entered via
116
+ * req/resp or block proposals are caught — their invalidity is reported as part
117
+ * of block validation/attestation. Proof and data checks are omitted since they
118
+ * were already verified on entry.
119
+ * Called from `CheckpointBuilder.makeBlockBuilderDeps()`.
120
+ */
121
+ export declare function createTxValidatorForBlockBuilding(db: MerkleTreeReadOperations, contractDataSource: ContractDataSource, globalVariables: GlobalVariables, setupAllowList: AllowedElement[], bindings?: LoggerBindings): PublicProcessorValidator;
122
+ /**
123
+ * Validators for txs migrating to the pending pool.
124
+ *
125
+ * Txs that arrived via req/resp or block proposals only had well-formedness checks
126
+ * on receipt. When they fail to be mined and are migrated to the pending pool, we
127
+ * run the state-dependent checks they missed: double-spend, block header, gas limits,
128
+ * and timestamp expiry. This is run on EVERY tx potentially entering the pending pool
129
+ * — called inside `TxPoolV2Impl` during `addPendingTxs`, `prepareForSlot` (unprotect),
130
+ * `handlePrunedBlocks` (unmine), and startup hydration.
131
+ *
132
+ * Operates on `TxMetaData` rather than full `Tx` since metadata is pre-built by the pool.
133
+ * Injected into `TxPoolV2` as the `createTxValidator` factory in `TxPoolV2Dependencies`.
134
+ */
135
+ export declare function createTxValidatorForTransactionsEnteringPendingTxPool(worldStateSynchronizer: WorldStateSynchronizer, timestamp: bigint, blockNumber: BlockNumber, gasLimitOpts: {
136
+ rollupManaLimit?: number;
137
+ maxBlockL2Gas?: number;
138
+ maxBlockDAGas?: number;
139
+ }, bindings?: LoggerBindings): Promise<TxValidator<TxMetaData>>;
140
+ /**
141
+ * Creates a function that checks whether a tx's setup-phase calls are on the allow list.
142
+ *
143
+ * Uses the `PhasesTxValidator` on the full Tx. The result is stored as a boolean
144
+ * flag in `TxMetaData.allowedSetupCalls` at receipt time, so the pending pool
145
+ * migration validator can check it without needing the full Tx or its dependencies.
146
+ */
147
+ export declare function createCheckAllowedSetupCalls(contractDataSource: ContractDataSource, setupAllowList: AllowedElement[], getTimestamp: () => UInt64): (tx: Tx) => Promise<boolean>;
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTVELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQ1YsY0FBYyxFQUNkLDZCQUE2QixFQUM3Qix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0YsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFnQjVFOzs7O0dBSUc7QUFDSCxNQUFNLFdBQVcsb0JBQW9CO0lBQ25DLFNBQVMsRUFBRTtRQUNULFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBQ2pELENBQUM7SUFDRixRQUFRLEVBQUUsaUJBQWlCLENBQUM7Q0FDN0I7QUFFRDs7Ozs7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
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EACV,cAAc,EACd,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAelD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE;QACT,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;KACjD,CAAC;IACF,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,sBAAsB,EAAE,sBAAsB,EAC9C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,qBAAqB,EAAE,EAAE,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,6BAA6B,EAC5C,YAAY,EAAE,OAAO,EACrB,cAAc,GAAE,cAAc,EAAO,EACrC,QAAQ,CAAC,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAyEpC;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,6BAA6B,EACvC,EACE,SAAS,EACT,aAAa,EACd,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB,EACD,QAAQ,CAAC,EAAE,cAAc,GACxB,WAAW,CAeb"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/factory.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,34 @@
1
- import { Fr } from '@aztec/foundation/curves/bn254';
1
+ /**
2
+ * Transaction validator factories for each tx entry point.
3
+ *
4
+ * Unsolicited transactions (gossip and RPC) are fully validated before acceptance.
5
+ * Transactions received via req/resp or block proposals are only checked for
6
+ * well-formedness because we must include them for block re-execution — they may
7
+ * ultimately be invalid, which is caught during block building and reported as
8
+ * part of block validation/attestation. See the README in this directory for the
9
+ * full validation strategy.
10
+ *
11
+ * 1. **Gossip** — full validation in two stages with a pool pre-check in between.
12
+ * Stage 1 (fast): metadata, data, timestamps, double-spend, gas, phases, block header.
13
+ * Pool pre-check: `canAddPendingTx` — skips proof verification if pool would reject.
14
+ * Stage 2 (slow): proof verification.
15
+ * Orchestrated by `handleGossipedTx` in `libp2p_service.ts`.
16
+ *
17
+ * 2. **JSON-RPC** — full validation including all state-dependent checks.
18
+ * Proof verification and fee enforcement are configurable for testing purposes.
19
+ *
20
+ * 3. **Req/resp & block proposals** — well-formedness checks only (metadata, size,
21
+ * data, proof). Stored for re-execution; validity against state is not checked here.
22
+ *
23
+ * 4. **Block building** — re-validates against current state immediately before
24
+ * sequencing. Catches invalid txs that entered via req/resp or block proposals.
25
+ * Proof and data checks are skipped since they were verified on entry.
26
+ *
27
+ * 5. **Pending pool migration** — when unmined txs (e.g. from req/resp or block
28
+ * proposals) are migrated to the pending pool, the pool runs the state-dependent
29
+ * checks they missed: double-spend, block header, gas limits, and timestamps.
30
+ * This runs on every tx potentially entering the pending pool.
31
+ */ import { Fr } from '@aztec/foundation/curves/bn254';
2
32
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
3
33
  import { ProtocolContractAddress, protocolContractsHash } from '@aztec/protocol-contracts';
4
34
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
@@ -6,79 +36,236 @@ import { DatabasePublicStateSource, MerkleTreeId } from '@aztec/stdlib/trees';
6
36
  import { AggregateTxValidator } from './aggregate_tx_validator.js';
7
37
  import { ArchiveCache } from './archive_cache.js';
8
38
  import { BlockHeaderTxValidator } from './block_header_validator.js';
39
+ import { ContractInstanceTxValidator } from './contract_instance_validator.js';
9
40
  import { DataTxValidator } from './data_validator.js';
10
41
  import { DoubleSpendTxValidator } from './double_spend_validator.js';
11
- import { GasTxValidator } from './gas_validator.js';
42
+ import { GasLimitsValidator, GasTxValidator } from './gas_validator.js';
12
43
  import { MetadataTxValidator } from './metadata_validator.js';
13
- import { PhasesTxValidator } from './phases_validator.js';
44
+ import { NullifierCache } from './nullifier_cache.js';
45
+ import { AllowedSetupCallsMetaValidator, PhasesTxValidator } from './phases_validator.js';
14
46
  import { SizeTxValidator } from './size_validator.js';
15
47
  import { TimestampTxValidator } from './timestamp_validator.js';
16
48
  import { TxPermittedValidator } from './tx_permitted_validator.js';
17
49
  import { TxProofValidator } from './tx_proof_validator.js';
18
- export function createTxMessageValidators(timestamp, blockNumber, worldStateSynchronizer, gasFees, l1ChainId, rollupVersion, protocolContractsHash, contractDataSource, proofVerifier, txsPermitted, allowedInSetup = [], bindings) {
50
+ /**
51
+ * First stage of gossip validation — fast checks run before the pool pre-check.
52
+ *
53
+ * If any validator fails, the peer is penalized and the tx is rejected immediately,
54
+ * without consulting the pool or running proof verification.
55
+ *
56
+ * The `doubleSpendValidator` failure is special-cased by the caller (`handleGossipedTx`)
57
+ * to determine severity based on how recently the nullifier appeared.
58
+ */ export function createFirstStageTxValidationsForGossipedTransactions(timestamp, blockNumber, worldStateSynchronizer, gasFees, l1ChainId, rollupVersion, protocolContractsHash, contractDataSource, txsPermitted, allowedInSetup = [], bindings, gasLimitOpts) {
19
59
  const merkleTree = worldStateSynchronizer.getCommitted();
20
- return [
21
- {
22
- txsPermittedValidator: {
23
- validator: new TxPermittedValidator(txsPermitted, bindings),
24
- severity: PeerErrorSeverity.MidToleranceError
25
- },
26
- dataValidator: {
27
- validator: new DataTxValidator(bindings),
28
- severity: PeerErrorSeverity.HighToleranceError
29
- },
30
- metadataValidator: {
31
- validator: new MetadataTxValidator({
32
- l1ChainId: new Fr(l1ChainId),
33
- rollupVersion: new Fr(rollupVersion),
34
- protocolContractsHash,
35
- vkTreeRoot: getVKTreeRoot()
36
- }, bindings),
37
- severity: PeerErrorSeverity.HighToleranceError
38
- },
39
- timestampValidator: {
40
- validator: new TimestampTxValidator({
41
- timestamp,
42
- blockNumber
43
- }, bindings),
44
- severity: PeerErrorSeverity.MidToleranceError
45
- },
46
- doubleSpendValidator: {
47
- validator: new DoubleSpendTxValidator({
48
- nullifiersExist: async (nullifiers)=>{
49
- const merkleTree = worldStateSynchronizer.getCommitted();
50
- const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
51
- return indices.map((index)=>index !== undefined);
52
- }
53
- }, bindings),
54
- severity: PeerErrorSeverity.HighToleranceError
55
- },
56
- gasValidator: {
57
- validator: new GasTxValidator(new DatabasePublicStateSource(merkleTree), ProtocolContractAddress.FeeJuice, gasFees, bindings),
58
- severity: PeerErrorSeverity.HighToleranceError
59
- },
60
- phasesValidator: {
61
- validator: new PhasesTxValidator(contractDataSource, allowedInSetup, timestamp, bindings),
62
- severity: PeerErrorSeverity.MidToleranceError
63
- },
64
- blockHeaderValidator: {
65
- validator: new BlockHeaderTxValidator(new ArchiveCache(merkleTree), bindings),
66
- severity: PeerErrorSeverity.HighToleranceError
67
- }
60
+ return {
61
+ timestampValidator: {
62
+ validator: new TimestampTxValidator({
63
+ timestamp,
64
+ blockNumber
65
+ }, bindings),
66
+ severity: PeerErrorSeverity.HighToleranceError
68
67
  },
69
- {
70
- proofValidator: {
71
- validator: new TxProofValidator(proofVerifier, bindings),
72
- severity: PeerErrorSeverity.MidToleranceError
73
- }
68
+ txsPermittedValidator: {
69
+ validator: new TxPermittedValidator(txsPermitted, bindings),
70
+ severity: PeerErrorSeverity.MidToleranceError
71
+ },
72
+ txSizeValidator: {
73
+ validator: new SizeTxValidator(bindings),
74
+ severity: PeerErrorSeverity.MidToleranceError
75
+ },
76
+ metadataValidator: {
77
+ validator: new MetadataTxValidator({
78
+ l1ChainId: new Fr(l1ChainId),
79
+ rollupVersion: new Fr(rollupVersion),
80
+ protocolContractsHash,
81
+ vkTreeRoot: getVKTreeRoot()
82
+ }, bindings),
83
+ severity: PeerErrorSeverity.MidToleranceError
84
+ },
85
+ phasesValidator: {
86
+ validator: new PhasesTxValidator(contractDataSource, allowedInSetup, timestamp, bindings),
87
+ severity: PeerErrorSeverity.MidToleranceError
88
+ },
89
+ blockHeaderValidator: {
90
+ validator: new BlockHeaderTxValidator(new ArchiveCache(merkleTree), bindings),
91
+ severity: PeerErrorSeverity.HighToleranceError
92
+ },
93
+ doubleSpendValidator: {
94
+ validator: new DoubleSpendTxValidator({
95
+ nullifiersExist: async (nullifiers)=>{
96
+ const merkleTree = worldStateSynchronizer.getCommitted();
97
+ const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
98
+ return indices.map((index)=>index !== undefined);
99
+ }
100
+ }, bindings),
101
+ severity: PeerErrorSeverity.MidToleranceError
102
+ },
103
+ gasValidator: {
104
+ validator: new GasTxValidator(new DatabasePublicStateSource(merkleTree), ProtocolContractAddress.FeeJuice, gasFees, bindings, gasLimitOpts),
105
+ severity: PeerErrorSeverity.MidToleranceError
106
+ },
107
+ dataValidator: {
108
+ validator: new DataTxValidator(bindings),
109
+ severity: PeerErrorSeverity.MidToleranceError
110
+ },
111
+ contractInstanceValidator: {
112
+ validator: new ContractInstanceTxValidator(bindings),
113
+ severity: PeerErrorSeverity.MidToleranceError
74
114
  }
75
- ];
115
+ };
116
+ }
117
+ /**
118
+ * Second stage of gossip validation — expensive proof verification.
119
+ *
120
+ * Only runs after the first stage passes AND `canAddPendingTx` confirms the pool would
121
+ * accept the tx. This avoids wasting CPU on proof verification for txs the pool would reject
122
+ * (e.g., duplicates, insufficient balance, pool full).
123
+ */ export function createSecondStageTxValidationsForGossipedTransactions(proofVerifier, bindings) {
124
+ return {
125
+ proofValidator: {
126
+ validator: new TxProofValidator(proofVerifier, bindings),
127
+ severity: PeerErrorSeverity.LowToleranceError
128
+ }
129
+ };
76
130
  }
77
- export function createTxReqRespValidator(verifier, { l1ChainId, rollupVersion }, bindings) {
131
+ /**
132
+ * Well-formedness checks only: metadata, size, data, and proof.
133
+ * Used for req/resp and block proposal txs. These txs must be accepted for block
134
+ * re-execution even though they may be invalid against current state — that is
135
+ * caught later by the block building validator.
136
+ */ function createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings) {
78
137
  return new AggregateTxValidator(new MetadataTxValidator({
79
138
  l1ChainId: new Fr(l1ChainId),
80
139
  rollupVersion: new Fr(rollupVersion),
81
140
  protocolContractsHash,
82
141
  vkTreeRoot: getVKTreeRoot()
83
- }, bindings), new SizeTxValidator(bindings), new DataTxValidator(bindings), new TxProofValidator(verifier, bindings));
142
+ }, bindings), new SizeTxValidator(bindings), new DataTxValidator(bindings), new ContractInstanceTxValidator(bindings), new TxProofValidator(verifier, bindings));
143
+ }
144
+ /**
145
+ * Validators for txs received via req/resp or filestores.
146
+ * Checks well-formedness only — we must accept these for re-execution even if they
147
+ * are invalid against current state. State-dependent checks happen when the tx
148
+ * enters the pending pool or during block building.
149
+ */ export function createTxValidatorForReqResponseReceivedTxs(verifier, { l1ChainId, rollupVersion }, bindings) {
150
+ return createTxValidatorForMinimumTxIntegrityChecks(verifier, {
151
+ l1ChainId,
152
+ rollupVersion
153
+ }, bindings);
154
+ }
155
+ /**
156
+ * Validators for txs received in block proposals.
157
+ * Same as req/resp — well-formedness only. We must store these for block
158
+ * re-execution; their validity against state is checked during block building.
159
+ */ export function createTxValidatorForBlockProposalReceivedTxs(verifier, { l1ChainId, rollupVersion }, bindings) {
160
+ return createTxValidatorForMinimumTxIntegrityChecks(verifier, {
161
+ l1ChainId,
162
+ rollupVersion
163
+ }, bindings);
164
+ }
165
+ /**
166
+ * Validators for unsolicited txs received over JSON-RPC (from a local wallet/PXE).
167
+ * Full validation — all state-dependent checks are run. Proof verification is optional
168
+ * (can be skipped for testing purposes). Fee enforcement is also optional (skipped for testing/dev).
169
+ * Called from `AztecNodeService.isValidTx()`.
170
+ */ export function createTxValidatorForAcceptingTxsOverRPC(db, contractDataSource, verifier, { l1ChainId, rollupVersion, setupAllowList, gasFees, skipFeeEnforcement, timestamp, blockNumber, txsPermitted, rollupManaLimit, maxBlockL2Gas, maxBlockDAGas }, bindings) {
171
+ const validators = [
172
+ new TxPermittedValidator(txsPermitted, bindings),
173
+ new TimestampTxValidator({
174
+ timestamp,
175
+ blockNumber
176
+ }, bindings),
177
+ new SizeTxValidator(bindings),
178
+ new MetadataTxValidator({
179
+ l1ChainId: new Fr(l1ChainId),
180
+ rollupVersion: new Fr(rollupVersion),
181
+ protocolContractsHash,
182
+ vkTreeRoot: getVKTreeRoot()
183
+ }, bindings),
184
+ new PhasesTxValidator(contractDataSource, setupAllowList, timestamp, bindings),
185
+ new BlockHeaderTxValidator(new ArchiveCache(db), bindings),
186
+ new DoubleSpendTxValidator(new NullifierCache(db), bindings),
187
+ new DataTxValidator(bindings),
188
+ new ContractInstanceTxValidator(bindings)
189
+ ];
190
+ if (!skipFeeEnforcement) {
191
+ validators.push(new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings, {
192
+ rollupManaLimit,
193
+ maxBlockL2Gas,
194
+ maxBlockDAGas
195
+ }));
196
+ }
197
+ if (verifier) {
198
+ validators.push(new TxProofValidator(verifier, bindings));
199
+ }
200
+ return new AggregateTxValidator(...validators);
201
+ }
202
+ /**
203
+ * Validators for txs about to be included in a block by the sequencer.
204
+ * Re-validates against current state. This is where invalid txs that entered via
205
+ * req/resp or block proposals are caught — their invalidity is reported as part
206
+ * of block validation/attestation. Proof and data checks are omitted since they
207
+ * were already verified on entry.
208
+ * Called from `CheckpointBuilder.makeBlockBuilderDeps()`.
209
+ */ export function createTxValidatorForBlockBuilding(db, contractDataSource, globalVariables, setupAllowList, bindings) {
210
+ const nullifierCache = new NullifierCache(db);
211
+ const archiveCache = new ArchiveCache(db);
212
+ const publicStateSource = new DatabasePublicStateSource(db);
213
+ return {
214
+ preprocessValidator: createTxValidatorForValidatingAgainstCurrentState(nullifierCache, archiveCache, publicStateSource, contractDataSource, globalVariables, setupAllowList, bindings),
215
+ nullifierCache
216
+ };
217
+ }
218
+ function createTxValidatorForValidatingAgainstCurrentState(nullifierSource, archiveSource, publicStateSource, contractDataSource, globalVariables, setupAllowList, bindings) {
219
+ // We don't include the TxProofValidator nor the DataTxValidator here because they are already checked by the time we get to block building.
220
+ return new AggregateTxValidator(new TimestampTxValidator({
221
+ timestamp: globalVariables.timestamp,
222
+ blockNumber: globalVariables.blockNumber
223
+ }, bindings), new PhasesTxValidator(contractDataSource, setupAllowList, globalVariables.timestamp, bindings), new BlockHeaderTxValidator(archiveSource, bindings), new DoubleSpendTxValidator(nullifierSource, bindings), new GasTxValidator(publicStateSource, ProtocolContractAddress.FeeJuice, globalVariables.gasFees, bindings));
224
+ }
225
+ /**
226
+ * Validators for txs migrating to the pending pool.
227
+ *
228
+ * Txs that arrived via req/resp or block proposals only had well-formedness checks
229
+ * on receipt. When they fail to be mined and are migrated to the pending pool, we
230
+ * run the state-dependent checks they missed: double-spend, block header, gas limits,
231
+ * and timestamp expiry. This is run on EVERY tx potentially entering the pending pool
232
+ * — called inside `TxPoolV2Impl` during `addPendingTxs`, `prepareForSlot` (unprotect),
233
+ * `handlePrunedBlocks` (unmine), and startup hydration.
234
+ *
235
+ * Operates on `TxMetaData` rather than full `Tx` since metadata is pre-built by the pool.
236
+ * Injected into `TxPoolV2` as the `createTxValidator` factory in `TxPoolV2Dependencies`.
237
+ */ export async function createTxValidatorForTransactionsEnteringPendingTxPool(worldStateSynchronizer, timestamp, blockNumber, gasLimitOpts, bindings) {
238
+ await worldStateSynchronizer.syncImmediate();
239
+ const merkleTree = worldStateSynchronizer.getCommitted();
240
+ const nullifierSource = {
241
+ nullifiersExist: async (nullifiers)=>{
242
+ const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
243
+ return indices.map((index)=>index !== undefined);
244
+ }
245
+ };
246
+ const archiveSource = {
247
+ getArchiveIndices: (archives)=>{
248
+ return merkleTree.findLeafIndices(MerkleTreeId.ARCHIVE, archives);
249
+ }
250
+ };
251
+ return new AggregateTxValidator(new GasLimitsValidator({
252
+ ...gasLimitOpts,
253
+ bindings
254
+ }), new TimestampTxValidator({
255
+ timestamp,
256
+ blockNumber
257
+ }, bindings), new DoubleSpendTxValidator(nullifierSource, bindings), new BlockHeaderTxValidator(archiveSource, bindings), new AllowedSetupCallsMetaValidator(bindings));
258
+ }
259
+ /**
260
+ * Creates a function that checks whether a tx's setup-phase calls are on the allow list.
261
+ *
262
+ * Uses the `PhasesTxValidator` on the full Tx. The result is stored as a boolean
263
+ * flag in `TxMetaData.allowedSetupCalls` at receipt time, so the pending pool
264
+ * migration validator can check it without needing the full Tx or its dependencies.
265
+ */ export function createCheckAllowedSetupCalls(contractDataSource, setupAllowList, getTimestamp) {
266
+ return async (tx)=>{
267
+ const validator = new PhasesTxValidator(contractDataSource, setupAllowList, getTimestamp());
268
+ const result = await validator.validateTx(tx);
269
+ return result.result === 'valid';
270
+ };
84
271
  }