@aztec/p2p 0.0.1-commit.001888fc → 0.0.1-commit.017a351

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 (403) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +9 -1
  4. package/dest/client/factory.d.ts +4 -3
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +28 -23
  7. package/dest/client/interface.d.ts +14 -5
  8. package/dest/client/interface.d.ts.map +1 -1
  9. package/dest/client/p2p_client.d.ts +13 -9
  10. package/dest/client/p2p_client.d.ts.map +1 -1
  11. package/dest/client/p2p_client.js +78 -20
  12. package/dest/config.d.ts +135 -99
  13. package/dest/config.d.ts.map +1 -1
  14. package/dest/config.js +62 -7
  15. package/dest/errors/p2p-service.error.d.ts +9 -0
  16. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  17. package/dest/errors/p2p-service.error.js +10 -0
  18. package/dest/errors/reqresp.error.d.ts +1 -20
  19. package/dest/errors/reqresp.error.d.ts.map +1 -1
  20. package/dest/errors/reqresp.error.js +0 -21
  21. package/dest/index.d.ts +1 -2
  22. package/dest/index.d.ts.map +1 -1
  23. package/dest/index.js +0 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  26. package/dest/mem_pools/attestation_pool/attestation_pool.js +265 -199
  27. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
  30. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  33. package/dest/mem_pools/index.d.ts +1 -2
  34. package/dest/mem_pools/index.d.ts.map +1 -1
  35. package/dest/mem_pools/instrumentation.d.ts +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  37. package/dest/mem_pools/instrumentation.js +17 -1
  38. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
  41. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  44. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  48. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +8 -5
  49. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
  51. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  53. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
  54. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +75 -84
  56. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  57. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  58. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  59. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  60. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  61. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  62. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  63. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  64. package/dest/msg_validators/clock_tolerance.js +56 -3
  65. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -2
  66. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -2
  68. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  69. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +10 -2
  70. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  71. package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -12
  72. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  73. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  75. package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
  76. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  77. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  78. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  79. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  80. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  81. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  82. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  83. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  84. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  86. package/dest/msg_validators/tx_validator/factory.d.ts +6 -5
  87. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  88. package/dest/msg_validators/tx_validator/factory.js +21 -11
  89. package/dest/msg_validators/tx_validator/gas_validator.d.ts +36 -4
  90. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  91. package/dest/msg_validators/tx_validator/gas_validator.js +50 -33
  92. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  93. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  94. package/dest/msg_validators/tx_validator/index.js +2 -0
  95. package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
  96. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  97. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  99. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  100. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  101. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  102. package/dest/services/data_store.d.ts +1 -1
  103. package/dest/services/data_store.d.ts.map +1 -1
  104. package/dest/services/data_store.js +5 -5
  105. package/dest/services/discv5/discV5_service.d.ts +2 -1
  106. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  107. package/dest/services/discv5/discV5_service.js +35 -8
  108. package/dest/services/dummy_service.d.ts +11 -15
  109. package/dest/services/dummy_service.d.ts.map +1 -1
  110. package/dest/services/dummy_service.js +12 -16
  111. package/dest/services/encoding.d.ts +5 -1
  112. package/dest/services/encoding.d.ts.map +1 -1
  113. package/dest/services/encoding.js +7 -1
  114. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  115. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  116. package/dest/services/gossipsub/topic_score_params.js +21 -4
  117. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  118. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  119. package/dest/services/libp2p/instrumentation.js +14 -0
  120. package/dest/services/libp2p/libp2p_service.d.ts +36 -46
  121. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  122. package/dest/services/libp2p/libp2p_service.js +272 -262
  123. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  124. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  125. package/dest/services/peer-manager/peer_manager.js +38 -10
  126. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  127. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  128. package/dest/services/peer-manager/peer_scoring.js +32 -10
  129. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -14
  130. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  131. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +78 -100
  132. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -6
  133. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  134. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +4 -4
  135. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  136. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +7 -7
  137. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  138. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  139. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  140. package/dest/services/reqresp/config.d.ts +3 -3
  141. package/dest/services/reqresp/config.d.ts.map +1 -1
  142. package/dest/services/reqresp/interface.d.ts +16 -18
  143. package/dest/services/reqresp/interface.d.ts.map +1 -1
  144. package/dest/services/reqresp/interface.js +10 -20
  145. package/dest/services/reqresp/metrics.d.ts +1 -1
  146. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  147. package/dest/services/reqresp/metrics.js +0 -1
  148. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  149. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  150. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  151. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  152. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  153. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  154. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  155. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  156. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  157. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  158. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  159. package/dest/services/reqresp/protocols/index.js +0 -1
  160. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  161. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  162. package/dest/services/reqresp/protocols/tx.js +1 -3
  163. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  164. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  165. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  166. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  167. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  168. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  169. package/dest/services/reqresp/reqresp.d.ts +7 -29
  170. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  171. package/dest/services/reqresp/reqresp.js +41 -214
  172. package/dest/services/service.d.ts +9 -12
  173. package/dest/services/service.d.ts.map +1 -1
  174. package/dest/services/tx_collection/config.d.ts +2 -23
  175. package/dest/services/tx_collection/config.d.ts.map +1 -1
  176. package/dest/services/tx_collection/config.js +2 -55
  177. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  178. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  179. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  180. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  181. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  182. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  183. package/dest/services/tx_collection/index.d.ts +2 -3
  184. package/dest/services/tx_collection/index.d.ts.map +1 -1
  185. package/dest/services/tx_collection/index.js +0 -1
  186. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  187. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  188. package/dest/services/tx_collection/instrumentation.js +0 -2
  189. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  190. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  191. package/dest/services/tx_collection/request_tracker.js +84 -0
  192. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  193. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  194. package/dest/services/tx_collection/tx_collection.js +275 -119
  195. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  196. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  197. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  198. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  199. package/dest/services/tx_collection/tx_source.js +9 -7
  200. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  201. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  202. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  203. package/dest/services/tx_provider.d.ts +3 -1
  204. package/dest/services/tx_provider.d.ts.map +1 -1
  205. package/dest/services/tx_provider.js +3 -0
  206. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  207. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  208. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  209. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  210. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  211. package/dest/test-helpers/mock-pubsub.js +44 -44
  212. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  213. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  214. package/dest/test-helpers/reqresp-nodes.js +16 -18
  215. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  216. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  217. package/dest/test-helpers/test_tx_provider.js +3 -0
  218. package/dest/test-helpers/testbench-utils.d.ts +12 -14
  219. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  220. package/dest/test-helpers/testbench-utils.js +38 -14
  221. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  222. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  223. package/dest/testbench/p2p_client_testbench_worker.js +83 -38
  224. package/dest/testbench/worker_client_manager.d.ts +10 -6
  225. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  226. package/dest/testbench/worker_client_manager.js +51 -9
  227. package/dest/util.d.ts +11 -6
  228. package/dest/util.d.ts.map +1 -1
  229. package/dest/util.js +35 -14
  230. package/dest/versioning.d.ts +3 -6
  231. package/dest/versioning.d.ts.map +1 -1
  232. package/dest/versioning.js +3 -24
  233. package/package.json +15 -14
  234. package/src/bootstrap/bootstrap.ts +9 -1
  235. package/src/client/factory.ts +48 -23
  236. package/src/client/interface.ts +15 -11
  237. package/src/client/p2p_client.ts +91 -41
  238. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  239. package/src/config.ts +123 -6
  240. package/src/errors/p2p-service.error.ts +11 -0
  241. package/src/errors/reqresp.error.ts +0 -25
  242. package/src/index.ts +0 -1
  243. package/src/mem_pools/attestation_pool/attestation_pool.ts +316 -241
  244. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  245. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  246. package/src/mem_pools/index.ts +0 -3
  247. package/src/mem_pools/instrumentation.ts +5 -1
  248. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
  249. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  250. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  251. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  252. package/src/mem_pools/tx_pool_v2/interfaces.ts +7 -4
  253. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +20 -8
  254. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +75 -90
  255. package/src/msg_validators/attestation_validator/README.md +1 -1
  256. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  257. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  258. package/src/msg_validators/clock_tolerance.ts +73 -3
  259. package/src/msg_validators/proposal_validator/README.md +4 -4
  260. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +12 -2
  261. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +17 -2
  262. package/src/msg_validators/proposal_validator/proposal_validator.ts +54 -10
  263. package/src/msg_validators/tx_validator/README.md +11 -3
  264. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  265. package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
  266. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  267. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  268. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  269. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  270. package/src/msg_validators/tx_validator/factory.ts +25 -7
  271. package/src/msg_validators/tx_validator/gas_validator.ts +82 -33
  272. package/src/msg_validators/tx_validator/index.ts +2 -0
  273. package/src/msg_validators/tx_validator/phases_validator.ts +1 -1
  274. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  275. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  276. package/src/services/data_store.ts +5 -13
  277. package/src/services/discv5/discV5_service.ts +38 -5
  278. package/src/services/dummy_service.ts +14 -39
  279. package/src/services/encoding.ts +9 -1
  280. package/src/services/gossipsub/topic_score_params.ts +36 -4
  281. package/src/services/libp2p/instrumentation.ts +14 -0
  282. package/src/services/libp2p/libp2p_service.ts +302 -300
  283. package/src/services/peer-manager/peer_manager.ts +44 -10
  284. package/src/services/peer-manager/peer_scoring.ts +27 -5
  285. package/src/services/reqresp/README.md +0 -14
  286. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  287. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +74 -112
  288. package/src/services/reqresp/batch-tx-requester/interface.ts +11 -5
  289. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +6 -6
  290. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  291. package/src/services/reqresp/config.ts +2 -2
  292. package/src/services/reqresp/interface.ts +21 -47
  293. package/src/services/reqresp/metrics.ts +0 -1
  294. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  295. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  296. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  297. package/src/services/reqresp/protocols/index.ts +0 -1
  298. package/src/services/reqresp/protocols/tx.ts +1 -3
  299. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  300. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  301. package/src/services/reqresp/reqresp.ts +45 -260
  302. package/src/services/service.ts +12 -28
  303. package/src/services/tx_collection/config.ts +3 -80
  304. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  305. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  306. package/src/services/tx_collection/index.ts +1 -6
  307. package/src/services/tx_collection/instrumentation.ts +1 -7
  308. package/src/services/tx_collection/request_tracker.ts +127 -0
  309. package/src/services/tx_collection/tx_collection.ts +331 -176
  310. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  311. package/src/services/tx_collection/tx_source.ts +8 -7
  312. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  313. package/src/services/tx_provider.ts +5 -0
  314. package/src/test-helpers/make-test-p2p-clients.ts +3 -0
  315. package/src/test-helpers/mock-pubsub.ts +46 -60
  316. package/src/test-helpers/reqresp-nodes.ts +12 -22
  317. package/src/test-helpers/test_tx_provider.ts +5 -0
  318. package/src/test-helpers/testbench-utils.ts +50 -28
  319. package/src/testbench/p2p_client_testbench_worker.ts +87 -54
  320. package/src/testbench/worker_client_manager.ts +59 -20
  321. package/src/util.ts +32 -17
  322. package/src/versioning.ts +3 -33
  323. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  324. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  325. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  326. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  327. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  328. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  329. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  330. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  331. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  332. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  333. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  334. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  335. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  336. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  337. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  338. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  339. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  340. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  341. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  342. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  343. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  344. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  345. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  346. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  347. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  348. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  349. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  350. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  351. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  352. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  353. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  354. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  355. package/dest/mem_pools/tx_pool/index.js +0 -2
  356. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  357. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  358. package/dest/mem_pools/tx_pool/priority.js +0 -15
  359. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  360. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  361. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  362. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  363. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  364. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  365. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  366. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  367. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  368. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  369. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  370. package/dest/services/reqresp/protocols/block.js +0 -32
  371. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  372. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  373. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  374. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  375. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  376. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  377. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  378. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  379. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  380. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  381. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  382. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  383. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  384. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  385. package/src/mem_pools/tx_pool/README.md +0 -270
  386. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  387. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  388. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  389. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  390. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  391. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  392. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  393. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  394. package/src/mem_pools/tx_pool/index.ts +0 -2
  395. package/src/mem_pools/tx_pool/priority.ts +0 -20
  396. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  397. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  398. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  399. package/src/services/reqresp/protocols/block.ts +0 -37
  400. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  401. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  402. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  403. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -32,7 +32,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
