@aztec/p2p 0.0.1-commit.b655e406 → 0.0.1-commit.c2595eba

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 (444) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +2 -2
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +8 -8
  7. package/dest/client/index.d.ts +1 -1
  8. package/dest/client/interface.d.ts +18 -3
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +16 -37
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +464 -126
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  19. package/dest/config.d.ts +69 -60
  20. package/dest/config.d.ts.map +1 -1
  21. package/dest/config.js +23 -14
  22. package/dest/enr/generate-enr.d.ts +1 -1
  23. package/dest/enr/index.d.ts +1 -1
  24. package/dest/errors/attestation-pool.error.d.ts +7 -0
  25. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  26. package/dest/errors/attestation-pool.error.js +12 -0
  27. package/dest/errors/reqresp.error.d.ts +1 -1
  28. package/dest/errors/reqresp.error.d.ts.map +1 -1
  29. package/dest/index.d.ts +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +77 -36
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +241 -266
  35. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  36. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +24 -14
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +123 -95
  39. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +18 -12
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +91 -108
  42. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  44. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  45. package/dest/mem_pools/index.d.ts +1 -1
  46. package/dest/mem_pools/instrumentation.d.ts +9 -1
  47. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  48. package/dest/mem_pools/instrumentation.js +37 -10
  49. package/dest/mem_pools/interface.d.ts +3 -4
  50. package/dest/mem_pools/interface.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +33 -58
  52. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
  54. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  55. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  57. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  58. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  60. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  61. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  63. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  66. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  67. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  69. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  70. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  72. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  73. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  75. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  76. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  77. package/dest/mem_pools/tx_pool/index.js +0 -1
  78. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  79. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool/priority.js +6 -1
  81. package/dest/mem_pools/tx_pool/tx_pool.d.ts +11 -6
  82. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  83. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  84. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
  86. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -6
  87. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  88. package/dest/msg_validators/attestation_validator/attestation_validator.js +57 -24
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  90. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  91. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
  92. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  93. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/index.js +1 -0
  95. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  96. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  97. package/dest/msg_validators/clock_tolerance.js +37 -0
  98. package/dest/msg_validators/index.d.ts +2 -2
  99. package/dest/msg_validators/index.d.ts.map +1 -1
  100. package/dest/msg_validators/index.js +1 -1
  101. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  102. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  104. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  105. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  106. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  107. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  108. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  109. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  110. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  111. package/dest/msg_validators/proposal_validator/index.js +3 -0
  112. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  113. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  114. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  115. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  116. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  117. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  118. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  119. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  121. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  122. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  124. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  125. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
  127. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  128. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  130. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  131. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  133. package/dest/msg_validators/tx_validator/factory.d.ts +10 -4
  134. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  135. package/dest/msg_validators/tx_validator/factory.js +22 -12
  136. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  137. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  138. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  139. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  140. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  142. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  143. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  144. package/dest/msg_validators/tx_validator/index.js +1 -0
  145. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  146. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  147. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  148. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  149. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  150. package/dest/msg_validators/tx_validator/phases_validator.js +6 -4
  151. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  152. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  153. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  154. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  155. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  156. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +5 -3
  157. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  159. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  160. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  161. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  162. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  163. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  165. package/dest/services/data_store.d.ts +1 -1
  166. package/dest/services/data_store.d.ts.map +1 -1
  167. package/dest/services/discv5/discV5_service.d.ts +1 -1
  168. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  169. package/dest/services/discv5/discV5_service.js +1 -1
  170. package/dest/services/dummy_service.d.ts +18 -2
  171. package/dest/services/dummy_service.d.ts.map +1 -1
  172. package/dest/services/dummy_service.js +42 -0
  173. package/dest/services/encoding.d.ts +1 -1
  174. package/dest/services/encoding.d.ts.map +1 -1
  175. package/dest/services/encoding.js +7 -6
  176. package/dest/services/gossipsub/scoring.d.ts +1 -1
  177. package/dest/services/index.d.ts +1 -1
  178. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  179. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  180. package/dest/services/libp2p/instrumentation.js +36 -71
  181. package/dest/services/libp2p/libp2p_service.d.ts +48 -81
  182. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  183. package/dest/services/libp2p/libp2p_service.js +926 -193
  184. package/dest/services/peer-manager/interface.d.ts +1 -1
  185. package/dest/services/peer-manager/metrics.d.ts +9 -2
  186. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  187. package/dest/services/peer-manager/metrics.js +39 -16
  188. package/dest/services/peer-manager/peer_manager.d.ts +2 -33
  189. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  190. package/dest/services/peer-manager/peer_manager.js +6 -12
  191. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  192. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  193. package/dest/services/peer-manager/peer_scoring.js +43 -2
  194. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  195. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  196. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  197. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  198. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  199. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  200. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  201. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  202. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  203. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  204. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  205. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  206. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  207. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  208. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  209. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  210. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  211. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  212. package/dest/services/reqresp/config.d.ts +1 -1
  213. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  214. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  215. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  216. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -4
  217. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  218. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  219. package/dest/services/reqresp/constants.d.ts +12 -0
  220. package/dest/services/reqresp/constants.d.ts.map +1 -0
  221. package/dest/services/reqresp/constants.js +7 -0
  222. package/dest/services/reqresp/index.d.ts +1 -1
  223. package/dest/services/reqresp/interface.d.ts +4 -2
  224. package/dest/services/reqresp/interface.d.ts.map +1 -1
  225. package/dest/services/reqresp/interface.js +1 -1
  226. package/dest/services/reqresp/metrics.d.ts +6 -5
  227. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  228. package/dest/services/reqresp/metrics.js +17 -21
  229. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  230. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  231. package/dest/services/reqresp/protocols/auth.js +2 -2
  232. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  233. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  234. package/dest/services/reqresp/protocols/block.js +3 -2
  235. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  236. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  237. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  238. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  239. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  240. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +14 -1
  241. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +17 -7
  242. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  243. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +34 -4
  244. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  245. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  246. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  247. package/dest/services/reqresp/protocols/index.d.ts +1 -1
  248. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  249. package/dest/services/reqresp/protocols/status.d.ts +6 -5
  250. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  251. package/dest/services/reqresp/protocols/status.js +7 -3
  252. package/dest/services/reqresp/protocols/tx.d.ts +2 -3
  253. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  254. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  255. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
  256. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  257. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  258. package/dest/services/reqresp/reqresp.d.ts +6 -41
  259. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  260. package/dest/services/reqresp/reqresp.js +460 -46
  261. package/dest/services/reqresp/status.d.ts +2 -2
  262. package/dest/services/reqresp/status.d.ts.map +1 -1
  263. package/dest/services/service.d.ts +19 -3
  264. package/dest/services/service.d.ts.map +1 -1
  265. package/dest/services/tx_collection/config.d.ts +4 -1
  266. package/dest/services/tx_collection/config.d.ts.map +1 -1
  267. package/dest/services/tx_collection/config.js +10 -2
  268. package/dest/services/tx_collection/fast_tx_collection.d.ts +9 -12
  269. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  270. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  271. package/dest/services/tx_collection/index.d.ts +2 -1
  272. package/dest/services/tx_collection/index.d.ts.map +1 -1
  273. package/dest/services/tx_collection/index.js +1 -0
  274. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  275. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  276. package/dest/services/tx_collection/instrumentation.js +10 -13
  277. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  278. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  279. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  280. package/dest/services/tx_collection/slow_tx_collection.d.ts +4 -5
  281. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  282. package/dest/services/tx_collection/slow_tx_collection.js +2 -1
  283. package/dest/services/tx_collection/tx_collection.d.ts +10 -10
  284. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  285. package/dest/services/tx_collection/tx_collection.js +5 -5
  286. package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
  287. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  288. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  289. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  290. package/dest/services/tx_provider.d.ts +4 -2
  291. package/dest/services/tx_provider.d.ts.map +1 -1
  292. package/dest/services/tx_provider.js +11 -2
  293. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  294. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  295. package/dest/services/tx_provider_instrumentation.js +14 -14
  296. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  297. package/dest/test-helpers/get-ports.d.ts +1 -1
  298. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  299. package/dest/test-helpers/index.d.ts +3 -1
  300. package/dest/test-helpers/index.d.ts.map +1 -1
  301. package/dest/test-helpers/index.js +2 -0
  302. package/dest/test-helpers/make-enrs.d.ts +1 -1
  303. package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
  304. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  305. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  306. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  307. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  308. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  309. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  310. package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
  311. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  312. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  313. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  314. package/dest/test-helpers/test_tx_provider.js +41 -0
  315. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  316. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  317. package/dest/test-helpers/testbench-utils.js +297 -0
  318. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  319. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  320. package/dest/testbench/p2p_client_testbench_worker.js +218 -120
  321. package/dest/testbench/parse_log_file.d.ts +1 -1
  322. package/dest/testbench/testbench.d.ts +1 -1
  323. package/dest/testbench/worker_client_manager.d.ts +51 -6
  324. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  325. package/dest/testbench/worker_client_manager.js +226 -39
  326. package/dest/types/index.d.ts +1 -1
  327. package/dest/util.d.ts +2 -1
  328. package/dest/util.d.ts.map +1 -1
  329. package/dest/util.js +11 -2
  330. package/dest/versioning.d.ts +1 -1
  331. package/package.json +19 -18
  332. package/src/bootstrap/bootstrap.ts +7 -4
  333. package/src/client/factory.ts +11 -20
  334. package/src/client/interface.ts +20 -2
  335. package/src/client/p2p_client.ts +108 -155
  336. package/src/client/test/tx_proposal_collector/README.md +227 -0
  337. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  338. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  339. package/src/config.ts +36 -20
  340. package/src/errors/attestation-pool.error.ts +13 -0
  341. package/src/mem_pools/attestation_pool/attestation_pool.ts +86 -35
  342. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +243 -278
  343. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +175 -111
  344. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +147 -136
  345. package/src/mem_pools/attestation_pool/mocks.ts +21 -15
  346. package/src/mem_pools/instrumentation.ts +48 -10
  347. package/src/mem_pools/interface.ts +2 -4
  348. package/src/mem_pools/tx_pool/README.md +270 -0
  349. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +367 -371
  350. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  351. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  352. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  353. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  354. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  355. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  356. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  357. package/src/mem_pools/tx_pool/index.ts +0 -1
  358. package/src/mem_pools/tx_pool/priority.ts +8 -1
  359. package/src/mem_pools/tx_pool/tx_pool.ts +11 -5
  360. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
  361. package/src/msg_validators/attestation_validator/attestation_validator.ts +45 -32
  362. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
  363. package/src/msg_validators/attestation_validator/index.ts +1 -0
  364. package/src/msg_validators/clock_tolerance.ts +51 -0
  365. package/src/msg_validators/index.ts +1 -1
  366. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  367. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  368. package/src/msg_validators/proposal_validator/index.ts +3 -0
  369. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  370. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  371. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  372. package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
  373. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  374. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  375. package/src/msg_validators/tx_validator/factory.ts +67 -25
  376. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  377. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  378. package/src/msg_validators/tx_validator/index.ts +1 -0
  379. package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
  380. package/src/msg_validators/tx_validator/phases_validator.ts +8 -4
  381. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  382. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  383. package/src/msg_validators/tx_validator/timestamp_validator.ts +11 -5
  384. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  385. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  386. package/src/services/discv5/discV5_service.ts +1 -1
  387. package/src/services/dummy_service.ts +51 -0
  388. package/src/services/encoding.ts +6 -5
  389. package/src/services/libp2p/instrumentation.ts +39 -71
  390. package/src/services/libp2p/libp2p_service.ts +628 -194
  391. package/src/services/peer-manager/metrics.ts +44 -16
  392. package/src/services/peer-manager/peer_manager.ts +7 -4
  393. package/src/services/peer-manager/peer_scoring.ts +45 -3
  394. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  395. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  396. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  397. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  398. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  399. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  400. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  401. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  402. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  403. package/src/services/reqresp/constants.ts +14 -0
  404. package/src/services/reqresp/interface.ts +4 -1
  405. package/src/services/reqresp/metrics.ts +36 -27
  406. package/src/services/reqresp/protocols/auth.ts +2 -2
  407. package/src/services/reqresp/protocols/block.ts +3 -2
  408. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  409. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +16 -2
  410. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -5
  411. package/src/services/reqresp/protocols/status.ts +16 -12
  412. package/src/services/reqresp/protocols/tx.ts +1 -2
  413. package/src/services/reqresp/reqresp.ts +66 -19
  414. package/src/services/service.ts +23 -4
  415. package/src/services/tx_collection/config.ts +16 -2
  416. package/src/services/tx_collection/fast_tx_collection.ts +39 -15
  417. package/src/services/tx_collection/index.ts +5 -0
  418. package/src/services/tx_collection/instrumentation.ts +5 -13
  419. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  420. package/src/services/tx_collection/slow_tx_collection.ts +5 -4
  421. package/src/services/tx_collection/tx_collection.ts +10 -9
  422. package/src/services/tx_provider.ts +19 -3
  423. package/src/services/tx_provider_instrumentation.ts +24 -14
  424. package/src/test-helpers/index.ts +2 -0
  425. package/src/test-helpers/mock-pubsub.ts +1 -1
  426. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  427. package/src/test-helpers/reqresp-nodes.ts +1 -1
  428. package/src/test-helpers/test_tx_provider.ts +64 -0
  429. package/src/test-helpers/testbench-utils.ts +374 -0
  430. package/src/testbench/p2p_client_testbench_worker.ts +338 -116
  431. package/src/testbench/worker_client_manager.ts +304 -42
  432. package/src/util.ts +12 -2
  433. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
  434. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  435. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
  436. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  437. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  438. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -70
  439. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  440. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  441. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  442. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
  443. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
  444. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,21 +1,18 @@
