@aztec/p2p 0.0.1-commit.4d79d1f2d → 0.0.1-commit.5358163d3

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 (277) hide show
  1. package/dest/client/factory.d.ts +6 -6
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +23 -30
  4. package/dest/client/interface.d.ts +14 -19
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +9 -18
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +52 -72
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
  10. package/dest/config.d.ts +20 -14
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +30 -35
  13. package/dest/errors/tx-pool.error.d.ts +8 -0
  14. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  15. package/dest/errors/tx-pool.error.js +9 -0
  16. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -2
  17. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  18. package/dest/mem_pools/attestation_pool/attestation_pool.js +10 -1
  19. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  20. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  22. package/dest/mem_pools/instrumentation.d.ts +4 -2
  23. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  24. package/dest/mem_pools/instrumentation.js +16 -14
  25. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  26. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +30 -13
  27. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  28. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +91 -20
  29. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  30. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  32. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  33. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -2
  35. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  36. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  38. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  39. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +48 -5
  42. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  44. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  45. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  46. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  47. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  49. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  50. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +14 -4
  52. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  53. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  55. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  58. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  59. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  61. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +20 -6
  62. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +34 -8
  65. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +76 -10
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +36 -14
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
  71. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +14 -6
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  74. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +299 -142
  76. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +2 -1
  77. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  78. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +2 -1
  79. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  80. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -1
  81. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  82. package/dest/msg_validators/proposal_validator/proposal_validator.js +10 -0
  83. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +2 -1
  84. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
  85. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +166 -0
  86. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  87. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  88. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  89. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  90. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  91. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -10
  92. package/dest/msg_validators/tx_validator/factory.d.ts +114 -6
  93. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  94. package/dest/msg_validators/tx_validator/factory.js +219 -58
  95. package/dest/msg_validators/tx_validator/gas_validator.d.ts +58 -3
  96. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/tx_validator/gas_validator.js +73 -36
  98. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  99. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  100. package/dest/msg_validators/tx_validator/index.js +1 -0
  101. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  102. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  103. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  104. package/dest/msg_validators/tx_validator/phases_validator.d.ts +2 -2
  105. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/tx_validator/phases_validator.js +25 -24
  107. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  108. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  110. package/dest/services/dummy_service.d.ts +4 -4
  111. package/dest/services/dummy_service.d.ts.map +1 -1
  112. package/dest/services/dummy_service.js +4 -4
  113. package/dest/services/encoding.d.ts +2 -2
  114. package/dest/services/encoding.d.ts.map +1 -1
  115. package/dest/services/encoding.js +9 -8
  116. package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
  117. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  118. package/dest/services/gossipsub/topic_score_params.js +32 -10
  119. package/dest/services/libp2p/libp2p_service.d.ts +16 -13
  120. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  121. package/dest/services/libp2p/libp2p_service.js +77 -84
  122. package/dest/services/peer-manager/metrics.d.ts +3 -1
  123. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  124. package/dest/services/peer-manager/metrics.js +6 -0
  125. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  126. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  127. package/dest/services/peer-manager/peer_manager.js +2 -1
  128. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -3
  129. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  130. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +19 -46
  131. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
  132. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  133. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -13
  134. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  135. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +25 -46
  136. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +17 -11
  137. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  138. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +49 -15
  139. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  140. package/dest/services/reqresp/reqresp.d.ts +1 -1
  141. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  142. package/dest/services/reqresp/reqresp.js +2 -1
  143. package/dest/services/service.d.ts +5 -3
  144. package/dest/services/service.d.ts.map +1 -1
  145. package/dest/services/tx_collection/config.d.ts +13 -1
  146. package/dest/services/tx_collection/config.d.ts.map +1 -1
  147. package/dest/services/tx_collection/config.js +30 -0
  148. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -1
  149. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  150. package/dest/services/tx_collection/fast_tx_collection.js +39 -33
  151. package/dest/services/tx_collection/file_store_tx_collection.d.ts +38 -29
  152. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  153. package/dest/services/tx_collection/file_store_tx_collection.js +126 -77
  154. package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
  155. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  156. package/dest/services/tx_collection/file_store_tx_source.js +49 -16
  157. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  158. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  159. package/dest/services/tx_collection/instrumentation.js +2 -1
  160. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  161. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  162. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  163. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
  164. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  165. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  166. package/dest/services/tx_collection/slow_tx_collection.d.ts +5 -3
  167. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  168. package/dest/services/tx_collection/slow_tx_collection.js +17 -12
  169. package/dest/services/tx_collection/tx_collection.d.ts +9 -6
  170. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  171. package/dest/services/tx_collection/tx_collection.js +26 -10
  172. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  173. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  174. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  175. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  176. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  177. package/dest/services/tx_collection/tx_source.js +19 -2
  178. package/dest/services/tx_file_store/tx_file_store.d.ts +3 -2
  179. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  180. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  181. package/dest/services/tx_provider.d.ts +3 -3
  182. package/dest/services/tx_provider.d.ts.map +1 -1
  183. package/dest/services/tx_provider.js +4 -4
  184. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  185. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  186. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  187. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  188. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  189. package/dest/test-helpers/mock-pubsub.js +8 -2
  190. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  191. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  192. package/dest/test-helpers/reqresp-nodes.js +2 -2
  193. package/dest/test-helpers/testbench-utils.d.ts +8 -3
  194. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  195. package/dest/test-helpers/testbench-utils.js +7 -1
  196. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  197. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  198. package/dest/testbench/p2p_client_testbench_worker.js +13 -13
  199. package/dest/util.d.ts +2 -2
  200. package/dest/util.d.ts.map +1 -1
  201. package/package.json +14 -14
  202. package/src/client/factory.ts +39 -48
  203. package/src/client/interface.ts +17 -20
  204. package/src/client/p2p_client.ts +60 -104
  205. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -10
  206. package/src/config.ts +44 -42
  207. package/src/errors/tx-pool.error.ts +12 -0
  208. package/src/mem_pools/attestation_pool/attestation_pool.ts +13 -4
  209. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  210. package/src/mem_pools/instrumentation.ts +17 -13
  211. package/src/mem_pools/tx_pool/README.md +1 -1
  212. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  213. package/src/mem_pools/tx_pool_v2/README.md +43 -27
  214. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +109 -22
  215. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  216. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -2
  217. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  218. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  219. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +49 -4
  220. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  221. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  222. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  223. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +24 -6
  224. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +3 -3
  225. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  226. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  227. package/src/mem_pools/tx_pool_v2/interfaces.ts +21 -6
  228. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +107 -17
  229. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -16
  230. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +21 -7
  231. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +331 -138
  232. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +1 -1
  233. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +1 -1
  234. package/src/msg_validators/proposal_validator/proposal_validator.ts +15 -1
  235. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +144 -1
  236. package/src/msg_validators/tx_validator/README.md +115 -0
  237. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  238. package/src/msg_validators/tx_validator/allowed_public_setup.ts +27 -13
  239. package/src/msg_validators/tx_validator/factory.ts +353 -77
  240. package/src/msg_validators/tx_validator/gas_validator.ts +90 -27
  241. package/src/msg_validators/tx_validator/index.ts +1 -0
  242. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  243. package/src/msg_validators/tx_validator/phases_validator.ts +25 -29
  244. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  245. package/src/services/dummy_service.ts +6 -6
  246. package/src/services/encoding.ts +7 -7
  247. package/src/services/gossipsub/README.md +29 -14
  248. package/src/services/gossipsub/topic_score_params.ts +49 -13
  249. package/src/services/libp2p/libp2p_service.ts +89 -92
  250. package/src/services/peer-manager/metrics.ts +7 -0
  251. package/src/services/peer-manager/peer_manager.ts +2 -1
  252. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +20 -48
  253. package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
  254. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
  255. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +63 -24
  256. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  257. package/src/services/reqresp/reqresp.ts +3 -1
  258. package/src/services/service.ts +11 -2
  259. package/src/services/tx_collection/config.ts +42 -0
  260. package/src/services/tx_collection/fast_tx_collection.ts +51 -30
  261. package/src/services/tx_collection/file_store_tx_collection.ts +143 -93
  262. package/src/services/tx_collection/file_store_tx_source.ts +64 -17
  263. package/src/services/tx_collection/instrumentation.ts +7 -1
  264. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  265. package/src/services/tx_collection/proposal_tx_collector.ts +8 -7
  266. package/src/services/tx_collection/slow_tx_collection.ts +17 -13
  267. package/src/services/tx_collection/tx_collection.ts +45 -14
  268. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  269. package/src/services/tx_collection/tx_source.ts +22 -3
  270. package/src/services/tx_file_store/tx_file_store.ts +6 -4
  271. package/src/services/tx_provider.ts +2 -2
  272. package/src/test-helpers/make-test-p2p-clients.ts +0 -2
  273. package/src/test-helpers/mock-pubsub.ts +13 -6
  274. package/src/test-helpers/reqresp-nodes.ts +2 -5
  275. package/src/test-helpers/testbench-utils.ts +11 -3
  276. package/src/testbench/p2p_client_testbench_worker.ts +22 -19
  277. package/src/util.ts +7 -1
