@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928

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 (483) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +5 -4
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +39 -16
  8. package/dest/client/interface.d.ts +52 -12
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +36 -20
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +142 -81
  13. package/dest/config.d.ts +163 -98
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +130 -20
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +272 -199
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +224 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +9 -4
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +28 -9
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  74. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +41 -9
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
  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 +46 -16
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  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 +55 -41
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +19 -4
  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 +86 -32
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
  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 +262 -131
  92. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  95. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  98. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -5
  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 +11 -3
  101. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -5
  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 +23 -3
  104. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +35 -10
  105. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/proposal_validator.js +128 -56
  107. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  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 +8 -15
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -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 +21 -32
  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/archive_cache.js +1 -1
  117. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  118. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  120. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  121. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  123. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  124. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  126. package/dest/msg_validators/tx_validator/factory.d.ts +25 -7
  127. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/factory.js +55 -16
  129. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  130. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  132. package/dest/msg_validators/tx_validator/gas_validator.d.ts +53 -7
  133. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  135. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  136. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/index.js +3 -0
  138. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  139. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  141. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  142. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
  144. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  147. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  148. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  149. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  150. package/dest/services/data_store.d.ts +1 -1
  151. package/dest/services/data_store.d.ts.map +1 -1
  152. package/dest/services/data_store.js +5 -5
  153. package/dest/services/discv5/discV5_service.d.ts +13 -2
  154. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  155. package/dest/services/discv5/discV5_service.js +119 -23
  156. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  157. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  158. package/dest/services/discv5/persisted_enr_store.js +145 -0
  159. package/dest/services/dummy_service.d.ts +18 -16
  160. package/dest/services/dummy_service.d.ts.map +1 -1
  161. package/dest/services/dummy_service.js +21 -16
  162. package/dest/services/encoding.d.ts +23 -6
  163. package/dest/services/encoding.d.ts.map +1 -1
  164. package/dest/services/encoding.js +32 -16
  165. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  166. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  167. package/dest/services/gossipsub/topic_score_params.js +4 -14
  168. package/dest/services/libp2p/instrumentation.d.ts +6 -1
  169. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  170. package/dest/services/libp2p/instrumentation.js +21 -0
  171. package/dest/services/libp2p/libp2p_service.d.ts +51 -51
  172. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  173. package/dest/services/libp2p/libp2p_service.js +499 -333
  174. package/dest/services/peer-manager/peer_manager.d.ts +31 -3
  175. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  176. package/dest/services/peer-manager/peer_manager.js +125 -25
  177. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  178. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  179. package/dest/services/peer-manager/peer_scoring.js +102 -13
  180. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  181. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  182. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +81 -86
  183. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  184. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  185. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  186. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  187. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  188. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  189. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  190. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  191. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  192. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  193. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  194. package/dest/services/reqresp/config.d.ts +15 -3
  195. package/dest/services/reqresp/config.d.ts.map +1 -1
  196. package/dest/services/reqresp/config.js +11 -0
  197. package/dest/services/reqresp/interface.d.ts +16 -18
  198. package/dest/services/reqresp/interface.d.ts.map +1 -1
  199. package/dest/services/reqresp/interface.js +10 -20
  200. package/dest/services/reqresp/metrics.d.ts +1 -1
  201. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  202. package/dest/services/reqresp/metrics.js +0 -1
  203. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  204. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  205. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  206. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  207. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  208. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  209. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  210. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  211. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  212. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  213. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/index.js +0 -1
  215. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  216. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  217. package/dest/services/reqresp/protocols/tx.js +1 -3
  218. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  219. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  220. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  221. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  222. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  223. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  224. package/dest/services/reqresp/reqresp.d.ts +7 -29
  225. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  226. package/dest/services/reqresp/reqresp.js +73 -215
  227. package/dest/services/service.d.ts +43 -18
  228. package/dest/services/service.d.ts.map +1 -1
  229. package/dest/services/tx_collection/config.d.ts +2 -23
  230. package/dest/services/tx_collection/config.d.ts.map +1 -1
  231. package/dest/services/tx_collection/config.js +2 -55
  232. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  233. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  234. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  235. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  236. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  237. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  238. package/dest/services/tx_collection/index.d.ts +2 -3
  239. package/dest/services/tx_collection/index.d.ts.map +1 -1
  240. package/dest/services/tx_collection/index.js +0 -1
  241. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  242. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  243. package/dest/services/tx_collection/instrumentation.js +0 -2
  244. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  245. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  246. package/dest/services/tx_collection/request_tracker.js +84 -0
  247. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  248. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  249. package/dest/services/tx_collection/tx_collection.js +275 -119
  250. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  251. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  252. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  253. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  254. package/dest/services/tx_collection/tx_source.js +13 -8
  255. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  256. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  257. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  258. package/dest/services/tx_provider.d.ts +3 -1
  259. package/dest/services/tx_provider.d.ts.map +1 -1
  260. package/dest/services/tx_provider.js +3 -0
  261. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  263. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  264. package/dest/test-helpers/mock-pubsub.d.ts +33 -9
  265. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  266. package/dest/test-helpers/mock-pubsub.js +57 -44
  267. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  268. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  269. package/dest/test-helpers/reqresp-nodes.js +16 -18
  270. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  271. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  272. package/dest/test-helpers/test_tx_provider.js +3 -0
  273. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  274. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  275. package/dest/test-helpers/testbench-utils.js +49 -15
  276. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  277. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  278. package/dest/testbench/p2p_client_testbench_worker.js +104 -41
  279. package/dest/testbench/worker_client_manager.d.ts +12 -6
  280. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  281. package/dest/testbench/worker_client_manager.js +57 -11
  282. package/dest/util.d.ts +12 -7
  283. package/dest/util.d.ts.map +1 -1
  284. package/dest/util.js +35 -14
  285. package/dest/versioning.d.ts +3 -6
  286. package/dest/versioning.d.ts.map +1 -1
  287. package/dest/versioning.js +3 -24
  288. package/package.json +17 -17
  289. package/src/bootstrap/bootstrap.ts +17 -3
  290. package/src/client/factory.ts +62 -9
  291. package/src/client/interface.ts +48 -18
  292. package/src/client/p2p_client.ts +159 -113
  293. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  294. package/src/config.ts +233 -20
  295. package/src/errors/p2p-service.error.ts +11 -0
  296. package/src/errors/reqresp.error.ts +13 -19
  297. package/src/index.ts +0 -1
  298. package/src/mem_pools/attestation_pool/attestation_pool.ts +327 -242
  299. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
  300. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  301. package/src/mem_pools/index.ts +0 -3
  302. package/src/mem_pools/instrumentation.ts +18 -12
  303. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  304. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
  305. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  306. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -5
  307. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
  308. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  309. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  310. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  311. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
  312. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
  313. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
  314. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  315. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  316. package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
  317. package/src/mem_pools/tx_pool_v2/interfaces.ts +40 -8
  318. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
  319. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
  320. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +107 -32
  321. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +291 -137
  322. package/src/msg_validators/attestation_validator/README.md +49 -0
  323. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  324. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  325. package/src/msg_validators/proposal_validator/README.md +123 -0
  326. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  327. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  328. package/src/msg_validators/proposal_validator/proposal_validator.ts +150 -58
  329. package/src/msg_validators/tx_validator/README.md +17 -3
  330. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  331. package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
  332. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  333. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  334. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  335. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  336. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  337. package/src/msg_validators/tx_validator/factory.ts +66 -9
  338. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  339. package/src/msg_validators/tx_validator/gas_validator.ts +117 -39
  340. package/src/msg_validators/tx_validator/index.ts +3 -0
  341. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  342. package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
  343. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  344. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  345. package/src/services/data_store.ts +5 -13
  346. package/src/services/discv5/discV5_service.ts +126 -14
  347. package/src/services/discv5/persisted_enr_store.ts +158 -0
  348. package/src/services/dummy_service.ts +26 -40
  349. package/src/services/encoding.ts +35 -19
  350. package/src/services/gossipsub/README.md +33 -11
  351. package/src/services/gossipsub/topic_score_params.ts +9 -18
  352. package/src/services/libp2p/instrumentation.ts +22 -0
  353. package/src/services/libp2p/libp2p_service.ts +560 -369
  354. package/src/services/peer-manager/peer_manager.ts +138 -24
  355. package/src/services/peer-manager/peer_scoring.ts +102 -8
  356. package/src/services/reqresp/README.md +194 -0
  357. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  358. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
  359. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  360. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  361. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  362. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  363. package/src/services/reqresp/config.ts +19 -2
  364. package/src/services/reqresp/interface.ts +21 -47
  365. package/src/services/reqresp/metrics.ts +0 -1
  366. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  367. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  368. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  369. package/src/services/reqresp/protocols/index.ts +0 -1
  370. package/src/services/reqresp/protocols/tx.ts +1 -3
  371. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  372. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  373. package/src/services/reqresp/reqresp.ts +84 -259
  374. package/src/services/service.ts +51 -35
  375. package/src/services/tx_collection/config.ts +3 -80
  376. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  377. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  378. package/src/services/tx_collection/index.ts +1 -6
  379. package/src/services/tx_collection/instrumentation.ts +1 -7
  380. package/src/services/tx_collection/request_tracker.ts +127 -0
  381. package/src/services/tx_collection/tx_collection.ts +331 -176
  382. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  383. package/src/services/tx_collection/tx_source.ts +10 -8
  384. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  385. package/src/services/tx_provider.ts +5 -0
  386. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  387. package/src/test-helpers/mock-pubsub.ts +61 -60
  388. package/src/test-helpers/reqresp-nodes.ts +13 -23
  389. package/src/test-helpers/test_tx_provider.ts +5 -0
  390. package/src/test-helpers/testbench-utils.ts +63 -28
  391. package/src/testbench/p2p_client_testbench_worker.ts +111 -57
  392. package/src/testbench/worker_client_manager.ts +72 -25
  393. package/src/util.ts +33 -18
  394. package/src/versioning.ts +3 -33
  395. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  396. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  397. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  398. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  399. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  400. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  401. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  402. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  403. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  404. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  405. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  406. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  407. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  408. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  409. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  410. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  411. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  412. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  413. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  414. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  415. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  416. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  417. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  418. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  419. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  420. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  421. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  422. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  423. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  424. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  425. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  426. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  427. package/dest/mem_pools/tx_pool/index.js +0 -2
  428. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  429. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  430. package/dest/mem_pools/tx_pool/priority.js +0 -15
  431. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  432. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  433. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  434. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  435. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  436. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  437. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  438. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  439. package/dest/msg_validators/clock_tolerance.js +0 -37
  440. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  441. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  442. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  443. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  444. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  445. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  446. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  447. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  448. package/dest/services/reqresp/protocols/block.js +0 -32
  449. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  450. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  451. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  452. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  453. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  454. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  455. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  456. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  457. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  458. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  459. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  460. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  461. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  462. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  463. package/src/mem_pools/tx_pool/README.md +0 -270
  464. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  465. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  466. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  467. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  468. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  469. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  470. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  471. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  472. package/src/mem_pools/tx_pool/index.ts +0 -2
  473. package/src/mem_pools/tx_pool/priority.ts +0 -20
  474. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  475. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  476. package/src/msg_validators/clock_tolerance.ts +0 -51
  477. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
  478. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  479. package/src/services/reqresp/protocols/block.ts +0 -37
  480. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  481. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  482. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  483. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,7 +1,9 @@
