@aztec/p2p 0.0.1-fake-c83136db25 → 0.0.2-commit.217f559981

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 (597) 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 +7 -6
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +53 -15
  7. package/dest/client/index.d.ts +1 -1
  8. package/dest/client/interface.d.ts +58 -23
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +51 -74
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +613 -264
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  19. package/dest/config.d.ts +95 -64
  20. package/dest/config.d.ts.map +1 -1
  21. package/dest/config.js +42 -21
  22. package/dest/enr/generate-enr.d.ts +1 -1
  23. package/dest/enr/index.d.ts +1 -1
  24. package/dest/errors/attestation-pool.error.d.ts +7 -0
  25. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  26. package/dest/errors/attestation-pool.error.js +12 -0
  27. package/dest/errors/reqresp.error.d.ts +1 -1
  28. package/dest/errors/reqresp.error.d.ts.map +1 -1
  29. package/dest/errors/tx-pool.error.d.ts +8 -0
  30. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  31. package/dest/errors/tx-pool.error.js +9 -0
  32. package/dest/index.d.ts +2 -1
  33. package/dest/index.d.ts.map +1 -1
  34. package/dest/index.js +1 -0
  35. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +117 -45
  36. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  37. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  38. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  39. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  40. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +530 -257
  41. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  42. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  43. package/dest/mem_pools/attestation_pool/index.js +1 -2
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
  45. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  46. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  47. package/dest/mem_pools/index.d.ts +3 -2
  48. package/dest/mem_pools/index.d.ts.map +1 -1
  49. package/dest/mem_pools/index.js +1 -1
  50. package/dest/mem_pools/instrumentation.d.ts +9 -1
  51. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  52. package/dest/mem_pools/instrumentation.js +37 -10
  53. package/dest/mem_pools/interface.d.ts +6 -7
  54. package/dest/mem_pools/interface.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +34 -58
  56. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +320 -335
  58. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  59. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  61. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  62. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  64. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  65. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  67. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  68. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  70. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  71. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  73. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  74. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  76. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  77. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  79. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  80. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool/index.js +0 -1
  82. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  83. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool/priority.js +6 -1
  85. package/dest/mem_pools/tx_pool/tx_pool.d.ts +17 -6
  86. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  87. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  88. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  89. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
  90. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  91. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  93. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  94. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  96. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  97. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  102. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  103. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  105. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  106. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
  108. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  109. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  111. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  112. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  114. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  115. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  116. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  117. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  118. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  119. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  120. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  121. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  122. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  123. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  124. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  125. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  126. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  127. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  128. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  129. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  130. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  131. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  132. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  133. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  134. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  135. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
  136. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  137. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  138. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +97 -0
  139. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  140. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +152 -0
  141. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  142. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  143. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  144. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  145. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  146. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
  147. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  148. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  149. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  150. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  151. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  152. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +896 -0
  153. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -6
  154. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  155. package/dest/msg_validators/attestation_validator/attestation_validator.js +57 -24
  156. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  157. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  158. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
  159. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  160. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  161. package/dest/msg_validators/attestation_validator/index.js +1 -0
  162. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  163. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  164. package/dest/msg_validators/clock_tolerance.js +37 -0
  165. package/dest/msg_validators/index.d.ts +2 -2
  166. package/dest/msg_validators/index.d.ts.map +1 -1
  167. package/dest/msg_validators/index.js +1 -1
  168. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  169. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  170. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  171. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  172. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  173. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  174. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  175. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  176. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  177. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  178. package/dest/msg_validators/proposal_validator/index.js +3 -0
  179. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  180. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  181. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  182. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  183. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  184. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  185. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  186. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  187. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  188. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  189. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  190. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  191. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  192. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  193. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  194. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  195. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  196. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  197. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  198. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  199. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  200. package/dest/msg_validators/tx_validator/factory.d.ts +10 -4
  201. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  202. package/dest/msg_validators/tx_validator/factory.js +22 -12
  203. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  204. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  205. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  206. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  207. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  208. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  209. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  210. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  211. package/dest/msg_validators/tx_validator/index.js +1 -0
  212. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  213. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  214. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  215. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  216. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  217. package/dest/msg_validators/tx_validator/phases_validator.js +6 -4
  218. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  219. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  220. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  221. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  222. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  223. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
  224. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  225. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  226. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  227. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  228. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  229. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  230. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  231. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  232. package/dest/services/data_store.d.ts +1 -1
  233. package/dest/services/data_store.d.ts.map +1 -1
  234. package/dest/services/data_store.js +10 -6
  235. package/dest/services/discv5/discV5_service.d.ts +1 -1
  236. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  237. package/dest/services/discv5/discV5_service.js +1 -1
  238. package/dest/services/dummy_service.d.ts +28 -3
  239. package/dest/services/dummy_service.d.ts.map +1 -1
  240. package/dest/services/dummy_service.js +51 -0
  241. package/dest/services/encoding.d.ts +25 -4
  242. package/dest/services/encoding.d.ts.map +1 -1
  243. package/dest/services/encoding.js +76 -6
  244. package/dest/services/gossipsub/index.d.ts +3 -0
  245. package/dest/services/gossipsub/index.d.ts.map +1 -0
  246. package/dest/services/gossipsub/index.js +2 -0
  247. package/dest/services/gossipsub/scoring.d.ts +21 -3
  248. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  249. package/dest/services/gossipsub/scoring.js +24 -7
  250. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  251. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  252. package/dest/services/gossipsub/topic_score_params.js +346 -0
  253. package/dest/services/index.d.ts +2 -1
  254. package/dest/services/index.d.ts.map +1 -1
  255. package/dest/services/index.js +1 -0
  256. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  257. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  258. package/dest/services/libp2p/instrumentation.js +36 -71
  259. package/dest/services/libp2p/libp2p_service.d.ts +116 -92
  260. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  261. package/dest/services/libp2p/libp2p_service.js +1153 -267
  262. package/dest/services/peer-manager/interface.d.ts +1 -1
  263. package/dest/services/peer-manager/metrics.d.ts +9 -2
  264. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  265. package/dest/services/peer-manager/metrics.js +39 -16
  266. package/dest/services/peer-manager/peer_manager.d.ts +2 -33
  267. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  268. package/dest/services/peer-manager/peer_manager.js +6 -12
  269. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  270. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  271. package/dest/services/peer-manager/peer_scoring.js +68 -4
  272. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
  273. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  274. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +562 -0
  275. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  276. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  277. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  278. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
  279. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  280. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  281. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
  282. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  283. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
  284. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  285. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  286. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  287. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  288. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  289. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  290. package/dest/services/reqresp/config.d.ts +1 -1
  291. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  292. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  293. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  294. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -4
  295. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  296. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  297. package/dest/services/reqresp/constants.d.ts +12 -0
  298. package/dest/services/reqresp/constants.d.ts.map +1 -0
  299. package/dest/services/reqresp/constants.js +7 -0
  300. package/dest/services/reqresp/index.d.ts +1 -1
  301. package/dest/services/reqresp/interface.d.ts +13 -2
  302. package/dest/services/reqresp/interface.d.ts.map +1 -1
  303. package/dest/services/reqresp/interface.js +16 -2
  304. package/dest/services/reqresp/metrics.d.ts +6 -5
  305. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  306. package/dest/services/reqresp/metrics.js +17 -21
  307. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  308. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  309. package/dest/services/reqresp/protocols/auth.js +2 -2
  310. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  311. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  312. package/dest/services/reqresp/protocols/block.js +3 -2
  313. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  314. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  315. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  316. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  317. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  318. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  319. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +30 -9
  320. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  321. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +60 -14
  322. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  323. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  324. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  325. package/dest/services/reqresp/protocols/index.d.ts +1 -1
  326. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  327. package/dest/services/reqresp/protocols/status.d.ts +6 -5
  328. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  329. package/dest/services/reqresp/protocols/status.js +7 -3
  330. package/dest/services/reqresp/protocols/tx.d.ts +8 -3
  331. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  332. package/dest/services/reqresp/protocols/tx.js +20 -0
  333. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  334. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
  335. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  336. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  337. package/dest/services/reqresp/reqresp.d.ts +6 -41
  338. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  339. package/dest/services/reqresp/reqresp.js +472 -51
  340. package/dest/services/reqresp/status.d.ts +2 -2
  341. package/dest/services/reqresp/status.d.ts.map +1 -1
  342. package/dest/services/service.d.ts +55 -3
  343. package/dest/services/service.d.ts.map +1 -1
  344. package/dest/services/tx_collection/config.d.ts +22 -1
  345. package/dest/services/tx_collection/config.d.ts.map +1 -1
  346. package/dest/services/tx_collection/config.js +56 -2
  347. package/dest/services/tx_collection/fast_tx_collection.d.ts +10 -12
  348. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  349. package/dest/services/tx_collection/fast_tx_collection.js +71 -44
  350. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  351. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  352. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  353. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  354. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  355. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  356. package/dest/services/tx_collection/index.d.ts +3 -1
  357. package/dest/services/tx_collection/index.d.ts.map +1 -1
  358. package/dest/services/tx_collection/index.js +2 -0
  359. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  360. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  361. package/dest/services/tx_collection/instrumentation.js +11 -13
  362. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  363. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  364. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  365. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  366. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  367. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  368. package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -6
  369. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  370. package/dest/services/tx_collection/slow_tx_collection.js +61 -26
  371. package/dest/services/tx_collection/tx_collection.d.ts +31 -18
  372. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  373. package/dest/services/tx_collection/tx_collection.js +79 -7
  374. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  375. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  376. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  377. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  378. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  379. package/dest/services/tx_collection/tx_source.js +19 -2
  380. package/dest/services/tx_file_store/config.d.ts +16 -0
  381. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  382. package/dest/services/tx_file_store/config.js +22 -0
  383. package/dest/services/tx_file_store/index.d.ts +4 -0
  384. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  385. package/dest/services/tx_file_store/index.js +3 -0
  386. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  387. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  388. package/dest/services/tx_file_store/instrumentation.js +29 -0
  389. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  390. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  391. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  392. package/dest/services/tx_provider.d.ts +6 -4
  393. package/dest/services/tx_provider.d.ts.map +1 -1
  394. package/dest/services/tx_provider.js +16 -6
  395. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  396. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  397. package/dest/services/tx_provider_instrumentation.js +14 -14
  398. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  399. package/dest/test-helpers/get-ports.d.ts +1 -1
  400. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  401. package/dest/test-helpers/index.d.ts +3 -1
  402. package/dest/test-helpers/index.d.ts.map +1 -1
  403. package/dest/test-helpers/index.js +2 -0
  404. package/dest/test-helpers/make-enrs.d.ts +1 -1
  405. package/dest/test-helpers/make-test-p2p-clients.d.ts +4 -4
  406. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  407. package/dest/test-helpers/mock-pubsub.d.ts +31 -4
  408. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  409. package/dest/test-helpers/mock-pubsub.js +103 -2
  410. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  411. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  412. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  413. package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
  414. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  415. package/dest/test-helpers/reqresp-nodes.js +2 -1
  416. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  417. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  418. package/dest/test-helpers/test_tx_provider.js +41 -0
  419. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  420. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  421. package/dest/test-helpers/testbench-utils.js +366 -0
  422. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  423. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  424. package/dest/testbench/p2p_client_testbench_worker.js +221 -120
  425. package/dest/testbench/parse_log_file.d.ts +1 -1
  426. package/dest/testbench/testbench.d.ts +1 -1
  427. package/dest/testbench/worker_client_manager.d.ts +51 -6
  428. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  429. package/dest/testbench/worker_client_manager.js +226 -39
  430. package/dest/types/index.d.ts +1 -1
  431. package/dest/util.d.ts +3 -2
  432. package/dest/util.d.ts.map +1 -1
  433. package/dest/util.js +11 -2
  434. package/dest/versioning.d.ts +1 -1
  435. package/package.json +19 -18
  436. package/src/bootstrap/bootstrap.ts +7 -4
  437. package/src/client/factory.ts +98 -31
  438. package/src/client/interface.ts +77 -23
  439. package/src/client/p2p_client.ts +291 -309
  440. package/src/client/test/tx_proposal_collector/README.md +227 -0
  441. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +346 -0
  442. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  443. package/src/config.ts +77 -30
  444. package/src/errors/attestation-pool.error.ts +13 -0
  445. package/src/errors/tx-pool.error.ts +12 -0
  446. package/src/index.ts +1 -0
  447. package/src/mem_pools/attestation_pool/attestation_pool.ts +518 -45
  448. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +618 -276
  449. package/src/mem_pools/attestation_pool/index.ts +9 -2
  450. package/src/mem_pools/attestation_pool/mocks.ts +22 -15
  451. package/src/mem_pools/index.ts +4 -1
  452. package/src/mem_pools/instrumentation.ts +48 -10
  453. package/src/mem_pools/interface.ts +5 -7
  454. package/src/mem_pools/tx_pool/README.md +270 -0
  455. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +372 -371
  456. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  457. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  458. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  459. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  460. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  461. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  462. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  463. package/src/mem_pools/tx_pool/index.ts +0 -1
  464. package/src/mem_pools/tx_pool/priority.ts +8 -1
  465. package/src/mem_pools/tx_pool/tx_pool.ts +18 -5
  466. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
  467. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  468. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  469. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  470. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  471. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  472. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  473. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
  474. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  475. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  476. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  477. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  478. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  479. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  480. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  481. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  482. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  483. package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
  484. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +242 -0
  485. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  486. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  487. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  488. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1069 -0
  489. package/src/msg_validators/attestation_validator/attestation_validator.ts +45 -32
  490. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
  491. package/src/msg_validators/attestation_validator/index.ts +1 -0
  492. package/src/msg_validators/clock_tolerance.ts +51 -0
  493. package/src/msg_validators/index.ts +1 -1
  494. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  495. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  496. package/src/msg_validators/proposal_validator/index.ts +3 -0
  497. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  498. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  499. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  500. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  501. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  502. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  503. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  504. package/src/msg_validators/tx_validator/factory.ts +67 -25
  505. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  506. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  507. package/src/msg_validators/tx_validator/index.ts +1 -0
  508. package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
  509. package/src/msg_validators/tx_validator/phases_validator.ts +8 -4
  510. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  511. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  512. package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
  513. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  514. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  515. package/src/services/data_store.ts +10 -7
  516. package/src/services/discv5/discV5_service.ts +1 -1
  517. package/src/services/dummy_service.ts +68 -1
  518. package/src/services/encoding.ts +83 -6
  519. package/src/services/gossipsub/README.md +641 -0
  520. package/src/services/gossipsub/index.ts +2 -0
  521. package/src/services/gossipsub/scoring.ts +29 -5
  522. package/src/services/gossipsub/topic_score_params.ts +487 -0
  523. package/src/services/index.ts +1 -0
  524. package/src/services/libp2p/instrumentation.ts +39 -71
  525. package/src/services/libp2p/libp2p_service.ts +865 -277
  526. package/src/services/peer-manager/metrics.ts +44 -16
  527. package/src/services/peer-manager/peer_manager.ts +7 -4
  528. package/src/services/peer-manager/peer_scoring.ts +70 -3
  529. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  530. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  531. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  532. package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
  533. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
  534. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  535. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  536. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  537. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  538. package/src/services/reqresp/constants.ts +14 -0
  539. package/src/services/reqresp/interface.ts +30 -2
  540. package/src/services/reqresp/metrics.ts +36 -27
  541. package/src/services/reqresp/protocols/auth.ts +2 -2
  542. package/src/services/reqresp/protocols/block.ts +3 -2
  543. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  544. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  545. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +75 -10
  546. package/src/services/reqresp/protocols/status.ts +16 -12
  547. package/src/services/reqresp/protocols/tx.ts +23 -2
  548. package/src/services/reqresp/reqresp.ts +80 -23
  549. package/src/services/service.ts +72 -4
  550. package/src/services/tx_collection/config.ts +84 -2
  551. package/src/services/tx_collection/fast_tx_collection.ts +96 -49
  552. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  553. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  554. package/src/services/tx_collection/index.ts +6 -0
  555. package/src/services/tx_collection/instrumentation.ts +11 -13
  556. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  557. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  558. package/src/services/tx_collection/slow_tx_collection.ts +70 -36
  559. package/src/services/tx_collection/tx_collection.ts +122 -24
  560. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  561. package/src/services/tx_collection/tx_source.ts +22 -3
  562. package/src/services/tx_file_store/config.ts +37 -0
  563. package/src/services/tx_file_store/index.ts +3 -0
  564. package/src/services/tx_file_store/instrumentation.ts +36 -0
  565. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  566. package/src/services/tx_provider.ts +27 -10
  567. package/src/services/tx_provider_instrumentation.ts +24 -14
  568. package/src/test-helpers/index.ts +2 -0
  569. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  570. package/src/test-helpers/mock-pubsub.ts +144 -4
  571. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  572. package/src/test-helpers/reqresp-nodes.ts +3 -2
  573. package/src/test-helpers/test_tx_provider.ts +64 -0
  574. package/src/test-helpers/testbench-utils.ts +430 -0
  575. package/src/testbench/p2p_client_testbench_worker.ts +349 -117
  576. package/src/testbench/worker_client_manager.ts +304 -42
  577. package/src/util.ts +19 -3
  578. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -28
  579. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  580. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -174
  581. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -23
  582. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  583. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -175
  584. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -79
  585. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  586. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -232
  587. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  588. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  589. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -70
  590. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  591. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  592. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  593. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -235
  594. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -225
  595. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -278
  596. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
  597. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,21 +1,21 @@
