@aztec/p2p 0.0.1-commit.358457c → 0.0.1-commit.3750d92a7

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 (348) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +5 -6
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +30 -16
  5. package/dest/client/interface.d.ts +12 -5
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +6 -5
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +47 -39
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +18 -8
  11. package/dest/config.d.ts +125 -100
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +92 -33
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/index.d.ts +1 -2
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +0 -1
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  24. package/dest/mem_pools/index.d.ts +1 -2
  25. package/dest/mem_pools/index.d.ts.map +1 -1
  26. package/dest/mem_pools/instrumentation.d.ts +4 -2
  27. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  28. package/dest/mem_pools/instrumentation.js +16 -14
  29. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  30. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  32. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  33. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +2 -0
  35. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  36. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  38. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  39. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  41. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  42. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  44. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  45. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  47. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +9 -5
  48. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  50. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +40 -11
  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 +75 -19
  53. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  54. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -44
  56. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  57. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  59. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +60 -28
  62. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  63. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  64. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  65. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  66. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  68. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  69. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  70. package/dest/msg_validators/clock_tolerance.js +54 -3
  71. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  72. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  73. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  74. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  75. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  77. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  78. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  79. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  80. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  81. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  82. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  83. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  84. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  85. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  86. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  87. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  88. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  89. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  90. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  93. package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
  94. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/factory.js +36 -10
  96. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  97. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  99. package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
  100. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/gas_validator.js +49 -17
  102. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  103. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/index.js +1 -0
  105. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  106. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  107. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  108. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  109. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  110. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  111. package/dest/services/data_store.d.ts +1 -1
  112. package/dest/services/data_store.d.ts.map +1 -1
  113. package/dest/services/data_store.js +5 -5
  114. package/dest/services/dummy_service.d.ts +6 -3
  115. package/dest/services/dummy_service.d.ts.map +1 -1
  116. package/dest/services/dummy_service.js +6 -1
  117. package/dest/services/encoding.d.ts +6 -2
  118. package/dest/services/encoding.d.ts.map +1 -1
  119. package/dest/services/encoding.js +14 -8
  120. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  121. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  122. package/dest/services/gossipsub/topic_score_params.js +21 -4
  123. package/dest/services/libp2p/libp2p_service.d.ts +19 -30
  124. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  125. package/dest/services/libp2p/libp2p_service.js +171 -135
  126. package/dest/services/peer-manager/metrics.d.ts +3 -1
  127. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  128. package/dest/services/peer-manager/metrics.js +6 -0
  129. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  130. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  131. package/dest/services/peer-manager/peer_manager.js +39 -11
  132. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  133. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  134. package/dest/services/peer-manager/peer_scoring.js +32 -10
  135. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  136. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  137. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +69 -65
  138. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
  139. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  140. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  141. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  142. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  143. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  144. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  145. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  146. package/dest/services/reqresp/config.d.ts +3 -3
  147. package/dest/services/reqresp/config.d.ts.map +1 -1
  148. package/dest/services/reqresp/interface.d.ts +14 -9
  149. package/dest/services/reqresp/interface.d.ts.map +1 -1
  150. package/dest/services/reqresp/interface.js +10 -11
  151. package/dest/services/reqresp/metrics.d.ts +1 -1
  152. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  153. package/dest/services/reqresp/metrics.js +0 -1
  154. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  155. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  156. package/dest/services/reqresp/protocols/index.js +0 -1
  157. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  158. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  159. package/dest/services/reqresp/protocols/tx.js +1 -3
  160. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  161. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  162. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  163. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  164. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  165. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  166. package/dest/services/reqresp/reqresp.d.ts +4 -2
  167. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  168. package/dest/services/reqresp/reqresp.js +30 -12
  169. package/dest/services/service.d.ts +5 -2
  170. package/dest/services/service.d.ts.map +1 -1
  171. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  172. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  173. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  174. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  175. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  176. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  177. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  178. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  179. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  180. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  181. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  182. package/dest/services/tx_collection/request_tracker.js +84 -0
  183. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  184. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  185. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  186. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  187. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  188. package/dest/services/tx_collection/tx_source.js +9 -7
  189. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  190. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  191. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  192. package/dest/test-helpers/mock-pubsub.d.ts +12 -5
  193. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  194. package/dest/test-helpers/mock-pubsub.js +37 -12
  195. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  196. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  197. package/dest/test-helpers/reqresp-nodes.js +3 -4
  198. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  199. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  200. package/dest/test-helpers/testbench-utils.js +23 -3
  201. package/dest/testbench/p2p_client_testbench_worker.js +73 -21
  202. package/dest/testbench/worker_client_manager.d.ts +10 -1
  203. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  204. package/dest/testbench/worker_client_manager.js +55 -3
  205. package/dest/util.d.ts +1 -1
  206. package/package.json +14 -14
  207. package/src/client/factory.ts +51 -27
  208. package/src/client/interface.ts +12 -10
  209. package/src/client/p2p_client.ts +52 -51
  210. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +20 -11
  211. package/src/config.ts +137 -35
  212. package/src/errors/p2p-service.error.ts +11 -0
  213. package/src/index.ts +0 -1
  214. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  215. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  216. package/src/mem_pools/index.ts +0 -3
  217. package/src/mem_pools/instrumentation.ts +17 -13
  218. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  219. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  220. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
  221. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  222. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  223. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  224. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  225. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  226. package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
  227. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +110 -22
  228. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  229. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
  230. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +68 -26
  231. package/src/msg_validators/attestation_validator/README.md +49 -0
  232. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  233. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  234. package/src/msg_validators/clock_tolerance.ts +72 -3
  235. package/src/msg_validators/proposal_validator/README.md +123 -0
  236. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  237. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  238. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  239. package/src/msg_validators/tx_validator/README.md +5 -1
  240. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  241. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  242. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  243. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  244. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  245. package/src/msg_validators/tx_validator/factory.ts +43 -3
  246. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  247. package/src/msg_validators/tx_validator/gas_validator.ts +65 -16
  248. package/src/msg_validators/tx_validator/index.ts +1 -0
  249. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  250. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  251. package/src/services/data_store.ts +5 -13
  252. package/src/services/dummy_service.ts +8 -2
  253. package/src/services/encoding.ts +14 -7
  254. package/src/services/gossipsub/topic_score_params.ts +36 -4
  255. package/src/services/libp2p/libp2p_service.ts +169 -150
  256. package/src/services/peer-manager/metrics.ts +7 -0
  257. package/src/services/peer-manager/peer_manager.ts +45 -11
  258. package/src/services/peer-manager/peer_scoring.ts +27 -5
  259. package/src/services/reqresp/README.md +229 -0
  260. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  261. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
  262. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  263. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  264. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  265. package/src/services/reqresp/config.ts +2 -2
  266. package/src/services/reqresp/interface.ts +21 -11
  267. package/src/services/reqresp/metrics.ts +0 -1
  268. package/src/services/reqresp/protocols/index.ts +0 -1
  269. package/src/services/reqresp/protocols/tx.ts +1 -3
  270. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  271. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  272. package/src/services/reqresp/reqresp.ts +40 -13
  273. package/src/services/service.ts +6 -1
  274. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  275. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  276. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  277. package/src/services/tx_collection/request_tracker.ts +127 -0
  278. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  279. package/src/services/tx_collection/tx_collection.ts +3 -5
  280. package/src/services/tx_collection/tx_source.ts +8 -7
  281. package/src/test-helpers/make-test-p2p-clients.ts +1 -3
  282. package/src/test-helpers/mock-pubsub.ts +34 -11
  283. package/src/test-helpers/reqresp-nodes.ts +5 -8
  284. package/src/test-helpers/testbench-utils.ts +30 -3
  285. package/src/testbench/p2p_client_testbench_worker.ts +74 -21
  286. package/src/testbench/worker_client_manager.ts +68 -6
  287. package/src/util.ts +1 -1
  288. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  289. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  290. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  291. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  292. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  293. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  294. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  295. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  296. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  297. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  298. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  299. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  300. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  301. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  302. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  303. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  304. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  305. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  306. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  307. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  308. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  309. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  310. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  311. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  312. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  313. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  314. package/dest/mem_pools/tx_pool/index.js +0 -2
  315. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  316. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  317. package/dest/mem_pools/tx_pool/priority.js +0 -15
  318. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  319. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  320. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  321. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  322. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  323. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  324. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  325. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  326. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  327. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  328. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  329. package/dest/services/reqresp/protocols/block.js +0 -32
  330. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  331. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  332. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  333. package/src/mem_pools/tx_pool/README.md +0 -270
  334. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  335. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  336. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  337. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  338. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  339. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  340. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  341. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  342. package/src/mem_pools/tx_pool/index.ts +0 -2
  343. package/src/mem_pools/tx_pool/priority.ts +0 -20
  344. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  345. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  346. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  347. package/src/services/reqresp/protocols/block.ts +0 -37
  348. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -7,6 +7,6 @@ export {
7
7
  type PoolReadAccess,
8
8
  DEFAULT_TX_POOL_V2_CONFIG,
9
9
  } from './interfaces.js';
