@aztec/p2p 0.0.1-commit.fcb71a6 → 0.0.1-commit.ff7989d6c

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 (524) 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 +7 -6
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +53 -14
  7. package/dest/client/interface.d.ts +58 -25
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +46 -51
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +601 -259
  12. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  13. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  14. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  15. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  18. package/dest/config.d.ts +35 -7
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +23 -9
  21. package/dest/errors/tx-pool.error.d.ts +8 -0
  22. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  23. package/dest/errors/tx-pool.error.js +9 -0
  24. package/dest/index.d.ts +2 -1
  25. package/dest/index.d.ts.map +1 -1
  26. package/dest/index.js +1 -0
  27. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +111 -76
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +527 -287
  33. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  34. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/index.js +1 -2
  36. package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  38. package/dest/mem_pools/attestation_pool/mocks.js +16 -12
  39. package/dest/mem_pools/index.d.ts +3 -2
  40. package/dest/mem_pools/index.d.ts.map +1 -1
  41. package/dest/mem_pools/index.js +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +5 -14
  45. package/dest/mem_pools/interface.d.ts +5 -5
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
  48. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
  50. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
  51. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
  53. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
  54. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
  56. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  57. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  58. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  59. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
  60. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  62. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
  63. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
  65. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
  66. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  68. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  70. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  71. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  73. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  74. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  76. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  77. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  91. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
  92. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  94. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  95. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  97. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  98. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  100. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  101. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  102. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  103. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  104. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  105. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
  106. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  107. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  108. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  109. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  110. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  111. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  112. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  113. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  114. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  115. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
  116. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  117. package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
  118. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +97 -0
  119. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  120. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +152 -0
  121. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  122. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  123. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  124. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  125. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  126. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
  127. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
  128. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  129. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
  130. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
  131. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  132. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +896 -0
  133. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  134. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  135. package/dest/msg_validators/attestation_validator/attestation_validator.js +51 -18
  136. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -7
  137. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
  139. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  140. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  141. package/dest/msg_validators/clock_tolerance.js +37 -0
  142. package/dest/msg_validators/index.d.ts +2 -2
  143. package/dest/msg_validators/index.d.ts.map +1 -1
  144. package/dest/msg_validators/index.js +1 -1
  145. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  146. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  147. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  148. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  149. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  150. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  151. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  152. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  153. package/dest/msg_validators/proposal_validator/index.js +3 -0
  154. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  155. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  156. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  157. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  158. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  159. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  160. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  161. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  162. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  163. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  164. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  165. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  166. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  167. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  168. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  169. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  170. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  171. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  172. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  173. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  174. package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
  175. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  176. package/dest/msg_validators/tx_validator/factory.js +21 -11
  177. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  178. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  179. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  180. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  181. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  182. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  183. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  184. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  185. package/dest/msg_validators/tx_validator/index.js +1 -0
  186. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
  187. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  188. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  189. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  190. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  191. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  192. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  193. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  194. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  195. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  196. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  197. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  198. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  199. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  200. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  201. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  202. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  203. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  204. package/dest/services/data_store.d.ts +1 -1
  205. package/dest/services/data_store.d.ts.map +1 -1
  206. package/dest/services/data_store.js +10 -6
  207. package/dest/services/discv5/discV5_service.js +1 -1
  208. package/dest/services/dummy_service.d.ts +28 -3
  209. package/dest/services/dummy_service.d.ts.map +1 -1
  210. package/dest/services/dummy_service.js +51 -0
  211. package/dest/services/encoding.d.ts +2 -2
  212. package/dest/services/encoding.d.ts.map +1 -1
  213. package/dest/services/encoding.js +9 -7
  214. package/dest/services/gossipsub/index.d.ts +3 -0
  215. package/dest/services/gossipsub/index.d.ts.map +1 -0
  216. package/dest/services/gossipsub/index.js +2 -0
  217. package/dest/services/gossipsub/scoring.d.ts +21 -3
  218. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  219. package/dest/services/gossipsub/scoring.js +24 -7
  220. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  221. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  222. package/dest/services/gossipsub/topic_score_params.js +346 -0
  223. package/dest/services/index.d.ts +2 -1
  224. package/dest/services/index.d.ts.map +1 -1
  225. package/dest/services/index.js +1 -0
  226. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  227. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  228. package/dest/services/libp2p/instrumentation.js +30 -72
  229. package/dest/services/libp2p/libp2p_service.d.ts +106 -33
  230. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  231. package/dest/services/libp2p/libp2p_service.js +984 -317
  232. package/dest/services/peer-manager/metrics.d.ts +2 -2
  233. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  234. package/dest/services/peer-manager/metrics.js +21 -26
  235. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  236. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  237. package/dest/services/peer-manager/peer_manager.js +0 -10
  238. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  239. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  240. package/dest/services/peer-manager/peer_scoring.js +32 -6
  241. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
  242. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  243. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +562 -0
  244. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  245. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  246. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  247. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
  248. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  249. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
  251. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  252. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
  253. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  254. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  255. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  256. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  257. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  258. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  259. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  260. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  261. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  262. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  263. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  264. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  265. package/dest/services/reqresp/constants.d.ts +12 -0
  266. package/dest/services/reqresp/constants.d.ts.map +1 -0
  267. package/dest/services/reqresp/constants.js +7 -0
  268. package/dest/services/reqresp/interface.d.ts +12 -1
  269. package/dest/services/reqresp/interface.d.ts.map +1 -1
  270. package/dest/services/reqresp/interface.js +15 -1
  271. package/dest/services/reqresp/metrics.d.ts +6 -5
  272. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  273. package/dest/services/reqresp/metrics.js +17 -21
  274. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  275. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  276. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  277. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  278. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  279. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
  280. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
  281. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  282. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
  283. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  284. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  285. package/dest/services/reqresp/protocols/status.js +4 -1
  286. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  287. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  288. package/dest/services/reqresp/protocols/tx.js +20 -0
  289. package/dest/services/reqresp/reqresp.d.ts +6 -1
  290. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  291. package/dest/services/reqresp/reqresp.js +471 -50
  292. package/dest/services/service.d.ts +55 -3
  293. package/dest/services/service.d.ts.map +1 -1
  294. package/dest/services/tx_collection/config.d.ts +22 -1
  295. package/dest/services/tx_collection/config.d.ts.map +1 -1
  296. package/dest/services/tx_collection/config.js +55 -1
  297. package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
  298. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  299. package/dest/services/tx_collection/fast_tx_collection.js +71 -44
  300. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  301. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  302. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  303. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  304. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  305. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  306. package/dest/services/tx_collection/index.d.ts +3 -1
  307. package/dest/services/tx_collection/index.d.ts.map +1 -1
  308. package/dest/services/tx_collection/index.js +2 -0
  309. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  310. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  311. package/dest/services/tx_collection/instrumentation.js +11 -13
  312. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  313. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  314. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  315. package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
  316. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  317. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  318. package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -5
  319. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  320. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  321. package/dest/services/tx_collection/tx_collection.d.ts +29 -16
  322. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  323. package/dest/services/tx_collection/tx_collection.js +79 -7
  324. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  325. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  326. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  327. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  328. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  329. package/dest/services/tx_collection/tx_source.js +19 -2
  330. package/dest/services/tx_file_store/config.d.ts +16 -0
  331. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  332. package/dest/services/tx_file_store/config.js +22 -0
  333. package/dest/services/tx_file_store/index.d.ts +4 -0
  334. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  335. package/dest/services/tx_file_store/index.js +3 -0
  336. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  337. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  338. package/dest/services/tx_file_store/instrumentation.js +29 -0
  339. package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
  340. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  341. package/dest/services/tx_file_store/tx_file_store.js +152 -0
  342. package/dest/services/tx_provider.d.ts +5 -5
  343. package/dest/services/tx_provider.d.ts.map +1 -1
  344. package/dest/services/tx_provider.js +5 -4
  345. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  346. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  347. package/dest/services/tx_provider_instrumentation.js +7 -20
  348. package/dest/test-helpers/index.d.ts +3 -1
  349. package/dest/test-helpers/index.d.ts.map +1 -1
  350. package/dest/test-helpers/index.js +2 -0
  351. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  352. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  353. package/dest/test-helpers/mock-pubsub.d.ts +29 -2
  354. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  355. package/dest/test-helpers/mock-pubsub.js +103 -2
  356. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  357. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  358. package/dest/test-helpers/reqresp-nodes.js +2 -1
  359. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  360. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  361. package/dest/test-helpers/test_tx_provider.js +41 -0
  362. package/dest/test-helpers/testbench-utils.d.ts +163 -0
  363. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  364. package/dest/test-helpers/testbench-utils.js +366 -0
  365. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  366. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  367. package/dest/testbench/p2p_client_testbench_worker.js +221 -127
  368. package/dest/testbench/worker_client_manager.d.ts +51 -6
  369. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  370. package/dest/testbench/worker_client_manager.js +226 -39
  371. package/dest/util.d.ts +2 -2
  372. package/dest/util.d.ts.map +1 -1
  373. package/package.json +16 -16
  374. package/src/bootstrap/bootstrap.ts +7 -4
  375. package/src/client/factory.ts +96 -24
  376. package/src/client/interface.ts +76 -25
  377. package/src/client/p2p_client.ts +269 -290
  378. package/src/client/test/tx_proposal_collector/README.md +227 -0
  379. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +346 -0
  380. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  381. package/src/config.ts +49 -13
  382. package/src/errors/tx-pool.error.ts +12 -0
  383. package/src/index.ts +1 -0
  384. package/src/mem_pools/attestation_pool/attestation_pool.ts +510 -78
  385. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +612 -320
  386. package/src/mem_pools/attestation_pool/index.ts +9 -2
  387. package/src/mem_pools/attestation_pool/mocks.ts +20 -13
  388. package/src/mem_pools/index.ts +4 -1
  389. package/src/mem_pools/instrumentation.ts +10 -18
  390. package/src/mem_pools/interface.ts +4 -4
  391. package/src/mem_pools/tx_pool/README.md +29 -14
  392. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
  393. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
  394. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
  395. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  396. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  397. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
  398. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  399. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  400. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  401. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  402. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  403. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  404. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  405. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
  406. package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
  407. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
  408. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  409. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  410. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  411. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
  412. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  413. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  414. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  415. package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
  416. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +242 -0
  417. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  418. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
  419. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
  420. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1069 -0
  421. package/src/msg_validators/attestation_validator/attestation_validator.ts +36 -21
  422. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +21 -18
  423. package/src/msg_validators/clock_tolerance.ts +51 -0
  424. package/src/msg_validators/index.ts +1 -1
  425. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  426. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  427. package/src/msg_validators/proposal_validator/index.ts +3 -0
  428. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  429. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  430. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  431. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  432. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  433. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  434. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  435. package/src/msg_validators/tx_validator/factory.ts +64 -23
  436. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  437. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  438. package/src/msg_validators/tx_validator/index.ts +1 -0
  439. package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
  440. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  441. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  442. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -19
  443. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  444. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  445. package/src/services/data_store.ts +10 -7
  446. package/src/services/discv5/discV5_service.ts +1 -1
  447. package/src/services/dummy_service.ts +68 -1
  448. package/src/services/encoding.ts +8 -6
  449. package/src/services/gossipsub/README.md +641 -0
  450. package/src/services/gossipsub/index.ts +2 -0
  451. package/src/services/gossipsub/scoring.ts +29 -5
  452. package/src/services/gossipsub/topic_score_params.ts +487 -0
  453. package/src/services/index.ts +1 -0
  454. package/src/services/libp2p/instrumentation.ts +32 -73
  455. package/src/services/libp2p/libp2p_service.ts +651 -301
  456. package/src/services/peer-manager/metrics.ts +22 -26
  457. package/src/services/peer-manager/peer_manager.ts +1 -2
  458. package/src/services/peer-manager/peer_scoring.ts +28 -4
  459. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  460. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  461. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  462. package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
  463. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
  464. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  465. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  466. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  467. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  468. package/src/services/reqresp/constants.ts +14 -0
  469. package/src/services/reqresp/interface.ts +29 -1
  470. package/src/services/reqresp/metrics.ts +36 -27
  471. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  472. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
  473. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
  474. package/src/services/reqresp/protocols/status.ts +7 -4
  475. package/src/services/reqresp/protocols/tx.ts +22 -0
  476. package/src/services/reqresp/reqresp.ts +79 -22
  477. package/src/services/service.ts +72 -4
  478. package/src/services/tx_collection/config.ts +83 -1
  479. package/src/services/tx_collection/fast_tx_collection.ts +93 -47
  480. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  481. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  482. package/src/services/tx_collection/index.ts +6 -0
  483. package/src/services/tx_collection/instrumentation.ts +11 -13
  484. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  485. package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
  486. package/src/services/tx_collection/slow_tx_collection.ts +68 -35
  487. package/src/services/tx_collection/tx_collection.ts +121 -24
  488. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  489. package/src/services/tx_collection/tx_source.ts +22 -3
  490. package/src/services/tx_file_store/config.ts +37 -0
  491. package/src/services/tx_file_store/index.ts +3 -0
  492. package/src/services/tx_file_store/instrumentation.ts +36 -0
  493. package/src/services/tx_file_store/tx_file_store.ts +175 -0
  494. package/src/services/tx_provider.ts +10 -9
  495. package/src/services/tx_provider_instrumentation.ts +13 -20
  496. package/src/test-helpers/index.ts +2 -0
  497. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  498. package/src/test-helpers/mock-pubsub.ts +143 -3
  499. package/src/test-helpers/reqresp-nodes.ts +2 -1
  500. package/src/test-helpers/test_tx_provider.ts +64 -0
  501. package/src/test-helpers/testbench-utils.ts +430 -0
  502. package/src/testbench/p2p_client_testbench_worker.ts +348 -123
  503. package/src/testbench/worker_client_manager.ts +304 -42
  504. package/src/util.ts +7 -1
  505. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
  506. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  507. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
  508. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
  509. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  510. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
  511. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
  512. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
  513. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
  514. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  515. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  516. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  517. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  518. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  519. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  520. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
  521. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
  522. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
  523. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  524. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,38 +1,43 @@