1
- import { Secp256k1Signer } from '@aztec/foundation/crypto';
2
- import { Fr } from '@aztec/foundation/fields';
3
- import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import type { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
5
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
4
6
  import {
5
- BlockProposal as BlockProposalClass,
6
- ConsensusPayload,
7
- SignatureDomainSeparator,
8
- getHashedSignaturePayloadEthSignedMessage,
9
- } from '@aztec/stdlib/p2p';
10
- import { makeL2BlockHeader } from '@aztec/stdlib/testing';
11
- import { TxHash } from '@aztec/stdlib/tx';
12
-
13
- import { jest } from '@jest/globals';
14
- import { type MockProxy, mock } from 'jest-mock-extended';
15
-
16
- import type { PoolInstrumentation } from '../instrumentation.js';
7
+ makeBlockHeader,
8
+ makeBlockProposal,
9
+ makeCheckpointHeader,
10
+ makeCheckpointProposal,
11
+ } from '@aztec/stdlib/testing';
12
+
17
13
  import type { AttestationPool } from './attestation_pool.js';
18
- import { mockAttestation } from './mocks.js';
14
+ import { MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
15
+ import { mockCheckpointAttestation } from './mocks.js';
19
16
 
20
17
  const NUMBER_OF_SIGNERS_PER_TEST = 4;
21
18
 
@@ -23,261 +20,183 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
23
20
  let ap: AttestationPool;
24
21
  let signers: Secp256k1Signer[];
25
22
 
26
- // Check that metrics are recorded correctly
27
- let metricsMock: MockProxy<PoolInstrumentation<BlockAttestation>>;
28
-
29
23
  beforeEach(() => {
30
24
  ap = getAttestationPool();
31
25
  signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
32
-
33
- metricsMock = mock<PoolInstrumentation<BlockAttestation>>();
34
- // Can i overwrite this like this??
35
- (ap as any).metrics = metricsMock;
36
26
  });
37
27
 
38
- const createAttestationsForSlot = (slotNumber: number) => {
39
- const archive = Fr.random();
40
- return signers.map(signer => mockAttestation(signer, slotNumber, archive));
28
+ const createCheckpointAttestationsForSlot = (slotNumber: number, archive?: Fr) => {
29
+ const archiveToUse = archive ?? Fr.random();
30
+ return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse));
41
31
  };
