@aztec/p2p 0.0.1-commit.2eb6648a → 0.0.1-commit.343b43af6

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 (364) hide show
  1. package/dest/client/factory.d.ts +9 -9
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +43 -13
  4. package/dest/client/interface.d.ts +39 -33
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +37 -50
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +144 -223
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
  10. package/dest/config.d.ts +48 -17
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +92 -38
  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/index.d.ts +2 -1
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +1 -0
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +72 -38
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +53 -53
  25. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  26. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  29. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  31. package/dest/mem_pools/index.d.ts +2 -1
  32. package/dest/mem_pools/index.d.ts.map +1 -1
  33. package/dest/mem_pools/instrumentation.d.ts +4 -2
  34. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  35. package/dest/mem_pools/instrumentation.js +16 -14
  36. package/dest/mem_pools/interface.d.ts +3 -3
  37. package/dest/mem_pools/interface.d.ts.map +1 -1
  38. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  39. package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
  40. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool/priority.js +4 -3
  42. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  43. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
  45. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  46. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  47. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  49. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -2
  54. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  55. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  57. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
  58. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  61. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  74. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  75. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  77. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  78. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  79. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  80. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +24 -8
  81. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
  83. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +70 -14
  84. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +132 -17
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +14 -6
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
  93. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  94. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +353 -185
  95. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
  96. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  98. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
  99. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  101. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
  102. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/proposal_validator.js +48 -36
  104. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  105. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  107. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  108. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  110. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  111. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  112. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  113. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  114. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  116. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  117. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  119. package/dest/msg_validators/tx_validator/factory.d.ts +125 -6
  120. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/factory.js +226 -58
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  126. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
  128. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  129. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/index.js +2 -0
  131. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  132. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  134. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  135. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  136. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  137. package/dest/msg_validators/tx_validator/phases_validator.d.ts +2 -2
  138. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/phases_validator.js +44 -23
  140. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  141. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  143. package/dest/services/dummy_service.d.ts +9 -5
  144. package/dest/services/dummy_service.d.ts.map +1 -1
  145. package/dest/services/dummy_service.js +7 -4
  146. package/dest/services/encoding.d.ts +3 -3
  147. package/dest/services/encoding.d.ts.map +1 -1
  148. package/dest/services/encoding.js +11 -10
  149. package/dest/services/gossipsub/index.d.ts +3 -0
  150. package/dest/services/gossipsub/index.d.ts.map +1 -0
  151. package/dest/services/gossipsub/index.js +2 -0
  152. package/dest/services/gossipsub/scoring.d.ts +21 -3
  153. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  154. package/dest/services/gossipsub/scoring.js +24 -7
  155. package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
  156. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  157. package/dest/services/gossipsub/topic_score_params.js +346 -0
  158. package/dest/services/libp2p/libp2p_service.d.ts +25 -14
  159. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  160. package/dest/services/libp2p/libp2p_service.js +195 -153
  161. package/dest/services/peer-manager/metrics.d.ts +3 -1
  162. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  163. package/dest/services/peer-manager/metrics.js +6 -0
  164. package/dest/services/peer-manager/peer_manager.d.ts +1 -1
  165. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  166. package/dest/services/peer-manager/peer_manager.js +2 -1
  167. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  168. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  169. package/dest/services/peer-manager/peer_scoring.js +25 -2
  170. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -3
  171. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  172. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +19 -46
  173. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
  174. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  175. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -13
  176. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +25 -46
  178. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +17 -11
  179. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  180. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +49 -15
  181. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  182. package/dest/services/reqresp/interface.d.ts +10 -1
  183. package/dest/services/reqresp/interface.d.ts.map +1 -1
  184. package/dest/services/reqresp/interface.js +15 -1
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
  188. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  189. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
  190. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/tx.js +20 -0
  193. package/dest/services/reqresp/reqresp.d.ts +1 -1
  194. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  195. package/dest/services/reqresp/reqresp.js +13 -5
  196. package/dest/services/service.d.ts +22 -3
  197. package/dest/services/service.d.ts.map +1 -1
  198. package/dest/services/tx_collection/config.d.ts +19 -1
  199. package/dest/services/tx_collection/config.d.ts.map +1 -1
  200. package/dest/services/tx_collection/config.js +46 -0
  201. package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
  202. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  203. package/dest/services/tx_collection/fast_tx_collection.js +56 -36
  204. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  205. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  206. package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
  207. package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
  208. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  209. package/dest/services/tx_collection/file_store_tx_source.js +90 -0
  210. package/dest/services/tx_collection/index.d.ts +2 -1
  211. package/dest/services/tx_collection/index.d.ts.map +1 -1
  212. package/dest/services/tx_collection/index.js +1 -0
  213. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  214. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  215. package/dest/services/tx_collection/instrumentation.js +2 -1
  216. package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
  217. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
  218. package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
  219. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
  220. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  221. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  222. package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
  223. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  224. package/dest/services/tx_collection/slow_tx_collection.js +60 -26
  225. package/dest/services/tx_collection/tx_collection.d.ts +23 -10
  226. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  227. package/dest/services/tx_collection/tx_collection.js +75 -3
  228. package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
  229. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  230. package/dest/services/tx_collection/tx_collection_sink.js +26 -29
  231. package/dest/services/tx_collection/tx_source.d.ts +8 -3
  232. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  233. package/dest/services/tx_collection/tx_source.js +19 -2
  234. package/dest/services/tx_file_store/config.d.ts +1 -3
  235. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  236. package/dest/services/tx_file_store/config.js +0 -4
  237. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  238. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  239. package/dest/services/tx_file_store/tx_file_store.js +9 -6
  240. package/dest/services/tx_provider.d.ts +4 -4
  241. package/dest/services/tx_provider.d.ts.map +1 -1
  242. package/dest/services/tx_provider.js +9 -8
  243. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  244. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  245. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  246. package/dest/test-helpers/mock-pubsub.d.ts +30 -4
  247. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  248. package/dest/test-helpers/mock-pubsub.js +105 -4
  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 +4 -3
  252. package/dest/test-helpers/testbench-utils.d.ts +35 -24
  253. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  254. package/dest/test-helpers/testbench-utils.js +104 -36
  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 +16 -15
  258. package/dest/testbench/worker_client_manager.d.ts +3 -1
  259. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  260. package/dest/testbench/worker_client_manager.js +6 -2
  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 +79 -24
  265. package/src/client/interface.ts +43 -33
  266. package/src/client/p2p_client.ts +165 -265
  267. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +20 -11
  268. package/src/config.ts +141 -44
  269. package/src/errors/tx-pool.error.ts +12 -0
  270. package/src/index.ts +1 -0
  271. package/src/mem_pools/attestation_pool/attestation_pool.ts +100 -48
  272. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +57 -53
  273. package/src/mem_pools/attestation_pool/index.ts +3 -3
  274. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  275. package/src/mem_pools/index.ts +3 -0
  276. package/src/mem_pools/instrumentation.ts +17 -13
  277. package/src/mem_pools/interface.ts +2 -2
  278. package/src/mem_pools/tx_pool/README.md +1 -1
  279. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  280. package/src/mem_pools/tx_pool/priority.ts +6 -3
  281. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
  282. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  283. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  284. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  285. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -2
  286. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  287. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  288. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  289. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
  290. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  291. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
  292. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  293. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  294. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  295. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  296. package/src/mem_pools/tx_pool_v2/interfaces.ts +26 -8
  297. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +191 -25
  298. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
  299. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +21 -7
  300. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +398 -183
  301. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
  302. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
  303. package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -40
  304. package/src/msg_validators/tx_validator/README.md +115 -0
  305. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
  306. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  307. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  308. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  309. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  310. package/src/msg_validators/tx_validator/factory.ts +366 -77
  311. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  312. package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
  313. package/src/msg_validators/tx_validator/index.ts +2 -0
  314. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  315. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  316. package/src/msg_validators/tx_validator/phases_validator.ts +51 -26
  317. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  318. package/src/services/dummy_service.ts +12 -6
  319. package/src/services/encoding.ts +9 -9
  320. package/src/services/gossipsub/README.md +641 -0
  321. package/src/services/gossipsub/index.ts +2 -0
  322. package/src/services/gossipsub/scoring.ts +29 -5
  323. package/src/services/gossipsub/topic_score_params.ts +487 -0
  324. package/src/services/libp2p/libp2p_service.ts +206 -164
  325. package/src/services/peer-manager/metrics.ts +7 -0
  326. package/src/services/peer-manager/peer_manager.ts +2 -1
  327. package/src/services/peer-manager/peer_scoring.ts +25 -0
  328. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +20 -48
  329. package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
  330. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
  331. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +63 -24
  332. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  333. package/src/services/reqresp/interface.ts +26 -1
  334. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
  335. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
  336. package/src/services/reqresp/protocols/tx.ts +22 -0
  337. package/src/services/reqresp/reqresp.ts +16 -4
  338. package/src/services/service.ts +31 -2
  339. package/src/services/tx_collection/config.ts +68 -0
  340. package/src/services/tx_collection/fast_tx_collection.ts +65 -32
  341. package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
  342. package/src/services/tx_collection/file_store_tx_source.ts +117 -0
  343. package/src/services/tx_collection/index.ts +1 -0
  344. package/src/services/tx_collection/instrumentation.ts +7 -1
  345. package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
  346. package/src/services/tx_collection/proposal_tx_collector.ts +8 -7
  347. package/src/services/tx_collection/slow_tx_collection.ts +66 -33
  348. package/src/services/tx_collection/tx_collection.ts +113 -16
  349. package/src/services/tx_collection/tx_collection_sink.ts +30 -34
  350. package/src/services/tx_collection/tx_source.ts +22 -3
  351. package/src/services/tx_file_store/config.ts +0 -6
  352. package/src/services/tx_file_store/tx_file_store.ts +10 -8
  353. package/src/services/tx_provider.ts +10 -9
  354. package/src/test-helpers/make-test-p2p-clients.ts +4 -6
  355. package/src/test-helpers/mock-pubsub.ts +146 -9
  356. package/src/test-helpers/reqresp-nodes.ts +5 -7
  357. package/src/test-helpers/testbench-utils.ts +118 -40
  358. package/src/testbench/p2p_client_testbench_worker.ts +25 -21
  359. package/src/testbench/worker_client_manager.ts +13 -5
  360. package/src/util.ts +8 -2
  361. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  362. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  363. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  364. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