1
- import { GENESIS_BLOCK_HEADER_HASH, INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
2
- import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
1
+ import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
2
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
3
+ import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
4
  import { createLogger } from '@aztec/foundation/log';
5
+ import { RunningPromise } from '@aztec/foundation/promise';
4
6
  import { DateProvider } from '@aztec/foundation/timer';
5
- import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncSingleton } from '@aztec/kv-store';
6
- import type {
7
- EthAddress,
8
- L2BlockId,
9
- L2BlockNew,
10
- L2BlockSource,
7
+ import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
8
+ import { L2TipsKVStore } from '@aztec/kv-store/stores';
9
+ import {
10
+ type CheckpointId,
11
+ type EthAddress,
12
+ type L2Block,
13
+ type L2BlockId,
14
+ type L2BlockSource,
11
15
  L2BlockStream,
12
- L2BlockStreamEvent,
13
- L2Tips,
16
+ type L2BlockStreamEvent,
17
+ type L2Tips,
18
+ type L2TipsStore,
14
19
  } from '@aztec/stdlib/block';
15
20
  import type { ContractDataSource } from '@aztec/stdlib/contract';
16
21
  import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
17
22
  import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
18
- import { BlockAttestation, type BlockProposal, type P2PClientType } from '@aztec/stdlib/p2p';
19
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
20
23
  import {
21
- Attributes,
22
- type TelemetryClient,
23
- TraceableL2BlockStream,
24
- WithTracer,
25
- getTelemetryClient,
26
- trackSpan,
27
- } from '@aztec/telemetry-client';
24
+ type BlockProposal,
25
+ CheckpointAttestation,
26
+ type CheckpointProposal,
27
+ type P2PClientType,
28
+ type TopicType,
29
+ } from '@aztec/stdlib/p2p';
30
+ import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
31
+ import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
28
32
 
