@aztec/p2p 0.0.1-commit.0c875d939 → 0.0.1-commit.0ec55a70b

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 (421) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +8 -7
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +35 -30
  5. package/dest/client/interface.d.ts +18 -20
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +9 -19
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +81 -104
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +23 -10
  11. package/dest/config.d.ts +130 -103
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +97 -39
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +1 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +0 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  27. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  30. package/dest/mem_pools/index.d.ts +1 -2
  31. package/dest/mem_pools/index.d.ts.map +1 -1
  32. package/dest/mem_pools/instrumentation.d.ts +4 -2
  33. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  34. package/dest/mem_pools/instrumentation.js +33 -15
  35. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -1
  36. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +9 -0
  38. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  39. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
  48. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  54. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +4 -4
  57. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -7
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +12 -6
  61. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  62. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  64. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  65. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  67. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  68. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  70. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  71. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  73. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +27 -10
  74. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
  76. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +57 -15
  77. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +115 -20
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +5 -2
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +38 -46
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +12 -5
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +12 -5
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +297 -153
  88. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  89. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  90. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  91. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  92. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  94. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  95. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  96. package/dest/msg_validators/clock_tolerance.js +61 -3
  97. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -4
  98. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  100. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -4
  101. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  103. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +19 -8
  104. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  105. package/dest/msg_validators/proposal_validator/proposal_validator.js +88 -44
  106. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  107. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  109. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  111. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  112. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  113. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  114. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  115. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  116. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  117. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  118. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  119. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  120. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  122. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  123. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/factory.js +247 -60
  125. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  126. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  128. package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
  129. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  131. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  132. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/index.js +2 -0
  134. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  135. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  137. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  138. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  139. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  140. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  141. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  143. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  144. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  145. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  146. package/dest/services/data_store.d.ts +1 -1
  147. package/dest/services/data_store.d.ts.map +1 -1
  148. package/dest/services/data_store.js +5 -5
  149. package/dest/services/dummy_service.d.ts +8 -5
  150. package/dest/services/dummy_service.d.ts.map +1 -1
  151. package/dest/services/dummy_service.js +10 -5
  152. package/dest/services/encoding.d.ts +6 -2
  153. package/dest/services/encoding.d.ts.map +1 -1
  154. package/dest/services/encoding.js +16 -9
  155. package/dest/services/gossipsub/topic_score_params.d.ts +30 -7
  156. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  157. package/dest/services/gossipsub/topic_score_params.js +53 -14
  158. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  159. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  160. package/dest/services/libp2p/instrumentation.js +14 -0
  161. package/dest/services/libp2p/libp2p_service.d.ts +33 -38
  162. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  163. package/dest/services/libp2p/libp2p_service.js +256 -213
  164. package/dest/services/peer-manager/metrics.d.ts +3 -1
  165. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  166. package/dest/services/peer-manager/metrics.js +6 -0
  167. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  168. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  169. package/dest/services/peer-manager/peer_manager.js +39 -11
  170. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  171. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  172. package/dest/services/peer-manager/peer_scoring.js +32 -10
  173. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  174. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  175. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  176. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  177. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  178. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  179. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  180. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  181. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  182. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  183. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  184. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  185. package/dest/services/reqresp/config.d.ts +3 -3
  186. package/dest/services/reqresp/config.d.ts.map +1 -1
  187. package/dest/services/reqresp/interface.d.ts +14 -9
  188. package/dest/services/reqresp/interface.d.ts.map +1 -1
  189. package/dest/services/reqresp/interface.js +10 -11
  190. package/dest/services/reqresp/metrics.d.ts +1 -1
  191. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  192. package/dest/services/reqresp/metrics.js +0 -1
  193. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  194. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  195. package/dest/services/reqresp/protocols/index.js +0 -1
  196. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  197. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  198. package/dest/services/reqresp/protocols/tx.js +1 -3
  199. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  200. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  201. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  202. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  203. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  204. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  205. package/dest/services/reqresp/reqresp.d.ts +4 -2
  206. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  207. package/dest/services/reqresp/reqresp.js +30 -12
  208. package/dest/services/service.d.ts +9 -4
  209. package/dest/services/service.d.ts.map +1 -1
  210. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  211. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  212. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  213. package/dest/services/tx_collection/file_store_tx_collection.d.ts +1 -1
  214. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  215. package/dest/services/tx_collection/file_store_tx_collection.js +4 -2
  216. package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
  217. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  218. package/dest/services/tx_collection/file_store_tx_source.js +50 -9
  219. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  220. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  221. package/dest/services/tx_collection/instrumentation.js +2 -1
  222. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  223. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  224. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  225. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  226. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  227. package/dest/services/tx_collection/request_tracker.js +84 -0
  228. package/dest/services/tx_collection/slow_tx_collection.d.ts +2 -2
  229. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  230. package/dest/services/tx_collection/slow_tx_collection.js +10 -8
  231. package/dest/services/tx_collection/tx_collection.d.ts +5 -7
  232. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  233. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  234. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  235. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  236. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  237. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  238. package/dest/services/tx_collection/tx_source.js +26 -7
  239. package/dest/services/tx_file_store/tx_file_store.js +1 -1
  240. package/dest/services/tx_provider.d.ts +3 -3
  241. package/dest/services/tx_provider.d.ts.map +1 -1
  242. package/dest/services/tx_provider.js +4 -4
  243. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  244. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  245. package/dest/test-helpers/make-test-p2p-clients.js +4 -2
  246. package/dest/test-helpers/mock-pubsub.d.ts +14 -6
  247. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  248. package/dest/test-helpers/mock-pubsub.js +43 -12
  249. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  250. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  251. package/dest/test-helpers/reqresp-nodes.js +6 -4
  252. package/dest/test-helpers/testbench-utils.d.ts +6 -3
  253. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  254. package/dest/test-helpers/testbench-utils.js +24 -4
  255. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  256. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  257. package/dest/testbench/p2p_client_testbench_worker.js +83 -26
  258. package/dest/testbench/worker_client_manager.d.ts +10 -1
  259. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  260. package/dest/testbench/worker_client_manager.js +55 -3
  261. package/dest/util.d.ts +3 -3
  262. package/dest/util.d.ts.map +1 -1
  263. package/package.json +14 -14
  264. package/src/client/factory.ts +63 -50
  265. package/src/client/interface.ts +20 -21
  266. package/src/client/p2p_client.ts +89 -135
  267. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +35 -14
  268. package/src/config.ts +148 -45
  269. package/src/errors/p2p-service.error.ts +11 -0
  270. package/src/errors/tx-pool.error.ts +12 -0
  271. package/src/index.ts +0 -1
  272. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  273. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  274. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  275. package/src/mem_pools/index.ts +0 -3
  276. package/src/mem_pools/instrumentation.ts +22 -14
  277. package/src/mem_pools/tx_pool_v2/README.md +10 -2
  278. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +11 -0
  279. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  280. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -4
  281. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  282. package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
  283. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  284. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  285. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -4
  286. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  287. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +12 -9
  288. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  289. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  290. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  291. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  292. package/src/mem_pools/tx_pool_v2/interfaces.ts +27 -10
  293. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +166 -28
  294. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -46
  295. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +28 -8
  296. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +332 -149
  297. package/src/msg_validators/attestation_validator/README.md +49 -0
  298. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  299. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +12 -2
  300. package/src/msg_validators/clock_tolerance.ts +79 -3
  301. package/src/msg_validators/proposal_validator/README.md +123 -0
  302. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +23 -4
  303. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +34 -7
  304. package/src/msg_validators/proposal_validator/proposal_validator.ts +111 -47
  305. package/src/msg_validators/tx_validator/README.md +127 -0
  306. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  307. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  308. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  309. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  310. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  311. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  312. package/src/msg_validators/tx_validator/factory.ts +396 -78
  313. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  314. package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
  315. package/src/msg_validators/tx_validator/index.ts +2 -0
  316. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  317. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  318. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  319. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  320. package/src/services/data_store.ts +5 -13
  321. package/src/services/dummy_service.ts +13 -7
  322. package/src/services/encoding.ts +16 -8
  323. package/src/services/gossipsub/README.md +29 -14
  324. package/src/services/gossipsub/topic_score_params.ts +85 -17
  325. package/src/services/libp2p/instrumentation.ts +14 -0
  326. package/src/services/libp2p/libp2p_service.ts +278 -239
  327. package/src/services/peer-manager/metrics.ts +7 -0
  328. package/src/services/peer-manager/peer_manager.ts +45 -11
  329. package/src/services/peer-manager/peer_scoring.ts +27 -5
  330. package/src/services/reqresp/README.md +229 -0
  331. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  332. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  333. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  334. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  335. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  336. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  337. package/src/services/reqresp/config.ts +2 -2
  338. package/src/services/reqresp/interface.ts +21 -11
  339. package/src/services/reqresp/metrics.ts +0 -1
  340. package/src/services/reqresp/protocols/index.ts +0 -1
  341. package/src/services/reqresp/protocols/tx.ts +1 -3
  342. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  343. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  344. package/src/services/reqresp/reqresp.ts +40 -13
  345. package/src/services/service.ts +17 -3
  346. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  347. package/src/services/tx_collection/file_store_tx_collection.ts +7 -3
  348. package/src/services/tx_collection/file_store_tx_source.ts +65 -9
  349. package/src/services/tx_collection/instrumentation.ts +7 -1
  350. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  351. package/src/services/tx_collection/request_tracker.ts +127 -0
  352. package/src/services/tx_collection/slow_tx_collection.ts +8 -9
  353. package/src/services/tx_collection/tx_collection.ts +5 -6
  354. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  355. package/src/services/tx_collection/tx_source.ts +28 -8
  356. package/src/services/tx_file_store/tx_file_store.ts +1 -1
  357. package/src/services/tx_provider.ts +2 -2
  358. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  359. package/src/test-helpers/mock-pubsub.ts +47 -11
  360. package/src/test-helpers/reqresp-nodes.ts +7 -8
  361. package/src/test-helpers/testbench-utils.ts +33 -6
  362. package/src/testbench/p2p_client_testbench_worker.ts +92 -29
  363. package/src/testbench/worker_client_manager.ts +68 -6
  364. package/src/util.ts +8 -2
  365. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  366. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  367. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  368. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  369. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  370. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  371. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  372. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  373. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  374. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  375. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  376. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  377. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  378. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  379. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  380. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  381. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  382. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  383. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  384. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  385. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  386. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  387. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  388. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  389. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  390. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  391. package/dest/mem_pools/tx_pool/index.js +0 -2
  392. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  393. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  394. package/dest/mem_pools/tx_pool/priority.js +0 -15
  395. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  396. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  397. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  398. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  399. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  400. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  401. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  402. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  403. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  404. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  405. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  406. package/dest/services/reqresp/protocols/block.js +0 -32
  407. package/src/mem_pools/tx_pool/README.md +0 -270
  408. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  409. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  410. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  411. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  412. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  413. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  414. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  415. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  416. package/src/mem_pools/tx_pool/index.ts +0 -2
  417. package/src/mem_pools/tx_pool/priority.ts +0 -20
  418. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  419. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  420. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  421. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -1,9 +1,11 @@
