@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928

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 (483) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +5 -4
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +39 -16
  8. package/dest/client/interface.d.ts +52 -12
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +36 -20
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +142 -81
  13. package/dest/config.d.ts +163 -98
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +130 -20
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +272 -199
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +224 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +9 -4
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +28 -9
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  74. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +41 -9
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +55 -41
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +19 -4
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +86 -32
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +262 -131
  92. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  95. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  98. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -5
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
  101. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -5
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
  104. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +35 -10
  105. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/proposal_validator.js +128 -56
  107. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  108. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  111. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/allowed_public_setup.js +21 -32
  113. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  114. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  116. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  117. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  118. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  120. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  121. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  123. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  124. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  126. package/dest/msg_validators/tx_validator/factory.d.ts +25 -7
  127. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/factory.js +55 -16
  129. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  130. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  132. package/dest/msg_validators/tx_validator/gas_validator.d.ts +53 -7
  133. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  135. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  136. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/index.js +3 -0
  138. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  139. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  141. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  142. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
  144. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  147. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  148. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  149. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  150. package/dest/services/data_store.d.ts +1 -1
  151. package/dest/services/data_store.d.ts.map +1 -1
  152. package/dest/services/data_store.js +5 -5
  153. package/dest/services/discv5/discV5_service.d.ts +13 -2
  154. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  155. package/dest/services/discv5/discV5_service.js +119 -23
  156. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  157. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  158. package/dest/services/discv5/persisted_enr_store.js +145 -0
  159. package/dest/services/dummy_service.d.ts +18 -16
  160. package/dest/services/dummy_service.d.ts.map +1 -1
  161. package/dest/services/dummy_service.js +21 -16
  162. package/dest/services/encoding.d.ts +23 -6
  163. package/dest/services/encoding.d.ts.map +1 -1
  164. package/dest/services/encoding.js +32 -16
  165. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  166. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  167. package/dest/services/gossipsub/topic_score_params.js +4 -14
  168. package/dest/services/libp2p/instrumentation.d.ts +6 -1
  169. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  170. package/dest/services/libp2p/instrumentation.js +21 -0
  171. package/dest/services/libp2p/libp2p_service.d.ts +51 -51
  172. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  173. package/dest/services/libp2p/libp2p_service.js +499 -333
  174. package/dest/services/peer-manager/peer_manager.d.ts +31 -3
  175. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  176. package/dest/services/peer-manager/peer_manager.js +125 -25
  177. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  178. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  179. package/dest/services/peer-manager/peer_scoring.js +102 -13
  180. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  181. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  182. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +81 -86
  183. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  184. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  185. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  186. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  187. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  188. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  189. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  190. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  191. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  192. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  193. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  194. package/dest/services/reqresp/config.d.ts +15 -3
  195. package/dest/services/reqresp/config.d.ts.map +1 -1
  196. package/dest/services/reqresp/config.js +11 -0
  197. package/dest/services/reqresp/interface.d.ts +16 -18
  198. package/dest/services/reqresp/interface.d.ts.map +1 -1
  199. package/dest/services/reqresp/interface.js +10 -20
  200. package/dest/services/reqresp/metrics.d.ts +1 -1
  201. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  202. package/dest/services/reqresp/metrics.js +0 -1
  203. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  204. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  205. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  206. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  207. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  208. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  209. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  210. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  211. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  212. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  213. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/index.js +0 -1
  215. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  216. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  217. package/dest/services/reqresp/protocols/tx.js +1 -3
  218. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  219. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  220. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  221. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  222. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  223. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  224. package/dest/services/reqresp/reqresp.d.ts +7 -29
  225. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  226. package/dest/services/reqresp/reqresp.js +73 -215
  227. package/dest/services/service.d.ts +43 -18
  228. package/dest/services/service.d.ts.map +1 -1
  229. package/dest/services/tx_collection/config.d.ts +2 -23
  230. package/dest/services/tx_collection/config.d.ts.map +1 -1
  231. package/dest/services/tx_collection/config.js +2 -55
  232. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  233. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  234. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  235. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  236. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  237. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  238. package/dest/services/tx_collection/index.d.ts +2 -3
  239. package/dest/services/tx_collection/index.d.ts.map +1 -1
  240. package/dest/services/tx_collection/index.js +0 -1
  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 +0 -2
  244. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  245. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  246. package/dest/services/tx_collection/request_tracker.js +84 -0
  247. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  248. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  249. package/dest/services/tx_collection/tx_collection.js +275 -119
  250. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  251. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  252. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  253. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  254. package/dest/services/tx_collection/tx_source.js +13 -8
  255. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  256. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  257. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  258. package/dest/services/tx_provider.d.ts +3 -1
  259. package/dest/services/tx_provider.d.ts.map +1 -1
  260. package/dest/services/tx_provider.js +3 -0
  261. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  263. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  264. package/dest/test-helpers/mock-pubsub.d.ts +33 -9
  265. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  266. package/dest/test-helpers/mock-pubsub.js +57 -44
  267. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  268. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  269. package/dest/test-helpers/reqresp-nodes.js +16 -18
  270. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  271. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  272. package/dest/test-helpers/test_tx_provider.js +3 -0
  273. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  274. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  275. package/dest/test-helpers/testbench-utils.js +49 -15
  276. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  277. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  278. package/dest/testbench/p2p_client_testbench_worker.js +104 -41
  279. package/dest/testbench/worker_client_manager.d.ts +12 -6
  280. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  281. package/dest/testbench/worker_client_manager.js +57 -11
  282. package/dest/util.d.ts +12 -7
  283. package/dest/util.d.ts.map +1 -1
  284. package/dest/util.js +35 -14
  285. package/dest/versioning.d.ts +3 -6
  286. package/dest/versioning.d.ts.map +1 -1
  287. package/dest/versioning.js +3 -24
  288. package/package.json +17 -17
  289. package/src/bootstrap/bootstrap.ts +17 -3
  290. package/src/client/factory.ts +62 -9
  291. package/src/client/interface.ts +48 -18
  292. package/src/client/p2p_client.ts +159 -113
  293. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  294. package/src/config.ts +233 -20
  295. package/src/errors/p2p-service.error.ts +11 -0
  296. package/src/errors/reqresp.error.ts +13 -19
  297. package/src/index.ts +0 -1
  298. package/src/mem_pools/attestation_pool/attestation_pool.ts +327 -242
  299. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
  300. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  301. package/src/mem_pools/index.ts +0 -3
  302. package/src/mem_pools/instrumentation.ts +18 -12
  303. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  304. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
  305. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  306. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -5
  307. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
  308. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  309. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  310. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  311. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
  312. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
  313. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
  314. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  315. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  316. package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
  317. package/src/mem_pools/tx_pool_v2/interfaces.ts +40 -8
  318. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
  319. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
  320. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +107 -32
  321. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +291 -137
  322. package/src/msg_validators/attestation_validator/README.md +49 -0
  323. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  324. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  325. package/src/msg_validators/proposal_validator/README.md +123 -0
  326. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  327. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  328. package/src/msg_validators/proposal_validator/proposal_validator.ts +150 -58
  329. package/src/msg_validators/tx_validator/README.md +17 -3
  330. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  331. package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
  332. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  333. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  334. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  335. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  336. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  337. package/src/msg_validators/tx_validator/factory.ts +66 -9
  338. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  339. package/src/msg_validators/tx_validator/gas_validator.ts +117 -39
  340. package/src/msg_validators/tx_validator/index.ts +3 -0
  341. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  342. package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
  343. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  344. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  345. package/src/services/data_store.ts +5 -13
  346. package/src/services/discv5/discV5_service.ts +126 -14
  347. package/src/services/discv5/persisted_enr_store.ts +158 -0
  348. package/src/services/dummy_service.ts +26 -40
  349. package/src/services/encoding.ts +35 -19
  350. package/src/services/gossipsub/README.md +33 -11
  351. package/src/services/gossipsub/topic_score_params.ts +9 -18
  352. package/src/services/libp2p/instrumentation.ts +22 -0
  353. package/src/services/libp2p/libp2p_service.ts +560 -369
  354. package/src/services/peer-manager/peer_manager.ts +138 -24
  355. package/src/services/peer-manager/peer_scoring.ts +102 -8
  356. package/src/services/reqresp/README.md +194 -0
  357. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  358. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
  359. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  360. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  361. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  362. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  363. package/src/services/reqresp/config.ts +19 -2
  364. package/src/services/reqresp/interface.ts +21 -47
  365. package/src/services/reqresp/metrics.ts +0 -1
  366. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  367. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  368. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  369. package/src/services/reqresp/protocols/index.ts +0 -1
  370. package/src/services/reqresp/protocols/tx.ts +1 -3
  371. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  372. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  373. package/src/services/reqresp/reqresp.ts +84 -259
  374. package/src/services/service.ts +51 -35
  375. package/src/services/tx_collection/config.ts +3 -80
  376. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  377. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  378. package/src/services/tx_collection/index.ts +1 -6
  379. package/src/services/tx_collection/instrumentation.ts +1 -7
  380. package/src/services/tx_collection/request_tracker.ts +127 -0
  381. package/src/services/tx_collection/tx_collection.ts +331 -176
  382. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  383. package/src/services/tx_collection/tx_source.ts +10 -8
  384. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  385. package/src/services/tx_provider.ts +5 -0
  386. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  387. package/src/test-helpers/mock-pubsub.ts +61 -60
  388. package/src/test-helpers/reqresp-nodes.ts +13 -23
  389. package/src/test-helpers/test_tx_provider.ts +5 -0
  390. package/src/test-helpers/testbench-utils.ts +63 -28
  391. package/src/testbench/p2p_client_testbench_worker.ts +111 -57
  392. package/src/testbench/worker_client_manager.ts +72 -25
  393. package/src/util.ts +33 -18
  394. package/src/versioning.ts +3 -33
  395. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  396. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  397. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  398. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  399. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  400. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  401. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  402. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  403. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  404. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  405. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  406. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  407. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  408. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  409. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  410. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  411. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  412. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  413. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  414. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  415. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  416. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  417. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  418. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  419. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  420. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  421. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  422. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  423. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  424. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  425. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  426. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  427. package/dest/mem_pools/tx_pool/index.js +0 -2
  428. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  429. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  430. package/dest/mem_pools/tx_pool/priority.js +0 -15
  431. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  432. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  433. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  434. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  435. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  436. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  437. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  438. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  439. package/dest/msg_validators/clock_tolerance.js +0 -37
  440. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  441. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  442. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  443. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  444. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  445. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  446. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  447. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  448. package/dest/services/reqresp/protocols/block.js +0 -32
  449. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  450. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  451. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  452. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  453. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  454. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  455. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  456. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  457. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  458. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  459. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  460. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  461. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  462. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  463. package/src/mem_pools/tx_pool/README.md +0 -270
  464. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  465. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  466. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  467. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  468. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  469. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  470. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  471. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  472. package/src/mem_pools/tx_pool/index.ts +0 -2
  473. package/src/mem_pools/tx_pool/priority.ts +0 -20
  474. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  475. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  476. package/src/msg_validators/clock_tolerance.ts +0 -51
  477. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
  478. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  479. package/src/services/reqresp/protocols/block.ts +0 -37
  480. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  481. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  482. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  483. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,12 +1,12 @@