1
1
  import { IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore } from '@aztec/stdlib/p2p';
4
+ import { Signature } from '@aztec/foundation/eth-signature';
5
+ import type { BlockProposal, CheckpointProposalCore } from '@aztec/stdlib/p2p';
6
+ import { CheckpointAttestation } from '@aztec/stdlib/p2p';
5
7
  import { CheckpointHeader } from '@aztec/stdlib/rollup';
6
8
  import {
7
9
  makeBlockHeader,
@@ -28,9 +30,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
28
30
  signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
29
31
  });
30
32
 
33
+ /**
34
+ * Build attestations from each signer over the *same* signed payload (same header,
35
+ * archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
36
+ * payload hash and treats attestations from different signers as distinct entries
37
+ * only when the payload itself matches.
38
+ */
31
39
  const createCheckpointAttestationsForSlot = (slotNumber: number, archive?: Fr) => {
32
40
  const archiveToUse = archive ?? Fr.random();
33
- return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse));
41
+ const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
42
+ return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
34
43
  };
35
44
 
36
45
  const mockBlockProposalForPool = (
@@ -55,17 +64,58 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
55
64
  expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
56
65
  };
57
66
 
67
+ /**
68
+ * Rewrites the attester signature into yParity form (27 -> 0, 28 -> 1), keeping (r, s). The recovery
69
+ * bit is unchanged so it still recovers to the same signer, mimicking a peer that gossips (or mutates
70
+ * in flight) a signature with a non-canonical recovery byte.
71
+ */
72
+ const toYParityForm = (attestation: CheckpointAttestation): CheckpointAttestation => {
73
+ const sig = attestation.signature;
74
+ const yParityV = sig.v === 27 ? 0 : sig.v === 28 ? 1 : sig.v;
75
+ return new CheckpointAttestation(
76
+ attestation.payload,
77
+ new Signature(sig.r, sig.s, yParityV),
78
+ attestation.proposerSignature,
79
+ );
80
+ };
81
+
58
82
  describe('CheckpointAttestation', () => {
83
+ it('normalizes yParity (v=0/v=1) attester signatures on ingress from both gossip and own keys', async () => {
84
+ const slotNumber = 421;
85
+ const canonical = createCheckpointAttestationsForSlot(slotNumber);
86
+ const payloadHash = canonical[0].getPayloadHash();
87
+ const expectedSenders = new Set([canonical[0].getSender()!.toString(), canonical[1].getSender()!.toString()]);
88
+
89
+ const gossiped = toYParityForm(canonical[0]);
90
+ expect([0, 1]).toContain(gossiped.signature.v);
91
+ await ap.tryAddCheckpointAttestation(gossiped);
92
+
93
+ const own = toYParityForm(canonical[1]);
94
+ expect([0, 1]).toContain(own.signature.v);
95
+ await ap.addOwnCheckpointAttestations([own]);
96
+
97
+ const retrieved = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
98
+ expect(retrieved.length).toBe(2);
99
+ for (const attestation of retrieved) {
100
+ expect([27, 28]).toContain(attestation.signature.v);
101
+ expect(expectedSenders.has(attestation.getSender()!.toString())).toBe(true);
102
+ }
103
+ });
104
+
59
105
  it('should add attestations to pool', async () => {
60
106
  const slotNumber = 420;
61
107
  const archive = Fr.random();
62
- const attestations = signers.slice(0, -1).map(signer => mockCheckpointAttestation(signer, slotNumber, archive));
108
+ const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
109
+ const attestations = signers
110
+ .slice(0, -1)
111
+ .map(signer => mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
112
+ const payloadHash = attestations[0].getPayloadHash();
63
113
 
64
114
  await ap.addOwnCheckpointAttestations(attestations);
65
115
 
66
116
  const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
67
117
  SlotNumber(slotNumber),
68
- archive.toString(),
118
+ payloadHash,
69
119
  );
70
120
  expect(retrievedAttestations.length).toBe(attestations.length);
71
121
  compareCheckpointAttestations(retrievedAttestations, attestations);
@@ -75,11 +125,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
75
125
  compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
76
126
 
77
127
  // Add another one
78
- const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
128
+ const newAttestation = mockCheckpointAttestation(
129
+ signers[NUMBER_OF_SIGNERS_PER_TEST - 1],
130
+ slotNumber,
131
+ archive,
132
+ sharedHeader,
133
+ );
79
134
  await ap.addOwnCheckpointAttestations([newAttestation]);
80
135
  const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(
81
136
  SlotNumber(slotNumber),
82
- archive.toString(),
137
+ payloadHash,
83
138
  );
84
139
  expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
85
140
  compareCheckpointAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
@@ -92,7 +147,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
92
147
 
93
148
  const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
94
149
  SlotNumber(slotNumber),
95
- archive.toString(),
150
+ payloadHash,
96
151
  );
97
152
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
98
153
  });
@@ -108,13 +163,14 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
108
163
  for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
109
164
  attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
110
165
  }