42
32
 
43
- const mockBlockProposal = (signer: Secp256k1Signer, slotNumber: number, archive: Fr = Fr.random()): BlockProposal => {
44
- const header = makeL2BlockHeader(1, 2, slotNumber);
45
- const payload = new ConsensusPayload(header.toCheckpointHeader(), archive, header.state);
46
-
47
- const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
48
- const signature = signer.sign(hash);
49
-
50
- const txHashes = [TxHash.random(), TxHash.random()]; // Mock tx hashes
51
-
52
- return new BlockProposalClass(payload, signature, txHashes);
33
+ const mockBlockProposalForPool = (
34
+ signer: Secp256k1Signer,
35
+ slotNumber: number,
36
+ archive: Fr = Fr.random(),
37
+ ): Promise<BlockProposal> => {
38
+ const header = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
39
+ return makeBlockProposal({
40
+ signer,
41
+ blockHeader: header,
42
+ archiveRoot: archive,
43
+ });
53
44
  };
54
45
 
55
- // We compare buffers as the objects can have cached values attached to them which are not serialised
56
- // using array containing as the kv store does not respect insertion order
57
- const compareAttestations = (a1: BlockAttestation[], a2: BlockAttestation[]) => {
46
+ // Compare checkpoint attestations buffers
47
+ // Using array containing as the kv store does not respect insertion order
48
+ const compareCheckpointAttestations = (a1: CheckpointAttestation[], a2: CheckpointAttestation[]) => {
58
49
  const a1Buffer = a1.map(attestation => attestation.toBuffer());
59
50
  const a2Buffer = a2.map(attestation => attestation.toBuffer());
60
51
  expect(a1Buffer.length).toBe(a2Buffer.length);
61
52
  expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
62
53
  };
63
54
 
64
- it('should add attestations to pool', async () => {
65
- const slotNumber = 420;
66
- const archive = Fr.random();
67
- const attestations = signers.slice(0, -1).map(signer => mockAttestation(signer, slotNumber, archive));
68
-
69
- await ap.addAttestations(attestations);
70
-
71
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
72
- expect(retrievedAttestations.length).toBe(attestations.length);
73
- compareAttestations(retrievedAttestations, attestations);
74
-
75
- // Check hasAttestation for added attestations
76
- for (const attestation of attestations) {
77
- expect(await ap.hasAttestation(attestation)).toBe(true);
78
- }
79
-
80
- const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(BigInt(slotNumber));
81
- expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
82
- compareAttestations(retrievedAttestationsForSlot, attestations);
83
-
84
- // Add another one
85
- const newAttestation = mockAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
86
- await ap.addAttestations([newAttestation]);
87
- const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(
88
- BigInt(slotNumber),
89
- archive.toString(),
90
- );
91
- expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
92
- compareAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
93
- expect(await ap.hasAttestation(newAttestation)).toBe(true);
94
- const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(BigInt(slotNumber));
95
- expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
96
- compareAttestations(retrievedAttestationsForSlotAfterAdd, [...attestations, newAttestation]);
97
-
98
- // Delete by slot
99
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
100
-
101
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
102
- BigInt(slotNumber),
103
- archive.toString(),
104
- );
105
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
106
- // Check hasAttestation after deletion
107
- for (const attestation of attestations) {
108
- expect(await ap.hasAttestation(attestation)).toBe(false);
109
- }
110
- expect(await ap.hasAttestation(newAttestation)).toBe(false);
111
- });
112
-
113
- it('should handle duplicate proposals in a slot', async () => {
114
- const slotNumber = 420;
115
- const archive = Fr.random();
116
-
117
- // Use the same signer for all attestations
118
- const attestations: BlockAttestation[] = [];
119
- const signer = signers[0];
120
- for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
121
- attestations.push(mockAttestation(signer, slotNumber, archive));
122
- }
123
-
124
- // Add them to store and check we end up with only one
125
- await ap.addAttestations(attestations);
126
-
127
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
128
- expect(retreivedAttestations.length).toBe(1);
129
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
130
- expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
131
-
132
- // Try adding them on another operation and check they are still not duplicated
133
- await ap.addAttestations([attestations[0]]);
134
- expect(await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString())).toHaveLength(1);
135
- });
55
+ describe('CheckpointAttestation', () => {
56
+ it('should add attestations to pool', async () => {
57
+ const slotNumber = 420;
58
+ const archive = Fr.random();
59
+ const attestations = signers.slice(0, -1).map(signer => mockCheckpointAttestation(signer, slotNumber, archive));
136
60
 
137
- it('should store attestations by differing slot', async () => {
138
- const slotNumbers = [1, 2, 3, 4];
139
- const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i]));
61
+ await ap.addCheckpointAttestations(attestations);
140
62
 
141
- await ap.addAttestations(attestations);
63
+ const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
64
+ SlotNumber(slotNumber),
65
+ archive.toString(),
66
+ );
67
+ expect(retrievedAttestations.length).toBe(attestations.length);
68
+ compareCheckpointAttestations(retrievedAttestations, attestations);
142
69
 
143
- for (const attestation of attestations) {
144
- const slot = attestation.payload.header.slotNumber;
145
- const archive = attestation.archive.toString();
70
+ // Check hasCheckpointAttestation for added attestations
71
+ for (const attestation of attestations) {
72
+ expect(await ap.hasCheckpointAttestation(attestation)).toBe(true);
73
+ }
146
74
 
147
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), archive);
148
- expect(retreivedAttestations.length).toBe(1);
149
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
150
- expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
151
- }
152
- });
75
+ const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
76
+ expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
77
+ compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
78
+
79
+ // Add another one
80
+ const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
81
+ await ap.addCheckpointAttestations([newAttestation]);
82
+ const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(
83
+ SlotNumber(slotNumber),
84
+ archive.toString(),
85
+ );
86
+ expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
87
+ compareCheckpointAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
88
+ expect(await ap.hasCheckpointAttestation(newAttestation)).toBe(true);
89
+ const retrievedAttestationsForSlotAfterAdd = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
90
+ expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
91
+ compareCheckpointAttestations(retrievedAttestationsForSlotAfterAdd, [...attestations, newAttestation]);
92
+
93
+ // Delete by slot
94
+ await ap.deleteCheckpointAttestationsOlderThan(SlotNumber(slotNumber + 1));
95
+
96
+ const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
97
+ SlotNumber(slotNumber),
98
+ archive.toString(),
99
+ );
100
+ expect(retreivedAttestationsAfterDelete.length).toBe(0);
101
+ // Check hasCheckpointAttestation after deletion
102
+ for (const attestation of attestations) {
103
+ expect(await ap.hasCheckpointAttestation(attestation)).toBe(false);
104
+ }
105
+ expect(await ap.hasCheckpointAttestation(newAttestation)).toBe(false);
106
+ });
153
107
 