1
+ import { minBigint } from '@aztec/foundation/bigint';
1
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
5
  import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
5
- import { Gas } from '@aztec/stdlib/gas';
6
+ import { Gas, GasFees } from '@aztec/stdlib/gas';
6
7
  import { type Tx, TxHash } from '@aztec/stdlib/tx';
7
8
 
8
9
  import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
9
- import { getTxPriorityFee } from '../tx_pool/priority.js';
10
10
  import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
11
11
 
12
12
  /** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
@@ -23,7 +23,7 @@ export type TxMetaValidationData = {
23
23
  };
24
24
  };
25
25
  txContext: {
26
- gasSettings: { gasLimits: Gas };
26
+ gasSettings: { gasLimits: Gas; maxFeesPerGas: GasFees };
27
27
  };
28
28
  };
29
29
  };
@@ -67,6 +67,9 @@ export type TxMetaData = {
67
67
  /** Timestamp by which the transaction must be included (for expiration checks) */
68
68
  readonly expirationTimestamp: bigint;
69
69
 
70
+ /** Whether the tx's setup-phase calls pass the allow list check. Computed at receipt time. */
71
+ readonly allowedSetupCalls: boolean;
72
+
70
73
  /** Validator-compatible data, providing the same access patterns as Tx.data */
71
74
  readonly data: TxMetaValidationData;