166
+ const payloadHash = attestations[0].getPayloadHash();
111
167
 
112
168
  // Add them to store and check we end up with only one
113
169
  await ap.addOwnCheckpointAttestations(attestations);
114
170
 
115
171
  const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
116
172
  SlotNumber(slotNumber),
117
- archive.toString(),
173
+ payloadHash,
118
174
  );
119
175
  expect(retreivedAttestations.length).toBe(1);
120
176
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
@@ -122,9 +178,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
122
178
 
123
179
  // Try adding them on another operation and check they are still not duplicated
124
180
  await ap.addOwnCheckpointAttestations([attestations[0]]);
125
- expect(
126
- await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString()),
127
- ).toHaveLength(1);
181
+ expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
128
182
  });
129
183
 
130
184
  it('should store attestations by differing slot', async () => {
@@ -135,9 +189,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
135
189
 
136
190
  for (const attestation of attestations) {
137
191
  const slot = attestation.payload.header.slotNumber;
138
- const archive = attestation.archive.toString();
192
+ const payloadHash = attestation.getPayloadHash();
139
193
 
140
- const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, archive);
194
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
141
195
  expect(retreivedAttestations.length).toBe(1);
142
196
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
143
197
  expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
@@ -153,9 +207,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
153
207
 
154
208
  for (const attestation of attestations) {
155
209
  const slot = attestation.payload.header.slotNumber;
156
- const proposalId = attestation.archive.toString();
210
+ const payloadHash = attestation.getPayloadHash();
157
211
 
158
- const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, proposalId);
212
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
159
213
  expect(retreivedAttestations.length).toBe(1);
160
214
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
161
215
  expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
@@ -164,21 +218,25 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
164
218
 
165
219
  it('should delete attestations older than a given slot', async () => {
166
220
  const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
167
- const attestations = (
168
- await Promise.all(slotNumbers.map(slotNumber => createCheckpointAttestationsForSlot(slotNumber)))
169
- ).flat();
170
- const proposalId = attestations[0].archive.toString();
221
+ const attestationsPerSlot = await Promise.all(
222
+ slotNumbers.map(slotNumber => createCheckpointAttestationsForSlot(slotNumber)),
223
+ );
224
+ const attestations = attestationsPerSlot.flat();
225
+ const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
171
226
 
172
227
  await ap.addOwnCheckpointAttestations(attestations);
173
228
 
174
- const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
229
+ const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(
230
+ SlotNumber(1),
231
+ payloadHashForSlot1,
232
+ );
175
233
  expect(attestationsForSlot1.length).toBe(signers.length);
176
234
 
177
235
  await ap.deleteOlderThan(SlotNumber(73));
178
236
 
179
237
  const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
180
238
  SlotNumber(1),
181
- proposalId,
239
+ payloadHashForSlot1,
182
240
  );
183
241
  expect(attestationsForSlot1AfterDelete.length).toBe(0);
184
242
  });
@@ -189,7 +247,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
189
247
  const slotNumber = 420;
190
248
  const archive = Fr.random();
191
249
  const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
192
- const proposalId = proposal.archive.toString();
193
250
 
194
251
  const result = await ap.tryAddBlockProposal(proposal);
195
252
 
@@ -197,7 +254,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
197
254
  expect(result.alreadyExists).toBe(false);
198
255
  expect(result.count).toBe(1);
199
256
 
200
- const retrievedProposal = await ap.getBlockProposal(proposalId);
257
+ const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
201
258
 
202
259
  expect(retrievedProposal).toBeDefined();
203
260
  expect(retrievedProposal!).toEqual(proposal);
@@ -205,33 +262,68 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
205
262
 
206
263
  it('should return undefined for non-existent block proposal', async () => {
207
264
  const nonExistentId = Fr.random().toString();
208
- const retrievedProposal = await ap.getBlockProposal(nonExistentId);
265
+ const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
209
266
  expect(retrievedProposal).toBeUndefined();
210
267
  });
211
268
 
212
- it('should return alreadyExists when adding proposal with same id', async () => {
269
+ it('should return alreadyExists when re-adding the same signed payload', async () => {
213
270
  const slotNumber = 420;
214
271
  const archive = Fr.random();
215
- const proposal1 = await mockBlockProposalForPool(signers[0], slotNumber, archive);
216
- const proposalId = proposal1.archive.toString();
272
+ const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
217
273
 
218
- const result1 = await ap.tryAddBlockProposal(proposal1);
274
+ const result1 = await ap.tryAddBlockProposal(proposal);
219
275
  expect(result1.added).toBe(true);
220
276
  expect(result1.alreadyExists).toBe(false);
221
277
 
222
- // Create a new proposal with same archive but different signer
223
- const proposal2 = await mockBlockProposalForPool(signers[1], slotNumber, archive);
224
-
225
- const result2 = await ap.tryAddBlockProposal(proposal2);
278
+ // Re-broadcasting the exact same proposal yields alreadyExists.
279
+ const result2 = await ap.tryAddBlockProposal(proposal);
226
280
  expect(result2.added).toBe(false);
227
281
  expect(result2.alreadyExists).toBe(true);
228
282
 
229
- // Should still have the first proposal
230
- const retrievedProposal = await ap.getBlockProposal(proposalId);
283
+ const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
231
284
  expect(retrievedProposal).toBeDefined();
232
- expect(retrievedProposal!.toBuffer()).toEqual(proposal1.toBuffer());
285
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
233
286
  expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
234
287
  });
288
+
289
+ it('should retain an exact duplicate block proposal only once', async () => {
290
+ const slotNumber = 420;
291
+ const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
292
+
293
+ await ap.tryAddBlockProposal(proposal);
294
+ await ap.tryAddBlockProposal(proposal);
295
+
296
+ const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
297
+ expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual([
298
+ proposal.withoutSignedTxs().toBuffer(),
299
+ ]);
300
+ });
301
+
302
+ it('should retain all accepted block proposals at a position', async () => {
303
+ const slotNumber = 420;
304
+ const blockHeader = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
305
+ const proposal1 = await makeBlockProposal({
306
+ signer: signers[0],
307
+ blockHeader,
308
+ archiveRoot: Fr.random(),
309
+ indexWithinCheckpoint: IndexWithinCheckpoint(1),
310
+ });
311
+ const proposal2 = await makeBlockProposal({
312
+ signer: signers[0],
313
+ blockHeader,
314
+ archiveRoot: Fr.random(),
315
+ indexWithinCheckpoint: IndexWithinCheckpoint(1),
316
+ });
317
+
318
+ await ap.tryAddBlockProposal(proposal1);
319
+ await ap.tryAddBlockProposal(proposal2);
320
+
321
+ const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
322
+ expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual(
323
+ expect.arrayContaining([proposal1.withoutSignedTxs().toBuffer(), proposal2.withoutSignedTxs().toBuffer()]),
324
+ );
325
+ expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
326
+ });
235
327
  });
236
328
 
237
329
  describe('CheckpointProposal in attestation pool', () => {
@@ -239,12 +331,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
239
331
  signer: Secp256k1Signer,
240
332
  slotNumber: number,
241
333
  archive: Fr = Fr.random(),
334
+ checkpointHeader?: CheckpointHeader,
242
335
  ): Promise<CheckpointProposalCore> => {
243
- const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
336
+ const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
244
337
  const blockHeader = makeBlockHeader(1);
245
338
  const proposal = await makeCheckpointProposal({
246
339
  signer,
247
- checkpointHeader,
340
+ checkpointHeader: headerToUse,
248
341
  archiveRoot: archive,
249
342
  lastBlock: { blockHeader },
250
343
  });
@@ -256,7 +349,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
256
349
  const slotNumber = 420;
257
350
  const archive = Fr.random();
258
351
  const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
259
- const proposalId = proposal.archive.toString();
260
352
 
261
353
  const result = await ap.tryAddCheckpointProposal(proposal);
262
354
 
@@ -264,7 +356,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
264
356
  expect(result.alreadyExists).toBe(false);
265
357
  expect(result.count).toBe(1);
266
358
 
267
- const retrievedProposal = await ap.getCheckpointProposal(proposalId);
359
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
268
360
 
269
361
  expect(retrievedProposal).toBeDefined();
270
362
  expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
@@ -281,54 +373,136 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
281
373
  archiveRoot: archive,
282
374
  // No lastBlock
283
375
  });
284
- const proposalId = proposal.archive.toString();
285
376
 
286
377
  // Add the checkpoint core - block extraction is now caller responsibility
287
378
  await ap.tryAddCheckpointProposal(proposal.toCore());
288
379
 
289
380
  // The checkpoint proposal should be stored
290
- const retrievedCheckpointProposal = await ap.getCheckpointProposal(proposalId);
381
+ const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
291
382
  expect(retrievedCheckpointProposal).toBeDefined();
292
383
 
293
384
  // No block proposal was extracted (it had none anyway)
294
- const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
385
+ const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
295
386
  expect(retrievedBlockProposal).toBeUndefined();
296
387
  });