1
- import { Secp256k1Signer } from '@aztec/foundation/crypto';
2
- import { Fr } from '@aztec/foundation/fields';
3
- import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
1
+ import { IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore } from '@aztec/stdlib/p2p';
5
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
4
6
  import {
5
- BlockProposal as BlockProposalClass,
6
- ConsensusPayload,
7
- SignatureDomainSeparator,
8
- getHashedSignaturePayloadEthSignedMessage,
9
- } from '@aztec/stdlib/p2p';
10
- import { makeL2BlockHeader } from '@aztec/stdlib/testing';
11
- import { TxHash } from '@aztec/stdlib/tx';
7
+ makeBlockHeader,
8
+ makeBlockProposal,
9
+ makeCheckpointHeader,
10
+ makeCheckpointProposal,
11
+ } from '@aztec/stdlib/testing';
12
12
 
13
- import { jest } from '@jest/globals';
14
- import { type MockProxy, mock } from 'jest-mock-extended';
15
-
16
- import type { PoolInstrumentation } from '../instrumentation.js';
17
- import type { AttestationPool } from './attestation_pool.js';
18
- import { mockAttestation } from './mocks.js';
13
+ import {
14
+ type AttestationPool,
15
+ MAX_BLOCK_PROPOSALS_PER_POSITION,
16
+ MAX_CHECKPOINT_PROPOSALS_PER_SLOT,
17
+ } from './attestation_pool.js';
18
+ import { mockCheckpointAttestation } from './mocks.js';
19
19
 
