@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.21caa21

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 (385) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +22 -9
  4. package/dest/client/factory.d.ts +14 -4
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +60 -24
  7. package/dest/client/index.d.ts +2 -1
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +1 -0
  10. package/dest/client/interface.d.ts +157 -0
  11. package/dest/client/interface.d.ts.map +1 -0
  12. package/dest/client/interface.js +9 -0
  13. package/dest/client/p2p_client.d.ts +72 -187
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +373 -177
  16. package/dest/config.d.ts +151 -125
  17. package/dest/config.d.ts.map +1 -1
  18. package/dest/config.js +183 -34
  19. package/dest/enr/generate-enr.d.ts +11 -3
  20. package/dest/enr/generate-enr.d.ts.map +1 -1
  21. package/dest/enr/generate-enr.js +27 -5
  22. package/dest/enr/index.d.ts +1 -1
  23. package/dest/errors/attestation-pool.error.d.ts +7 -0
  24. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  25. package/dest/errors/attestation-pool.error.js +12 -0
  26. package/dest/errors/reqresp.error.d.ts +1 -1
  27. package/dest/errors/reqresp.error.d.ts.map +1 -1
  28. package/dest/index.d.ts +4 -1
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +2 -0
  31. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +68 -8
  32. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  34. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +214 -63
  36. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  37. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -6
  38. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +126 -25
  40. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +19 -6
  41. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  42. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +111 -21
  43. package/dest/mem_pools/attestation_pool/mocks.d.ts +225 -5
  44. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/mocks.js +9 -15
  46. package/dest/mem_pools/index.d.ts +1 -1
  47. package/dest/mem_pools/instrumentation.d.ts +10 -12
  48. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  49. package/dest/mem_pools/instrumentation.js +35 -38
  50. package/dest/mem_pools/interface.d.ts +1 -1
  51. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +62 -13
  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 +469 -97
  54. package/dest/mem_pools/tx_pool/index.d.ts +1 -1
  55. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +34 -10
  56. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool/memory_tx_pool.js +133 -36
  58. package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
  59. package/dest/mem_pools/tx_pool/priority.js +1 -1
  60. package/dest/mem_pools/tx_pool/tx_pool.d.ts +65 -9
  61. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +264 -39
  65. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -2
  66. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/attestation_validator/attestation_validator.js +45 -9
  68. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  69. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  70. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +67 -0
  71. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  72. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  73. package/dest/msg_validators/attestation_validator/index.js +1 -0
  74. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +6 -2
  75. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +73 -12
  77. package/dest/msg_validators/block_proposal_validator/index.d.ts +1 -1
  78. package/dest/msg_validators/index.d.ts +1 -1
  79. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  80. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  81. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  82. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  85. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  86. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  87. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  88. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  89. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  90. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -4
  93. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  94. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/data_validator.js +56 -86
  96. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -3
  97. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
  99. package/dest/msg_validators/tx_validator/factory.d.ts +15 -0
  100. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  101. package/dest/msg_validators/tx_validator/factory.js +74 -0
  102. package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
  103. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  104. package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
  105. package/dest/msg_validators/tx_validator/index.d.ts +8 -1
  106. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/index.js +7 -0
  108. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +8 -4
  109. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
  111. package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -0
  112. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  113. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  114. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  115. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  116. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  117. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +12 -0
  118. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  120. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +8 -0
  121. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  123. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  124. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
  126. package/dest/services/data_store.d.ts +1 -1
  127. package/dest/services/data_store.d.ts.map +1 -1
  128. package/dest/services/discv5/discV5_service.d.ts +10 -9
  129. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  130. package/dest/services/discv5/discV5_service.js +63 -36
  131. package/dest/services/dummy_service.d.ts +50 -11
  132. package/dest/services/dummy_service.d.ts.map +1 -1
  133. package/dest/services/dummy_service.js +88 -5
  134. package/dest/services/encoding.d.ts +26 -7
  135. package/dest/services/encoding.d.ts.map +1 -1
  136. package/dest/services/encoding.js +73 -5
  137. package/dest/services/gossipsub/scoring.d.ts +1 -1
  138. package/dest/services/index.d.ts +5 -1
  139. package/dest/services/index.d.ts.map +1 -1
  140. package/dest/services/index.js +4 -0
  141. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  142. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  143. package/dest/services/libp2p/instrumentation.js +164 -0
  144. package/dest/services/libp2p/libp2p_service.d.ts +78 -89
  145. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  146. package/dest/services/libp2p/libp2p_service.js +698 -246
  147. package/dest/services/peer-manager/interface.d.ts +23 -0
  148. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  149. package/dest/services/peer-manager/interface.js +1 -0
  150. package/dest/services/peer-manager/metrics.d.ts +6 -2
  151. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  152. package/dest/services/peer-manager/metrics.js +22 -2
  153. package/dest/services/peer-manager/peer_manager.d.ts +102 -22
  154. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  155. package/dest/services/peer-manager/peer_manager.js +549 -72
  156. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  157. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  158. package/dest/services/peer-manager/peer_scoring.js +40 -2
  159. package/dest/services/reqresp/config.d.ts +11 -9
  160. package/dest/services/reqresp/config.d.ts.map +1 -1
  161. package/dest/services/reqresp/config.js +18 -4
  162. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +2 -2
  163. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  164. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
  165. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +31 -17
  166. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  167. package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
  168. package/dest/services/reqresp/index.d.ts +3 -2
  169. package/dest/services/reqresp/index.d.ts.map +1 -1
  170. package/dest/services/reqresp/index.js +2 -1
  171. package/dest/services/reqresp/interface.d.ts +73 -24
  172. package/dest/services/reqresp/interface.d.ts.map +1 -1
  173. package/dest/services/reqresp/interface.js +45 -26
  174. package/dest/services/reqresp/metrics.d.ts +1 -1
  175. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  176. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  177. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  178. package/dest/services/reqresp/protocols/auth.js +71 -0
  179. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  180. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  181. package/dest/services/reqresp/protocols/block.js +28 -5
  182. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
  183. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  184. package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -0
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +39 -0
  188. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +47 -0
  189. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  190. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +75 -0
  191. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  192. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  193. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  194. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  195. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  196. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  197. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  198. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  199. package/dest/services/reqresp/protocols/index.js +2 -0
  200. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  201. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/status.d.ts +39 -7
  203. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  204. package/dest/services/reqresp/protocols/status.js +72 -5
  205. package/dest/services/reqresp/protocols/tx.d.ts +13 -2
  206. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  207. package/dest/services/reqresp/protocols/tx.js +34 -6
  208. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  209. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  210. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  211. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  212. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  213. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  214. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  215. package/dest/services/reqresp/reqresp.d.ts +24 -66
  216. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  217. package/dest/services/reqresp/reqresp.js +298 -207
  218. package/dest/services/reqresp/status.d.ts +10 -4
  219. package/dest/services/reqresp/status.d.ts.map +1 -1
  220. package/dest/services/reqresp/status.js +9 -2
  221. package/dest/services/service.d.ts +23 -19
  222. package/dest/services/service.d.ts.map +1 -1
  223. package/dest/services/tx_collection/config.d.ts +25 -0
  224. package/dest/services/tx_collection/config.d.ts.map +1 -0
  225. package/dest/services/tx_collection/config.js +58 -0
  226. package/dest/services/tx_collection/fast_tx_collection.d.ts +50 -0
  227. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  228. package/dest/services/tx_collection/fast_tx_collection.js +300 -0
  229. package/dest/services/tx_collection/index.d.ts +3 -0
  230. package/dest/services/tx_collection/index.d.ts.map +1 -0
  231. package/dest/services/tx_collection/index.js +2 -0
  232. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  233. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  234. package/dest/services/tx_collection/instrumentation.js +34 -0
  235. package/dest/services/tx_collection/slow_tx_collection.d.ts +52 -0
  236. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  237. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  238. package/dest/services/tx_collection/tx_collection.d.ts +109 -0
  239. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  240. package/dest/services/tx_collection/tx_collection.js +128 -0
  241. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  242. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  243. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  244. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  245. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  246. package/dest/services/tx_collection/tx_source.js +31 -0
  247. package/dest/services/tx_provider.d.ts +49 -0
  248. package/dest/services/tx_provider.d.ts.map +1 -0
  249. package/dest/services/tx_provider.js +210 -0
  250. package/dest/services/tx_provider_instrumentation.d.ts +13 -0
  251. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  252. package/dest/services/tx_provider_instrumentation.js +34 -0
  253. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  254. package/dest/test-helpers/get-ports.d.ts +1 -1
  255. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  256. package/dest/test-helpers/index.d.ts +2 -1
  257. package/dest/test-helpers/index.d.ts.map +1 -1
  258. package/dest/test-helpers/index.js +1 -0
  259. package/dest/test-helpers/make-enrs.d.ts +1 -1
  260. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  261. package/dest/test-helpers/make-enrs.js +4 -5
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  263. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  264. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  265. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  266. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  267. package/dest/test-helpers/mock-pubsub.js +130 -0
  268. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  269. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  270. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  271. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  272. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  273. package/dest/test-helpers/reqresp-nodes.js +62 -28
  274. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  275. package/dest/testbench/p2p_client_testbench_worker.js +103 -29
  276. package/dest/testbench/parse_log_file.d.ts +1 -1
  277. package/dest/testbench/parse_log_file.js +4 -4
  278. package/dest/testbench/testbench.d.ts +1 -1
  279. package/dest/testbench/testbench.js +4 -4
  280. package/dest/testbench/worker_client_manager.d.ts +1 -6
  281. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  282. package/dest/testbench/worker_client_manager.js +11 -19
  283. package/dest/types/index.d.ts +4 -2
  284. package/dest/types/index.d.ts.map +1 -1
  285. package/dest/types/index.js +2 -0
  286. package/dest/util.d.ts +24 -16
  287. package/dest/util.d.ts.map +1 -1
  288. package/dest/util.js +75 -69
  289. package/dest/versioning.d.ts +4 -4
  290. package/dest/versioning.d.ts.map +1 -1
  291. package/dest/versioning.js +8 -3
  292. package/package.json +32 -27
  293. package/src/bootstrap/bootstrap.ts +27 -11
  294. package/src/client/factory.ts +136 -45
  295. package/src/client/index.ts +1 -0
  296. package/src/client/interface.ts +198 -0
  297. package/src/client/p2p_client.ts +469 -330
  298. package/src/config.ts +305 -134
  299. package/src/enr/generate-enr.ts +39 -6
  300. package/src/errors/attestation-pool.error.ts +13 -0
  301. package/src/index.ts +4 -0
  302. package/src/mem_pools/attestation_pool/attestation_pool.ts +75 -7
  303. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +264 -65
  304. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +173 -34
  305. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +156 -30
  306. package/src/mem_pools/attestation_pool/mocks.ts +11 -10
  307. package/src/mem_pools/instrumentation.ts +43 -44
  308. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +549 -108
  309. package/src/mem_pools/tx_pool/memory_tx_pool.ts +153 -44
  310. package/src/mem_pools/tx_pool/priority.ts +1 -1
  311. package/src/mem_pools/tx_pool/tx_pool.ts +67 -8
  312. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +217 -34
  313. package/src/msg_validators/attestation_validator/attestation_validator.ts +54 -11
  314. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +91 -0
  315. package/src/msg_validators/attestation_validator/index.ts +1 -0
  316. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +82 -14
  317. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  318. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  319. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  320. package/src/msg_validators/tx_validator/block_header_validator.ts +4 -4
  321. package/src/msg_validators/tx_validator/data_validator.ts +81 -69
  322. package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
  323. package/src/msg_validators/tx_validator/factory.ts +109 -0
  324. package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
  325. package/src/msg_validators/tx_validator/index.ts +7 -0
  326. package/src/msg_validators/tx_validator/metadata_validator.ts +58 -21
  327. package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
  328. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  329. package/src/msg_validators/tx_validator/timestamp_validator.ts +46 -0
  330. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
  331. package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
  332. package/src/services/discv5/discV5_service.ts +84 -38
  333. package/src/services/dummy_service.ts +147 -9
  334. package/src/services/encoding.ts +80 -5
  335. package/src/services/index.ts +4 -0
  336. package/src/services/libp2p/instrumentation.ts +167 -0
  337. package/src/services/libp2p/libp2p_service.ts +866 -294
  338. package/src/services/peer-manager/interface.ts +29 -0
  339. package/src/services/peer-manager/metrics.ts +26 -1
  340. package/src/services/peer-manager/peer_manager.ts +654 -78
  341. package/src/services/peer-manager/peer_scoring.ts +46 -3
  342. package/src/services/reqresp/config.ts +26 -9
  343. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
  344. package/src/services/reqresp/connection-sampler/connection_sampler.ts +148 -95
  345. package/src/services/reqresp/index.ts +2 -0
  346. package/src/services/reqresp/interface.ts +91 -36
  347. package/src/services/reqresp/metrics.ts +4 -1
  348. package/src/services/reqresp/protocols/auth.ts +83 -0
  349. package/src/services/reqresp/protocols/block.ts +24 -3
  350. package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
  351. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
  352. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -0
  353. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  354. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  355. package/src/services/reqresp/protocols/index.ts +2 -0
  356. package/src/services/reqresp/protocols/status.ts +117 -5
  357. package/src/services/reqresp/protocols/tx.ts +35 -6
  358. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  359. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  360. package/src/services/reqresp/reqresp.ts +387 -256
  361. package/src/services/reqresp/status.ts +12 -3
  362. package/src/services/service.ts +45 -21
  363. package/src/services/tx_collection/config.ts +84 -0
  364. package/src/services/tx_collection/fast_tx_collection.ts +340 -0
  365. package/src/services/tx_collection/index.ts +2 -0
  366. package/src/services/tx_collection/instrumentation.ts +43 -0
  367. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  368. package/src/services/tx_collection/tx_collection.ts +215 -0
  369. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  370. package/src/services/tx_collection/tx_source.ts +37 -0
  371. package/src/services/tx_provider.ts +216 -0
  372. package/src/services/tx_provider_instrumentation.ts +44 -0
  373. package/src/test-helpers/index.ts +1 -0
  374. package/src/test-helpers/make-enrs.ts +4 -5
  375. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  376. package/src/test-helpers/mock-pubsub.ts +188 -0
  377. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  378. package/src/test-helpers/reqresp-nodes.ts +86 -35
  379. package/src/testbench/p2p_client_testbench_worker.ts +151 -25
  380. package/src/testbench/parse_log_file.ts +4 -4
  381. package/src/testbench/testbench.ts +4 -4
  382. package/src/testbench/worker_client_manager.ts +17 -23
  383. package/src/types/index.ts +2 -0
  384. package/src/util.ts +105 -91
  385. package/src/versioning.ts +11 -4