297
388
 
298
389
  it('should return undefined for non-existent checkpoint proposal', async () => {
299
- const nonExistentId = Fr.random().toString();
300
- const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
390
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
301
391
  expect(retrievedProposal).toBeUndefined();
302
392
  });
303
393
 
304
- it('should return alreadyExists when adding proposal with same id', async () => {
394
+ it('should return alreadyExists when re-adding the same signed payload', async () => {
305
395
  const slotNumber = 420;
306
396
  const archive = Fr.random();
307
- const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
308
- const proposalId = proposal1.archive.toString();
397
+ const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
309
398
 
310
- const result1 = await ap.tryAddCheckpointProposal(proposal1);
399
+ const result1 = await ap.tryAddCheckpointProposal(proposal);
311
400
  expect(result1.added).toBe(true);
312
401
  expect(result1.alreadyExists).toBe(false);
313
402
 
314
- // Create a new proposal with same archive but different signer
315
- const proposal2 = await mockCheckpointProposalForPool(signers[1], slotNumber, archive);
316
-
317
- const result2 = await ap.tryAddCheckpointProposal(proposal2);
403
+ // Re-broadcasting the exact same signed payload yields alreadyExists.
404
+ const result2 = await ap.tryAddCheckpointProposal(proposal);
318
405
  expect(result2.added).toBe(false);
319
406
  expect(result2.alreadyExists).toBe(true);
320
407
 
321
- // Should still have the first proposal
322
- const retrievedProposal = await ap.getCheckpointProposal(proposalId);
408
+ // Should still have the first proposal stored at the slot
409
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
323
410
  expect(retrievedProposal).toBeDefined();
324
- expect(retrievedProposal!.toBuffer()).toEqual(proposal1.toBuffer());
411
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
325
412
  expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
326
413
  });
327
414
 
415
+ it('should treat distinct payloads at the same slot as equivocations (count = 2)', async () => {
416
+ const slotNumber = 420;
417
+ // Two proposals at the same slot but with different headers (distinct payloads).
418
+ const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
419
+ const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
420
+
421
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
422
+ expect(result1.added).toBe(true);
423
+ expect(result1.count).toBe(1);
424
+
425
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
426
+ // The second distinct payload is tracked as an equivocation, count goes to 2,
427
+ // and both accepted payloads are retained by payload hash.
428
+ expect(result2.added).toBe(true);
429
+ expect(result2.alreadyExists).toBe(false);
430
+ expect(result2.count).toBe(2);
431
+
432
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
433
+ const expectedProposal = [proposal1, proposal2].sort((a, b) =>
434
+ a.getPayloadHash().localeCompare(b.getPayloadHash()),
435
+ )[0];
436
+ expect(retrievedProposal!.toBuffer()).toEqual(expectedProposal.toBuffer());
437
+
438
+ const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
439
+ expect(proposals.checkpointProposals.map(proposal => proposal.toBuffer())).toEqual(
440
+ expect.arrayContaining([proposal1.toBuffer(), proposal2.toBuffer()]),
441
+ );
442
+ });
443
+
444
+ it('should detect equivocation when only feeAssetPriceModifier differs', async () => {
445
+ const slotNumber = 420;
446
+ const archive = Fr.random();
447
+ // Same checkpoint header + archive, but two different feeAssetPriceModifier values.
448
+ // This is the audit-finding scenario: archive collides but the signed payload differs.
449
+ const sharedHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
450
+ const proposalA = await makeCheckpointProposal({
451
+ signer: signers[0],
452
+ checkpointHeader: sharedHeader,
453
+ archiveRoot: archive,
454
+ feeAssetPriceModifier: 50n,
455
+ });
456
+ const proposalB = await makeCheckpointProposal({
457
+ signer: signers[0],
458
+ checkpointHeader: sharedHeader,
459
+ archiveRoot: archive,
460
+ feeAssetPriceModifier: -50n,
461
+ });
462
+
463
+ const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
464
+ expect(result1.count).toBe(1);
465
+
466
+ const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
467
+ // The fix: archive collision no longer hides the equivocation; payload-hash dedup
468
+ // sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
469
+ expect(result2.added).toBe(true);
470
+ expect(result2.alreadyExists).toBe(false);
471
+ expect(result2.count).toBe(2);
472
+ });
473
+
474
+ it('should delete retained proposals older than a given slot', async () => {
475
+ const oldSlot = 100;
476
+ const newSlot = 200;
477
+ const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
478
+ const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
479
+ const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
480
+ const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
481
+
482
+ await ap.tryAddBlockProposal(oldBlock);
483
+ await ap.tryAddBlockProposal(newBlock);
484
+ await ap.tryAddCheckpointProposal(oldCheckpoint);
485
+ await ap.tryAddCheckpointProposal(newCheckpoint);
486
+
487
+ await ap.deleteOlderThan(SlotNumber(newSlot));
488
+
489
+ expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
490
+ blockProposals: [],
491
+ checkpointProposals: [],
492
+ });
493
+ const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
494
+ expect(newProposals.blockProposals.map(proposal => proposal.toBuffer())).toContainEqual(
495
+ newBlock.withoutSignedTxs().toBuffer(),
496
+ );
497
+ expect(newProposals.checkpointProposals.map(proposal => proposal.toBuffer())).toContainEqual(
498
+ newCheckpoint.toBuffer(),
499
+ );
500
+ });
501
+
328
502
  it('should return added=false when exceeding capacity', async () => {
329
503
  const slotNumber = 420;
330
504
 
331
- // Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
505
+ // Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
332
506
  for (let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++) {
333
507
  const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
334
508
  const result = await ap.tryAddCheckpointProposal(proposal);
@@ -336,7 +510,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
336
510
  expect(result.count).toBe(i + 1);
337
511
  }
338
512
 
339
- // The next proposal should not be added
513
+ // The next proposal should not be added.
340
514
  const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
341
515
  const result = await ap.tryAddCheckpointProposal(extraProposal);
342
516
  expect(result.added).toBe(false);
@@ -446,12 +620,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
446
620
  const result2 = await ap.tryAddBlockProposal(proposal2);
447
621
  expect(result2.count).toBe(2);
448
622
 
449
- // Add a third proposal for same position
623
+ // Third proposal for same position should be rejected (cap is 2)
450
624
  const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
451
625
  const result3 = await ap.tryAddBlockProposal(proposal3);
452
626
 
453
- expect(result3.added).toBe(true);
454
- expect(result3.count).toBe(3);
627
+ expect(result3.added).toBe(false);
628
+ expect(result3.count).toBe(2);
455
629
  });