10
- export { type TxMetaData, type TxState, buildTxMetaData, comparePriority } from './tx_metadata.js';
10
+ export { type TxMetaData, type TxState, buildTxMetaData, comparePriority, stubTxMetaData } from './tx_metadata.js';
11
11
  export { TxArchive } from './archive/index.js';
12
12
  export { DeletedPool } from './deleted_pool.js';
@@ -46,6 +46,8 @@ export type TxPoolV2Config = {
46
46
  evictedTxCacheSize: number;
47
47
  /** The probability (0-1) that a transaction is discarded. 0 disables dropping. For testing purposes only. */
48
48
  dropTransactionsProbability: number;
49
+ /** Minimum percentage fee increase required to replace an existing tx via RPC (0 = no bump). */
50
+ priceBumpPercentage: bigint;
49
51
  };
50
52
 
51
53
  /**
@@ -57,6 +59,7 @@ export const DEFAULT_TX_POOL_V2_CONFIG: TxPoolV2Config = {
57
59
  minTxPoolAgeMs: 2_000,
58
60
  evictedTxCacheSize: 10_000,
59
61
  dropTransactionsProbability: 0,
62
+ priceBumpPercentage: 10n,
60
63
  };
61
64
 
62
65
  /**
@@ -69,6 +72,8 @@ export type TxPoolV2Dependencies = {
69
72
  worldStateSynchronizer: WorldStateSynchronizer;
70
73
  /** Factory that creates a validator for re-validating pool transactions using metadata */
