@aztec/p2p 0.0.1-commit.96bb3f7 → 0.0.1-commit.96dac018d

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 (502) 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 +41 -14
  7. package/dest/client/interface.d.ts +45 -32
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +40 -50
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +157 -201
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +35 -7
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +23 -9
  21. package/dest/errors/tx-pool.error.d.ts +8 -0
  22. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  23. package/dest/errors/tx-pool.error.js +9 -0
  24. package/dest/index.d.ts +2 -1
  25. package/dest/index.d.ts.map +1 -1
  26. package/dest/index.js +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +373 -96
  33. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  34. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/index.js +1 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts +4 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/mocks.js +8 -5
  39. package/dest/mem_pools/index.d.ts +3 -2
  40. package/dest/mem_pools/index.d.ts.map +1 -1
  41. package/dest/mem_pools/index.js +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +2 -2
  45. package/dest/mem_pools/interface.d.ts +5 -5
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
  48. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
  50. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
  51. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
  53. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
  54. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
  56. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  57. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  59. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
  60. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  62. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
  63. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  65. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
  66. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  68. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  70. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  71. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  73. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  74. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  76. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  77. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  101. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  102. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  103. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  104. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  105. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  106. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  107. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  108. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  109. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  110. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  111. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  112. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  113. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  114. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  115. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
  116. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  117. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +105 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +164 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  123. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  124. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  125. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  126. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
  127. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  128. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  129. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  130. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  131. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  132. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +891 -0
  133. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
  134. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/attestation_validator/attestation_validator.js +41 -10
  136. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  137. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -6
  139. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  140. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  141. package/dest/msg_validators/clock_tolerance.js +37 -0
  142. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -3
  143. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  144. package/dest/msg_validators/proposal_validator/proposal_validator.js +55 -31
  145. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
  146. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
  147. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +93 -64
  148. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  149. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  151. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  152. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  153. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  154. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  155. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  157. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  158. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  159. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  160. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  161. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  162. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  163. package/dest/msg_validators/tx_validator/factory.d.ts +118 -5
  164. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  165. package/dest/msg_validators/tx_validator/factory.js +228 -57
  166. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  167. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  168. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  169. package/dest/msg_validators/tx_validator/gas_validator.d.ts +59 -3
  170. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  171. package/dest/msg_validators/tx_validator/gas_validator.js +84 -52
  172. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  173. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  174. package/dest/msg_validators/tx_validator/index.js +2 -0
  175. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  176. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  177. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  178. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  179. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  180. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  181. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  182. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  183. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  184. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  185. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  186. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  187. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  188. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  189. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  190. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  191. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  192. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  193. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  194. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  195. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  196. package/dest/services/data_store.d.ts +1 -1
  197. package/dest/services/data_store.d.ts.map +1 -1
  198. package/dest/services/data_store.js +10 -6
  199. package/dest/services/discv5/discV5_service.js +1 -1
  200. package/dest/services/dummy_service.d.ts +24 -4
  201. package/dest/services/dummy_service.d.ts.map +1 -1
  202. package/dest/services/dummy_service.js +46 -1
  203. package/dest/services/encoding.d.ts +2 -2
  204. package/dest/services/encoding.d.ts.map +1 -1
  205. package/dest/services/encoding.js +6 -6
  206. package/dest/services/gossipsub/index.d.ts +3 -0
  207. package/dest/services/gossipsub/index.d.ts.map +1 -0
  208. package/dest/services/gossipsub/index.js +2 -0
  209. package/dest/services/gossipsub/scoring.d.ts +21 -3
  210. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  211. package/dest/services/gossipsub/scoring.js +24 -7
  212. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  213. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  214. package/dest/services/gossipsub/topic_score_params.js +346 -0
  215. package/dest/services/index.d.ts +2 -1
  216. package/dest/services/index.d.ts.map +1 -1
  217. package/dest/services/index.js +1 -0
  218. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  219. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  220. package/dest/services/libp2p/instrumentation.js +19 -8
  221. package/dest/services/libp2p/libp2p_service.d.ts +97 -38
  222. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  223. package/dest/services/libp2p/libp2p_service.js +448 -353
  224. package/dest/services/peer-manager/metrics.d.ts +2 -2
  225. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  226. package/dest/services/peer-manager/metrics.js +20 -5
  227. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  228. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  229. package/dest/services/peer-manager/peer_scoring.js +33 -4
  230. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
  231. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  232. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +539 -0
  233. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  234. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  235. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  236. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
  237. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  238. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  239. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
  240. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  241. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
  242. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +60 -0
  243. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  244. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +173 -0
  245. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  246. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  247. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  248. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  249. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  250. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  251. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  252. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  253. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  254. package/dest/services/reqresp/constants.d.ts +12 -0
  255. package/dest/services/reqresp/constants.d.ts.map +1 -0
  256. package/dest/services/reqresp/constants.js +7 -0
  257. package/dest/services/reqresp/interface.d.ts +12 -1
  258. package/dest/services/reqresp/interface.d.ts.map +1 -1
  259. package/dest/services/reqresp/interface.js +15 -1
  260. package/dest/services/reqresp/metrics.d.ts +6 -5
  261. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  262. package/dest/services/reqresp/metrics.js +17 -5
  263. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  264. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  265. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  266. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  267. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  268. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  269. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  270. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  271. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  272. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  273. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  274. package/dest/services/reqresp/protocols/status.js +2 -1
  275. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  276. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  277. package/dest/services/reqresp/protocols/tx.js +20 -0
  278. package/dest/services/reqresp/reqresp.d.ts +6 -1
  279. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  280. package/dest/services/reqresp/reqresp.js +69 -26
  281. package/dest/services/service.d.ts +42 -3
  282. package/dest/services/service.d.ts.map +1 -1
  283. package/dest/services/tx_collection/config.d.ts +22 -1
  284. package/dest/services/tx_collection/config.d.ts.map +1 -1
  285. package/dest/services/tx_collection/config.js +55 -1
  286. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  287. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  288. package/dest/services/tx_collection/fast_tx_collection.js +71 -44
  289. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  290. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  291. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  292. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  293. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  294. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  295. package/dest/services/tx_collection/index.d.ts +3 -1
  296. package/dest/services/tx_collection/index.d.ts.map +1 -1
  297. package/dest/services/tx_collection/index.js +2 -0
  298. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  299. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  300. package/dest/services/tx_collection/instrumentation.js +10 -2
  301. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  302. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  303. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  304. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  305. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  306. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  307. package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -5
  308. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  309. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  310. package/dest/services/tx_collection/tx_collection.d.ts +29 -16
  311. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  312. package/dest/services/tx_collection/tx_collection.js +79 -7
  313. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  314. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  315. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  316. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  317. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  318. package/dest/services/tx_collection/tx_source.js +19 -2
  319. package/dest/services/tx_file_store/config.d.ts +16 -0
  320. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  321. package/dest/services/tx_file_store/config.js +22 -0
  322. package/dest/services/tx_file_store/index.d.ts +4 -0
  323. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  324. package/dest/services/tx_file_store/index.js +3 -0
  325. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  326. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  327. package/dest/services/tx_file_store/instrumentation.js +29 -0
  328. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  329. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  330. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  331. package/dest/services/tx_provider.d.ts +6 -6
  332. package/dest/services/tx_provider.d.ts.map +1 -1
  333. package/dest/services/tx_provider.js +9 -8
  334. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  335. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  336. package/dest/services/tx_provider_instrumentation.js +5 -5
  337. package/dest/test-helpers/index.d.ts +3 -1
  338. package/dest/test-helpers/index.d.ts.map +1 -1
  339. package/dest/test-helpers/index.js +2 -0
  340. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  341. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  342. package/dest/test-helpers/mock-pubsub.d.ts +29 -2
  343. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  344. package/dest/test-helpers/mock-pubsub.js +103 -2
  345. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  346. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  347. package/dest/test-helpers/reqresp-nodes.js +2 -1
  348. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  349. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  350. package/dest/test-helpers/test_tx_provider.js +41 -0
  351. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  352. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  353. package/dest/test-helpers/testbench-utils.js +366 -0
  354. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  355. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  356. package/dest/testbench/p2p_client_testbench_worker.js +215 -135
  357. package/dest/testbench/worker_client_manager.d.ts +51 -6
  358. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  359. package/dest/testbench/worker_client_manager.js +226 -44
  360. package/dest/util.d.ts +2 -2
  361. package/dest/util.d.ts.map +1 -1
  362. package/package.json +16 -16
  363. package/src/bootstrap/bootstrap.ts +7 -4
  364. package/src/client/factory.ts +75 -23
  365. package/src/client/interface.ts +61 -33
  366. package/src/client/p2p_client.ts +196 -241
  367. package/src/client/test/tx_proposal_collector/README.md +227 -0
  368. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +346 -0
  369. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  370. package/src/config.ts +49 -13
  371. package/src/errors/tx-pool.error.ts +12 -0
  372. package/src/index.ts +1 -0
  373. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  374. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +460 -112
  375. package/src/mem_pools/attestation_pool/index.ts +9 -2
  376. package/src/mem_pools/attestation_pool/mocks.ts +7 -4
  377. package/src/mem_pools/index.ts +4 -1
  378. package/src/mem_pools/instrumentation.ts +2 -1
  379. package/src/mem_pools/interface.ts +4 -4
  380. package/src/mem_pools/tx_pool/README.md +29 -14
  381. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
  382. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
  383. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
  384. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  385. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  386. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  387. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  388. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  389. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  390. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  391. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  392. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  393. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  394. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
  395. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  396. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  397. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  398. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  399. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  400. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  401. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  402. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  403. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  404. package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
  405. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +255 -0
  406. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  407. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  408. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  409. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1063 -0
  410. package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -14
  411. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +16 -10
  412. package/src/msg_validators/clock_tolerance.ts +51 -0
  413. package/src/msg_validators/proposal_validator/proposal_validator.ts +31 -31
  414. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +91 -67
  415. package/src/msg_validators/tx_validator/README.md +115 -0
  416. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  417. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  418. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  419. package/src/msg_validators/tx_validator/data_validator.ts +6 -2
  420. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  421. package/src/msg_validators/tx_validator/factory.ts +372 -55
  422. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  423. package/src/msg_validators/tx_validator/gas_validator.ts +106 -54
  424. package/src/msg_validators/tx_validator/index.ts +2 -0
  425. package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
  426. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  427. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  428. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  429. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
  430. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  431. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  432. package/src/services/data_store.ts +10 -7
  433. package/src/services/discv5/discV5_service.ts +1 -1
  434. package/src/services/dummy_service.ts +59 -2
  435. package/src/services/encoding.ts +6 -6
  436. package/src/services/gossipsub/README.md +641 -0
  437. package/src/services/gossipsub/index.ts +2 -0
  438. package/src/services/gossipsub/scoring.ts +29 -5
  439. package/src/services/gossipsub/topic_score_params.ts +487 -0
  440. package/src/services/index.ts +1 -0
  441. package/src/services/libp2p/instrumentation.ts +20 -7
  442. package/src/services/libp2p/libp2p_service.ts +498 -381
  443. package/src/services/peer-manager/metrics.ts +21 -4
  444. package/src/services/peer-manager/peer_scoring.ts +29 -1
  445. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  446. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +678 -0
  447. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  448. package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
  449. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
  450. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +244 -0
  451. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  452. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  453. package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
  454. package/src/services/reqresp/constants.ts +14 -0
  455. package/src/services/reqresp/interface.ts +29 -1
  456. package/src/services/reqresp/metrics.ts +34 -9
  457. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  458. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  459. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  460. package/src/services/reqresp/protocols/status.ts +5 -3
  461. package/src/services/reqresp/protocols/tx.ts +22 -0
  462. package/src/services/reqresp/reqresp.ts +79 -22
  463. package/src/services/service.ts +55 -2
  464. package/src/services/tx_collection/config.ts +83 -1
  465. package/src/services/tx_collection/fast_tx_collection.ts +93 -47
  466. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  467. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  468. package/src/services/tx_collection/index.ts +6 -0
  469. package/src/services/tx_collection/instrumentation.ts +17 -2
  470. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  471. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  472. package/src/services/tx_collection/slow_tx_collection.ts +68 -35
  473. package/src/services/tx_collection/tx_collection.ts +121 -24
  474. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  475. package/src/services/tx_collection/tx_source.ts +22 -3
  476. package/src/services/tx_file_store/config.ts +37 -0
  477. package/src/services/tx_file_store/index.ts +3 -0
  478. package/src/services/tx_file_store/instrumentation.ts +36 -0
  479. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  480. package/src/services/tx_provider.ts +12 -11
  481. package/src/services/tx_provider_instrumentation.ts +11 -5
  482. package/src/test-helpers/index.ts +2 -0
  483. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  484. package/src/test-helpers/mock-pubsub.ts +143 -3
  485. package/src/test-helpers/reqresp-nodes.ts +2 -1
  486. package/src/test-helpers/test_tx_provider.ts +64 -0
  487. package/src/test-helpers/testbench-utils.ts +430 -0
  488. package/src/testbench/p2p_client_testbench_worker.ts +332 -130
  489. package/src/testbench/worker_client_manager.ts +304 -47
  490. package/src/util.ts +7 -1
  491. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  492. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  493. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  494. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  495. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  496. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  497. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
  498. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
  499. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
  500. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  501. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  502. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