456
630
 
457
631
  it('should return added=false when exceeding capacity', async () => {
@@ -571,17 +745,17 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
571
745
  await ap.tryAddBlockProposal(newProposal);
572
746
 
573
747
  // Verify both proposals exist
574
- expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeDefined();
575
- expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
748
+ expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
749
+ expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
576
750
 
577
751
  // Delete slots older than newSlot (should delete oldSlot)
578
752
  await ap.deleteOlderThan(SlotNumber(newSlot));
579
753
 
580
754
  // Old proposal should be deleted from storage
581
- expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeUndefined();
755
+ expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
582
756
 
583
757
  // New proposal should still exist
584
- expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
758
+ expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
585
759
  });
586
760
  });
587
761
 
@@ -590,12 +764,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
590
764
  signer: Secp256k1Signer,
591
765
  slotNumber: number,
592
766
  archive: Fr = Fr.random(),
767
+ checkpointHeader?: CheckpointHeader,
593
768
  ): Promise<CheckpointProposalCore> => {
594
- const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
769
+ const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
595
770
  const blockHeader = makeBlockHeader(1);
596
771
  const proposal = await makeCheckpointProposal({
597
772
  signer,
598
- checkpointHeader,
773
+ checkpointHeader: headerToUse,
599
774
  archiveRoot: archive,
600
775
  lastBlock: { blockHeader },
601
776
  });
@@ -666,12 +841,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
666
841
  const result2 = await ap.tryAddCheckpointProposal(proposal2);
667
842
  expect(result2.count).toBe(2);
668
843
 
669
- // Add a third proposal for same slot
844
+ // Third proposal for same slot should be rejected (cap is 2)
670
845
  const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
671
846
  const result3 = await ap.tryAddCheckpointProposal(proposal3);
672
847
 
673
- expect(result3.added).toBe(true);
674
- expect(result3.count).toBe(3);
848
+ expect(result3.added).toBe(false);
849
+ expect(result3.count).toBe(2);
675
850
  });