20
20
  const NUMBER_OF_SIGNERS_PER_TEST = 4;
21
21
 
@@ -23,243 +23,179 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
23
23
  let ap: AttestationPool;
24
24
  let signers: Secp256k1Signer[];
25
25
 
26
- // Check that metrics are recorded correctly
27
- let metricsMock: MockProxy<PoolInstrumentation<BlockAttestation>>;
28
-
29
26
  beforeEach(() => {
30
27
  ap = getAttestationPool();
31
28
  signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
32
-
33
- metricsMock = mock<PoolInstrumentation<BlockAttestation>>();
34
- // Can i overwrite this like this??
35
- (ap as any).metrics = metricsMock;
36
29
  });
37
30
 
38
- const createAttestationsForSlot = (slotNumber: number) => {
39
- const archive = Fr.random();
40
- return signers.map(signer => mockAttestation(signer, slotNumber, archive));
31
+ const createCheckpointAttestationsForSlot = (slotNumber: number, archive?: Fr) => {
32
+ const archiveToUse = archive ?? Fr.random();
33
+ return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse));
41
34
  };
42
35
 
43
- const mockBlockProposal = (signer: Secp256k1Signer, slotNumber: number, archive: Fr = Fr.random()): BlockProposal => {
44
- const header = makeL2BlockHeader(1, 2, slotNumber);
45
- const payload = new ConsensusPayload(header.toCheckpointHeader(), archive, header.state);
46
-
47
- const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
48
- const signature = signer.sign(hash);
49
-
50
- const txHashes = [TxHash.random(), TxHash.random()]; // Mock tx hashes
51
-
52
- return new BlockProposalClass(payload, signature, txHashes);
36
+ const mockBlockProposalForPool = (
37
+ signer: Secp256k1Signer,
38
+ slotNumber: number,
39
+ archive: Fr = Fr.random(),
40
+ ): Promise<BlockProposal> => {
41
+ const header = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
42
+ return makeBlockProposal({
43
+ signer,
44
+ blockHeader: header,
45
+ archiveRoot: archive,
46
+ });
53
47
  };
54
48
 
55
- // We compare buffers as the objects can have cached values attached to them which are not serialised
56
- // using array containing as the kv store does not respect insertion order
57
- const compareAttestations = (a1: BlockAttestation[], a2: BlockAttestation[]) => {
49
+ // Compare checkpoint attestations buffers
50
+ // Using array containing as the kv store does not respect insertion order
51
+ const compareCheckpointAttestations = (a1: CheckpointAttestation[], a2: CheckpointAttestation[]) => {
58
52
  const a1Buffer = a1.map(attestation => attestation.toBuffer());
59
53
  const a2Buffer = a2.map(attestation => attestation.toBuffer());
60
54
  expect(a1Buffer.length).toBe(a2Buffer.length);
61
55
  expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
62
56
  };
63
57
 
64
- it('should add attestations to pool', async () => {
65
- const slotNumber = 420;
66
- const archive = Fr.random();
67
- const attestations = signers.slice(0, -1).map(signer => mockAttestation(signer, slotNumber, archive));
68
-
69
- await ap.addAttestations(attestations);
70
-
71
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
72
- expect(retrievedAttestations.length).toBe(attestations.length);
73
- compareAttestations(retrievedAttestations, attestations);
74
-
75
- const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(BigInt(slotNumber));
76
- expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
77
- compareAttestations(retrievedAttestationsForSlot, attestations);
78
-
79
- // Add another one
80
- const newAttestation = mockAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
81
- await ap.addAttestations([newAttestation]);
82
- const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(
83
- BigInt(slotNumber),
84
- archive.toString(),
85
- );
86
- expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
87
- compareAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
88
- const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(BigInt(slotNumber));
89
- expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
90
- compareAttestations(retrievedAttestationsForSlotAfterAdd, [...attestations, newAttestation]);
91
-
92
- // Delete by slot
93
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
94
-
95
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
96
- BigInt(slotNumber),
97
- archive.toString(),
98
- );
99
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
100
- });
101
-
102
- it('should handle duplicate proposals in a slot', async () => {
103
- const slotNumber = 420;
104
- const archive = Fr.random();
105
-
106
- // Use the same signer for all attestations
107
- const attestations: BlockAttestation[] = [];
108
- const signer = signers[0];
109
- for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
110
- attestations.push(mockAttestation(signer, slotNumber, archive));
111
- }
112
-
113
- // Add them to store and check we end up with only one
114
- await ap.addAttestations(attestations);
115
-
116
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
117
- expect(retreivedAttestations.length).toBe(1);
118
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
119
- expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
120
-
121
- // Try adding them on another operation and check they are still not duplicated
122
- await ap.addAttestations([attestations[0]]);
123
- expect(await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString())).toHaveLength(1);
124
- });
125
-
126
- it('should store attestations by differing slot', async () => {
127
- const slotNumbers = [1, 2, 3, 4];
128
- const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i]));
129
-
130
- await ap.addAttestations(attestations);
131
-
132
- for (const attestation of attestations) {
133
- const slot = attestation.payload.header.slotNumber;
134
- const archive = attestation.archive.toString();
135
-
136
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), archive);
137
- expect(retreivedAttestations.length).toBe(1);
138
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
139
- expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
140
- }
141
- });
142
-
143
- it('should store attestations by differing slot and archive', async () => {
144
- const slotNumbers = [1, 1, 2, 3];
145
- const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()];
146
- const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i]));
147
-
148
- await ap.addAttestations(attestations);
149
-
150
- for (const attestation of attestations) {
151
- const slot = attestation.payload.header.slotNumber;
152
- const proposalId = attestation.archive.toString();
58
+ describe('CheckpointAttestation', () => {
59
+ it('should add attestations to pool', async () => {
60
+ const slotNumber = 420;
61
+ const archive = Fr.random();
62
+ const attestations = signers.slice(0, -1).map(signer => mockCheckpointAttestation(signer, slotNumber, archive));
63
+
64
+ await ap.addOwnCheckpointAttestations(attestations);
65
+
66
+ const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
67
+ SlotNumber(slotNumber),
68
+ archive.toString(),
69
+ );
70
+ expect(retrievedAttestations.length).toBe(attestations.length);
71
+ compareCheckpointAttestations(retrievedAttestations, attestations);
72
+
73
+ const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
74
+ expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
75
+ compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
76
+
77
+ // Add another one
78
+ const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
79
+ await ap.addOwnCheckpointAttestations([newAttestation]);
80
+ const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(
81
+ SlotNumber(slotNumber),
82
+ archive.toString(),
83
+ );
84
+ expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
85
+ compareCheckpointAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
86
+ const retrievedAttestationsForSlotAfterAdd = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
87
+ expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
88
+ compareCheckpointAttestations(retrievedAttestationsForSlotAfterAdd, [...attestations, newAttestation]);
89
+
90
+ // Delete by slot
91
+ await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
92
+
93
+ const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
94
+ SlotNumber(slotNumber),
95
+ archive.toString(),
96
+ );
97
+ expect(retreivedAttestationsAfterDelete.length).toBe(0);
98
+ });
153
99
 
154
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), proposalId);
100
+ it('should handle duplicate proposals in a slot', async () => {
101
+ const slotNumber = 420;
102
+ const archive = Fr.random();
103
+ const header = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
104
+
105
+ // Use the same signer and header for all attestations
106
+ const attestations: CheckpointAttestation[] = [];
107
+ const signer = signers[0];
108
+ for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
109
+ attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
110
+ }
111
+
112
+ // Add them to store and check we end up with only one
113
+ await ap.addOwnCheckpointAttestations(attestations);
114
+
115
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
116
+ SlotNumber(slotNumber),
117
+ archive.toString(),
118
+ );
155
119
  expect(retreivedAttestations.length).toBe(1);