@@ -1,4 +1,5 @@
1
- import type { BlockAttestation } from '@aztec/stdlib/p2p';
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
2
3
 
3
4
  /**
4
5
  * An Attestation Pool contains attestations collected by a validator
@@ -8,7 +9,30 @@ import type { BlockAttestation } from '@aztec/stdlib/p2p';
8
9
  */
9
10
  export interface AttestationPool {
10
11
  /**
11
- * AddAttestation
12
+ * Adds new block proposal to the pool
13
+ */
14
+ addBlockProposal(blockProposal: BlockProposal): Promise<void>;
15
+
16
+ /**
17
+ * Get block proposal by it's ID
18
+ *
19
+ * @param id - The ID of the block proposal to retrieve. The ID is proposal.payload.archive
20
+ *
21
+ * @return The block proposal if it exists, otherwise undefined.
22
+ */
23
+ getBlockProposal(id: string): Promise<BlockProposal | undefined>;
24
+
25
+ /**
26
+ * Check if a block proposal exists in the pool
27
+ *
28
+ * @param idOrProposal - The ID of the block proposal or the block proposal itself to check. The ID is proposal.payload.archive
29
+ *
30
+ * @return True if the block proposal exists, false otherwise.
31
+ */
32
+ hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
33
+
34
+ /**
35
+ * AddAttestations
12
36
  *
13
37
  * @param attestations - Attestations to add into the pool
14
38
  */
@@ -28,7 +52,7 @@ export interface AttestationPool {
28
52
  *
29
53
  * @param slot - The oldest slot to keep.
30
54
  */
31
- deleteAttestationsOlderThan(slot: bigint): Promise<void>;
55
+ deleteAttestationsOlderThan(slot: SlotNumber): Promise<void>;
32
56
 
33
57
  /**
34
58
  * Delete Attestations for slot
@@ -37,7 +61,7 @@ export interface AttestationPool {
37
61
  *
38
62
  * @param slot - The slot to delete.
39
63
  */
40
- deleteAttestationsForSlot(slot: bigint): Promise<void>;
64
+ deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
41
65
 
42
66
  /**
43
67
  * Delete Attestations for slot and proposal
@@ -47,10 +71,20 @@ export interface AttestationPool {
47
71
  * @param slot - The slot to delete.
48
72
  * @param proposalId - The proposal to delete.
49
73
  */
50
- deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void>;
74
+ deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
75
+
76
+ /**
77
+ * Get all Attestations for all proposals for a given slot
78
+ *
79
+ * Retrieve all of the attestations observed pertaining to a given slot
80
+ *
81
+ * @param slot - The slot to query
82
+ * @return BlockAttestations
83
+ */
84
+ getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
51
85
 
52
86
  /**
53
- * Get Attestations for slot
87
+ * Get Attestations for slot and given proposal
54
88
  *
55
89
  * Retrieve all of the attestations observed pertaining to a given slot
56
90
  *
@@ -58,5 +92,39 @@ export interface AttestationPool {
58
92
  * @param proposalId - The proposal to query
59
93
  * @return BlockAttestations
60
94
  */
61
- getAttestationsForSlot(slot: bigint, proposalId: string): Promise<BlockAttestation[]>;
95
+ getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
96
+
97
+ /**
98
+ * Check if a specific attestation exists in the pool
99
+ *
100
+ * @param attestation - The attestation to check
101
+ * @return True if the attestation exists, false otherwise
102
+ */
103
+ hasAttestation(attestation: BlockAttestation): Promise<boolean>;
104
+
105
+ /**
106
+ * Returns whether adding this proposal is permitted at current capacity:
107
+ * - True if the proposal already exists, allow overwrite to keep parity with tests.
108
+ * - True if the slot is below the proposal cap.
109
+ * - False if the slot is at/above cap and this would be a new unique proposal.
110
+ *
111
+ * @param block - The block proposal to check
112
+ * @returns True if the proposal can be added (or already exists), false otherwise.
113
+ */
114
+ canAddProposal(block: BlockProposal): Promise<boolean>;
115
+
116
+ /**
117
+ * Returns whether an attestation would be accepted for (slot, proposalId):
118
+ * - True if the attestation already exists for this sender.
119
+ * - True if the attestation cap for (slot, proposalId) has not been reached.
120
+ * - False if the cap is reached and this attestation would be a new unique entry.
121
+ *
122
+ * @param attestation - The attestation to check
123
+ * @param committeeSize - Committee size for the attestation's slot, implementation may add a small buffer
124
+ * @returns True if the attestation can be added, false otherwise.
125
+ */
126
+ canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
127
+
128
+ /** Returns whether the pool is empty. */
129
+ isEmpty(): Promise<boolean>;
62
130
  }
@@ -1,6 +1,14 @@
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
1
2
  import { Secp256k1Signer } from '@aztec/foundation/crypto';
2
3
  import { Fr } from '@aztec/foundation/fields';
3
- import type { BlockAttestation } from '@aztec/stdlib/p2p';
4
+ import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
5
+ import {
6
+ BlockProposal as BlockProposalClass,
7
+ ConsensusPayload,
8
+ SignatureDomainSeparator,
9
+ getHashedSignaturePayloadEthSignedMessage,
10
+ } from '@aztec/stdlib/p2p';
11
+ import { makeL2BlockHeader } from '@aztec/stdlib/testing';
4
12
  import { TxHash } from '@aztec/stdlib/tx';
5
13
 
6
14
  import { jest } from '@jest/globals';
@@ -30,7 +38,19 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
30
38
 
31
39
  const createAttestationsForSlot = (slotNumber: number) => {
32
40
  const archive = Fr.random();
33
- return Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive)));
41
+ return signers.map(signer => mockAttestation(signer, slotNumber, archive));
42
+ };
43
+
44
+ const mockBlockProposal = (signer: Secp256k1Signer, slotNumber: number, archive: Fr = Fr.random()): BlockProposal => {
45
+ const header = makeL2BlockHeader(1, 2, slotNumber);
46
+ const payload = new ConsensusPayload(header.toCheckpointHeader(), archive);
47
+
48
+ const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
49
+ const signature = signer.sign(hash);
50
+
51
+ const txHashes = [TxHash.random(), TxHash.random()]; // Mock tx hashes
52
+
53
+ return new BlockProposalClass(payload, signature, txHashes);
34
54
  };
