@aztec/p2p 0.0.1-commit.d431d1c → 0.0.1-commit.dbf9cec

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 (476) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +10 -10
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +45 -18
  7. package/dest/client/interface.d.ts +46 -33
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +41 -51
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +156 -200
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +304 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +35 -7
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +21 -7
  21. package/dest/errors/tx-pool.error.d.ts +8 -0
  22. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  23. package/dest/errors/tx-pool.error.js +9 -0
  24. package/dest/index.d.ts +2 -1
  25. package/dest/index.d.ts.map +1 -1
  26. package/dest/index.js +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  33. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  34. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/index.js +1 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  39. package/dest/mem_pools/index.d.ts +3 -2
  40. package/dest/mem_pools/index.d.ts.map +1 -1
  41. package/dest/mem_pools/index.js +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +2 -2
  45. package/dest/mem_pools/interface.d.ts +5 -5
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +3 -3
  48. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +3 -2
  50. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +3 -2
  52. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +3 -3
  54. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +8 -1
  56. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  57. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +3 -3
  58. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  60. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  61. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  63. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  64. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  66. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  67. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  99. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  100. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  102. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  103. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  105. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
  106. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +119 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +193 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  114. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  115. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  116. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +354 -0
  117. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +905 -0
  123. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
  124. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/attestation_validator/attestation_validator.js +40 -9
  126. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  127. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -6
  129. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  130. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  131. package/dest/msg_validators/clock_tolerance.js +37 -0
  132. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -3
  133. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -15
  135. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
  136. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
  137. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +66 -11
  138. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  139. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  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/archive_cache.js +1 -1
  144. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  145. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  147. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  148. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  150. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  151. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  152. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  153. package/dest/msg_validators/tx_validator/factory.d.ts +118 -5
  154. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  155. package/dest/msg_validators/tx_validator/factory.js +228 -57
  156. package/dest/msg_validators/tx_validator/gas_validator.d.ts +59 -3
  157. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/gas_validator.js +76 -38
  159. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  160. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  161. package/dest/msg_validators/tx_validator/index.js +1 -0
  162. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  163. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  165. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  166. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  167. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  168. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  169. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  170. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  171. package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
  172. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
  173. package/dest/msg_validators/tx_validator/size_validator.js +4 -1
  174. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  175. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  176. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  177. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  178. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  179. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  180. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  181. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  182. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  183. package/dest/services/data_store.d.ts +1 -1
  184. package/dest/services/data_store.d.ts.map +1 -1
  185. package/dest/services/data_store.js +10 -6
  186. package/dest/services/discv5/discV5_service.js +1 -1
  187. package/dest/services/dummy_service.d.ts +24 -4
  188. package/dest/services/dummy_service.d.ts.map +1 -1
  189. package/dest/services/dummy_service.js +46 -1
  190. package/dest/services/encoding.d.ts +3 -3
  191. package/dest/services/encoding.d.ts.map +1 -1
  192. package/dest/services/encoding.js +11 -10
  193. package/dest/services/gossipsub/index.d.ts +3 -0
  194. package/dest/services/gossipsub/index.d.ts.map +1 -0
  195. package/dest/services/gossipsub/index.js +2 -0
  196. package/dest/services/gossipsub/scoring.d.ts +21 -3
  197. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  198. package/dest/services/gossipsub/scoring.js +24 -7
  199. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  200. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  201. package/dest/services/gossipsub/topic_score_params.js +346 -0
  202. package/dest/services/index.d.ts +2 -1
  203. package/dest/services/index.d.ts.map +1 -1
  204. package/dest/services/index.js +1 -0
  205. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  206. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  207. package/dest/services/libp2p/instrumentation.js +14 -3
  208. package/dest/services/libp2p/libp2p_service.d.ts +101 -43
  209. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  210. package/dest/services/libp2p/libp2p_service.js +455 -363
  211. package/dest/services/peer-manager/metrics.d.ts +2 -2
  212. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  213. package/dest/services/peer-manager/metrics.js +20 -5
  214. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  215. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  216. package/dest/services/peer-manager/peer_scoring.js +33 -4
  217. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
  218. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  219. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +539 -0
  220. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  221. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  222. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  223. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
  224. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  225. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  226. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
  227. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  228. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
  229. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +60 -0
  230. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  231. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +173 -0
  232. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  233. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  234. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  235. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  236. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  237. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  238. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  239. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  240. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  241. package/dest/services/reqresp/interface.d.ts +14 -3
  242. package/dest/services/reqresp/interface.d.ts.map +1 -1
  243. package/dest/services/reqresp/interface.js +17 -3
  244. package/dest/services/reqresp/metrics.d.ts +6 -5
  245. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  246. package/dest/services/reqresp/metrics.js +17 -5
  247. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  248. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  249. package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
  250. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  251. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  252. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  253. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  254. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  255. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  256. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  257. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  258. package/dest/services/reqresp/protocols/tx.js +20 -0
  259. package/dest/services/reqresp/reqresp.d.ts +6 -1
  260. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  261. package/dest/services/reqresp/reqresp.js +71 -27
  262. package/dest/services/service.d.ts +42 -3
  263. package/dest/services/service.d.ts.map +1 -1
  264. package/dest/services/tx_collection/config.d.ts +22 -1
  265. package/dest/services/tx_collection/config.d.ts.map +1 -1
  266. package/dest/services/tx_collection/config.js +55 -1
  267. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  268. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  269. package/dest/services/tx_collection/fast_tx_collection.js +71 -44
  270. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  271. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  272. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  273. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  274. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  275. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  276. package/dest/services/tx_collection/index.d.ts +3 -1
  277. package/dest/services/tx_collection/index.d.ts.map +1 -1
  278. package/dest/services/tx_collection/index.js +2 -0
  279. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  280. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  281. package/dest/services/tx_collection/instrumentation.js +10 -2
  282. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  283. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  284. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  285. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  286. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  287. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  288. package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -5
  289. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  290. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  291. package/dest/services/tx_collection/tx_collection.d.ts +29 -16
  292. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  293. package/dest/services/tx_collection/tx_collection.js +79 -7
  294. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  295. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  296. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  297. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  298. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  299. package/dest/services/tx_collection/tx_source.js +19 -2
  300. package/dest/services/tx_file_store/config.d.ts +16 -0
  301. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  302. package/dest/services/tx_file_store/config.js +22 -0
  303. package/dest/services/tx_file_store/index.d.ts +4 -0
  304. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  305. package/dest/services/tx_file_store/index.js +3 -0
  306. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  307. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  308. package/dest/services/tx_file_store/instrumentation.js +29 -0
  309. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  310. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  311. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  312. package/dest/services/tx_provider.d.ts +6 -6
  313. package/dest/services/tx_provider.d.ts.map +1 -1
  314. package/dest/services/tx_provider.js +9 -8
  315. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  316. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  317. package/dest/services/tx_provider_instrumentation.js +5 -5
  318. package/dest/test-helpers/index.d.ts +3 -1
  319. package/dest/test-helpers/index.d.ts.map +1 -1
  320. package/dest/test-helpers/index.js +2 -0
  321. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  322. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  323. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  324. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  325. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  326. package/dest/test-helpers/mock-pubsub.js +105 -4
  327. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  328. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  329. package/dest/test-helpers/reqresp-nodes.js +4 -3
  330. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  331. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  332. package/dest/test-helpers/test_tx_provider.js +41 -0
  333. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  334. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  335. package/dest/test-helpers/testbench-utils.js +366 -0
  336. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  337. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  338. package/dest/testbench/p2p_client_testbench_worker.js +219 -137
  339. package/dest/testbench/worker_client_manager.d.ts +51 -6
  340. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  341. package/dest/testbench/worker_client_manager.js +226 -44
  342. package/dest/util.d.ts +2 -2
  343. package/dest/util.d.ts.map +1 -1
  344. package/package.json +14 -14
  345. package/src/bootstrap/bootstrap.ts +7 -4
  346. package/src/client/factory.ts +83 -36
  347. package/src/client/interface.ts +56 -34
  348. package/src/client/p2p_client.ts +196 -251
  349. package/src/client/test/tx_proposal_collector/README.md +227 -0
  350. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +345 -0
  351. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  352. package/src/config.ts +47 -11
  353. package/src/errors/tx-pool.error.ts +12 -0
  354. package/src/index.ts +1 -0
  355. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  356. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  357. package/src/mem_pools/attestation_pool/index.ts +9 -2
  358. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  359. package/src/mem_pools/index.ts +4 -1
  360. package/src/mem_pools/instrumentation.ts +2 -1
  361. package/src/mem_pools/interface.ts +4 -4
  362. package/src/mem_pools/tx_pool/README.md +1 -1
  363. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +2 -2
  364. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +2 -1
  365. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +2 -1
  366. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +10 -7
  367. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  368. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  369. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  370. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  371. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  372. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  373. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  374. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  375. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  376. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  377. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  378. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  379. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  380. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  381. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  382. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  383. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  384. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  385. package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
  386. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +297 -0
  387. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  388. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  389. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  390. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1083 -0
  391. package/src/msg_validators/attestation_validator/attestation_validator.ts +25 -13
  392. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +16 -10
  393. package/src/msg_validators/clock_tolerance.ts +51 -0
  394. package/src/msg_validators/proposal_validator/proposal_validator.ts +21 -14
  395. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +53 -14
  396. package/src/msg_validators/tx_validator/README.md +115 -0
  397. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  398. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  399. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  400. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  401. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  402. package/src/msg_validators/tx_validator/factory.ts +372 -55
  403. package/src/msg_validators/tx_validator/gas_validator.ts +98 -29
  404. package/src/msg_validators/tx_validator/index.ts +1 -0
  405. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  406. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  407. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  408. package/src/msg_validators/tx_validator/size_validator.ts +6 -2
  409. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  410. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  411. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  412. package/src/services/data_store.ts +10 -7
  413. package/src/services/discv5/discV5_service.ts +1 -1
  414. package/src/services/dummy_service.ts +59 -2
  415. package/src/services/encoding.ts +9 -9
  416. package/src/services/gossipsub/README.md +641 -0
  417. package/src/services/gossipsub/index.ts +2 -0
  418. package/src/services/gossipsub/scoring.ts +29 -5
  419. package/src/services/gossipsub/topic_score_params.ts +487 -0
  420. package/src/services/index.ts +1 -0
  421. package/src/services/libp2p/instrumentation.ts +15 -2
  422. package/src/services/libp2p/libp2p_service.ts +505 -396
  423. package/src/services/peer-manager/metrics.ts +21 -4
  424. package/src/services/peer-manager/peer_scoring.ts +29 -1
  425. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  426. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +678 -0
  427. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  428. package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
  429. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
  430. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +244 -0
  431. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  432. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  433. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  434. package/src/services/reqresp/interface.ts +31 -3
  435. package/src/services/reqresp/metrics.ts +34 -9
  436. package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
  437. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  438. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  439. package/src/services/reqresp/protocols/tx.ts +22 -0
  440. package/src/services/reqresp/reqresp.ts +82 -23
  441. package/src/services/service.ts +55 -2
  442. package/src/services/tx_collection/config.ts +83 -1
  443. package/src/services/tx_collection/fast_tx_collection.ts +93 -47
  444. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  445. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  446. package/src/services/tx_collection/index.ts +6 -0
  447. package/src/services/tx_collection/instrumentation.ts +17 -2
  448. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  449. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  450. package/src/services/tx_collection/slow_tx_collection.ts +68 -35
  451. package/src/services/tx_collection/tx_collection.ts +121 -24
  452. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  453. package/src/services/tx_collection/tx_source.ts +22 -3
  454. package/src/services/tx_file_store/config.ts +37 -0
  455. package/src/services/tx_file_store/index.ts +3 -0
  456. package/src/services/tx_file_store/instrumentation.ts +36 -0
  457. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  458. package/src/services/tx_provider.ts +12 -11
  459. package/src/services/tx_provider_instrumentation.ts +11 -5
  460. package/src/test-helpers/index.ts +2 -0
  461. package/src/test-helpers/make-test-p2p-clients.ts +3 -5
  462. package/src/test-helpers/mock-pubsub.ts +146 -9
  463. package/src/test-helpers/reqresp-nodes.ts +4 -6
  464. package/src/test-helpers/test_tx_provider.ts +64 -0
  465. package/src/test-helpers/testbench-utils.ts +430 -0
  466. package/src/testbench/p2p_client_testbench_worker.ts +333 -131
  467. package/src/testbench/worker_client_manager.ts +304 -47
  468. package/src/util.ts +7 -1
  469. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  470. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  471. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  472. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  473. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  474. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  475. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  476. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