@@ -2,16 +2,19 @@ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
4
  import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
5
- import type { Tx } from '@aztec/stdlib/tx';
5
+ import { Gas } from '@aztec/stdlib/gas';
6
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
6
7
 
7
8
  import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
8
9
  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 };
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,10 +65,16 @@ 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;
60
69
 
61
70
  /** Validator-compatible data, providing the same access patterns as Tx.data */
62
71
  readonly data: TxMetaValidationData;
72
+
73
+ /** Timestamp (ms) when the tx was received into the pool. 0 for hydrated txs (always eligible). */
74
+ receivedAt: number;
75
+
76
+ /** Estimated memory footprint of this metadata object in bytes */
77
+ readonly estimatedSizeBytes: number;
63
78
  };
64
79
 
65
80
  /** Transaction state derived from TxMetaData fields and pool protection status */
@@ -71,42 +86,79 @@ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
71
86
  * Fr values are captured in closures for zero-cost re-validation.
72
87
  */
73
88
  export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
74
- const txHash = tx.getTxHash().toString();
89
+ const txHashObj = tx.getTxHash();
90
+ const txHash = txHashObj.toString();
91
+ const txHashBigInt = txHashObj.toBigInt();
75
92
  const nullifierFrs = tx.data.getNonEmptyNullifiers();