72
75
 
@@ -84,8 +87,12 @@ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
84
87
  * Builds TxMetaData from a full Tx object.
85
88
  * Extracts all relevant fields for efficient in-memory storage and querying.
86
89
  * Fr values are captured in closures for zero-cost re-validation.
90
+ *
91
+ * @param allowedSetupCalls - Whether the tx's setup-phase calls pass the allow list.
92
+ * For gossip/RPC txs this is always `true` (already validated by PhasesTxValidator).
93
+ * For req/resp txs this should be computed by the caller using the phases validator.
87
94
  */
88
- export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
95
+ export async function buildTxMetaData(tx: Tx, allowedSetupCalls: boolean = true): Promise<TxMetaData> {
89
96
  const txHashObj = tx.getTxHash();
90
97
  const txHash = txHashObj.toString();
91
98
  const txHashBigInt = txHashObj.toBigInt();
@@ -112,6 +119,7 @@ export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
112
119
  feeLimit,
113
120
  nullifiers,
114
121
  expirationTimestamp,
122
+ allowedSetupCalls,
115
123
  receivedAt: 0,
116
124
  estimatedSizeBytes,
117
125
  data: {
@@ -124,7 +132,10 @@ export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
124
132
  globalVariables: { blockNumber: anchorBlockNumber },
125
133
  },
126
134
  txContext: {
127
- gasSettings: { gasLimits: tx.data.constants.txContext.gasSettings.gasLimits },
135
+ gasSettings: {
136
+ gasLimits: tx.data.constants.txContext.gasSettings.gasLimits,
137
+ maxFeesPerGas: tx.data.constants.txContext.gasSettings.maxFeesPerGas,
138
+ },
128
139
  },
129
140
  },
130
141
  },
@@ -158,13 +169,13 @@ export function txHashFromBigInt(value: bigint): string {
158
169
  }
159
170
 
160
171
  /** Minimal fields required for priority comparison. */
161
- type PriorityComparable = Pick<TxMetaData, 'txHashBigInt' | 'priorityFee'>;
172
+ export type PriorityComparable = Pick<TxMetaData, 'txHash' | 'txHashBigInt' | 'priorityFee'>;
162
173
 
163
174
  /**
164
175
  * Compares two priority fees in ascending order.
165
176
  * Returns negative if a < b, positive if a > b, 0 if equal.
166
177
  */