@@ -5,7 +5,7 @@ import { EvictionEvent } from './interfaces.js';
5
5
 
6
6
  /**
7
7
  * Eviction rule that removes low-priority transactions when the pool exceeds configured limits.
8
- * Only triggers on TXS_ADDED events.
8
+ * Triggers on TXS_ADDED and CHAIN_PRUNED events.
9
9
  */
10
10
  export class LowPriorityEvictionRule implements EvictionRule {
11
11
  public readonly name = 'LowPriorityEviction';
@@ -18,7 +18,7 @@ export class LowPriorityEvictionRule implements EvictionRule {
18
18
  }
19
19
 
20
20
  async evict(context: EvictionContext, pool: PoolOperations): Promise<EvictionResult> {
21
- if (context.event !== EvictionEvent.TXS_ADDED) {
21
+ if (context.event !== EvictionEvent.TXS_ADDED && context.event !== EvictionEvent.CHAIN_PRUNED) {
22
22
  return {
23
23
  reason: 'low_priority',
24
24
  success: true,
@@ -48,19 +48,24 @@ export class LowPriorityEvictionRule implements EvictionRule {
48
48
  };
49
49
  }
50
50
 
51
- this.log.verbose(
52
- `Evicting low priority txs. Pending tx count above limit: ${currentTxCount} > ${this.maxPoolSize}`,
53
- );
51
+ this.log.info(`Evicting low priority txs. Pending tx count above limit: ${currentTxCount} > ${this.maxPoolSize}`);
54
52
  const numberToEvict = currentTxCount - this.maxPoolSize;
55
53
  const txsToEvict = pool.getLowestPriorityPending(numberToEvict);
56
54
 
57
55
  if (txsToEvict.length > 0) {
58
- await pool.deleteTxs(txsToEvict);
56
+ if (context.event === EvictionEvent.TXS_ADDED) {
57
+ const toEvictSet = new Set(txsToEvict);
58
+ const numNewTxsEvicted = context.newTxHashes.filter(newTxHash => toEvictSet.has(newTxHash)).length;
59
+ this.log.info(`Evicted ${txsToEvict.length} low priority txs, including ${numNewTxsEvicted} newly added txs`);
60
+ } else {
61
+ this.log.info(`Evicted ${txsToEvict.length} low priority txs after chain prune`);
62
+ }
63
+ await pool.deleteTxs(txsToEvict, this.name);
59
64
  }
60
65
 
61
- const numNewTxsEvicted = context.newTxHashes.filter(newTxHash => txsToEvict.includes(newTxHash)).length;
62
-
63
- this.log.verbose(`Evicted ${txsToEvict.length} low priority txs, including ${numNewTxsEvicted} newly added txs`);
66
+ this.log.debug(`Evicted ${txsToEvict.length} low priority txs`, {
67
+ txHashes: txsToEvict,
68
+ });
64
69
 
65
70
  return {
66
71
  reason: 'low_priority',
@@ -1,7 +1,14 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
2
 
3
- import type { TxMetaData } from '../tx_metadata.js';
4
- import type { EvictionConfig, PreAddPoolAccess, PreAddResult, PreAddRule } from './interfaces.js';
3
+ import { type TxMetaData, comparePriority, getMinimumPriceBumpFee } from '../tx_metadata.js';
4
+ import {
5
+ type EvictionConfig,
6
+ type PreAddContext,
7
+ type PreAddPoolAccess,
8
+ type PreAddResult,
9
+ type PreAddRule,
10
+ TxPoolRejectionCode,
11
+ } from './interfaces.js';
5
12
 
6
13
  /**
7
14
  * Pre-add rule that checks if the pool is at capacity and handles low-priority eviction.
@@ -20,7 +27,7 @@ export class LowPriorityPreAddRule implements PreAddRule {
20
27
  this.maxPoolSize = config.maxPoolSize;
21
28
  }
22
29
 
23
- check(incomingMeta: TxMetaData, poolAccess: PreAddPoolAccess): Promise<PreAddResult> {
30
+ check(incomingMeta: TxMetaData, poolAccess: PreAddPoolAccess, context?: PreAddContext): Promise<PreAddResult> {
24
31
  // Skip if max pool size is disabled (0 = unlimited)
25
32
  if (this.maxPoolSize === 0) {
26
33
  return Promise.resolve({ shouldIgnore: false, txHashesToEvict: [] });
@@ -40,8 +47,18 @@ export class LowPriorityPreAddRule implements PreAddRule {
40
47
  return Promise.resolve({ shouldIgnore: false, txHashesToEvict: [] });
41
48
  }
42
49
 
43
- // If incoming tx has strictly higher priority, evict the lowest priority tx
44
- if (incomingMeta.priorityFee > lowestPriorityMeta.priorityFee) {
50
+ // Compare incoming tx against lowest priority tx.
51
+ // feeOnly mode (RPC): use strict fee comparison only — avoids churn from hash ordering.
52
+ // When price bump is also set, require the bumped fee threshold.
53
+ // Default (gossip): use full comparePriority (fee + tx hash tiebreaker) for determinism.
54
+ const isHigherPriority = context?.feeComparisonOnly
55
+ ? context.priceBumpPercentage !== undefined
56
+ ? incomingMeta.priorityFee >=
57
+ getMinimumPriceBumpFee(lowestPriorityMeta.priorityFee, context.priceBumpPercentage)
58
+ : incomingMeta.priorityFee > lowestPriorityMeta.priorityFee
59
+ : comparePriority(incomingMeta, lowestPriorityMeta) > 0;
60
+
61
+ if (isHigherPriority) {
45
62
  this.log.debug(
46
63
  `Pool at capacity (${currentCount}/${this.maxPoolSize}), evicting ${lowestPriorityMeta.txHash} ` +
47
64
  `(priority ${lowestPriorityMeta.priorityFee}) for ${incomingMeta.txHash} (priority ${incomingMeta.priorityFee})`,
@@ -53,6 +70,11 @@ export class LowPriorityPreAddRule implements PreAddRule {
53
70
  }
54
71
 
55
72
  // Incoming tx has equal or lower priority - ignore it (it would be evicted anyway)
73
+ const minimumFee =
74
+ context?.feeComparisonOnly && context.priceBumpPercentage !== undefined
75
+ ? getMinimumPriceBumpFee(lowestPriorityMeta.priorityFee, context.priceBumpPercentage)
76
+ : lowestPriorityMeta.priorityFee + 1n;
77
+
56
78
  this.log.debug(
57
79
  `Pool at capacity (${currentCount}/${this.maxPoolSize}), ignoring ${incomingMeta.txHash} ` +
58
80
  `(priority ${incomingMeta.priorityFee}) - lower than existing minimum (priority ${lowestPriorityMeta.priorityFee})`,
@@ -60,7 +82,12 @@ export class LowPriorityPreAddRule implements PreAddRule {
60
82
  return Promise.resolve({
61
83
  shouldIgnore: true,
62
84
  txHashesToEvict: [],
63
- reason: `pool at capacity and tx has lower priority than existing transactions`,
85
+ reason: {
86
+ code: TxPoolRejectionCode.LOW_PRIORITY_FEE,
87
+ message: `Tx does not meet minimum priority fee. Required: ${minimumFee}, got: ${incomingMeta.priorityFee}`,
88
+ minimumPriorityFee: minimumFee,
89
+ txPriorityFee: incomingMeta.priorityFee,
90
+ },
64
91
  });
65
92
  }
66
93
 
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
2
 
3
3
  import { type TxMetaData, checkNullifierConflict } from '../tx_metadata.js';
4
- import type { PreAddPoolAccess, PreAddResult, PreAddRule } from './interfaces.js';
4
+ import type { PreAddContext, PreAddPoolAccess, PreAddResult, PreAddRule } from './interfaces.js';
5
5
 
6
6
  /**
7
7
  * Pre-add rule that checks for nullifier conflicts between incoming and existing transactions.
@@ -15,15 +15,16 @@ export class NullifierConflictRule implements PreAddRule {
15
15
 
16
16
  private log = createLogger('p2p:tx_pool_v2:nullifier_conflict_rule');
17
17
 
18
- check(incomingMeta: TxMetaData, poolAccess: PreAddPoolAccess): Promise<PreAddResult> {
18
+ check(incomingMeta: TxMetaData, poolAccess: PreAddPoolAccess, context?: PreAddContext): Promise<PreAddResult> {
19
19
  const result = checkNullifierConflict(
20
20
  incomingMeta,
21
21
  nullifier => poolAccess.getTxHashByNullifier(nullifier),
22
22
  txHash => poolAccess.getMetadata(txHash),
23
+ context?.priceBumpPercentage,
23
24
  );
24
25
 
25
26
  if (result.shouldIgnore) {
26
- this.log.debug(`Ignoring tx ${incomingMeta.txHash}: ${result.reason}`);
27
+ this.log.debug(`Ignoring tx ${incomingMeta.txHash}: ${result.reason?.message}`);
27
28
  }
28
29
 
29
30
  return Promise.resolve(result);
@@ -7,5 +7,6 @@ export {
7
7
  type PoolReadAccess,
8
8
  DEFAULT_TX_POOL_V2_CONFIG,
9
9
  } from './interfaces.js';
10
- export { type TxMetaData, type TxState, buildTxMetaData, comparePriority } from './tx_metadata.js';
10
+ export { type TxMetaData, type TxState, buildTxMetaData, comparePriority, stubTxMetaData } from './tx_metadata.js';
11
11
  export { TxArchive } from './archive/index.js';
12
+ export { DeletedPool } from './deleted_pool.js';
@@ -0,0 +1,69 @@
1
+ import {
2
+ Attributes,
3
+ type Meter,
4
+ Metrics,
5
+ type ObservableGauge,
6
+ type ObservableResult,
7
+ type TelemetryClient,
8
+ type UpDownCounter,
9
+ createUpDownCounterWithDefault,
10
+ } from '@aztec/telemetry-client';
11
+
12
+ /** Callback that returns the current estimated metadata memory in bytes. */
13
+ export type MetadataMemoryCallback = () => number;
14
+
15
+ /** Instrumentation for TxPoolV2Impl internal operations. */
16
+ export class TxPoolV2Instrumentation {
17
+ #evictedCounter: UpDownCounter;
18
+ #ignoredCounter: UpDownCounter;
19
+ #rejectedCounter: UpDownCounter;
20
+ #softDeletedHitsCounter: UpDownCounter;
21
+ #missingOnProtectCounter: UpDownCounter;
22
+ #missingPreviouslyEvictedCounter: UpDownCounter;
23
+ #metadataMemoryGauge: ObservableGauge;
24
+
25
+ constructor(telemetry: TelemetryClient, metadataMemoryCallback: MetadataMemoryCallback) {
26
+ const meter: Meter = telemetry.getMeter('TxPoolV2Impl');
27
+
28
+ this.#evictedCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_EVICTED_COUNT);
29
+ this.#ignoredCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_IGNORED_COUNT);
30
+ this.#rejectedCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_REJECTED_COUNT);
31
+ this.#softDeletedHitsCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_SOFT_DELETED_HITS);
32
+ this.#missingOnProtectCounter = createUpDownCounterWithDefault(
33
+ meter,
34
+ Metrics.MEMPOOL_TX_POOL_V2_MISSING_ON_PROTECT,
35
+ );
36
+ this.#missingPreviouslyEvictedCounter = createUpDownCounterWithDefault(
37
+ meter,
38
+ Metrics.MEMPOOL_TX_POOL_V2_MISSING_PREVIOUSLY_EVICTED,
39
+ );
40
+ this.#metadataMemoryGauge = meter.createObservableGauge(Metrics.MEMPOOL_TX_POOL_V2_METADATA_MEMORY);
41
+ this.#metadataMemoryGauge.addCallback((result: ObservableResult) => {
42
+ result.observe(metadataMemoryCallback());
43
+ });
44
+ }
45
+
46
+ recordEvictions(count: number, reason: string) {
47
+ this.#evictedCounter.add(count, { [Attributes.TX_POOL_EVICTION_REASON]: reason });
48
+ }
49
+
50
+ recordIgnored(count: number) {
51
+ this.#ignoredCounter.add(count);
52
+ }
53
+
54
+ recordRejected(count: number) {
55
+ this.#rejectedCounter.add(count);
56
+ }
57
+
58
+ recordSoftDeletedHits(count: number) {
59
+ this.#softDeletedHitsCounter.add(count);
60
+ }
61
+
62
+ recordMissingOnProtect(count: number) {
63
+ this.#missingOnProtectCounter.add(count);
64
+ }
65
+
66
+ recordMissingPreviouslyEvicted(count: number) {
67
+ this.#missingPreviouslyEvictedCounter.add(count);
68
+ }
69
+ }
@@ -4,6 +4,7 @@ import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
4
4
  import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
5
5
  import type { BlockHeader, Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
6
6
 
7
+ import type { TxPoolRejectionError } from './eviction/interfaces.js';
7
8
  import type { TxMetaData, TxState } from './tx_metadata.js';
8
9
 
9
10
  /**
@@ -17,6 +18,8 @@ export type AddTxsResult = {
17
18
  ignored: TxHash[];
18
19
  /** Transactions rejected because they failed validation (e.g., invalid proof, expired timestamp) */
19
20
  rejected: TxHash[];
21
+ /** Optional rejection errors, only present when there are rejections with structured errors. */
22
+ errors?: Map<string, TxPoolRejectionError>;
20
23
  };
21
24
 
22
25
  /**
@@ -37,6 +40,14 @@ export type TxPoolV2Config = {
37
40
  maxPendingTxCount: number;
38
41
  /** Maximum number of archived transactions to retain (0 = disabled) */
39
42
  archivedTxLimit: number;
43
+ /** Minimum age (ms) a transaction must have been in the pool before it's eligible for block building */
44
+ minTxPoolAgeMs: number;
45
+ /** Maximum number of evicted tx hashes to remember for metrics tracking */
46
+ evictedTxCacheSize: number;
47
+ /** The probability (0-1) that a transaction is discarded. 0 disables dropping. For testing purposes only. */
48
+ dropTransactionsProbability: number;
49
+ /** Minimum percentage fee increase required to replace an existing tx via RPC (0 = no bump). */
50
+ priceBumpPercentage: bigint;
40
51
  };