35
55
 
36
56
  // We compare buffers as the objects can have cached values attached to them which are not serialised
@@ -45,163 +65,201 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
45
65
  it('should add attestations to pool', async () => {
46
66
  const slotNumber = 420;
47
67
  const archive = Fr.random();
48
- const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive)));
68
+ const attestations = signers.slice(0, -1).map(signer => mockAttestation(signer, slotNumber, archive));
49
69
 
50
70
  await ap.addAttestations(attestations);
51
71
 
52
- // Check metrics have been updated.
53
- expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length);
72
+ const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(
73
+ SlotNumber(slotNumber),
74
+ archive.toString(),
75
+ );
76
+ expect(retrievedAttestations.length).toBe(attestations.length);
77
+ compareAttestations(retrievedAttestations, attestations);
54
78
 
55
- const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString());
79
+ // Check hasAttestation for added attestations
80
+ for (const attestation of attestations) {
81
+ expect(await ap.hasAttestation(attestation)).toBe(true);
82
+ }
56
83
 
57
- expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
84
+ const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
85
+ expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
86
+ compareAttestations(retrievedAttestationsForSlot, attestations);
58
87
 
59
- compareAttestations(retreivedAttestations, attestations);
88
+ // Add another one
89
+ const newAttestation = mockAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
90
+ await ap.addAttestations([newAttestation]);
91
+ const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(
92
+ SlotNumber(slotNumber),
93
+ archive.toString(),
94
+ );
95
+ expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
96
+ compareAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
97
+ expect(await ap.hasAttestation(newAttestation)).toBe(true);
98
+ const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
99
+ expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
100
+ compareAttestations(retrievedAttestationsForSlotAfterAdd, [...attestations, newAttestation]);
60
101
 