167
- export function compareFee(a: bigint, b: bigint): number {
178
+ export function compareFee(a: bigint, b: bigint): -1 | 0 | 1 {
168
179
  return a < b ? -1 : a > b ? 1 : 0;
169
180
  }
170
181
 
@@ -173,7 +184,7 @@ export function compareFee(a: bigint, b: bigint): number {
173
184
  * Uses field element comparison for deterministic ordering.
174
185
  * Returns negative if a < b, positive if a > b, 0 if equal.
175
186
  */
176
- export function compareTxHash(a: bigint, b: bigint): number {
187
+ export function compareTxHash(a: bigint, b: bigint): -1 | 0 | 1 {
177
188
  return Fr.cmpAsBigInt(a, b);
178
189
  }
179
190
 
@@ -182,7 +193,7 @@ export function compareTxHash(a: bigint, b: bigint): number {
182
193
  * Returns negative if a < b, positive if a > b, 0 if equal.
183
194
  * Use with sort() for ascending order, or negate/reverse for descending.
184
195
  */
185
- export function comparePriority(a: PriorityComparable, b: PriorityComparable): number {
196
+ export function comparePriority(a: PriorityComparable, b: PriorityComparable): -1 | 0 | 1 {
186
197
  const feeComparison = compareFee(a.priorityFee, b.priorityFee);
187
198
  if (feeComparison !== 0) {
188
199
  return feeComparison;
@@ -190,21 +201,38 @@ export function comparePriority(a: PriorityComparable, b: PriorityComparable): n
190
201
  return compareTxHash(a.txHashBigInt, b.txHashBigInt);
191
202
  }
192
203
 
204
+ /**
205
+ * Returns the minimum fee required to replace an existing tx with the given price bump percentage.
206
+ * Uses integer arithmetic: `existingFee + existingFee * priceBumpPercentage / 100`.
207
+ */
208
+ export function getMinimumPriceBumpFee(existingFee: bigint, priceBumpPercentage: bigint): bigint {
209
+ const bump = (existingFee * priceBumpPercentage) / 100n;
210
+ // Ensure the minimum bump is at least 1, so that replacement always requires
211
+ // paying strictly more — even with 0% bump or zero existing fee.
212
+ const effectiveBump = bump > 0n ? bump : 1n;
213
+ return existingFee + effectiveBump;
214
+ }
215
+
193
216
  /**
194
217
  * Checks for nullifier conflicts between an incoming transaction and existing pool state.
195
218
  *
196
219
  * When the incoming tx shares nullifiers with existing pending txs:
197
- * - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
198
- * - If any conflicting tx has equal or higher priority, ignore the incoming tx
220
+ * - If the incoming tx meets or exceeds the required priority, mark conflicting txs for eviction
221
+ * - Otherwise, ignore the incoming tx
222
+ *
223
+ * When `priceBumpPercentage` is provided (RPC path), uses fee-only comparison with the
224
+ * percentage bump instead of `comparePriority`.
199
225
  *
200
226
  * @param incomingMeta - Metadata for the incoming transaction
201
227
  * @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
202
228
  * @param getMetadata - Accessor to get metadata for a tx hash
229
+ * @param priceBumpPercentage - Optional percentage bump required for fee-based replacement
203
230
  */
204
231
  export function checkNullifierConflict(
205
232
  incomingMeta: TxMetaData,
206
233
  getTxHashByNullifier: (nullifier: string) => string | undefined,
207
234
  getMetadata: (txHash: string) => TxMetaData | undefined,
235
+ priceBumpPercentage?: bigint,
208
236
  ): PreAddResult {
209
237
  const txHashesToEvict: string[] = [];
210
238
 
@@ -225,19 +253,32 @@ export function checkNullifierConflict(
225
253
  continue;
226
254
  }
227
255
 
228
- // If incoming tx has strictly higher priority, mark for eviction
229
- // Otherwise, ignore incoming tx (ties go to existing tx)
230
- // Use comparePriority for deterministic ordering (includes txHash as tiebreaker)
231
- if (comparePriority(incomingMeta, conflictingMeta) > 0) {
256
+ // When price bump is set (RPC path), require the incoming fee to meet the bumped threshold.
257
+ // Otherwise (P2P path), use full comparePriority with tx hash tiebreaker.
258
+ const isHigherPriority =
259
+ priceBumpPercentage !== undefined
260
+ ? incomingMeta.priorityFee >= getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
261
+ : comparePriority(incomingMeta, conflictingMeta) > 0;
262
+
263
+ if (isHigherPriority) {
232
264
  txHashesToEvict.push(conflictingHashStr);
233
265
  } else {
266
+ const minimumFee =
267
+ priceBumpPercentage !== undefined
268
+ ? getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
269
+ : undefined;
234
270
  return {
235
271
  shouldIgnore: true,
236
272
  txHashesToEvict: [],
237
273
  reason: {
238
274
  code: TxPoolRejectionCode.NULLIFIER_CONFLICT,
239
- message: `Nullifier conflict with existing tx ${conflictingHashStr}`,
275
+ message:
276
+ minimumFee !== undefined
277
+ ? `Nullifier conflict with existing tx ${conflictingHashStr}. Minimum required fee: ${minimumFee}, got: ${incomingMeta.priorityFee}`
278
+ : `Nullifier conflict with existing tx ${conflictingHashStr}`,
240
279
  conflictingTxHash: conflictingHashStr,
280
+ minimumPriceBumpFee: minimumFee,
281
+ txPriorityFee: minimumFee !== undefined ? incomingMeta.priorityFee : undefined,
241
282
  },
242
283
  };
243
284
  }
@@ -247,17 +288,19 @@ export function checkNullifierConflict(
247
288
  }
248
289
 
249
290
  /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
250
- export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigint } = {}): TxMetaValidationData {
291
+ export function stubTxMetaValidationData(
292
+ overrides: { expirationTimestamp?: bigint; maxFeesPerGas?: GasFees } = {},
293
+ ): TxMetaValidationData {
251
294
  return {
252
295
  getNonEmptyNullifiers: () => [],
253
296
  expirationTimestamp: overrides.expirationTimestamp ?? 0n,
254
297
  constants: {
255
298
  anchorBlockHeader: {
256
- hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
299
+ hash: () => Promise.resolve(BlockHash.ZERO),
257
300
  globalVariables: { blockNumber: BlockNumber(0) },
258
301
  },
259
302
  txContext: {
260
- gasSettings: { gasLimits: Gas.empty() },
303
+ gasSettings: { gasLimits: Gas.empty(), maxFeesPerGas: overrides.maxFeesPerGas ?? GasFees.empty() },
261
304
  },
262
305
  },
263
306
  };
@@ -274,6 +317,8 @@ export function stubTxMetaData(
274
317
  nullifiers?: string[];
275
318
  expirationTimestamp?: bigint;
276
319
  anchorBlockHeaderHash?: string;
320
+ allowedSetupCalls?: boolean;
321
+ maxFeesPerGas?: GasFees;
277
322
  } = {},
278
323
  ): TxMetaData {
279
324
  const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
@@ -290,8 +335,15 @@ export function stubTxMetaData(
290
335
  feeLimit: overrides.feeLimit ?? 100n,
291
336
  nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
292
337
  expirationTimestamp,
338
+ allowedSetupCalls: overrides.allowedSetupCalls ?? true,
293
339
  receivedAt: 0,
294
340
  estimatedSizeBytes: 0,
295
- data: stubTxMetaValidationData({ expirationTimestamp }),
341
+ data: stubTxMetaValidationData({ expirationTimestamp, maxFeesPerGas: overrides.maxFeesPerGas }),
296
342
  };
297
343
  }
344
+
345
+ /** Returns the priority fee for a tx, based on the L2 priority fee capped by the max fee per gas. */
346
+ function getTxPriorityFee(tx: Tx): bigint {
347
+ const { maxPriorityFeesPerGas: priorityFees, maxFeesPerGas } = tx.getGasSettings();
348
+ return minBigint(maxFeesPerGas.feePerL2Gas, priorityFees.feePerL2Gas);
349
+ }
@@ -1,7 +1,8 @@
1
+ import { insertIntoSortedArray, removeFromSortedArray } from '@aztec/foundation/array';
1
2
  import { SlotNumber } from '@aztec/foundation/branded-types';
2
3
  import type { L2BlockId } from '@aztec/stdlib/block';
3
4
 
4
- import { type TxMetaData, type TxState, compareFee, compareTxHash, txHashFromBigInt } from './tx_metadata.js';
5
+ import { type PriorityComparable, type TxMetaData, type TxState, comparePriority } from './tx_metadata.js';
5
6
 
6
7
  /**
7
8
  * Manages in-memory indices for the transaction pool.
@@ -22,8 +23,8 @@ export class TxPoolIndices {
22
23
  #nullifierToTxHash: Map<string, string> = new Map();
23
24
  /** Fee payer to txHashes index (pending txs only) */
24
25
  #feePayerToTxHashes: Map<string, Set<string>> = new Map();
25
- /** Pending txHash bigints grouped by priority fee */
26
- #pendingByPriority: Map<bigint, Set<bigint>> = new Map();
26
+ /** Pending transactions sorted ascending by priority fee, ties broken by txHash */
27
+ #pendingByPriority: PriorityComparable[] = [];
27
28
  /** Protected transactions: txHash -> slotNumber */
28
29
  #protectedTransactions: Map<string, SlotNumber> = new Map();
29
30
 
@@ -73,20 +74,14 @@ export class TxPoolIndices {
73
74
  * @param order - 'desc' for highest priority first, 'asc' for lowest priority first
74
75
  */
75
76
  *iteratePendingByPriority(order: 'asc' | 'desc', filter?: (hash: string) => boolean): Generator<string> {
76
- const feeCompareFn = order === 'desc' ? (a: bigint, b: bigint) => compareFee(b, a) : compareFee;
77
- const hashCompareFn =
78
- order === 'desc' ? (a: bigint, b: bigint) => compareTxHash(b, a) : (a: bigint, b: bigint) => compareTxHash(a, b);
79
-
80
- const sortedFees = [...this.#pendingByPriority.keys()].sort(feeCompareFn);
81
-
82
- for (const fee of sortedFees) {
83
- const hashesAtFee = this.#pendingByPriority.get(fee)!;
84
- const sortedHashes = [...hashesAtFee].sort(hashCompareFn);
85
- for (const hashBigInt of sortedHashes) {
86
- const hash = txHashFromBigInt(hashBigInt);
87
- if (filter === undefined || filter(hash)) {
88
- yield hash;
89
- }
77
+ const arr = this.#pendingByPriority;
78
+ const start = order === 'asc' ? 0 : arr.length - 1;
79
+ const step = order === 'asc' ? 1 : -1;
80
+ const inBounds = order === 'asc' ? (i: number) => i < arr.length : (i: number) => i >= 0;
81
+
82
+ for (let i = start; inBounds(i); i += step) {
83
+ if (filter === undefined || filter(arr[i].txHash)) {
84
+ yield arr[i].txHash;
90
85
  }
91
86
  }
92
87
  }
@@ -136,6 +131,9 @@ export class TxPoolIndices {
136
131
  meta.minedL2BlockId = blockId;
137
132
  // Safe to call unconditionally - removeFromPendingIndices is idempotent
138
133
  this.#removeFromPendingIndices(meta);
134
+ // A mined tx supersedes any protection: drop the stale entry so it can't linger in the map and
135
+ // be matched by later protection scans.
136
+ this.#protectedTransactions.delete(meta.txHash);
139
137
  }
140
138
 
141
139
  /** Clears the mined status from a transaction */
@@ -227,11 +225,30 @@ export class TxPoolIndices {
227
225
 
228
226
  /** Gets the count of pending transactions */
229
227
  getPendingTxCount(): number {
228
+ return this.#pendingByPriority.length;
229
+ }
230
+
231
+ /**
232
+ * Returns whether at least `minCount` pending transactions were received at or before maxReceivedAt,
233
+ * i.e. are old enough to be eligible for block building. Stops as soon as the threshold is met, so it
234
+ * does not scan the whole pool when only a handful of eligible txs are needed. The total pending count
235
+ * is an upper bound on the eligible count, so a pool with fewer than `minCount` pending can never
236
+ * satisfy the threshold and short-circuits without scanning.
237
+ */
238
+ hasEligiblePendingTxs(maxReceivedAt: number, minCount: number): boolean {
239
+ if (minCount <= 0) {
240
+ return true;
241
+ }
242
+ if (this.#pendingByPriority.length < minCount) {
243
+ return false;
244
+ }
230
245
  let count = 0;
231
- for (const hashes of this.#pendingByPriority.values()) {
232
- count += hashes.size;
246
+ for (const _ of this.iterateEligiblePendingByPriority('desc', maxReceivedAt)) {
247
+ if (++count >= minCount) {
248
+ return true;
249
+ }
233
250
  }
234
- return count;
251
+ return false;
235
252
  }
236
253
 
237
254
  /** Gets the lowest priority pending transaction hashes (up to limit) */
@@ -264,12 +281,10 @@ export class TxPoolIndices {
264
281
  /** Gets all pending transactions */
265
282
  getPendingTxs(): TxMetaData[] {
266
283
  const result: TxMetaData[] = [];
267
- for (const hashSet of this.#pendingByPriority.values()) {
268
- for (const txHashBigInt of hashSet) {
269
- const meta = this.#metadata.get(txHashFromBigInt(txHashBigInt));
270
- if (meta) {
271
- result.push(meta);
272
- }
284
+ for (const entry of this.#pendingByPriority) {
285
+ const meta = this.#metadata.get(entry.txHash);
286
+ if (meta) {
287
+ result.push(meta);
273
288
  }
274
289
  }
275
290
  return result;
@@ -327,6 +342,15 @@ export class TxPoolIndices {
327
342
  return result;
328
343
  }
329
344
 
345
+ /**
346
+ * From the given hashes, returns those whose protection is recorded at exactly the given slot.
347
+ * Used to release the protections a single block proposal created without disturbing entries a
348
+ * later proposal raised to a higher slot via updateProtection.
349
+ */
350
+ findProtectedTxsAtSlot(txHashes: string[], slotNumber: SlotNumber): string[] {
351
+ return txHashes.filter(txHash => this.#protectedTransactions.get(txHash) === slotNumber);
352
+ }
353
+
330
354
  /** Filters out transactions that are currently protected */
331
355
  filterUnprotected(txs: TxMetaData[]): TxMetaData[] {
332
356
  return txs.filter(meta => !this.#protectedTransactions.has(meta.txHash));
@@ -408,13 +432,12 @@ export class TxPoolIndices {
408
432
  }
409
433
  feePayerSet.add(meta.txHash);
410
434
 
411
- // Add to priority bucket
412
- let prioritySet = this.#pendingByPriority.get(meta.priorityFee);
413
- if (!prioritySet) {
414
- prioritySet = new Set();
415
- this.#pendingByPriority.set(meta.priorityFee, prioritySet);
416
- }
417
- prioritySet.add(meta.txHashBigInt);
435
+ insertIntoSortedArray(
436
+ this.#pendingByPriority,
437
+ { txHash: meta.txHash, priorityFee: meta.priorityFee, txHashBigInt: meta.txHashBigInt },
438
+ comparePriority,
439
+ false,
440
+ );
418
441
  }
419
442
 
420
443
  #removeFromPendingIndices(meta: TxMetaData): void {
@@ -432,13 +455,11 @@ export class TxPoolIndices {
432
455
  }
433
456
  }
434
457
 
435
- // Remove from priority map
436
- const hashSet = this.#pendingByPriority.get(meta.priorityFee);
437
- if (hashSet) {
438
- hashSet.delete(meta.txHashBigInt);
439
- if (hashSet.size === 0) {
440
- this.#pendingByPriority.delete(meta.priorityFee);
441
- }
442
- }
458
+ // Remove from priority array
459
+ removeFromSortedArray(
460
+ this.#pendingByPriority,
461
+ { txHash: meta.txHash, priorityFee: meta.priorityFee, txHashBigInt: meta.txHashBigInt },
462
+ comparePriority,
463
+ );
443
464
  }
444
465
  }
@@ -1,7 +1,8 @@
1
1
  import { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { chunk } from '@aztec/foundation/collection';
2
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
4
  import { SerialQueue } from '@aztec/foundation/queue';
4
- import { DateProvider } from '@aztec/foundation/timer';
5
+ import { DateProvider, Timer } from '@aztec/foundation/timer';
5
6
  import type { TypedEventEmitter } from '@aztec/foundation/types';
6
7
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
7
8
  import type { L2Block, L2BlockId } from '@aztec/stdlib/block';
@@ -11,9 +12,18 @@ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-clien
11
12
  import EventEmitter from 'node:events';
12
13
 
13
14
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
14
- import type { AddTxsResult, TxPoolV2, TxPoolV2Config, TxPoolV2Dependencies, TxPoolV2Events } from './interfaces.js';
15
+ import { TxPoolQueueInstrumentation } from './instrumentation.js';
16
+ import type {
17
+ AddTxsResult,
18
+ PoolReadAccess,
19
+ TxPoolV2,
20
+ TxPoolV2Config,
21
+ TxPoolV2Dependencies,
22
+ TxPoolV2Events,
23
+ } from './interfaces.js';
15
24
  import type { TxState } from './tx_metadata.js';
16
- import { TxPoolV2Impl } from './tx_pool_v2_impl.js';
25
+ import type { MinedTxInfo } from './tx_pool_v2_impl.js';
26
+ import { FINALIZE_BLOCK_CHUNK_SIZE, TxPoolV2Impl } from './tx_pool_v2_impl.js';
17
27
 
18
28
  /**
19
29
  * Implementation of TxPoolV2 with explicit state management.
@@ -23,6 +33,9 @@ import { TxPoolV2Impl } from './tx_pool_v2_impl.js';
23
33
  */
24
34
  export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitter<TxPoolV2Events>) implements TxPoolV2 {
25
35
  #queue: SerialQueue;
36
+ #queueMetrics: TxPoolQueueInstrumentation;
37
+ /** Serializes finalizations so their chunked #queue items never interleave with each other. */
38
+ #finalizationQueue = new SerialQueue();
26
39
  #impl: TxPoolV2Impl;
27
40
  #metrics?: PoolInstrumentation<Tx>;
28
41
  #store: AztecAsyncKVStore;
@@ -45,21 +58,27 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
45
58
  this.#telemetry = telemetry;
46
59
  this.#log = log;
47
60
  this.#queue = new SerialQueue();
61
+ this.#queueMetrics = new TxPoolQueueInstrumentation(telemetry, () => this.#queue.length());
48
62
 
49
63
  // Create callbacks that the impl uses to notify us about events and metrics
50
64
  const callbacks = {
51
65
  onTxsAdded: (txs: Tx[], opts: { source?: string }) => {
52
- this.#metrics?.transactionsAdded(txs);
53
66
  this.emit('txs-added', { txs, ...opts });
54
67
  },
55
68
  onTxsRemoved: (txHashes: string[] | bigint[]) => {
56
- this.#metrics?.transactionsRemoved(txHashes);
57
69
  // Convert to TxHash objects for the event
58
70
  const hashes = txHashes.map(h => (typeof h === 'string' ? TxHash.fromString(h) : TxHash.fromBigInt(h)));
59
71
  this.emit('txs-removed', { txHashes: hashes });
60
72
  },
61
- onTxsMined: (txHashes: string[]) => {
62
- this.#metrics?.transactionsRemoved(txHashes);
73
+ onTxsMined: (minedTxs: MinedTxInfo[]) => {
74
+ // Pending-to-mined delay is derived from the tx's persisted receivedAt at the mined
75
+ // transition (see TxPoolV2Impl.handleMinedBlock), not the add/remove timestamp map —
76
+ // so eviction no longer pollutes MEMPOOL_TX_MINED_DELAY.
77
+ for (const { minedDelayMs } of minedTxs) {
78
+ if (minedDelayMs !== undefined) {
79
+ this.#metrics?.recordMinedDelay(minedDelayMs);
80
+ }
81
+ }
63
82
  },
64
83
  };
65
84
 
@@ -71,98 +90,151 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
71
90
  // PUBLIC API - All methods queue to the implementation
72
91
  // ============================================================================
73
92
 
93
+ /**
94
+ * Enqueues an operation on the serial queue, recording how long it waited behind other queued
95
+ * work and how long it took to execute once running.
96
+ */
97
+ #run<T>(operation: string, fn: () => T | Promise<T>): Promise<Awaited<T>> {
98
+ const waitTimer = new Timer();
99
+ return this.#queue.put(async () => {
100
+ const waitMs = waitTimer.ms();
101
+ const executionTimer = new Timer();
102
+ try {
103
+ return await fn();
104
+ } finally {
105
+ this.#queueMetrics.record(operation, waitMs, executionTimer.ms());
106
+ }
107
+ });
108
+ }
109
+
74
110
  // === Core Operations ===
75
111
 
76
112
  addPendingTxs(txs: Tx[], opts: { source?: string; feeComparisonOnly?: boolean } = {}): Promise<AddTxsResult> {
77
- return this.#queue.put(() => this.#impl.addPendingTxs(txs, opts));
113
+ return this.#run('addPendingTxs', () => this.#impl.addPendingTxs(txs, opts));
78
114
  }
79
115
 
80
116
  canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> {
81
- return this.#queue.put(() => this.#impl.canAddPendingTx(tx));
117
+ return this.#run('canAddPendingTx', () => this.#impl.canAddPendingTx(tx));
82
118
  }
83
119
 
84
120
  addProtectedTxs(txs: Tx[], block: BlockHeader, opts: { source?: string } = {}): Promise<void> {
85
- return this.#queue.put(() => this.#impl.addProtectedTxs(txs, block, opts));
121
+ return this.#run('addProtectedTxs', () => this.#impl.addProtectedTxs(txs, block, opts));
86
122
  }
87
123
 
88
124
  protectTxs(txHashes: TxHash[], block: BlockHeader): Promise<TxHash[]> {
89
- return this.#queue.put(() => this.#impl.protectTxs(txHashes, block));
125
+ return this.#run('protectTxs', () => this.#impl.protectTxs(txHashes, block));
90
126
  }
91
127
 
92
128
  addMinedTxs(txs: Tx[], block: BlockHeader, opts: { source?: string } = {}): Promise<void> {
93
- return this.#queue.put(() => this.#impl.addMinedTxs(txs, block, opts));
129
+ return this.#run('addMinedTxs', () => this.#impl.addMinedTxs(txs, block, opts));
94
130
  }
95
131
 
96
132
  // === State Transition Handlers ===
97
133
 
98
134
  handleMinedBlock(block: L2Block): Promise<void> {
99
- return this.#queue.put(() => this.#impl.handleMinedBlock(block));
135
+ return this.#run('handleMinedBlock', () => this.#impl.handleMinedBlock(block));
100
136
  }
101
137
 
102
138
  prepareForSlot(slotNumber: SlotNumber): Promise<void> {
103
- return this.#queue.put(() => this.#impl.prepareForSlot(slotNumber));
139
+ return this.#run('prepareForSlot', () => this.#impl.prepareForSlot(slotNumber));
140
+ }
141
+
142
+ unprotectTxs(txHashes: TxHash[], slotNumber: SlotNumber): Promise<void> {
143
+ return this.#run('unprotectTxs', () => this.#impl.unprotectTxs(txHashes, slotNumber));
104
144
  }
105
145
 
106
146
  handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void> {
107
- return this.#queue.put(() => this.#impl.handlePrunedBlocks(latestBlock, options));
147
+ return this.#run('handlePrunedBlocks', () => this.#impl.handlePrunedBlocks(latestBlock, options));
108
148
  }
109
149
 
110
150
  handleFailedExecution(txHashes: TxHash[]): Promise<void> {
111
- return this.#queue.put(() => this.#impl.handleFailedExecution(txHashes));
151
+ return this.#run('handleFailedExecution', () => this.#impl.handleFailedExecution(txHashes));
112
152
  }
113
153
 
154
+ /**
155
+ * Handles a finalized block by archiving and deleting the mined txs it finalizes. The work is
156
+ * split into chunk-sized serial-queue items rather than one long-running item, so gossip-driven
157
+ * pool operations (canAddPendingTx / addPendingTxs) interleave with finalization instead of
158
+ * stalling behind an entire epoch's worth of tx processing. Finalizations run on their own serial
159
+ * queue so two concurrent calls never interleave their chunks with each other.
160
+ */
114
161
  handleFinalizedBlock(block: BlockHeader): Promise<void> {
115
- return this.#queue.put(() => this.#impl.handleFinalizedBlock(block));
162
+ return this.#finalizationQueue.put(() => this.#handleFinalizedBlock(block));
163
+ }
164
+
165
+ async #handleFinalizedBlock(block: BlockHeader): Promise<void> {
166
+ const { cutoffBlock, txHashes } = await this.#run('prepareFinalization', () =>
167
+ this.#impl.prepareFinalization(block),
168
+ );
169
+ const batches = chunk(txHashes, FINALIZE_BLOCK_CHUNK_SIZE);
170
+ for (const batch of batches) {
171
+ await this.#run('archiveFinalizedTxs', () => this.#impl.archiveFinalizedTxs(batch));
172
+ }
173
+ for (const batch of batches) {
174
+ await this.#run('deleteFinalizedTxs', () => this.#impl.deleteFinalizedTxs(batch, cutoffBlock));
175
+ }
176
+ await this.#run('completeFinalization', () =>
177
+ this.#impl.completeFinalization(txHashes, cutoffBlock, block.globalVariables.blockNumber),
178
+ );
116
179
  }
117
180
 
118
181
  // === Queries ===
119
182
 
120
- getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
121
- return this.#queue.put(() => this.#impl.getTxByHash(txHash));
183
+ getTxByHash(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
184
+ return this.#run('getTxByHash', () => this.#impl.getTxByHash(txHash, opts));
122
185
  }
123
186
 
124
- getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
125
- return this.#queue.put(() => this.#impl.getTxsByHash(txHashes));
187
+ getTxsByHash(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
188
+ return this.#run('getTxsByHash', () => this.#impl.getTxsByHash(txHashes, opts));
126
189
  }
127
190
 
128
191
  hasTxs(txHashes: TxHash[]): Promise<boolean[]> {
129
- return this.#queue.put(() => this.#impl.hasTxs(txHashes));
192
+ return this.#run('hasTxs', () => this.#impl.hasTxs(txHashes));
130
193
  }
131
194
 
132
195
  getTxStatus(txHash: TxHash): Promise<TxState | 'deleted' | undefined> {
133
- return this.#queue.put(() => Promise.resolve(this.#impl.getTxStatus(txHash)));
196
+ return this.#run('getTxStatus', () => this.#impl.getTxStatus(txHash));
134
197
  }
135
198
 
136
199
  getPendingTxHashes(): Promise<TxHash[]> {
137
- return this.#queue.put(() => Promise.resolve(this.#impl.getPendingTxHashes()));
200
+ return this.#run('getPendingTxHashes', () => this.#impl.getPendingTxHashes());
138
201
  }
139
202
 
140
203
  getEligiblePendingTxHashes(): Promise<TxHash[]> {
141
- return this.#queue.put(() => Promise.resolve(this.#impl.getEligiblePendingTxHashes()));
204
+ return this.#run('getEligiblePendingTxHashes', () => this.#impl.getEligiblePendingTxHashes());
142
205
  }
143
206
 
144
207
  getPendingTxCount(): Promise<number> {
145
- return this.#queue.put(() => Promise.resolve(this.#impl.getPendingTxCount()));
208
+ return this.#run('getPendingTxCount', () => this.#impl.getPendingTxCount());
209
+ }
210
+
211
+ hasEligiblePendingTxs(minCount: number): Promise<boolean> {
212
+ return this.#run('hasEligiblePendingTxs', () => this.#impl.hasEligiblePendingTxs(minCount));
146
213
  }
147
214
 
148
215
  getMinedTxHashes(): Promise<[TxHash, L2BlockId][]> {
149
- return this.#queue.put(() => Promise.resolve(this.#impl.getMinedTxHashes()));
216
+ return this.#run('getMinedTxHashes', () => this.#impl.getMinedTxHashes());
150
217
  }
151
218
 
152
219
  getMinedTxCount(): Promise<number> {
153
- return this.#queue.put(() => Promise.resolve(this.#impl.getMinedTxCount()));
220
+ return this.#run('getMinedTxCount', () => this.#impl.getMinedTxCount());
154
221
  }
155
222
 
156
223
  isEmpty(): Promise<boolean> {
157
- return this.#queue.put(() => Promise.resolve(this.#impl.isEmpty()));
224
+ return this.#run('isEmpty', () => this.#impl.isEmpty());
158
225
  }
159
226
 
160
227
  getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined> {
161
- return this.#queue.put(() => this.#impl.getArchivedTxByHash(txHash));
228
+ return this.#run('getArchivedTxByHash', () => this.#impl.getArchivedTxByHash(txHash));
162
229
  }
163
230
 
164
231
  getLowestPriorityPending(limit: number): Promise<TxHash[]> {
165
- return this.#queue.put(() => Promise.resolve(this.#impl.getLowestPriorityPending(limit)));
232
+ return this.#run('getLowestPriorityPending', () => this.#impl.getLowestPriorityPending(limit));
233
+ }
234
+
235
+ /** Returns read-only access to the pool. Used for testing. */
236
+ getPoolReadAccess(): PoolReadAccess {
237
+ return this.#impl.getPoolReadAccess();
166
238
  }
167
239
 
168
240
  // === Configuration ===
@@ -186,8 +258,9 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
186
258
 
187
259
  this.#log.info('Starting transaction pool...');
188
260
 
189
- // Start the serial queue
261
+ // Start the serial queues
190
262
  this.#queue.start();
263
+ this.#finalizationQueue.start();
191
264
  this.#started = true;
192
265
 
193
266
  // Setup metrics - created after queue is started so callbacks can safely queue
@@ -219,6 +292,8 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
219
292
 
220
293
  async stop(): Promise<void> {
221
294
  if (this.#started) {
295
+ // End the finalization queue first: an in-flight finalization still needs #queue to run its chunks.
296
+ await this.#finalizationQueue.end();
222
297
  await this.#queue.end();
223
298
  this.#started = false;
224
299
  }