154
- it('should store attestations by differing slot and archive', async () => {
155
- const slotNumbers = [1, 1, 2, 3];
156
- const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()];
157
- const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i]));
108
+ it('should handle duplicate proposals in a slot', async () => {
109
+ const slotNumber = 420;
110
+ const archive = Fr.random();
111
+ const header = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
158
112
 
159
- await ap.addAttestations(attestations);
113
+ // Use the same signer and header for all attestations
114
+ const attestations: CheckpointAttestation[] = [];
115
+ const signer = signers[0];
116
+ for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
117
+ attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
118
+ }
160
119
 
161
- for (const attestation of attestations) {
162
- const slot = attestation.payload.header.slotNumber;
163
- const proposalId = attestation.archive.toString();
120
+ // Add them to store and check we end up with only one
121
+ await ap.addCheckpointAttestations(attestations);
164
122
 
165
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot.toBigInt(), proposalId);
123
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
124
+ SlotNumber(slotNumber),
125
+ archive.toString(),
126
+ );
166
127
  expect(retreivedAttestations.length).toBe(1);
167
- expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
168
- expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
169
- }
170
- });
171
-
172
- it('should delete attestations', async () => {
173
- const slotNumber = 420;
174
- const archive = Fr.random();
175
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
176
- const proposalId = attestations[0].archive.toString();
177
-
178
- await ap.addAttestations(attestations);
179
-
180
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
181
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
182
- compareAttestations(retreivedAttestations, attestations);
183
-
184
- // Check hasAttestation before deletion
185
- for (const attestation of attestations) {
186
- expect(await ap.hasAttestation(attestation)).toBe(true);
187
- }
188
-
189
- await ap.deleteAttestations(attestations);
190
-
191
- const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
192
- expect(gottenAfterDelete.length).toBe(0);
193
-
194
- // Check hasAttestation after deletion
195
- for (const attestation of attestations) {
196
- expect(await ap.hasAttestation(attestation)).toBe(false);
197
- }
198
- });
199
-
200
- it('should blanket delete attestations per slot', async () => {
201
- const slotNumber = 420;
202
- const archive = Fr.random();
203
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
204
- const proposalId = attestations[0].archive.toString();
205
-
206
- await ap.addAttestations(attestations);
207
-
208
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
209
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
210
- compareAttestations(retreivedAttestations, attestations);
211
-
212
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
213
-
214
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
215
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
216
- });
217
-
218
- it('should blanket delete attestations per slot and proposal', async () => {
219
- const slotNumber = 420;
220
- const archive = Fr.random();
221
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
222
- const proposalId = attestations[0].archive.toString();
128
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
129
+ expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
130
+
131
+ // Try adding them on another operation and check they are still not duplicated
132
+ await ap.addCheckpointAttestations([attestations[0]]);
133
+ expect(
134
+ await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString()),
135
+ ).toHaveLength(1);
136
+ });
223
137
 