61
102
  // Delete by slot
62
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
63
-
64
- expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length);
103
+ await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
65
104
 
66
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString());
105
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
106
+ SlotNumber(slotNumber),
107
+ archive.toString(),
108
+ );
67
109
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
110
+ // Check hasAttestation after deletion
111
+ for (const attestation of attestations) {
112
+ expect(await ap.hasAttestation(attestation)).toBe(false);
113
+ }
114
+ expect(await ap.hasAttestation(newAttestation)).toBe(false);
68
115
  });
69
116
 
70
- it('Should handle duplicate proposals in a slot', async () => {
117
+ it('should handle duplicate proposals in a slot', async () => {
71
118
  const slotNumber = 420;
72
119
  const archive = Fr.random();
73
- const txs = [0, 1, 2, 3, 4, 5].map(() => TxHash.random());
74
120
 
75
121
  // Use the same signer for all attestations
76
122
  const attestations: BlockAttestation[] = [];
77
123
  const signer = signers[0];
78
124
  for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
79
- attestations.push(await mockAttestation(signer, slotNumber, archive, txs));
125
+ attestations.push(mockAttestation(signer, slotNumber, archive));
80
126
  }
81
127
 
128
+ // Add them to store and check we end up with only one
82
129
  await ap.addAttestations(attestations);
83
130
 
84
- const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString());
131
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
132
+ SlotNumber(slotNumber),
133
+ archive.toString(),
134
+ );
85
135
  expect(retreivedAttestations.length).toBe(1);
86
136
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
87
- expect(retreivedAttestations[0].payload.txHashes).toEqual(txs);
88
- expect((await retreivedAttestations[0].getSender()).toString()).toEqual(signer.address.toString());
137
+ expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
138
+
139
+ // Try adding them on another operation and check they are still not duplicated
140
+ await ap.addAttestations([attestations[0]]);
141
+ expect(await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
89
142
  });