41
52
 
42
53
  /**
@@ -45,6 +56,10 @@ export type TxPoolV2Config = {
45
56
  export const DEFAULT_TX_POOL_V2_CONFIG: TxPoolV2Config = {
46
57
  maxPendingTxCount: 0, // 0 = disabled
47
58
  archivedTxLimit: 0, // 0 = disabled
59
+ minTxPoolAgeMs: 2_000,
60
+ evictedTxCacheSize: 10_000,
61
+ dropTransactionsProbability: 0,
62
+ priceBumpPercentage: 10n,
48
63
  };
49
64
 
50
65
  /**
@@ -55,8 +70,8 @@ export type TxPoolV2Dependencies = {
55
70
  l2BlockSource: L2BlockSource;
56
71
  /** World state synchronizer for validating transactions after chain prunes */
57
72
  worldStateSynchronizer: WorldStateSynchronizer;
58
- /** Validator for transactions entering the pending pool */
59
- pendingTxValidator: TxValidator<Tx>;
73
+ /** Factory that creates a validator for re-validating pool transactions using metadata */
74
+ createTxValidator: () => Promise<TxValidator<TxMetaData>>;
60
75
  };
61
76
 
62
77
  /**
@@ -95,15 +110,15 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
95
110
  * @param opts - Optional metadata (e.g., source for logging)
96
111
  * @returns Result categorizing each transaction as accepted, rejected, or ignored
97
112
  */