1
1
  import type { SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import type { TypedEventEmitter } from '@aztec/foundation/types';
3
3
  import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
4
+ import type { BlockMinFeesProvider } from '@aztec/stdlib/gas';
4
5
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
5
6
  import type { BlockHeader, Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
6
7
 
8
+ import type { TxPoolRejectionError } from './eviction/interfaces.js';
7
9
  import type { TxMetaData, TxState } from './tx_metadata.js';
8
10
 
9
11
  /**
@@ -17,6 +19,8 @@ export type AddTxsResult = {
17
19
  ignored: TxHash[];
18
20
  /** Transactions rejected because they failed validation (e.g., invalid proof, expired timestamp) */
19
21
  rejected: TxHash[];
22
+ /** Optional rejection errors, only present when there are rejections with structured errors. */
23
+ errors?: Map<string, TxPoolRejectionError>;
20
24
  };
21
25
 
22
26
  /**
@@ -39,6 +43,12 @@ export type TxPoolV2Config = {
39
43
  archivedTxLimit: number;
40
44
  /** Minimum age (ms) a transaction must have been in the pool before it's eligible for block building */
41
45
  minTxPoolAgeMs: number;
46
+ /** Maximum number of evicted tx hashes to remember for metrics tracking */
47
+ evictedTxCacheSize: number;
48
+ /** The probability (0-1) that a transaction is discarded. 0 disables dropping. For testing purposes only. */
49
+ dropTransactionsProbability: number;
50
+ /** Minimum percentage fee increase required to replace an existing tx via RPC (0 = no bump). */
51
+ priceBumpPercentage: bigint;
42
52
  };
