@aztec/p2p 0.0.1-commit.8afd444 → 0.0.1-commit.8f9871590

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 +5 -5
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +44 -10
  4. package/dest/client/interface.d.ts +37 -15
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +35 -36
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +114 -138
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +1 -1
  10. package/dest/config.d.ts +23 -5
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +16 -1
  13. package/dest/index.d.ts +2 -1
  14. package/dest/index.d.ts.map +1 -1
  15. package/dest/index.js +1 -0
  16. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
  17. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  18. package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
  19. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  20. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
  22. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  23. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  24. package/dest/mem_pools/attestation_pool/index.js +1 -2
  25. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  26. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/mocks.js +2 -2
  28. package/dest/mem_pools/index.d.ts +3 -2
  29. package/dest/mem_pools/index.d.ts.map +1 -1
  30. package/dest/mem_pools/index.js +1 -1
  31. package/dest/mem_pools/interface.d.ts +5 -5
  32. package/dest/mem_pools/interface.d.ts.map +1 -1
  33. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
  34. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  35. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  36. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  37. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
  38. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
  40. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +102 -0
  41. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +242 -0
  43. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  44. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +119 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +89 -0
  52. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +131 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +17 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +72 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +63 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  73. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  74. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  76. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +201 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool_v2/interfaces.js +7 -0
  79. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +95 -0
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +128 -0
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +105 -0
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +345 -0
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +57 -0
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +160 -0
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +71 -0
  92. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  93. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +780 -0
  94. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
  95. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
  97. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  99. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  101. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  102. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  104. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  105. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  107. package/dest/services/dummy_service.d.ts +10 -2
  108. package/dest/services/dummy_service.d.ts.map +1 -1
  109. package/dest/services/dummy_service.js +6 -0
  110. package/dest/services/encoding.d.ts +2 -2
  111. package/dest/services/encoding.d.ts.map +1 -1
  112. package/dest/services/encoding.js +2 -2
  113. package/dest/services/gossipsub/index.d.ts +3 -0
  114. package/dest/services/gossipsub/index.d.ts.map +1 -0
  115. package/dest/services/gossipsub/index.js +2 -0
  116. package/dest/services/gossipsub/scoring.d.ts +21 -3
  117. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  118. package/dest/services/gossipsub/scoring.js +24 -7
  119. package/dest/services/gossipsub/topic_score_params.d.ts +161 -0
  120. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  121. package/dest/services/gossipsub/topic_score_params.js +324 -0
  122. package/dest/services/libp2p/libp2p_service.d.ts +84 -35
  123. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  124. package/dest/services/libp2p/libp2p_service.js +370 -275
  125. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  126. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  127. package/dest/services/peer-manager/peer_scoring.js +25 -2
  128. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -4
  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 +8 -8
  131. package/dest/services/reqresp/interface.d.ts +10 -1
  132. package/dest/services/reqresp/interface.d.ts.map +1 -1
  133. package/dest/services/reqresp/interface.js +15 -1
  134. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  135. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  136. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -11
  137. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +21 -10
  138. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  139. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +27 -11
  140. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  141. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  142. package/dest/services/reqresp/protocols/tx.js +20 -0
  143. package/dest/services/reqresp/reqresp.d.ts +1 -1
  144. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  145. package/dest/services/reqresp/reqresp.js +11 -4
  146. package/dest/services/service.d.ts +35 -1
  147. package/dest/services/service.d.ts.map +1 -1
  148. package/dest/services/tx_collection/config.d.ts +22 -4
  149. package/dest/services/tx_collection/config.d.ts.map +1 -1
  150. package/dest/services/tx_collection/config.js +49 -3
  151. package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -5
  152. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  153. package/dest/services/tx_collection/fast_tx_collection.js +27 -17
  154. package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
  155. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  156. package/dest/services/tx_collection/file_store_tx_collection.js +165 -0
  157. package/dest/services/tx_collection/file_store_tx_source.d.ts +28 -0
  158. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  159. package/dest/services/tx_collection/file_store_tx_source.js +59 -0
  160. package/dest/services/tx_collection/index.d.ts +3 -2
  161. package/dest/services/tx_collection/index.d.ts.map +1 -1
  162. package/dest/services/tx_collection/index.js +1 -0
  163. package/dest/services/tx_collection/proposal_tx_collector.d.ts +12 -12
  164. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  165. package/dest/services/tx_collection/proposal_tx_collector.js +4 -5
  166. package/dest/services/tx_collection/slow_tx_collection.d.ts +6 -2
  167. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  168. package/dest/services/tx_collection/slow_tx_collection.js +55 -23
  169. package/dest/services/tx_collection/tx_collection.d.ts +19 -7
  170. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  171. package/dest/services/tx_collection/tx_collection.js +75 -3
  172. package/dest/services/tx_collection/tx_collection_sink.d.ts +15 -6
  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 -7
  175. package/dest/services/tx_file_store/config.d.ts +1 -3
  176. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  177. package/dest/services/tx_file_store/config.js +0 -4
  178. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
  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 +8 -5
  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 +5 -4
  184. package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
  185. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  186. package/dest/test-helpers/mock-pubsub.d.ts +27 -1
  187. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  188. package/dest/test-helpers/mock-pubsub.js +97 -2
  189. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  190. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  191. package/dest/test-helpers/reqresp-nodes.js +2 -1
  192. package/dest/test-helpers/testbench-utils.d.ts +40 -38
  193. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  194. package/dest/test-helpers/testbench-utils.js +128 -59
  195. package/dest/testbench/p2p_client_testbench_worker.js +4 -4
  196. package/package.json +14 -14
  197. package/src/client/factory.ts +81 -13
  198. package/src/client/interface.ts +45 -14
  199. package/src/client/p2p_client.ts +151 -161
  200. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +1 -1
  201. package/src/config.ts +34 -2
  202. package/src/index.ts +1 -0
  203. package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
  204. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
  205. package/src/mem_pools/attestation_pool/index.ts +9 -2
  206. package/src/mem_pools/attestation_pool/mocks.ts +2 -1
  207. package/src/mem_pools/index.ts +4 -1
  208. package/src/mem_pools/interface.ts +4 -4
  209. package/src/mem_pools/tx_pool/README.md +1 -1
  210. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
  211. package/src/mem_pools/tx_pool_v2/README.md +275 -0
  212. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  213. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
  214. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +310 -0
  215. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +147 -0
  216. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
  217. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +111 -0
  218. package/src/mem_pools/tx_pool_v2/eviction/index.ts +23 -0
  219. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +164 -0
  220. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  221. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  222. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +88 -0
  223. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +72 -0
  224. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
  225. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  226. package/src/mem_pools/tx_pool_v2/interfaces.ts +233 -0
  227. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +211 -0
  228. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  229. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +433 -0
  230. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +218 -0
  231. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +924 -0
  232. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
  233. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
  234. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  235. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  236. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  237. package/src/services/dummy_service.ts +12 -0
  238. package/src/services/encoding.ts +2 -2
  239. package/src/services/gossipsub/README.md +626 -0
  240. package/src/services/gossipsub/index.ts +2 -0
  241. package/src/services/gossipsub/scoring.ts +29 -5
  242. package/src/services/gossipsub/topic_score_params.ts +451 -0
  243. package/src/services/libp2p/libp2p_service.ts +372 -277
  244. package/src/services/peer-manager/peer_scoring.ts +25 -0
  245. package/src/services/reqresp/batch-tx-requester/README.md +7 -7
  246. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +11 -11
  247. package/src/services/reqresp/interface.ts +26 -1
  248. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +23 -14
  249. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +38 -15
  250. package/src/services/reqresp/protocols/tx.ts +22 -0
  251. package/src/services/reqresp/reqresp.ts +13 -3
  252. package/src/services/service.ts +40 -0
  253. package/src/services/tx_collection/config.ts +74 -6
  254. package/src/services/tx_collection/fast_tx_collection.ts +28 -26
  255. package/src/services/tx_collection/file_store_tx_collection.ts +198 -0
  256. package/src/services/tx_collection/file_store_tx_source.ts +73 -0
  257. package/src/services/tx_collection/index.ts +2 -1
  258. package/src/services/tx_collection/proposal_tx_collector.ts +12 -14
  259. package/src/services/tx_collection/slow_tx_collection.ts +64 -30
  260. package/src/services/tx_collection/tx_collection.ts +109 -13
  261. package/src/services/tx_collection/tx_collection_sink.ts +17 -7
  262. package/src/services/tx_file_store/config.ts +0 -6
  263. package/src/services/tx_file_store/tx_file_store.ts +9 -7
  264. package/src/services/tx_provider.ts +8 -7
  265. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  266. package/src/test-helpers/mock-pubsub.ts +133 -3
  267. package/src/test-helpers/reqresp-nodes.ts +2 -1
  268. package/src/test-helpers/testbench-utils.ts +127 -71
  269. package/src/testbench/p2p_client_testbench_worker.ts +4 -4
  270. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
  271. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  272. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
  273. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
  274. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  275. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
  276. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
  277. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