@@ -1,8 +1,9 @@
1
- import { SlotNumber } from '@aztec/foundation/branded-types';
1
+ import { IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { makeBlockProposal, makeCheckpointProposal, makeL2BlockHeader } from '@aztec/stdlib/testing';
5
- import { MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
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';
6
7
  import { mockCheckpointAttestation } from './mocks.js';
7
8
  const NUMBER_OF_SIGNERS_PER_TEST = 4;
8
9
  export function describeAttestationPool(getAttestationPool) {
@@ -19,7 +20,9 @@ export function describeAttestationPool(getAttestationPool) {
19
20
  return signers.map((signer)=>mockCheckpointAttestation(signer, slotNumber, archiveToUse));
20
21
  };
21
22
  const mockBlockProposalForPool = (signer, slotNumber, archive = Fr.random())=>{
22
- const header = makeL2BlockHeader(1, 2, slotNumber);
23
+ const header = makeBlockHeader(1, {
24
+ slotNumber: SlotNumber(slotNumber)
25
+ });
23
26
  return makeBlockProposal({
24
27
  signer,
25
28
  blockHeader: header,
@@ -39,20 +42,16 @@ export function describeAttestationPool(getAttestationPool) {
39
42
  const slotNumber = 420;
40
43
  const archive = Fr.random();
41
44
  const attestations = signers.slice(0, -1).map((signer)=>mockCheckpointAttestation(signer, slotNumber, archive));
42
- await ap.addCheckpointAttestations(attestations);
45
+ await ap.addOwnCheckpointAttestations(attestations);
43
46
  const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
44
47
  expect(retrievedAttestations.length).toBe(attestations.length);
45
48
  compareCheckpointAttestations(retrievedAttestations, attestations);
46
- // Check hasCheckpointAttestation for added attestations
47
- for (const attestation of attestations){
48
- expect(await ap.hasCheckpointAttestation(attestation)).toBe(true);
49
- }
50
49
  const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
51
50
  expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
52
51
  compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
53
52
  // Add another one
54
53
  const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
55
- await ap.addCheckpointAttestations([
54
+ await ap.addOwnCheckpointAttestations([
56
55
  newAttestation
57
56
  ]);
58
57
  const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
@@ -61,7 +60,6 @@ export function describeAttestationPool(getAttestationPool) {
61
60
  ...attestations,
62
61
  newAttestation
63
62
  ]);
64
- expect(await ap.hasCheckpointAttestation(newAttestation)).toBe(true);
65
63
  const retrievedAttestationsForSlotAfterAdd = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
66
64
  expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
67
65
  compareCheckpointAttestations(retrievedAttestationsForSlotAfterAdd, [
@@ -69,32 +67,30 @@ export function describeAttestationPool(getAttestationPool) {
69
67
  newAttestation
70
68
  ]);
71
69
  // Delete by slot
72
- await ap.deleteCheckpointAttestationsOlderThan(SlotNumber(slotNumber + 1));
70
+ await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
73
71
  const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
74
72
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
75
- // Check hasCheckpointAttestation after deletion
76
- for (const attestation of attestations){
77
- expect(await ap.hasCheckpointAttestation(attestation)).toBe(false);
78
- }
79
- expect(await ap.hasCheckpointAttestation(newAttestation)).toBe(false);
80
73
  });
81
74
  it('should handle duplicate proposals in a slot', async ()=>{
82
75
  const slotNumber = 420;
83
76
  const archive = Fr.random();
84
- // Use the same signer for all attestations
77
+ const header = CheckpointHeader.random({
78
+ slotNumber: SlotNumber(slotNumber)
79
+ });
80
+ // Use the same signer and header for all attestations
85
81
  const attestations = [];
86
82
  const signer = signers[0];
87
83
  for(let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++){
88
- attestations.push(mockCheckpointAttestation(signer, slotNumber, archive));
84
+ attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
89
85
  }
90
86
  // Add them to store and check we end up with only one
91
- await ap.addCheckpointAttestations(attestations);
87
+ await ap.addOwnCheckpointAttestations(attestations);
92
88
  const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
93
89
  expect(retreivedAttestations.length).toBe(1);
94
90
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
95
91
  expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
96
92
  // Try adding them on another operation and check they are still not duplicated
97
- await ap.addCheckpointAttestations([
93
+ await ap.addOwnCheckpointAttestations([
98
94
  attestations[0]
99
95
  ]);
100
96
  expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
@@ -107,7 +103,7 @@ export function describeAttestationPool(getAttestationPool) {
107
103
  4
108
104
  ];
109
105
  const attestations = signers.map((signer, i)=>mockCheckpointAttestation(signer, slotNumbers[i]));
110
- await ap.addCheckpointAttestations(attestations);
106
+ await ap.addOwnCheckpointAttestations(attestations);
111
107
  for (const attestation of attestations){
112
108
  const slot = attestation.payload.header.slotNumber;
113
109
  const archive = attestation.archive.toString();
@@ -131,7 +127,7 @@ export function describeAttestationPool(getAttestationPool) {
131
127
  Fr.random()
132
128
  ];
133
129
  const attestations = signers.map((signer, i)=>mockCheckpointAttestation(signer, slotNumbers[i], archives[i]));
134
- await ap.addCheckpointAttestations(attestations);
130
+ await ap.addOwnCheckpointAttestations(attestations);
135
131
  for (const attestation of attestations){
136
132
  const slot = attestation.payload.header.slotNumber;
137
133
  const proposalId = attestation.archive.toString();
@@ -154,10 +150,10 @@ export function describeAttestationPool(getAttestationPool) {
154
150
  ];
155
151
  const attestations = (await Promise.all(slotNumbers.map((slotNumber)=>createCheckpointAttestationsForSlot(slotNumber)))).flat();
156
152
  const proposalId = attestations[0].archive.toString();
157
- await ap.addCheckpointAttestations(attestations);
153
+ await ap.addOwnCheckpointAttestations(attestations);
158
154
  const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
159
155
  expect(attestationsForSlot1.length).toBe(signers.length);
160
- await ap.deleteCheckpointAttestationsOlderThan(SlotNumber(73));
156
+ await ap.deleteOlderThan(SlotNumber(73));
161
157
  const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
162
158
  expect(attestationsForSlot1AfterDelete.length).toBe(0);
163
159
  });
@@ -168,107 +164,88 @@ export function describeAttestationPool(getAttestationPool) {
168
164
  const archive = Fr.random();
169
165
  const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
170
166
  const proposalId = proposal.archive.toString();
171
- 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);
172
171
  const retrievedProposal = await ap.getBlockProposal(proposalId);
173
172
  expect(retrievedProposal).toBeDefined();
174
173
  expect(retrievedProposal).toEqual(proposal);
175
- // Check hasBlockProposal with both id and object
176
- expect(await ap.hasBlockProposal(proposalId)).toBe(true);
177
- expect(await ap.hasBlockProposal(proposal)).toBe(true);
178
174
  });
179
175
  it('should return undefined for non-existent block proposal', async ()=>{
180
176
  const nonExistentId = Fr.random().toString();
181
177
  const retrievedProposal = await ap.getBlockProposal(nonExistentId);
182
178
  expect(retrievedProposal).toBeUndefined();
183
- // Check hasBlockProposal returns false for non-existent proposal
184
- expect(await ap.hasBlockProposal(nonExistentId)).toBe(false);
185
179
  });
186
- it('should update block proposal if added twice with same id', async ()=>{
180
+ it('should return alreadyExists when adding proposal with same id', async ()=>{
187
181
  const slotNumber = 420;
188
182
  const archive = Fr.random();
189
183
  const proposal1 = await mockBlockProposalForPool(signers[0], slotNumber, archive);
190
184
  const proposalId = proposal1.archive.toString();
191
- await ap.addBlockProposal(proposal1);
185
+ const result1 = await ap.tryAddBlockProposal(proposal1);
186
+ expect(result1.added).toBe(true);
187
+ expect(result1.alreadyExists).toBe(false);
192
188
  // Create a new proposal with same archive but different signer
193
189
  const proposal2 = await mockBlockProposalForPool(signers[1], slotNumber, archive);
194
- await ap.addBlockProposal(proposal2);
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
195
194
  const retrievedProposal = await ap.getBlockProposal(proposalId);
196
195
  expect(retrievedProposal).toBeDefined();
197
- // Should have the second proposal
198
- expect(retrievedProposal.toBuffer()).toEqual(proposal2.toBuffer());
199
- expect(retrievedProposal.getSender()?.toString()).toBe(signers[1].address.toString());
200
- });
201
- it('should handle block proposals with different slots and same archive', async ()=>{
202
- const archive = Fr.random();
203
- const proposal1 = await mockBlockProposalForPool(signers[0], 100, archive);
204
- const proposal2 = await mockBlockProposalForPool(signers[1], 200, archive);
205
- const proposalId = archive.toString();
206
- await ap.addBlockProposal(proposal1);
207
- await ap.addBlockProposal(proposal2);
208
- // Should get the latest one added
209
- const retrievedProposal = await ap.getBlockProposal(proposalId);
210
- expect(retrievedProposal).toBeDefined();
211
- expect(retrievedProposal.toBuffer()).toEqual(proposal2.toBuffer());
212
- expect(retrievedProposal.slotNumber).toBe(SlotNumber(200));
196
+ expect(retrievedProposal.toBuffer()).toEqual(proposal1.toBuffer());
197
+ expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
213
198
  });
214
199
  });
215
200
  describe('CheckpointProposal in attestation pool', ()=>{
216
- const mockCheckpointProposalForPool = (signer, slotNumber, archive = Fr.random())=>{
217
- const header = makeL2BlockHeader(1, 2, slotNumber);
218
- return makeCheckpointProposal({
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({
219
207
  signer,
220
- checkpointHeader: header.toCheckpointHeader(),
208
+ checkpointHeader,
221
209
  archiveRoot: archive,
222
210
  lastBlock: {
223
- blockHeader: header
211
+ blockHeader
224
212
  }
225
213
  });
214
+ // Return the core version since tryAddCheckpointProposal now takes CheckpointProposalCore
215
+ return proposal.toCore();
226
216
  };
227
- it('should add and retrieve checkpoint proposal as core (without lastBlock)', async ()=>{
217
+ it('should add and retrieve checkpoint proposal', async ()=>{
228
218
  const slotNumber = 420;
229
219
  const archive = Fr.random();
230
220
  const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
231
221
  const proposalId = proposal.archive.toString();
232
- await ap.addCheckpointProposal(proposal);
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);
233
226
  const retrievedProposal = await ap.getCheckpointProposal(proposalId);
234
227
  expect(retrievedProposal).toBeDefined();
235
- // Should return core version (without lastBlock)
236
- expect(retrievedProposal.toBuffer()).toEqual(proposal.toCore().toBuffer());
237
- // Check hasCheckpointProposal with both id and object
238
- expect(await ap.hasCheckpointProposal(proposalId)).toBe(true);
239
- expect(await ap.hasCheckpointProposal(proposal)).toBe(true);
228
+ expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
240
229
  });
241
- it('should extract and store block proposal when adding checkpoint proposal with lastBlock', async ()=>{
230
+ it('should handle checkpoint proposal without lastBlock (caller extracts and adds block separately)', async ()=>{
242
231
  const slotNumber = 420;
243
232
  const archive = Fr.random();
244
- const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
245
- const proposalId = proposal.archive.toString();
246
- // Verify the proposal has a lastBlock
247
- const expectedBlockProposal = proposal.getBlockProposal();
248
- expect(expectedBlockProposal).toBeDefined();
249
- await ap.addCheckpointProposal(proposal);
250
- // The block proposal should be stored separately and retrievable
251
- const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
252
- expect(retrievedBlockProposal).toBeDefined();
253
- expect(retrievedBlockProposal.archive.toString()).toBe(archive.toString());
254
- expect(retrievedBlockProposal.blockHeader.toBuffer()).toEqual(expectedBlockProposal.blockHeader.toBuffer());
255
- });
256
- it('should not store block proposal when checkpoint proposal has no lastBlock', async ()=>{
257
- const slotNumber = 420;
258
- const archive = Fr.random();
259
- const header = makeL2BlockHeader(1, 2, slotNumber);
233
+ const checkpointHeader = makeCheckpointHeader(1, {
234
+ slotNumber: SlotNumber(slotNumber)
235
+ });
260
236
  // Create a checkpoint proposal WITHOUT lastBlock
261
237
  const proposal = await makeCheckpointProposal({
262
238
  signer: signers[0],
263
- checkpointHeader: header.toCheckpointHeader(),
239
+ checkpointHeader,
264
240
  archiveRoot: archive
265
241
  });
266
242
  const proposalId = proposal.archive.toString();
267
- await ap.addCheckpointProposal(proposal);
243
+ // Add the checkpoint core - block extraction is now caller responsibility
244
+ await ap.tryAddCheckpointProposal(proposal.toCore());
268
245
  // The checkpoint proposal should be stored
269
246
  const retrievedCheckpointProposal = await ap.getCheckpointProposal(proposalId);
270
247
  expect(retrievedCheckpointProposal).toBeDefined();
271
- // But no block proposal should be stored (archive key won't have a block proposal)
248
+ // No block proposal was extracted (it had none anyway)
272
249
  const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
273
250
  expect(retrievedBlockProposal).toBeUndefined();
274
251
  });
@@ -276,34 +253,334 @@ export function describeAttestationPool(getAttestationPool) {
276
253
  const nonExistentId = Fr.random().toString();
277
254
  const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
278
255
  expect(retrievedProposal).toBeUndefined();
279
- // Check hasCheckpointProposal returns false for non-existent proposal
280
- expect(await ap.hasCheckpointProposal(nonExistentId)).toBe(false);
281
256
  });
282
- it('should update checkpoint proposal if added twice with same id', async ()=>{
257
+ it('should return alreadyExists when adding proposal with same id', async ()=>{
283
258
  const slotNumber = 420;
284
259
  const archive = Fr.random();
285
260
  const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
286
261
  const proposalId = proposal1.archive.toString();
287
- await ap.addCheckpointProposal(proposal1);
262
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
263
+ expect(result1.added).toBe(true);
264
+ expect(result1.alreadyExists).toBe(false);
288
265
  // Create a new proposal with same archive but different signer
289
266
  const proposal2 = await mockCheckpointProposalForPool(signers[1], slotNumber, archive);
290
- await ap.addCheckpointProposal(proposal2);
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
291
271
  const retrievedProposal = await ap.getCheckpointProposal(proposalId);
292
272
  expect(retrievedProposal).toBeDefined();
293
- // Should have the second proposal (as core)
294
- expect(retrievedProposal.toBuffer()).toEqual(proposal2.toCore().toBuffer());
295
- expect(retrievedProposal.getSender()?.toString()).toBe(signers[1].address.toString());
273
+ expect(retrievedProposal.toBuffer()).toEqual(proposal1.toBuffer());
274
+ expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
296
275
  });
297
- it('should throw ProposalSlotCapExceededError when exceeding capacity', async ()=>{
276
+ it('should return added=false when exceeding capacity', async ()=>{
298
277
  const slotNumber = 420;
299
- // Add MAX_PROPOSALS_PER_SLOT proposals
300
- for(let i = 0; i < MAX_PROPOSALS_PER_SLOT; i++){
278
+ // Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
279
+ for(let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++){
301
280
  const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
302
- await ap.addCheckpointProposal(proposal);
281
+ const result = await ap.tryAddCheckpointProposal(proposal);
282
+ expect(result.added).toBe(true);
283
+ expect(result.count).toBe(i + 1);
303
284
  }
304
- // The next proposal should throw
285
+ // The next proposal should not be added
305
286
  const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
306
- await expect(ap.addCheckpointProposal(extraProposal)).rejects.toThrow('Maximum checkpoint proposals per slot');
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
+ });
307
584
  });
308
585
  });
309
586
  }
@@ -1,3 +1,2 @@
1
- export * from './attestation_pool.js';
2
- export * from './memory_attestation_pool.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsOEJBQThCLENBQUMifQ==
1
+ export { AttestationPool, type AttestationPoolApi, type TryAddResult, createTestAttestationPool, MAX_CHECKPOINT_PROPOSALS_PER_SLOT, MAX_BLOCK_PROPOSALS_PER_POSITION, MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER, } from './attestation_pool.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssWUFBWSxFQUNqQix5QkFBeUIsRUFDekIsaUNBQWlDLEVBQ2pDLGdDQUFnQyxFQUNoQyxvQ0FBb0MsR0FDckMsTUFBTSx1QkFBdUIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,yBAAyB,EACzB,iCAAiC,EACjC,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,uBAAuB,CAAC"}
@@ -1,2 +1 @@
1
- export * from './attestation_pool.js';
2
- export * from './memory_attestation_pool.js';
1
+ export { AttestationPool, createTestAttestationPool, MAX_CHECKPOINT_PROPOSALS_PER_SLOT, MAX_BLOCK_PROPOSALS_PER_POSITION, MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER } from './attestation_pool.js';