43
53
 
44
54
  /**
@@ -48,6 +58,9 @@ export const DEFAULT_TX_POOL_V2_CONFIG: TxPoolV2Config = {
48
58
  maxPendingTxCount: 0, // 0 = disabled
49
59
  archivedTxLimit: 0, // 0 = disabled
50
60
  minTxPoolAgeMs: 2_000,
61
+ evictedTxCacheSize: 10_000,
62
+ dropTransactionsProbability: 0,
63
+ priceBumpPercentage: 10n,
51
64
  };
52
65
 
53
66
  /**
@@ -60,6 +73,10 @@ export type TxPoolV2Dependencies = {
60
73
  worldStateSynchronizer: WorldStateSynchronizer;
61
74
  /** Factory that creates a validator for re-validating pool transactions using metadata */
62
75
  createTxValidator: () => Promise<TxValidator<TxMetaData>>;
76
+ /** Checks whether a tx's setup-phase calls are on the allow list. Precomputed at receipt time. */
77
+ checkAllowedSetupCalls: (tx: Tx) => Promise<boolean>;
78
+ /** Provides projected minimum fees for the next block. Used by eviction rules instead of stale block header fees. */
79
+ blockMinFeesProvider: BlockMinFeesProvider;
63
80
  };
64
81
 
65
82
  /**
@@ -98,15 +115,15 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
98
115
  * @param opts - Optional metadata (e.g., source for logging)
99
116
  * @returns Result categorizing each transaction as accepted, rejected, or ignored
100
117
  */