676
851
 
677
852
  it('should not count attestations as proposals for duplicate detection', async () => {
@@ -3,11 +3,12 @@ import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer'
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
4
  import {
5
5
  CheckpointAttestation,
6
+ CheckpointProposal,
6
7
  ConsensusPayload,
7
- SignatureDomainSeparator,
8
- getHashedSignaturePayloadEthSignedMessage,
8
+ getHashedSignaturePayloadTypedData,
9
9
  } from '@aztec/stdlib/p2p';
10
10
  import { CheckpointHeader } from '@aztec/stdlib/rollup';
11
+ import { TEST_COORDINATION_SIGNATURE_CONTEXT } from '@aztec/stdlib/testing';
11
12
 
12
13
  import { type LocalAccount, generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
13
14
 
@@ -37,15 +38,19 @@ export const mockCheckpointAttestation = (
37
38
  feeAssetPriceModifier: bigint = 0n,
38
39
  ): CheckpointAttestation => {
39
40
  header = header ?? CheckpointHeader.random({ slotNumber: SlotNumber(slot) });
40
- const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier);
41
+ const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier, TEST_COORDINATION_SIGNATURE_CONTEXT);
41
42
 
42
- const attestationHash = getHashedSignaturePayloadEthSignedMessage(
43
- payload,
44
- SignatureDomainSeparator.checkpointAttestation,
45
- );
43
+ const attestationHash = getHashedSignaturePayloadTypedData(payload);
46
44
  const attestationSignature = signer.sign(attestationHash);
47
45
 
48
- const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.checkpointProposal);
46
+ const proposal = new CheckpointProposal(
47
+ header,
48
+ archive,
49
+ feeAssetPriceModifier,
50
+ attestationSignature,
51
+ TEST_COORDINATION_SIGNATURE_CONTEXT,
52
+ );
53
+ const proposalHash = getHashedSignaturePayloadTypedData(proposal);
49
54
  const proposerSignature = signer.sign(proposalHash);
50
55
 
51
56
  return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
@@ -1,6 +1,3 @@
1
1
  export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
2
2
  export { type MemPools } from './interface.js';
3
- // Old TxPool exports - kept temporarily for external consumers
4
- export { type TxPool } from './tx_pool/tx_pool.js';
5
- // New TxPoolV2 exports
6
3
  export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
@@ -1,5 +1,4 @@
1
1
  import type { Gossipable } from '@aztec/stdlib/p2p';
2
- import type { Tx } from '@aztec/stdlib/tx';
3
2
  import {
4
3
  Attributes,
5
4
  type BatchObservableResult,
@@ -100,7 +99,11 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
100
99
 
101
100
  this.addObjectCounter = createUpDownCounterWithDefault(this.meter, metricsLabels.itemsAdded);
102
101
 
103
- this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay);
102
+ this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay, {
103
+ advice: {
104
+ explicitBucketBoundaries: [100, 500, 1000, 5000, 10000, 30000, 60000, 300000, 600000, 1800000, 3600000],
105
+ },
106
+ });
104
107
 
