@aztec/p2p 0.0.1-commit.e558bd1c → 0.0.1-commit.e57c76e

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