101
- addPendingTxs(txs: Tx[], opts?: { source?: string }): Promise<AddTxsResult>;
118
+ addPendingTxs(txs: Tx[], opts?: { source?: string; feeComparisonOnly?: boolean }): Promise<AddTxsResult>;
102
119
 
103
120
  /**
104
- * Checks if a transaction can be added without modifying the pool.
105
- * Performs the same validation as addPendingTxs but doesn't persist changes.
121
+ * Checks if the pool would accept a transaction without modifying state.
122
+ * Used as a pre-check before expensive proof verification.
106
123
  * @param tx - Transaction to check
107
- * @returns Result: 'accepted', 'ignored' (if already in pool or undesirable), or 'rejected' (if validation fails)
124
+ * @returns 'accepted' if the pool would accept, 'ignored' if already in pool or undesirable
108
125
  */
109
- canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'>;
126
+ canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'>;
110
127
 
111
128
  /**
112
129
  * Adds transactions as immediately protected for a given slot.
@@ -146,10 +163,10 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
146
163
  handleMinedBlock(block: L2Block): Promise<void>;
147
164
 
148
165
  /**
149
- * Prepares the pool for a new slot.
150
- * Unprotects transactions from earlier slots and validates them before
151
- * returning to pending state.
152
- * @param slotNumber - The slot number to prepare for
166
+ * Prepares the pool for a new slot by unprotecting transactions from earlier
167
+ * slots and re-validating them before returning to pending state.
168
+ * @param slotNumber - The pipeline slot we are building for (i.e. the slot
169
+ * the resulting blocks will target on L1).
153
170
  */
154
171
  prepareForSlot(slotNumber: SlotNumber): Promise<void>;
155
172
 
@@ -159,7 +176,7 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
159
176
  * and validates them before returning to pending.
160
177
  * @param latestBlock - The latest valid block ID after the prune
161
178
  */
162
- handlePrunedBlocks(latestBlock: L2BlockId): Promise<void>;
179
+ handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void>;
163
180
 