29
33
  import type { PeerId } from '@libp2p/interface';
30
34
  import type { ENR } from '@nethermindeth/enr';
31
35
 
32
36
  import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
33
- import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
37
+ import { TxPoolError } from '../errors/tx-pool.error.js';
38
+ import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
34
39
  import type { MemPools } from '../mem_pools/interface.js';
35
- import type { TxPool } from '../mem_pools/tx_pool/index.js';
40
+ import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
36
41
  import type { AuthRequest, StatusMessage } from '../services/index.js';
37
42
  import {
38
43
  ReqRespSubProtocol,
@@ -40,8 +45,15 @@ import {
40
45
  type ReqRespSubProtocolValidators,
41
46
  } from '../services/reqresp/interface.js';
42
47
  import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js';
43
- import type { P2PBlockReceivedCallback, P2PService } from '../services/service.js';
48
+ import type {
49
+ DuplicateAttestationInfo,
50
+ DuplicateProposalInfo,
51
+ P2PBlockReceivedCallback,
52
+ P2PCheckpointReceivedCallback,
53
+ P2PService,
54
+ } from '../services/service.js';
44
55
  import { TxCollection } from '../services/tx_collection/tx_collection.js';
56
+ import type { TxFileStore } from '../services/tx_file_store/tx_file_store.js';
45
57
  import { TxProvider } from '../services/tx_provider.js';
46
58
  import { type P2P, P2PClientState, type P2PSyncState } from './interface.js';
47
59
 
@@ -62,14 +74,11 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
62
74
  private provenBlockNumberAtStart = -1;
63
75
  private finalizedBlockNumberAtStart = -1;
64
76
 
65
- private synchedBlockHashes: AztecAsyncMap<BlockNumber, string>;
66
- private synchedLatestBlockNumber: AztecAsyncSingleton<BlockNumber>;
67
- private synchedProvenBlockNumber: AztecAsyncSingleton<BlockNumber>;
68
- private synchedFinalizedBlockNumber: AztecAsyncSingleton<BlockNumber>;
77
+ private l2Tips: L2TipsStore;
69
78
  private synchedLatestSlot: AztecAsyncSingleton<bigint>;
70
79
 
71
- private txPool: TxPool;
72
- private attestationPool: AttestationPool;
80
+ private txPool: TxPoolV2;
81
+ private attestationPool: AttestationPoolApi;
73
82
 
74
83
  private config: P2PConfig;
75
84
 
@@ -79,14 +88,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
79
88
 
80
89
  private validatorAddresses: EthAddress[] = [];
81
90
 
82
- /**
83
- * In-memory P2P client constructor.
84
- * @param store - The client's instance of the KV store.
85
- * @param l2BlockSource - P2P client's source for fetching existing blocks.
86
- * @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation.
87
- * @param p2pService - The concrete instance of p2p networking to use.
88
- * @param log - A logger.
89
- */
91
+ /** Tracks the last slot for which we called prepareForSlot */
92
+ private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
93
+
94
+ /** Polls for slot changes and calls prepareForSlot on the tx pool */
95
+ private slotMonitor: RunningPromise | undefined;
96
+
90
97
  constructor(
91
98
  _clientType: T,
92
99
  private store: AztecAsyncKVStore,
@@ -94,6 +101,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
94
101
  mempools: MemPools,
95
102
  private p2pService: P2PService,
96
103
  private txCollection: TxCollection,
104
+ private txFileStore: TxFileStore | undefined,
105
+ private epochCache: EpochCacheInterface,
97
106
  config: Partial<P2PConfig> = {},
98
107
  private _dateProvider: DateProvider = new DateProvider(),
99
108
  private telemetry: TelemetryClient = getTelemetryClient(),
@@ -114,7 +123,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
114
123
  );
115
124
 
116
125
  // Default to collecting all txs when we see a valid proposal
117
- // This can be overridden by the validator client to attest, and it will call getTxsForBlockProposal on its own
126
+ // This can be overridden by the validator client to validate, and it will call getTxsForBlockProposal on its own
127
+ // Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
118
128
  // TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
119
129
  // validator-client code into here so we can validate a proposal is reasonable.
120
130
  this.registerBlockProposalHandler(async (block, sender) => {
@@ -123,21 +133,17 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
123
133
  const constants = this.txCollection.getConstants();
124
134
  const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
125
135
  const deadline = new Date(nextSlotTimestampSeconds * 1000);
126
- const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.payload.header.lastArchiveRoot);
136
+ const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.blockHeader.lastArchive.root);
127
137
  if (!parentBlock) {
128
138
  this.log.debug(`Cannot collect txs for proposal as parent block not found`);
129
- return;
139
+ return false;
130
140
  }
131
141
  const blockNumber = BlockNumber(parentBlock.getBlockNumber() + 1);
132
142
  await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
133
- return undefined;
143
+ return true;
134
144
  });