224
- // Add another set of attestations with a different proposalId, yet the same slot
225
- const archive2 = Fr.random();
226
- const attestations2 = signers.map(signer => mockAttestation(signer, slotNumber, archive2));
227
- const proposalId2 = attestations2[0].archive.toString();
138
+ it('should store attestations by differing slot', async () => {
139
+ const slotNumbers = [1, 2, 3, 4];
140
+ const attestations = signers.map((signer, i) => mockCheckpointAttestation(signer, slotNumbers[i]));
228
141
 
229
- await ap.addAttestations(attestations);
230
- await ap.addAttestations(attestations2);
142
+ await ap.addCheckpointAttestations(attestations);
231
143
 
232
- const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
233
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
234
- compareAttestations(retreivedAttestations, attestations);
144
+ for (const attestation of attestations) {
145
+ const slot = attestation.payload.header.slotNumber;
146
+ const archive = attestation.archive.toString();
235
147
 
236
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
148
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, archive);
149
+ expect(retreivedAttestations.length).toBe(1);
150
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
151
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
152
+ }
153
+ });
237
154
 
238
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
239
- expect(retreivedAttestationsAfterDelete.length).toBe(0);
155
+ it('should store attestations by differing slot and archive', async () => {
156
+ const slotNumbers = [1, 1, 2, 3];
157
+ const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()];
158
+ const attestations = signers.map((signer, i) => mockCheckpointAttestation(signer, slotNumbers[i], archives[i]));
240
159
 
241
- const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(
242
- BigInt(slotNumber),
243
- proposalId2,
244
- );
245
- expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
246
- compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
247
- });
160
+ await ap.addCheckpointAttestations(attestations);
248
161
 