98
- addPendingTxs(txs: Tx[], opts?: { source?: string }): Promise<AddTxsResult>;
113
+ addPendingTxs(txs: Tx[], opts?: { source?: string; feeComparisonOnly?: boolean }): Promise<AddTxsResult>;
99
114
 
100
115
  /**
101
- * Checks if a transaction can be added without modifying the pool.
102
- * Performs the same validation as addPendingTxs but doesn't persist changes.
116
+ * Checks if the pool would accept a transaction without modifying state.
117
+ * Used as a pre-check before expensive proof verification.
103
118
  * @param tx - Transaction to check
104
- * @returns Result: 'accepted', 'ignored' (if already in pool or undesirable), or 'rejected' (if validation fails)
119
+ * @returns 'accepted' if the pool would accept, 'ignored' if already in pool or undesirable
105
120
  */
106
- canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'>;
121
+ canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'>;
107
122
 
108
123
  /**
109
124
  * Adds transactions as immediately protected for a given slot.
@@ -156,7 +171,7 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
156
171
  * and validates them before returning to pending.
157
172
  * @param latestBlock - The latest valid block ID after the prune
158
173
  */
159
- handlePrunedBlocks(latestBlock: L2BlockId): Promise<void>;
174
+ handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void>;
160
175
 
161
176
  /**
162
177
  * Handles failed transaction execution.
@@ -187,6 +202,9 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
187
202
  /** Gets pending transaction hashes sorted by priority (highest first) */