164
181
  /**
165
182
  * Handles failed transaction execution.
@@ -1,17 +1,20 @@
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 type { Tx } from '@aztec/stdlib/tx';
6
+ import { Gas, GasFees } from '@aztec/stdlib/gas';
7
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
6
8
 
7
9
  import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
8
- import { getTxPriorityFee } from '../tx_pool/priority.js';
9
- import type { PreAddResult } from './eviction/interfaces.js';
10
+ import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
10
11
 
11
12
  /** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
12
13
  export type TxMetaValidationData = {
13
14
  getNonEmptyNullifiers(): Fr[];
14
- includeByTimestamp: bigint;
15
+ expirationTimestamp: bigint;
16
+ /** Whether the tx has public calls. Used to select the correct L2 gas minimum. */
17
+ forPublic?: unknown;
15
18
  constants: {
16
19
  anchorBlockHeader: {
17
20
  hash(): Promise<BlockHash>;
@@ -19,6 +22,9 @@ export type TxMetaValidationData = {
19
22
  blockNumber: BlockNumber;
20
23
  };
21
24
  };
25
+ txContext: {
26
+ gasSettings: { gasLimits: Gas; maxFeesPerGas: GasFees };
27
+ };
22
28
  };
23
29
  };
24
30
 
@@ -34,6 +40,9 @@ export type TxMetaData = {
34
40
  /** The transaction hash as hex string */
35
41
  readonly txHash: string;
36
42
 
43
+ /** The transaction hash as bigint (for efficient Fr conversion in comparisons) */
44
+ readonly txHashBigInt: bigint;
45
+
37
46
  /** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */
38
47
  minedL2BlockId?: L2BlockId;
39
48
 
@@ -56,13 +65,19 @@ export type TxMetaData = {
56
65
  readonly nullifiers: readonly string[];
57
66
 
58
67
  /** Timestamp by which the transaction must be included (for expiration checks) */
59
- readonly includeByTimestamp: bigint;
68
+ readonly expirationTimestamp: bigint;
69
+
70
+ /** Whether the tx's setup-phase calls pass the allow list check. Computed at receipt time. */
71
+ readonly allowedSetupCalls: boolean;
60
72
 
61
73
  /** Validator-compatible data, providing the same access patterns as Tx.data */
62
74
  readonly data: TxMetaValidationData;
63
75
 
64
76
  /** Timestamp (ms) when the tx was received into the pool. 0 for hydrated txs (always eligible). */
65
77
  receivedAt: number;
78
+
79
+ /** Estimated memory footprint of this metadata object in bytes */
80
+ readonly estimatedSizeBytes: number;
66
81
  };
67
82
 
68
83
  /** Transaction state derived from TxMetaData fields and pool protection status */
@@ -72,51 +87,95 @@ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
72
87
  * Builds TxMetaData from a full Tx object.
73
88
  * Extracts all relevant fields for efficient in-memory storage and querying.
74
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.
75
94
  */
76
- export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
77
- 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();
78
99
  const nullifierFrs = tx.data.getNonEmptyNullifiers();
79
100
  const nullifiers = nullifierFrs.map(n => n.toString());
80
101
  const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash();
81
102
  const anchorBlockHeaderHash = anchorBlockHeaderHashFr.toString();
82
- const includeByTimestamp = tx.data.includeByTimestamp;
103
+ const expirationTimestamp = tx.data.expirationTimestamp;
83
104
  const anchorBlockNumber = tx.data.constants.anchorBlockHeader.globalVariables.blockNumber;
84
105
  const priorityFee = getTxPriorityFee(tx);
85
106
  const feePayer = tx.data.feePayer.toString();
86
107
 
87
108
  const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
88
109
 
110
+ const estimatedSizeBytes = estimateTxMetaDataSize(nullifiers.length);
111
+
89
112
  return {
90
113
  txHash,
114
+ txHashBigInt,
91
115
  anchorBlockHeaderHash,
92
116
  priorityFee,
93
117
  feePayer,
94
118
  claimAmount,
95
119
  feeLimit,
96
120
  nullifiers,
97
- includeByTimestamp,
121
+ expirationTimestamp,
122
+ allowedSetupCalls,
98
123
  receivedAt: 0,
124
+ estimatedSizeBytes,
99
125
  data: {
100
126
  getNonEmptyNullifiers: () => nullifierFrs,
101
- includeByTimestamp,
127
+ expirationTimestamp,
128
+ forPublic: !!tx.data.forPublic,
102
129
  constants: {
103
130
  anchorBlockHeader: {
104
131
  hash: () => Promise.resolve(anchorBlockHeaderHashFr),
105
132
  globalVariables: { blockNumber: anchorBlockNumber },
106
133
  },
134
+ txContext: {
135
+ gasSettings: {
136
+ gasLimits: tx.data.constants.txContext.gasSettings.gasLimits,
137
+ maxFeesPerGas: tx.data.constants.txContext.gasSettings.maxFeesPerGas,
138
+ },
139
+ },
107
140
  },
108
141
  },
109
142
  };
110
143
  }
