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

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 (404) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +4 -4
  4. package/dest/client/factory.d.ts +2 -2
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +11 -9
  7. package/dest/client/interface.d.ts +18 -5
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +18 -19
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +473 -129
  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 +17 -8
  19. package/dest/config.d.ts.map +1 -1
  20. package/dest/config.js +15 -14
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +239 -265
  26. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -109
  29. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
  30. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  31. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  34. package/dest/mem_pools/attestation_pool/mocks.js +17 -13
  35. package/dest/mem_pools/instrumentation.d.ts +7 -1
  36. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.js +31 -13
  38. package/dest/mem_pools/interface.d.ts +3 -4
  39. package/dest/mem_pools/interface.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +37 -27
  41. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  42. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
  43. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  44. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  46. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  47. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  49. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  50. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  52. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  53. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  55. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  56. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  58. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  59. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  61. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  62. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  64. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  65. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool/index.js +0 -1
  67. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  68. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool/priority.js +6 -1
  70. package/dest/mem_pools/tx_pool/tx_pool.d.ts +11 -6
  71. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  73. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
  75. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  76. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  77. package/dest/msg_validators/attestation_validator/attestation_validator.js +52 -19
  78. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  79. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  80. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
  81. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  82. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  83. package/dest/msg_validators/clock_tolerance.js +37 -0
  84. package/dest/msg_validators/index.d.ts +2 -2
  85. package/dest/msg_validators/index.d.ts.map +1 -1
  86. package/dest/msg_validators/index.js +1 -1
  87. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  88. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  90. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  91. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  92. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  93. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  94. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  95. package/dest/msg_validators/proposal_validator/index.js +3 -0
  96. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  97. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  99. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  100. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  101. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  102. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  103. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  105. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  106. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
  108. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  109. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/data_validator.js +4 -1
  111. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
  112. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  113. package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
  114. package/dest/msg_validators/tx_validator/factory.d.ts +10 -4
  115. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  116. package/dest/msg_validators/tx_validator/factory.js +22 -12
  117. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  118. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  120. package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
  121. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  122. package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
  123. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  124. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/index.js +1 -0
  126. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  127. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
  129. package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
  130. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
  132. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  133. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  134. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  135. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  136. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +5 -3
  138. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
  140. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  141. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  143. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  144. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
  146. package/dest/services/data_store.d.ts +1 -1
  147. package/dest/services/data_store.d.ts.map +1 -1
  148. package/dest/services/data_store.js +10 -6
  149. package/dest/services/discv5/discV5_service.js +1 -1
  150. package/dest/services/dummy_service.d.ts +18 -2
  151. package/dest/services/dummy_service.d.ts.map +1 -1
  152. package/dest/services/dummy_service.js +42 -0
  153. package/dest/services/encoding.d.ts +1 -1
  154. package/dest/services/encoding.d.ts.map +1 -1
  155. package/dest/services/encoding.js +7 -6
  156. package/dest/services/index.d.ts +2 -1
  157. package/dest/services/index.d.ts.map +1 -1
  158. package/dest/services/index.js +1 -0
  159. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  160. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  161. package/dest/services/libp2p/instrumentation.js +30 -72
  162. package/dest/services/libp2p/libp2p_service.d.ts +39 -16
  163. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  164. package/dest/services/libp2p/libp2p_service.js +754 -191
  165. package/dest/services/peer-manager/metrics.d.ts +7 -2
  166. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  167. package/dest/services/peer-manager/metrics.js +33 -21
  168. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  169. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  170. package/dest/services/peer-manager/peer_manager.js +4 -12
  171. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  172. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  173. package/dest/services/peer-manager/peer_scoring.js +7 -4
  174. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  175. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  176. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  177. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  178. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  179. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  180. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  181. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  182. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  183. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  184. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  185. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  186. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  187. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  188. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  189. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  190. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  191. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  192. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
  193. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  194. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
  195. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  196. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  197. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  198. package/dest/services/reqresp/constants.d.ts +12 -0
  199. package/dest/services/reqresp/constants.d.ts.map +1 -0
  200. package/dest/services/reqresp/constants.js +7 -0
  201. package/dest/services/reqresp/interface.d.ts +4 -2
  202. package/dest/services/reqresp/interface.d.ts.map +1 -1
  203. package/dest/services/reqresp/interface.js +1 -1
  204. package/dest/services/reqresp/metrics.d.ts +6 -5
  205. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  206. package/dest/services/reqresp/metrics.js +17 -21
  207. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  208. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  209. package/dest/services/reqresp/protocols/auth.js +2 -2
  210. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  211. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  212. package/dest/services/reqresp/protocols/block.js +3 -2
  213. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
  214. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  215. package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
  216. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  217. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  218. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
  219. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +19 -7
  220. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  221. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +44 -14
  222. package/dest/services/reqresp/protocols/status.d.ts +5 -4
  223. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  224. package/dest/services/reqresp/protocols/status.js +7 -3
  225. package/dest/services/reqresp/protocols/tx.d.ts +2 -3
  226. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  227. package/dest/services/reqresp/reqresp.d.ts +6 -1
  228. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  229. package/dest/services/reqresp/reqresp.js +460 -46
  230. package/dest/services/service.d.ts +19 -3
  231. package/dest/services/service.d.ts.map +1 -1
  232. package/dest/services/tx_collection/config.d.ts +4 -1
  233. package/dest/services/tx_collection/config.d.ts.map +1 -1
  234. package/dest/services/tx_collection/config.js +10 -2
  235. package/dest/services/tx_collection/fast_tx_collection.d.ts +9 -6
  236. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  237. package/dest/services/tx_collection/fast_tx_collection.js +16 -5
  238. package/dest/services/tx_collection/index.d.ts +2 -1
  239. package/dest/services/tx_collection/index.d.ts.map +1 -1
  240. package/dest/services/tx_collection/index.js +1 -0
  241. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  242. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  243. package/dest/services/tx_collection/instrumentation.js +10 -13
  244. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  245. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  246. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  247. package/dest/services/tx_collection/slow_tx_collection.d.ts +4 -3
  248. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  249. package/dest/services/tx_collection/tx_collection.d.ts +10 -9
  250. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  251. package/dest/services/tx_collection/tx_collection.js +5 -5
  252. package/dest/services/tx_file_store/config.d.ts +18 -0
  253. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  254. package/dest/services/tx_file_store/config.js +26 -0
  255. package/dest/services/tx_file_store/index.d.ts +4 -0
  256. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  257. package/dest/services/tx_file_store/index.js +3 -0
  258. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  259. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  260. package/dest/services/tx_file_store/instrumentation.js +29 -0
  261. package/dest/services/tx_file_store/tx_file_store.d.ts +47 -0
  262. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  263. package/dest/services/tx_file_store/tx_file_store.js +149 -0
  264. package/dest/services/tx_provider.d.ts +4 -2
  265. package/dest/services/tx_provider.d.ts.map +1 -1
  266. package/dest/services/tx_provider.js +11 -2
  267. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  268. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  269. package/dest/services/tx_provider_instrumentation.js +14 -14
  270. package/dest/test-helpers/index.d.ts +3 -1
  271. package/dest/test-helpers/index.d.ts.map +1 -1
  272. package/dest/test-helpers/index.js +2 -0
  273. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  274. package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
  275. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  276. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  277. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  278. package/dest/test-helpers/test_tx_provider.js +41 -0
  279. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  280. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  281. package/dest/test-helpers/testbench-utils.js +297 -0
  282. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  283. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  284. package/dest/testbench/p2p_client_testbench_worker.js +218 -123
  285. package/dest/testbench/worker_client_manager.d.ts +51 -6
  286. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  287. package/dest/testbench/worker_client_manager.js +226 -39
  288. package/package.json +18 -18
  289. package/src/bootstrap/bootstrap.ts +7 -4
  290. package/src/client/factory.ts +15 -20
  291. package/src/client/interface.ts +19 -4
  292. package/src/client/p2p_client.ts +114 -155
  293. package/src/client/test/tx_proposal_collector/README.md +227 -0
  294. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  295. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  296. package/src/config.ts +25 -19
  297. package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
  298. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +241 -289
  299. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +163 -141
  300. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
  301. package/src/mem_pools/attestation_pool/mocks.ts +21 -15
  302. package/src/mem_pools/instrumentation.ts +39 -14
  303. package/src/mem_pools/interface.ts +2 -4
  304. package/src/mem_pools/tx_pool/README.md +270 -0
  305. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +367 -371
  306. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  307. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  308. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  309. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  310. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  311. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  312. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  313. package/src/mem_pools/tx_pool/index.ts +0 -1
  314. package/src/mem_pools/tx_pool/priority.ts +8 -1
  315. package/src/mem_pools/tx_pool/tx_pool.ts +11 -5
  316. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
  317. package/src/msg_validators/attestation_validator/attestation_validator.ts +37 -22
  318. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +19 -16
  319. package/src/msg_validators/clock_tolerance.ts +51 -0
  320. package/src/msg_validators/index.ts +1 -1
  321. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  322. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  323. package/src/msg_validators/proposal_validator/index.ts +3 -0
  324. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  325. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  326. package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
  327. package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
  328. package/src/msg_validators/tx_validator/data_validator.ts +18 -6
  329. package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
  330. package/src/msg_validators/tx_validator/factory.ts +67 -25
  331. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  332. package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
  333. package/src/msg_validators/tx_validator/index.ts +1 -0
  334. package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
  335. package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
  336. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  337. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  338. package/src/msg_validators/tx_validator/timestamp_validator.ts +11 -5
  339. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  340. package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
  341. package/src/services/data_store.ts +10 -7
  342. package/src/services/discv5/discV5_service.ts +1 -1
  343. package/src/services/dummy_service.ts +51 -0
  344. package/src/services/encoding.ts +6 -5
  345. package/src/services/index.ts +1 -0
  346. package/src/services/libp2p/instrumentation.ts +32 -73
  347. package/src/services/libp2p/libp2p_service.ts +425 -180
  348. package/src/services/peer-manager/metrics.ts +39 -21
  349. package/src/services/peer-manager/peer_manager.ts +5 -4
  350. package/src/services/peer-manager/peer_scoring.ts +3 -4
  351. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  352. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  353. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  354. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  355. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  356. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  357. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  358. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
  359. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  360. package/src/services/reqresp/constants.ts +14 -0
  361. package/src/services/reqresp/interface.ts +4 -1
  362. package/src/services/reqresp/metrics.ts +36 -27
  363. package/src/services/reqresp/protocols/auth.ts +2 -2
  364. package/src/services/reqresp/protocols/block.ts +3 -2
  365. package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
  366. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
  367. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +52 -10
  368. package/src/services/reqresp/protocols/status.ts +16 -12
  369. package/src/services/reqresp/protocols/tx.ts +1 -2
  370. package/src/services/reqresp/reqresp.ts +66 -19
  371. package/src/services/service.ts +23 -4
  372. package/src/services/tx_collection/config.ts +16 -2
  373. package/src/services/tx_collection/fast_tx_collection.ts +39 -15
  374. package/src/services/tx_collection/index.ts +5 -0
  375. package/src/services/tx_collection/instrumentation.ts +5 -13
  376. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  377. package/src/services/tx_collection/slow_tx_collection.ts +3 -3
  378. package/src/services/tx_collection/tx_collection.ts +10 -9
  379. package/src/services/tx_file_store/config.ts +43 -0
  380. package/src/services/tx_file_store/index.ts +3 -0
  381. package/src/services/tx_file_store/instrumentation.ts +36 -0
  382. package/src/services/tx_file_store/tx_file_store.ts +173 -0
  383. package/src/services/tx_provider.ts +19 -3
  384. package/src/services/tx_provider_instrumentation.ts +24 -14
  385. package/src/test-helpers/index.ts +2 -0
  386. package/src/test-helpers/mock-pubsub.ts +1 -1
  387. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  388. package/src/test-helpers/reqresp-nodes.ts +1 -1
  389. package/src/test-helpers/test_tx_provider.ts +64 -0
  390. package/src/test-helpers/testbench-utils.ts +374 -0
  391. package/src/testbench/p2p_client_testbench_worker.ts +338 -119
  392. package/src/testbench/worker_client_manager.ts +304 -42
  393. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
  394. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  395. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
  396. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  397. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  398. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  399. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  400. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  401. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  402. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
  403. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  404. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,3 +1,4 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { compactArray } from '@aztec/foundation/collection';