105
108
  this.meter.addBatchObservableCallback(this.observeStats, [this.objectsInMempool]);
106
109
  }
@@ -113,16 +116,6 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
113
116
  this.addObjectCounter.add(count);
114
117
  }
115
118
 
116
- public transactionsAdded(transactions: Tx[]) {
117
- transactions.forEach(tx => this.trackMempoolItemAdded(tx.txHash.toBigInt()));
118
- }
119
-
120
- public transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>) {
121
- for (const hash of hashes) {
122
- this.trackMempoolItemRemoved(BigInt(hash));
123
- }
124
- }
125
-
126
119
  public trackMempoolItemAdded(key: bigint | string): void {
127
120
  this.mempoolItemAddedTimestamp.set(key, Date.now());
128
121
  }
@@ -138,6 +131,19 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
138
131
  }
139
132
  }
140
133
 
134
+ /**
135
+ * Records a pre-computed pending-to-mined delay directly, bypassing the
136
+ * `mempoolItemAddedTimestamp` map. Used by the tx pool, which derives the
137
+ * delay from the persisted `receivedAt` on tx metadata at the mined
138
+ * transition — more accurate than the add/remove map (which also fires on
139
+ * eviction) and resilient to the caller not having tracked the add.
140
+ */
141
+ public recordMinedDelay(delayMs: number): void {
142
+ if (delayMs > 0) {
143
+ this.minedDelay.record(delayMs);
144
+ }
145
+ }
146
+
141
147
  private observeStats = async (observer: BatchObservableResult) => {
142
148
  const { itemCount } = await this.poolStats();
143
149
  if (typeof itemCount === 'number') {