188
203
  getPendingTxHashes(): Promise<TxHash[]>;
189
204
 
205
+ /** Gets pending transaction hashes that have been in the pool long enough per minTxPoolAgeMs, sorted by priority (highest first) */
206
+ getEligiblePendingTxHashes(): Promise<TxHash[]>;
207
+
190
208
  /** Gets the count of pending transactions */
191
209
  getPendingTxCount(): Promise<number>;
192
210
 
@@ -1,11 +1,32 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
3
- import type { L2BlockId } from '@aztec/stdlib/block';
4
- import type { Tx } from '@aztec/stdlib/tx';
4
+ import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
5
+ import { Gas } from '@aztec/stdlib/gas';
6
+ import { type Tx, TxHash } from '@aztec/stdlib/tx';
5
7
 
6
8
  import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
7
9
  import { getTxPriorityFee } from '../tx_pool/priority.js';
8
- import type { PreAddResult } from './eviction/interfaces.js';
10
+ import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
11
+
12
+ /** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
13
+ export type TxMetaValidationData = {
14
+ getNonEmptyNullifiers(): Fr[];
15
+ expirationTimestamp: bigint;
16
+ /** Whether the tx has public calls. Used to select the correct L2 gas minimum. */
17
+ forPublic?: unknown;
18
+ constants: {
19
+ anchorBlockHeader: {
20
+ hash(): Promise<BlockHash>;
21
+ globalVariables: {
22
+ blockNumber: BlockNumber;
23
+ };
24
+ };
25
+ txContext: {
26
+ gasSettings: { gasLimits: Gas };
27
+ };
28
+ };
29
+ };
9
30
 