2
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
4
  import { elapsed } from '@aztec/foundation/timer';
@@ -55,7 +56,7 @@ export class TxProvider implements ITxProvider {
55
56
  /** Gathers txs from the tx pool, proposal body, remote rpc nodes, and reqresp. */
56
57
  public getTxsForBlockProposal(
57
58
  blockProposal: BlockProposal,
58
- blockNumber: number,
59
+ blockNumber: BlockNumber,
59
60
  opts: { pinnedPeer: PeerId | undefined; deadline: Date },
60
61
  ): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
61
62
  return this.getOrderedTxsFromAllSources(
@@ -136,6 +137,7 @@ export class TxProvider implements ITxProvider {
136
137
  );
137
138
 
138
139
  if (missingTxHashes.size === 0) {
140
+ this.instrumentation.incTxsFromP2P(0, txHashes.length);
139
141
  return { txsFromMempool };
140
142
  }
141
143
 
@@ -154,24 +156,26 @@ export class TxProvider implements ITxProvider {
154
156
 
155
157
  if (missingTxHashes.size === 0) {
156
158
  await this.processProposalTxs(txsFromProposal);
159
+ this.instrumentation.incTxsFromP2P(0, txHashes.length);
157
160
  return { txsFromMempool, txsFromProposal };
158
161
  }
159
162
 
160
163
  // Start tx collection from the network if needed, while we validate the txs taken from the proposal in parallel
161
164
  const [txsFromNetwork] = await Promise.all([
162
- this.txCollection.collectFastFor(request, [...missingTxHashes], opts),
165
+ this.collectFromP2P(request, [...missingTxHashes], opts),
163
166
  this.processProposalTxs(txsFromProposal),
164
167
  ] as const);
165
168
 
166
169
  if (txsFromNetwork.length > 0) {
167
170
  txsFromNetwork.forEach(tx => missingTxHashes.delete(tx.txHash.toString()));
168
- this.instrumentation.incTxsFromP2P(txsFromNetwork.length);
169
171
  this.log.debug(
170
172
  `Retrieved ${txsFromNetwork.length} txs from network for block proposal (${missingTxHashes.size} pending)`,
171
173
  { ...blockInfo, missingTxHashes: [...missingTxHashes] },
172
174
  );
173
175
  }
174
176
 
177
+ this.instrumentation.incTxsFromP2P(txsFromNetwork.length, txHashes.length);
178
+
175
179
  if (missingTxHashes.size === 0) {
176
180
  return { txsFromNetwork, txsFromMempool, txsFromProposal };
177
181
  }
@@ -199,6 +203,18 @@ export class TxProvider implements ITxProvider {
199
203
  };
200
204
  }
201
205
 
206
+ private async collectFromP2P(
207
+ input: FastCollectionRequestInput,
208
+ txHashes: TxHash[] | string[],
209
+ opts: { deadline: Date; pinnedPeer?: PeerId },
210
+ ): Promise<Tx[]> {
211
+ const requestedAt = Date.now();
212
+ const result = await this.txCollection.collectFastFor(input, txHashes, opts);
213
+ const requestProcessedAt = Date.now();
214
+ this.instrumentation.recordTxsRequestDelay(requestProcessedAt - requestedAt);
215
+ return result;
216
+ }
217
+
202
218
  private extractFromProposal(proposal: BlockProposal | undefined, missingTxHashes: string[]): Tx[] {
203
219
  if (!proposal) {
204
220
  return [];
@@ -1,4 +1,10 @@
1
- import { Metrics, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
1
+ import {
2
+ type Histogram,
3
+ Metrics,
4
+ type TelemetryClient,
5
+ type UpDownCounter,
6
+ createUpDownCounterWithDefault,
7
+ } from '@aztec/telemetry-client';
2
8
 
3
9
  export class TxProviderInstrumentation {
4
10
  private txFromProposalCount: UpDownCounter;
@@ -6,24 +12,23 @@ export class TxProviderInstrumentation {
6
12
  private txFromP2PCount: UpDownCounter;
7
13
  private missingTxsCount: UpDownCounter;
8
14
 
15
+ private fractionOfTxsRequestedFromP2P: Histogram;
16
+ private txsRequestDelay: Histogram;
17
+
9
18
  constructor(client: TelemetryClient, name: string) {
10
19
  const meter = client.getMeter(name);
11
20
 
12
- this.txFromProposalCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT, {
13
- description: 'The number of txs taken from block proposals',
14
- });
21
+ this.txFromProposalCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT);
22
+
23
+ this.txFromMempoolCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT);
24
+
25
+ this.txFromP2PCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT);
15
26
 
16
- this.txFromMempoolCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT, {
17
- description: 'The number of txs taken from the local mempool',
18
- });
27
+ this.missingTxsCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_MISSING_TXS_COUNT);
19
28
 
20
- this.txFromP2PCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT, {
21
- description: 'The number of txs taken from the p2p network',
22
- });
29
+ this.fractionOfTxsRequestedFromP2P = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUESTED_FRACTION);
23
30
 