111
144
 
145
+ // V8 JS object overhead (~64 bytes for a plain object with hidden class).
146
+ // String overhead: ~32 bytes header + 1 byte per ASCII char (V8 one-byte strings).
147
+ // Hex string (0x + 64 hex chars = 66 chars): ~98 bytes per string.
148
+ // bigint: ~32 bytes. number: 8 bytes. Fr: ~80 bytes (32 data + object overhead).
149
+ const OBJECT_OVERHEAD = 64;
150
+ const HEX_STRING_BYTES = 98;
151
+ const BIGINT_BYTES = 32;
152
+ const FR_BYTES = 80;
153
+ // Fixed cost: object shell + txHash + anchorBlockHeaderHash + feePayer (3 hex strings)
154
+ // + txHashBigInt + priorityFee + claimAmount + feeLimit + includeByTimestamp (5 bigints)
155
+ // + receivedAt (number, 8 bytes) + estimatedSizeBytes (number, 8 bytes)
156
+ // + data closure object (~OBJECT_OVERHEAD + anchorBlockHeaderHashFr Fr + anchorBlockNumber number)
157
+ const FIXED_METADATA_BYTES =
158
+ OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 5 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8;
159
+
160
+ /** Estimates the in-memory size of a TxMetaData object based on the number of nullifiers. */
161
+ function estimateTxMetaDataSize(nullifierCount: number): number {
162
+ // Per nullifier: one hex string in nullifiers[] + one Fr in the captured nullifierFrs[]
163
+ return FIXED_METADATA_BYTES + nullifierCount * (HEX_STRING_BYTES + FR_BYTES);
164
+ }
165
+
166
+ /** Converts a txHash bigint back to the canonical 0x-prefixed 64-char hex string. */
167
+ export function txHashFromBigInt(value: bigint): string {
168
+ return TxHash.fromBigInt(value).toString();
169
+ }
170
+
112
171
  /** Minimal fields required for priority comparison. */
113
- type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
172
+ export type PriorityComparable = Pick<TxMetaData, 'txHash' | 'txHashBigInt' | 'priorityFee'>;
114
173
 
115
174
  /**
116
175
  * Compares two priority fees in ascending order.
117
176
  * Returns negative if a < b, positive if a > b, 0 if equal.
118
177
  */