32
32
  const MAX_DIAL_ATTEMPTS = 3;
33
33
  const MAX_CACHED_PEERS = 100;
34
34
  const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
35
- const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
35
+ const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
36
36
  const GOODBYE_DIAL_TIMEOUT_MS = 1000;
37
37
  const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
38
38
 
@@ -226,20 +226,30 @@ export class PeerManager implements PeerManagerInterface {
226
226
  }
227
227
 
228
228
  /**
229
- * Cleans up expired timeouts.
229
+ * Cleans up expired timeouts and stale failed-auth-handshake entries.
230
230
  *
231
231
  * When peers fail to dial after a number of retries, they are temporarily timed out.
232
232
  * This function removes any peers that have been in the timed out state for too long.
233
233
  * To give them a chance to reconnect.
234
+ *
235
+ * Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
236
+ * Without this, peers that probe once and never reconnect would leave their entries in the
237
+ * map forever, causing an unbounded memory leak.
234
238
  */
235
239
  private cleanupExpiredTimeouts() {
236
- // Clean up expired timeouts
237
240
  const now = this.dateProvider.now();
241
+
238
242
  for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
239
243
  if (now >= timedOutPeer.timeoutUntilMs) {
240
244
  this.timedOutPeers.delete(peerId);
241
245
  }
242
246
  }