249
- it('should delete attestations older than a given slot', async () => {
250
- const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
251
- const attestations = (
252
- await Promise.all(slotNumbers.map(slotNumber => createAttestationsForSlot(slotNumber)))
253
- ).flat();
254
- const proposalId = attestations[0].archive.toString();
162
+ for (const attestation of attestations) {
163
+ const slot = attestation.payload.header.slotNumber;
164
+ const proposalId = attestation.archive.toString();
255
165
 
256
- await ap.addAttestations(attestations);
166
+ const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, proposalId);
167
+ expect(retreivedAttestations.length).toBe(1);
168
+ expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
169
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
170
+ }
171
+ });
257
172
 
258
- const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
259
- expect(attestationsForSlot1.length).toBe(signers.length);
173
+ it('should delete attestations older than a given slot', async () => {
174
+ const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
175
+ const attestations = (
176
+ await Promise.all(slotNumbers.map(slotNumber => createCheckpointAttestationsForSlot(slotNumber)))
177
+ ).flat();
178
+ const proposalId = attestations[0].archive.toString();
260
179
 
261
- const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
180
+ await ap.addCheckpointAttestations(attestations);
262
181
 
263
- await ap.deleteAttestationsOlderThan(BigInt(73));
182
+ const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
183
+ expect(attestationsForSlot1.length).toBe(signers.length);
264
184
 
265
- const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
266
- expect(attestationsForSlot1AfterDelete.length).toBe(0);
185
+ await ap.deleteCheckpointAttestationsOlderThan(SlotNumber(73));
267
186
 
268
- expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
269
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1));
270
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2));
271
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3));
272
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69));
273
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72));
187
+ const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
188
+ SlotNumber(1),
189
+ proposalId,
190
+ );
191
+ expect(attestationsForSlot1AfterDelete.length).toBe(0);
192
+ });
274
193
  });
275
194
 