119
- export function compareFee(a: bigint, b: bigint): number {
178
+ export function compareFee(a: bigint, b: bigint): -1 | 0 | 1 {
120
179
  return a < b ? -1 : a > b ? 1 : 0;
121
180
  }
122
181
 
@@ -125,10 +184,8 @@ export function compareFee(a: bigint, b: bigint): number {
125
184
  * Uses field element comparison for deterministic ordering.
126
185
  * Returns negative if a < b, positive if a > b, 0 if equal.
127
186
  */
128
- export function compareTxHash(a: string, b: string): number {
129
- const fieldA = Fr.fromHexString(a);
130
- const fieldB = Fr.fromHexString(b);
131
- return fieldA.cmp(fieldB);
187
+ export function compareTxHash(a: bigint, b: bigint): -1 | 0 | 1 {
188
+ return Fr.cmpAsBigInt(a, b);
132
189
  }
133
190
 
134
191
  /**
@@ -136,29 +193,46 @@ export function compareTxHash(a: string, b: string): number {
136
193
  * Returns negative if a < b, positive if a > b, 0 if equal.
137
194
  * Use with sort() for ascending order, or negate/reverse for descending.
138
195
  */
139
- export function comparePriority(a: PriorityComparable, b: PriorityComparable): number {
196
+ export function comparePriority(a: PriorityComparable, b: PriorityComparable): -1 | 0 | 1 {
140
197
  const feeComparison = compareFee(a.priorityFee, b.priorityFee);
141
198
  if (feeComparison !== 0) {
142
199
  return feeComparison;
143
200
  }
144
- return compareTxHash(a.txHash, b.txHash);
201
+ return compareTxHash(a.txHashBigInt, b.txHashBigInt);
202
+ }
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;
145
214
  }
146
215
 
147
216
  /**
148
217
  * Checks for nullifier conflicts between an incoming transaction and existing pool state.
149
218
  *
150
219
  * When the incoming tx shares nullifiers with existing pending txs:
151
- * - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
152
- * - 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`.
153
225
  *
154
226
  * @param incomingMeta - Metadata for the incoming transaction
155
227
  * @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
156
228
  * @param getMetadata - Accessor to get metadata for a tx hash
229
+ * @param priceBumpPercentage - Optional percentage bump required for fee-based replacement
157
230
  */
158
231
  export function checkNullifierConflict(
159
232
  incomingMeta: TxMetaData,
160
233
  getTxHashByNullifier: (nullifier: string) => string | undefined,
161
234
  getMetadata: (txHash: string) => TxMetaData | undefined,
235
+ priceBumpPercentage?: bigint,
162
236
  ): PreAddResult {
163
237
  const txHashesToEvict: string[] = [];
164
238
 
@@ -179,16 +253,33 @@ export function checkNullifierConflict(
179
253
  continue;
180
254
  }
181
255
 
182
- // If incoming tx has strictly higher priority, mark for eviction
183
- // Otherwise, ignore incoming tx (ties go to existing tx)
184
- // Use comparePriority for deterministic ordering (includes txHash as tiebreaker)
185
- 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) {
186
264
  txHashesToEvict.push(conflictingHashStr);
187
265
  } else {
266
+ const minimumFee =
267
+ priceBumpPercentage !== undefined
268
+ ? getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
269
+ : undefined;
188
270
  return {
189
271
  shouldIgnore: true,
190
272
  txHashesToEvict: [],
191
- reason: `nullifier conflict with ${conflictingHashStr}`,
273
+ reason: {
274
+ code: TxPoolRejectionCode.NULLIFIER_CONFLICT,
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}`,
279
+ conflictingTxHash: conflictingHashStr,
280
+ minimumPriceBumpFee: minimumFee,
281
+ txPriorityFee: minimumFee !== undefined ? incomingMeta.priorityFee : undefined,
282
+ },
192
283
  };
193
284
  }
194
285
  }
@@ -197,15 +288,62 @@ export function checkNullifierConflict(
197
288
  }
198
289
 
199
290
  /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
200
- export function stubTxMetaValidationData(overrides: { includeByTimestamp?: bigint } = {}): TxMetaValidationData {
291
+ export function stubTxMetaValidationData(
292
+ overrides: { expirationTimestamp?: bigint; maxFeesPerGas?: GasFees } = {},
293
+ ): TxMetaValidationData {
201
294
  return {
202
295
  getNonEmptyNullifiers: () => [],
203
- includeByTimestamp: overrides.includeByTimestamp ?? 0n,
296
+ expirationTimestamp: overrides.expirationTimestamp ?? 0n,
204
297
  constants: {
205
298
  anchorBlockHeader: {
206
- hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
299
+ hash: () => Promise.resolve(BlockHash.ZERO),
207
300
  globalVariables: { blockNumber: BlockNumber(0) },
208
301
  },
302
+ txContext: {
303
+ gasSettings: { gasLimits: Gas.empty(), maxFeesPerGas: overrides.maxFeesPerGas ?? GasFees.empty() },
304
+ },
209
305
  },
210
306
  };
211
307
  }
308
+
309
+ /** Creates a stub TxMetaData for tests. All fields have sensible defaults and can be overridden. */
310
+ export function stubTxMetaData(
311
+ txHash: string,
312
+ overrides: {
313
+ priorityFee?: bigint;
314
+ feePayer?: string;
315
+ claimAmount?: bigint;
316
+ feeLimit?: bigint;
317
+ nullifiers?: string[];
318
+ expirationTimestamp?: bigint;
319
+ anchorBlockHeaderHash?: string;
320
+ allowedSetupCalls?: boolean;
321
+ maxFeesPerGas?: GasFees;
322
+ } = {},
323
+ ): TxMetaData {
324
+ const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
325
+ // Normalize to canonical zero-padded hex so txHashFromBigInt(txHashBigInt) === normalizedTxHash
326
+ const normalizedTxHash = txHashFromBigInt(txHashBigInt);
327
+ const expirationTimestamp = overrides.expirationTimestamp ?? 0n;
328
+ return {
329
+ txHash: normalizedTxHash,
330
+ txHashBigInt,
331
+ anchorBlockHeaderHash: overrides.anchorBlockHeaderHash ?? '0x1234',
332
+ priorityFee: overrides.priorityFee ?? 100n,
333
+ feePayer: overrides.feePayer ?? '0xfeepayer',
334
+ claimAmount: overrides.claimAmount ?? 0n,
335
+ feeLimit: overrides.feeLimit ?? 100n,
336
+ nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
337
+ expirationTimestamp,
338
+ allowedSetupCalls: overrides.allowedSetupCalls ?? true,
339
+ receivedAt: 0,
340
+ estimatedSizeBytes: 0,
341
+ data: stubTxMetaValidationData({ expirationTimestamp, maxFeesPerGas: overrides.maxFeesPerGas }),
342
+ };
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 } 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;
@@ -348,13 +337,15 @@ export class TxPoolIndices {
348
337
  // METRICS
349
338
  // ============================================================================
350
339
 
351
- /** Counts transactions by state */
352
- countTxs(): { pending: number; protected: number; mined: number } {
340
+ /** Counts transactions by state and estimates total metadata memory usage */
341
+ countTxs(): { pending: number; protected: number; mined: number; totalMetadataBytes: number } {
353
342
  let pending = 0;
354
343
  let protected_ = 0;
355
344
  let mined = 0;
345
+ let totalMetadataBytes = 0;
356
346
 
357
347
  for (const meta of this.#metadata.values()) {
348
+ totalMetadataBytes += meta.estimatedSizeBytes;
358
349
  const state = this.getTxState(meta);
359
350
  if (state === 'pending') {
360
351
  pending++;
@@ -365,7 +356,16 @@ export class TxPoolIndices {
365
356
  }
366
357
  }
367
358
 
368
- return { pending, protected: protected_, mined };
359
+ return { pending, protected: protected_, mined, totalMetadataBytes };
360
+ }
361
+
362
+ /** Returns the estimated total memory consumed by all metadata objects */
363
+ getTotalMetadataBytes(): number {
364
+ let total = 0;
365
+ for (const meta of this.#metadata.values()) {
366
+ total += meta.estimatedSizeBytes;
367
+ }
368
+ return total;
369
369
  }
370
370
 
371
371
  /** Gets all mined transactions with their block IDs */
@@ -397,13 +397,12 @@ export class TxPoolIndices {
397
397
  }
398
398
  feePayerSet.add(meta.txHash);
399
399
 
400
- // Add to priority bucket
401
- let prioritySet = this.#pendingByPriority.get(meta.priorityFee);
402
- if (!prioritySet) {
403
- prioritySet = new Set();
404
- this.#pendingByPriority.set(meta.priorityFee, prioritySet);
405
- }
406
- prioritySet.add(meta.txHash);
400
+ insertIntoSortedArray(
401
+ this.#pendingByPriority,
402
+ { txHash: meta.txHash, priorityFee: meta.priorityFee, txHashBigInt: meta.txHashBigInt },
403
+ comparePriority,
404
+ false,
405
+ );
407
406
  }
408
407
 
409
408
  #removeFromPendingIndices(meta: TxMetaData): void {
@@ -421,13 +420,11 @@ export class TxPoolIndices {
421
420
  }
422
421
  }
423
422
 
424
- // Remove from priority map
425
- const hashSet = this.#pendingByPriority.get(meta.priorityFee);
426
- if (hashSet) {
427
- hashSet.delete(meta.txHash);
428
- if (hashSet.size === 0) {
429
- this.#pendingByPriority.delete(meta.priorityFee);
430
- }
431
- }
423
+ // Remove from priority array
424
+ removeFromSortedArray(
425
+ this.#pendingByPriority,
426
+ { txHash: meta.txHash, priorityFee: meta.priorityFee, txHashBigInt: meta.txHashBigInt },
427
+ comparePriority,
428
+ );
432
429
  }
433
430
  }