10
31
  /**
11
32
  * Lightweight in-memory representation of a transaction.
@@ -19,6 +40,9 @@ export type TxMetaData = {
19
40
  /** The transaction hash as hex string */
20
41
  readonly txHash: string;
21
42
 
43
+ /** The transaction hash as bigint (for efficient Fr conversion in comparisons) */
44
+ readonly txHashBigInt: bigint;
45
+
22
46
  /** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */
23
47
  minedL2BlockId?: L2BlockId;
24
48
 
@@ -41,46 +65,106 @@ export type TxMetaData = {
41
65
  readonly nullifiers: readonly string[];
42
66
 
43
67
  /** Timestamp by which the transaction must be included (for expiration checks) */
44
- readonly includeByTimestamp: bigint;
68
+ readonly expirationTimestamp: bigint;
69
+
70
+ /** Validator-compatible data, providing the same access patterns as Tx.data */
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;
45
78
  };
46
79
 
47
80
  /** Transaction state derived from TxMetaData fields and pool protection status */
48
- export type TxState = 'pending' | 'protected' | 'mined';
81
+ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
49
82
 
50
83
  /**
51
84
  * Builds TxMetaData from a full Tx object.
52
85
  * Extracts all relevant fields for efficient in-memory storage and querying.
86
+ * Fr values are captured in closures for zero-cost re-validation.
53
87
  */
54
88
  export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