276
195
  describe('BlockProposal in attestation pool', () => {
277
196
  it('should add and retrieve block proposal', async () => {
278
197
  const slotNumber = 420;
279
198
  const archive = Fr.random();
280
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
199
+ const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
281
200
  const proposalId = proposal.archive.toString();
282
201
 
283
202
  await ap.addBlockProposal(proposal);
@@ -304,13 +223,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
304
223
  it('should update block proposal if added twice with same id', async () => {
305
224
  const slotNumber = 420;
306
225
  const archive = Fr.random();
307
- const proposal1 = mockBlockProposal(signers[0], slotNumber, archive);
226
+ const proposal1 = await mockBlockProposalForPool(signers[0], slotNumber, archive);
308
227
  const proposalId = proposal1.archive.toString();
309
228
 
310
229
  await ap.addBlockProposal(proposal1);
311
230
 
312
231
  // Create a new proposal with same archive but different signer
313
- const proposal2 = mockBlockProposal(signers[1], slotNumber, archive);
232
+ const proposal2 = await mockBlockProposalForPool(signers[1], slotNumber, archive);
314
233
 
315
234
  await ap.addBlockProposal(proposal2);
316
235
 
@@ -323,8 +242,8 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
323
242
 
324
243
  it('should handle block proposals with different slots and same archive', async () => {
325
244
  const archive = Fr.random();
326
- const proposal1 = mockBlockProposal(signers[0], 100, archive);
327
- const proposal2 = mockBlockProposal(signers[1], 200, archive);
245
+ const proposal1 = await mockBlockProposalForPool(signers[0], 100, archive);
246
+ const proposal2 = await mockBlockProposalForPool(signers[1], 200, archive);
328
247
  const proposalId = archive.toString();
329
248
 
330
249
  await ap.addBlockProposal(proposal1);
@@ -334,83 +253,129 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
334
253
  const retrievedProposal = await ap.getBlockProposal(proposalId);
335
254
  expect(retrievedProposal).toBeDefined();
336
255
  expect(retrievedProposal!.toBuffer()).toEqual(proposal2.toBuffer());
337
- expect(retrievedProposal!.slotNumber.toBigInt()).toBe(BigInt(200));
256
+ expect(retrievedProposal!.slotNumber).toBe(SlotNumber(200));
338
257
  });
258
+ });
339
259
 
340
- it('should delete block proposal when deleting attestations for slot and proposal', async () => {
260
+ describe('CheckpointProposal in attestation pool', () => {
261
+ const mockCheckpointProposalForPool = (
262
+ signer: Secp256k1Signer,
263
+ slotNumber: number,
264
+ archive: Fr = Fr.random(),
265
+ ): Promise<CheckpointProposal> => {
266
+ const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
267
+ const blockHeader = makeBlockHeader(1);
268
+ return makeCheckpointProposal({
269
+ signer,
270
+ checkpointHeader,
271
+ archiveRoot: archive,
272
+ lastBlock: { blockHeader },
273
+ });
274
+ };
275
+
276
+ it('should add and retrieve checkpoint proposal as core (without lastBlock)', async () => {
341
277
  const slotNumber = 420;
342
278
  const archive = Fr.random();
343
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
279
+ const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
344
280
  const proposalId = proposal.archive.toString();
345
281
 
346
- // Add proposal and some attestations
347
- await ap.addBlockProposal(proposal);
348
- const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
349
- await ap.addAttestations(attestations);
282
+ await ap.addCheckpointProposal(proposal);
283
+
284
+ const retrievedProposal = await ap.getCheckpointProposal(proposalId);
350
285
 
351
- // Verify proposal exists
352
- let retrievedProposal = await ap.getBlockProposal(proposalId);
353
286
  expect(retrievedProposal).toBeDefined();
354
- expect(await ap.hasBlockProposal(proposalId)).toBe(true);
287
+ // Should return core version (without lastBlock)
288
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal.toCore().toBuffer());
289
+
290
+ // Check hasCheckpointProposal with both id and object
291
+ expect(await ap.hasCheckpointProposal(proposalId)).toBe(true);
292
+ expect(await ap.hasCheckpointProposal(proposal)).toBe(true);
293
+ });
355
294
 
356
- // Delete attestations for slot and proposal
357
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
295
+ it('should extract and store block proposal when adding checkpoint proposal with lastBlock', async () => {
296
+ const slotNumber = 420;
297
+ const archive = Fr.random();
298
+ const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
299
+ const proposalId = proposal.archive.toString();
358
300
 
359
- // Proposal should be deleted
360
- retrievedProposal = await ap.getBlockProposal(proposalId);
361
- expect(retrievedProposal).toBeUndefined();
362
- expect(await ap.hasBlockProposal(proposalId)).toBe(false);
301
+ // Verify the proposal has a lastBlock
302
+ const expectedBlockProposal = proposal.getBlockProposal();
303
+ expect(expectedBlockProposal).toBeDefined();
304
+
305
+ await ap.addCheckpointProposal(proposal);
306
+
307
+ // The block proposal should be stored separately and retrievable
308
+ const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
309
+ expect(retrievedBlockProposal).toBeDefined();
310
+ expect(retrievedBlockProposal!.archive.toString()).toBe(archive.toString());
311
+ expect(retrievedBlockProposal!.blockHeader.toBuffer()).toEqual(expectedBlockProposal!.blockHeader.toBuffer());
363
312
  });
364
313
 
365
- it('should delete block proposal when deleting attestations for slot', async () => {
314
+ it('should not store block proposal when checkpoint proposal has no lastBlock', async () => {
366
315
  const slotNumber = 420;
367
316
  const archive = Fr.random();
368
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
317
+ const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
318
+ // Create a checkpoint proposal WITHOUT lastBlock
319
+ const proposal = await makeCheckpointProposal({
320
+ signer: signers[0],
321
+ checkpointHeader,
322
+ archiveRoot: archive,
323
+ // No lastBlock
324
+ });
369
325
  const proposalId = proposal.archive.toString();
370
326
 
371
- // Add proposal
372
- await ap.addBlockProposal(proposal);
327
+ await ap.addCheckpointProposal(proposal);
373
328
 
374
- // Verify proposal exists
375
- let retrievedProposal = await ap.getBlockProposal(proposalId);
376
- expect(retrievedProposal).toBeDefined();
377
- expect(await ap.hasBlockProposal(proposal)).toBe(true);
329
+ // The checkpoint proposal should be stored
330
+ const retrievedCheckpointProposal = await ap.getCheckpointProposal(proposalId);
331
+ expect(retrievedCheckpointProposal).toBeDefined();
378
332
 
379
- // Delete attestations for slot
380
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
333
+ // But no block proposal should be stored (archive key won't have a block proposal)
334
+ const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
335
+ expect(retrievedBlockProposal).toBeUndefined();
336
+ });
381
337
 
382
- // Proposal should be deleted
383
- retrievedProposal = await ap.getBlockProposal(proposalId);
338
+ it('should return undefined for non-existent checkpoint proposal', async () => {
339
+ const nonExistentId = Fr.random().toString();
340
+ const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
384
341
  expect(retrievedProposal).toBeUndefined();
385
- expect(await ap.hasBlockProposal(proposal)).toBe(false);
342
+
343
+ // Check hasCheckpointProposal returns false for non-existent proposal
344
+ expect(await ap.hasCheckpointProposal(nonExistentId)).toBe(false);
386
345
  });
387
346
 
388
- it('should be able to fetch both block proposal and attestations', async () => {
347
+ it('should update checkpoint proposal if added twice with same id', async () => {
389
348
  const slotNumber = 420;
390
349
  const archive = Fr.random();
391
- const proposal = mockBlockProposal(signers[0], slotNumber, archive);
392
- const proposalId = proposal.archive.toString();
350
+ const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
351
+ const proposalId = proposal1.archive.toString();
393
352
 
394
- // Add proposal first
395
- await ap.addBlockProposal(proposal);
353
+ await ap.addCheckpointProposal(proposal1);
396
354
 
397
- // Add attestations for the same proposal
398
- const attestations = signers.slice(1).map(signer => mockAttestation(signer, slotNumber, archive));
399
- await ap.addAttestations(attestations);
355
+ // Create a new proposal with same archive but different signer
356
+ const proposal2 = await mockCheckpointProposalForPool(signers[1], slotNumber, archive);
400
357
 
401
- // Retrieve both proposal and attestations
402
- const retrievedProposal = await ap.getBlockProposal(proposalId);
403
- const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
358
+ await ap.addCheckpointProposal(proposal2);
404
359
 
360
+ const retrievedProposal = await ap.getCheckpointProposal(proposalId);
405
361
  expect(retrievedProposal).toBeDefined();
406
- expect(retrievedProposal).toEqual(proposal);
407
- expect(await ap.hasBlockProposal(proposalId)).toBe(true);
362
+ // Should have the second proposal (as core)
363
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal2.toCore().toBuffer());
364
+ expect(retrievedProposal!.getSender()?.toString()).toBe(signers[1].address.toString());
365
+ });
408
366
 
409
- compareAttestations(retrievedAttestations, attestations);
410
- // Check hasAttestation for all attestations
411
- for (const attestation of attestations) {
412
- expect(await ap.hasAttestation(attestation)).toBe(true);
367
+ it('should throw ProposalSlotCapExceededError when exceeding capacity', async () => {
368
+ const slotNumber = 420;
369
+
370
+ // Add MAX_PROPOSALS_PER_SLOT proposals
371
+ for (let i = 0; i < MAX_PROPOSALS_PER_SLOT; i++) {
372
+ const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
373
+ await ap.addCheckpointProposal(proposal);
413
374
  }
375
+
376
+ // The next proposal should throw
377
+ const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
378
+ await expect(ap.addCheckpointProposal(extraProposal)).rejects.toThrow('Maximum checkpoint proposals per slot');
414
379
  });
415
380
  });
416
381
  }