76
93
  const nullifiers = nullifierFrs.map(n => n.toString());
77
94
  const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash();
78
95
  const anchorBlockHeaderHash = anchorBlockHeaderHashFr.toString();
79
- const includeByTimestamp = tx.data.includeByTimestamp;
96
+ const expirationTimestamp = tx.data.expirationTimestamp;
80
97
  const anchorBlockNumber = tx.data.constants.anchorBlockHeader.globalVariables.blockNumber;
81
98
  const priorityFee = getTxPriorityFee(tx);
82
99
  const feePayer = tx.data.feePayer.toString();
83
100
 
84
101
  const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
85
102
 
103
+ const estimatedSizeBytes = estimateTxMetaDataSize(nullifiers.length);
104
+
86
105
  return {
87
106
  txHash,
107
+ txHashBigInt,
88
108
  anchorBlockHeaderHash,
89
109
  priorityFee,
90
110
  feePayer,
91
111
  claimAmount,
92
112
  feeLimit,
93
113
  nullifiers,
94
- includeByTimestamp,
114
+ expirationTimestamp,
115
+ receivedAt: 0,
116
+ estimatedSizeBytes,
95
117
  data: {
96
118
  getNonEmptyNullifiers: () => nullifierFrs,
97
- includeByTimestamp,
119
+ expirationTimestamp,
120
+ forPublic: !!tx.data.forPublic,
98
121
  constants: {
99
122
  anchorBlockHeader: {
100
123
  hash: () => Promise.resolve(anchorBlockHeaderHashFr),
101
124
  globalVariables: { blockNumber: anchorBlockNumber },
102
125
  },
126
+ txContext: {
127
+ gasSettings: { gasLimits: tx.data.constants.txContext.gasSettings.gasLimits },
128
+ },
103
129
  },
104
130
  },
105
131
  };
106
132
  }
107
133
 
