@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.017a351

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