135
145
 
136
- // REFACTOR: Try replacing these with an L2TipsStore
137
- this.synchedBlockHashes = store.openMap('p2p_pool_block_hashes');
138
- this.synchedLatestBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
139
- this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
140
- this.synchedFinalizedBlockNumber = store.openSingleton('p2p_pool_last_finalized_l2_block');
146
+ this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
141
147
  this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
142
148
  }
143
149
 
@@ -162,99 +168,61 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
162
168
  return Promise.resolve(this.p2pService.getPeers(includePending));
163
169
  }
164
170
 
171
+ public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
172
+ return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
173
+ }
174
+
165
175
  public getL2BlockHash(number: BlockNumber): Promise<string | undefined> {
166
- return this.synchedBlockHashes.getAsync(number);
176
+ return this.l2Tips.getL2BlockHash(number);
167
177
  }
168
178
 
169
- public updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
170
- this.txPool.updateConfig(config);
179
+ public async updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
180
+ await this.txPool.updateConfig(config);
171
181
  this.p2pService.updateConfig(config);
172
- return Promise.resolve();
173
182
  }
174
183
 
175
- public async getL2Tips(): Promise<L2Tips> {
176
- const latestBlockNumber = await this.getSyncedLatestBlockNum();
177
- let latestBlockHash: string | undefined;
178
-
179
- const provenBlockNumber = await this.getSyncedProvenBlockNum();
180
- let provenBlockHash: string | undefined;
181
-
182
- const finalizedBlockNumber = await this.getSyncedFinalizedBlockNum();
183
- let finalizedBlockHash: string | undefined;
184
-
185
- if (latestBlockNumber > 0) {
186
- latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
187
- if (typeof latestBlockHash === 'undefined') {
188
- throw new Error(`Block hash for latest block ${latestBlockNumber} not found in p2p client`);
189
- }
190
- }
191
-
192
- if (provenBlockNumber > 0) {
193
- provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
194
- if (typeof provenBlockHash === 'undefined') {
195
- throw new Error(`Block hash for proven block ${provenBlockNumber} not found in p2p client`);
196
- }
197
- }
198
-
199
- if (finalizedBlockNumber > 0) {
200
- finalizedBlockHash = await this.synchedBlockHashes.getAsync(finalizedBlockNumber);
201
- if (typeof finalizedBlockHash === 'undefined') {
202
- throw new Error(`Block hash for finalized block ${finalizedBlockNumber} not found in p2p client`);
203
- }
204
- }
205
-
206
- const genesisHash = GENESIS_BLOCK_HEADER_HASH.toString();
207
-
208
- return {
209
- latest: { hash: latestBlockHash ?? genesisHash, number: latestBlockNumber },
210
- proven: { hash: provenBlockHash ?? genesisHash, number: provenBlockNumber },
211
- finalized: { hash: finalizedBlockHash ?? genesisHash, number: finalizedBlockNumber },
212
- };
184
+ public getL2Tips(): Promise<L2Tips> {
185
+ return this.l2Tips.getL2Tips();
213
186
  }
214
187
 
215
188
  public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
216
189
  this.log.debug(`Handling block stream event ${event.type}`);
190
+
217
191
  switch (event.type) {
218
192
  case 'blocks-added':
219
- await this.handleLatestL2Blocks(event.blocks.map(b => b.block.toL2Block()));
193
+ await this.handleLatestL2Blocks(event.blocks);
220
194
  break;
221
195
  case 'chain-finalized': {
222
- // TODO (alexg): I think we can prune the block hashes map here
223
- await this.setBlockHash(event.block);
224
- const from = BlockNumber((await this.getSyncedFinalizedBlockNum()) + 1);
196
+ const oldFinalizedBlockNum = await this.getSyncedFinalizedBlockNum();
197
+ const from = BlockNumber(oldFinalizedBlockNum + 1);
225
198
  const limit = event.block.number - from + 1;
226
199
  if (limit > 0) {
227
200
  const oldBlocks = await this.l2BlockSource.getBlocks(from, limit);
228
- await this.handleFinalizedL2Blocks(oldBlocks.map(b => b.toL2Block()));
201
+ await this.handleFinalizedL2Blocks(oldBlocks);
229
202
  }
230
203
  break;
231
204
  }
232
- case 'chain-proven': {
233
- await this.setBlockHash(event.block);
205
+ case 'chain-proven':
234
206
  this.txCollection.stopCollectingForBlocksUpTo(event.block.number);
235
- await this.synchedProvenBlockNumber.set(event.block.number);
236
207
  break;
237
- }
238
208
  case 'chain-pruned':
239
- await this.setBlockHash(event.block);
240
209
  this.txCollection.stopCollectingForBlocksAfter(event.block.number);
241
- await this.handlePruneL2Blocks(event.block.number);
210
+ await this.handlePruneL2Blocks(event.block, event.checkpoint);
211
+ break;
212
+ case 'chain-checkpointed':
242
213
  break;
243
214
  default: {
244
215
  const _: never = event;
245
216
  break;
246
217
  }
247
218
  }
248
- }
249
219
 
250
- private async setBlockHash(block: L2BlockId): Promise<void> {
251
- if (block.hash !== undefined) {
252
- await this.synchedBlockHashes.set(block.number, block.hash.toString());
253
- }
220
+ // Pass the event through to our l2 tips store
221
+ await this.l2Tips.handleBlockStreamEvent(event);
222
+ await this.startServiceIfSynched();
254
223
  }