90
143
 
91
- it('Should store attestations by differing slot', async () => {
144
+ it('should store attestations by differing slot', async () => {
92
145
  const slotNumbers = [1, 2, 3, 4];
93
- const attestations = await Promise.all(signers.map((signer, i) => mockAttestation(signer, slotNumbers[i])));
146
+ const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i]));
94
147
 
95
148
  await ap.addAttestations(attestations);
96
149
 
97
150
  for (const attestation of attestations) {
98
- const slot = attestation.payload.header.globalVariables.slotNumber;
151
+ const slot = attestation.payload.header.slotNumber;
99
152
  const archive = attestation.archive.toString();
100
153
 
101
- const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), archive);
154
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, archive);
102
155
  expect(retreivedAttestations.length).toBe(1);
103
156
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
104
- expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot);
157
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
105
158
  }
106
159
  });
107
160
 
108
- it('Should store attestations by differing slot and archive', async () => {
161
+ it('should store attestations by differing slot and archive', async () => {
109
162
  const slotNumbers = [1, 1, 2, 3];
110
163
  const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()];
111
- const attestations = await Promise.all(
112
- signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i])),
113
- );
164
+ const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i]));
114
165
 
115
166
  await ap.addAttestations(attestations);
116
167
 
117
168
  for (const attestation of attestations) {
118
- const slot = attestation.payload.header.globalVariables.slotNumber;
169
+ const slot = attestation.payload.header.slotNumber;
119
170
  const proposalId = attestation.archive.toString();
120
171
 
121
- const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), proposalId);
172
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, proposalId);
122
173
  expect(retreivedAttestations.length).toBe(1);