156
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
157
- expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
158
- }
159
- });
160
-
161
- it('should delete attestations', async () => {
162
- const slotNumber = 420;
163
- const archive = Fr.random();
164
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
165
- const proposalId = attestations[0].archive.toString();
166
-
167
- await ap.addAttestations(attestations);
168
-
169
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
170
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
171
- compareAttestations(retreivedAttestations, attestations);
172
-
173
- await ap.deleteAttestations(attestations);
174
-
175
- const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
176
- expect(gottenAfterDelete.length).toBe(0);
177
- });
178
-
179
- it('should blanket delete attestations per slot', async () => {
180
- const slotNumber = 420;
181
- const archive = Fr.random();
182
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
183
- const proposalId = attestations[0].archive.toString();
184
-
185
- await ap.addAttestations(attestations);
186
-
187
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
188
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
189
- compareAttestations(retreivedAttestations, attestations);
190
-
191
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
192
-
193
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
194
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
195
- });
196
-
197
- it('should blanket delete attestations per slot and proposal', async () => {
198
- const slotNumber = 420;
199
- const archive = Fr.random();
200
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
201
- const proposalId = attestations[0].archive.toString();
120
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
121
+ expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
122
+
123
+ // Try adding them on another operation and check they are still not duplicated
124
+ await ap.addOwnCheckpointAttestations([attestations[0]]);
125
+ expect(
126
+ await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString()),
127
+ ).toHaveLength(1);
128
+ });
202
129
 