255
224
 
256
225
  #assertIsReady() {
257
- // this.log.info('Checking if p2p client is ready, current state: ', this.currentState);
258
226
  if (!this.isReady()) {
259
227
  throw new Error('P2P client not ready');
260
228
  }
@@ -272,11 +240,14 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
272
240
  return this.syncPromise;
273
241
  }
274
242
 
243
+ // Start the tx pool first, as it needs to hydrate state from persistence
244
+ await this.txPool.start();
245
+
275
246
  // get the current latest block numbers
276
247
  const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
277
- this.latestBlockNumberAtStart = latestBlockNumbers.latest.number;
278
- this.provenBlockNumberAtStart = latestBlockNumbers.proven.number;
279
- this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.number;
248
+ this.latestBlockNumberAtStart = latestBlockNumbers.proposed.number;
249
+ this.provenBlockNumberAtStart = latestBlockNumbers.proven.block.number;
250
+ this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.block.number;
280
251
 
281
252
  const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
282
253
  const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
@@ -321,6 +292,16 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
321
292
 
322
293
  this.blockStream!.start();
323
294
  await this.txCollection.start();
295
+ this.txFileStore?.start();
296
+
297
+ // Start slot monitor to call prepareForSlot when the slot changes
298
+ this.slotMonitor = new RunningPromise(
299
+ () => this.maybeCallPrepareForSlot(),
300
+ this.log,
301
+ this.config.slotCheckIntervalMS,
302
+ );
303
+ this.slotMonitor.start();
304
+
324
305
  return this.syncPromise;
325
306
  }
326
307
 
@@ -335,12 +316,10 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
335
316
  private initBlockStream(startingBlock?: BlockNumber) {
336
317
  if (!this.blockStream) {
337
318
  const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
338
- this.blockStream = new TraceableL2BlockStream(
319
+ this.blockStream = new L2BlockStream(
339
320
  this.l2BlockSource,
340
321
  this,
341
322
  this,
342
- this.telemetry.getTracer('P2PL2BlockStream'),
343
- 'P2PL2BlockStream',
344
323
  createLogger(`${this.log.module}:l2-block-stream`),
345
324
  { batchSize, pollIntervalMS, startingBlock },
346
325
  );
@@ -353,12 +332,18 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
353
332
  */
354
333
  public async stop() {
355
334
  this.log.debug('Stopping p2p client...');
335
+ await this.slotMonitor?.stop();
336
+ this.log.debug('Stopped slot monitor');
356
337
  await tryStop(this.txCollection);
357
338
  this.log.debug('Stopped tx collection service');
339
+ await this.txFileStore?.stop();
340
+ this.log.debug('Stopped tx file store');
358
341
  await this.p2pService.stop();
359
342
  this.log.debug('Stopped p2p service');
360
343
  await this.blockStream?.stop();
361
344
  this.log.debug('Stopped block downloader');
345
+ await this.txPool.stop();
346
+ this.log.debug('Stopped tx pool');
362
347
  await this.runningPromise;
363
348
  this.setCurrentState(P2PClientState.STOPPED);
364
349
  this.log.info('P2P client stopped');
@@ -375,28 +360,59 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
375
360
  [Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
376
361
  [Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
377
362
  }))
378
- public broadcastProposal(proposal: BlockProposal): Promise<void> {
363
+ public async broadcastProposal(proposal: BlockProposal): Promise<void> {
379
364
  this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
365
+ // Store our own proposal so we can respond to req/resp requests for it
366
+ const { count } = await this.attestationPool.tryAddBlockProposal(proposal);
367
+ if (count > 1) {
368
+ if (this.config.broadcastEquivocatedProposals) {
369
+ this.log.warn(`Broadcasting equivocated block proposal for slot ${proposal.slotNumber}`, {
370
+ slot: proposal.slotNumber,
371
+ archive: proposal.archive.toString(),
372
+ count,
373
+ });
374
+ } else {
375
+ throw new Error(`Attempted to broadcast a duplicate block proposal for slot ${proposal.slotNumber}`);
376
+ }
377
+ }
380
378
  return this.p2pService.propagate(proposal);
381
379
  }
382
380
 
383
- public async broadcastAttestations(attestations: BlockAttestation[]): Promise<void> {
384
- this.log.verbose(`Broadcasting ${attestations.length} attestations to peers`);
381
+ @trackSpan('p2pClient.broadcastCheckpointProposal', async proposal => ({
382
+ [Attributes.SLOT_NUMBER]: proposal.slotNumber,
383
+ [Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
384
+ [Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
385
+ }))
386
+ public async broadcastCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
387
+ this.log.verbose(`Broadcasting checkpoint proposal for slot ${proposal.slotNumber} to peers`);
388
+ const blockProposal = proposal.getBlockProposal();
389
+ if (blockProposal) {
390
+ // Store our own last-block proposal so we can respond to req/resp requests for it.
391
+ await this.attestationPool.tryAddBlockProposal(blockProposal);
392
+ }
393
+ return this.p2pService.propagate(proposal);
394
+ }
395
+
396
+ public async broadcastCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
397
+ this.log.verbose(`Broadcasting ${attestations.length} checkpoint attestations to peers`);
385
398
  await Promise.all(attestations.map(att => this.p2pService.propagate(att)));
386
399
  }
387
400
 
388
- public async getAttestationsForSlot(slot: SlotNumber, proposalId?: string): Promise<BlockAttestation[]> {
401
+ public async getCheckpointAttestationsForSlot(
402
+ slot: SlotNumber,
403
+ proposalId?: string,
404
+ ): Promise<CheckpointAttestation[]> {
389
405
  return await (proposalId
390
- ? this.attestationPool.getAttestationsForSlotAndProposal(slot, proposalId)
391
- : this.attestationPool.getAttestationsForSlot(slot));
406
+ ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId)
407
+ : this.attestationPool.getCheckpointAttestationsForSlot(slot));
392
408
  }
393
409
 
394
- public addAttestations(attestations: BlockAttestation[]): Promise<void> {
395
- return this.attestationPool.addAttestations(attestations);
410
+ public addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
411
+ return this.attestationPool.addOwnCheckpointAttestations(attestations);
396
412
  }
397
413
 
398
- public deleteAttestation(attestation: BlockAttestation): Promise<void> {
399
- return this.attestationPool.deleteAttestations([attestation]);
414
+ public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
415
+ return this.attestationPool.hasBlockProposalsForSlot(slot);
400
416
  }
401
417
 
402
418
  // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
@@ -405,10 +421,22 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
405
421
  this.p2pService.registerBlockReceivedCallback(handler);
406
422
  }
407
423
 
424
+ public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
425
+ this.p2pService.registerCheckpointReceivedCallback(handler);
426
+ }
427
+
428
+ public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
429
+ this.p2pService.registerDuplicateProposalCallback(callback);
430
+ }
431
+
432
+ public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
433
+ this.p2pService.registerDuplicateAttestationCallback(callback);
434
+ }
435
+
408
436
  /**
409
437
  * Uses the batched Request Response protocol to request a set of transactions from the network.
410
438
  */