71
74
  createTxValidator: () => Promise<TxValidator<TxMetaData>>;
75
+ /** Checks whether a tx's setup-phase calls are on the allow list. Precomputed at receipt time. */
76
+ checkAllowedSetupCalls: (tx: Tx) => Promise<boolean>;
72
77
  };
73
78
 
74
79
  /**
@@ -155,10 +160,10 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
155
160
  handleMinedBlock(block: L2Block): Promise<void>;
156
161
 
157
162
  /**
158
- * Prepares the pool for a new slot.
159
- * Unprotects transactions from earlier slots and validates them before
160
- * returning to pending state.
161
- * @param slotNumber - The slot number to prepare for
163
+ * Prepares the pool for a new slot by unprotecting transactions from earlier
164
+ * slots and re-validating them before returning to pending state.
165
+ * @param slotNumber - The pipeline slot we are building for (i.e. the slot
166
+ * the resulting blocks will target on L1).
162
167
  */
163
168
  prepareForSlot(slotNumber: SlotNumber): Promise<void>;
164
169
 
@@ -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
6
  import { Gas } from '@aztec/stdlib/gas';
6
- import type { Tx } from '@aztec/stdlib/tx';
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. */
@@ -40,6 +40,9 @@ export type TxMetaData = {
40
40
  /** The transaction hash as hex string */
41
41
  readonly txHash: string;
42
42
 
43
+ /** The transaction hash as bigint (for efficient Fr conversion in comparisons) */
44
+ readonly txHashBigInt: bigint;
45
+
43
46
  /** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */
44
47
  minedL2BlockId?: L2BlockId;
45
48
 
@@ -64,6 +67,9 @@ export type TxMetaData = {
64
67
  /** Timestamp by which the transaction must be included (for expiration checks) */
65
68
  readonly expirationTimestamp: bigint;
66
69
 
70
+ /** Whether the tx's setup-phase calls pass the allow list check. Computed at receipt time. */
71
+ readonly allowedSetupCalls: boolean;
72
+
67
73
  /** Validator-compatible data, providing the same access patterns as Tx.data */
68
74
  readonly data: TxMetaValidationData;
69
75
 
@@ -81,9 +87,15 @@ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
81
87
  * Builds TxMetaData from a full Tx object.
82
88
  * Extracts all relevant fields for efficient in-memory storage and querying.
83
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.
84
94
  */
85
- export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
86
- const txHash = tx.getTxHash().toString();
95
+ export async function buildTxMetaData(tx: Tx, allowedSetupCalls: boolean = true): Promise<TxMetaData> {
96
+ const txHashObj = tx.getTxHash();
97
+ const txHash = txHashObj.toString();
98
+ const txHashBigInt = txHashObj.toBigInt();
87
99
  const nullifierFrs = tx.data.getNonEmptyNullifiers();
88
100
  const nullifiers = nullifierFrs.map(n => n.toString());
89
101
  const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash();
@@ -99,6 +111,7 @@ export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
99
111
 
100
112
  return {
101
113
  txHash,
114
+ txHashBigInt,
102
115
  anchorBlockHeaderHash,
103
116
  priorityFee,
104
117
  feePayer,
@@ -106,6 +119,7 @@ export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
106
119
  feeLimit,
107
120
  nullifiers,
108
121
  expirationTimestamp,
122
+ allowedSetupCalls,
109
123
  receivedAt: 0,
110
124
  estimatedSizeBytes,
111
125
  data: {
@@ -134,11 +148,11 @@ const HEX_STRING_BYTES = 98;
134
148
  const BIGINT_BYTES = 32;
135
149
  const FR_BYTES = 80;
136
150
  // Fixed cost: object shell + txHash + anchorBlockHeaderHash + feePayer (3 hex strings)
137
- // + priorityFee + claimAmount + feeLimit + includeByTimestamp (4 bigints)
151
+ // + txHashBigInt + priorityFee + claimAmount + feeLimit + includeByTimestamp (5 bigints)
138
152
  // + receivedAt (number, 8 bytes) + estimatedSizeBytes (number, 8 bytes)
139
153
  // + data closure object (~OBJECT_OVERHEAD + anchorBlockHeaderHashFr Fr + anchorBlockNumber number)
140
154
  const FIXED_METADATA_BYTES =
141
- OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 4 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8;
155
+ OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 5 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8;
142
156
 
143
157
  /** Estimates the in-memory size of a TxMetaData object based on the number of nullifiers. */
144
158
  function estimateTxMetaDataSize(nullifierCount: number): number {
@@ -146,14 +160,19 @@ function estimateTxMetaDataSize(nullifierCount: number): number {
146
160
  return FIXED_METADATA_BYTES + nullifierCount * (HEX_STRING_BYTES + FR_BYTES);
147
161
  }
148
162
 
163
+ /** Converts a txHash bigint back to the canonical 0x-prefixed 64-char hex string. */
164
+ export function txHashFromBigInt(value: bigint): string {
165
+ return TxHash.fromBigInt(value).toString();
166
+ }
167
+
149
168
  /** Minimal fields required for priority comparison. */
150
- type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
169
+ export type PriorityComparable = Pick<TxMetaData, 'txHash' | 'txHashBigInt' | 'priorityFee'>;
151
170
 
152
171
  /**
153
172
  * Compares two priority fees in ascending order.
154
173
  * Returns negative if a < b, positive if a > b, 0 if equal.
155
174
  */
156
- export function compareFee(a: bigint, b: bigint): number {
175
+ export function compareFee(a: bigint, b: bigint): -1 | 0 | 1 {
157
176
  return a < b ? -1 : a > b ? 1 : 0;
158
177
  }
159
178
 
@@ -162,10 +181,8 @@ export function compareFee(a: bigint, b: bigint): number {
162
181
  * Uses field element comparison for deterministic ordering.
163
182
  * Returns negative if a < b, positive if a > b, 0 if equal.
164
183
  */
165
- export function compareTxHash(a: string, b: string): number {
166
- const fieldA = Fr.fromHexString(a);
167
- const fieldB = Fr.fromHexString(b);
168
- return fieldA.cmp(fieldB);
184
+ export function compareTxHash(a: bigint, b: bigint): -1 | 0 | 1 {
185
+ return Fr.cmpAsBigInt(a, b);
169
186
  }
170
187
 
171
188
  /**
@@ -173,29 +190,46 @@ export function compareTxHash(a: string, b: string): number {
173
190
  * Returns negative if a < b, positive if a > b, 0 if equal.
174
191
  * Use with sort() for ascending order, or negate/reverse for descending.
175
192
  */
176
- export function comparePriority(a: PriorityComparable, b: PriorityComparable): number {
193
+ export function comparePriority(a: PriorityComparable, b: PriorityComparable): -1 | 0 | 1 {
177
194
  const feeComparison = compareFee(a.priorityFee, b.priorityFee);
178
195
  if (feeComparison !== 0) {
179
196
  return feeComparison;
180
197
  }
181
- return compareTxHash(a.txHash, b.txHash);
198
+ return compareTxHash(a.txHashBigInt, b.txHashBigInt);
199
+ }
200
+
201
+ /**
202
+ * Returns the minimum fee required to replace an existing tx with the given price bump percentage.
203
+ * Uses integer arithmetic: `existingFee + existingFee * priceBumpPercentage / 100`.
204
+ */
205
+ export function getMinimumPriceBumpFee(existingFee: bigint, priceBumpPercentage: bigint): bigint {
206
+ const bump = (existingFee * priceBumpPercentage) / 100n;
207
+ // Ensure the minimum bump is at least 1, so that replacement always requires
208
+ // paying strictly more — even with 0% bump or zero existing fee.
209
+ const effectiveBump = bump > 0n ? bump : 1n;
210
+ return existingFee + effectiveBump;
182
211
  }
183
212
 
184
213
  /**
185
214
  * Checks for nullifier conflicts between an incoming transaction and existing pool state.
186
215
  *
187
216
  * When the incoming tx shares nullifiers with existing pending txs:
188
- * - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
189
- * - If any conflicting tx has equal or higher priority, ignore the incoming tx
217
+ * - If the incoming tx meets or exceeds the required priority, mark conflicting txs for eviction
218
+ * - Otherwise, ignore the incoming tx
219
+ *
220
+ * When `priceBumpPercentage` is provided (RPC path), uses fee-only comparison with the
221
+ * percentage bump instead of `comparePriority`.
190
222
  *
191
223
  * @param incomingMeta - Metadata for the incoming transaction
192
224
  * @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
193
225
  * @param getMetadata - Accessor to get metadata for a tx hash
226
+ * @param priceBumpPercentage - Optional percentage bump required for fee-based replacement
194
227
  */
195
228
  export function checkNullifierConflict(
196
229
  incomingMeta: TxMetaData,
197
230
  getTxHashByNullifier: (nullifier: string) => string | undefined,
198
231
  getMetadata: (txHash: string) => TxMetaData | undefined,
232
+ priceBumpPercentage?: bigint,
199
233
  ): PreAddResult {
200
234
  const txHashesToEvict: string[] = [];
201
235
 
@@ -216,19 +250,32 @@ export function checkNullifierConflict(
216
250
  continue;
217
251
  }
218
252
 
219
- // If incoming tx has strictly higher priority, mark for eviction
220
- // Otherwise, ignore incoming tx (ties go to existing tx)
221
- // Use comparePriority for deterministic ordering (includes txHash as tiebreaker)
222
- if (comparePriority(incomingMeta, conflictingMeta) > 0) {
253
+ // When price bump is set (RPC path), require the incoming fee to meet the bumped threshold.
254
+ // Otherwise (P2P path), use full comparePriority with tx hash tiebreaker.
255
+ const isHigherPriority =
256
+ priceBumpPercentage !== undefined
257
+ ? incomingMeta.priorityFee >= getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
258
+ : comparePriority(incomingMeta, conflictingMeta) > 0;
259
+
260
+ if (isHigherPriority) {
223
261
  txHashesToEvict.push(conflictingHashStr);
224
262
  } else {
263
+ const minimumFee =
264
+ priceBumpPercentage !== undefined
265
+ ? getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
266
+ : undefined;
225
267
  return {
226
268
  shouldIgnore: true,
227
269
  txHashesToEvict: [],
228
270
  reason: {
229
271
  code: TxPoolRejectionCode.NULLIFIER_CONFLICT,
230
- message: `Nullifier conflict with existing tx ${conflictingHashStr}`,
272
+ message:
273
+ minimumFee !== undefined
274
+ ? `Nullifier conflict with existing tx ${conflictingHashStr}. Minimum required fee: ${minimumFee}, got: ${incomingMeta.priorityFee}`
275
+ : `Nullifier conflict with existing tx ${conflictingHashStr}`,
231
276
  conflictingTxHash: conflictingHashStr,
277
+ minimumPriceBumpFee: minimumFee,
278
+ txPriorityFee: minimumFee !== undefined ? incomingMeta.priorityFee : undefined,
232
279
  },
233
280
  };
234
281
  }
@@ -244,7 +291,7 @@ export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigi
244
291
  expirationTimestamp: overrides.expirationTimestamp ?? 0n,
245
292
  constants: {
246
293
  anchorBlockHeader: {
247
- hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
294
+ hash: () => Promise.resolve(BlockHash.ZERO),
248
295
  globalVariables: { blockNumber: BlockNumber(0) },
249
296
  },
250
297
  txContext: {
@@ -253,3 +300,44 @@ export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigi
253
300
  },
254
301
  };
255
302
  }
303
+
304
+ /** Creates a stub TxMetaData for tests. All fields have sensible defaults and can be overridden. */
305
+ export function stubTxMetaData(
306
+ txHash: string,
307
+ overrides: {
308
+ priorityFee?: bigint;
309
+ feePayer?: string;
310
+ claimAmount?: bigint;
311
+ feeLimit?: bigint;
312
+ nullifiers?: string[];
313
+ expirationTimestamp?: bigint;
314
+ anchorBlockHeaderHash?: string;
315
+ allowedSetupCalls?: boolean;
316
+ } = {},
317
+ ): TxMetaData {
318
+ const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
319
+ // Normalize to canonical zero-padded hex so txHashFromBigInt(txHashBigInt) === normalizedTxHash
320
+ const normalizedTxHash = txHashFromBigInt(txHashBigInt);
321
+ const expirationTimestamp = overrides.expirationTimestamp ?? 0n;
322
+ return {
323
+ txHash: normalizedTxHash,
324
+ txHashBigInt,
325
+ anchorBlockHeaderHash: overrides.anchorBlockHeaderHash ?? '0x1234',
326
+ priorityFee: overrides.priorityFee ?? 100n,
327
+ feePayer: overrides.feePayer ?? '0xfeepayer',
328
+ claimAmount: overrides.claimAmount ?? 0n,
329
+ feeLimit: overrides.feeLimit ?? 100n,
330
+ nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
331
+ expirationTimestamp,
332
+ allowedSetupCalls: overrides.allowedSetupCalls ?? true,
333
+ receivedAt: 0,
334
+ estimatedSizeBytes: 0,
335
+ data: stubTxMetaValidationData({ expirationTimestamp }),
336
+ };
337
+ }
338
+
339
+ /** Returns the priority fee for a tx, based on the L2 priority fee capped by the max fee per gas. */
340
+ function getTxPriorityFee(tx: Tx): bigint {
341
+ const { maxPriorityFeesPerGas: priorityFees, maxFeesPerGas } = tx.getGasSettings();
342
+ return minBigint(maxFeesPerGas.feePerL2Gas, priorityFees.feePerL2Gas);
343
+ }
@@ -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 } 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 txHashes grouped by priority fee */
26
- #pendingByPriority: Map<bigint, Set<string>> = 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
- // Use compareFee from tx_metadata, swap args for descending order
77
- const feeCompareFn = order === 'desc' ? (a: bigint, b: bigint) => compareFee(b, a) : compareFee;
78
- const hashCompareFn = order === 'desc' ? (a: string, b: string) => compareTxHash(b, a) : compareTxHash;
79
-
80
- const sortedFees = [...this.#pendingByPriority.keys()].sort(feeCompareFn);
81
-
82
- for (const fee of sortedFees) {
83
- const hashesAtFee = this.#pendingByPriority.get(fee)!;
84
- // Use compareTxHash from tx_metadata, swap args for descending order
85
- const sortedHashes = [...hashesAtFee].sort(hashCompareFn);
86
- for (const hash of sortedHashes) {
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
  }
@@ -227,11 +222,7 @@ export class TxPoolIndices {
227
222
 
228
223
  /** Gets the count of pending transactions */
229
224
  getPendingTxCount(): number {
230
- let count = 0;
231
- for (const hashes of this.#pendingByPriority.values()) {
232
- count += hashes.size;
233
- }
234
- return count;
225
+ return this.#pendingByPriority.length;
235
226
  }
236
227
 
237
228
  /** Gets the lowest priority pending transaction hashes (up to limit) */
@@ -264,12 +255,10 @@ export class TxPoolIndices {
264
255
  /** Gets all pending transactions */
265
256
  getPendingTxs(): TxMetaData[] {
266
257
  const result: TxMetaData[] = [];
267
- for (const hashSet of this.#pendingByPriority.values()) {
268
- for (const txHash of hashSet) {
269
- const meta = this.#metadata.get(txHash);
270
- if (meta) {
271
- result.push(meta);
272
- }
258
+ for (const entry of this.#pendingByPriority) {
259
+ const meta = this.#metadata.get(entry.txHash);
260
+ if (meta) {
261
+ result.push(meta);
273
262
  }
274
263
  }
275
264
  return result;
@@ -408,13 +397,12 @@ export class TxPoolIndices {
408
397
  }
409
398
  feePayerSet.add(meta.txHash);
410
399
 
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.txHash);
400
+ insertIntoSortedArray(
401
+ this.#pendingByPriority,
402
+ { txHash: meta.txHash, priorityFee: meta.priorityFee, txHashBigInt: meta.txHashBigInt },
403
+ comparePriority,
404
+ false,
405
+ );
418
406
  }
419
407
 
420
408
  #removeFromPendingIndices(meta: TxMetaData): void {
@@ -432,13 +420,11 @@ export class TxPoolIndices {
432
420
  }
433
421
  }
434
422
 
435
- // Remove from priority map
436
- const hashSet = this.#pendingByPriority.get(meta.priorityFee);
437
- if (hashSet) {
438
- hashSet.delete(meta.txHash);
439
- if (hashSet.size === 0) {
440
- this.#pendingByPriority.delete(meta.priorityFee);
441
- }
442
- }
423
+ // Remove from priority array
424
+ removeFromSortedArray(
425
+ this.#pendingByPriority,
426
+ { txHash: meta.txHash, priorityFee: meta.priorityFee, txHashBigInt: meta.txHashBigInt },
427
+ comparePriority,
428
+ );
443
429
  }
444
430
  }
@@ -11,7 +11,14 @@ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-clien
11
11
  import EventEmitter from 'node:events';
12
12
 
13
13
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
14
- import type { AddTxsResult, TxPoolV2, TxPoolV2Config, TxPoolV2Dependencies, TxPoolV2Events } from './interfaces.js';
14
+ import type {
15
+ AddTxsResult,
16
+ PoolReadAccess,
17
+ TxPoolV2,
18
+ TxPoolV2Config,
19
+ TxPoolV2Dependencies,
20
+ TxPoolV2Events,
21
+ } from './interfaces.js';
15
22
  import type { TxState } from './tx_metadata.js';
16
23
  import { TxPoolV2Impl } from './tx_pool_v2_impl.js';
17
24
 
@@ -58,6 +65,9 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
58
65
  const hashes = txHashes.map(h => (typeof h === 'string' ? TxHash.fromString(h) : TxHash.fromBigInt(h)));
59
66
  this.emit('txs-removed', { txHashes: hashes });
60
67
  },
68
+ onTxsMined: (txHashes: string[]) => {
69
+ this.#metrics?.transactionsRemoved(txHashes);
70
+ },
61
71
  };
62
72
 
63
73
  // Create the implementation
@@ -162,6 +172,11 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
162
172
  return this.#queue.put(() => Promise.resolve(this.#impl.getLowestPriorityPending(limit)));
163
173
  }
164
174
 
175
+ /** Returns read-only access to the pool. Used for testing. */
176
+ getPoolReadAccess(): PoolReadAccess {
177
+ return this.#impl.getPoolReadAccess();
178
+ }
179
+
165
180
  // === Configuration ===
166
181
 
167
182
  updateConfig(config: Partial<TxPoolV2Config>): Promise<void> {