@aztec/p2p 0.0.1-commit.9d2bcf6d → 0.0.1-commit.9d619b6c6

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 (493) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +12 -11
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +55 -16
  5. package/dest/client/interface.d.ts +54 -34
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +41 -52
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +179 -226
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +24 -11
  11. package/dest/config.d.ts +133 -92
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +109 -40
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +2 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +106 -88
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +448 -3
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  29. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  30. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/index.js +1 -2
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  35. package/dest/mem_pools/index.d.ts +3 -3
  36. package/dest/mem_pools/index.d.ts.map +1 -1
  37. package/dest/mem_pools/index.js +1 -1
  38. package/dest/mem_pools/instrumentation.d.ts +4 -2
  39. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  40. package/dest/mem_pools/instrumentation.js +16 -14
  41. package/dest/mem_pools/interface.d.ts +5 -5
  42. package/dest/mem_pools/interface.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  44. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  46. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  47. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  49. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  50. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
  73. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  85. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  86. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  88. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  89. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  91. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +218 -0
  92. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
  94. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  95. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  96. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  97. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  98. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +924 -0
  109. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  110. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  111. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  112. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -3
  113. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  114. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  115. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  116. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  117. package/dest/msg_validators/clock_tolerance.js +54 -3
  118. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  119. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  120. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  121. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  122. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  124. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  125. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  127. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  128. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  130. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  131. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  133. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  134. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  135. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  136. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  137. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  138. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  140. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  141. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  142. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  143. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  144. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  145. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  146. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  147. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  148. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  149. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  150. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  151. package/dest/msg_validators/tx_validator/factory.js +247 -60
  152. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  153. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  155. package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
  156. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  158. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  159. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  160. package/dest/msg_validators/tx_validator/index.js +2 -0
  161. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  162. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  163. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  164. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  165. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  167. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  168. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  170. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  171. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  172. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  173. package/dest/services/data_store.d.ts +1 -1
  174. package/dest/services/data_store.d.ts.map +1 -1
  175. package/dest/services/data_store.js +5 -5
  176. package/dest/services/dummy_service.d.ts +17 -6
  177. package/dest/services/dummy_service.d.ts.map +1 -1
  178. package/dest/services/dummy_service.js +16 -5
  179. package/dest/services/encoding.d.ts +7 -3
  180. package/dest/services/encoding.d.ts.map +1 -1
  181. package/dest/services/encoding.js +18 -11
  182. package/dest/services/gossipsub/index.d.ts +3 -0
  183. package/dest/services/gossipsub/index.d.ts.map +1 -0
  184. package/dest/services/gossipsub/index.js +2 -0
  185. package/dest/services/gossipsub/scoring.d.ts +21 -3
  186. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  187. package/dest/services/gossipsub/scoring.js +24 -7
  188. package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
  189. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  190. package/dest/services/gossipsub/topic_score_params.js +363 -0
  191. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  192. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  193. package/dest/services/libp2p/instrumentation.js +14 -0
  194. package/dest/services/libp2p/libp2p_service.d.ts +95 -51
  195. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  196. package/dest/services/libp2p/libp2p_service.js +566 -442
  197. package/dest/services/peer-manager/metrics.d.ts +3 -1
  198. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  199. package/dest/services/peer-manager/metrics.js +6 -0
  200. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  201. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  202. package/dest/services/peer-manager/peer_manager.js +39 -11
  203. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  204. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  205. package/dest/services/peer-manager/peer_scoring.js +57 -12
  206. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +14 -10
  207. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  208. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +89 -112
  209. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  210. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  211. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  212. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  213. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  214. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  215. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  216. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  217. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  218. package/dest/services/reqresp/config.d.ts +3 -3
  219. package/dest/services/reqresp/config.d.ts.map +1 -1
  220. package/dest/services/reqresp/interface.d.ts +23 -9
  221. package/dest/services/reqresp/interface.d.ts.map +1 -1
  222. package/dest/services/reqresp/interface.js +23 -10
  223. package/dest/services/reqresp/metrics.d.ts +1 -1
  224. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  225. package/dest/services/reqresp/metrics.js +0 -1
  226. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  227. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  228. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -11
  229. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +21 -10
  230. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  231. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +27 -11
  232. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  233. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  234. package/dest/services/reqresp/protocols/index.js +0 -1
  235. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  236. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  237. package/dest/services/reqresp/protocols/tx.js +21 -3
  238. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  239. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  240. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  241. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  242. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  243. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  244. package/dest/services/reqresp/reqresp.d.ts +4 -2
  245. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  246. package/dest/services/reqresp/reqresp.js +40 -15
  247. package/dest/services/service.d.ts +43 -4
  248. package/dest/services/service.d.ts.map +1 -1
  249. package/dest/services/tx_collection/config.d.ts +22 -4
  250. package/dest/services/tx_collection/config.d.ts.map +1 -1
  251. package/dest/services/tx_collection/config.js +49 -3
  252. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -8
  253. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  254. package/dest/services/tx_collection/fast_tx_collection.js +88 -88
  255. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  256. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  257. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  258. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  259. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  260. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  261. package/dest/services/tx_collection/index.d.ts +3 -2
  262. package/dest/services/tx_collection/index.d.ts.map +1 -1
  263. package/dest/services/tx_collection/index.js +1 -0
  264. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  265. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  266. package/dest/services/tx_collection/instrumentation.js +2 -1
  267. package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -15
  268. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  269. package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
  270. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  271. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  272. package/dest/services/tx_collection/request_tracker.js +84 -0
  273. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  274. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  275. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  276. package/dest/services/tx_collection/tx_collection.d.ts +23 -13
  277. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  278. package/dest/services/tx_collection/tx_collection.js +75 -3
  279. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  280. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  281. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  282. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  283. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  284. package/dest/services/tx_collection/tx_source.js +26 -7
  285. package/dest/services/tx_file_store/config.d.ts +1 -3
  286. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  287. package/dest/services/tx_file_store/config.js +0 -4
  288. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  289. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  290. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  291. package/dest/services/tx_provider.d.ts +4 -4
  292. package/dest/services/tx_provider.d.ts.map +1 -1
  293. package/dest/services/tx_provider.js +9 -8
  294. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  295. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  296. package/dest/test-helpers/make-test-p2p-clients.js +4 -2
  297. package/dest/test-helpers/mock-pubsub.d.ts +40 -6
  298. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  299. package/dest/test-helpers/mock-pubsub.js +139 -13
  300. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  301. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  302. package/dest/test-helpers/reqresp-nodes.js +8 -5
  303. package/dest/test-helpers/testbench-utils.d.ts +43 -38
  304. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  305. package/dest/test-helpers/testbench-utils.js +150 -61
  306. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  307. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  308. package/dest/testbench/p2p_client_testbench_worker.js +85 -28
  309. package/dest/testbench/worker_client_manager.d.ts +10 -1
  310. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  311. package/dest/testbench/worker_client_manager.js +55 -3
  312. package/dest/util.d.ts +3 -3
  313. package/dest/util.d.ts.map +1 -1
  314. package/package.json +14 -14
  315. package/src/client/factory.ts +110 -29
  316. package/src/client/interface.ts +65 -35
  317. package/src/client/p2p_client.ts +216 -272
  318. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +36 -15
  319. package/src/config.ts +172 -46
  320. package/src/errors/p2p-service.error.ts +11 -0
  321. package/src/errors/tx-pool.error.ts +12 -0
  322. package/src/index.ts +1 -1
  323. package/src/mem_pools/attestation_pool/attestation_pool.ts +501 -91
  324. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  325. package/src/mem_pools/attestation_pool/index.ts +9 -2
  326. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  327. package/src/mem_pools/index.ts +2 -2
  328. package/src/mem_pools/instrumentation.ts +17 -13
  329. package/src/mem_pools/interface.ts +4 -4
  330. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  331. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  332. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  333. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  334. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  335. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  336. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  337. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  338. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  339. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  340. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  341. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  342. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  343. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  344. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  345. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  346. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  347. package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
  348. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  349. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  350. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
  351. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
  352. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1107 -0
  353. package/src/msg_validators/attestation_validator/README.md +49 -0
  354. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  355. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +6 -3
  356. package/src/msg_validators/clock_tolerance.ts +72 -3
  357. package/src/msg_validators/proposal_validator/README.md +123 -0
  358. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  359. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  360. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  361. package/src/msg_validators/tx_validator/README.md +127 -0
  362. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  363. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  364. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  365. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  366. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  367. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  368. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  369. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  370. package/src/msg_validators/tx_validator/factory.ts +396 -78
  371. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  372. package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
  373. package/src/msg_validators/tx_validator/index.ts +2 -0
  374. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  375. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  376. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  377. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  378. package/src/services/data_store.ts +5 -13
  379. package/src/services/dummy_service.ts +25 -7
  380. package/src/services/encoding.ts +18 -10
  381. package/src/services/gossipsub/README.md +641 -0
  382. package/src/services/gossipsub/index.ts +2 -0
  383. package/src/services/gossipsub/scoring.ts +29 -5
  384. package/src/services/gossipsub/topic_score_params.ts +519 -0
  385. package/src/services/libp2p/instrumentation.ts +14 -0
  386. package/src/services/libp2p/libp2p_service.ts +593 -477
  387. package/src/services/peer-manager/metrics.ts +7 -0
  388. package/src/services/peer-manager/peer_manager.ts +45 -11
  389. package/src/services/peer-manager/peer_scoring.ts +52 -5
  390. package/src/services/reqresp/README.md +229 -0
  391. package/src/services/reqresp/batch-tx-requester/README.md +53 -14
  392. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +89 -122
  393. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  394. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  395. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  396. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  397. package/src/services/reqresp/config.ts +2 -2
  398. package/src/services/reqresp/interface.ts +45 -10
  399. package/src/services/reqresp/metrics.ts +0 -1
  400. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +23 -14
  401. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +38 -15
  402. package/src/services/reqresp/protocols/index.ts +0 -1
  403. package/src/services/reqresp/protocols/tx.ts +23 -3
  404. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  405. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  406. package/src/services/reqresp/reqresp.ts +53 -16
  407. package/src/services/service.ts +57 -3
  408. package/src/services/tx_collection/config.ts +74 -6
  409. package/src/services/tx_collection/fast_tx_collection.ts +94 -97
  410. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  411. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  412. package/src/services/tx_collection/index.ts +2 -1
  413. package/src/services/tx_collection/instrumentation.ts +7 -1
  414. package/src/services/tx_collection/proposal_tx_collector.ts +21 -27
  415. package/src/services/tx_collection/request_tracker.ts +127 -0
  416. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  417. package/src/services/tx_collection/tx_collection.ts +114 -19
  418. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  419. package/src/services/tx_collection/tx_source.ts +28 -8
  420. package/src/services/tx_file_store/config.ts +0 -6
  421. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  422. package/src/services/tx_provider.ts +10 -9
  423. package/src/test-helpers/make-test-p2p-clients.ts +6 -6
  424. package/src/test-helpers/mock-pubsub.ts +180 -14
  425. package/src/test-helpers/reqresp-nodes.ts +9 -9
  426. package/src/test-helpers/testbench-utils.ts +157 -74
  427. package/src/testbench/p2p_client_testbench_worker.ts +94 -31
  428. package/src/testbench/worker_client_manager.ts +68 -6
  429. package/src/util.ts +8 -2
  430. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  431. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  432. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  433. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  434. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  435. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  436. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  437. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  438. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  439. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  440. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  441. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  442. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  443. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  444. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  445. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  446. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  447. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  448. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  449. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  450. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  451. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  452. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  453. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  454. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  455. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  456. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  457. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  458. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  459. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  460. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  461. package/dest/mem_pools/tx_pool/index.js +0 -2
  462. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  463. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  464. package/dest/mem_pools/tx_pool/priority.js +0 -15
  465. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  466. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  467. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  468. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  469. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  470. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  471. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  472. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  473. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  474. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  475. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  476. package/dest/services/reqresp/protocols/block.js +0 -32
  477. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  478. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
  479. package/src/mem_pools/tx_pool/README.md +0 -270
  480. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  481. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  482. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  483. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  484. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  485. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  486. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  487. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  488. package/src/mem_pools/tx_pool/index.ts +0 -2
  489. package/src/mem_pools/tx_pool/priority.ts +0 -20
  490. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  491. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  492. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  493. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,6 +1,7 @@