411
- public async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
439
+ private async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
412
440
  const timeoutMs = 8000; // Longer timeout for now
413
441
  const maxRetryAttempts = 10; // Keep retrying within the timeout
414
442
  const requests = chunkTxHashesRequest(txHashes);
@@ -425,7 +453,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
425
453
 
426
454
  const txs = txBatches.flat();
427
455
  if (txs.length > 0) {
428
- await this.txPool.addTxs(txs);
456
+ await this.txPool.addPendingTxs(txs);
429
457
  }
430
458
 
431
459
  const txHashesStr = txHashes.map(tx => tx.toString()).join(', ');
@@ -435,79 +463,49 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
435
463
  return txs;
436
464
  }
437
465
 
438
- public getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
439
- return this.getTxs('pending', limit, after);
440
- }
441
-
442
- public getPendingTxCount(): Promise<number> {
443
- return this.txPool.getPendingTxCount();
444
- }
445
-
446
- public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
447
- for (const txHash of await this.txPool.getPendingTxHashes()) {
448
- const tx = await this.txPool.getTxByHash(txHash);
449
- if (tx) {
450
- yield tx;
451
- }
452
- }
453
- }
454
-
455
- /**
456
- * Returns all transactions in the transaction pool.
457
- * @param filter - The type of txs to return
458
- * @param limit - How many txs to return
459
- * @param after - If paginating, the last known tx hash. Will return txs after this hash
460
- * @returns An array of Txs.
461
- */
462
- public async getTxs(filter: 'all' | 'pending' | 'mined', limit?: number, after?: TxHash): Promise<Tx[]> {
466
+ public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
463
467
  if (limit !== undefined && limit <= 0) {
464
468
  throw new TypeError('limit must be greater than 0');
465
469
  }
466
470
 
467
- let txs: Tx[] | undefined = undefined;
468
- let txHashes: TxHash[];
469
-
470
- if (filter === 'all') {
471
- txs = await this.txPool.getAllTxs();
472
- txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
473
- } else if (filter === 'mined') {
474
- const minedTxHashes = await this.txPool.getMinedTxHashes();
475
- txHashes = minedTxHashes.map(([txHash]) => txHash);
476
- } else if (filter === 'pending') {
477
- txHashes = await this.txPool.getPendingTxHashes();
478
- } else {
479
- const _: never = filter;
480
- throw new Error(`Unknown filter ${filter}`);
481
- }
471
+ let txHashes = await this.txPool.getPendingTxHashes();
482
472
 
483
473
  let startIndex = 0;
484
- let endIndex: number | undefined = undefined;
485
-
486
474
  if (after) {
487
475
  startIndex = txHashes.findIndex(txHash => after.equals(txHash));
488
-
489
- // if we can't find the last tx in our set then return an empty array as pagination is no longer valid.
490
476
  if (startIndex === -1) {
491
477
  return [];
492
478
  }
493
-
494
- // increment by one because we don't want to return the same tx again
495
479
  startIndex++;
496
480
  }
497
481
 
498
- if (limit !== undefined) {
499
- endIndex = startIndex + limit;
500
- }
501
-
482
+ const endIndex = limit !== undefined ? startIndex + limit : undefined;
502
483
  txHashes = txHashes.slice(startIndex, endIndex);
503
- if (txs) {
504
- txs = txs.slice(startIndex, endIndex);
505
- } else {
506
- const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
507
- txs = maybeTxs.filter((tx): tx is Tx => !!tx);
484
+
485
+ const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
486
+ return maybeTxs.filter((tx): tx is Tx => !!tx);
487
+ }
488
+
489
+ public getPendingTxCount(): Promise<number> {
490
+ return this.txPool.getPendingTxCount();
491
+ }
492
+
493
+ public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
494
+ for (const txHash of await this.txPool.getPendingTxHashes()) {
495
+ const tx = await this.txPool.getTxByHash(txHash);
496
+ if (tx) {
497
+ yield tx;
498
+ }
508
499
  }
500
+ }
509
501
 
510
- return txs;
502
+ public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
503
+ for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
504
+ const tx = await this.txPool.getTxByHash(txHash);
505
+ if (tx) {
506
+ yield tx;
507
+ }
508
+ }
511
509
  }
512
510
 
513
511
  /**
@@ -585,25 +583,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
585
583
  }
586
584
 
587
585
  /**
588
- * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
589
- * @param tx - The tx to verify.
586
+ * Accepts a transaction, adds it to local tx pool and forwards it to other peers.
587
+ * @param tx - The tx to send.
590
588
  * @returns Empty promise.
591
589
  **/
592
590
  public async sendTx(tx: Tx): Promise<void> {
593
- const addedCount = await this.addTxsToPool([tx]);
594
- const txAddedSuccessfully = addedCount === 1;
595
- if (txAddedSuccessfully) {
591
+ this.#assertIsReady();
592
+ const result = await this.txPool.addPendingTxs([tx], { feeComparisonOnly: true });
593
+ if (result.accepted.length === 1) {
596
594
  await this.p2pService.propagate(tx);
595
+ return;
597
596
  }
598
- }
599
597
 
600
- /**
601
- * Adds transactions to the pool. Does not send to peers or validate the txs.
602
- * @param txs - The transactions.
603
- **/
604
- public async addTxsToPool(txs: Tx[]): Promise<number> {
605
- this.#assertIsReady();
606
- return await this.txPool.addTxs(txs);
598
+ const txHashStr = tx.getTxHash().toString();
599
+ const reason = result.errors?.get(txHashStr);
600
+ if (reason) {
601
+ this.log.warn(`Tx ${txHashStr} not added to pool: ${reason.message}`);
602
+ throw new TxPoolError(reason);
603
+ }
604
+
605
+ this.log.warn(
606
+ `Tx ${txHashStr} not propagated: accepted=${result.accepted.length} ignored=${result.ignored.length} rejected=${result.rejected.length}`,
607
+ );
607
608
  }
608
609
 
609
610
  /**
@@ -611,8 +612,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
611
612
  * @param txHash - Hash of the tx to query.
612
613
  * @returns Pending or mined depending on its status, or undefined if not found.
613
614
  */
614
- public getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
615
- return this.txPool.getTxStatus(txHash);
615
+ public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
616
+ const status = await this.txPool.getTxStatus(txHash);
617
+ return status === 'protected' ? 'pending' : status;
616
618
  }