123
174
  expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
124
- expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot);
175
+ expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
125
176
  }
126
177
  });
127
178
 
128
- it('Should delete attestations', async () => {
179
+ it('should delete attestations', async () => {
129
180
  const slotNumber = 420;
130
181
  const archive = Fr.random();
131
- const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive)));
182
+ const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
132
183
  const proposalId = attestations[0].archive.toString();
133
184
 
134
185
  await ap.addAttestations(attestations);
135
186
 
136
- expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length);
137
-
138
- const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
187
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
139
188
  expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
140
189
  compareAttestations(retreivedAttestations, attestations);
141
190
 
142
- await ap.deleteAttestations(attestations);
191
+ // Check hasAttestation before deletion
192
+ for (const attestation of attestations) {
193
+ expect(await ap.hasAttestation(attestation)).toBe(true);
194
+ }
143
195
 
144
- expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length);
196
+ await ap.deleteAttestations(attestations);
145
197
 
146
- const gottenAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
198
+ const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
147
199
  expect(gottenAfterDelete.length).toBe(0);
200
+
201
+ // Check hasAttestation after deletion
202
+ for (const attestation of attestations) {
203
+ expect(await ap.hasAttestation(attestation)).toBe(false);
204
+ }
148
205
  });
149
206
 
150
- it('Should blanket delete attestations per slot', async () => {
207
+ it('should blanket delete attestations per slot', async () => {
151
208
  const slotNumber = 420;
152
209
  const archive = Fr.random();
153
- const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive)));
210
+ const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
154
211
  const proposalId = attestations[0].archive.toString();
155
212
 
156
213
  await ap.addAttestations(attestations);
157
214
 
158
- const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
215
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
159
216
  expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
160
217
  compareAttestations(retreivedAttestations, attestations);
161
218
 
162
- await ap.deleteAttestationsForSlot(BigInt(slotNumber));
219
+ await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
163
220
 
164
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
221
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
222
+ SlotNumber(slotNumber),
223
+ proposalId,
224
+ );
165
225
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
166
226
  });