55
- const txHash = tx.getTxHash().toString();
56
- const anchorBlockHeaderHash = (await tx.data.constants.anchorBlockHeader.hash()).toString();
89
+ const txHashObj = tx.getTxHash();
90
+ const txHash = txHashObj.toString();
91
+ const txHashBigInt = txHashObj.toBigInt();
92
+ const nullifierFrs = tx.data.getNonEmptyNullifiers();
93
+ const nullifiers = nullifierFrs.map(n => n.toString());
94
+ const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash();
95
+ const anchorBlockHeaderHash = anchorBlockHeaderHashFr.toString();
96
+ const expirationTimestamp = tx.data.expirationTimestamp;
97
+ const anchorBlockNumber = tx.data.constants.anchorBlockHeader.globalVariables.blockNumber;
57
98
  const priorityFee = getTxPriorityFee(tx);
58
99
  const feePayer = tx.data.feePayer.toString();
59
- const nullifiers = tx.data.getNonEmptyNullifiers().map(n => n.toString());
60
- const includeByTimestamp = tx.data.includeByTimestamp;
61
100
 
62
101
  const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
63
102
 
103
+ const estimatedSizeBytes = estimateTxMetaDataSize(nullifiers.length);
104
+
64
105
  return {
65
106
  txHash,
107
+ txHashBigInt,
66
108
  anchorBlockHeaderHash,
67
109
  priorityFee,
68
110
  feePayer,
69
111
  claimAmount,
70
112
  feeLimit,
71
113
  nullifiers,
72
- includeByTimestamp,
114
+ expirationTimestamp,
115
+ receivedAt: 0,
116
+ estimatedSizeBytes,
117
+ data: {
118
+ getNonEmptyNullifiers: () => nullifierFrs,
119
+ expirationTimestamp,
120
+ forPublic: !!tx.data.forPublic,
121
+ constants: {
122
+ anchorBlockHeader: {
123
+ hash: () => Promise.resolve(anchorBlockHeaderHashFr),
124
+ globalVariables: { blockNumber: anchorBlockNumber },
125
+ },
126
+ txContext: {
127
+ gasSettings: { gasLimits: tx.data.constants.txContext.gasSettings.gasLimits },
128
+ },
129
+ },
130
+ },
73
131
  };
74
132
  }
75
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
+
76
160
  /** Minimal fields required for priority comparison. */
77
- type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
161
+ export type PriorityComparable = Pick<TxMetaData, 'txHash' | 'txHashBigInt' | 'priorityFee'>;
78
162
 
79
163
  /**
80
164
  * Compares two priority fees in ascending order.
81
165
  * Returns negative if a < b, positive if a > b, 0 if equal.
82
166
  */