@@ -0,0 +1,95 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
4
+ import type { Tx } from '@aztec/stdlib/tx';
5
+ import type { PreAddResult } from './eviction/interfaces.js';
6
+ /** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
7
+ export type TxMetaValidationData = {
8
+ getNonEmptyNullifiers(): Fr[];
9
+ expirationTimestamp: bigint;
10
+ constants: {
11
+ anchorBlockHeader: {
12
+ hash(): Promise<BlockHash>;
13
+ globalVariables: {
14
+ blockNumber: BlockNumber;
15
+ };
16
+ };
17
+ };
18
+ };
19
+ /**
20
+ * Lightweight in-memory representation of a transaction.
21
+ * Stored for every tx in the pool to enable efficient queries and challenges
22
+ * without deserializing full transaction data.
23
+ *
24
+ * Uses strings for txHash and nullifiers to enable fast Map/Set lookups
25
+ * without repeated .toString() conversions.
26
+ */
27
+ export type TxMetaData = {
28
+ /** The transaction hash as hex string */
29
+ readonly txHash: string;
30
+ /** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */
31
+ minedL2BlockId?: L2BlockId;
32
+ /** Hash of the block header the transaction uses as its anchor (hex string) */
33
+ readonly anchorBlockHeaderHash: string;
34
+ /** The total priority fee (used for ordering and challenges) */
35
+ readonly priorityFee: bigint;
36
+ /** The fee payer address as hex string */
37
+ readonly feePayer: string;
38
+ /** The claim amount for the fee payer */
39
+ readonly claimAmount: bigint;
40
+ /** The fee limit */
41
+ readonly feeLimit: bigint;
42
+ /** Non-empty nullifiers emitted by the transaction (hex strings) */
43
+ readonly nullifiers: readonly string[];
44
+ /** Timestamp by which the transaction must be included (for expiration checks) */
45
+ readonly expirationTimestamp: bigint;
46
+ /** Validator-compatible data, providing the same access patterns as Tx.data */
47
+ readonly data: TxMetaValidationData;
48
+ /** Timestamp (ms) when the tx was received into the pool. 0 for hydrated txs (always eligible). */
49
+ receivedAt: number;
50
+ };
51
+ /** Transaction state derived from TxMetaData fields and pool protection status */
52
+ export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
53
+ /**
54
+ * Builds TxMetaData from a full Tx object.
55
+ * Extracts all relevant fields for efficient in-memory storage and querying.
56
+ * Fr values are captured in closures for zero-cost re-validation.
57
+ */
58
+ export declare function buildTxMetaData(tx: Tx): Promise<TxMetaData>;
59
+ /** Minimal fields required for priority comparison. */
60
+ type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
61
+ /**
62
+ * Compares two priority fees in ascending order.
63
+ * Returns negative if a < b, positive if a > b, 0 if equal.
64
+ */
65
+ export declare function compareFee(a: bigint, b: bigint): number;
66
+ /**
67
+ * Compares two tx hashes in ascending order.
68
+ * Uses field element comparison for deterministic ordering.
69
+ * Returns negative if a < b, positive if a > b, 0 if equal.
70
+ */
71
+ export declare function compareTxHash(a: string, b: string): number;
72
+ /**
73
+ * Compares two transactions by priority fee, with txHash as tiebreaker.
74
+ * Returns negative if a < b, positive if a > b, 0 if equal.
75
+ * Use with sort() for ascending order, or negate/reverse for descending.
76
+ */
77
+ export declare function comparePriority(a: PriorityComparable, b: PriorityComparable): number;
78
+ /**
79
+ * Checks for nullifier conflicts between an incoming transaction and existing pool state.
80
+ *
81
+ * When the incoming tx shares nullifiers with existing pending txs:
82
+ * - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
83
+ * - If any conflicting tx has equal or higher priority, ignore the incoming tx
84
+ *
85
+ * @param incomingMeta - Metadata for the incoming transaction
86
+ * @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
87
+ * @param getMetadata - Accessor to get metadata for a tx hash
88
+ */
89
+ export declare function checkNullifierConflict(incomingMeta: TxMetaData, getTxHashByNullifier: (nullifier: string) => string | undefined, getMetadata: (txHash: string) => TxMetaData | undefined): PreAddResult;
90
+ /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
91
+ export declare function stubTxMetaValidationData(overrides?: {
92
+ expirationTimestamp?: bigint;
93
+ }): TxMetaValidationData;
94
+ export {};
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvdHhfcG9vbF92Mi90eF9tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUkzQyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU3RCw0SEFBNEg7QUFDNUgsTUFBTSxNQUFNLG9CQUFvQixHQUFHO0lBQ2pDLHFCQUFxQixJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQzlCLG1CQUFtQixFQUFFLE1BQU0sQ0FBQztJQUM1QixTQUFTLEVBQUU7UUFDVCxpQkFBaUIsRUFBRTtZQUNqQixJQUFJLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNCLGVBQWUsRUFBRTtnQkFDZixXQUFXLEVBQUUsV0FBVyxDQUFDO2FBQzFCLENBQUM7U0FDSCxDQUFDO0tBQ0gsQ0FBQztDQUNILENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxNQUFNLFVBQVUsR0FBRztJQUN2Qix5Q0FBeUM7SUFDekMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFeEIsNkZBQTZGO0lBQzdGLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUUzQiwrRUFBK0U7SUFDL0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUV2QyxnRUFBZ0U7SUFDaEUsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUM7SUFFN0IsMENBQTBDO0lBQzFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0lBRTFCLHlDQUF5QztJQUN6QyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUU3QixvQkFBb0I7SUFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFFMUIsb0VBQW9FO0lBQ3BFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxNQUFNLEVBQUUsQ0FBQztJQUV2QyxrRkFBa0Y7SUFDbEYsUUFBUSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQztJQUVyQywrRUFBK0U7SUFDL0UsUUFBUSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQztJQUVwQyxtR0FBbUc7SUFDbkcsVUFBVSxFQUFFLE1BQU0sQ0FBQztDQUNwQixDQUFDO0FBRUYsa0ZBQWtGO0FBQ2xGLE1BQU0sTUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLFdBQVcsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBRXBFOzs7O0dBSUc7QUFDSCx3QkFBc0IsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQWtDakU7QUFFRCx1REFBdUQ7QUFDdkQsS0FBSyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQztBQUVyRTs7O0dBR0c7QUFDSCx3QkFBZ0IsVUFBVSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBRXZEO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFnQixhQUFhLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FJMUQ7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQWdCLGVBQWUsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixHQUFHLE1BQU0sQ0FNcEY7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsd0JBQWdCLHNCQUFzQixDQUNwQyxZQUFZLEVBQUUsVUFBVSxFQUN4QixvQkFBb0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEtBQUssTUFBTSxHQUFHLFNBQVMsRUFDL0QsV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sS0FBSyxVQUFVLEdBQUcsU0FBUyxHQUN0RCxZQUFZLENBbUNkO0FBRUQsb0ZBQW9GO0FBQ3BGLHdCQUFnQix3QkFBd0IsQ0FBQyxTQUFTLEdBQUU7SUFBRSxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtDQUFPLEdBQUcsb0JBQW9CLENBVy9HIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_metadata.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAI3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,4HAA4H;AAC5H,MAAM,MAAM,oBAAoB,GAAG;IACjC,qBAAqB,IAAI,EAAE,EAAE,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE;QACT,iBAAiB,EAAE;YACjB,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3B,eAAe,EAAE;gBACf,WAAW,EAAE,WAAW,CAAC;aAC1B,CAAC;SACH,CAAC;KACH,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,6FAA6F;IAC7F,cAAc,CAAC,EAAE,SAAS,CAAC;IAE3B,+EAA+E;IAC/E,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAEvC,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,yCAAyC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC,kFAAkF;IAClF,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IAErC,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAEpC,mGAAmG;IACnG,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpE;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAkCjE;AAED,uDAAuD;AACvD,KAAK,kBAAkB,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,aAAa,CAAC,CAAC;AAErE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAMpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,UAAU,EACxB,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC/D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,GACtD,YAAY,CAmCd;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,SAAS,GAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,oBAAoB,CAW/G"}
@@ -0,0 +1,128 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
+ import { BlockHash } from '@aztec/stdlib/block';
5
+ import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
6
+ import { getTxPriorityFee } from '../tx_pool/priority.js';
7
+ /**
8
+ * Builds TxMetaData from a full Tx object.
9
+ * Extracts all relevant fields for efficient in-memory storage and querying.
10
+ * Fr values are captured in closures for zero-cost re-validation.
11
+ */ export async function buildTxMetaData(tx) {
12
+ const txHash = tx.getTxHash().toString();
13
+ const nullifierFrs = tx.data.getNonEmptyNullifiers();
14
+ const nullifiers = nullifierFrs.map((n)=>n.toString());
15
+ const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash();
16
+ const anchorBlockHeaderHash = anchorBlockHeaderHashFr.toString();
17
+ const expirationTimestamp = tx.data.expirationTimestamp;
18
+ const anchorBlockNumber = tx.data.constants.anchorBlockHeader.globalVariables.blockNumber;
19
+ const priorityFee = getTxPriorityFee(tx);
20
+ const feePayer = tx.data.feePayer.toString();
21
+ const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
22
+ return {
23
+ txHash,
24
+ anchorBlockHeaderHash,
25
+ priorityFee,
26
+ feePayer,
27
+ claimAmount,
28
+ feeLimit,
29
+ nullifiers,
30
+ expirationTimestamp,
31
+ receivedAt: 0,
32
+ data: {
33
+ getNonEmptyNullifiers: ()=>nullifierFrs,
34
+ expirationTimestamp,
35
+ constants: {
36
+ anchorBlockHeader: {
37
+ hash: ()=>Promise.resolve(anchorBlockHeaderHashFr),
38
+ globalVariables: {
39
+ blockNumber: anchorBlockNumber
40
+ }
41
+ }
42
+ }
43
+ }
44
+ };
45
+ }
46
+ /**
47
+ * Compares two priority fees in ascending order.
48
+ * Returns negative if a < b, positive if a > b, 0 if equal.
49
+ */ export function compareFee(a, b) {
50
+ return a < b ? -1 : a > b ? 1 : 0;
51
+ }
52
+ /**
53
+ * Compares two tx hashes in ascending order.
54
+ * Uses field element comparison for deterministic ordering.
55
+ * Returns negative if a < b, positive if a > b, 0 if equal.
56
+ */ export function compareTxHash(a, b) {
57
+ const fieldA = Fr.fromHexString(a);
58
+ const fieldB = Fr.fromHexString(b);
59
+ return fieldA.cmp(fieldB);
60
+ }
61
+ /**
62
+ * Compares two transactions by priority fee, with txHash as tiebreaker.
63
+ * Returns negative if a < b, positive if a > b, 0 if equal.
64
+ * Use with sort() for ascending order, or negate/reverse for descending.
65
+ */ export function comparePriority(a, b) {
66
+ const feeComparison = compareFee(a.priorityFee, b.priorityFee);
67
+ if (feeComparison !== 0) {
68
+ return feeComparison;
69
+ }
70
+ return compareTxHash(a.txHash, b.txHash);
71
+ }
72
+ /**
73
+ * Checks for nullifier conflicts between an incoming transaction and existing pool state.
74
+ *
75
+ * When the incoming tx shares nullifiers with existing pending txs:
76
+ * - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
77
+ * - If any conflicting tx has equal or higher priority, ignore the incoming tx
78
+ *
79
+ * @param incomingMeta - Metadata for the incoming transaction
80
+ * @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
81
+ * @param getMetadata - Accessor to get metadata for a tx hash
82
+ */ export function checkNullifierConflict(incomingMeta, getTxHashByNullifier, getMetadata) {
83
+ const txHashesToEvict = [];
84
+ for (const nullifier of incomingMeta.nullifiers){
85
+ const conflictingHashStr = getTxHashByNullifier(nullifier);
86
+ if (!conflictingHashStr || conflictingHashStr === incomingMeta.txHash) {
87
+ continue;
88
+ }
89
+ // Skip if already marked for eviction
90
+ if (txHashesToEvict.includes(conflictingHashStr)) {
91
+ continue;
92
+ }
93
+ const conflictingMeta = getMetadata(conflictingHashStr);
94
+ if (!conflictingMeta) {
95
+ continue;
96
+ }
97
+ // If incoming tx has strictly higher priority, mark for eviction
98
+ // Otherwise, ignore incoming tx (ties go to existing tx)
99
+ // Use comparePriority for deterministic ordering (includes txHash as tiebreaker)
100
+ if (comparePriority(incomingMeta, conflictingMeta) > 0) {
101
+ txHashesToEvict.push(conflictingHashStr);
102
+ } else {
103
+ return {
104
+ shouldIgnore: true,
105
+ txHashesToEvict: [],
106
+ reason: `nullifier conflict with ${conflictingHashStr}`
107
+ };
108
+ }
109
+ }
110
+ return {
111
+ shouldIgnore: false,
112
+ txHashesToEvict
113
+ };
114
+ }
115
+ /** Creates a stub TxMetaValidationData for tests that don't exercise validators. */ export function stubTxMetaValidationData(overrides = {}) {
116
+ return {
117
+ getNonEmptyNullifiers: ()=>[],
118
+ expirationTimestamp: overrides.expirationTimestamp ?? 0n,
119
+ constants: {
120
+ anchorBlockHeader: {
121
+ hash: ()=>Promise.resolve(new BlockHash(Fr.ZERO)),
122
+ globalVariables: {
123
+ blockNumber: BlockNumber(0)
124
+ }
125
+ }
126
+ }
127
+ };
128
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Metrics types for tx pool benchmarks.
3
+ */
4
+ export declare enum TxPoolOperation {
5
+ ADD_PENDING_TXS = "addPendingTxs",
6
+ CAN_ADD_PENDING_TX = "canAddPendingTx",
7
+ GET_PENDING_TX_HASHES = "getPendingTxHashes",
8
+ GET_TX_BY_HASH = "getTxByHash",
9
+ GET_TXS_BY_HASH = "getTxsByHash",
10
+ HAS_TXS = "hasTxs",
11
+ HANDLE_MINED_BLOCK = "handleMinedBlock",
12
+ PREPARE_FOR_SLOT = "prepareForSlot",
13
+ HANDLE_PRUNED_BLOCKS = "handlePrunedBlocks",
14
+ GET_LOWEST_PRIORITY_PENDING = "getLowestPriorityPending",
15
+ HYDRATE_FROM_DATABASE = "hydrateFromDatabase"
16
+ }
17
+ /**
18
+ * Collects and formats tx pool benchmark metrics.
19
+ */
20
+ export declare class TxPoolBenchMetrics {
21
+ private metrics;
22
+ addMetric(operation: TxPoolOperation, poolSize: number, batchSize: number, value: number): void;
23
+ toPrettyString(): string;
24
+ toGithubActionBenchmarkJSON(indent?: number): string;
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF9iZW5jaF9tZXRyaWNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL3R4X3Bvb2xfdjIvdHhfcG9vbF9iZW5jaF9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsb0JBQVksZUFBZTtJQUN6QixlQUFlLGtCQUFrQjtJQUNqQyxrQkFBa0Isb0JBQW9CO0lBQ3RDLHFCQUFxQix1QkFBdUI7SUFDNUMsY0FBYyxnQkFBZ0I7SUFDOUIsZUFBZSxpQkFBaUI7SUFDaEMsT0FBTyxXQUFXO0lBQ2xCLGtCQUFrQixxQkFBcUI7SUFDdkMsZ0JBQWdCLG1CQUFtQjtJQUNuQyxvQkFBb0IsdUJBQXVCO0lBQzNDLDJCQUEyQiw2QkFBNkI7SUFDeEQscUJBQXFCLHdCQUF3QjtDQUM5QztBQVNEOztHQUVHO0FBQ0gscUJBQWEsa0JBQWtCO0lBQzdCLE9BQU8sQ0FBQyxPQUFPLENBQXlCO0lBRWpDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUU5RjtJQUVNLGNBQWMsSUFBSSxNQUFNLENBd0I5QjtJQUVNLDJCQUEyQixDQUFDLE1BQU0sU0FBSSxHQUFHLE1BQU0sQ0FjckQ7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_pool_bench_metrics.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,eAAe;IACzB,eAAe,kBAAkB;IACjC,kBAAkB,oBAAoB;IACtC,qBAAqB,uBAAuB;IAC5C,cAAc,gBAAgB;IAC9B,eAAe,iBAAiB;IAChC,OAAO,WAAW;IAClB,kBAAkB,qBAAqB;IACvC,gBAAgB,mBAAmB;IACnC,oBAAoB,uBAAuB;IAC3C,2BAA2B,6BAA6B;IACxD,qBAAqB,wBAAwB;CAC9C;AASD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAyB;IAEjC,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAE9F;IAEM,cAAc,IAAI,MAAM,CAwB9B;IAEM,2BAA2B,CAAC,MAAM,SAAI,GAAG,MAAM,CAcrD;CACF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Metrics types for tx pool benchmarks.
3
+ */ export var TxPoolOperation = /*#__PURE__*/ function(TxPoolOperation) {
4
+ TxPoolOperation["ADD_PENDING_TXS"] = "addPendingTxs";
5
+ TxPoolOperation["CAN_ADD_PENDING_TX"] = "canAddPendingTx";
6
+ TxPoolOperation["GET_PENDING_TX_HASHES"] = "getPendingTxHashes";
7
+ TxPoolOperation["GET_TX_BY_HASH"] = "getTxByHash";
8
+ TxPoolOperation["GET_TXS_BY_HASH"] = "getTxsByHash";
9
+ TxPoolOperation["HAS_TXS"] = "hasTxs";
10
+ TxPoolOperation["HANDLE_MINED_BLOCK"] = "handleMinedBlock";
11
+ TxPoolOperation["PREPARE_FOR_SLOT"] = "prepareForSlot";
12
+ TxPoolOperation["HANDLE_PRUNED_BLOCKS"] = "handlePrunedBlocks";
13
+ TxPoolOperation["GET_LOWEST_PRIORITY_PENDING"] = "getLowestPriorityPending";
14
+ TxPoolOperation["HYDRATE_FROM_DATABASE"] = "hydrateFromDatabase";
15
+ return TxPoolOperation;
16
+ }({});
17
+ /**
18
+ * Collects and formats tx pool benchmark metrics.
19
+ */ export class TxPoolBenchMetrics {
20
+ metrics = [];
21
+ addMetric(operation, poolSize, batchSize, value) {
22
+ this.metrics.push({
23
+ operation,
24
+ poolSize,
25
+ batchSize,
26
+ value
27
+ });
28
+ }
29
+ toPrettyString() {
30
+ let pretty = 'TxPool Benchmark Metrics:\n';
31
+ pretty += '='.repeat(60) + '\n';
32
+ // Group by operation
33
+ const byOperation = new Map();
34
+ for (const metric of this.metrics){
35
+ if (!byOperation.has(metric.operation)) {
36
+ byOperation.set(metric.operation, []);
37
+ }
38
+ byOperation.get(metric.operation).push(metric);
39
+ }
40
+ for (const [operation, opMetrics] of byOperation){
41
+ pretty += `\n${operation}:\n`;
42
+ for (const metric of opMetrics){
43
+ const poolSizeStr = metric.poolSize > 0 ? `pool=${metric.poolSize}` : '';
44
+ const batchSizeStr = metric.batchSize > 0 ? `batch=${metric.batchSize}` : '';
45
+ const params = [
46
+ poolSizeStr,
47
+ batchSizeStr
48
+ ].filter(Boolean).join(', ');
49
+ pretty += ` ${params ? `(${params})` : ''}: ${metric.value.toFixed(3)} ms\n`;
50
+ }
51
+ }
52
+ return pretty;
53
+ }
54
+ toGithubActionBenchmarkJSON(indent = 2) {
55
+ const data = this.metrics.map((metric)=>{
56
+ const poolSizeStr = metric.poolSize > 0 ? `${metric.poolSize} txs in pool` : '';
57
+ const batchSizeStr = metric.batchSize > 0 ? `batch of ${metric.batchSize}` : '';
58
+ const params = [
59
+ poolSizeStr,
60
+ batchSizeStr
61
+ ].filter(Boolean).join('/');
62
+ return {
63
+ name: `TxPool/${metric.operation}${params ? `/${params}` : ''}`,
64
+ value: metric.value,
65
+ unit: 'ms'
66
+ };
67
+ });
68
+ return JSON.stringify(data, null, indent);
69
+ }
70
+ }
@@ -0,0 +1,105 @@
1
+ import { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import type { L2BlockId } from '@aztec/stdlib/block';
3
+ import { type TxMetaData, type TxState } from './tx_metadata.js';
4
+ /**
5
+ * Manages in-memory indices for the transaction pool.
6
+ *
7
+ * Tracks transaction metadata and maintains several indices for efficient querying:
8
+ * - Metadata by txHash (primary store)
9
+ * - Nullifier to txHash mapping (pending txs only)
10
+ * - Fee payer to txHashes mapping (pending txs only)
11
+ * - Priority-ordered pending txs
12
+ * - Protected transaction tracking
13
+ *
14
+ * Key invariant: Only pending txs appear in nullifier/feePayer/priority indices.
15
+ */
16
+ export declare class TxPoolIndices {
17
+ #private;
18
+ /**
19
+ * Derives the transaction state from its metadata and protection status.
20
+ * A transaction is:
21
+ * - 'mined' if it has a minedL2BlockId
22
+ * - 'protected' if it's in the protectedTransactions map (but not mined)
23
+ * - 'pending' otherwise
24
+ */
25
+ getTxState(meta: TxMetaData): TxState;
26
+ getMetadata(txHash: string): TxMetaData | undefined;
27
+ has(txHash: string): boolean;
28
+ isEmpty(): boolean;
29
+ getTxCount(): number;
30
+ /**
31
+ * Iterates pending transaction hashes in priority order.
32
+ * @param order - 'desc' for highest priority first, 'asc' for lowest priority first
33
+ */
34
+ iteratePendingByPriority(order: 'asc' | 'desc', filter?: (hash: string) => boolean): Generator<string>;
35
+ /**
36
+ * Iterates pending transaction hashes in priority order, skipping txs received after maxReceivedAt.
37
+ * @param order - 'desc' for highest priority first, 'asc' for lowest priority first
38
+ * @param maxReceivedAt - Only yield txs with receivedAt <= this value
39
+ */
40
+ iterateEligiblePendingByPriority(order: 'asc' | 'desc', maxReceivedAt: number): Generator<string>;
41
+ /** Iterates all metadata entries */
42
+ iterateMetadata(): Generator<[string, TxMetaData]>;
43
+ /** Adds a new pending transaction to all indices */
44
+ addPending(meta: TxMetaData): void;
45
+ /** Adds a new protected transaction (not added to pending indices) */
46
+ addProtected(meta: TxMetaData, slot: SlotNumber): void;
47
+ /** Adds a new mined transaction (not added to pending indices) */
48
+ addMined(meta: TxMetaData): void;
49
+ /** Marks an existing transaction as mined and removes from pending indices */
50
+ markAsMined(meta: TxMetaData, blockId: L2BlockId): void;
51
+ /** Clears the mined status from a transaction */
52
+ markAsUnmined(meta: TxMetaData): void;
53
+ /**
54
+ * Updates protection status for an existing transaction.
55
+ * Removes from pending indices if transitioning from pending to protected.
56
+ */
57
+ updateProtection(txHash: string, slotNumber: SlotNumber): void;
58
+ /** Sets protection for a txHash that may not have metadata yet */
59
+ setProtection(txHash: string, slotNumber: SlotNumber): void;
60
+ /** Gets the protection slot for a txHash, if protected */
61
+ getProtectionSlot(txHash: string): SlotNumber | undefined;
62
+ /** Removes protection from tx hashes */
63
+ clearProtection(txHashes: string[]): void;
64
+ /** Removes a transaction from all indices */
65
+ remove(txHash: string): void;
66
+ /** Removes a transaction from pending indices only (not metadata) */
67
+ removeFromPendingIndices(meta: TxMetaData): void;
68
+ /** Adds a transaction to pending indices (used during conflict resolution) */
69
+ addToPendingIndices(meta: TxMetaData): void;
70
+ /** Gets all pending transactions for a given fee payer */
71
+ getFeePayerPendingTxs(feePayer: string): TxMetaData[];
72
+ /** Gets the count of pending transactions */
73
+ getPendingTxCount(): number;
74
+ /** Gets the lowest priority pending transaction hashes (up to limit) */
75
+ getLowestPriorityPending(limit: number): string[];
76
+ /** Gets the lowest priority pending transaction */
77
+ getLowestPriorityPendingTx(): TxMetaData | undefined;
78
+ /** Gets all pending transactions */
79
+ getPendingTxs(): TxMetaData[];
80
+ /** Gets all fee payers with pending transactions */
81
+ getPendingFeePayers(): string[];
82
+ /** Gets the txHash that uses a given nullifier (pending txs only) */
83
+ getTxHashByNullifier(nullifier: string): string | undefined;
84
+ /** Gets txHashes for a fee payer */
85
+ getTxHashesByFeePayer(feePayer: string): Set<string> | undefined;
86
+ /** Finds all transactions mined in blocks after the given block number */
87
+ findTxsMinedAfter(blockNumber: number): TxMetaData[];
88
+ /** Finds tx hashes mined at or before the given block number */
89
+ findTxsMinedAtOrBefore(blockNumber: number): string[];
90
+ /** Finds protected tx hashes from slots earlier than the given slot number */
91
+ findExpiredProtectedTxs(slotNumber: SlotNumber): string[];
92
+ /** Filters out transactions that are currently protected */
93
+ filterUnprotected(txs: TxMetaData[]): TxMetaData[];
94
+ /** Filters to transactions that have metadata and are not mined */
95
+ filterRestorable(txHashes: string[]): TxMetaData[];
96
+ /** Counts transactions by state */
97
+ countTxs(): {
98
+ pending: number;
99
+ protected: number;
100
+ mined: number;
101
+ };
102
+ /** Gets all mined transactions with their block IDs */
103
+ getMinedTxs(): [string, L2BlockId][];
104
+ }
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF9pbmRpY2VzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL3R4X3Bvb2xfdjIvdHhfcG9vbF9pbmRpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUUsS0FBSyxPQUFPLEVBQTZCLE1BQU0sa0JBQWtCLENBQUM7QUFFNUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxxQkFBYSxhQUFhOztJQWdCeEI7Ozs7OztPQU1HO0lBQ0gsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQVFwQztJQUVELFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFVBQVUsR0FBRyxTQUFTLENBRWxEO0lBRUQsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUUzQjtJQUVELE9BQU8sSUFBSSxPQUFPLENBRWpCO0lBRUQsVUFBVSxJQUFJLE1BQU0sQ0FFbkI7SUFNRDs7O09BR0c7SUFDRix3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEtBQUssT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FpQnRHO0lBRUQ7Ozs7T0FJRztJQUNGLGdDQUFnQyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQU9qRztJQUVELG9DQUFvQztJQUNuQyxlQUFlLElBQUksU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBRWxEO0lBTUQsb0RBQW9EO0lBQ3BELFVBQVUsQ0FB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_pool_indices.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_pool_indices.ts"],"names":[],"mappings":"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"}