203
- // Add another set of attestations with a different proposalId, yet the same slot
204
- const archive2 = Fr.random();
205
- const attestations2 = signers.map(signer => mockAttestation(signer, slotNumber, archive2));
206
- const proposalId2 = attestations2[0].archive.toString();
130
+ it('should store attestations by differing slot', async () => {
131
+ const slotNumbers = [1, 2, 3, 4];
132
+ const attestations = signers.map((signer, i) => mockCheckpointAttestation(signer, slotNumbers[i]));
207
133
 
208
- await ap.addAttestations(attestations);
209
- await ap.addAttestations(attestations2);
134
+ await ap.addOwnCheckpointAttestations(attestations);
210
135
 
211
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
212
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
213
- compareAttestations(retreivedAttestations, attestations);
136
+ for (const attestation of attestations) {
137
+ const slot = attestation.payload.header.slotNumber;
138
+ const archive = attestation.archive.toString();
214
139
 
215
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
140
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, archive);
141
+ expect(retreivedAttestations.length).toBe(1);
142
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
143
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
144
+ }
145
+ });
216
146
 
217
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
218
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
147
+ it('should store attestations by differing slot and archive', async () => {
148
+ const slotNumbers = [1, 1, 2, 3];
149
+ const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()];
150
+ const attestations = signers.map((signer, i) => mockCheckpointAttestation(signer, slotNumbers[i], archives[i]));
219
151
 
220
- const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(
221
- BigInt(slotNumber),
222
- proposalId2,
223
- );
224
- expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
225
- compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
226
- });
152
+ await ap.addOwnCheckpointAttestations(attestations);
227
153
 
228
- it('should delete attestations older than a given slot', async () => {
229
- const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
230
- const attestations = (
231
- await Promise.all(slotNumbers.map(slotNumber => createAttestationsForSlot(slotNumber)))
232
- ).flat();
233
- const proposalId = attestations[0].archive.toString();
154
+ for (const attestation of attestations) {
155
+ const slot = attestation.payload.header.slotNumber;
156
+ const proposalId = attestation.archive.toString();
234
157
 
235
- await ap.addAttestations(attestations);
158
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, proposalId);
159
+ expect(retreivedAttestations.length).toBe(1);
160
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
161
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
162
+ }
163
+ });
236
164
 
237
- const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
238
- expect(attestationsForSlot1.length).toBe(signers.length);
165
+ it('should delete attestations older than a given slot', async () => {
166
+ 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();
239
171
 
240
- const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
172
+ await ap.addOwnCheckpointAttestations(attestations);
241
173
 
242
- await ap.deleteAttestationsOlderThan(BigInt(73));
174
+ const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
175
+ expect(attestationsForSlot1.length).toBe(signers.length);
243
176
 
244
- const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
245
- expect(attestationsForSlot1AfterDelete.length).toBe(0);
177
+ await ap.deleteOlderThan(SlotNumber(73));
246
178
 
247
- expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
248
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1));
249
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2));
250
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3));
251
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69));
252
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72));
179
+ const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
180
+ SlotNumber(1),
181
+ proposalId,
182
+ );
183
+ expect(attestationsForSlot1AfterDelete.length).toBe(0);
184
+ });
253
185
  });
254
186
 