134
+ // V8 JS object overhead (~64 bytes for a plain object with hidden class).
135
+ // String overhead: ~32 bytes header + 1 byte per ASCII char (V8 one-byte strings).
136
+ // Hex string (0x + 64 hex chars = 66 chars): ~98 bytes per string.
137
+ // bigint: ~32 bytes. number: 8 bytes. Fr: ~80 bytes (32 data + object overhead).
138
+ const OBJECT_OVERHEAD = 64;
139
+ const HEX_STRING_BYTES = 98;
140
+ const BIGINT_BYTES = 32;
141
+ const FR_BYTES = 80;
142
+ // Fixed cost: object shell + txHash + anchorBlockHeaderHash + feePayer (3 hex strings)
143
+ // + txHashBigInt + priorityFee + claimAmount + feeLimit + includeByTimestamp (5 bigints)
144
+ // + receivedAt (number, 8 bytes) + estimatedSizeBytes (number, 8 bytes)
145
+ // + data closure object (~OBJECT_OVERHEAD + anchorBlockHeaderHashFr Fr + anchorBlockNumber number)
146
+ const FIXED_METADATA_BYTES =
147
+ OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 5 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8;
148
+
149
+ /** Estimates the in-memory size of a TxMetaData object based on the number of nullifiers. */
150
+ function estimateTxMetaDataSize(nullifierCount: number): number {
151
+ // Per nullifier: one hex string in nullifiers[] + one Fr in the captured nullifierFrs[]
152
+ return FIXED_METADATA_BYTES + nullifierCount * (HEX_STRING_BYTES + FR_BYTES);
153
+ }
154
+
155
+ /** Converts a txHash bigint back to the canonical 0x-prefixed 64-char hex string. */
156
+ export function txHashFromBigInt(value: bigint): string {
157
+ return TxHash.fromBigInt(value).toString();
158
+ }
159
+
108
160
  /** Minimal fields required for priority comparison. */
109
- type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
161
+ type PriorityComparable = Pick<TxMetaData, 'txHashBigInt' | 'priorityFee'>;
110
162
 
111
163
  /**
112
164
  * Compares two priority fees in ascending order.
@@ -121,10 +173,8 @@ export function compareFee(a: bigint, b: bigint): number {
121
173
  * Uses field element comparison for deterministic ordering.
122
174
  * Returns negative if a < b, positive if a > b, 0 if equal.
123
175
  */
