@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,226 +1,173 @@
1
- import { Secp256k1Signer } from '@aztec/foundation/crypto';
2
- import { Fr } from '@aztec/foundation/fields';
3
- import { BlockProposal as BlockProposalClass, ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from '@aztec/stdlib/p2p';
4
- import { makeL2BlockHeader } from '@aztec/stdlib/testing';
5
- import { TxHash } from '@aztec/stdlib/tx';
6
- import { jest } from '@jest/globals';
7
- import { mock } from 'jest-mock-extended';
8
- import { mockAttestation } from './mocks.js';
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 { CheckpointHeader } from '@aztec/stdlib/rollup';
5
+ import { makeBlockHeader, makeBlockProposal, makeCheckpointHeader, makeCheckpointProposal } from '@aztec/stdlib/testing';
6
+ import { MAX_BLOCK_PROPOSALS_PER_POSITION, MAX_CHECKPOINT_PROPOSALS_PER_SLOT } from './attestation_pool.js';
7
+ import { mockCheckpointAttestation } from './mocks.js';
9
8
  const NUMBER_OF_SIGNERS_PER_TEST = 4;
10
9
  export function describeAttestationPool(getAttestationPool) {
11
10
  let ap;
12
11
  let signers;
13
- // Check that metrics are recorded correctly
14
- let metricsMock;
15
12
  beforeEach(()=>{
16
13
  ap = getAttestationPool();
17
14
  signers = Array.from({
18
15
  length: NUMBER_OF_SIGNERS_PER_TEST
19
16
  }, ()=>Secp256k1Signer.random());
20
- metricsMock = mock();
21
- // Can i overwrite this like this??
22
- ap.metrics = metricsMock;
23
17
  });
24
- const createAttestationsForSlot = (slotNumber)=>{
25
- const archive = Fr.random();
26
- return signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
18
+ const createCheckpointAttestationsForSlot = (slotNumber, archive)=>{
19
+ const archiveToUse = archive ?? Fr.random();
20
+ return signers.map((signer)=>mockCheckpointAttestation(signer, slotNumber, archiveToUse));
27
21
  };
28
- const mockBlockProposal = (signer, slotNumber, archive = Fr.random())=>{
29
- const header = makeL2BlockHeader(1, 2, slotNumber);
30
- const payload = new ConsensusPayload(header.toCheckpointHeader(), archive, header.state);
31
- const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
32
- const signature = signer.sign(hash);
33
- const txHashes = [
34
- TxHash.random(),
35
- TxHash.random()
36
- ]; // Mock tx hashes
37
- return new BlockProposalClass(payload, signature, txHashes);
22
+ const mockBlockProposalForPool = (signer, slotNumber, archive = Fr.random())=>{
23
+ const header = makeBlockHeader(1, {
24
+ slotNumber: SlotNumber(slotNumber)
25
+ });
26
+ return makeBlockProposal({
27
+ signer,
28
+ blockHeader: header,
29
+ archiveRoot: archive
30
+ });
38
31
  };
39
- // We compare buffers as the objects can have cached values attached to them which are not serialised
40
- // using array containing as the kv store does not respect insertion order
41
- const compareAttestations = (a1, a2)=>{
32
+ // Compare checkpoint attestations buffers
33
+ // Using array containing as the kv store does not respect insertion order
34
+ const compareCheckpointAttestations = (a1, a2)=>{
42
35
  const a1Buffer = a1.map((attestation)=>attestation.toBuffer());
43
36
  const a2Buffer = a2.map((attestation)=>attestation.toBuffer());
44
37
  expect(a1Buffer.length).toBe(a2Buffer.length);
45
38
  expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
46
39
  };
47
- it('should add attestations to pool', async ()=>{
48
- const slotNumber = 420;
49
- const archive = Fr.random();
50
- const attestations = signers.slice(0, -1).map((signer)=>mockAttestation(signer, slotNumber, archive));
51
- await ap.addAttestations(attestations);
52
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
53
- expect(retrievedAttestations.length).toBe(attestations.length);
54
- compareAttestations(retrievedAttestations, attestations);
55
- const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(BigInt(slotNumber));
56
- expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
57
- compareAttestations(retrievedAttestationsForSlot, attestations);
58
- // Add another one
59
- const newAttestation = mockAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
60
- await ap.addAttestations([
61
- newAttestation
62
- ]);
63
- const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
64
- expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
65
- compareAttestations(retrievedAttestationsAfterAdd, [
66
- ...attestations,
67
- newAttestation
68
- ]);
69
- const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(BigInt(slotNumber));
70
- expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
71
- compareAttestations(retrievedAttestationsForSlotAfterAdd, [
72
- ...attestations,
73
- newAttestation
74
- ]);
75
- // Delete by slot
76
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
77
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
78
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
79
- });
80
- it('should handle duplicate proposals in a slot', async ()=>{
81
- const slotNumber = 420;
82
- const archive = Fr.random();
83
- // Use the same signer for all attestations
84
- const attestations = [];
85
- const signer = signers[0];
86
- for(let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++){
87
- attestations.push(mockAttestation(signer, slotNumber, archive));
88
- }
89
- // Add them to store and check we end up with only one
90
- await ap.addAttestations(attestations);
91
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
92
- expect(retreivedAttestations.length).toBe(1);
93
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
94
- expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
95
- // Try adding them on another operation and check they are still not duplicated
96
- await ap.addAttestations([
97
- attestations[0]
98
- ]);
99
- expect(await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString())).toHaveLength(1);
100
- });
101
- it('should store attestations by differing slot', async ()=>{
102
- const slotNumbers = [
103
- 1,
104
- 2,
105
- 3,
106
- 4
107
- ];
108
- const attestations = signers.map((signer, i)=>mockAttestation(signer, slotNumbers[i]));
109
- await ap.addAttestations(attestations);
110
- for (const attestation of attestations){
111
- const slot = attestation.payload.header.slotNumber;
112
- const archive = attestation.archive.toString();
113
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), archive);
114
- expect(retreivedAttestations.length).toBe(1);
115
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
116
- expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
117
- }
118
- });
119
- it('should store attestations by differing slot and archive', async ()=>{
120
- const slotNumbers = [
121
- 1,
122
- 1,
123
- 2,
124
- 3
125
- ];
126
- const archives = [
127
- Fr.random(),
128
- Fr.random(),
129
- Fr.random(),
130
- Fr.random()
131
- ];
132
- const attestations = signers.map((signer, i)=>mockAttestation(signer, slotNumbers[i], archives[i]));
133
- await ap.addAttestations(attestations);
134
- for (const attestation of attestations){
135
- const slot = attestation.payload.header.slotNumber;
136
- const proposalId = attestation.archive.toString();
137
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), proposalId);
40
+ describe('CheckpointAttestation', ()=>{
41
+ it('should add attestations to pool', async ()=>{
42
+ const slotNumber = 420;
43
+ const archive = Fr.random();
44
+ const attestations = signers.slice(0, -1).map((signer)=>mockCheckpointAttestation(signer, slotNumber, archive));
45
+ await ap.addOwnCheckpointAttestations(attestations);
46
+ const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
47
+ expect(retrievedAttestations.length).toBe(attestations.length);
48
+ compareCheckpointAttestations(retrievedAttestations, attestations);
49
+ const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
50
+ expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
51
+ compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
52
+ // Add another one
53
+ const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
54
+ await ap.addOwnCheckpointAttestations([
55
+ newAttestation
56
+ ]);
57
+ const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
58
+ expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
59
+ compareCheckpointAttestations(retrievedAttestationsAfterAdd, [
60
+ ...attestations,
61
+ newAttestation
62
+ ]);
63
+ const retrievedAttestationsForSlotAfterAdd = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
64
+ expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
65
+ compareCheckpointAttestations(retrievedAttestationsForSlotAfterAdd, [
66
+ ...attestations,
67
+ newAttestation
68
+ ]);
69
+ // Delete by slot
70
+ await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
71
+ const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
72
+ expect(retreivedAttestationsAfterDelete.length).toBe(0);
73
+ });
74
+ it('should handle duplicate proposals in a slot', async ()=>{
75
+ const slotNumber = 420;
76
+ const archive = Fr.random();
77
+ const header = CheckpointHeader.random({
78
+ slotNumber: SlotNumber(slotNumber)
79
+ });
80
+ // Use the same signer and header for all attestations
81
+ const attestations = [];
82
+ const signer = signers[0];
83
+ for(let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++){
84
+ attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
85
+ }
86
+ // Add them to store and check we end up with only one
87
+ await ap.addOwnCheckpointAttestations(attestations);
88
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
138
89
  expect(retreivedAttestations.length).toBe(1);
139
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
140
- expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
141
- }
142
- });
143
- it('should delete attestations', async ()=>{
144
- const slotNumber = 420;
145
- const archive = Fr.random();
146
- const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
147
- const proposalId = attestations[0].archive.toString();
148
- await ap.addAttestations(attestations);
149
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
150
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
151
- compareAttestations(retreivedAttestations, attestations);
152
- await ap.deleteAttestations(attestations);
153
- const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
154
- expect(gottenAfterDelete.length).toBe(0);
155
- });
156
- it('should blanket delete attestations per slot', async ()=>{
157
- const slotNumber = 420;
158
- const archive = Fr.random();
159
- const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
160
- const proposalId = attestations[0].archive.toString();
161
- await ap.addAttestations(attestations);
162
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
163
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
164
- compareAttestations(retreivedAttestations, attestations);
165
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
166
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
167
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
168
- });
169
- it('should blanket delete attestations per slot and proposal', async ()=>{
170
- const slotNumber = 420;
171
- const archive = Fr.random();
172
- const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
173
- const proposalId = attestations[0].archive.toString();
174
- // Add another set of attestations with a different proposalId, yet the same slot
175
- const archive2 = Fr.random();
176
- const attestations2 = signers.map((signer)=>mockAttestation(signer, slotNumber, archive2));
177
- const proposalId2 = attestations2[0].archive.toString();
178
- await ap.addAttestations(attestations);
179
- await ap.addAttestations(attestations2);
180
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
181
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
182
- compareAttestations(retreivedAttestations, attestations);
183
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
184
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
185
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
186
- const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId2);
187
- expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
188
- compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
189
- });
190
- it('should delete attestations older than a given slot', async ()=>{
191
- const slotNumbers = [
192
- 1,
193
- 2,
194
- 3,
195
- 69,
196
- 72,
197
- 74,
198
- 88,
199
- 420
200
- ];
201
- const attestations = (await Promise.all(slotNumbers.map((slotNumber)=>createAttestationsForSlot(slotNumber)))).flat();
202
- const proposalId = attestations[0].archive.toString();
203
- await ap.addAttestations(attestations);
204
- const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
205
- expect(attestationsForSlot1.length).toBe(signers.length);
206
- const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
207
- await ap.deleteAttestationsOlderThan(BigInt(73));
208
- const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
209
- expect(attestationsForSlot1AfterDelete.length).toBe(0);
210
- expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
211
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1));
212
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2));
213
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3));
214
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69));
215
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72));
90
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
91
+ expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
92
+ // Try adding them on another operation and check they are still not duplicated
93
+ await ap.addOwnCheckpointAttestations([
94
+ attestations[0]
95
+ ]);
96
+ expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
97
+ });
98
+ it('should store attestations by differing slot', async ()=>{
99
+ const slotNumbers = [
100
+ 1,
101
+ 2,
102
+ 3,
103
+ 4
104
+ ];
105
+ const attestations = signers.map((signer, i)=>mockCheckpointAttestation(signer, slotNumbers[i]));
106
+ await ap.addOwnCheckpointAttestations(attestations);
107
+ for (const attestation of attestations){
108
+ const slot = attestation.payload.header.slotNumber;
109
+ const archive = attestation.archive.toString();
110
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, archive);
111
+ expect(retreivedAttestations.length).toBe(1);
112
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
113
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
114
+ }
115
+ });
116
+ it('should store attestations by differing slot and archive', async ()=>{
117
+ const slotNumbers = [
118
+ 1,
119
+ 1,
120
+ 2,
121
+ 3
122
+ ];
123
+ const archives = [
124
+ Fr.random(),
125
+ Fr.random(),
126
+ Fr.random(),
127
+ Fr.random()
128
+ ];
129
+ const attestations = signers.map((signer, i)=>mockCheckpointAttestation(signer, slotNumbers[i], archives[i]));
130
+ await ap.addOwnCheckpointAttestations(attestations);
131
+ for (const attestation of attestations){
132
+ const slot = attestation.payload.header.slotNumber;
133
+ const proposalId = attestation.archive.toString();
134
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, proposalId);
135
+ expect(retreivedAttestations.length).toBe(1);
136
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
137
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
138
+ }
139
+ });
140
+ it('should delete attestations older than a given slot', async ()=>{
141
+ const slotNumbers = [
142
+ 1,
143
+ 2,
144
+ 3,
145
+ 69,
146
+ 72,
147
+ 74,
148
+ 88,
149
+ 420
150
+ ];
151
+ const attestations = (await Promise.all(slotNumbers.map((slotNumber)=>createCheckpointAttestationsForSlot(slotNumber)))).flat();
152
+ const proposalId = attestations[0].archive.toString();
153
+ await ap.addOwnCheckpointAttestations(attestations);
154
+ const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
155
+ expect(attestationsForSlot1.length).toBe(signers.length);
156
+ await ap.deleteOlderThan(SlotNumber(73));
157
+ const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
158
+ expect(attestationsForSlot1AfterDelete.length).toBe(0);
159
+ });
216
160
  });