255
187
  describe('BlockProposal in attestation pool', () => {
256
188
  it('should add and retrieve block proposal', async () => {
257
189
  const slotNumber = 420;
258
190
  const archive = Fr.random();
259
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
191
+ const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
260
192
  const proposalId = proposal.archive.toString();
261
193
 
262
- await ap.addBlockProposal(proposal);
194
+ const result = await ap.tryAddBlockProposal(proposal);
195
+
196
+ expect(result.added).toBe(true);
197
+ expect(result.alreadyExists).toBe(false);
198
+ expect(result.count).toBe(1);
263
199
 
264
200
  const retrievedProposal = await ap.getBlockProposal(proposalId);
265
201
 
@@ -273,107 +209,513 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
273
209
  expect(retrievedProposal).toBeUndefined();
274
210
  });
275
211
 
276
- it('should update block proposal if added twice with same id', async () => {
212
+ it('should return alreadyExists when adding proposal with same id', async () => {
277
213
  const slotNumber = 420;
278
214
  const archive = Fr.random();
279
- const proposal1 = mockBlockProposal(signers[0], slotNumber, archive);
215
+ const proposal1 = await mockBlockProposalForPool(signers[0], slotNumber, archive);
280
216
  const proposalId = proposal1.archive.toString();
281
217
 
282
- await ap.addBlockProposal(proposal1);
218
+ const result1 = await ap.tryAddBlockProposal(proposal1);
219
+ expect(result1.added).toBe(true);
220
+ expect(result1.alreadyExists).toBe(false);
283
221
 
284
222
  // Create a new proposal with same archive but different signer
285
- const proposal2 = mockBlockProposal(signers[1], slotNumber, archive);
223
+ const proposal2 = await mockBlockProposalForPool(signers[1], slotNumber, archive);
286
224
 
287
- await ap.addBlockProposal(proposal2);
225
+ const result2 = await ap.tryAddBlockProposal(proposal2);
226
+ expect(result2.added).toBe(false);
227
+ expect(result2.alreadyExists).toBe(true);
288
228
 
229
+ // Should still have the first proposal
289
230
  const retrievedProposal = await ap.getBlockProposal(proposalId);
290
231
  expect(retrievedProposal).toBeDefined();
291
- // Should have the second proposal
292
- expect(retrievedProposal!.toBuffer()).toEqual(proposal2.toBuffer());
293
- expect(retrievedProposal!.getSender()?.toString()).toBe(signers[1].address.toString());
232
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal1.toBuffer());
233
+ expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
294
234
  });
235
+ });
295
236
 
296
- it('should handle block proposals with different slots and same archive', async () => {
237
+ describe('CheckpointProposal in attestation pool', () => {
238
+ const mockCheckpointProposalForPool = async (
239
+ signer: Secp256k1Signer,
240
+ slotNumber: number,
241
+ archive: Fr = Fr.random(),
242
+ ): Promise<CheckpointProposalCore> => {
243
+ const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
244
+ const blockHeader = makeBlockHeader(1);
245
+ const proposal = await makeCheckpointProposal({
246
+ signer,
247
+ checkpointHeader,
248
+ archiveRoot: archive,
249
+ lastBlock: { blockHeader },
250
+ });
251
+ // Return the core version since tryAddCheckpointProposal now takes CheckpointProposalCore
252
+ return proposal.toCore();
253
+ };
254
+
255
+ it('should add and retrieve checkpoint proposal', async () => {
256
+ const slotNumber = 420;
297
257
  const archive = Fr.random();
298
- const proposal1 = mockBlockProposal(signers[0], 100, archive);
299
- const proposal2 = mockBlockProposal(signers[1], 200, archive);
300
- const proposalId = archive.toString();
258
+ const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
259
+ const proposalId = proposal.archive.toString();
301
260
 
302
- await ap.addBlockProposal(proposal1);
303
- await ap.addBlockProposal(proposal2);
261
+ const result = await ap.tryAddCheckpointProposal(proposal);
262
+
263
+ expect(result.added).toBe(true);
264
+ expect(result.alreadyExists).toBe(false);
265
+ expect(result.count).toBe(1);
266
+
267
+ const retrievedProposal = await ap.getCheckpointProposal(proposalId);
304
268
 
305
- // Should get the latest one added
306
- const retrievedProposal = await ap.getBlockProposal(proposalId);
307
269
  expect(retrievedProposal).toBeDefined();
308
- expect(retrievedProposal!.toBuffer()).toEqual(proposal2.toBuffer());
309
- expect(retrievedProposal!.slotNumber.toBigInt()).toBe(BigInt(200));
270
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
310
271
  });
311
272
 
312
- it('should delete block proposal when deleting attestations for slot and proposal', async () => {
273
+ it('should handle checkpoint proposal without lastBlock (caller extracts and adds block separately)', async () => {
313
274
  const slotNumber = 420;
314
275
  const archive = Fr.random();
315
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
276
+ const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
277
+ // Create a checkpoint proposal WITHOUT lastBlock
278
+ const proposal = await makeCheckpointProposal({
279
+ signer: signers[0],
280
+ checkpointHeader,
281
+ archiveRoot: archive,
282
+ // No lastBlock
283
+ });
316
284
  const proposalId = proposal.archive.toString();
317
285
 
318
- // Add proposal and some attestations
319
- await ap.addBlockProposal(proposal);
320
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
321
- await ap.addAttestations(attestations);
286
+ // Add the checkpoint core - block extraction is now caller responsibility
287
+ await ap.tryAddCheckpointProposal(proposal.toCore());
322
288
 
323
- // Verify proposal exists
324
- let retrievedProposal = await ap.getBlockProposal(proposalId);
325
- expect(retrievedProposal).toBeDefined();
289
+ // The checkpoint proposal should be stored
290
+ const retrievedCheckpointProposal = await ap.getCheckpointProposal(proposalId);
291
+ expect(retrievedCheckpointProposal).toBeDefined();
326
292
 
327
- // Delete attestations for slot and proposal
328
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
293
+ // No block proposal was extracted (it had none anyway)
294
+ const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
295
+ expect(retrievedBlockProposal).toBeUndefined();
296
+ });
329
297
 
330
- // Proposal should be deleted
331
- retrievedProposal = await ap.getBlockProposal(proposalId);
298
+ it('should return undefined for non-existent checkpoint proposal', async () => {
299
+ const nonExistentId = Fr.random().toString();
300
+ const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
332
301
  expect(retrievedProposal).toBeUndefined();
333
302
  });
334
303
 
335
- it('should delete block proposal when deleting attestations for slot', async () => {
304
+ it('should return alreadyExists when adding proposal with same id', async () => {
336
305
  const slotNumber = 420;
337
306
  const archive = Fr.random();
338
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
339
- const proposalId = proposal.archive.toString();
307
+ const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
308
+ const proposalId = proposal1.archive.toString();
340
309
 
341
- // Add proposal
342
- await ap.addBlockProposal(proposal);
310
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
311
+ expect(result1.added).toBe(true);
312
+ expect(result1.alreadyExists).toBe(false);
343
313
 
344
- // Verify proposal exists
345
- let retrievedProposal = await ap.getBlockProposal(proposalId);
346
- expect(retrievedProposal).toBeDefined();
314
+ // Create a new proposal with same archive but different signer
315
+ const proposal2 = await mockCheckpointProposalForPool(signers[1], slotNumber, archive);
347
316
 
348
- // Delete attestations for slot
349
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
317
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
318
+ expect(result2.added).toBe(false);
319
+ expect(result2.alreadyExists).toBe(true);
350
320
 
351
- // Proposal should be deleted
352
- retrievedProposal = await ap.getBlockProposal(proposalId);
353
- expect(retrievedProposal).toBeUndefined();
321
+ // Should still have the first proposal
322
+ const retrievedProposal = await ap.getCheckpointProposal(proposalId);
323
+ expect(retrievedProposal).toBeDefined();
324
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal1.toBuffer());
325
+ expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
354
326
  });
355
327
 
356
- it('should be able to fetch both block proposal and attestations', async () => {
328
+ it('should return added=false when exceeding capacity', async () => {
357
329
  const slotNumber = 420;
358
- const archive = Fr.random();
359
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
360
- const proposalId = proposal.archive.toString();
361
-
362
- // Add proposal first
363
- await ap.addBlockProposal(proposal);
364
330
 
365
- // Add attestations for the same proposal
366
- const attestations = signers.slice(1).map(signer => mockAttestation(signer, slotNumber, archive));
367
- await ap.addAttestations(attestations);
368
-
369
- // Retrieve both proposal and attestations
370
- const retrievedProposal = await ap.getBlockProposal(proposalId);
371
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
331
+ // Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
332
+ for (let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++) {
333
+ const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
334
+ const result = await ap.tryAddCheckpointProposal(proposal);
335
+ expect(result.added).toBe(true);
336
+ expect(result.count).toBe(i + 1);
337
+ }
338
+
339
+ // The next proposal should not be added
340
+ const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
341
+ const result = await ap.tryAddCheckpointProposal(extraProposal);
342
+ expect(result.added).toBe(false);
343
+ expect(result.alreadyExists).toBe(false);
344
+ expect(result.count).toBe(MAX_CHECKPOINT_PROPOSALS_PER_SLOT);
345
+ });
346
+ });
372
347
 
373
- expect(retrievedProposal).toBeDefined();
374
- expect(retrievedProposal).toEqual(proposal);
348
+ describe('Duplicate proposal detection', () => {
349
+ const mockBlockProposalWithIndex = (
350
+ signer: Secp256k1Signer,
351
+ slotNumber: number,
352
+ indexWithinCheckpoint: number,
353
+ archive: Fr = Fr.random(),
354
+ ): Promise<BlockProposal> => {
355
+ const header = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
356
+ return makeBlockProposal({
357
+ signer,
358
+ blockHeader: header,
359
+ archiveRoot: archive,
360
+ indexWithinCheckpoint: IndexWithinCheckpoint(indexWithinCheckpoint),
361
+ });
362
+ };
363
+
364
+ describe('tryAddBlockProposal duplicate detection', () => {
365
+ it('should return count=1 when pool is empty', async () => {
366
+ const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
367
+ const result = await ap.tryAddBlockProposal(proposal);
368
+
369
+ expect(result.added).toBe(true);
370
+ expect(result.alreadyExists).toBe(false);
371
+ expect(result.count).toBe(1);
372
+ });
373
+
374
+ it('should return alreadyExists when same proposal exists', async () => {
375
+ const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
376
+ await ap.tryAddBlockProposal(proposal);
377
+
378
+ const result = await ap.tryAddBlockProposal(proposal);
379
+
380
+ expect(result.added).toBe(false);
381
+ expect(result.alreadyExists).toBe(true);
382
+ expect(result.count).toBe(1);
383
+ });
384
+
385
+ it('should detect duplicate via count when different proposal exists at same position', async () => {
386
+ const slotNumber = 100;
387
+ const indexWithinCheckpoint = 2;
388
+
389
+ // Add first proposal
390
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
391
+ const result1 = await ap.tryAddBlockProposal(proposal1);
392
+ expect(result1.count).toBe(1);
393
+
394
+ // Add a different proposal at same position - this is a duplicate (equivocation)
395
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
396
+ const result2 = await ap.tryAddBlockProposal(proposal2);
397
+
398
+ expect(result2.added).toBe(true);
399
+ expect(result2.alreadyExists).toBe(false);
400
+ // count >= 2 indicates duplicate detection
401
+ expect(result2.count).toBe(2);
402
+ });
403
+
404
+ it('should not detect duplicate for different positions in same slot', async () => {
405
+ const slotNumber = 100;
406
+
407
+ // Add proposal at index 0
408
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
409
+ await ap.tryAddBlockProposal(proposal1);
410
+
411
+ // Add proposal at index 1 (different position)
412
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
413
+ const result = await ap.tryAddBlockProposal(proposal2);
414
+
415
+ expect(result.added).toBe(true);
416
+ // count = 1 means no duplicate for this position
417
+ expect(result.count).toBe(1);
418
+ });
419
+
420
+ it('should not detect duplicate for same position in different slots', async () => {
421
+ const indexWithinCheckpoint = 0;
422
+
423
+ // Add proposal at slot 100
424
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], 100, indexWithinCheckpoint);
425
+ await ap.tryAddBlockProposal(proposal1);
426
+
427
+ // Add proposal at slot 200 (different slot)
428
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], 200, indexWithinCheckpoint);
429
+ const result = await ap.tryAddBlockProposal(proposal2);
430
+
431
+ expect(result.added).toBe(true);
432
+ // count = 1 means no duplicate for this position
433
+ expect(result.count).toBe(1);
434
+ });
435
+
436
+ it('should track multiple duplicates correctly via count', async () => {
437
+ const slotNumber = 100;
438
+ const indexWithinCheckpoint = 0;
439
+
440
+ // Add multiple proposals for same position
441
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
442
+ const result1 = await ap.tryAddBlockProposal(proposal1);
443
+ expect(result1.count).toBe(1);
444
+
445
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
446
+ const result2 = await ap.tryAddBlockProposal(proposal2);
447
+ expect(result2.count).toBe(2);
448
+
449
+ // Add a third proposal for same position
450
+ const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
451
+ const result3 = await ap.tryAddBlockProposal(proposal3);
452
+
453
+ expect(result3.added).toBe(true);
454
+ expect(result3.count).toBe(3);
455
+ });
456
+
457
+ it('should return added=false when exceeding capacity', async () => {
458
+ const slotNumber = 100;
459
+ const indexWithinCheckpoint = 0;
460
+
461
+ // Add MAX_BLOCK_PROPOSALS_PER_POSITION proposals
462
+ for (let i = 0; i < MAX_BLOCK_PROPOSALS_PER_POSITION; i++) {
463
+ const proposal = await mockBlockProposalWithIndex(
464
+ signers[i % NUMBER_OF_SIGNERS_PER_TEST],
465
+ slotNumber,
466
+ indexWithinCheckpoint,
467
+ );
468
+ const result = await ap.tryAddBlockProposal(proposal);
469
+ expect(result.added).toBe(true);
470
+ expect(result.count).toBe(i + 1);
471
+ }
472
+
473
+ // The next proposal should not be added
474
+ const extraProposal = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
475
+ const result = await ap.tryAddBlockProposal(extraProposal);
476
+ expect(result.added).toBe(false);
477
+ expect(result.alreadyExists).toBe(false);
478
+ expect(result.count).toBe(MAX_BLOCK_PROPOSALS_PER_POSITION);
479
+ });
480
+
481
+ it('should clean up block position index when deleting old data', async () => {
482
+ const slotNumber = 100;
483
+ const indexWithinCheckpoint = 0;
484
+
485
+ // Add proposal
486
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
487
+ await ap.tryAddBlockProposal(proposal1);
488
+
489
+ // Verify it's tracked (adding another should show count = 2)
490
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
491
+ let result = await ap.tryAddBlockProposal(proposal2);
492
+ expect(result.count).toBe(2);
493
+
494
+ // Delete old data
495
+ await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
496
+
497
+ // Verify position index is cleaned up (count should be 1 now)
498
+ const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
499
+ result = await ap.tryAddBlockProposal(proposal3);
500
+ expect(result.count).toBe(1);
501
+ });
502
+
503
+ it('should correctly delete block proposals at slot boundary', async () => {
504
+ // Add proposals at slots 99, 100, and 101 with various indices
505
+ const proposalSlot99Idx0 = await mockBlockProposalWithIndex(signers[0], 99, 0);
506
+ const proposalSlot99Idx1 = await mockBlockProposalWithIndex(signers[1], 99, 1);
507
+ const proposalSlot100Idx0 = await mockBlockProposalWithIndex(signers[2], 100, 0);
508
+ const proposalSlot101Idx0 = await mockBlockProposalWithIndex(signers[3], 101, 0);
509
+
510
+ await ap.tryAddBlockProposal(proposalSlot99Idx0);
511
+ await ap.tryAddBlockProposal(proposalSlot99Idx1);
512
+ await ap.tryAddBlockProposal(proposalSlot100Idx0);
513
+ await ap.tryAddBlockProposal(proposalSlot101Idx0);
514
+
515
+ // Delete slots older than 100 (should delete slot 99 only)
516
+ await ap.deleteOlderThan(SlotNumber(100));
517
+
518
+ // Slot 99 proposals should have their index cleaned up
519
+ const newProposal99 = await mockBlockProposalWithIndex(signers[0], 99, 0);
520
+ const result99 = await ap.tryAddBlockProposal(newProposal99);
521
+ expect(result99.count).toBe(1); // Index was cleaned up
522
+
523
+ // Slot 100 and 101 should still be tracked
524
+ const newProposal100 = await mockBlockProposalWithIndex(signers[1], 100, 0);
525
+ const result100 = await ap.tryAddBlockProposal(newProposal100);
526
+ expect(result100.count).toBe(2); // Still has the original
527
+
528
+ const newProposal101 = await mockBlockProposalWithIndex(signers[2], 101, 0);
529
+ const result101 = await ap.tryAddBlockProposal(newProposal101);
530
+ expect(result101.count).toBe(2); // Still has the original
531
+ });
532
+
533
+ it('should delete all indices for a given slot', async () => {
534
+ const slotNumber = 50;
535
+
536
+ // Add proposals at multiple indices for the same slot
537
+ const proposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
538
+ const proposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
539
+ const proposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
540
+
541
+ await ap.tryAddBlockProposal(proposal0);
542
+ await ap.tryAddBlockProposal(proposal1);
543
+ await ap.tryAddBlockProposal(proposal2);
544
+
545
+ // Delete slots older than slotNumber + 1
546
+ await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
547
+
548
+ // All indices should be cleaned up
549
+ const newProposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
550
+ const result0 = await ap.tryAddBlockProposal(newProposal0);
551
+ expect(result0.count).toBe(1);
552
+
553
+ const newProposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
554
+ const result1 = await ap.tryAddBlockProposal(newProposal1);
555
+ expect(result1.count).toBe(1);
556
+
557
+ const newProposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
558
+ const result2 = await ap.tryAddBlockProposal(newProposal2);
559
+ expect(result2.count).toBe(1);
560
+ });
561
+
562
+ it('should delete block proposals from storage when deleting old data', async () => {
563
+ const oldSlot = 50;
564
+ const newSlot = 100;
565
+
566
+ // Add proposals at old and new slots
567
+ const oldProposal = await mockBlockProposalWithIndex(signers[0], oldSlot, 0);
568
+ const newProposal = await mockBlockProposalWithIndex(signers[1], newSlot, 0);
569
+
570
+ await ap.tryAddBlockProposal(oldProposal);
571
+ await ap.tryAddBlockProposal(newProposal);
572
+
573
+ // Verify both proposals exist
574
+ expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeDefined();
575
+ expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
576
+
577
+ // Delete slots older than newSlot (should delete oldSlot)
578
+ await ap.deleteOlderThan(SlotNumber(newSlot));
579
+
580
+ // Old proposal should be deleted from storage
581
+ expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeUndefined();
582
+
583
+ // New proposal should still exist
584
+ expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
585
+ });
586
+ });
375
587
 
376
- compareAttestations(retrievedAttestations, attestations);
588
+ describe('tryAddCheckpointProposal duplicate detection', () => {
589
+ const mockCheckpointProposalCoreForPool = async (
590
+ signer: Secp256k1Signer,
591
+ slotNumber: number,
592
+ archive: Fr = Fr.random(),
593
+ ): Promise<CheckpointProposalCore> => {
594
+ const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
595
+ const blockHeader = makeBlockHeader(1);
596
+ const proposal = await makeCheckpointProposal({
597
+ signer,
598
+ checkpointHeader,
599
+ archiveRoot: archive,
600
+ lastBlock: { blockHeader },
601
+ });
602
+ return proposal.toCore();
603
+ };
604
+
605
+ it('should return count=1 when pool is empty', async () => {
606
+ const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
607
+ const result = await ap.tryAddCheckpointProposal(proposal);
608
+
609
+ expect(result.added).toBe(true);
610
+ expect(result.alreadyExists).toBe(false);
611
+ expect(result.count).toBe(1);
612
+ });
613
+
614
+ it('should return alreadyExists when same proposal exists', async () => {
615
+ const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
616
+ await ap.tryAddCheckpointProposal(proposal);
617
+
618
+ const result = await ap.tryAddCheckpointProposal(proposal);
619
+
620
+ expect(result.added).toBe(false);
621
+ expect(result.alreadyExists).toBe(true);
622
+ expect(result.count).toBe(1);
623
+ });
624
+
625
+ it('should detect duplicate via count when different proposal exists for same slot', async () => {
626
+ const slotNumber = 100;
627
+
628
+ // Add first proposal
629
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
630
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
631
+ expect(result1.count).toBe(1);
632
+
633
+ // Add a different proposal for same slot - this is a duplicate (equivocation)
634
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
635
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
636
+
637
+ expect(result2.added).toBe(true);
638
+ expect(result2.alreadyExists).toBe(false);
639
+ // count >= 2 indicates duplicate detection
640
+ expect(result2.count).toBe(2);
641
+ });
642
+
643
+ it('should not detect duplicate for different slots', async () => {
644
+ // Add proposal at slot 100
645
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], 100);
646
+ await ap.tryAddCheckpointProposal(proposal1);
647
+
648
+ // Add proposal at slot 200 (different slot)
649
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], 200);
650
+ const result = await ap.tryAddCheckpointProposal(proposal2);
651
+
652
+ expect(result.added).toBe(true);
653
+ // count = 1 means no duplicate for this slot
654
+ expect(result.count).toBe(1);
655
+ });
656
+
657
+ it('should track multiple duplicates correctly via count', async () => {
658
+ const slotNumber = 100;
659
+
660
+ // Add multiple proposals for same slot
661
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
662
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
663
+ expect(result1.count).toBe(1);
664
+
665
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
666
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
667
+ expect(result2.count).toBe(2);
668
+
669
+ // Add a third proposal for same slot
670
+ const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
671
+ const result3 = await ap.tryAddCheckpointProposal(proposal3);
672
+
673
+ expect(result3.added).toBe(true);
674
+ expect(result3.count).toBe(3);
675
+ });
676
+
677
+ it('should not count attestations as proposals for duplicate detection', async () => {
678
+ const slotNumber = 100;
679
+ const archive = Fr.random();
680
+
681
+ // Attestation arrives BEFORE the checkpoint proposal (race condition in p2p)
682
+ const attestation = mockCheckpointAttestation(signers[0], slotNumber, archive);
683
+ await ap.addOwnCheckpointAttestations([attestation]);
684
+
685
+ // Now the checkpoint proposal arrives - this should NOT be detected as a duplicate
686
+ const proposal = await mockCheckpointProposalCoreForPool(signers[1], slotNumber, archive);
687
+ const result = await ap.tryAddCheckpointProposal(proposal);
688
+
689
+ expect(result.added).toBe(true);
690
+ expect(result.alreadyExists).toBe(false);
691
+ // count should be 1, NOT 2 - attestations should not count as proposals
692
+ expect(result.count).toBe(1);
693
+ });
694
+
695
+ it('should not count attestations for different proposals as duplicates', async () => {
696
+ const slotNumber = 100;
697
+ const archive1 = Fr.random();
698
+ const archive2 = Fr.random();
699
+
700
+ // Add attestations for two different proposals in the same slot
701
+ const attestation1 = mockCheckpointAttestation(signers[0], slotNumber, archive1);
702
+ const attestation2 = mockCheckpointAttestation(signers[1], slotNumber, archive2);
703
+ await ap.addOwnCheckpointAttestations([attestation1, attestation2]);
704
+
705
+ // Add the first checkpoint proposal - should not be affected by attestations
706
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber, archive1);
707
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
708
+
709
+ expect(result1.added).toBe(true);
710
+ expect(result1.count).toBe(1);
711
+
712
+ // Add the second checkpoint proposal - this IS a duplicate (different archive, same slot)
713
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[3], slotNumber, archive2);
714
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
715
+
716
+ expect(result2.added).toBe(true);
717
+ expect(result2.count).toBe(2);
718
+ });
377
719
  });
378
720
  });
379
721
  }