167
227
 
168
- it('Should blanket delete attestations per slot and proposal', async () => {
228
+ it('should blanket delete attestations per slot and proposal', async () => {
169
229
  const slotNumber = 420;
170
230
  const archive = Fr.random();
171
- const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive)));
231
+ const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
172
232
  const proposalId = attestations[0].archive.toString();
173
233
 
174
234
  // Add another set of attestations with a different proposalId, yet the same slot
175
235
  const archive2 = Fr.random();
176
- const attestations2 = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive2)));
236
+ const attestations2 = signers.map(signer => mockAttestation(signer, slotNumber, archive2));
177
237
  const proposalId2 = attestations2[0].archive.toString();
178
238
 
179
239
  await ap.addAttestations(attestations);
180
240
  await ap.addAttestations(attestations2);
181
241
 
182
- expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length);
183
- expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations2.length);
184
-
185
- const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
242
+ const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
186
243
  expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
187
244
  compareAttestations(retreivedAttestations, attestations);
188
245
 
189
- await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
246
+ await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
190
247
 
191
- expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length);
192
-
193
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId);
248
+ const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
249
+ SlotNumber(slotNumber),
250
+ proposalId,
251
+ );
194
252
  expect(retreivedAttestationsAfterDelete.length).toBe(0);
195
253
 
196
- const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlot(
197
- BigInt(slotNumber),
254
+ const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(
255
+ SlotNumber(slotNumber),
198
256
  proposalId2,
199
257
  );
200
258
  expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
201
259
  compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
202
260
  });
203
261
 