617
619
 
618
620
  public getEnr(): ENR | undefined {
@@ -624,14 +626,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
624
626
  }
625
627
 
626
628
  /**
627
- * Deletes the 'txs' from the pool.
628
- * NOT used if we use sendTx as reconcileTxPool will handle this.
629
- * @param txHashes - Hashes of the transactions to delete.
630
- * @returns Empty promise.
629
+ * Handles failed transaction execution by removing txs from the pool.
630
+ * @param txHashes - Hashes of the transactions that failed execution.
631
631
  **/
632
- public async deleteTxs(txHashes: TxHash[]): Promise<void> {
632
+ public async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
633
633
  this.#assertIsReady();
634
- await this.txPool.deleteTxs(txHashes);
634
+ await this.txPool.handleFailedExecution(txHashes);
635
635
  }
636
636
 
637
637
  /**
@@ -647,7 +647,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
647
647
  * @returns Block number of latest L2 Block we've synced with.
648
648
  */
649
649
  public async getSyncedLatestBlockNum(): Promise<BlockNumber> {
650
- return (await this.synchedLatestBlockNumber.getAsync()) ?? BlockNumber(INITIAL_L2_BLOCK_NUM - 1);
650
+ const tips = await this.l2Tips.getL2Tips();
651
+ return tips.proposed.number;
651
652
  }
652
653
 
653
654
  /**
@@ -655,11 +656,13 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
655
656
  * @returns Block number of latest proven L2 Block we've synced with.
656
657
  */
657
658
  public async getSyncedProvenBlockNum(): Promise<BlockNumber> {
658
- return (await this.synchedProvenBlockNumber.getAsync()) ?? BlockNumber(INITIAL_L2_BLOCK_NUM - 1);
659
+ const tips = await this.l2Tips.getL2Tips();
660
+ return tips.proven.block.number;
659
661
  }
660
662
 
661
663
  public async getSyncedFinalizedBlockNum(): Promise<BlockNumber> {
662
- return (await this.synchedFinalizedBlockNumber.getAsync()) ?? BlockNumber(INITIAL_L2_BLOCK_NUM - 1);
664
+ const tips = await this.l2Tips.getL2Tips();
665
+ return tips.finalized.block.number;
663
666
  }
664
667
 
665
668
  /** Returns latest L2 slot for which we have seen an L2 block. */
@@ -688,14 +691,13 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
688
691
  }
689
692
 
690
693
  /**
691
- * Mark all txs from these blocks as mined.
694
+ * Handles mined blocks by marking the txs in them as mined.
692
695
  * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
693
696
  * @returns Empty promise.
694
697
  */