1
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
- import { type BlockNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
3
  import type { Logger } from '@aztec/foundation/log';
4
+ import type { L2Block, L2BlockId } from '@aztec/stdlib/block';
4
5
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
5
6
  import type {
6
7
  BlockProposal,
@@ -12,15 +13,17 @@ import { type BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
12
13
 
13
14
  import EventEmitter from 'events';
14
15
 
15
- import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
16
- import type { TxPool } from '../mem_pools/tx_pool/index.js';
16
+ import type { TryAddResult } from '../mem_pools/attestation_pool/attestation_pool.js';
17
+ import type { AddTxsResult, TxPoolV2, TxPoolV2Config } from '../mem_pools/tx_pool_v2/interfaces.js';
18
+ import type { TxState } from '../mem_pools/tx_pool_v2/tx_metadata.js';
17
19
  import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
18
20
 
19
21
  /**
20
22
  * In-memory TxPool implementation for testing.
21
23
  * Provides basic tx storage without persistence.
24
+ * Implements TxPoolV2 interface with stub implementations for testing.
22
25
  */
23
- export class InMemoryTxPool extends EventEmitter implements TxPool {
26
+ export class InMemoryTxPool extends EventEmitter implements TxPoolV2 {
24
27
  private txsByHash = new Map<string, Tx>();
25
28
  private logger: Logger | null = null;
26
29
 
@@ -54,133 +57,189 @@ export class InMemoryTxPool extends EventEmitter implements TxPool {
54
57
  this.removeAllListeners();
55
58
  }
56
59
 
57
- addTxs(txs: Tx[], opts?: { source?: string }): Promise<number> {
60
+ // === Core Operations (TxPoolV2) ===
61
+
62
+ addPendingTxs(txs: Tx[], opts?: { source?: string; feeComparisonOnly?: boolean }): Promise<AddTxsResult> {
63
+ const accepted: TxHash[] = [];
58
64
  const newTxs: Tx[] = [];
59
- let added = 0;
60
65
  for (const tx of txs) {
61
66
  const key = tx.getTxHash().toString();
62
67
  if (!this.txsByHash.has(key)) {
63
68
  newTxs.push(tx);
64
- added += 1;
69
+ accepted.push(tx.getTxHash());
65
70
  }
66
71
  this.txsByHash.set(key, tx);
67
72
  }
68
73
  if (newTxs.length > 0) {
69
74
  this.emit('txs-added', { txs: newTxs, source: opts?.source });
70
75
  }
71
- return Promise.resolve(added);
76
+ return Promise.resolve({ accepted, ignored: [], rejected: [] });
72
77
  }
73
78
 
74
- getTxByHash(hash: TxHash): Promise<Tx | undefined> {
75
- return Promise.resolve(this.txsByHash.get(hash.toString()));
79
+ canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> {
80
+ const key = tx.getTxHash().toString();
81
+ if (this.txsByHash.has(key)) {
82
+ return Promise.resolve('ignored');
83
+ }
84
+ return Promise.resolve('accepted');
76
85
  }
77
86
 
78
- getTxsByHash(hashes: TxHash[]): Promise<(Tx | undefined)[]> {
79
- const result = hashes.map(h => this.txsByHash.get(h.toString()));
80
- const found = result.filter(tx => tx !== undefined).length;
81
- this.logger?.debug(`[TxPool] getTxsByHash: requested ${hashes.length}, found ${found}`);
82
- return Promise.resolve(result);
87
+ addProtectedTxs(txs: Tx[], _block: BlockHeader, opts?: { source?: string }): Promise<void> {
88
+ for (const tx of txs) {
89
+ const key = tx.getTxHash().toString();
90
+ this.txsByHash.set(key, tx);
91
+ }
92
+ if (txs.length > 0) {
93
+ this.emit('txs-added', { txs, source: opts?.source });
94
+ }
95
+ return Promise.resolve();
83
96
  }
84
97
 
85
- hasTxs(hashes: TxHash[]): Promise<boolean[]> {
86
- return Promise.resolve(hashes.map(h => this.txsByHash.has(h.toString())));
98
+ protectTxs(txHashes: TxHash[], _block: BlockHeader): Promise<TxHash[]> {
99
+ const notFound: TxHash[] = [];
100
+ for (const txHash of txHashes) {
101
+ if (!this.txsByHash.has(txHash.toString())) {
102
+ notFound.push(txHash);
103
+ }
104
+ }
105
+ return Promise.resolve(notFound);
87
106
  }
88
107
 
89
- hasTx(hash: TxHash): Promise<boolean> {
90
- return Promise.resolve(this.txsByHash.has(hash.toString()));
108
+ addMinedTxs(txs: Tx[], _block: BlockHeader, _opts?: { source?: string }): Promise<void> {
109
+ for (const tx of txs) {
110
+ const key = tx.getTxHash().toString();
111
+ this.txsByHash.set(key, tx);
112
+ }
113
+ return Promise.resolve();
91
114
  }
92
115
 
93
- getArchivedTxByHash(_hash: TxHash): Promise<Tx | undefined> {
94
- return Promise.resolve(undefined);
116
+ // === State Transition Handlers (TxPoolV2) ===
117
+
118
+ handleMinedBlock(_block: L2Block): Promise<void> {
119
+ return Promise.resolve();
95
120
  }
96
121
 
97
- async markAsMined(_txHashes: TxHash[], _blockHeader: BlockHeader): Promise<void> {}
122
+ prepareForSlot(_slotNumber: SlotNumber): Promise<void> {
123
+ return Promise.resolve();
124
+ }
98
125
 
99
- async markMinedAsPending(_txHashes: TxHash[], _latestBlock: BlockNumber): Promise<void> {}
126
+ handlePrunedBlocks(_latestBlock: L2BlockId, _options?: { deleteAllTxs?: boolean }): Promise<void> {
127
+ return Promise.resolve();
128
+ }
100
129
 
101
- deleteTxs(txHashes: TxHash[], _opts?: { permanently?: boolean }): Promise<void> {
130
+ handleFailedExecution(txHashes: TxHash[]): Promise<void> {
102
131
  for (const txHash of txHashes) {
103
132
  this.txsByHash.delete(txHash.toString());
104
133
  }
105
134
  return Promise.resolve();
106
135
  }
107
136
 
108
- getAllTxs(): Promise<Tx[]> {
109
- return Promise.resolve([...this.txsByHash.values()]);
137
+ handleFinalizedBlock(_block: BlockHeader): Promise<void> {
138
+ return Promise.resolve();
110
139
  }
111
140
 
112
- getAllTxHashes(): Promise<TxHash[]> {
113
- return Promise.resolve([...this.txsByHash.keys()].map(key => TxHash.fromString(key)));
141
+ // === Query Operations (TxPoolV2) ===
142
+
143
+ getTxByHash(hash: TxHash): Promise<Tx | undefined> {
144
+ return Promise.resolve(this.txsByHash.get(hash.toString()));
145
+ }
146
+
147
+ getTxsByHash(hashes: TxHash[]): Promise<(Tx | undefined)[]> {
148
+ const result = hashes.map(h => this.txsByHash.get(h.toString()));
149
+ const found = result.filter(tx => tx !== undefined).length;
150
+ this.logger?.debug(`[TxPool] getTxsByHash: requested ${hashes.length}, found ${found}`);
151
+ return Promise.resolve(result);
152
+ }
153
+
154
+ hasTxs(hashes: TxHash[]): Promise<boolean[]> {
155
+ return Promise.resolve(hashes.map(h => this.txsByHash.has(h.toString())));
156
+ }
157
+
158
+ getArchivedTxByHash(_hash: TxHash): Promise<Tx | undefined> {
159
+ return Promise.resolve(undefined);
114
160
  }
115
161
 
116
162
  getPendingTxHashes(): Promise<TxHash[]> {
117
163
  return Promise.resolve([...this.txsByHash.keys()].map(key => TxHash.fromString(key)));
118
164
  }
119
165
 
166
+ getEligiblePendingTxHashes(): Promise<TxHash[]> {
167
+ return this.getPendingTxHashes();
168
+ }
169
+
120
170
  getPendingTxCount(): Promise<number> {
121
171
  return Promise.resolve(this.txsByHash.size);
122
172
  }
123
173
 
124
- getMinedTxHashes(): Promise<[tx: TxHash, blockNumber: BlockNumber][]> {
174
+ getMinedTxHashes(): Promise<[TxHash, L2BlockId][]> {
125
175
  return Promise.resolve([]);
126
176
  }
127
177
 
128
- getTxStatus(hash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
129
- return Promise.resolve(this.txsByHash.has(hash.toString()) ? 'pending' : undefined);
178
+ getMinedTxCount(): Promise<number> {
179
+ return Promise.resolve(0);
130
180
  }
131
181
 
132
- updateConfig(_config: { maxPendingTxCount?: number; archivedTxLimit?: number }): void {}
182
+ getTxStatus(hash: TxHash): Promise<TxState | 'deleted' | undefined> {
183
+ return Promise.resolve(this.txsByHash.has(hash.toString()) ? 'pending' : undefined);
184
+ }
133
185
 
134
186
  isEmpty(): Promise<boolean> {
135
187
  return Promise.resolve(this.txsByHash.size === 0);
136
188
  }
137
189
 
138
- async markTxsAsNonEvictable(_txHashes: TxHash[]): Promise<void> {}
190
+ getLowestPriorityPending(_limit: number): Promise<TxHash[]> {
191
+ return Promise.resolve([]);
192
+ }
139
193
 
140
- async clearNonEvictableTxs(): Promise<void> {}
194
+ // === Configuration (TxPoolV2) ===
141
195
 
142
- cleanupDeletedMinedTxs(_blockNumber: BlockNumber): Promise<number> {
143
- return Promise.resolve(0);
196
+ updateConfig(_config: Partial<TxPoolV2Config>): Promise<void> {
197
+ return Promise.resolve();
198
+ }
199
+
200
+ // === Lifecycle (TxPoolV2) ===
201
+
202
+ start(): Promise<void> {
203
+ return Promise.resolve();
204
+ }
205
+
206
+ stop(): Promise<void> {
207
+ return Promise.resolve();
144
208
  }
145
209
  }
146
210
 
147
211
  /**
148
- * In-memory AttestationPool implementation for testing.
212
+ * In-memory AttestationPool mock for testing/benchmarking.
213
+ * Provides minimal implementation without persistence.
149
214
  */
150
- export class InMemoryAttestationPool implements AttestationPool {
215
+ export class InMemoryAttestationPool {
151
216
  private proposals = new Map<string, BlockProposal>();
152
217
 
153
- addBlockProposal(blockProposal: BlockProposal): Promise<void> {
154
- this.proposals.set(blockProposal.archive.toString(), blockProposal);
155
- return Promise.resolve();
218
+ tryAddBlockProposal(blockProposal: BlockProposal): Promise<TryAddResult> {
219
+ const id = blockProposal.archive.toString();
220
+ const alreadyExists = this.proposals.has(id);
221
+ if (alreadyExists) {
222
+ return Promise.resolve({ added: false, alreadyExists: true, count: 1 });
223
+ }
224
+ this.proposals.set(id, blockProposal);
225
+ return Promise.resolve({ added: true, alreadyExists: false, count: 1 });
156
226
  }
157
227
 
158
228
  getBlockProposal(id: string): Promise<BlockProposal | undefined> {
159
229
  return Promise.resolve(this.proposals.get(id));
160
230
  }
161
231
 
162
- hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean> {
163
- const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
164
- return Promise.resolve(this.proposals.has(id));
165
- }
166
-
167
- canAddProposal(_block: BlockProposal): Promise<boolean> {
168
- return Promise.resolve(true);
232
+ tryAddCheckpointProposal(_proposal: CheckpointProposal): Promise<TryAddResult> {
233
+ return Promise.resolve({ added: true, alreadyExists: false, count: 1 });
169
234
  }
170
235
 
171
- async addCheckpointProposal(_proposal: CheckpointProposal): Promise<void> {}
172
-
173
236
  getCheckpointProposal(_id: string): Promise<CheckpointProposalCore | undefined> {
174
237
  return Promise.resolve(undefined);
175
238
  }
176
239
 
177
- hasCheckpointProposal(_idOrProposal: string | CheckpointProposal): Promise<boolean> {
178
- return Promise.resolve(false);
179
- }
180
-
181
- async addCheckpointAttestations(_attestations: CheckpointAttestation[]): Promise<void> {}
240
+ async addOwnCheckpointAttestations(_attestations: CheckpointAttestation[]): Promise<void> {}
182
241
 
183
- async deleteCheckpointAttestationsOlderThan(_slot: SlotNumber): Promise<void> {}
242
+ async deleteOlderThan(_slot: SlotNumber): Promise<void> {}
184
243
 
185
244
  getCheckpointAttestationsForSlot(_slot: SlotNumber): Promise<CheckpointAttestation[]> {
186
245
  return Promise.resolve([]);
@@ -193,23 +252,11 @@ export class InMemoryAttestationPool implements AttestationPool {
193
252
  return Promise.resolve([]);
194
253
  }
195
254
 
196
- hasCheckpointAttestation(_attestation: CheckpointAttestation): Promise<boolean> {
197
- return Promise.resolve(false);
198
- }
199
-
200
- canAddCheckpointProposal(_proposal: CheckpointProposal): Promise<boolean> {
201
- return Promise.resolve(true);
255
+ tryAddCheckpointAttestation(_attestation: CheckpointAttestation): Promise<TryAddResult> {
256
+ return Promise.resolve({ added: true, alreadyExists: false, count: 1 });
202
257
  }
203
258
 
204
- canAddCheckpointAttestation(_attestation: CheckpointAttestation, _committeeSize: number): Promise<boolean> {
205
- return Promise.resolve(true);
206
- }
207
-
208
- hasReachedCheckpointProposalCap(_slot: SlotNumber): Promise<boolean> {
209
- return Promise.resolve(false);
210
- }
211
-
212
- hasReachedCheckpointAttestationCap(_slot: SlotNumber, _proposalId: string, _committeeSize: number): Promise<boolean> {
259
+ hasBlockProposalsForSlot(_slot: SlotNumber): Promise<boolean> {
213
260
  return Promise.resolve(false);
214
261
  }
215
262
 
@@ -226,18 +273,54 @@ export class InMemoryAttestationPool implements AttestationPool {
226
273
  * Creates a mock EpochCache for testing.
227
274
  */
228
275
  export function createMockEpochCache(): EpochCacheInterface {
229
- return {
276
+ const cache: EpochCacheInterface = {
230
277
  getCommittee: () => Promise.resolve({ committee: [], seed: 1n, epoch: EpochNumber.ZERO, isEscapeHatchOpen: false }),
231
278
  getProposerIndexEncoding: () => '0x' as `0x${string}`,
232
- getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, nowMs: 0n }),
279
+ getSlotNow: () => SlotNumber.ZERO,
280
+ getTargetSlot: () => SlotNumber.ZERO,
281
+ getEpochNow: () => EpochNumber.ZERO,
282
+ getTargetEpoch: () => EpochNumber.ZERO,
283
+ getEpochAndSlotNow: () => ({
284
+ epoch: EpochNumber.ZERO,
285
+ slot: SlotNumber.ZERO,
286
+ ts: 0n,
287
+ nowMs: 0n,
288
+ }),
289
+ isProposerPipeliningEnabled: () => false,
290
+ pipeliningOffset: () => 0,
233
291
  computeProposerIndex: () => 0n,
234
292
  getCurrentAndNextSlot: () => ({ currentSlot: SlotNumber.ZERO, nextSlot: SlotNumber.ZERO }),
293
+ getTargetAndNextSlot: () => ({ targetSlot: SlotNumber.ZERO, nextSlot: SlotNumber.ZERO }),
235
294
  getProposerAttesterAddressInSlot: () => Promise.resolve(undefined),
236
- getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
295
+ getEpochAndSlotInNextL1Slot: () => ({
296
+ epoch: EpochNumber.ZERO,
297
+ slot: SlotNumber.ZERO,
298
+ ts: 0n,
299
+ nowSeconds: 0n,
300
+ }),
301
+ getTargetEpochAndSlotInNextL1Slot: () => ({
302
+ epoch: EpochNumber.ZERO,
303
+ slot: SlotNumber.ZERO,
304
+ ts: 0n,
305
+ nowSeconds: 0n,
306
+ }),
237
307
  isInCommittee: () => Promise.resolve(false),
238
308
  getRegisteredValidators: () => Promise.resolve([]),
239
309
  filterInCommittee: () => Promise.resolve([]),
310
+ isEscapeHatchOpen: () => Promise.resolve(false),
311
+ isEscapeHatchOpenAtSlot: () => Promise.resolve(false),
312
+ getL1Constants: () => ({
313
+ l1StartBlock: 0n,
314
+ l1GenesisTime: 0n,
315
+ epochDuration: 1,
316
+ slotDuration: 1,
317
+ ethereumSlotDuration: 1,
318
+ proofSubmissionEpochs: 1,
319
+ targetCommitteeSize: 48,
320
+ rollupManaLimit: Number.MAX_SAFE_INTEGER,
321
+ }),
240
322
  };
323
+ return cache;
241
324
  }
242
325
 
243
326
  /**
@@ -12,14 +12,15 @@ import { Fr } from '@aztec/foundation/curves/bn254';
12
12
  import { type Logger, createLogger } from '@aztec/foundation/log';
13
13
  import { sleep } from '@aztec/foundation/sleep';
14
14
  import { DateProvider, Timer } from '@aztec/foundation/timer';
15
- import type { DataStoreConfig } from '@aztec/kv-store/config';
16
15
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
17
16
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
18
17
  import { protocolContractsHash } from '@aztec/protocol-contracts';
19
18
  import type { L2BlockSource } from '@aztec/stdlib/block';
20
19
  import type { ContractDataSource } from '@aztec/stdlib/contract';
20
+ import { GasFees } from '@aztec/stdlib/gas';
21
21
  import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
22
- import { type BlockProposal, P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
22
+ import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
23
+ import { type BlockProposal, P2PMessage } from '@aztec/stdlib/p2p';
23
24
  import { ChonkProof } from '@aztec/stdlib/proofs';
24
25
  import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing';
25
26
  import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx';
@@ -29,22 +30,19 @@ import type { Message, PeerId } from '@libp2p/interface';
29
30
  import { TopicValidatorResult } from '@libp2p/interface';
30
31
  import { peerIdFromString } from '@libp2p/peer-id';
31
32
 
32
- import type { P2PClient } from '../client/p2p_client.js';
33
+ import type { P2PClient } from '../client/index.js';
33
34
  import type { P2PConfig } from '../config.js';
34
35
  import { createP2PClient } from '../index.js';
35
- import type { MemPools } from '../mem_pools/interface.js';
36
- import { LibP2PService } from '../services/libp2p/libp2p_service.js';
36
+ import type { MemPools } from '../mem_pools/index.js';
37
+ import { BatchTxRequesterCollector, LibP2PService, SendBatchRequestCollector } from '../services/index.js';
37
38
  import type { PeerManager } from '../services/peer-manager/peer_manager.js';
38
39
  import type { BatchTxRequesterLibP2PService } from '../services/reqresp/batch-tx-requester/interface.js';
39
40
  import type { IBatchRequestTxValidator } from '../services/reqresp/batch-tx-requester/tx_validator.js';
40
41
  import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
41
42
  import type { ReqResp } from '../services/reqresp/reqresp.js';
42
43
  import type { PeerDiscoveryService } from '../services/service.js';
43
- import {
44
- BatchTxRequesterCollector,
45
- SendBatchRequestCollector,
46
- } from '../services/tx_collection/proposal_tx_collector.js';
47
- import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
44
+ import { RequestTracker } from '../services/tx_collection/request_tracker.js';
45
+ import { AlwaysTrueCircuitVerifier } from '../test-helpers/index.js';
48
46
  import {
49
47
  BENCHMARK_CONSTANTS,
50
48
  type CollectorType,
@@ -55,7 +53,7 @@ import {
55
53
  createMockEpochCache,
56
54
  createMockWorldStateSynchronizer,
57
55
  filterTxsByDistribution,
58
- } from '../test-helpers/testbench-utils.js';
56
+ } from '../test-helpers/index.js';
59
57
  import type { PubSubLibp2p } from '../util.js';
60
58
 
61
59
  export type { DistributionPattern, CollectorType } from '../test-helpers/testbench-utils.js';
@@ -89,12 +87,11 @@ export interface BenchReadyMessage {
89
87
  }
90
88
  const txCache = new Map<number, Tx[]>();
91
89
 
92
- class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends LibP2PService<T> {
90
+ class TestLibP2PService extends LibP2PService {
93
91
  private disableTxValidation: boolean;
94
92
  private gossipMessageCount = 0;
95
93
 
96
94
  constructor(
97
- clientType: T,
98
95
  config: P2PConfig,
99
96
  node: PubSubLibp2p,
100
97
  peerDiscoveryService: PeerDiscoveryService,
@@ -110,7 +107,6 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
110
107
  disableTxValidation = true,
111
108
  ) {
112
109
  super(
113
- clientType,
114
110
  config,
115
111
  node,
116
112
  peerDiscoveryService,
@@ -121,6 +117,7 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
121
117
  epochCache,
122
118
  proofVerifier,
123
119
  worldStateSynchronizer,
120
+ { getCurrentMinFees: () => Promise.resolve(GasFees.empty()) },
124
121
  telemetry,
125
122
  logger,
126
123
  );
@@ -144,7 +141,7 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
144
141
  const txHash = tx.getTxHash();
145
142
  const txHashString = txHash.toString();
146
143
  this.logger.verbose(`Received tx ${txHashString} from external peer ${source.toString()}.`);
147
- await this.mempools.txPool.addTxs([tx]);
144
+ await this.mempools.txPool.addPendingTxs([tx]);
148
145
  } else {
149
146
  await super.handleGossipedTx(payload, msgId, source);
150
147
  }
@@ -166,7 +163,7 @@ async function generateDeterministicTxs(txCount: number, seed: number, config: P
166
163
  return cached.slice(0, txCount);
167
164
  }
168
165
 
169
- const includeByTimestampBase = BigInt(seed);
166
+ const expirationTimestampBase = BigInt(seed);
170
167
  for (let i = cached.length; i < txCount; i++) {
171
168
  const txSeed = seed * 10000 + i;
172
169
  const tx = await mockTx(txSeed, {
@@ -182,7 +179,7 @@ async function generateDeterministicTxs(txCount: number, seed: number, config: P
182
179
  hasPublicTeardownCallRequest: false,
183
180
  publicCalldataSize: 0,
184
181
  });
185
- tx.data.includeByTimestamp = includeByTimestampBase + BigInt(i);
182
+ tx.data.expirationTimestamp = expirationTimestampBase + BigInt(i);
186
183
  await tx.recomputeHash();
187
184
  cached.push(tx);
188
185
  }
@@ -209,6 +206,25 @@ function installUnlimitedRateLimits(client: P2PClient): void {
209
206
  rateLimiter.allow = () => RateLimitStatus.Allowed;
210
207
  }
211
208
 
209
+ /** Resets peer scores to prevent cross-case contamination in benchmarks. */
210
+ function resetPeerScores(client: P2PClient): void {
211
+ const peerManager = (client as any).p2pService.peerManager;
212
+ const peerScoring = peerManager?.peerScoring;
213
+ if (peerScoring?.resetAllScores) {
214
+ peerScoring.resetAllScores();
215
+ }
216
+ }
217
+
218
+ /** Returns the number of connected peers for connectivity checks. */
219
+ function getConnectedPeerCount(client: P2PClient): number {
220
+ const p2pService = (client as any).p2pService;
221
+ const connectionSampler = p2pService?.reqresp?.getConnectionSampler?.();
222
+ if (connectionSampler?.getPeerListSortedByConnectionCountAsc) {
223
+ return connectionSampler.getPeerListSortedByConnectionCountAsc().length;
224
+ }
225
+ return 0;
226
+ }
227
+
212
228
  async function runAggregatorBenchmark(
213
229
  client: P2PClient,
214
230
  blockProposal: BlockProposal,
@@ -277,7 +293,11 @@ async function runAggregatorBenchmark(
277
293
  new DateProvider(),
278
294
  noopTxValidator,
279
295
  );
280
- const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
296
+ const fetchedTxs = await collector.collectTxs(
297
+ RequestTracker.create(txHashes, new Date(Date.now() + timeoutMs)),
298
+ blockProposal,
299
+ pinnedPeer,
300
+ );
281
301
  const durationMs = timer.ms();
282
302
  return {
283
303
  type: 'BENCH_RESULT',
@@ -292,7 +312,11 @@ async function runAggregatorBenchmark(
292
312
  BENCHMARK_CONSTANTS.FIXED_MAX_PEERS,
293
313
  BENCHMARK_CONSTANTS.FIXED_MAX_RETRY_ATTEMPTS,
294
314
  );
295
- const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
315
+ const fetchedTxs = await collector.collectTxs(
316
+ RequestTracker.create(txHashes, new Date(Date.now() + timeoutMs)),
317
+ blockProposal,
318
+ pinnedPeer,
319
+ );
296
320
  const durationMs = timer.ms();
297
321
  return {
298
322
  type: 'BENCH_RESULT',
@@ -318,6 +342,37 @@ let workerConfig: P2PConfig | null = null;
318
342
  let workerLogger: Logger | null = null;
319
343
  let kvStore: Awaited<ReturnType<typeof openTmpStore>> | null = null;
320
344
 
345
+ async function stopWorker() {
346
+ try {
347
+ if (workerClient) {
348
+ await workerClient.stop();
349
+ workerClient = null;
350
+ }
351
+ } catch (e) {
352
+ workerLogger?.error('Error stopping worker client', e);
353
+ }
354
+ try {
355
+ if (kvStore?.close) {
356
+ await kvStore.close();
357
+ kvStore = null;
358
+ }
359
+ } catch (e) {
360
+ workerLogger?.error('Error closing kv store', e);
361
+ }
362
+ }
363
+
364
+ function gracefulExit(code: number = 0) {
365
+ try {
366
+ if (process.connected) {
367
+ process.disconnect();
368
+ }
369
+ } catch {
370
+ // IPC channel already closed
371
+ }
372
+ // Safety fallback if lingering handles prevent the event loop from draining
373
+ setTimeout(() => process.exit(code), 5000).unref();
374
+ }
375
+
321
376
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
322
377
  process.on('message', async msg => {
323
378
  const {
@@ -335,6 +390,7 @@ process.on('message', async msg => {
335
390
  const config: P2PConfig = {
336
391
  ...rawConfig,
337
392
  peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
393
+ priceBumpPercentage: 10n,
338
394
  } as P2PConfig;
339
395
 
340
396
  workerConfig = config;
@@ -358,12 +414,12 @@ process.on('message', async msg => {
358
414
  };
359
415
 
360
416
  const client = await createP2PClient(
361
- P2PClientType.Full,
362
417
  config as P2PConfig & DataStoreConfig,
363
418
  l2BlockSource,
364
419
  proofVerifier as ClientProtocolCircuitVerifier,
365
420
  worldState,
366
421
  epochCache,
422
+ { getCurrentMinFees: () => Promise.resolve(GasFees.empty()) },
367
423
  'test-p2p-bench-worker',
368
424
  undefined,
369
425
  telemetry as TelemetryClient,
@@ -371,7 +427,6 @@ process.on('message', async msg => {
371
427
  );
372
428
 
373
429
  const testService = new TestLibP2PService(
374
- P2PClientType.Full,
375
430
  config,
376
431
  (client as any).p2pService.node,
377
432
  (client as any).p2pService.peerDiscoveryService,
@@ -408,13 +463,8 @@ process.on('message', async msg => {
408
463
  const cmd = msg as any;
409
464
  switch (cmd.type) {
410
465
  case 'STOP':
411
- if (workerClient) {
412
- await workerClient.stop();
413
- }
414
- if (kvStore?.close) {
415
- await kvStore.close();
416
- }
417
- process.exit(0);
466
+ await stopWorker();
467
+ gracefulExit(0);
418
468
  break;
419
469
 
420
470
  case 'SEND_TX':
@@ -424,6 +474,13 @@ process.on('message', async msg => {
424
474
  }
425
475
  break;
426
476
 
477
+ case 'GET_PEER_COUNT':
478
+ process.send!({
479
+ type: 'PEER_COUNT',
480
+ count: workerClient ? getConnectedPeerCount(workerClient) : 0,
481
+ });
482
+ break;
483
+
427
484
  case 'BENCH_REQRESP': {
428
485
  const benchCmd = cmd as BenchReqRespCommand;
429
486
  if (!workerClient || !workerTxPool || !workerAttestationPool || !workerConfig || !workerLogger) {
@@ -440,6 +497,7 @@ process.on('message', async msg => {
440
497
  // Reset state before each benchmark run to avoid cross-run contamination
441
498
  workerTxPool.resetState();
442
499
  workerAttestationPool.resetState();
500
+ resetPeerScores(workerClient);
443
501
 
444
502
  installUnlimitedRateLimits(workerClient);
445
503
 
@@ -447,7 +505,7 @@ process.on('message', async msg => {
447
505
  const txHashes = allTxs.map(tx => tx.getTxHash());
448
506
  const blockProposal = await createBlockProposal(benchCmd.blockNumber, txHashes, benchCmd.seed);
449
507
 
450
- await workerAttestationPool.addBlockProposal(blockProposal);
508
+ await workerAttestationPool.tryAddBlockProposal(blockProposal);
451
509
  workerLogger.debug(
452
510
  `[BENCH] Added block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`,
453
511
  );
@@ -491,7 +549,12 @@ process.on('message', async msg => {
491
549
  }
492
550
  }
493
551
  } catch (err: any) {
494
- process.send!({ type: 'ERROR', error: err.message });
495
- process.exit(1);
552
+ try {
553
+ process.send!({ type: 'ERROR', error: err.message });
554
+ } catch {
555
+ // IPC channel may be closed
556
+ }
557
+ await stopWorker();
558
+ gracefulExit(1);
496
559
  }
497
560
  });