247
+
248
+ for (const [id, entry] of this.failedAuthHandshakes.entries()) {
249
+ if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
250
+ this.failedAuthHandshakes.delete(id);
251
+ }
252
+ }
243
253
  }
244
254
 
245
255
  /**
@@ -303,15 +313,20 @@ export class PeerManager implements PeerManagerInterface {
303
313
  */
304
314
  private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
305
315
  const peerId = e.detail;
316
+ const peerIdStr = peerId.toString();
306
317
  this.metrics.peerDisconnected(peerId);
307
- this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
308
- const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
318
+ this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
319
+ const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
309
320
  if (validatorAddress !== undefined) {
310
321
  this.logger.info(
311
- `Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
322
+ `Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
312
323
  );
313
324
  this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
314
- this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
325
+ this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
326
+ }
327
+
328
+ if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
329
+ this.peerScoring.removePeer(peerIdStr);
315
330
  }
316
331
  }
317
332
 
@@ -512,6 +527,7 @@ export class PeerManager implements PeerManagerInterface {
512
527
  protectedConnections: protectedPeerCount,
513
528
  maxPeerCount: this.config.maxPeerCount,
514
529
  cachedPeers: this.cachedPeers.size,
530
+ discv5KadPeers: this.peerDiscoveryService.getKadValues().length,
515
531
  ...this.peerScoring.getStats(),
516
532
  });
