@aztec/p2p 0.0.1-commit.96bb3f7 → 0.0.1-commit.993d240

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