217
161
  describe('BlockProposal in attestation pool', ()=>{
218
162
  it('should add and retrieve block proposal', async ()=>{
219
163
  const slotNumber = 420;
220
164
  const archive = Fr.random();
221
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
165
+ const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
222
166
  const proposalId = proposal.archive.toString();
223
- await ap.addBlockProposal(proposal);
167
+ const result = await ap.tryAddBlockProposal(proposal);
168
+ expect(result.added).toBe(true);
169
+ expect(result.alreadyExists).toBe(false);
170
+ expect(result.count).toBe(1);
224
171
  const retrievedProposal = await ap.getBlockProposal(proposalId);
225
172
  expect(retrievedProposal).toBeDefined();
226
173
  expect(retrievedProposal).toEqual(proposal);
@@ -230,84 +177,410 @@ export function describeAttestationPool(getAttestationPool) {
230
177
  const retrievedProposal = await ap.getBlockProposal(nonExistentId);
231
178
  expect(retrievedProposal).toBeUndefined();
232
179
  });
233
- it('should update block proposal if added twice with same id', async ()=>{
180
+ it('should return alreadyExists when adding proposal with same id', async ()=>{
234
181
  const slotNumber = 420;
235
182
  const archive = Fr.random();
236
- const proposal1 = mockBlockProposal(signers[0], slotNumber, archive);
183
+ const proposal1 = await mockBlockProposalForPool(signers[0], slotNumber, archive);
237
184
  const proposalId = proposal1.archive.toString();
238
- await ap.addBlockProposal(proposal1);
185
+ const result1 = await ap.tryAddBlockProposal(proposal1);
186
+ expect(result1.added).toBe(true);
187
+ expect(result1.alreadyExists).toBe(false);
239
188
  // Create a new proposal with same archive but different signer
240
- const proposal2 = mockBlockProposal(signers[1], slotNumber, archive);
241
- await ap.addBlockProposal(proposal2);
189
+ const proposal2 = await mockBlockProposalForPool(signers[1], slotNumber, archive);
190
+ const result2 = await ap.tryAddBlockProposal(proposal2);
191
+ expect(result2.added).toBe(false);
192
+ expect(result2.alreadyExists).toBe(true);
193
+ // Should still have the first proposal
242
194
  const retrievedProposal = await ap.getBlockProposal(proposalId);
243
195
  expect(retrievedProposal).toBeDefined();
244
- // Should have the second proposal
245
- expect(retrievedProposal.toBuffer()).toEqual(proposal2.toBuffer());
246
- expect(retrievedProposal.getSender()?.toString()).toBe(signers[1].address.toString());
196
+ expect(retrievedProposal.toBuffer()).toEqual(proposal1.toBuffer());
197
+ expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
247
198
  });
248
- it('should handle block proposals with different slots and same archive', async ()=>{
249
- const archive = Fr.random();
250
- const proposal1 = mockBlockProposal(signers[0], 100, archive);
251
- const proposal2 = mockBlockProposal(signers[1], 200, archive);
252
- const proposalId = archive.toString();
253
- await ap.addBlockProposal(proposal1);
254
- await ap.addBlockProposal(proposal2);
255
- // Should get the latest one added
256
- const retrievedProposal = await ap.getBlockProposal(proposalId);
257
- expect(retrievedProposal).toBeDefined();
258
- expect(retrievedProposal.toBuffer()).toEqual(proposal2.toBuffer());
259
- expect(retrievedProposal.slotNumber.toBigInt()).toBe(BigInt(200));
260
- });
261
- it('should delete block proposal when deleting attestations for slot and proposal', async ()=>{
199
+ });
200
+ describe('CheckpointProposal in attestation pool', ()=>{
201
+ const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random())=>{
202
+ const checkpointHeader = makeCheckpointHeader(1, {
203
+ slotNumber: SlotNumber(slotNumber)
204
+ });
205
+ const blockHeader = makeBlockHeader(1);
206
+ const proposal = await makeCheckpointProposal({
207
+ signer,
208
+ checkpointHeader,
209
+ archiveRoot: archive,
210
+ lastBlock: {
211
+ blockHeader
212
+ }
213
+ });
214
+ // Return the core version since tryAddCheckpointProposal now takes CheckpointProposalCore
215
+ return proposal.toCore();
216
+ };
217
+ it('should add and retrieve checkpoint proposal', async ()=>{
262
218
  const slotNumber = 420;
263
219
  const archive = Fr.random();
264
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
220
+ const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
265
221
  const proposalId = proposal.archive.toString();
266
- // Add proposal and some attestations
267
- await ap.addBlockProposal(proposal);
268
- const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
269
- await ap.addAttestations(attestations);
270
- // Verify proposal exists
271
- let retrievedProposal = await ap.getBlockProposal(proposalId);
222
+ const result = await ap.tryAddCheckpointProposal(proposal);
223
+ expect(result.added).toBe(true);
224
+ expect(result.alreadyExists).toBe(false);
225
+ expect(result.count).toBe(1);
226
+ const retrievedProposal = await ap.getCheckpointProposal(proposalId);
272
227
  expect(retrievedProposal).toBeDefined();
273
- // Delete attestations for slot and proposal
274
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
275
- // Proposal should be deleted
276
- retrievedProposal = await ap.getBlockProposal(proposalId);
277
- expect(retrievedProposal).toBeUndefined();
228
+ expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
278
229
  });
279
- it('should delete block proposal when deleting attestations for slot', async ()=>{
230
+ it('should handle checkpoint proposal without lastBlock (caller extracts and adds block separately)', async ()=>{
280
231
  const slotNumber = 420;
281
232
  const archive = Fr.random();
282
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
233
+ const checkpointHeader = makeCheckpointHeader(1, {
234
+ slotNumber: SlotNumber(slotNumber)
235
+ });
236
+ // Create a checkpoint proposal WITHOUT lastBlock
237
+ const proposal = await makeCheckpointProposal({
238
+ signer: signers[0],
239
+ checkpointHeader,
240
+ archiveRoot: archive
241
+ });
283
242
  const proposalId = proposal.archive.toString();
284
- // Add proposal
285
- await ap.addBlockProposal(proposal);
286
- // Verify proposal exists
287
- let retrievedProposal = await ap.getBlockProposal(proposalId);
288
- expect(retrievedProposal).toBeDefined();
289
- // Delete attestations for slot
290
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
291
- // Proposal should be deleted
292
- retrievedProposal = await ap.getBlockProposal(proposalId);
243
+ // Add the checkpoint core - block extraction is now caller responsibility
244
+ await ap.tryAddCheckpointProposal(proposal.toCore());
245
+ // The checkpoint proposal should be stored
246
+ const retrievedCheckpointProposal = await ap.getCheckpointProposal(proposalId);
247
+ expect(retrievedCheckpointProposal).toBeDefined();
248
+ // No block proposal was extracted (it had none anyway)
249
+ const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
250
+ expect(retrievedBlockProposal).toBeUndefined();
251
+ });
252
+ it('should return undefined for non-existent checkpoint proposal', async ()=>{
253
+ const nonExistentId = Fr.random().toString();
254
+ const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
293
255
  expect(retrievedProposal).toBeUndefined();
294
256
  });
295
- it('should be able to fetch both block proposal and attestations', async ()=>{
257
+ it('should return alreadyExists when adding proposal with same id', async ()=>{
296
258
  const slotNumber = 420;
297
259
  const archive = Fr.random();
298
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
299
- const proposalId = proposal.archive.toString();
300
- // Add proposal first
301
- await ap.addBlockProposal(proposal);
302
- // Add attestations for the same proposal
303
- const attestations = signers.slice(1).map((signer)=>mockAttestation(signer, slotNumber, archive));
304
- await ap.addAttestations(attestations);
305
- // Retrieve both proposal and attestations
306
- const retrievedProposal = await ap.getBlockProposal(proposalId);
307
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
260
+ const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
261
+ const proposalId = proposal1.archive.toString();
262
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
263
+ expect(result1.added).toBe(true);
264
+ expect(result1.alreadyExists).toBe(false);
265
+ // Create a new proposal with same archive but different signer
266
+ const proposal2 = await mockCheckpointProposalForPool(signers[1], slotNumber, archive);
267
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
268
+ expect(result2.added).toBe(false);
269
+ expect(result2.alreadyExists).toBe(true);
270
+ // Should still have the first proposal
271
+ const retrievedProposal = await ap.getCheckpointProposal(proposalId);
308
272
  expect(retrievedProposal).toBeDefined();
309
- expect(retrievedProposal).toEqual(proposal);
310
- compareAttestations(retrievedAttestations, attestations);
273
+ expect(retrievedProposal.toBuffer()).toEqual(proposal1.toBuffer());
274
+ expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
275
+ });
276
+ it('should return added=false when exceeding capacity', async ()=>{
277
+ const slotNumber = 420;
278
+ // Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
279
+ for(let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++){
280
+ const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
281
+ const result = await ap.tryAddCheckpointProposal(proposal);
282
+ expect(result.added).toBe(true);
283
+ expect(result.count).toBe(i + 1);
284
+ }
285
+ // The next proposal should not be added
286
+ const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
287
+ const result = await ap.tryAddCheckpointProposal(extraProposal);
288
+ expect(result.added).toBe(false);
289
+ expect(result.alreadyExists).toBe(false);
290
+ expect(result.count).toBe(MAX_CHECKPOINT_PROPOSALS_PER_SLOT);
291
+ });
292
+ });
293
+ describe('Duplicate proposal detection', ()=>{
294
+ const mockBlockProposalWithIndex = (signer, slotNumber, indexWithinCheckpoint, archive = Fr.random())=>{
295
+ const header = makeBlockHeader(1, {
296
+ slotNumber: SlotNumber(slotNumber)
297
+ });
298
+ return makeBlockProposal({
299
+ signer,
300
+ blockHeader: header,
301
+ archiveRoot: archive,
302
+ indexWithinCheckpoint: IndexWithinCheckpoint(indexWithinCheckpoint)
303
+ });
304
+ };
305
+ describe('tryAddBlockProposal duplicate detection', ()=>{
306
+ it('should return count=1 when pool is empty', async ()=>{
307
+ const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
308
+ const result = await ap.tryAddBlockProposal(proposal);
309
+ expect(result.added).toBe(true);
310
+ expect(result.alreadyExists).toBe(false);
311
+ expect(result.count).toBe(1);
312
+ });
313
+ it('should return alreadyExists when same proposal exists', async ()=>{
314
+ const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
315
+ await ap.tryAddBlockProposal(proposal);
316
+ const result = await ap.tryAddBlockProposal(proposal);
317
+ expect(result.added).toBe(false);
318
+ expect(result.alreadyExists).toBe(true);
319
+ expect(result.count).toBe(1);
320
+ });
321
+ it('should detect duplicate via count when different proposal exists at same position', async ()=>{
322
+ const slotNumber = 100;
323
+ const indexWithinCheckpoint = 2;
324
+ // Add first proposal
325
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
326
+ const result1 = await ap.tryAddBlockProposal(proposal1);
327
+ expect(result1.count).toBe(1);
328
+ // Add a different proposal at same position - this is a duplicate (equivocation)
329
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
330
+ const result2 = await ap.tryAddBlockProposal(proposal2);
331
+ expect(result2.added).toBe(true);
332
+ expect(result2.alreadyExists).toBe(false);
333
+ // count >= 2 indicates duplicate detection
334
+ expect(result2.count).toBe(2);
335
+ });
336
+ it('should not detect duplicate for different positions in same slot', async ()=>{
337
+ const slotNumber = 100;
338
+ // Add proposal at index 0
339
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
340
+ await ap.tryAddBlockProposal(proposal1);
341
+ // Add proposal at index 1 (different position)
342
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
343
+ const result = await ap.tryAddBlockProposal(proposal2);
344
+ expect(result.added).toBe(true);
345
+ // count = 1 means no duplicate for this position
346
+ expect(result.count).toBe(1);
347
+ });
348
+ it('should not detect duplicate for same position in different slots', async ()=>{
349
+ const indexWithinCheckpoint = 0;
350
+ // Add proposal at slot 100
351
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], 100, indexWithinCheckpoint);
352
+ await ap.tryAddBlockProposal(proposal1);
353
+ // Add proposal at slot 200 (different slot)
354
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], 200, indexWithinCheckpoint);
355
+ const result = await ap.tryAddBlockProposal(proposal2);
356
+ expect(result.added).toBe(true);
357
+ // count = 1 means no duplicate for this position
358
+ expect(result.count).toBe(1);
359
+ });
360
+ it('should track multiple duplicates correctly via count', async ()=>{
361
+ const slotNumber = 100;
362
+ const indexWithinCheckpoint = 0;
363
+ // Add multiple proposals for same position
364
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
365
+ const result1 = await ap.tryAddBlockProposal(proposal1);
366
+ expect(result1.count).toBe(1);
367
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
368
+ const result2 = await ap.tryAddBlockProposal(proposal2);
369
+ expect(result2.count).toBe(2);
370
+ // Add a third proposal for same position
371
+ const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
372
+ const result3 = await ap.tryAddBlockProposal(proposal3);
373
+ expect(result3.added).toBe(true);
374
+ expect(result3.count).toBe(3);
375
+ });
376
+ it('should return added=false when exceeding capacity', async ()=>{
377
+ const slotNumber = 100;
378
+ const indexWithinCheckpoint = 0;
379
+ // Add MAX_BLOCK_PROPOSALS_PER_POSITION proposals
380
+ for(let i = 0; i < MAX_BLOCK_PROPOSALS_PER_POSITION; i++){
381
+ const proposal = await mockBlockProposalWithIndex(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber, indexWithinCheckpoint);
382
+ const result = await ap.tryAddBlockProposal(proposal);
383
+ expect(result.added).toBe(true);
384
+ expect(result.count).toBe(i + 1);
385
+ }
386
+ // The next proposal should not be added
387
+ const extraProposal = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
388
+ const result = await ap.tryAddBlockProposal(extraProposal);
389
+ expect(result.added).toBe(false);
390
+ expect(result.alreadyExists).toBe(false);
391
+ expect(result.count).toBe(MAX_BLOCK_PROPOSALS_PER_POSITION);
392
+ });
393
+ it('should clean up block position index when deleting old data', async ()=>{
394
+ const slotNumber = 100;
395
+ const indexWithinCheckpoint = 0;
396
+ // Add proposal
397
+ const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
398
+ await ap.tryAddBlockProposal(proposal1);
399
+ // Verify it's tracked (adding another should show count = 2)
400
+ const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
401
+ let result = await ap.tryAddBlockProposal(proposal2);
402
+ expect(result.count).toBe(2);
403
+ // Delete old data
404
+ await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
405
+ // Verify position index is cleaned up (count should be 1 now)
406
+ const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
407
+ result = await ap.tryAddBlockProposal(proposal3);
408
+ expect(result.count).toBe(1);
409
+ });
410
+ it('should correctly delete block proposals at slot boundary', async ()=>{
411
+ // Add proposals at slots 99, 100, and 101 with various indices
412
+ const proposalSlot99Idx0 = await mockBlockProposalWithIndex(signers[0], 99, 0);
413
+ const proposalSlot99Idx1 = await mockBlockProposalWithIndex(signers[1], 99, 1);
414
+ const proposalSlot100Idx0 = await mockBlockProposalWithIndex(signers[2], 100, 0);
415
+ const proposalSlot101Idx0 = await mockBlockProposalWithIndex(signers[3], 101, 0);
416
+ await ap.tryAddBlockProposal(proposalSlot99Idx0);
417
+ await ap.tryAddBlockProposal(proposalSlot99Idx1);
418
+ await ap.tryAddBlockProposal(proposalSlot100Idx0);
419
+ await ap.tryAddBlockProposal(proposalSlot101Idx0);
420
+ // Delete slots older than 100 (should delete slot 99 only)
421
+ await ap.deleteOlderThan(SlotNumber(100));
422
+ // Slot 99 proposals should have their index cleaned up
423
+ const newProposal99 = await mockBlockProposalWithIndex(signers[0], 99, 0);
424
+ const result99 = await ap.tryAddBlockProposal(newProposal99);
425
+ expect(result99.count).toBe(1); // Index was cleaned up
426
+ // Slot 100 and 101 should still be tracked
427
+ const newProposal100 = await mockBlockProposalWithIndex(signers[1], 100, 0);
428
+ const result100 = await ap.tryAddBlockProposal(newProposal100);
429
+ expect(result100.count).toBe(2); // Still has the original
430
+ const newProposal101 = await mockBlockProposalWithIndex(signers[2], 101, 0);
431
+ const result101 = await ap.tryAddBlockProposal(newProposal101);
432
+ expect(result101.count).toBe(2); // Still has the original
433
+ });
434
+ it('should delete all indices for a given slot', async ()=>{
435
+ const slotNumber = 50;
436
+ // Add proposals at multiple indices for the same slot
437
+ const proposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
438
+ const proposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
439
+ const proposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
440
+ await ap.tryAddBlockProposal(proposal0);
441
+ await ap.tryAddBlockProposal(proposal1);
442
+ await ap.tryAddBlockProposal(proposal2);
443
+ // Delete slots older than slotNumber + 1
444
+ await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
445
+ // All indices should be cleaned up
446
+ const newProposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
447
+ const result0 = await ap.tryAddBlockProposal(newProposal0);
448
+ expect(result0.count).toBe(1);
449
+ const newProposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
450
+ const result1 = await ap.tryAddBlockProposal(newProposal1);
451
+ expect(result1.count).toBe(1);
452
+ const newProposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
453
+ const result2 = await ap.tryAddBlockProposal(newProposal2);
454
+ expect(result2.count).toBe(1);
455
+ });
456
+ it('should delete block proposals from storage when deleting old data', async ()=>{
457
+ const oldSlot = 50;
458
+ const newSlot = 100;
459
+ // Add proposals at old and new slots
460
+ const oldProposal = await mockBlockProposalWithIndex(signers[0], oldSlot, 0);
461
+ const newProposal = await mockBlockProposalWithIndex(signers[1], newSlot, 0);
462
+ await ap.tryAddBlockProposal(oldProposal);
463
+ await ap.tryAddBlockProposal(newProposal);
464
+ // Verify both proposals exist
465
+ expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeDefined();
466
+ expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
467
+ // Delete slots older than newSlot (should delete oldSlot)
468
+ await ap.deleteOlderThan(SlotNumber(newSlot));
469
+ // Old proposal should be deleted from storage
470
+ expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeUndefined();
471
+ // New proposal should still exist
472
+ expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
473
+ });
474
+ });
475
+ describe('tryAddCheckpointProposal duplicate detection', ()=>{
476
+ const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random())=>{
477
+ const checkpointHeader = makeCheckpointHeader(1, {
478
+ slotNumber: SlotNumber(slotNumber)
479
+ });
480
+ const blockHeader = makeBlockHeader(1);
481
+ const proposal = await makeCheckpointProposal({
482
+ signer,
483
+ checkpointHeader,
484
+ archiveRoot: archive,
485
+ lastBlock: {
486
+ blockHeader
487
+ }
488
+ });
489
+ return proposal.toCore();
490
+ };
491
+ it('should return count=1 when pool is empty', async ()=>{
492
+ const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
493
+ const result = await ap.tryAddCheckpointProposal(proposal);
494
+ expect(result.added).toBe(true);
495
+ expect(result.alreadyExists).toBe(false);
496
+ expect(result.count).toBe(1);
497
+ });
498
+ it('should return alreadyExists when same proposal exists', async ()=>{
499
+ const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
500
+ await ap.tryAddCheckpointProposal(proposal);
501
+ const result = await ap.tryAddCheckpointProposal(proposal);
502
+ expect(result.added).toBe(false);
503
+ expect(result.alreadyExists).toBe(true);
504
+ expect(result.count).toBe(1);
505
+ });
506
+ it('should detect duplicate via count when different proposal exists for same slot', async ()=>{
507
+ const slotNumber = 100;
508
+ // Add first proposal
509
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
510
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
511
+ expect(result1.count).toBe(1);
512
+ // Add a different proposal for same slot - this is a duplicate (equivocation)
513
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
514
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
515
+ expect(result2.added).toBe(true);
516
+ expect(result2.alreadyExists).toBe(false);
517
+ // count >= 2 indicates duplicate detection
518
+ expect(result2.count).toBe(2);
519
+ });
520
+ it('should not detect duplicate for different slots', async ()=>{
521
+ // Add proposal at slot 100
522
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], 100);
523
+ await ap.tryAddCheckpointProposal(proposal1);
524
+ // Add proposal at slot 200 (different slot)
525
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], 200);
526
+ const result = await ap.tryAddCheckpointProposal(proposal2);
527
+ expect(result.added).toBe(true);
528
+ // count = 1 means no duplicate for this slot
529
+ expect(result.count).toBe(1);
530
+ });
531
+ it('should track multiple duplicates correctly via count', async ()=>{
532
+ const slotNumber = 100;
533
+ // Add multiple proposals for same slot
534
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
535
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
536
+ expect(result1.count).toBe(1);
537
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
538
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
539
+ expect(result2.count).toBe(2);
540
+ // Add a third proposal for same slot
541
+ const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
542
+ const result3 = await ap.tryAddCheckpointProposal(proposal3);
543
+ expect(result3.added).toBe(true);
544
+ expect(result3.count).toBe(3);
545
+ });
546
+ it('should not count attestations as proposals for duplicate detection', async ()=>{
547
+ const slotNumber = 100;
548
+ const archive = Fr.random();
549
+ // Attestation arrives BEFORE the checkpoint proposal (race condition in p2p)
550
+ const attestation = mockCheckpointAttestation(signers[0], slotNumber, archive);
551
+ await ap.addOwnCheckpointAttestations([
552
+ attestation
553
+ ]);
554
+ // Now the checkpoint proposal arrives - this should NOT be detected as a duplicate
555
+ const proposal = await mockCheckpointProposalCoreForPool(signers[1], slotNumber, archive);
556
+ const result = await ap.tryAddCheckpointProposal(proposal);
557
+ expect(result.added).toBe(true);
558
+ expect(result.alreadyExists).toBe(false);
559
+ // count should be 1, NOT 2 - attestations should not count as proposals
560
+ expect(result.count).toBe(1);
561
+ });
562
+ it('should not count attestations for different proposals as duplicates', async ()=>{
563
+ const slotNumber = 100;
564
+ const archive1 = Fr.random();
565
+ const archive2 = Fr.random();
566
+ // Add attestations for two different proposals in the same slot
567
+ const attestation1 = mockCheckpointAttestation(signers[0], slotNumber, archive1);
568
+ const attestation2 = mockCheckpointAttestation(signers[1], slotNumber, archive2);
569
+ await ap.addOwnCheckpointAttestations([
570
+ attestation1,
571
+ attestation2
572
+ ]);
573
+ // Add the first checkpoint proposal - should not be affected by attestations
574
+ const proposal1 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber, archive1);
575
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
576
+ expect(result1.added).toBe(true);
577
+ expect(result1.count).toBe(1);
578
+ // Add the second checkpoint proposal - this IS a duplicate (different archive, same slot)
579
+ const proposal2 = await mockCheckpointProposalCoreForPool(signers[3], slotNumber, archive2);
580
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
581
+ expect(result2.added).toBe(true);
582
+ expect(result2.count).toBe(2);
583
+ });
311
584
  });
312
585
  });
313
586
  }