124
- export function compareTxHash(a: string, b: string): number {
125
- const fieldA = Fr.fromHexString(a);
126
- const fieldB = Fr.fromHexString(b);
127
- return fieldA.cmp(fieldB);
176
+ export function compareTxHash(a: bigint, b: bigint): number {
177
+ return Fr.cmpAsBigInt(a, b);
128
178
  }
129
179
 
130
180
  /**
@@ -137,7 +187,7 @@ export function comparePriority(a: PriorityComparable, b: PriorityComparable): n
137
187
  if (feeComparison !== 0) {
138
188
  return feeComparison;
139
189
  }
140
- return compareTxHash(a.txHash, b.txHash);
190
+ return compareTxHash(a.txHashBigInt, b.txHashBigInt);
141
191
  }
142
192
 
143
193
  /**
@@ -184,7 +234,11 @@ export function checkNullifierConflict(
184
234
  return {
185
235
  shouldIgnore: true,
186
236
  txHashesToEvict: [],
187
- reason: `nullifier conflict with ${conflictingHashStr}`,
237
+ reason: {
238
+ code: TxPoolRejectionCode.NULLIFIER_CONFLICT,
239
+ message: `Nullifier conflict with existing tx ${conflictingHashStr}`,
240
+ conflictingTxHash: conflictingHashStr,
241
+ },
188
242
  };
189
243
  }
190
244
  }
@@ -193,15 +247,51 @@ export function checkNullifierConflict(
193
247
  }
194
248
 
195
249
  /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
196
- export function stubTxMetaValidationData(overrides: { includeByTimestamp?: bigint } = {}): TxMetaValidationData {
250
+ export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigint } = {}): TxMetaValidationData {
197
251
  return {
198
252
  getNonEmptyNullifiers: () => [],
199
- includeByTimestamp: overrides.includeByTimestamp ?? 0n,
253
+ expirationTimestamp: overrides.expirationTimestamp ?? 0n,
200
254
  constants: {
201
255
  anchorBlockHeader: {
202
256
  hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
203
257
  globalVariables: { blockNumber: BlockNumber(0) },
204
258
  },
259
+ txContext: {
260
+ gasSettings: { gasLimits: Gas.empty() },
261
+ },
205
262
  },
206
263
  };
207
264
  }
265
+
266
+ /** Creates a stub TxMetaData for tests. All fields have sensible defaults and can be overridden. */
267
+ export function stubTxMetaData(
268
+ txHash: string,
269
+ overrides: {
270
+ priorityFee?: bigint;
271
+ feePayer?: string;
272
+ claimAmount?: bigint;
273
+ feeLimit?: bigint;
274
+ nullifiers?: string[];
275
+ expirationTimestamp?: bigint;
276
+ anchorBlockHeaderHash?: string;
277
+ } = {},
278
+ ): TxMetaData {
279
+ const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
280
+ // Normalize to canonical zero-padded hex so txHashFromBigInt(txHashBigInt) === normalizedTxHash
281
+ const normalizedTxHash = txHashFromBigInt(txHashBigInt);
282
+ const expirationTimestamp = overrides.expirationTimestamp ?? 0n;
283
+ return {
284
+ txHash: normalizedTxHash,
285
+ txHashBigInt,
286
+ anchorBlockHeaderHash: overrides.anchorBlockHeaderHash ?? '0x1234',
287
+ priorityFee: overrides.priorityFee ?? 100n,
288
+ feePayer: overrides.feePayer ?? '0xfeepayer',
289
+ claimAmount: overrides.claimAmount ?? 0n,
290
+ feeLimit: overrides.feeLimit ?? 100n,
291
+ nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
292
+ expirationTimestamp,
293
+ receivedAt: 0,
294
+ estimatedSizeBytes: 0,
295
+ data: stubTxMetaValidationData({ expirationTimestamp }),
296
+ };
297
+ }
@@ -1,7 +1,7 @@
1
1
  import { SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import type { L2BlockId } from '@aztec/stdlib/block';
3
3
 
4
- import { type TxMetaData, type TxState, compareFee, compareTxHash } from './tx_metadata.js';
4
+ import { type TxMetaData, type TxState, compareFee, compareTxHash, txHashFromBigInt } from './tx_metadata.js';
5
5
 
6
6
  /**
7
7
  * Manages in-memory indices for the transaction pool.
@@ -22,8 +22,8 @@ export class TxPoolIndices {
22
22
  #nullifierToTxHash: Map<string, string> = new Map();
23
23
  /** Fee payer to txHashes index (pending txs only) */
24
24
  #feePayerToTxHashes: Map<string, Set<string>> = new Map();
25
- /** Pending txHashes grouped by priority fee */
26
- #pendingByPriority: Map<bigint, Set<string>> = new Map();
25
+ /** Pending txHash bigints grouped by priority fee */
26
+ #pendingByPriority: Map<bigint, Set<bigint>> = new Map();
27
27
  /** Protected transactions: txHash -> slotNumber */
28
28
  #protectedTransactions: Map<string, SlotNumber> = new Map();
29
29
 
@@ -72,23 +72,39 @@ export class TxPoolIndices {
72
72
  * Iterates pending transaction hashes in priority order.
73
73
  * @param order - 'desc' for highest priority first, 'asc' for lowest priority first
74
74
  */
75
- *iteratePendingByPriority(order: 'asc' | 'desc'): Generator<string> {
76
- // Use compareFee from tx_metadata, swap args for descending order
75
+ *iteratePendingByPriority(order: 'asc' | 'desc', filter?: (hash: string) => boolean): Generator<string> {
77
76
  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;
77
+ const hashCompareFn =
78
+ order === 'desc' ? (a: bigint, b: bigint) => compareTxHash(b, a) : (a: bigint, b: bigint) => compareTxHash(a, b);
79
79
 
80
80
  const sortedFees = [...this.#pendingByPriority.keys()].sort(feeCompareFn);
81
81
 
82
82
  for (const fee of sortedFees) {
83
83
  const hashesAtFee = this.#pendingByPriority.get(fee)!;
84
- // Use compareTxHash from tx_metadata, swap args for descending order
85
84
  const sortedHashes = [...hashesAtFee].sort(hashCompareFn);
86
- for (const hash of sortedHashes) {
87
- yield hash;
85
+ for (const hashBigInt of sortedHashes) {
86
+ const hash = txHashFromBigInt(hashBigInt);
87
+ if (filter === undefined || filter(hash)) {
88
+ yield hash;
89
+ }
88
90
  }
89
91
  }
90
92
  }
91
93
 
94
+ /**
95
+ * Iterates pending transaction hashes in priority order, skipping txs received after maxReceivedAt.
96
+ * @param order - 'desc' for highest priority first, 'asc' for lowest priority first
97
+ * @param maxReceivedAt - Only yield txs with receivedAt <= this value
98
+ */
99
+ *iterateEligiblePendingByPriority(order: 'asc' | 'desc', maxReceivedAt: number): Generator<string> {
100
+ const filter = (hash: string) => {
101
+ const meta = this.#metadata.get(hash);
102
+ return meta !== undefined && meta.receivedAt <= maxReceivedAt;
103
+ };
104
+
105
+ yield* this.iteratePendingByPriority(order, filter);
106
+ }
107
+
92
108
  /** Iterates all metadata entries */
93
109
  *iterateMetadata(): Generator<[string, TxMetaData]> {
94
110
  yield* this.#metadata;
@@ -249,8 +265,8 @@ export class TxPoolIndices {
249
265
  getPendingTxs(): TxMetaData[] {
250
266
  const result: TxMetaData[] = [];
251
267
  for (const hashSet of this.#pendingByPriority.values()) {
252
- for (const txHash of hashSet) {
253
- const meta = this.#metadata.get(txHash);
268
+ for (const txHashBigInt of hashSet) {
269
+ const meta = this.#metadata.get(txHashFromBigInt(txHashBigInt));
254
270
  if (meta) {
255
271
  result.push(meta);
256
272
  }
@@ -332,13 +348,15 @@ export class TxPoolIndices {
332
348
  // METRICS
333
349
  // ============================================================================
334
350
 
335
- /** Counts transactions by state */
336
- countTxs(): { pending: number; protected: number; mined: number } {
351
+ /** Counts transactions by state and estimates total metadata memory usage */
352
+ countTxs(): { pending: number; protected: number; mined: number; totalMetadataBytes: number } {
337
353
  let pending = 0;
338
354
  let protected_ = 0;
339
355
  let mined = 0;
356
+ let totalMetadataBytes = 0;
340
357
 
341
358
  for (const meta of this.#metadata.values()) {
359
+ totalMetadataBytes += meta.estimatedSizeBytes;
342
360
  const state = this.getTxState(meta);
343
361
  if (state === 'pending') {
344
362
  pending++;
@@ -349,7 +367,16 @@ export class TxPoolIndices {
349
367
  }
350
368
  }
351
369
 
352
- return { pending, protected: protected_, mined };
370
+ return { pending, protected: protected_, mined, totalMetadataBytes };
371
+ }
372
+
373
+ /** Returns the estimated total memory consumed by all metadata objects */
374
+ getTotalMetadataBytes(): number {
375
+ let total = 0;
376
+ for (const meta of this.#metadata.values()) {
377
+ total += meta.estimatedSizeBytes;
378
+ }
379
+ return total;
353
380
  }
354
381
 
355
382
  /** Gets all mined transactions with their block IDs */
@@ -387,7 +414,7 @@ export class TxPoolIndices {
387
414
  prioritySet = new Set();
388
415
  this.#pendingByPriority.set(meta.priorityFee, prioritySet);
389
416
  }
390
- prioritySet.add(meta.txHash);
417
+ prioritySet.add(meta.txHashBigInt);
391
418
  }
392
419
 
393
420
  #removeFromPendingIndices(meta: TxMetaData): void {
@@ -408,7 +435,7 @@ export class TxPoolIndices {
408
435
  // Remove from priority map
409
436
  const hashSet = this.#pendingByPriority.get(meta.priorityFee);
410
437
  if (hashSet) {
411
- hashSet.delete(meta.txHash);
438
+ hashSet.delete(meta.txHashBigInt);
412
439
  if (hashSet.size === 0) {
413
440
  this.#pendingByPriority.delete(meta.priorityFee);
414
441
  }
@@ -1,6 +1,7 @@
1
1
  import { SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
3
  import { SerialQueue } from '@aztec/foundation/queue';
4
+ import { DateProvider } from '@aztec/foundation/timer';
4
5
  import type { TypedEventEmitter } from '@aztec/foundation/types';
5
6
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
6
7
  import type { L2Block, L2BlockId } from '@aztec/stdlib/block';
@@ -35,6 +36,7 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
35
36
  deps: TxPoolV2Dependencies,
36
37
  telemetry: TelemetryClient = getTelemetryClient(),
37
38
  config: Partial<TxPoolV2Config> = {},
39
+ dateProvider: DateProvider = new DateProvider(),
38
40
  log = createLogger('p2p:tx_pool_v2'),
39
41
  ) {
40
42
  super();
@@ -56,10 +58,13 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
56
58
  const hashes = txHashes.map(h => (typeof h === 'string' ? TxHash.fromString(h) : TxHash.fromBigInt(h)));
57
59
  this.emit('txs-removed', { txHashes: hashes });
58
60
  },
61
+ onTxsMined: (txHashes: string[]) => {
62
+ this.#metrics?.transactionsRemoved(txHashes);
63
+ },
59
64
  };
60
65
 
61
66
  // Create the implementation
62
- this.#impl = new TxPoolV2Impl(store, archiveStore, deps, callbacks, config, log);
67
+ this.#impl = new TxPoolV2Impl(store, archiveStore, deps, callbacks, telemetry, config, dateProvider, log);
63
68
  }
64
69
 
65
70
  // ============================================================================
@@ -68,11 +73,11 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
68
73
 
69
74
  // === Core Operations ===
70
75
 
71
- addPendingTxs(txs: Tx[], opts: { source?: string } = {}): Promise<AddTxsResult> {
76
+ addPendingTxs(txs: Tx[], opts: { source?: string; feeComparisonOnly?: boolean } = {}): Promise<AddTxsResult> {
72
77
  return this.#queue.put(() => this.#impl.addPendingTxs(txs, opts));
73
78
  }
74
79
 
75
- canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'> {
80
+ canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> {
76
81
  return this.#queue.put(() => this.#impl.canAddPendingTx(tx));
77
82
  }
78
83
 
@@ -81,7 +86,7 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
81
86
  }
82
87
 
83
88
  protectTxs(txHashes: TxHash[], block: BlockHeader): Promise<TxHash[]> {
84
- return this.#queue.put(() => Promise.resolve(this.#impl.protectTxs(txHashes, block)));
89
+ return this.#queue.put(() => this.#impl.protectTxs(txHashes, block));
85
90
  }
86
91
 
87
92
  addMinedTxs(txs: Tx[], block: BlockHeader, opts: { source?: string } = {}): Promise<void> {
@@ -98,8 +103,8 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
98
103
  return this.#queue.put(() => this.#impl.prepareForSlot(slotNumber));
99
104
  }
100
105
 
101
- handlePrunedBlocks(latestBlock: L2BlockId): Promise<void> {
102
- return this.#queue.put(() => this.#impl.handlePrunedBlocks(latestBlock));
106
+ handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void> {
107
+ return this.#queue.put(() => this.#impl.handlePrunedBlocks(latestBlock, options));
103
108
  }
104
109
 
105
110
  handleFailedExecution(txHashes: TxHash[]): Promise<void> {
@@ -132,6 +137,10 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
132
137
  return this.#queue.put(() => Promise.resolve(this.#impl.getPendingTxHashes()));
133
138
  }
134
139
 
140
+ getEligiblePendingTxHashes(): Promise<TxHash[]> {
141
+ return this.#queue.put(() => Promise.resolve(this.#impl.getEligiblePendingTxHashes()));
142
+ }
143
+
135
144
  getPendingTxCount(): Promise<number> {
136
145
  return this.#queue.put(() => Promise.resolve(this.#impl.getPendingTxCount()));
137
146
  }
@@ -189,7 +198,12 @@ export class AztecKVTxPoolV2 extends (EventEmitter as new () => TypedEventEmitte
189
198
  this.#queue.put(() => {
190
199
  const counts = this.#impl.countTxs();
191
200
  return Promise.resolve({
192
- itemCount: { pending: counts.pending, protected: counts.protected, mined: counts.mined },
201
+ itemCount: {
202
+ pending: counts.pending,
203
+ protected: counts.protected,
204
+ mined: counts.mined,
205
+ softDeleted: counts.softDeleted,
206
+ },
193
207
  });
194
208
  }),
195
209
  () => this.#store.estimateSize(),