83
- export function compareFee(a: bigint, b: bigint): number {
167
+ export function compareFee(a: bigint, b: bigint): -1 | 0 | 1 {
84
168
  return a < b ? -1 : a > b ? 1 : 0;
85
169
  }
86
170
 
@@ -89,10 +173,8 @@ export function compareFee(a: bigint, b: bigint): number {
89
173
  * Uses field element comparison for deterministic ordering.
90
174
  * Returns negative if a < b, positive if a > b, 0 if equal.
91
175
  */
92
- export function compareTxHash(a: string, b: string): number {
93
- const fieldA = Fr.fromHexString(a);
94
- const fieldB = Fr.fromHexString(b);
95
- return fieldA.cmp(fieldB);
176
+ export function compareTxHash(a: bigint, b: bigint): -1 | 0 | 1 {
177
+ return Fr.cmpAsBigInt(a, b);
96
178
  }
97
179
 
98
180
  /**
@@ -100,29 +182,46 @@ export function compareTxHash(a: string, b: string): number {
100
182
  * Returns negative if a < b, positive if a > b, 0 if equal.
101
183
  * Use with sort() for ascending order, or negate/reverse for descending.
102
184
  */
103
- export function comparePriority(a: PriorityComparable, b: PriorityComparable): number {
185
+ export function comparePriority(a: PriorityComparable, b: PriorityComparable): -1 | 0 | 1 {
104
186
  const feeComparison = compareFee(a.priorityFee, b.priorityFee);
105
187
  if (feeComparison !== 0) {
106
188
  return feeComparison;
107
189
  }
108
- return compareTxHash(a.txHash, b.txHash);
190
+ return compareTxHash(a.txHashBigInt, b.txHashBigInt);
191
+ }
192
+
193
+ /**
194
+ * Returns the minimum fee required to replace an existing tx with the given price bump percentage.
195
+ * Uses integer arithmetic: `existingFee + existingFee * priceBumpPercentage / 100`.
196
+ */
197
+ export function getMinimumPriceBumpFee(existingFee: bigint, priceBumpPercentage: bigint): bigint {
198
+ const bump = (existingFee * priceBumpPercentage) / 100n;
199
+ // Ensure the minimum bump is at least 1, so that replacement always requires
200
+ // paying strictly more — even with 0% bump or zero existing fee.
201
+ const effectiveBump = bump > 0n ? bump : 1n;
202
+ return existingFee + effectiveBump;
109
203
  }
110
204
 
111
205
  /**
112
206
  * Checks for nullifier conflicts between an incoming transaction and existing pool state.
113
207
  *
114
208
  * When the incoming tx shares nullifiers with existing pending txs:
115
- * - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
116
- * - If any conflicting tx has equal or higher priority, ignore the incoming tx
209
+ * - If the incoming tx meets or exceeds the required priority, mark conflicting txs for eviction
210
+ * - Otherwise, ignore the incoming tx
211
+ *
212
+ * When `priceBumpPercentage` is provided (RPC path), uses fee-only comparison with the
213
+ * percentage bump instead of `comparePriority`.
117
214
  *
118
215
  * @param incomingMeta - Metadata for the incoming transaction
119
216
  * @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
120
217
  * @param getMetadata - Accessor to get metadata for a tx hash
218
+ * @param priceBumpPercentage - Optional percentage bump required for fee-based replacement
121
219
  */
122
220
  export function checkNullifierConflict(
123
221
  incomingMeta: TxMetaData,
124
222
  getTxHashByNullifier: (nullifier: string) => string | undefined,
125
223
  getMetadata: (txHash: string) => TxMetaData | undefined,
224
+ priceBumpPercentage?: bigint,
126
225
  ): PreAddResult {
127
226
  const txHashesToEvict: string[] = [];
128
227
 
@@ -143,19 +242,86 @@ export function checkNullifierConflict(
143
242
  continue;
144
243
  }
145
244
 
146
- // If incoming tx has strictly higher priority, mark for eviction
147
- // Otherwise, ignore incoming tx (ties go to existing tx)
148
- // Use comparePriority for deterministic ordering (includes txHash as tiebreaker)
149
- if (comparePriority(incomingMeta, conflictingMeta) > 0) {
245
+ // When price bump is set (RPC path), require the incoming fee to meet the bumped threshold.
246
+ // Otherwise (P2P path), use full comparePriority with tx hash tiebreaker.
247
+ const isHigherPriority =
248
+ priceBumpPercentage !== undefined
249
+ ? incomingMeta.priorityFee >= getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
250
+ : comparePriority(incomingMeta, conflictingMeta) > 0;
251
+
252
+ if (isHigherPriority) {
150
253
  txHashesToEvict.push(conflictingHashStr);
151
254
  } else {
255
+ const minimumFee =
256
+ priceBumpPercentage !== undefined
257
+ ? getMinimumPriceBumpFee(conflictingMeta.priorityFee, priceBumpPercentage)
258
+ : undefined;
152
259
  return {
153
260
  shouldIgnore: true,
154
261
  txHashesToEvict: [],
155
- reason: `nullifier conflict with ${conflictingHashStr}`,
262
+ reason: {
263
+ code: TxPoolRejectionCode.NULLIFIER_CONFLICT,
264
+ message:
265
+ minimumFee !== undefined
266
+ ? `Nullifier conflict with existing tx ${conflictingHashStr}. Minimum required fee: ${minimumFee}, got: ${incomingMeta.priorityFee}`
267
+ : `Nullifier conflict with existing tx ${conflictingHashStr}`,
268
+ conflictingTxHash: conflictingHashStr,
269
+ minimumPriceBumpFee: minimumFee,
270
+ txPriorityFee: minimumFee !== undefined ? incomingMeta.priorityFee : undefined,
271
+ },
156
272
  };
157
273
  }
158
274
  }
159
275
 
160
276
  return { shouldIgnore: false, txHashesToEvict };
161
277
  }
278
+
279
+ /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
280
+ export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigint } = {}): TxMetaValidationData {
281
+ return {
282
+ getNonEmptyNullifiers: () => [],
283
+ expirationTimestamp: overrides.expirationTimestamp ?? 0n,
284
+ constants: {
285
+ anchorBlockHeader: {
286
+ hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
287
+ globalVariables: { blockNumber: BlockNumber(0) },
288
+ },
289
+ txContext: {
290
+ gasSettings: { gasLimits: Gas.empty() },
291
+ },
292
+ },
293
+ };
294
+ }
295
+
296
+ /** Creates a stub TxMetaData for tests. All fields have sensible defaults and can be overridden. */
297
+ export function stubTxMetaData(
298
+ txHash: string,
299
+ overrides: {
300
+ priorityFee?: bigint;
301
+ feePayer?: string;
302
+ claimAmount?: bigint;
303
+ feeLimit?: bigint;
304
+ nullifiers?: string[];
305
+ expirationTimestamp?: bigint;
306
+ anchorBlockHeaderHash?: string;
307
+ } = {},
308
+ ): TxMetaData {
309
+ const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
310
+ // Normalize to canonical zero-padded hex so txHashFromBigInt(txHashBigInt) === normalizedTxHash
311
+ const normalizedTxHash = txHashFromBigInt(txHashBigInt);
312
+ const expirationTimestamp = overrides.expirationTimestamp ?? 0n;
313
+ return {
314
+ txHash: normalizedTxHash,
315
+ txHashBigInt,
316
+ anchorBlockHeaderHash: overrides.anchorBlockHeaderHash ?? '0x1234',
317
+ priorityFee: overrides.priorityFee ?? 100n,
318
+ feePayer: overrides.feePayer ?? '0xfeepayer',
319
+ claimAmount: overrides.claimAmount ?? 0n,
320
+ feeLimit: overrides.feeLimit ?? 100n,
321
+ nullifiers: overrides.nullifiers ?? [`0x${normalizedTxHash.slice(2)}null1`],
322
+ expirationTimestamp,
323
+ receivedAt: 0,
324
+ estimatedSizeBytes: 0,
325
+ data: stubTxMetaValidationData({ expirationTimestamp }),
326
+ };
327
+ }