@@ -1,10 +1,10 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { type Logger } from '@aztec/foundation/log';
3
- import { type CheckpointAttestation, type P2PValidator, PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ import { type CheckpointAttestation, type P2PValidator, type ValidationResult } from '@aztec/stdlib/p2p';
4
4
  export declare class CheckpointAttestationValidator implements P2PValidator<CheckpointAttestation> {
5
5
  protected epochCache: EpochCacheInterface;
6
6
  protected logger: Logger;
7
7
  constructor(epochCache: EpochCacheInterface);
8
- validate(message: CheckpointAttestation): Promise<PeerErrorSeverity | undefined>;
8
+ validate(message: CheckpointAttestation): Promise<ValidationResult>;
9
9
  }
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvYXR0ZXN0YXRpb25fdmFsaWRhdG9yL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsRUFBRSxLQUFLLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJHLHFCQUFhLDhCQUErQixZQUFXLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztJQUN4RixTQUFTLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDO0lBQzFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRXpCLFlBQVksVUFBVSxFQUFFLG1CQUFtQixFQUcxQztJQUVLLFFBQVEsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQXdEckY7Q0FDRiJ9
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvYXR0ZXN0YXRpb25fdmFsaWRhdG9yL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyxZQUFZLEVBRWpCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFJM0IscUJBQWEsOEJBQStCLFlBQVcsWUFBWSxDQUFDLHFCQUFxQixDQUFDO0lBQ3hGLFNBQVMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDMUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFekIsWUFBWSxVQUFVLEVBQUUsbUJBQW1CLEVBRzFDO0lBRUssUUFBUSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0E2RHhFO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAErG,qBAAa,8BAA+B,YAAW,YAAY,CAAC,qBAAqB,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB,YAAY,UAAU,EAAE,mBAAmB,EAG1C;IAEK,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAwDrF;CACF"}
1
+ {"version":3,"file":"attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,8BAA+B,YAAW,YAAY,CAAC,qBAAqB,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB,YAAY,UAAU,EAAE,mBAAmB,EAG1C;IAEK,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6DxE;CACF"}
@@ -1,6 +1,7 @@
1
1
  import { NoCommitteeError } from '@aztec/ethereum/contracts';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
3
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ import { isWithinClockTolerance } from '../clock_tolerance.js';
4
5
  export class CheckpointAttestationValidator {
5
6
  epochCache;
6
7
  logger;
@@ -13,19 +14,35 @@ export class CheckpointAttestationValidator {
13
14
  try {
14
15
  const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
15
16
  if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
16
- this.logger.warn(`Checkpoint attestation slot ${slotNumber} is not current (${currentSlot}) or next (${nextSlot}) slot`);
17
- return PeerErrorSeverity.HighToleranceError;
17
+ // Check if message is for previous slot and within clock tolerance
18
+ if (!isWithinClockTolerance(slotNumber, currentSlot, this.epochCache)) {
19
+ this.logger.warn(`Checkpoint attestation slot ${slotNumber} is not current (${currentSlot}) or next (${nextSlot}) slot`);
20
+ return {
21
+ result: 'reject',
22
+ severity: PeerErrorSeverity.HighToleranceError
23
+ };
24
+ }
25
+ this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
26
+ return {
27
+ result: 'ignore'
28
+ };
18
29
  }
19
30
  // Verify the signature is valid
20
31
  const attester = message.getSender();
21
32
  if (attester === undefined) {
22
33
  this.logger.warn(`Invalid signature in checkpoint attestation for slot ${slotNumber}`);
23
- return PeerErrorSeverity.LowToleranceError;
34
+ return {
35
+ result: 'reject',
36
+ severity: PeerErrorSeverity.LowToleranceError
37
+ };
24
38
  }
25
39
  // Verify the attester is in the committee for this slot
26
40
  if (!await this.epochCache.isInCommittee(slotNumber, attester)) {
27
41
  this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${slotNumber}`);
28
- return PeerErrorSeverity.HighToleranceError;
42
+ return {
43
+ result: 'reject',
44
+ severity: PeerErrorSeverity.HighToleranceError
45
+ };
29
46
  }
30
47
  // Verify the proposer signature matches the expected proposer for the attestation's slot
31
48
  // We look up the proposer for the specific slot rather than using currentSlot/nextSlot
@@ -34,22 +51,36 @@ export class CheckpointAttestationValidator {
34
51
  const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
35
52
  if (!expectedProposer) {
36
53
  this.logger.warn(`No proposer defined for slot ${slotNumber}`);
37
- return PeerErrorSeverity.HighToleranceError;
54
+ return {
55
+ result: 'reject',
56
+ severity: PeerErrorSeverity.HighToleranceError
57
+ };
38
58
  }
39
59
  if (!proposer) {
40
60
  this.logger.warn(`Invalid proposer signature in checkpoint attestation for slot ${slotNumber}`);
41
- return PeerErrorSeverity.LowToleranceError;
61
+ return {
62
+ result: 'reject',
63
+ severity: PeerErrorSeverity.LowToleranceError
64
+ };
42
65
  }
43
66
  if (!proposer.equals(expectedProposer)) {
44
67
  this.logger.warn(`Proposer signature mismatch in checkpoint attestation. ` + `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${slotNumber}`);
45
- return PeerErrorSeverity.HighToleranceError;
68
+ return {
69
+ result: 'reject',
70
+ severity: PeerErrorSeverity.HighToleranceError
71
+ };
46
72
  }
47
- return undefined;
73
+ return {
74
+ result: 'accept'
75
+ };
48
76
  } catch (e) {
49
77
  // People shouldn't be sending us attestations if the committee doesn't exist
50
78
  if (e instanceof NoCommitteeError) {
51
79
  this.logger.warn(`No committee exists for checkpoint attestation for slot ${slotNumber}`);
52
- return PeerErrorSeverity.LowToleranceError;
80
+ return {
81
+ result: 'reject',
82
+ severity: PeerErrorSeverity.LowToleranceError
83
+ };
53
84
  }
54
85
  throw e;
55
86
  }
@@ -1,7 +1,7 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import { type CheckpointAttestation, PeerErrorSeverity } from '@aztec/stdlib/p2p';
2
+ import { type CheckpointAttestation, type ValidationResult } from '@aztec/stdlib/p2p';
3
3
  import { type TelemetryClient } from '@aztec/telemetry-client';
4
- import type { AttestationPool } from '../../mem_pools/attestation_pool/attestation_pool.js';
4
+ import type { AttestationPoolApi } from '../../mem_pools/attestation_pool/attestation_pool.js';
5
5
  import { CheckpointAttestationValidator } from './attestation_validator.js';
6
6
  /**
7
7
  * FishermanAttestationValidator extends the base AttestationValidator to add
@@ -14,7 +14,7 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
14
14
  export declare class FishermanAttestationValidator extends CheckpointAttestationValidator {
15
15
  private attestationPool;
16
16
  private invalidAttestationCounter;
17
- constructor(epochCache: EpochCacheInterface, attestationPool: AttestationPool, telemetryClient: TelemetryClient);
18
- validate(message: CheckpointAttestation): Promise<PeerErrorSeverity | undefined>;
17
+ constructor(epochCache: EpochCacheInterface, attestationPool: AttestationPoolApi, telemetryClient: TelemetryClient);
18
+ validate(message: CheckpointAttestation): Promise<ValidationResult>;
19
19
  }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlzaGVybWFuX2F0dGVzdGF0aW9uX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci9maXNoZXJtYW5fYXR0ZXN0YXRpb25fdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUsscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRixPQUFPLEVBQXVCLEtBQUssZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUU7Ozs7Ozs7R0FPRztBQUNILHFCQUFhLDZCQUE4QixTQUFRLDhCQUE4QjtJQUs3RSxPQUFPLENBQUMsZUFBZTtJQUp6QixPQUFPLENBQUMseUJBQXlCLENBQUM7SUFFbEMsWUFDRSxVQUFVLEVBQUUsbUJBQW1CLEVBQ3ZCLGVBQWUsRUFBRSxlQUFlLEVBQ3hDLGVBQWUsRUFBRSxlQUFlLEVBT2pDO0lBRWMsUUFBUSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBd0Q5RjtDQUNGIn0=
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlzaGVybWFuX2F0dGVzdGF0aW9uX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci9maXNoZXJtYW5fYXR0ZXN0YXRpb25fdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUsscUJBQXFCLEVBQXFCLEtBQUssZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RyxPQUFPLEVBQXVCLEtBQUssZUFBZSxFQUFrQyxNQUFNLHlCQUF5QixDQUFDO0FBRXBILE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0YsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUU7Ozs7Ozs7R0FPRztBQUNILHFCQUFhLDZCQUE4QixTQUFRLDhCQUE4QjtJQUs3RSxPQUFPLENBQUMsZUFBZTtJQUp6QixPQUFPLENBQUMseUJBQXlCLENBQUM7SUFFbEMsWUFDRSxVQUFVLEVBQUUsbUJBQW1CLEVBQ3ZCLGVBQWUsRUFBRSxrQkFBa0IsRUFDM0MsZUFBZSxFQUFFLGVBQWUsRUFhakM7SUFFYyxRQUFRLENBQUMsT0FBTyxFQUFFLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQXdEakY7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"fisherman_attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/fisherman_attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAC;AAC5F,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,6BAA8B,SAAQ,8BAA8B;IAK7E,OAAO,CAAC,eAAe;IAJzB,OAAO,CAAC,yBAAyB,CAAC;IAElC,YACE,UAAU,EAAE,mBAAmB,EACvB,eAAe,EAAE,eAAe,EACxC,eAAe,EAAE,eAAe,EAOjC;IAEc,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAwD9F;CACF"}
1
+ {"version":3,"file":"fisherman_attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/fisherman_attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,qBAAqB,EAAqB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAAuB,KAAK,eAAe,EAAkC,MAAM,yBAAyB,CAAC;AAEpH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,6BAA8B,SAAQ,8BAA8B;IAK7E,OAAO,CAAC,eAAe;IAJzB,OAAO,CAAC,yBAAyB,CAAC;IAElC,YACE,UAAU,EAAE,mBAAmB,EACvB,eAAe,EAAE,kBAAkB,EAC3C,eAAe,EAAE,eAAe,EAajC;IAEc,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwDjF;CACF"}
@@ -1,5 +1,5 @@
1
1
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
2
- import { Attributes, Metrics } from '@aztec/telemetry-client';
2
+ import { Attributes, Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
3
3
  import { CheckpointAttestationValidator } from './attestation_validator.js';
4
4
  /**
5
5
  * FishermanAttestationValidator extends the base AttestationValidator to add
@@ -15,12 +15,17 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
15
15
  super(epochCache), this.attestationPool = attestationPool;
16
16
  this.logger = this.logger.createChild('[FISHERMAN]');
17
17
  const meter = telemetryClient.getMeter('FishermanAttestationValidator');
18
- this.invalidAttestationCounter = meter.createUpDownCounter(Metrics.VALIDATOR_INVALID_ATTESTATION_RECEIVED_COUNT);
18
+ this.invalidAttestationCounter = createUpDownCounterWithDefault(meter, Metrics.VALIDATOR_INVALID_ATTESTATION_RECEIVED_COUNT, {
19
+ [Attributes.ERROR_TYPE]: [
20
+ 'base_validation_failed',
21
+ 'payload_mismatch'
22
+ ]
23
+ });
19
24
  }
20
25
  async validate(message) {
21
26
  // First run the standard validation
22
27
  const baseValidationResult = await super.validate(message);
23
- if (baseValidationResult !== undefined) {
28
+ if (baseValidationResult.result !== 'accept') {
24
29
  // Track base validation failures (invalid signature, wrong committee, etc.)
25
30
  this.invalidAttestationCounter.add(1, {
26
31
  [Attributes.ERROR_TYPE]: 'base_validation_failed'
@@ -32,7 +37,9 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
32
37
  const attester = message.getSender();
33
38
  const proposer = message.getProposer();
34
39
  if (!attester || !proposer) {
35
- return undefined;
40
+ return {
41
+ result: 'accept'
42
+ };
36
43
  }
37
44
  const proposalId = message.archive.toString();
38
45
  const proposal = await this.attestationPool.getCheckpointProposal(proposalId);
@@ -53,12 +60,17 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
53
60
  [Attributes.ERROR_TYPE]: 'payload_mismatch'
54
61
  });
55
62
  // Return error to reject the message, but LibP2PService won't penalize in fisherman mode
56
- return PeerErrorSeverity.LowToleranceError;
63
+ return {
64
+ result: 'reject',
65
+ severity: PeerErrorSeverity.LowToleranceError
66
+ };
57
67
  }
58
68
  } else {
59
69
  // We might receive attestations before proposals in some cases
60
70
  this.logger.debug(`Received attestation for slot ${slotNumberBigInt} but proposal not found yet. ` + `Proposal ID: ${proposalId}`);
61
71
  }
62
- return undefined;
72
+ return {
73
+ result: 'accept'
74
+ };
63
75
  }
64
76
  }
@@ -0,0 +1,21 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { SlotNumber } from '@aztec/foundation/branded-types';
3
+ /**
4
+ * Maximum clock disparity tolerance for P2P message validation (in milliseconds).
5
+ * Messages for the previous slot are accepted if we're within this many milliseconds
6
+ * of the current slot start. This prevents penalizing peers for messages that
7
+ * were valid when sent but arrived slightly late due to network latency.
8
+ *
9
+ * This follows Ethereum's MAXIMUM_GOSSIP_CLOCK_DISPARITY approach.
10
+ */
11
+ export declare const MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS = 500;
12
+ /**
13
+ * Checks if a message for the previous slot should be accepted due to clock tolerance.
14
+ *
15
+ * @param messageSlot - The slot number from the received message
16
+ * @param currentSlot - The current slot number
17
+ * @param epochCache - EpochCache to get timing information
18
+ * @returns true if the message is for the previous slot AND we're within the clock tolerance window
19
+ */
20
+ export declare function isWithinClockTolerance(messageSlot: SlotNumber, currentSlot: SlotNumber, epochCache: EpochCacheInterface): boolean;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2tfdG9sZXJhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvY2xvY2tfdG9sZXJhbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdEOzs7Ozs7O0dBT0c7QUFDSCxlQUFPLE1BQU0saUNBQWlDLE1BQU0sQ0FBQztBQUVyRDs7Ozs7OztHQU9HO0FBQ0gsd0JBQWdCLHNCQUFzQixDQUNwQyxXQUFXLEVBQUUsVUFBVSxFQUN2QixXQUFXLEVBQUUsVUFBVSxFQUN2QixVQUFVLEVBQUUsbUJBQW1CLEdBQzlCLE9BQU8sQ0F5QlQifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock_tolerance.d.ts","sourceRoot":"","sources":["../../src/msg_validators/clock_tolerance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,UAAU,EACvB,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,mBAAmB,GAC9B,OAAO,CAyBT"}
@@ -0,0 +1,37 @@
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
2
+ /**
3
+ * Maximum clock disparity tolerance for P2P message validation (in milliseconds).
4
+ * Messages for the previous slot are accepted if we're within this many milliseconds
5
+ * of the current slot start. This prevents penalizing peers for messages that
6
+ * were valid when sent but arrived slightly late due to network latency.
7
+ *
8
+ * This follows Ethereum's MAXIMUM_GOSSIP_CLOCK_DISPARITY approach.
9
+ */ export const MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS = 500;
10
+ /**
11
+ * Checks if a message for the previous slot should be accepted due to clock tolerance.
12
+ *
13
+ * @param messageSlot - The slot number from the received message
14
+ * @param currentSlot - The current slot number
15
+ * @param epochCache - EpochCache to get timing information
16
+ * @returns true if the message is for the previous slot AND we're within the clock tolerance window
17
+ */ export function isWithinClockTolerance(messageSlot, currentSlot, epochCache) {
18
+ // Guard against slot 0 edge case (genesis)
19
+ if (currentSlot === SlotNumber.ZERO) {
20
+ return false;
21
+ }
22
+ // Only apply tolerance to messages for the previous slot
23
+ const previousSlot = SlotNumber(currentSlot - 1);
24
+ if (messageSlot !== previousSlot) {
25
+ return false;
26
+ }
27
+ // Check how far we are into the current slot (in milliseconds)
28
+ const { ts: slotStartTs, nowMs, slot } = epochCache.getEpochAndSlotNow();
29
+ // Sanity check: ensure the epoch cache's current slot matches the expected current slot
30
+ if (slot !== currentSlot) {
31
+ return false;
32
+ }
33
+ // ts is in seconds, convert to ms; nowMs is already in milliseconds
34
+ const slotStartMs = slotStartTs * 1000n;
35
+ const elapsedMs = Number(nowMs - slotStartMs);
36
+ return elapsedMs < MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
37
+ }
@@ -1,6 +1,6 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import { type Logger } from '@aztec/foundation/log';
3
- import { BlockProposal, CheckpointProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
3
+ import { BlockProposal, CheckpointProposal, type ValidationResult } from '@aztec/stdlib/p2p';
4
4
  export declare abstract class ProposalValidator<TProposal extends BlockProposal | CheckpointProposal> {
5
5
  protected epochCache: EpochCacheInterface;
6
6
  protected logger: Logger;
@@ -8,6 +8,6 @@ export declare abstract class ProposalValidator<TProposal extends BlockProposal
8
8
  constructor(epochCache: EpochCacheInterface, opts: {
9
9
  txsPermitted: boolean;
10
10
  }, loggerName: string);
11
- validate(proposal: TProposal): Promise<PeerErrorSeverity | undefined>;
11
+ validate(proposal: TProposal): Promise<ValidationResult>;
12
12
  }
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekYsOEJBQXNCLGlCQUFpQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQzFGLFNBQVMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDMUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDekIsU0FBUyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7SUFFaEMsWUFBWSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQTtLQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFJL0Y7SUFFWSxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBbUVqRjtDQUNGIn0=
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFxQixLQUFLLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJaEgsOEJBQXNCLGlCQUFpQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQzFGLFNBQVMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDMUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDekIsU0FBUyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7SUFFaEMsWUFBWSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQTtLQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFJL0Y7SUFFWSxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0F3RXBFO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzF,8BAAsB,iBAAiB,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC1F,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC;IAEhC,YAAY,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,EAAE,UAAU,EAAE,MAAM,EAI/F;IAEY,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAmEjF;CACF"}
1
+ {"version":3,"file":"proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAqB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIhH,8BAAsB,iBAAiB,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC1F,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC;IAEhC,YAAY,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,EAAE,UAAU,EAAE,MAAM,EAI/F;IAEY,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwEpE;CACF"}
@@ -1,6 +1,7 @@
1
1
  import { NoCommitteeError } from '@aztec/ethereum/contracts';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
3
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ import { isWithinClockTolerance } from '../clock_tolerance.js';
4
5
  export class ProposalValidator {
5
6
  epochCache;
6
7
  logger;
@@ -16,23 +17,39 @@ export class ProposalValidator {
16
17
  const { currentSlot, nextSlot } = this.epochCache.getCurrentAndNextSlot();
17
18
  const slotNumber = proposal.slotNumber;
18
19
  if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
19
- this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, {
20
- currentSlot,
21
- nextSlot
22
- });
23
- return PeerErrorSeverity.HighToleranceError;
20
+ // Check if message is for previous slot and within clock tolerance
21
+ if (!isWithinClockTolerance(slotNumber, currentSlot, this.epochCache)) {
22
+ this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, {
23
+ currentSlot,
24
+ nextSlot
25
+ });
26
+ return {
27
+ result: 'reject',
28
+ severity: PeerErrorSeverity.HighToleranceError
29
+ };
30
+ }
31
+ this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
32
+ return {
33
+ result: 'ignore'
34
+ };
24
35
  }
25
36
  // Signature validity
26
37
  const proposer = proposal.getSender();
27
38
  if (!proposer) {
28
- this.logger.debug(`Penalizing peer for proposal with invalid signature`);
29
- return PeerErrorSeverity.MidToleranceError;
39
+ this.logger.warn(`Penalizing peer for proposal with invalid signature`);
40
+ return {
41
+ result: 'reject',
42
+ severity: PeerErrorSeverity.MidToleranceError
43
+ };
30
44
  }
31
45
  // Transactions permitted check
32
46
  const embeddedTxCount = proposal.txs?.length ?? 0;
33
47
  if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
34
- this.logger.debug(`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`);
35
- return PeerErrorSeverity.MidToleranceError;
48
+ this.logger.warn(`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`);
49
+ return {
50
+ result: 'reject',
51
+ severity: PeerErrorSeverity.MidToleranceError
52
+ };
36
53
  }
37
54
  // Embedded txs must be listed in txHashes
38
55
  const hashSet = new Set(proposal.txHashes.map((h)=>h.toString()));
@@ -43,16 +60,22 @@ export class ProposalValidator {
43
60
  txHashesLength: proposal.txHashes.length,
44
61
  missingTxHashes
45
62
  });
46
- return PeerErrorSeverity.MidToleranceError;
63
+ return {
64
+ result: 'reject',
65
+ severity: PeerErrorSeverity.MidToleranceError
66
+ };
47
67
  }
48
68
  // Proposer check
49
69
  const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
50
70
  if (expectedProposer !== undefined && !proposer.equals(expectedProposer)) {
51
- this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
71
+ this.logger.warn(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
52
72
  expectedProposer,
53
73
  proposer: proposer.toString()
54
74
  });
55
- return PeerErrorSeverity.MidToleranceError;
75
+ return {
76
+ result: 'reject',
77
+ severity: PeerErrorSeverity.MidToleranceError
78
+ };
56
79
  }
57
80
  // Validate tx hashes for all txs embedded in the proposal
58
81
  if (!(await Promise.all(proposal.txs?.map((tx)=>tx.validateTxHash()) ?? [])).every((v)=>v)) {
@@ -60,12 +83,20 @@ export class ProposalValidator {
60
83
  proposer,
61
84
  slotNumber
62
85
  });
63
- return PeerErrorSeverity.LowToleranceError;
86
+ return {
87
+ result: 'reject',
88
+ severity: PeerErrorSeverity.LowToleranceError
89
+ };
64
90
  }
65
- return undefined;
91
+ return {
92
+ result: 'accept'
93
+ };
66
94
  } catch (e) {
67
95
  if (e instanceof NoCommitteeError) {
68
- return PeerErrorSeverity.LowToleranceError;
96
+ return {
97
+ result: 'reject',
98
+ severity: PeerErrorSeverity.LowToleranceError
99
+ };
69
100
  }
70
101
  throw e;
71
102
  }
@@ -1,14 +1,14 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
2
  import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
3
  import type { EthAddress } from '@aztec/foundation/eth-address';
4
- import { type BlockProposal, type CheckpointProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
+ import { type BlockProposal, type CheckpointProposal, type ValidationResult } from '@aztec/stdlib/p2p';
5
5
  import type { TxHash } from '@aztec/stdlib/tx';
6
6
  import type { MockProxy } from 'jest-mock-extended';
7
7
  export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
8
8
  validatorFactory: (epochCache: EpochCacheInterface, opts: {
9
9
  txsPermitted: boolean;
10
10
  }) => {
11
- validate: (proposal: TProposal) => Promise<PeerErrorSeverity | undefined>;
11
+ validate: (proposal: TProposal) => Promise<ValidationResult>;
12
12
  };
13
13
  makeProposal: (options?: any) => Promise<TProposal>;
14
14
  makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
@@ -20,4 +20,4 @@ export interface ProposalValidatorTestParams<TProposal extends BlockProposal | C
20
20
  epochCacheMock: () => MockProxy<EpochCacheInterface>;
21
21
  }
22
22
  export declare function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(params: ProposalValidatorTestParams<TProposal>): void;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvcHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25HLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE1BQU0sV0FBVywyQkFBMkIsQ0FBQyxTQUFTLFNBQVMsYUFBYSxHQUFHLGtCQUFrQjtJQUMvRixnQkFBZ0IsRUFBRSxDQUNoQixVQUFVLEVBQUUsbUJBQW1CLEVBQy9CLElBQUksRUFBRTtRQUFFLFlBQVksRUFBRSxPQUFPLENBQUE7S0FBRSxLQUM1QjtRQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssT0FBTyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFBO0tBQUUsQ0FBQztJQUNuRixZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxLQUFLLEdBQUcsQ0FBQztJQUM3RyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7SUFDakMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsZUFBZSxLQUFLLFVBQVUsQ0FBQztJQUNyRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDeEMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztJQUNyQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNwQixjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztDQUN0RDtBQUVELHdCQUFnQiw0QkFBNEIsQ0FBQyxTQUFTLFNBQVMsYUFBYSxHQUFHLGtCQUFrQixFQUMvRixNQUFNLEVBQUUsMkJBQTJCLENBQUMsU0FBUyxDQUFDLFFBc0svQyJ9
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvcHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxhQUFhLEVBQ2xCLEtBQUssa0JBQWtCLEVBRXZCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsTUFBTSxXQUFXLDJCQUEyQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQy9GLGdCQUFnQixFQUFFLENBQ2hCLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQTtLQUFFLEtBQzVCO1FBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUFFLENBQUM7SUFDdEUsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDN0csU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0lBQ2pDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsS0FBSyxVQUFVLENBQUM7SUFDckQsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDO0lBQ3hDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7SUFDckMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDcEIsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Q0FDdEQ7QUFFRCx3QkFBZ0IsNEJBQTRCLENBQUMsU0FBUyxTQUFTLGFBQWEsR0FBRyxrQkFBa0IsRUFDL0YsTUFBTSxFQUFFLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxRQXdNL0MifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC/F,gBAAgB,EAAE,CAChB,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC5B;QAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAA;KAAE,CAAC;IACnF,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IAC7G,SAAS,EAAE,MAAM,eAAe,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB,EAC/F,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,QAsK/C"}
1
+ {"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC/F,gBAAgB,EAAE,CAChB,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC5B;QAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;IACtE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IAC7G,SAAS,EAAE,MAAM,eAAe,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB,EAC/F,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,QAwM/C"}
@@ -4,9 +4,10 @@ export function sharedProposalValidatorTests(params) {
4
4
  describe('shared proposal validation logic', ()=>{
5
5
  let epochCache;
6
6
  let validator;
7
+ const previousSlot = getSlot(99);
7
8
  const currentSlot = getSlot(100);
8
9
  const nextSlot = getSlot(101);
9
- function mockGetProposer(currentProposer, nextProposer) {
10
+ function mockGetProposer(currentProposer, nextProposer, previousProposer) {
10
11
  epochCache.getProposerAttesterAddressInSlot.mockImplementation((slot)=>{
11
12
  if (slot === currentSlot) {
12
13
  return Promise.resolve(currentProposer);
@@ -14,6 +15,9 @@ export function sharedProposalValidatorTests(params) {
14
15
  if (slot === nextSlot) {
15
16
  return Promise.resolve(nextProposer);
16
17
  }
18
+ if (slot === previousSlot && previousProposer) {
19
+ return Promise.resolve(previousProposer);
20
+ }
17
21
  throw new Error('Unexpected argument');
18
22
  });
19
23
  }
@@ -27,18 +31,49 @@ export function sharedProposalValidatorTests(params) {
27
31
  nextSlot: nextSlot
28
32
  });
29
33
  });
30
- it('returns high tolerance error if slot number is not current or next slot', async ()=>{
34
+ it('returns high tolerance error if slot number is not current or next slot (outside clock tolerance)', async ()=>{
31
35
  const header = makeHeader(1, 99, 99);
32
36
  const mockProposal = await makeProposal({
33
37
  blockHeader: header,
34
38
  lastBlockHeader: header
35
39
  });
40
+ // Mock getEpochAndSlotNow to return time OUTSIDE clock tolerance (1000ms elapsed)
41
+ epochCache.getEpochAndSlotNow.mockReturnValue({
42
+ epoch: 1,
43
+ slot: currentSlot,
44
+ ts: 1000n,
45
+ nowMs: 1001000n
46
+ });
36
47
  epochCache.getProposerAttesterAddressInSlot.mockResolvedValue(getAddress());
37
48
  const result = await validator.validate(mockProposal);
38
- expect(result).toBe(PeerErrorSeverity.HighToleranceError);
49
+ expect(result).toEqual({
50
+ result: 'reject',
51
+ severity: PeerErrorSeverity.HighToleranceError
52
+ });
39
53
  // Should not try to resolve proposers if base validation fails
40
54
  expect(epochCache.getProposerAttesterAddressInSlot).not.toHaveBeenCalled();
41
55
  });
56
+ it('returns ignore if previous slot proposal is within clock tolerance', async ()=>{
57
+ const previousProposer = getSigner();
58
+ const header = makeHeader(1, 99, 99);
59
+ const mockProposal = await makeProposal({
60
+ blockHeader: header,
61
+ lastBlockHeader: header,
62
+ signer: previousProposer
63
+ });
64
+ // Mock getEpochAndSlotNow to return time WITHIN clock tolerance (100ms elapsed)
65
+ epochCache.getEpochAndSlotNow.mockReturnValue({
66
+ epoch: 1,
67
+ slot: currentSlot,
68
+ ts: 1000n,
69
+ nowMs: 1000100n
70
+ });
71
+ mockGetProposer(getAddress(), getAddress(), getAddress(previousProposer));
72
+ const result = await validator.validate(mockProposal);
73
+ expect(result).toEqual({
74
+ result: 'ignore'
75
+ });
76
+ });
42
77
  it('returns mid tolerance error if proposer is not current proposer for current slot', async ()=>{
43
78
  const currentProposer = getSigner();
44
79
  const nextProposer = getSigner();
@@ -51,7 +86,10 @@ export function sharedProposalValidatorTests(params) {
51
86
  });
52
87
  mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
53
88
  const result = await validator.validate(mockProposal);
54
- expect(result).toBe(PeerErrorSeverity.MidToleranceError);
89
+ expect(result).toEqual({
90
+ result: 'reject',
91
+ severity: PeerErrorSeverity.MidToleranceError
92
+ });
55
93
  });
56
94
  it('returns mid tolerance error if proposer is not next proposer for next slot', async ()=>{
57
95
  const currentProposer = getSigner();
@@ -65,7 +103,10 @@ export function sharedProposalValidatorTests(params) {
65
103
  });
66
104
  mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
67
105
  const result = await validator.validate(mockProposal);
68
- expect(result).toBe(PeerErrorSeverity.MidToleranceError);
106
+ expect(result).toEqual({
107
+ result: 'reject',
108
+ severity: PeerErrorSeverity.MidToleranceError
109
+ });
69
110
  });
70
111
  it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async ()=>{
71
112
  const currentProposer = getSigner();
@@ -78,7 +119,10 @@ export function sharedProposalValidatorTests(params) {
78
119
  });
79
120
  mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
80
121
  const result = await validator.validate(mockProposal);
81
- expect(result).toBe(PeerErrorSeverity.MidToleranceError);
122
+ expect(result).toEqual({
123
+ result: 'reject',
124
+ severity: PeerErrorSeverity.MidToleranceError
125
+ });
82
126
  });
83
127
  it('returns undefined if proposal is valid for current slot and proposer', async ()=>{
84
128
  const currentProposer = getSigner();
@@ -91,7 +135,9 @@ export function sharedProposalValidatorTests(params) {
91
135
  });
92
136
  mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
93
137
  const result = await validator.validate(mockProposal);
94
- expect(result).toBeUndefined();
138
+ expect(result).toEqual({
139
+ result: 'accept'
140
+ });
95
141
  });
96
142
  it('returns undefined if proposal is valid for next slot and proposer', async ()=>{
97
143
  const currentProposer = getSigner();
@@ -104,7 +150,9 @@ export function sharedProposalValidatorTests(params) {
104
150
  });
105
151
  mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
106
152
  const result = await validator.validate(mockProposal);
107
- expect(result).toBeUndefined();
153
+ expect(result).toEqual({
154
+ result: 'accept'
155
+ });
108
156
  });
109
157
  describe('transaction permission validation', ()=>{
110
158
  it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async ()=>{
@@ -121,7 +169,10 @@ export function sharedProposalValidatorTests(params) {
121
169
  });
122
170
  mockGetProposer(getAddress(currentProposer), getAddress());
123
171
  const result = await validatorWithTxsDisabled.validate(mockProposal);
124
- expect(result).toBe(PeerErrorSeverity.MidToleranceError);
172
+ expect(result).toEqual({
173
+ result: 'reject',
174
+ severity: PeerErrorSeverity.MidToleranceError
175
+ });
125
176
  });
126
177
  it('returns undefined if txs not permitted but proposal has no txHashes', async ()=>{
127
178
  const currentProposer = getSigner();
@@ -137,7 +188,9 @@ export function sharedProposalValidatorTests(params) {
137
188
  });
138
189
  mockGetProposer(getAddress(currentProposer), getAddress());
139
190
  const result = await validatorWithTxsDisabled.validate(mockProposal);
140
- expect(result).toBeUndefined();
191
+ expect(result).toEqual({
192
+ result: 'accept'
193
+ });
141
194
  });
142
195
  it('returns undefined if txs permitted and proposal contains txHashes', async ()=>{
143
196
  const currentProposer = getSigner();
@@ -150,7 +203,9 @@ export function sharedProposalValidatorTests(params) {
150
203
  });
151
204
  mockGetProposer(getAddress(currentProposer), getAddress());
152
205
  const result = await validator.validate(mockProposal);
153
- expect(result).toBeUndefined();
206
+ expect(result).toEqual({
207
+ result: 'accept'
208
+ });
154
209
  });
155
210
  });
156
211
  });
@@ -1,7 +1,7 @@
1
- import type { ProcessedTx, Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
2
- export declare class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
3
- #private;
1
+ import type { TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
2
+ export declare class AggregateTxValidator<T> implements TxValidator<T> {
3
+ readonly validators: TxValidator<T>[];
4
4
  constructor(...validators: TxValidator<T>[]);
5
5
  validateTx(tx: T): Promise<TxValidationResult>;
6
6
  }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9hZ2dyZWdhdGVfdHhfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYscUJBQWEsb0JBQW9CLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxXQUFXLENBQUUsWUFBVyxXQUFXLENBQUMsQ0FBQyxDQUFDOztJQUVyRixZQUFZLEdBQUcsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQU0xQztJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQWtCbkQ7Q0FDRiJ9
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9hZ2dyZWdhdGVfdHhfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhFLHFCQUFhLG9CQUFvQixDQUFDLENBQUMsQ0FBRSxZQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsUUFBUSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0QyxZQUFZLEdBQUcsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQU0xQztJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQWtCbkQ7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEzF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAErF,YAAY,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAM1C;IAEK,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkBnD;CACF"}
1
+ {"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAExE,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,YAAY,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAM1C;IAEK,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkBnD;CACF"}