24
- this.missingTxsCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_MISSING_TXS_COUNT, {
25
- description: 'The number of txs not found anywhere',
26
- });
31
+ this.txsRequestDelay = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUEST_DELAY);
27
32
  }
28
33
 
29
34
  incTxsFromProposals(count: number) {
@@ -34,8 +39,13 @@ export class TxProviderInstrumentation {
34
39
  this.txFromMempoolCount.add(count);
35
40
  }
36
41
 
37
- incTxsFromP2P(count: number) {
42
+ incTxsFromP2P(count: number, total: number) {
38
43
  this.txFromP2PCount.add(count);
44
+ this.fractionOfTxsRequestedFromP2P.record(count / total);
45
+ }
46
+
47
+ recordTxsRequestDelay(delay: number) {
48
+ this.txsRequestDelay.record(delay);
39
49
  }
40
50
 
41
51
  incMissingTxs(count: number) {
@@ -4,3 +4,5 @@ export * from './make-enrs.js';
4
4
  export * from './make-test-p2p-clients.js';
5
5
  export * from './reqresp-nodes.js';
6
6
  export * from './mock-pubsub.js';
7
+ export * from './test_tx_provider.js';
8
+ export * from './testbench-utils.js';
@@ -39,7 +39,7 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
39
39
  peerId: PeerId,
40
40
  deps: {
41
41
  packageVersion: string;
42
- mempools: MemPools<T>;
42
+ mempools: MemPools;
43
43
  l2BlockSource: L2BlockSource & ContractDataSource;
44
44
  epochCache: EpochCacheInterface;
45
45
  proofVerifier: ClientProtocolCircuitVerifier;
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
3
3
  import { protocolContractsHash } from '@aztec/protocol-contracts';
4
4
  import { mockTx } from '@aztec/stdlib/testing';
@@ -112,7 +112,7 @@ export async function createTestLibP2PService<T extends P2PClientType>(
112
112
  archiver: L2BlockSource & ContractDataSource,
113
113
  worldStateSynchronizer: WorldStateSynchronizer,
114
114
  epochCache: EpochCache,
115
- mempools: MemPools<T>,
115
+ mempools: MemPools,
116
116
  telemetry: TelemetryClient,
117
117
  port: number = 0,
118
118
  peerId?: PeerId,
@@ -0,0 +1,64 @@
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import type { L2Block } from '@aztec/stdlib/block';
3
+ import type { ITxProvider } from '@aztec/stdlib/interfaces/server';
4
+ import type { BlockProposal } from '@aztec/stdlib/p2p';
5
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
6
+
7
+ import type { PeerId } from '@libp2p/interface';
8
+
9
+ /**
10
+ * Test transaction provider that can be seeded with transactions.
11
+ * Returns seeded txs when requested by hash, useful for testing block
12
+ * proposal handling without requiring a full P2P network.
13
+ */
14
+ export class TestTxProvider implements ITxProvider {
15
+ private txs: Map<string, Tx> = new Map();
16
+
17
+ /** Seed transactions that will be returned when requested. */
18
+ seed(txs: Tx[]) {
19
+ for (const tx of txs) {
20
+ this.txs.set(tx.getTxHash().toString(), tx);
21
+ }
22
+ }
23
+
24
+ /** Clear all seeded transactions. */
25
+ clear() {
26
+ this.txs.clear();
27
+ }
28
+
29
+ /** Returns txs from the seeded collection given their hashes. */
30
+ getAvailableTxs(txHashes: TxHash[]): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
31
+ return this.getTxsByHashes(txHashes);
32
+ }
33
+
34
+ /** Get txs for a block proposal, returning any seeded txs that match the requested hashes. */
35
+ getTxsForBlockProposal(
36
+ blockProposal: BlockProposal,
37
+ _blockNumber: BlockNumber,
38
+ _opts: { pinnedPeer: PeerId | undefined; deadline: Date },
39
+ ): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
40
+ return this.getTxsByHashes(blockProposal.txHashes);
41
+ }
42
+
43
+ /** Get txs for a block, returning any seeded txs that match the tx effects in the block. */
44
+ getTxsForBlock(block: L2Block, _opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
45
+ const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
46
+ return this.getTxsByHashes(txHashes);
47
+ }
48
+
49
+ private getTxsByHashes(txHashes: TxHash[]): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
50
+ const txs: Tx[] = [];
51
+ const missingTxs: TxHash[] = [];
52
+
53
+ for (const txHash of txHashes) {
54
+ const tx = this.txs.get(txHash.toString());
55
+ if (tx) {
56
+ txs.push(tx);
57
+ } else {
58
+ missingTxs.push(txHash);
59
+ }
60
+ }
61
+
62
+ return Promise.resolve({ txs, missingTxs });
63
+ }
64
+ }
@@ -0,0 +1,374 @@
1
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
2
+ import { type BlockNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
5
+ import type {
6
+ BlockProposal,
7
+ CheckpointAttestation,
8
+ CheckpointProposal,
9
+ CheckpointProposalCore,
10
+ } from '@aztec/stdlib/p2p';
11
+ import { type BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
12
+
13
+ import EventEmitter from 'events';
14
+
15
+ import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
16
+ import type { TxPool } from '../mem_pools/tx_pool/index.js';
17
+ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
18
+
19
+ /**
20
+ * In-memory TxPool implementation for testing.
21
+ * Provides basic tx storage without persistence.
22
+ */
23
+ export class InMemoryTxPool extends EventEmitter implements TxPool {
24
+ private txsByHash = new Map<string, Tx>();
25
+ private logger: Logger | null = null;
26
+
27
+ setLogger(logger: Logger): void {
28
+ this.logger = logger;
29
+ }
30
+
31
+ setTxs(txs: Tx[]): number {
32
+ this.txsByHash.clear();
33
+ return this.appendTxs(txs);
34
+ }
35
+
36
+ appendTxs(txs: Tx[]): number {
37
+ let added = 0;
38
+ for (const tx of txs) {
39
+ const key = tx.getTxHash().toString();
40
+ if (!this.txsByHash.has(key)) {
41
+ added += 1;
42
+ }
43
+ this.txsByHash.set(key, tx);
44
+ }
45
+ return added;
46
+ }
47
+
48
+ clearTxs(): void {
49
+ this.txsByHash.clear();
50
+ }
51
+
52
+ resetState(): void {
53
+ this.txsByHash.clear();
54
+ this.removeAllListeners();
55
+ }
56
+
57
+ addTxs(txs: Tx[], opts?: { source?: string }): Promise<number> {
58
+ const newTxs: Tx[] = [];
59
+ let added = 0;
60
+ for (const tx of txs) {
61
+ const key = tx.getTxHash().toString();
62
+ if (!this.txsByHash.has(key)) {
63
+ newTxs.push(tx);
64
+ added += 1;
65
+ }
66
+ this.txsByHash.set(key, tx);
67
+ }
68
+ if (newTxs.length > 0) {
69
+ this.emit('txs-added', { txs: newTxs, source: opts?.source });
70
+ }
71
+ return Promise.resolve(added);
72
+ }
73
+
74
+ getTxByHash(hash: TxHash): Promise<Tx | undefined> {
75
+ return Promise.resolve(this.txsByHash.get(hash.toString()));
76
+ }
77
+
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);
83
+ }
84
+
85
+ hasTxs(hashes: TxHash[]): Promise<boolean[]> {
86
+ return Promise.resolve(hashes.map(h => this.txsByHash.has(h.toString())));
87
+ }
88
+
89
+ hasTx(hash: TxHash): Promise<boolean> {
90
+ return Promise.resolve(this.txsByHash.has(hash.toString()));
91
+ }
92
+
93
+ getArchivedTxByHash(_hash: TxHash): Promise<Tx | undefined> {
94
+ return Promise.resolve(undefined);
95
+ }
96
+
97
+ async markAsMined(_txHashes: TxHash[], _blockHeader: BlockHeader): Promise<void> {}
98
+
99
+ async markMinedAsPending(_txHashes: TxHash[], _latestBlock: BlockNumber): Promise<void> {}
100
+
101
+ deleteTxs(txHashes: TxHash[], _opts?: { permanently?: boolean }): Promise<void> {
102
+ for (const txHash of txHashes) {
103
+ this.txsByHash.delete(txHash.toString());
104
+ }
105
+ return Promise.resolve();
106
+ }
107
+
108
+ getAllTxs(): Promise<Tx[]> {
109
+ return Promise.resolve([...this.txsByHash.values()]);
110
+ }
111
+
112
+ getAllTxHashes(): Promise<TxHash[]> {
113
+ return Promise.resolve([...this.txsByHash.keys()].map(key => TxHash.fromString(key)));
114
+ }
115
+
116
+ getPendingTxHashes(): Promise<TxHash[]> {
117
+ return Promise.resolve([...this.txsByHash.keys()].map(key => TxHash.fromString(key)));
118
+ }
119
+
120
+ getPendingTxCount(): Promise<number> {
121
+ return Promise.resolve(this.txsByHash.size);
122
+ }
123
+
124
+ getMinedTxHashes(): Promise<[tx: TxHash, blockNumber: BlockNumber][]> {
125
+ return Promise.resolve([]);
126
+ }
127
+
128
+ getTxStatus(hash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
129
+ return Promise.resolve(this.txsByHash.has(hash.toString()) ? 'pending' : undefined);
130
+ }
131
+
132
+ updateConfig(_config: { maxPendingTxCount?: number; archivedTxLimit?: number }): void {}
133
+
134
+ isEmpty(): Promise<boolean> {
135
+ return Promise.resolve(this.txsByHash.size === 0);
136
+ }
137
+
138
+ async markTxsAsNonEvictable(_txHashes: TxHash[]): Promise<void> {}
139
+
140
+ async clearNonEvictableTxs(): Promise<void> {}
141
+
142
+ cleanupDeletedMinedTxs(_blockNumber: BlockNumber): Promise<number> {
143
+ return Promise.resolve(0);
144
+ }
145
+ }
146
+
147
+ /**
148
+ * In-memory AttestationPool implementation for testing.
149
+ */
150
+ export class InMemoryAttestationPool implements AttestationPool {
151
+ private proposals = new Map<string, BlockProposal>();
152
+
153
+ addBlockProposal(blockProposal: BlockProposal): Promise<void> {
154
+ this.proposals.set(blockProposal.archive.toString(), blockProposal);
155
+ return Promise.resolve();
156
+ }
157
+
158
+ getBlockProposal(id: string): Promise<BlockProposal | undefined> {
159
+ return Promise.resolve(this.proposals.get(id));
160
+ }
161
+
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);
169
+ }
170
+
171
+ async addCheckpointProposal(_proposal: CheckpointProposal): Promise<void> {}
172
+
173
+ getCheckpointProposal(_id: string): Promise<CheckpointProposalCore | undefined> {
174
+ return Promise.resolve(undefined);
175
+ }
176
+
177
+ hasCheckpointProposal(_idOrProposal: string | CheckpointProposal): Promise<boolean> {
178
+ return Promise.resolve(false);
179
+ }
180
+
181
+ async addCheckpointAttestations(_attestations: CheckpointAttestation[]): Promise<void> {}
182
+
183
+ async deleteCheckpointAttestationsOlderThan(_slot: SlotNumber): Promise<void> {}
184
+
185
+ getCheckpointAttestationsForSlot(_slot: SlotNumber): Promise<CheckpointAttestation[]> {
186
+ return Promise.resolve([]);
187
+ }
188
+
189
+ getCheckpointAttestationsForSlotAndProposal(
190
+ _slot: SlotNumber,
191
+ _proposalId: string,
192
+ ): Promise<CheckpointAttestation[]> {
193
+ return Promise.resolve([]);
194
+ }
195
+
196
+ hasCheckpointAttestation(_attestation: CheckpointAttestation): Promise<boolean> {
197
+ return Promise.resolve(false);
198
+ }
199
+
200
+ canAddCheckpointProposal(_proposal: CheckpointProposal): Promise<boolean> {
201
+ return Promise.resolve(true);
202
+ }
203
+
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> {
213
+ return Promise.resolve(false);
214
+ }
215
+
216
+ isEmpty(): Promise<boolean> {
217
+ return Promise.resolve(this.proposals.size === 0);
218
+ }
219
+
220
+ resetState(): void {
221
+ this.proposals.clear();
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Creates a mock EpochCache for testing.
227
+ */
228
+ export function createMockEpochCache(): EpochCacheInterface {
229
+ return {
230
+ getCommittee: () => Promise.resolve({ committee: [], seed: 1n, epoch: EpochNumber.ZERO, isEscapeHatchOpen: false }),
231
+ getProposerIndexEncoding: () => '0x' as `0x${string}`,
232
+ getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, nowMs: 0n }),
233
+ computeProposerIndex: () => 0n,
234
+ getCurrentAndNextSlot: () => ({ currentSlot: SlotNumber.ZERO, nextSlot: SlotNumber.ZERO }),
235
+ getProposerAttesterAddressInSlot: () => Promise.resolve(undefined),
236
+ getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
237
+ isInCommittee: () => Promise.resolve(false),
238
+ getRegisteredValidators: () => Promise.resolve([]),
239
+ filterInCommittee: () => Promise.resolve([]),
240
+ };
241
+ }
242
+
243
+ /**
244
+ * Creates a mock WorldStateSynchronizer for testing.
245
+ */
246
+ export function createMockWorldStateSynchronizer(): WorldStateSynchronizer {
247
+ return {
248
+ status: () =>
249
+ Promise.resolve({
250
+ syncSummary: {
251
+ latestBlockNumber: 0,
252
+ latestBlockHash: '',
253
+ finalizedBlockNumber: 0,
254
+ treesAreSynched: false,
255
+ oldestHistoricBlockNumber: 0,
256
+ },
257
+ }),
258
+ } as WorldStateSynchronizer;
259
+ }
260
+
261
+ /**
262
+ * Unlimited rate limit configuration for benchmarks.
263
+ */
264
+ export const UNLIMITED_RATE_LIMIT_QUOTA = {
265
+ peerLimit: { quotaTimeMs: 1000, quotaCount: 10_000 },
266
+ globalLimit: { quotaTimeMs: 1000, quotaCount: 100_000 },
267
+ };
268
+
269
+ /**
270
+ * Installs unlimited rate limits on a ReqResp instance.
271
+ * Used in benchmarks to avoid rate limiting affecting results.
272
+ *
273
+ * Note: Uses `as any` because rateLimiter is private. This is acceptable
274
+ * in test code where we need to override internal behavior.
275
+ */
276
+ export function installUnlimitedRateLimitsOnReqResp(reqResp: any): void {
277
+ const rateLimiter = reqResp.rateLimiter;
278
+ rateLimiter.getRateLimits = () => UNLIMITED_RATE_LIMIT_QUOTA;
279
+ rateLimiter.allow = () => RateLimitStatus.Allowed;
280
+ }
281
+
282
+ /**
283
+ * Distribution patterns for benchmark transaction distribution.
284
+ */
285
+ export type DistributionPattern = 'uniform' | 'sparse' | 'pinned-only';
286
+
287
+ /**
288
+ * Collector implementation types for benchmarking.
289
+ */
290
+ export type CollectorType = 'batch-requester' | 'send-batch-request';
291
+
292
+ /**
293
+ * Display names for collector types (for output/logging only).
294
+ */
295
+ export const COLLECTOR_DISPLAY_NAMES: Record<CollectorType, string> = {
296
+ 'batch-requester': 'batch-requester (new)',
297
+ 'send-batch-request': 'send-batch-request (old)',
298
+ };
299
+
300
+ /**
301
+ * Benchmark timing constants.
302
+ */
303
+ export const BENCHMARK_CONSTANTS = {
304
+ /** Time to wait for peers to connect before starting benchmark */
305
+ PEER_DISCOVERY_WAIT_MS: 10_000,
306
+ /** Maximum time to wait for peer connections */
307
+ MAX_PEER_WAIT_MS: 60_000,
308
+ /** Interval between peer connection checks */
309
+ PEER_CHECK_INTERVAL_MS: 500,
310
+ /** Default worker ready timeout */
311
+ WORKER_READY_TIMEOUT_MS: 30_000,
312
+ /** Graceful shutdown timeout before force kill */
313
+ GRACEFUL_SHUTDOWN_TIMEOUT_MS: 5_000,
314
+ /** Overall cleanup timeout */
315
+ CLEANUP_TIMEOUT_MS: 10_000,
316
+ /** Buffer time for internal timeout to ensure we return before outer timeout */
317
+ TIMEOUT_BUFFER_MS: 5_000,
318
+ /** Minimum internal timeout regardless of buffer */
319
+ MIN_INTERNAL_TIMEOUT_MS: 1_000,
320
+ /** Fixed max peers for fair benchmarking */
321
+ FIXED_MAX_PEERS: 10,
322
+ /** Fixed max retry attempts for fair benchmarking */
323
+ FIXED_MAX_RETRY_ATTEMPTS: 3,
324
+ /** LMDB map size for temp stores used in benchmarks (in KB). */
325
+ KV_STORE_MAP_SIZE_KB: 256 * 1024,
326
+ } as const;
327
+
328
+ /**
329
+ * Filters transactions based on distribution pattern for benchmark responders.
330
+ *
331
+ * @param allTxs - All transactions to filter
332
+ * @param peerIndex - Index of the current peer (0 = aggregator)
333
+ * @param peerCount - Total number of peers
334
+ * @param distribution - Distribution pattern to apply
335
+ * @param pinnedPeerIndex - Index of the pinned peer (for pinned-only distribution)
336
+ * @returns Filtered transactions for this peer
337
+ */
338
+ export function filterTxsByDistribution(
339
+ allTxs: Tx[],
340
+ peerIndex: number,
341
+ peerCount: number,
342
+ distribution: DistributionPattern,
343
+ pinnedPeerIndex: number = 1,
344
+ ): Tx[] {
345
+ if (peerIndex === 0) {
346
+ return [];
347
+ }
348
+
349
+ const responderCount = peerCount - 1;
350
+
351
+ switch (distribution) {
352
+ case 'uniform':
353
+ return allTxs;
354
+
355
+ case 'sparse': {
356
+ const responderIndex = peerIndex - 1;
357
+ return allTxs.filter((_, txIndex) => {
358
+ const bucket = txIndex % responderCount;
359
+ return bucket === responderIndex || bucket === (responderIndex + 1) % responderCount;
360
+ });
361
+ }
362
+
363
+ case 'pinned-only':
364
+ return peerIndex === pinnedPeerIndex ? allTxs : [];
365
+ }
366
+ }
367
+
368
+ /**
369
+ * Calculates the internal timeout for collector operations.
370
+ * Ensures we return before the outer timeout while maintaining a minimum.
371
+ */
372
+ export function calculateInternalTimeout(timeoutMs: number): number {
373
+ return Math.max(timeoutMs - BENCHMARK_CONSTANTS.TIMEOUT_BUFFER_MS, BENCHMARK_CONSTANTS.MIN_INTERNAL_TIMEOUT_MS);
374
+ }