@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
@@ -3,7 +3,7 @@ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
4
  import { CheckpointHeader } from '@aztec/stdlib/rollup';
5
5
  import { makeBlockHeader, makeBlockProposal, makeCheckpointHeader, makeCheckpointProposal } from '@aztec/stdlib/testing';
6
- import { MAX_PROPOSALS_PER_POSITION, MAX_PROPOSALS_PER_SLOT } from './attestation_pool.js';
6
+ import { MAX_BLOCK_PROPOSALS_PER_POSITION, MAX_CHECKPOINT_PROPOSALS_PER_SLOT } from './attestation_pool.js';
7
7
  import { mockCheckpointAttestation } from './mocks.js';
8
8
  const NUMBER_OF_SIGNERS_PER_TEST = 4;
9
9
  export function describeAttestationPool(getAttestationPool) {
@@ -15,9 +15,17 @@ export function describeAttestationPool(getAttestationPool) {
15
15
  length: NUMBER_OF_SIGNERS_PER_TEST
16
16
  }, ()=>Secp256k1Signer.random());
17
17
  });
18
- const createCheckpointAttestationsForSlot = (slotNumber, archive)=>{
18
+ /**
19
+ * Build attestations from each signer over the *same* signed payload (same header,
20
+ * archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
21
+ * payload hash and treats attestations from different signers as distinct entries
22
+ * only when the payload itself matches.
23
+ */ const createCheckpointAttestationsForSlot = (slotNumber, archive)=>{
19
24
  const archiveToUse = archive ?? Fr.random();
20
- return signers.map((signer)=>mockCheckpointAttestation(signer, slotNumber, archiveToUse));
25
+ const sharedHeader = CheckpointHeader.random({
26
+ slotNumber: SlotNumber(slotNumber)
27
+ });
28
+ return signers.map((signer)=>mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
21
29
  };
22
30
  const mockBlockProposalForPool = (signer, slotNumber, archive = Fr.random())=>{
23
31
  const header = makeBlockHeader(1, {
@@ -41,20 +49,24 @@ export function describeAttestationPool(getAttestationPool) {
41
49
  it('should add attestations to pool', async ()=>{
42
50
  const slotNumber = 420;
43
51
  const archive = Fr.random();
44
- const attestations = signers.slice(0, -1).map((signer)=>mockCheckpointAttestation(signer, slotNumber, archive));
52
+ const sharedHeader = CheckpointHeader.random({
53
+ slotNumber: SlotNumber(slotNumber)
54
+ });
55
+ const attestations = signers.slice(0, -1).map((signer)=>mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
56
+ const payloadHash = attestations[0].getPayloadHash();
45
57
  await ap.addOwnCheckpointAttestations(attestations);
46
- const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
58
+ const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
47
59
  expect(retrievedAttestations.length).toBe(attestations.length);
48
60
  compareCheckpointAttestations(retrievedAttestations, attestations);
49
61
  const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
50
62
  expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
51
63
  compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
52
64
  // Add another one
53
- const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
65
+ const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive, sharedHeader);
54
66
  await ap.addOwnCheckpointAttestations([
55
67
  newAttestation
56
68
  ]);
57
- const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
69
+ const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
58
70
  expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
59
71
  compareCheckpointAttestations(retrievedAttestationsAfterAdd, [
60
72
  ...attestations,
@@ -68,7 +80,7 @@ export function describeAttestationPool(getAttestationPool) {
68
80
  ]);
69
81
  // Delete by slot
70
82
  await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
71
- const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
83
+ const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
72
84
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
73
85
  });
74
86
  it('should handle duplicate proposals in a slot', async ()=>{
@@ -83,9 +95,10 @@ export function describeAttestationPool(getAttestationPool) {
83
95
  for(let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++){
84
96
  attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
85
97
  }
98
+ const payloadHash = attestations[0].getPayloadHash();
86
99
  // Add them to store and check we end up with only one
87
100
  await ap.addOwnCheckpointAttestations(attestations);
88
- const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
101
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
89
102
  expect(retreivedAttestations.length).toBe(1);
90
103
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
91
104
  expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
@@ -93,7 +106,7 @@ export function describeAttestationPool(getAttestationPool) {
93
106
  await ap.addOwnCheckpointAttestations([
94
107
  attestations[0]
95
108
  ]);
96
- expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
109
+ expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
97
110
  });
98
111
  it('should store attestations by differing slot', async ()=>{
99
112
  const slotNumbers = [
@@ -106,8 +119,8 @@ export function describeAttestationPool(getAttestationPool) {
106
119
  await ap.addOwnCheckpointAttestations(attestations);
107
120
  for (const attestation of attestations){
108
121
  const slot = attestation.payload.header.slotNumber;
109
- const archive = attestation.archive.toString();
110
- const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, archive);
122
+ const payloadHash = attestation.getPayloadHash();
123
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
111
124
  expect(retreivedAttestations.length).toBe(1);
112
125
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
113
126
  expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
@@ -130,8 +143,8 @@ export function describeAttestationPool(getAttestationPool) {
130
143
  await ap.addOwnCheckpointAttestations(attestations);
131
144
  for (const attestation of attestations){
132
145
  const slot = attestation.payload.header.slotNumber;
133
- const proposalId = attestation.archive.toString();
134
- const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, proposalId);
146
+ const payloadHash = attestation.getPayloadHash();
147
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
135
148
  expect(retreivedAttestations.length).toBe(1);
136
149
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
137
150
  expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
@@ -148,13 +161,14 @@ export function describeAttestationPool(getAttestationPool) {
148
161
  88,
149
162
  420
150
163
  ];
151
- const attestations = (await Promise.all(slotNumbers.map((slotNumber)=>createCheckpointAttestationsForSlot(slotNumber)))).flat();
152
- const proposalId = attestations[0].archive.toString();
164
+ const attestationsPerSlot = await Promise.all(slotNumbers.map((slotNumber)=>createCheckpointAttestationsForSlot(slotNumber)));
165
+ const attestations = attestationsPerSlot.flat();
166
+ const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
153
167
  await ap.addOwnCheckpointAttestations(attestations);
154
- const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
168
+ const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
155
169
  expect(attestationsForSlot1.length).toBe(signers.length);
156
170
  await ap.deleteOlderThan(SlotNumber(73));
157
- const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
171
+ const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
158
172
  expect(attestationsForSlot1AfterDelete.length).toBe(0);
159
173
  });
160
174
  });
@@ -163,49 +177,81 @@ export function describeAttestationPool(getAttestationPool) {
163
177
  const slotNumber = 420;
164
178
  const archive = Fr.random();
165
179
  const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
166
- const proposalId = proposal.archive.toString();
167
180
  const result = await ap.tryAddBlockProposal(proposal);
168
181
  expect(result.added).toBe(true);
169
182
  expect(result.alreadyExists).toBe(false);
170
- expect(result.totalForPosition).toBe(1);
171
- const retrievedProposal = await ap.getBlockProposal(proposalId);
183
+ expect(result.count).toBe(1);
184
+ const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
172
185
  expect(retrievedProposal).toBeDefined();
173
186
  expect(retrievedProposal).toEqual(proposal);
174
187
  });
175
188
  it('should return undefined for non-existent block proposal', async ()=>{
176
189
  const nonExistentId = Fr.random().toString();
177
- const retrievedProposal = await ap.getBlockProposal(nonExistentId);
190
+ const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
178
191
  expect(retrievedProposal).toBeUndefined();
179
192
  });
180
- it('should return alreadyExists when adding proposal with same id', async ()=>{
193
+ it('should return alreadyExists when re-adding the same signed payload', async ()=>{
181
194
  const slotNumber = 420;
182
195
  const archive = Fr.random();
183
- const proposal1 = await mockBlockProposalForPool(signers[0], slotNumber, archive);
184
- const proposalId = proposal1.archive.toString();
185
- const result1 = await ap.tryAddBlockProposal(proposal1);
196
+ const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
197
+ const result1 = await ap.tryAddBlockProposal(proposal);
186
198
  expect(result1.added).toBe(true);
187
199
  expect(result1.alreadyExists).toBe(false);
188
- // Create a new proposal with same archive but different signer
189
- const proposal2 = await mockBlockProposalForPool(signers[1], slotNumber, archive);
190
- const result2 = await ap.tryAddBlockProposal(proposal2);
200
+ // Re-broadcasting the exact same proposal yields alreadyExists.
201
+ const result2 = await ap.tryAddBlockProposal(proposal);
191
202
  expect(result2.added).toBe(false);
192
203
  expect(result2.alreadyExists).toBe(true);
193
- // Should still have the first proposal
194
- const retrievedProposal = await ap.getBlockProposal(proposalId);
204
+ const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
195
205
  expect(retrievedProposal).toBeDefined();
196
- expect(retrievedProposal.toBuffer()).toEqual(proposal1.toBuffer());
206
+ expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
197
207
  expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
198
208
  });
209
+ it('should retain an exact duplicate block proposal only once', async ()=>{
210
+ const slotNumber = 420;
211
+ const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
212
+ await ap.tryAddBlockProposal(proposal);
213
+ await ap.tryAddBlockProposal(proposal);
214
+ const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
215
+ expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual([
216
+ proposal.withoutSignedTxs().toBuffer()
217
+ ]);
218
+ });
219
+ it('should retain all accepted block proposals at a position', async ()=>{
220
+ const slotNumber = 420;
221
+ const blockHeader = makeBlockHeader(1, {
222
+ slotNumber: SlotNumber(slotNumber)
223
+ });
224
+ const proposal1 = await makeBlockProposal({
225
+ signer: signers[0],
226
+ blockHeader,
227
+ archiveRoot: Fr.random(),
228
+ indexWithinCheckpoint: IndexWithinCheckpoint(1)
229
+ });
230
+ const proposal2 = await makeBlockProposal({
231
+ signer: signers[0],
232
+ blockHeader,
233
+ archiveRoot: Fr.random(),
234
+ indexWithinCheckpoint: IndexWithinCheckpoint(1)
235
+ });
236
+ await ap.tryAddBlockProposal(proposal1);
237
+ await ap.tryAddBlockProposal(proposal2);
238
+ const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
239
+ expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
240
+ proposal1.withoutSignedTxs().toBuffer(),
241
+ proposal2.withoutSignedTxs().toBuffer()
242
+ ]));
243
+ expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
244
+ });
199
245
  });
200
246
  describe('CheckpointProposal in attestation pool', ()=>{
201
- const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random())=>{
202
- const checkpointHeader = makeCheckpointHeader(1, {
247
+ const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
248
+ const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
203
249
  slotNumber: SlotNumber(slotNumber)
204
250
  });
205
251
  const blockHeader = makeBlockHeader(1);
206
252
  const proposal = await makeCheckpointProposal({
207
253
  signer,
208
- checkpointHeader,
254
+ checkpointHeader: headerToUse,
209
255
  archiveRoot: archive,
210
256
  lastBlock: {
211
257
  blockHeader
@@ -218,12 +264,11 @@ export function describeAttestationPool(getAttestationPool) {
218
264
  const slotNumber = 420;
219
265
  const archive = Fr.random();
220
266
  const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
221
- const proposalId = proposal.archive.toString();
222
267
  const result = await ap.tryAddCheckpointProposal(proposal);
223
268
  expect(result.added).toBe(true);
224
269
  expect(result.alreadyExists).toBe(false);
225
- expect(result.totalForPosition).toBe(1);
226
- const retrievedProposal = await ap.getCheckpointProposal(proposalId);
270
+ expect(result.count).toBe(1);
271
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
227
272
  expect(retrievedProposal).toBeDefined();
228
273
  expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
229
274
  });
@@ -239,55 +284,126 @@ export function describeAttestationPool(getAttestationPool) {
239
284
  checkpointHeader,
240
285
  archiveRoot: archive
241
286
  });
242
- const proposalId = proposal.archive.toString();
243
287
  // Add the checkpoint core - block extraction is now caller responsibility
244
288
  await ap.tryAddCheckpointProposal(proposal.toCore());
245
289
  // The checkpoint proposal should be stored
246
- const retrievedCheckpointProposal = await ap.getCheckpointProposal(proposalId);
290
+ const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
247
291
  expect(retrievedCheckpointProposal).toBeDefined();
248
292
  // No block proposal was extracted (it had none anyway)
249
- const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
293
+ const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
250
294
  expect(retrievedBlockProposal).toBeUndefined();
251
295
  });
252
296
  it('should return undefined for non-existent checkpoint proposal', async ()=>{
253
- const nonExistentId = Fr.random().toString();
254
- const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
297
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
255
298
  expect(retrievedProposal).toBeUndefined();
256
299
  });
257
- it('should return alreadyExists when adding proposal with same id', async ()=>{
300
+ it('should return alreadyExists when re-adding the same signed payload', async ()=>{
258
301
  const slotNumber = 420;
259
302
  const archive = Fr.random();
260
- const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
261
- const proposalId = proposal1.archive.toString();
262
- const result1 = await ap.tryAddCheckpointProposal(proposal1);
303
+ const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
304
+ const result1 = await ap.tryAddCheckpointProposal(proposal);
263
305
  expect(result1.added).toBe(true);
264
306
  expect(result1.alreadyExists).toBe(false);
265
- // Create a new proposal with same archive but different signer
266
- const proposal2 = await mockCheckpointProposalForPool(signers[1], slotNumber, archive);
267
- const result2 = await ap.tryAddCheckpointProposal(proposal2);
307
+ // Re-broadcasting the exact same signed payload yields alreadyExists.
308
+ const result2 = await ap.tryAddCheckpointProposal(proposal);
268
309
  expect(result2.added).toBe(false);
269
310
  expect(result2.alreadyExists).toBe(true);
270
- // Should still have the first proposal
271
- const retrievedProposal = await ap.getCheckpointProposal(proposalId);
311
+ // Should still have the first proposal stored at the slot
312
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
272
313
  expect(retrievedProposal).toBeDefined();
273
- expect(retrievedProposal.toBuffer()).toEqual(proposal1.toBuffer());
314
+ expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
274
315
  expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
275
316
  });
317
+ it('should treat distinct payloads at the same slot as equivocations (count = 2)', async ()=>{
318
+ const slotNumber = 420;
319
+ // Two proposals at the same slot but with different headers (distinct payloads).
320
+ const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
321
+ const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
322
+ const result1 = await ap.tryAddCheckpointProposal(proposal1);
323
+ expect(result1.added).toBe(true);
324
+ expect(result1.count).toBe(1);
325
+ const result2 = await ap.tryAddCheckpointProposal(proposal2);
326
+ // The second distinct payload is tracked as an equivocation, count goes to 2,
327
+ // and both accepted payloads are retained by payload hash.
328
+ expect(result2.added).toBe(true);
329
+ expect(result2.alreadyExists).toBe(false);
330
+ expect(result2.count).toBe(2);
331
+ const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
332
+ const expectedProposal = [
333
+ proposal1,
334
+ proposal2
335
+ ].sort((a, b)=>a.getPayloadHash().localeCompare(b.getPayloadHash()))[0];
336
+ expect(retrievedProposal.toBuffer()).toEqual(expectedProposal.toBuffer());
337
+ const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
338
+ expect(proposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
339
+ proposal1.toBuffer(),
340
+ proposal2.toBuffer()
341
+ ]));
342
+ });
343
+ it('should detect equivocation when only feeAssetPriceModifier differs', async ()=>{
344
+ const slotNumber = 420;
345
+ const archive = Fr.random();
346
+ // Same checkpoint header + archive, but two different feeAssetPriceModifier values.
347
+ // This is the audit-finding scenario: archive collides but the signed payload differs.
348
+ const sharedHeader = makeCheckpointHeader(1, {
349
+ slotNumber: SlotNumber(slotNumber)
350
+ });
351
+ const proposalA = await makeCheckpointProposal({
352
+ signer: signers[0],
353
+ checkpointHeader: sharedHeader,
354
+ archiveRoot: archive,
355
+ feeAssetPriceModifier: 50n
356
+ });
357
+ const proposalB = await makeCheckpointProposal({
358
+ signer: signers[0],
359
+ checkpointHeader: sharedHeader,
360
+ archiveRoot: archive,
361
+ feeAssetPriceModifier: -50n
362
+ });
363
+ const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
364
+ expect(result1.count).toBe(1);
365
+ const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
366
+ // The fix: archive collision no longer hides the equivocation; payload-hash dedup
367
+ // sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
368
+ expect(result2.added).toBe(true);
369
+ expect(result2.alreadyExists).toBe(false);
370
+ expect(result2.count).toBe(2);
371
+ });
372
+ it('should delete retained proposals older than a given slot', async ()=>{
373
+ const oldSlot = 100;
374
+ const newSlot = 200;
375
+ const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
376
+ const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
377
+ const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
378
+ const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
379
+ await ap.tryAddBlockProposal(oldBlock);
380
+ await ap.tryAddBlockProposal(newBlock);
381
+ await ap.tryAddCheckpointProposal(oldCheckpoint);
382
+ await ap.tryAddCheckpointProposal(newCheckpoint);
383
+ await ap.deleteOlderThan(SlotNumber(newSlot));
384
+ expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
385
+ blockProposals: [],
386
+ checkpointProposals: []
387
+ });
388
+ const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
389
+ expect(newProposals.blockProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newBlock.withoutSignedTxs().toBuffer());
390
+ expect(newProposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newCheckpoint.toBuffer());
391
+ });
276
392
  it('should return added=false when exceeding capacity', async ()=>{
277
393
  const slotNumber = 420;
278
- // Add MAX_PROPOSALS_PER_SLOT proposals
279
- for(let i = 0; i < MAX_PROPOSALS_PER_SLOT; i++){
394
+ // Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
395
+ for(let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++){
280
396
  const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
281
397
  const result = await ap.tryAddCheckpointProposal(proposal);
282
398
  expect(result.added).toBe(true);
283
- expect(result.totalForPosition).toBe(i + 1);
399
+ expect(result.count).toBe(i + 1);
284
400
  }
285
- // The next proposal should not be added
401
+ // The next proposal should not be added.
286
402
  const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
287
403
  const result = await ap.tryAddCheckpointProposal(extraProposal);
288
404
  expect(result.added).toBe(false);
289
405
  expect(result.alreadyExists).toBe(false);
290
- expect(result.totalForPosition).toBe(MAX_PROPOSALS_PER_SLOT);
406
+ expect(result.count).toBe(MAX_CHECKPOINT_PROPOSALS_PER_SLOT);
291
407
  });
292
408
  });
293
409
  describe('Duplicate proposal detection', ()=>{
@@ -303,12 +419,12 @@ export function describeAttestationPool(getAttestationPool) {
303
419
  });
304
420
  };
305
421
  describe('tryAddBlockProposal duplicate detection', ()=>{
306
- it('should return totalForPosition=1 when pool is empty', async ()=>{
422
+ it('should return count=1 when pool is empty', async ()=>{
307
423
  const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
308
424
  const result = await ap.tryAddBlockProposal(proposal);
309
425
  expect(result.added).toBe(true);
310
426
  expect(result.alreadyExists).toBe(false);
311
- expect(result.totalForPosition).toBe(1);
427
+ expect(result.count).toBe(1);
312
428
  });
313
429
  it('should return alreadyExists when same proposal exists', async ()=>{
314
430
  const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
@@ -316,22 +432,22 @@ export function describeAttestationPool(getAttestationPool) {
316
432
  const result = await ap.tryAddBlockProposal(proposal);
317
433
  expect(result.added).toBe(false);
318
434
  expect(result.alreadyExists).toBe(true);
319
- expect(result.totalForPosition).toBe(1);
435
+ expect(result.count).toBe(1);
320
436
  });
321
- it('should detect duplicate via totalForPosition when different proposal exists at same position', async ()=>{
437
+ it('should detect duplicate via count when different proposal exists at same position', async ()=>{
322
438
  const slotNumber = 100;
323
439
  const indexWithinCheckpoint = 2;
324
440
  // Add first proposal
325
441
  const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
326
442
  const result1 = await ap.tryAddBlockProposal(proposal1);
327
- expect(result1.totalForPosition).toBe(1);
443
+ expect(result1.count).toBe(1);
328
444
  // Add a different proposal at same position - this is a duplicate (equivocation)
329
445
  const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
330
446
  const result2 = await ap.tryAddBlockProposal(proposal2);
331
447
  expect(result2.added).toBe(true);
332
448
  expect(result2.alreadyExists).toBe(false);
333
- // totalForPosition >= 2 indicates duplicate detection
334
- expect(result2.totalForPosition).toBe(2);
449
+ // count >= 2 indicates duplicate detection
450
+ expect(result2.count).toBe(2);
335
451
  });
336
452
  it('should not detect duplicate for different positions in same slot', async ()=>{
337
453
  const slotNumber = 100;
@@ -342,8 +458,8 @@ export function describeAttestationPool(getAttestationPool) {
342
458
  const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
343
459
  const result = await ap.tryAddBlockProposal(proposal2);
344
460
  expect(result.added).toBe(true);
345
- // totalForPosition = 1 means no duplicate for this position
346
- expect(result.totalForPosition).toBe(1);
461
+ // count = 1 means no duplicate for this position
462
+ expect(result.count).toBe(1);
347
463
  });
348
464
  it('should not detect duplicate for same position in different slots', async ()=>{
349
465
  const indexWithinCheckpoint = 0;
@@ -354,41 +470,41 @@ export function describeAttestationPool(getAttestationPool) {
354
470
  const proposal2 = await mockBlockProposalWithIndex(signers[1], 200, indexWithinCheckpoint);
355
471
  const result = await ap.tryAddBlockProposal(proposal2);
356
472
  expect(result.added).toBe(true);
357
- // totalForPosition = 1 means no duplicate for this position
358
- expect(result.totalForPosition).toBe(1);
473
+ // count = 1 means no duplicate for this position
474
+ expect(result.count).toBe(1);
359
475
  });
360
- it('should track multiple duplicates correctly via totalForPosition', async ()=>{
476
+ it('should track multiple duplicates correctly via count', async ()=>{
361
477
  const slotNumber = 100;
362
478
  const indexWithinCheckpoint = 0;
363
479
  // Add multiple proposals for same position
364
480
  const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
365
481
  const result1 = await ap.tryAddBlockProposal(proposal1);
366
- expect(result1.totalForPosition).toBe(1);
482
+ expect(result1.count).toBe(1);
367
483
  const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
368
484
  const result2 = await ap.tryAddBlockProposal(proposal2);
369
- expect(result2.totalForPosition).toBe(2);
370
- // Add a third proposal for same position
485
+ expect(result2.count).toBe(2);
486
+ // Third proposal for same position should be rejected (cap is 2)
371
487
  const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
372
488
  const result3 = await ap.tryAddBlockProposal(proposal3);
373
- expect(result3.added).toBe(true);
374
- expect(result3.totalForPosition).toBe(3);
489
+ expect(result3.added).toBe(false);
490
+ expect(result3.count).toBe(2);
375
491
  });
376
492
  it('should return added=false when exceeding capacity', async ()=>{
377
493
  const slotNumber = 100;
378
494
  const indexWithinCheckpoint = 0;
379
- // Add MAX_PROPOSALS_PER_POSITION proposals
380
- for(let i = 0; i < MAX_PROPOSALS_PER_POSITION; i++){
495
+ // Add MAX_BLOCK_PROPOSALS_PER_POSITION proposals
496
+ for(let i = 0; i < MAX_BLOCK_PROPOSALS_PER_POSITION; i++){
381
497
  const proposal = await mockBlockProposalWithIndex(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber, indexWithinCheckpoint);
382
498
  const result = await ap.tryAddBlockProposal(proposal);
383
499
  expect(result.added).toBe(true);
384
- expect(result.totalForPosition).toBe(i + 1);
500
+ expect(result.count).toBe(i + 1);
385
501
  }
386
502
  // The next proposal should not be added
387
503
  const extraProposal = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
388
504
  const result = await ap.tryAddBlockProposal(extraProposal);
389
505
  expect(result.added).toBe(false);
390
506
  expect(result.alreadyExists).toBe(false);
391
- expect(result.totalForPosition).toBe(MAX_PROPOSALS_PER_POSITION);
507
+ expect(result.count).toBe(MAX_BLOCK_PROPOSALS_PER_POSITION);
392
508
  });
393
509
  it('should clean up block position index when deleting old data', async ()=>{
394
510
  const slotNumber = 100;
@@ -396,16 +512,16 @@ export function describeAttestationPool(getAttestationPool) {
396
512
  // Add proposal
397
513
  const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
398
514
  await ap.tryAddBlockProposal(proposal1);
399
- // Verify it's tracked (adding another should show totalForPosition = 2)
515
+ // Verify it's tracked (adding another should show count = 2)
400
516
  const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
401
517
  let result = await ap.tryAddBlockProposal(proposal2);
402
- expect(result.totalForPosition).toBe(2);
518
+ expect(result.count).toBe(2);
403
519
  // Delete old data
404
520
  await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
405
- // Verify position index is cleaned up (totalForPosition should be 1 now)
521
+ // Verify position index is cleaned up (count should be 1 now)
406
522
  const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
407
523
  result = await ap.tryAddBlockProposal(proposal3);
408
- expect(result.totalForPosition).toBe(1);
524
+ expect(result.count).toBe(1);
409
525
  });
410
526
  it('should correctly delete block proposals at slot boundary', async ()=>{
411
527
  // Add proposals at slots 99, 100, and 101 with various indices
@@ -422,14 +538,14 @@ export function describeAttestationPool(getAttestationPool) {
422
538
  // Slot 99 proposals should have their index cleaned up
423
539
  const newProposal99 = await mockBlockProposalWithIndex(signers[0], 99, 0);
424
540
  const result99 = await ap.tryAddBlockProposal(newProposal99);
425
- expect(result99.totalForPosition).toBe(1); // Index was cleaned up
541
+ expect(result99.count).toBe(1); // Index was cleaned up
426
542
  // Slot 100 and 101 should still be tracked
427
543
  const newProposal100 = await mockBlockProposalWithIndex(signers[1], 100, 0);
428
544
  const result100 = await ap.tryAddBlockProposal(newProposal100);
429
- expect(result100.totalForPosition).toBe(2); // Still has the original
545
+ expect(result100.count).toBe(2); // Still has the original
430
546
  const newProposal101 = await mockBlockProposalWithIndex(signers[2], 101, 0);
431
547
  const result101 = await ap.tryAddBlockProposal(newProposal101);
432
- expect(result101.totalForPosition).toBe(2); // Still has the original
548
+ expect(result101.count).toBe(2); // Still has the original
433
549
  });
434
550
  it('should delete all indices for a given slot', async ()=>{
435
551
  const slotNumber = 50;
@@ -445,13 +561,13 @@ export function describeAttestationPool(getAttestationPool) {
445
561
  // All indices should be cleaned up
446
562
  const newProposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
447
563
  const result0 = await ap.tryAddBlockProposal(newProposal0);
448
- expect(result0.totalForPosition).toBe(1);
564
+ expect(result0.count).toBe(1);
449
565
  const newProposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
450
566
  const result1 = await ap.tryAddBlockProposal(newProposal1);
451
- expect(result1.totalForPosition).toBe(1);
567
+ expect(result1.count).toBe(1);
452
568
  const newProposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
453
569
  const result2 = await ap.tryAddBlockProposal(newProposal2);
454
- expect(result2.totalForPosition).toBe(1);
570
+ expect(result2.count).toBe(1);
455
571
  });
456
572
  it('should delete block proposals from storage when deleting old data', async ()=>{
457
573
  const oldSlot = 50;
@@ -462,25 +578,25 @@ export function describeAttestationPool(getAttestationPool) {
462
578
  await ap.tryAddBlockProposal(oldProposal);
463
579
  await ap.tryAddBlockProposal(newProposal);
464
580
  // Verify both proposals exist
465
- expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeDefined();
466
- expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
581
+ expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
582
+ expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
467
583
  // Delete slots older than newSlot (should delete oldSlot)
468
584
  await ap.deleteOlderThan(SlotNumber(newSlot));
469
585
  // Old proposal should be deleted from storage
470
- expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeUndefined();
586
+ expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
471
587
  // New proposal should still exist
472
- expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
588
+ expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
473
589
  });
474
590
  });
475
591
  describe('tryAddCheckpointProposal duplicate detection', ()=>{
476
- const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random())=>{
477
- const checkpointHeader = makeCheckpointHeader(1, {
592
+ const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
593
+ const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
478
594
  slotNumber: SlotNumber(slotNumber)
479
595
  });
480
596
  const blockHeader = makeBlockHeader(1);
481
597
  const proposal = await makeCheckpointProposal({
482
598
  signer,
483
- checkpointHeader,
599
+ checkpointHeader: headerToUse,
484
600
  archiveRoot: archive,
485
601
  lastBlock: {
486
602
  blockHeader
@@ -488,12 +604,12 @@ export function describeAttestationPool(getAttestationPool) {
488
604
  });
489
605
  return proposal.toCore();
490
606
  };
491
- it('should return totalForPosition=1 when pool is empty', async ()=>{
607
+ it('should return count=1 when pool is empty', async ()=>{
492
608
  const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
493
609
  const result = await ap.tryAddCheckpointProposal(proposal);
494
610
  expect(result.added).toBe(true);
495
611
  expect(result.alreadyExists).toBe(false);
496
- expect(result.totalForPosition).toBe(1);
612
+ expect(result.count).toBe(1);
497
613
  });
498
614
  it('should return alreadyExists when same proposal exists', async ()=>{
499
615
  const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
@@ -501,21 +617,21 @@ export function describeAttestationPool(getAttestationPool) {
501
617
  const result = await ap.tryAddCheckpointProposal(proposal);
502
618
  expect(result.added).toBe(false);
503
619
  expect(result.alreadyExists).toBe(true);
504
- expect(result.totalForPosition).toBe(1);
620
+ expect(result.count).toBe(1);
505
621
  });
506
- it('should detect duplicate via totalForPosition when different proposal exists for same slot', async ()=>{
622
+ it('should detect duplicate via count when different proposal exists for same slot', async ()=>{
507
623
  const slotNumber = 100;
508
624
  // Add first proposal
509
625
  const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
510
626
  const result1 = await ap.tryAddCheckpointProposal(proposal1);
511
- expect(result1.totalForPosition).toBe(1);
627
+ expect(result1.count).toBe(1);
512
628
  // Add a different proposal for same slot - this is a duplicate (equivocation)
513
629
  const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
514
630
  const result2 = await ap.tryAddCheckpointProposal(proposal2);
515
631
  expect(result2.added).toBe(true);
516
632
  expect(result2.alreadyExists).toBe(false);
517
- // totalForPosition >= 2 indicates duplicate detection
518
- expect(result2.totalForPosition).toBe(2);
633
+ // count >= 2 indicates duplicate detection
634
+ expect(result2.count).toBe(2);
519
635
  });
520
636
  it('should not detect duplicate for different slots', async ()=>{
521
637
  // Add proposal at slot 100
@@ -525,23 +641,23 @@ export function describeAttestationPool(getAttestationPool) {
525
641
  const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], 200);
526
642
  const result = await ap.tryAddCheckpointProposal(proposal2);
527
643
  expect(result.added).toBe(true);
528
- // totalForPosition = 1 means no duplicate for this slot
529
- expect(result.totalForPosition).toBe(1);
644
+ // count = 1 means no duplicate for this slot
645
+ expect(result.count).toBe(1);
530
646
  });
531
- it('should track multiple duplicates correctly via totalForPosition', async ()=>{
647
+ it('should track multiple duplicates correctly via count', async ()=>{
532
648
  const slotNumber = 100;
533
649
  // Add multiple proposals for same slot
534
650
  const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
535
651
  const result1 = await ap.tryAddCheckpointProposal(proposal1);
536
- expect(result1.totalForPosition).toBe(1);
652
+ expect(result1.count).toBe(1);
537
653
  const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
538
654
  const result2 = await ap.tryAddCheckpointProposal(proposal2);
539
- expect(result2.totalForPosition).toBe(2);
540
- // Add a third proposal for same slot
655
+ expect(result2.count).toBe(2);
656
+ // Third proposal for same slot should be rejected (cap is 2)
541
657
  const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
542
658
  const result3 = await ap.tryAddCheckpointProposal(proposal3);
543
- expect(result3.added).toBe(true);
544
- expect(result3.totalForPosition).toBe(3);
659
+ expect(result3.added).toBe(false);
660
+ expect(result3.count).toBe(2);
545
661
  });
546
662
  it('should not count attestations as proposals for duplicate detection', async ()=>{
547
663
  const slotNumber = 100;
@@ -556,8 +672,8 @@ export function describeAttestationPool(getAttestationPool) {
556
672
  const result = await ap.tryAddCheckpointProposal(proposal);
557
673
  expect(result.added).toBe(true);
558
674
  expect(result.alreadyExists).toBe(false);
559
- // totalForPosition should be 1, NOT 2 - attestations should not count as proposals
560
- expect(result.totalForPosition).toBe(1);
675
+ // count should be 1, NOT 2 - attestations should not count as proposals
676
+ expect(result.count).toBe(1);
561
677
  });
562
678
  it('should not count attestations for different proposals as duplicates', async ()=>{
563
679
  const slotNumber = 100;
@@ -574,12 +690,12 @@ export function describeAttestationPool(getAttestationPool) {
574
690
  const proposal1 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber, archive1);
575
691
  const result1 = await ap.tryAddCheckpointProposal(proposal1);
576
692
  expect(result1.added).toBe(true);
577
- expect(result1.totalForPosition).toBe(1);
693
+ expect(result1.count).toBe(1);
578
694
  // Add the second checkpoint proposal - this IS a duplicate (different archive, same slot)
579
695
  const proposal2 = await mockCheckpointProposalCoreForPool(signers[3], slotNumber, archive2);
580
696
  const result2 = await ap.tryAddCheckpointProposal(proposal2);
581
697
  expect(result2.added).toBe(true);
582
- expect(result2.totalForPosition).toBe(2);
698
+ expect(result2.count).toBe(2);
583
699
  });
584
700
  });
585
701
  });