204
- it('Should delete attestations older than a given slot', async () => {
262
+ it('should delete attestations older than a given slot', async () => {
205
263
  const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
206
264
  const attestations = (
207
265
  await Promise.all(slotNumbers.map(slotNumber => createAttestationsForSlot(slotNumber)))
@@ -210,21 +268,162 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
210
268
 
211
269
  await ap.addAttestations(attestations);
212
270
 
213
- const attestationsForSlot1 = await ap.getAttestationsForSlot(BigInt(1), proposalId);
271
+ const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
214
272
  expect(attestationsForSlot1.length).toBe(signers.length);
215
273
 
216
274
  const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
217
275
 
218
- await ap.deleteAttestationsOlderThan(BigInt(73));
276
+ await ap.deleteAttestationsOlderThan(SlotNumber(73));
219
277
 
220
- const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlot(BigInt(1), proposalId);
278
+ const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
221
279
  expect(attestationsForSlot1AfterDelete.length).toBe(0);
222
280
 
223
281
  expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
224
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1));
225
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2));
226
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3));
227
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69));
228
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72));
282
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(1));
283
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(2));
284
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(3));
285
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(69));
286
+ expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(72));
287
+ });
288
+
289
+ describe('BlockProposal in attestation pool', () => {
290
+ it('should add and retrieve block proposal', async () => {
291
+ const slotNumber = 420;
292
+ const archive = Fr.random();
293
+ const proposal = mockBlockProposal(signers[0], slotNumber, archive);
294
+ const proposalId = proposal.archive.toString();
295
+
296
+ await ap.addBlockProposal(proposal);
297
+
298
+ const retrievedProposal = await ap.getBlockProposal(proposalId);
299
+
300
+ expect(retrievedProposal).toBeDefined();
301
+ expect(retrievedProposal!).toEqual(proposal);
302
+
303
+ // Check hasBlockProposal with both id and object
304
+ expect(await ap.hasBlockProposal(proposalId)).toBe(true);
305
+ expect(await ap.hasBlockProposal(proposal)).toBe(true);
306
+ });
307
+
308
+ it('should return undefined for non-existent block proposal', async () => {
309
+ const nonExistentId = Fr.random().toString();
310
+ const retrievedProposal = await ap.getBlockProposal(nonExistentId);
311
+ expect(retrievedProposal).toBeUndefined();
312
+
313
+ // Check hasBlockProposal returns false for non-existent proposal
314
+ expect(await ap.hasBlockProposal(nonExistentId)).toBe(false);
315
+ });
316
+
317
+ it('should update block proposal if added twice with same id', async () => {
318
+ const slotNumber = 420;
319
+ const archive = Fr.random();
320
+ const proposal1 = mockBlockProposal(signers[0], slotNumber, archive);
321
+ const proposalId = proposal1.archive.toString();
322
+
323
+ await ap.addBlockProposal(proposal1);
324
+
325
+ // Create a new proposal with same archive but different signer
326
+ const proposal2 = mockBlockProposal(signers[1], slotNumber, archive);
327
+
328
+ await ap.addBlockProposal(proposal2);
329
+
330
+ const retrievedProposal = await ap.getBlockProposal(proposalId);
331
+ expect(retrievedProposal).toBeDefined();
332
+ // Should have the second proposal
333
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal2.toBuffer());
334
+ expect(retrievedProposal!.getSender()?.toString()).toBe(signers[1].address.toString());
335
+ });
336
+
337
+ it('should handle block proposals with different slots and same archive', async () => {
338
+ const archive = Fr.random();
339
+ const proposal1 = mockBlockProposal(signers[0], 100, archive);
340
+ const proposal2 = mockBlockProposal(signers[1], 200, archive);
341
+ const proposalId = archive.toString();
342
+
343
+ await ap.addBlockProposal(proposal1);
344
+ await ap.addBlockProposal(proposal2);
345
+
346
+ // Should get the latest one added
347
+ const retrievedProposal = await ap.getBlockProposal(proposalId);
348
+ expect(retrievedProposal).toBeDefined();
349
+ expect(retrievedProposal!.toBuffer()).toEqual(proposal2.toBuffer());
350
+ expect(retrievedProposal!.slotNumber).toBe(SlotNumber(200));
351
+ });
352
+
353
+ it('should delete block proposal when deleting attestations for slot and proposal', async () => {
354
+ const slotNumber = 420;
355
+ const archive = Fr.random();
356
+ const proposal = mockBlockProposal(signers[0], slotNumber, archive);
357
+ const proposalId = proposal.archive.toString();
358
+
359
+ // Add proposal and some attestations
360
+ await ap.addBlockProposal(proposal);
361
+ const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
362
+ await ap.addAttestations(attestations);
363
+
364
+ // Verify proposal exists
365
+ let retrievedProposal = await ap.getBlockProposal(proposalId);
366
+ expect(retrievedProposal).toBeDefined();
367
+ expect(await ap.hasBlockProposal(proposalId)).toBe(true);
368
+
369
+ // Delete attestations for slot and proposal
370
+ await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
371
+
372
+ // Proposal should be deleted
373
+ retrievedProposal = await ap.getBlockProposal(proposalId);
374
+ expect(retrievedProposal).toBeUndefined();
375
+ expect(await ap.hasBlockProposal(proposalId)).toBe(false);
376
+ });
377
+
378
+ it('should delete block proposal when deleting attestations for slot', async () => {
379
+ const slotNumber = 420;
380
+ const archive = Fr.random();
381
+ const proposal = mockBlockProposal(signers[0], slotNumber, archive);
382
+ const proposalId = proposal.archive.toString();
383
+
384
+ // Add proposal
385
+ await ap.addBlockProposal(proposal);
386
+
387
+ // Verify proposal exists
388
+ let retrievedProposal = await ap.getBlockProposal(proposalId);
389
+ expect(retrievedProposal).toBeDefined();
390
+ expect(await ap.hasBlockProposal(proposal)).toBe(true);
391
+
392
+ // Delete attestations for slot
393
+ await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
394
+
395
+ // Proposal should be deleted
396
+ retrievedProposal = await ap.getBlockProposal(proposalId);
397
+ expect(retrievedProposal).toBeUndefined();
398
+ expect(await ap.hasBlockProposal(proposal)).toBe(false);
399
+ });
400
+
401
+ it('should be able to fetch both block proposal and attestations', async () => {
402
+ const slotNumber = 420;
403
+ const archive = Fr.random();
404
+ const proposal = mockBlockProposal(signers[0], slotNumber, archive);
405
+ const proposalId = proposal.archive.toString();
406
+
407
+ // Add proposal first
408
+ await ap.addBlockProposal(proposal);
409
+
410
+ // Add attestations for the same proposal
411
+ const attestations = signers.slice(1).map(signer => mockAttestation(signer, slotNumber, archive));
412
+ await ap.addAttestations(attestations);
413
+
414
+ // Retrieve both proposal and attestations
415
+ const retrievedProposal = await ap.getBlockProposal(proposalId);
416
+ const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
417
+
418
+ expect(retrievedProposal).toBeDefined();
419
+ expect(retrievedProposal).toEqual(proposal);
420
+ expect(await ap.hasBlockProposal(proposalId)).toBe(true);
421
+
422
+ compareAttestations(retrievedAttestations, attestations);
423
+ // Check hasAttestation for all attestations
424
+ for (const attestation of attestations) {
425
+ expect(await ap.hasAttestation(attestation)).toBe(true);
426
+ }
427
+ });
229
428
  });
230
429
  }