517
533
 
@@ -713,6 +729,12 @@ export class PeerManager implements PeerManagerInterface {
713
729
  return;
714
730
  }
715
731
 
732
+ // Don't dial peers that have exceeded the auth failure threshold
733
+ if (!this.isNodeAllowedToConnect(peerId)) {
734
+ this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
735
+ return;
736
+ }
737
+
716
738
  const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
717
739
 
718
740
  this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
@@ -776,7 +798,8 @@ export class PeerManager implements PeerManagerInterface {
776
798
  // Add to timed out peers
777
799
  this.timedOutPeers.set(id, {
778
800
  peerId: id,
779
- timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
801
+ timeoutUntilMs:
802
+ this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
780
803
  });
781
804
  }
782
805
  }
@@ -938,6 +961,8 @@ export class PeerManager implements PeerManagerInterface {
938
961
  `Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
939
962
  { ...logData, address: sender.toString() },
940
963
  );
964
+ this.markAuthHandshakeFailed(peerId);
965
+ this.markPeerForDisconnect(peerId);
941
966
  return;
942
967
  }
943
968
 
@@ -967,14 +992,14 @@ export class PeerManager implements PeerManagerInterface {
967
992
  const peerIdStr = peerId.toString();
968
993
 
969
994
  const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
995
+ const failureCount = (existingEntry?.count || 0) + 1;
970
996
  this.failedAuthHandshakes.set(peerIdStr, {
971
- count: (existingEntry?.count || 0) + 1,
997
+ count: failureCount,
972
998
  lastFailureTimestamp: now,
973
999
  });
974
1000
 
975
1001
  const connections = this.libP2PNode.getConnections(peerId);
976
1002
  connections.forEach(conn => {
977
- // We mark the IP address
978
1003
  const address = conn.remoteAddr.nodeAddress().address;
979
1004
  const existingAddressEntry = this.failedAuthHandshakes.get(address);
980
1005
  this.failedAuthHandshakes.set(address, {
@@ -982,6 +1007,15 @@ export class PeerManager implements PeerManagerInterface {
982
1007
  lastFailureTimestamp: now,
983
1008
  });
984
1009
  });
1010
+
1011
+ // Ban the peer from being re-dialed for a cooldown period (exponential backoff)
1012
+ const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
1013
+ const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
1014
+ this.timedOutPeers.set(peerIdStr, {
1015
+ peerId: peerIdStr,
1016
+ timeoutUntilMs: now + backoffMs,
1017
+ });
1018
+ this.cachedPeers.delete(peerIdStr);
985
1019
  }
986
1020
 
987
1021
  /*
@@ -1,5 +1,6 @@
1
1
  import { median } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
3
4
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
4
5
  import {
5
6
  Attributes,
@@ -54,6 +55,7 @@ export enum PeerScoreState {
54
55
  // TODO: move into config / constants
55
56
  const MIN_SCORE_BEFORE_BAN = -100;
56
57
  const MIN_SCORE_BEFORE_DISCONNECT = -50;
58
+ const SCORE_CLEANUP_THRESHOLD = 0.1;
57
59
 
58
60
  export class PeerScoring {
59
61
  private logger = createLogger('p2p:peer-scoring');
@@ -65,7 +67,11 @@ export class PeerScoring {
65
67
 
66
68
  private peerStateCounter: UpDownCounter;
67
69
 
68
- constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
70
+ constructor(
71
+ config: P2PConfig,
72
+ telemetry: TelemetryClient = getTelemetryClient(),
73
+ private readonly dateProvider: DateProvider = new DateProvider(),
74
+ ) {
69
75
  const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
70
76
  this.peerPenalties = {
71
77
  [PeerErrorSeverity.HighToleranceError]:
@@ -92,7 +98,7 @@ export class PeerScoring {
92
98
  }
93
99
 
94
100
  updateScore(peerId: string, scoreDelta: number): number {
95
- const currentTime = Date.now();
101
+ const currentTime = this.dateProvider.now();
96
102
  const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
97
103
  const timePassed = currentTime - lastUpdate;
98
104
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
@@ -111,19 +117,35 @@ export class PeerScoring {
111
117
  }
112
118
 
113
119
  decayAllScores(): void {
114
- const currentTime = Date.now();
120
+ const currentTime = this.dateProvider.now();
115
121
  for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
116
122
  const timePassed = currentTime - lastUpdate;
117
123
  const decayPeriods = Math.floor(timePassed / this.decayInterval);
118
124
  if (decayPeriods > 0) {
119
125
  let score = this.scores.get(peerId) || 0;
120
126
  score *= Math.pow(this.decayFactor, decayPeriods);
121
- this.scores.set(peerId, score);
122
- this.lastUpdateTime.set(peerId, currentTime);
127
+ if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
128
+ this.scores.delete(peerId);
129
+ this.lastUpdateTime.delete(peerId);
130
+ } else {
131
+ this.scores.set(peerId, score);
132
+ this.lastUpdateTime.set(peerId, currentTime);
133
+ }
123
134
  }
124
135
  }
125
136
  }
126
137
 
138
+ /** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
139
+ resetAllScores(): void {
140
+ this.scores.clear();
141
+ this.lastUpdateTime.clear();
142
+ }
143
+
144
+ removePeer(peerId: string): void {
145
+ this.scores.delete(peerId);
146
+ this.lastUpdateTime.delete(peerId);
147
+ }
148
+
127
149
  getScore(peerId: string): number {
128
150
  return this.scores.get(peerId) || 0;
129
151
  }
@@ -46,7 +46,6 @@ Per-protocol size limits checked via preamble before decompression.
46
46
  | Error Type | Severity |
47
47
  |------------|----------|
48
48
  | GOODBYE subprotocol errors | None |
49
- | `CollectiveReqRespTimeoutError` / `InvalidResponseError` | None |
50
49
  | `AbortError` / connection close / muxer closed | None |
51
50
  | `ECONNRESET` / `EPIPE` / `ECONNREFUSED` / `ERR_UNEXPECTED_EOF` | HighToleranceError |
52
51
  | `ERR_UNSUPPORTED_PROTOCOL` | HighToleranceError |
@@ -183,19 +182,6 @@ Protected peers (private/trusted/preferred) are always considered "authenticated
183
182
 
184
183
  Conditional registration: BLOCK_TXS handler only registered when `config.disableTransactions` is false. Otherwise peers get `ERR_UNSUPPORTED_PROTOCOL`.
185
184
 
186
- **Requester side via `sendBatchRequest`** (Snappy limit: `max(N, 1) * 512 + 1` KB):
187
-
188
- | Rule | Consequence | File |
189
- |------|-------------|------|
190
- | Archive root must match request | MidToleranceError | `libp2p_service.ts` (`validateRequestedBlockTxs`) |
191
- | BitVector length must match request | MidToleranceError | same |
192
- | No duplicate tx hashes | MidToleranceError | same |
193
- | Tx count within bounds | MidToleranceError | same |
194
- | Local block proposal must exist for archive root | Rejected (no penalty) | same |
195
- | All tx hashes must be in proposal's tx list at allowed indices | LowToleranceError | same |
196
- | Txs in strictly increasing index order | LowToleranceError | same |
197
- | Each tx passes well-formedness (Metadata [4 fields], Size, Data, Proof) | LowToleranceError | same |
198
-
199
185
  **Requester side via `BatchTxRequester`** (separate validation path):
200
186
 
201
187
  | Rule | Consequence | File |
@@ -170,6 +170,37 @@ class BlockTxsResponse {
170
170
 
171
171
  The `BitVector` is a compact representation where each bit corresponds to a transaction index in the block proposal. This allows efficient capability advertisement without repeating full hashes.
172
172
 
173
+ ## Cancellation
174
+
175
+ All cancellation is managed by a single `RequestTracker` instance, shared across the entire collection
176
+ flow. The `RequestTracker` owns the deadline, tracks which txs are still missing, and exposes a
177
+ `cancellationToken` promise that resolves when the request should stop (deadline hit, all txs fetched,
178
+ or external `cancel()` call).
179
+
180
+ Cancellation propagates from the deepest stack level upward:
181
+
182
+ ```
183
+ RequestTracker.finish()
184
+ ├── resolves cancellationToken promise
185
+ │
186
+ ├── BatchTxRequester workers (deepest)
187
+ │ ├── shouldStop() checks requestTracker.cancelled → exit loop
188
+ │ ├── sleepClampedToDeadline races sleep vs cancellationToken → wakes
189
+ │ └── semaphore.acquire races vs cancellationToken → wakes
190
+ │ │
191
+ │ ▼ workers settle → txQueue.end() → generator returns
192
+ │
193
+ ├── Node collection loops
194
+ │ ├── notFinished() checks requestTracker.cancelled → exit loop
195
+ │ └── inter-retry sleep races vs cancellationToken → wakes
196
+ │ │
197
+ │ ▼ all node loops settle
198
+ │
199
+ └── collectFast (outermost)
200
+ awaits Promise.allSettled([reqresp, nodes]) → settles after inner tasks
201
+ finally: requestTracker.cancel() (idempotent), cleanup
202
+ ```
203
+
173
204
  ## Key Files
174
205
 
175
206
  | File | Description |
@@ -179,15 +210,16 @@ The `BitVector` is a compact representation where each bit corresponds to a tran
179
210
  | `peer_collection.ts` | Manages peer classification (dumb/smart/bad) and rate limiting |
180
211
  | `interface.ts` | Type definitions for dependencies |
181
212
  | `../protocols/block_txs/` | Wire protocol definitions (`BlockTxsRequest`, `BlockTxsResponse`, `BitVector`) |
213
+ | `../../tx_collection/request_tracker.ts` | Centralized deadline, missing tx tracking, and cancellation signal |
182
214
 
183
215
  ## Stopping Conditions
184
216
 
185
- The `BatchTxRequester` stops when any of these conditions are met:
217
+ The `BatchTxRequester` stops when any of these conditions are met, all managed by the `RequestTracker`:
186
218
 
187
- 1. **All transactions fetched** - Success!
188
- 2. **Deadline exceeded** - Timeout configured by caller
189
- 3. **Abort signal** - External cancellation
190
- 4. **No transactions to fetch** - Nothing was missing
219
+ 1. **All transactions fetched** - `markFetched()` removes the last missing tx, triggering `finish()`
220
+ 2. **Deadline exceeded** - `setTimeout` in `RequestTracker` fires, triggering `finish()`
221
+ 3. **External cancellation** - `RequestTracker.cancel()` called (e.g., from `stop()`, `stopCollectingForBlocksUpTo`)
222
+ 4. **No transactions to fetch** - Empty hash set at construction, `RequestTracker` finishes immediately
191
223
 
192
224
  ## Configuration
193
225
 
@@ -228,11 +260,15 @@ Request to peer fails
228
260
  ## Usage Example
229
261
 
230
262
  ```typescript
263
+ const requestTracker = RequestTracker.create(
264
+ missingTxHashes, // TxHash[] - what we need
265
+ new Date(Date.now() + 5_000), // deadline
266
+ );
267
+
231
268
  const requester = new BatchTxRequester(
232
- missingTxHashes, // TxHash[] - what we need
269
+ requestTracker, // IRequestTracker - tracks missing txs, deadline, and cancellation
233
270
  blockTxsSource, // BlockTxsSource - the proposal or block we need txs for
234
271
  pinnedPeer, // PeerId | undefined - peer expected to have the txs
235
- timeoutMs, // number - how long to try
236
272
  p2pService, // BatchTxRequesterLibP2PService
237
273
  );
238
274
 
@@ -273,6 +309,8 @@ const txs = await BatchTxRequester.collectAllTxs(requester.run());
273
309
  │ 1. Try RPC nodes first (fast) │ │ Periodic polling of RPC nodes │
274
310
  │ 2. Fall back to BatchTxRequester │ │ and peers for missing txs │
275
311
  │ │ │ │
312
+ │ Creates RequestTracker per │ │ │
313
+ │ request with deadline │ │ │
276
314
  └───────────────────┬───────────────┘ └─────────────────────────────────────┘
277
315
  │
278
316
  │ For 'proposal' and 'block' requests
@@ -281,6 +319,7 @@ const txs = await BatchTxRequester.collectAllTxs(requester.run());
281
319
  │ BatchTxRequester │
282
320
  │ │
283
321
  │ Aggressive parallel fetching from multiple peers │
322
+ │ Shares RequestTracker with FastTxCollection for unified cancellation │
284
323
  │ Uses BLOCK_TXS sub-protocol for efficient batching │
285
324
  └───────────────────┬─────────────────────────────────────────────────────────┘
286
325
  │