695
- private async markTxsAsMinedFromBlocks(blocks: L2BlockNew[]): Promise<void> {
698
+ private async handleMinedBlocks(blocks: L2Block[]): Promise<void> {
696
699
  for (const block of blocks) {
697
- const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
698
- await this.txPool.markAsMined(txHashes, block.header);
700
+ await this.txPool.handleMinedBlock(block);
699
701
  }
700
702
  }
701
703
 
@@ -704,34 +706,20 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
704
706
  * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
705
707
  * @returns Empty promise.
706
708
  */
707
- private async handleLatestL2Blocks(blocks: L2BlockNew[]): Promise<void> {
709
+ private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
708
710
  if (!blocks.length) {
709
- return Promise.resolve();
711
+ return;
710
712
  }
711
713
 
712
- await this.markTxsAsMinedFromBlocks(blocks);
713
- await this.txPool.clearNonEvictableTxs();
714
+ await this.handleMinedBlocks(blocks);
715
+ await this.maybeCallPrepareForSlot();
714
716
  await this.startCollectingMissingTxs(blocks);
715
-
716
717
  const lastBlock = blocks.at(-1)!;
717
-
718
- await Promise.all(
719
- blocks.map(async block =>
720
- this.setBlockHash({
721
- number: block.number,
722
- hash: await block.hash().then(h => h.toString()),
723
- }),
724
- ),
725
- );
726
-
727
- await this.synchedLatestBlockNumber.set(lastBlock.number);
728
718
  await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
729
- this.log.verbose(`Synched to latest block ${lastBlock.number}`);
730
- await this.startServiceIfSynched();
731
719
  }
732
720
 
733
721
  /** Request txs for unproven blocks so the prover node has more chances to get them. */
734
- private async startCollectingMissingTxs(blocks: L2BlockNew[]): Promise<void> {
722
+ private async startCollectingMissingTxs(blocks: L2Block[]): Promise<void> {
735
723
  try {
736
724
  // TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
737
725
  // be much lower than the actual one, and it does not update until the pending chain is
@@ -764,85 +752,64 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
764
752
  * @param blocks - A list of finalized L2 blocks.
765
753
  * @returns Empty promise.
766
754
  */
767
- private async handleFinalizedL2Blocks(blocks: L2BlockNew[]): Promise<void> {
755
+ private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
768
756
  if (!blocks.length) {
769
- return Promise.resolve();
757
+ return;
770
758
  }
771
- this.log.debug(`Handling finalized blocks ${blocks.length} up to ${blocks.at(-1)?.number}`);
772
-
773
- const lastBlockNum = blocks[blocks.length - 1].number;
774
- const lastBlockSlot = blocks[blocks.length - 1].header.getSlot();
775
-
776
- const txHashes = blocks.flatMap(block => block.body.txEffects.map(txEffect => txEffect.txHash));
777
- this.log.debug(`Deleting ${txHashes.length} txs from pool from finalized blocks up to ${lastBlockNum}`);
778
- await this.txPool.deleteTxs(txHashes, { permanently: true });
779
- await this.txPool.cleanupDeletedMinedTxs(lastBlockNum);
780
759
 
781
- await this.attestationPool.deleteAttestationsOlderThan(lastBlockSlot);
782
-
783
- await this.synchedFinalizedBlockNumber.set(lastBlockNum);
784
- this.log.debug(`Synched to finalized block ${lastBlockNum} at slot ${lastBlockSlot}`);
785
-
786
- await this.startServiceIfSynched();
760
+ // Finalization is monotonic, so we only need to call with the last block
761
+ const lastBlock = blocks.at(-1)!;
762
+ await this.txPool.handleFinalizedBlock(lastBlock.header);
763
+ await this.attestationPool.deleteOlderThan(lastBlock.header.getSlot());
787
764
  }
788
765
 
789
766
  /**
790
767
  * Updates the tx pool after a chain prune.
791
- * @param latestBlock - The block number the chain was pruned to.
768
+ * Detects epoch prunes (checkpoint number changed) and deletes all txs in that case.
769
+ * @param latestBlock - The block ID the chain was pruned to.
770
+ * @param newCheckpoint - The checkpoint ID after the prune.
792
771
  */
793
- private async handlePruneL2Blocks(latestBlock: BlockNumber): Promise<void> {
794
- const txsToDelete = new Map<string, TxHash>();
795
- const minedTxs = await this.txPool.getMinedTxHashes();
796
-
797
- // Find transactions that reference pruned blocks in their historical header
798
- for (const tx of await this.txPool.getAllTxs()) {
799
- // every tx that's been generated against a block that has now been pruned is no longer valid
800
- if (tx.data.constants.anchorBlockHeader.globalVariables.blockNumber > latestBlock) {
801
- const txHash = tx.getTxHash();
802
- txsToDelete.set(txHash.toString(), txHash);
803
- }
804
- }
805
-
806
- this.log.info(`Detected chain prune. Removing ${txsToDelete.size} txs built against pruned blocks.`, {
807
- newLatestBlock: latestBlock,
808
- previousLatestBlock: await this.getSyncedLatestBlockNum(),
809
- txsToDelete: Array.from(txsToDelete.keys()),
810
- });
772
+ private async handlePruneL2Blocks(latestBlock: L2BlockId, newCheckpoint: CheckpointId): Promise<void> {
773
+ const deleteAllTxs = this.config.txPoolDeleteTxsAfterReorg && (await this.isEpochPrune(newCheckpoint));
774
+ await this.txPool.handlePrunedBlocks(latestBlock, { deleteAllTxs });
775
+ }
811
776
 
812
- // delete invalid txs (both pending and mined)
813
- await this.txPool.deleteTxs(Array.from(txsToDelete.values()));
814
-
815
- // everything left in the mined set was built against a block on the proven chain so its still valid
816
- // move back to pending the txs that were reorged out of the chain, unless txPoolDeleteTxsAfterReorg is set,
817
- // in which case we clean them up to avoid potential reorg loops
818
- // NOTE: we can't move _all_ txs back to pending because the tx pool could keep hold of mined txs for longer
819
- // (see this.keepProvenTxsFor)
820
- const minedTxsFromReorg: TxHash[] = [];
821
- for (const [txHash, blockNumber] of minedTxs) {
822
- // We keep the txsToDelete out of this list as they have already been deleted above
823
- if (blockNumber > latestBlock && !txsToDelete.has(txHash.toString())) {
824
- minedTxsFromReorg.push(txHash);
825
- }
777
+ /**
778
+ * Returns true if the prune crossed a checkpoint boundary.
779
+ * If the old and new checkpoint numbers are the same, the prune is within a single checkpoint.
780
+ * If they differ, the prune spans across checkpoints (epoch prune).
781
+ */
782
+ private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
783
+ const tips = await this.l2Tips.getL2Tips();
784
+ const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
785
+ if (oldCheckpointNumber <= CheckpointNumber.ZERO) {
786
+ return false;
826
787
  }
788
+ const isEpochPrune = oldCheckpointNumber !== newCheckpoint.number;
789
+ this.log.info(
790
+ `Detected epoch prune: ${isEpochPrune}. Old checkpoint: ${oldCheckpointNumber}, new checkpoint: ${newCheckpoint.number}`,
791
+ );
792
+ return isEpochPrune;
793
+ }
827
794
 
828
- if (this.config.txPoolDeleteTxsAfterReorg) {
829
- this.log.info(`Deleting ${minedTxsFromReorg.length} mined txs from reorg`);
830
- await this.txPool.deleteTxs(minedTxsFromReorg);
831
- } else {
832
- await this.txPool.markMinedAsPending(minedTxsFromReorg, latestBlock);
795
+ /** Checks if the slot has changed and calls prepareForSlot if so. */
796
+ private async maybeCallPrepareForSlot(): Promise<void> {
797
+ const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
798
+ if (currentSlot <= this.lastSlotProcessed) {
799
+ return;
833
800
  }
834
-
835
- await this.synchedLatestBlockNumber.set(latestBlock);
836
- // no need to update block hashes, as they will be updated as new blocks are added
801
+ this.lastSlotProcessed = currentSlot;
802
+ await this.txPool.prepareForSlot(currentSlot);
837
803
  }
838
804
 
839
805
  private async startServiceIfSynched() {
840
806
  if (this.currentState !== P2PClientState.SYNCHING) {
841
807
  return;
842
808
  }
843
- const syncedFinalizedBlock = await this.getSyncedFinalizedBlockNum();
844
- const syncedProvenBlock = await this.getSyncedProvenBlockNum();
845
- const syncedLatestBlock = await this.getSyncedLatestBlockNum();
809
+ const tips = await this.l2Tips.getL2Tips();
810
+ const syncedFinalizedBlock = tips.finalized.block.number;
811
+ const syncedProvenBlock = tips.proven.block.number;
812
+ const syncedLatestBlock = tips.proposed.number;
846
813
 
847
814
  if (
848
815
  syncedLatestBlock >= this.latestBlockNumberAtStart &&
@@ -877,11 +844,23 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
877
844
  }
878
845
 
879
846
  /**
880
- * Marks transactions as non-evictable in the pool.
881
- * @param txHashes - Hashes of the transactions to mark as non-evictable.
847
+ * Protects existing transactions by hash for a given slot.
848
+ * Returns hashes of transactions that weren't found in the pool.
849
+ * @param txHashes - Hashes of the transactions to protect.
850
+ * @param blockHeader - The block header providing slot context.
851
+ * @returns Hashes of transactions not found in the pool.
852
+ */
853
+ public protectTxs(txHashes: TxHash[], blockHeader: BlockHeader): Promise<TxHash[]> {
854
+ return this.txPool.protectTxs(txHashes, blockHeader);
855
+ }
856
+
857
+ /**
858
+ * Prepares the pool for a new slot.
859
+ * Unprotects transactions from earlier slots and validates them.
860
+ * @param slotNumber - The slot number to prepare for
882
861
  */
883
- public markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void> {
884
- return this.txPool.markTxsAsNonEvictable(txHashes);
862
+ public async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
863
+ await this.txPool.prepareForSlot(slotNumber);
885
864
  }
886
865
 
887
866
  public handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage> {