@aztec/p2p 0.0.0-test.0 → 0.0.1-commit.0208eb9

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 (528) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +4 -3
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/bootstrap/bootstrap.js +26 -13
  4. package/dest/client/factory.d.ts +15 -5
  5. package/dest/client/factory.d.ts.map +1 -1
  6. package/dest/client/factory.js +63 -25
  7. package/dest/client/index.d.ts +2 -1
  8. package/dest/client/index.d.ts.map +1 -1
  9. package/dest/client/index.js +1 -0
  10. package/dest/client/interface.d.ts +170 -0
  11. package/dest/client/interface.d.ts.map +1 -0
  12. package/dest/client/interface.js +9 -0
  13. package/dest/client/p2p_client.d.ts +77 -193
  14. package/dest/client/p2p_client.d.ts.map +1 -1
  15. package/dest/client/p2p_client.js +769 -229
  16. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
  17. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
  18. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
  19. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
  20. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
  21. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
  22. package/dest/config.d.ts +160 -125
  23. package/dest/config.d.ts.map +1 -1
  24. package/dest/config.js +184 -34
  25. package/dest/enr/generate-enr.d.ts +11 -3
  26. package/dest/enr/generate-enr.d.ts.map +1 -1
  27. package/dest/enr/generate-enr.js +27 -5
  28. package/dest/enr/index.d.ts +1 -1
  29. package/dest/errors/attestation-pool.error.d.ts +7 -0
  30. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  31. package/dest/errors/attestation-pool.error.js +12 -0
  32. package/dest/errors/reqresp.error.d.ts +1 -1
  33. package/dest/errors/reqresp.error.d.ts.map +1 -1
  34. package/dest/index.d.ts +4 -1
  35. package/dest/index.d.ts.map +1 -1
  36. package/dest/index.js +2 -0
  37. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
  38. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  40. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  41. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +299 -174
  42. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  43. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
  44. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  45. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
  46. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
  47. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  48. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
  49. package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -11
  50. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  51. package/dest/mem_pools/attestation_pool/mocks.js +19 -21
  52. package/dest/mem_pools/index.d.ts +1 -1
  53. package/dest/mem_pools/instrumentation.d.ts +16 -12
  54. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  55. package/dest/mem_pools/instrumentation.js +56 -41
  56. package/dest/mem_pools/interface.d.ts +3 -4
  57. package/dest/mem_pools/interface.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +75 -16
  59. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +493 -142
  61. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
  62. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  63. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
  64. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
  65. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
  67. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
  68. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
  70. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  71. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  72. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  73. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  74. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  75. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
  76. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  77. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  78. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  79. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
  80. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
  81. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
  82. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  83. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool/index.js +0 -1
  85. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  86. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  87. package/dest/mem_pools/tx_pool/priority.js +7 -2
  88. package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
  89. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  90. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  91. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
  92. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +276 -45
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
  94. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/attestation_validator/attestation_validator.js +79 -10
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  98. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
  99. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  100. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  101. package/dest/msg_validators/attestation_validator/index.js +1 -0
  102. package/dest/msg_validators/clock_tolerance.d.ts +21 -0
  103. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
  104. package/dest/msg_validators/clock_tolerance.js +37 -0
  105. package/dest/msg_validators/index.d.ts +2 -2
  106. package/dest/msg_validators/index.d.ts.map +1 -1
  107. package/dest/msg_validators/index.js +1 -1
  108. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
  109. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
  110. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
  111. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  112. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  113. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  114. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  115. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  116. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  117. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  118. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  119. package/dest/msg_validators/proposal_validator/index.js +3 -0
  120. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  121. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
  123. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  124. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  125. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
  126. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  127. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
  129. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
  130. package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
  131. package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
  132. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
  134. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
  135. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/block_header_validator.js +7 -6
  137. package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
  138. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/data_validator.js +60 -87
  140. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -4
  141. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
  143. package/dest/msg_validators/tx_validator/factory.d.ts +21 -0
  144. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
  145. package/dest/msg_validators/tx_validator/factory.js +84 -0
  146. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  147. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  148. package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
  149. package/dest/msg_validators/tx_validator/gas_validator.d.ts +12 -0
  150. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/gas_validator.js +110 -0
  152. package/dest/msg_validators/tx_validator/index.d.ts +9 -1
  153. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  154. package/dest/msg_validators/tx_validator/index.js +8 -0
  155. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
  156. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
  158. package/dest/msg_validators/tx_validator/phases_validator.d.ts +15 -0
  159. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
  160. package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
  161. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  162. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  163. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  164. package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
  165. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/test_utils.js +22 -0
  167. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +14 -0
  168. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
  169. package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
  170. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
  171. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
  172. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
  173. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
  174. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/tx_proof_validator.js +8 -7
  176. package/dest/services/data_store.d.ts +1 -1
  177. package/dest/services/data_store.d.ts.map +1 -1
  178. package/dest/services/data_store.js +10 -6
  179. package/dest/services/discv5/discV5_service.d.ts +10 -9
  180. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  181. package/dest/services/discv5/discV5_service.js +64 -37
  182. package/dest/services/dummy_service.d.ts +66 -11
  183. package/dest/services/dummy_service.d.ts.map +1 -1
  184. package/dest/services/dummy_service.js +130 -5
  185. package/dest/services/encoding.d.ts +26 -7
  186. package/dest/services/encoding.d.ts.map +1 -1
  187. package/dest/services/encoding.js +75 -6
  188. package/dest/services/gossipsub/scoring.d.ts +1 -1
  189. package/dest/services/index.d.ts +6 -1
  190. package/dest/services/index.d.ts.map +1 -1
  191. package/dest/services/index.js +5 -0
  192. package/dest/services/libp2p/instrumentation.d.ts +20 -0
  193. package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
  194. package/dest/services/libp2p/instrumentation.js +122 -0
  195. package/dest/services/libp2p/libp2p_service.d.ts +107 -95
  196. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  197. package/dest/services/libp2p/libp2p_service.js +1328 -313
  198. package/dest/services/peer-manager/interface.d.ts +23 -0
  199. package/dest/services/peer-manager/interface.d.ts.map +1 -0
  200. package/dest/services/peer-manager/interface.js +1 -0
  201. package/dest/services/peer-manager/metrics.d.ts +12 -3
  202. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  203. package/dest/services/peer-manager/metrics.js +44 -12
  204. package/dest/services/peer-manager/peer_manager.d.ts +103 -23
  205. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  206. package/dest/services/peer-manager/peer_manager.js +551 -82
  207. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  208. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  209. package/dest/services/peer-manager/peer_scoring.js +43 -2
  210. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
  211. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  212. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
  213. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  214. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  215. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  216. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  217. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  218. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  219. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
  220. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  221. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
  222. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
  223. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  224. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
  225. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
  226. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  227. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
  228. package/dest/services/reqresp/config.d.ts +11 -9
  229. package/dest/services/reqresp/config.d.ts.map +1 -1
  230. package/dest/services/reqresp/config.js +18 -4
  231. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +23 -4
  232. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  233. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +73 -10
  234. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
  235. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  236. package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
  237. package/dest/services/reqresp/constants.d.ts +12 -0
  238. package/dest/services/reqresp/constants.d.ts.map +1 -0
  239. package/dest/services/reqresp/constants.js +7 -0
  240. package/dest/services/reqresp/index.d.ts +3 -2
  241. package/dest/services/reqresp/index.d.ts.map +1 -1
  242. package/dest/services/reqresp/index.js +2 -1
  243. package/dest/services/reqresp/interface.d.ts +75 -24
  244. package/dest/services/reqresp/interface.d.ts.map +1 -1
  245. package/dest/services/reqresp/interface.js +46 -27
  246. package/dest/services/reqresp/metrics.d.ts +6 -5
  247. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  248. package/dest/services/reqresp/metrics.js +17 -21
  249. package/dest/services/reqresp/protocols/auth.d.ts +43 -0
  250. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
  251. package/dest/services/reqresp/protocols/auth.js +71 -0
  252. package/dest/services/reqresp/protocols/block.d.ts +6 -1
  253. package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
  254. package/dest/services/reqresp/protocols/block.js +30 -6
  255. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +34 -0
  256. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
  257. package/dest/services/reqresp/protocols/block_txs/bitvector.js +87 -0
  258. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
  259. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
  260. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +52 -0
  261. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +59 -0
  262. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
  263. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +105 -0
  264. package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
  265. package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
  266. package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
  267. package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
  268. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  269. package/dest/services/reqresp/protocols/goodbye.js +7 -7
  270. package/dest/services/reqresp/protocols/index.d.ts +3 -1
  271. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  272. package/dest/services/reqresp/protocols/index.js +2 -0
  273. package/dest/services/reqresp/protocols/ping.d.ts +1 -3
  274. package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
  275. package/dest/services/reqresp/protocols/status.d.ts +40 -7
  276. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  277. package/dest/services/reqresp/protocols/status.js +76 -5
  278. package/dest/services/reqresp/protocols/tx.d.ts +14 -4
  279. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  280. package/dest/services/reqresp/protocols/tx.js +34 -6
  281. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  282. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
  283. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  284. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
  285. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  286. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  287. package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
  288. package/dest/services/reqresp/reqresp.d.ts +29 -66
  289. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  290. package/dest/services/reqresp/reqresp.js +753 -248
  291. package/dest/services/reqresp/status.d.ts +10 -4
  292. package/dest/services/reqresp/status.d.ts.map +1 -1
  293. package/dest/services/reqresp/status.js +9 -2
  294. package/dest/services/service.d.ts +40 -20
  295. package/dest/services/service.d.ts.map +1 -1
  296. package/dest/services/tx_collection/config.d.ts +28 -0
  297. package/dest/services/tx_collection/config.d.ts.map +1 -0
  298. package/dest/services/tx_collection/config.js +66 -0
  299. package/dest/services/tx_collection/fast_tx_collection.d.ts +53 -0
  300. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
  301. package/dest/services/tx_collection/fast_tx_collection.js +311 -0
  302. package/dest/services/tx_collection/index.d.ts +4 -0
  303. package/dest/services/tx_collection/index.d.ts.map +1 -0
  304. package/dest/services/tx_collection/index.js +3 -0
  305. package/dest/services/tx_collection/instrumentation.d.ts +10 -0
  306. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
  307. package/dest/services/tx_collection/instrumentation.js +31 -0
  308. package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
  309. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
  310. package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
  311. package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
  312. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
  313. package/dest/services/tx_collection/slow_tx_collection.js +177 -0
  314. package/dest/services/tx_collection/tx_collection.d.ts +110 -0
  315. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
  316. package/dest/services/tx_collection/tx_collection.js +128 -0
  317. package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
  318. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
  319. package/dest/services/tx_collection/tx_collection_sink.js +111 -0
  320. package/dest/services/tx_collection/tx_source.d.ts +18 -0
  321. package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
  322. package/dest/services/tx_collection/tx_source.js +31 -0
  323. package/dest/services/tx_file_store/config.d.ts +18 -0
  324. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  325. package/dest/services/tx_file_store/config.js +26 -0
  326. package/dest/services/tx_file_store/index.d.ts +4 -0
  327. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  328. package/dest/services/tx_file_store/index.js +3 -0
  329. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  330. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  331. package/dest/services/tx_file_store/instrumentation.js +29 -0
  332. package/dest/services/tx_file_store/tx_file_store.d.ts +47 -0
  333. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  334. package/dest/services/tx_file_store/tx_file_store.js +149 -0
  335. package/dest/services/tx_provider.d.ts +51 -0
  336. package/dest/services/tx_provider.d.ts.map +1 -0
  337. package/dest/services/tx_provider.js +219 -0
  338. package/dest/services/tx_provider_instrumentation.d.ts +16 -0
  339. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
  340. package/dest/services/tx_provider_instrumentation.js +34 -0
  341. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  342. package/dest/test-helpers/get-ports.d.ts +1 -1
  343. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  344. package/dest/test-helpers/index.d.ts +4 -1
  345. package/dest/test-helpers/index.d.ts.map +1 -1
  346. package/dest/test-helpers/index.js +3 -0
  347. package/dest/test-helpers/make-enrs.d.ts +1 -1
  348. package/dest/test-helpers/make-enrs.d.ts.map +1 -1
  349. package/dest/test-helpers/make-enrs.js +4 -5
  350. package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
  351. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  352. package/dest/test-helpers/make-test-p2p-clients.js +86 -16
  353. package/dest/test-helpers/mock-pubsub.d.ts +59 -0
  354. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
  355. package/dest/test-helpers/mock-pubsub.js +130 -0
  356. package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
  357. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
  358. package/dest/test-helpers/mock-tx-helpers.js +19 -0
  359. package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
  360. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  361. package/dest/test-helpers/reqresp-nodes.js +62 -28
  362. package/dest/test-helpers/test_tx_provider.d.ts +40 -0
  363. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  364. package/dest/test-helpers/test_tx_provider.js +41 -0
  365. package/dest/test-helpers/testbench-utils.d.ts +158 -0
  366. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  367. package/dest/test-helpers/testbench-utils.js +297 -0
  368. package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
  369. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  370. package/dest/testbench/p2p_client_testbench_worker.js +259 -90
  371. package/dest/testbench/parse_log_file.d.ts +1 -1
  372. package/dest/testbench/parse_log_file.js +4 -4
  373. package/dest/testbench/testbench.d.ts +1 -1
  374. package/dest/testbench/testbench.js +4 -4
  375. package/dest/testbench/worker_client_manager.d.ts +51 -11
  376. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  377. package/dest/testbench/worker_client_manager.js +232 -53
  378. package/dest/types/index.d.ts +4 -2
  379. package/dest/types/index.d.ts.map +1 -1
  380. package/dest/types/index.js +2 -0
  381. package/dest/util.d.ts +24 -16
  382. package/dest/util.d.ts.map +1 -1
  383. package/dest/util.js +75 -69
  384. package/dest/versioning.d.ts +4 -4
  385. package/dest/versioning.d.ts.map +1 -1
  386. package/dest/versioning.js +8 -3
  387. package/package.json +32 -27
  388. package/src/bootstrap/bootstrap.ts +34 -15
  389. package/src/client/factory.ts +139 -53
  390. package/src/client/index.ts +1 -0
  391. package/src/client/interface.ts +213 -0
  392. package/src/client/p2p_client.ts +481 -383
  393. package/src/client/test/tx_proposal_collector/README.md +227 -0
  394. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
  395. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
  396. package/src/config.ts +311 -134
  397. package/src/enr/generate-enr.ts +39 -6
  398. package/src/errors/attestation-pool.error.ts +13 -0
  399. package/src/index.ts +4 -0
  400. package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
  401. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +352 -201
  402. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
  403. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
  404. package/src/mem_pools/attestation_pool/mocks.ts +24 -17
  405. package/src/mem_pools/instrumentation.ts +72 -48
  406. package/src/mem_pools/interface.ts +2 -4
  407. package/src/mem_pools/tx_pool/README.md +270 -0
  408. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +580 -143
  409. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
  410. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
  411. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
  412. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  413. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
  414. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  415. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
  416. package/src/mem_pools/tx_pool/index.ts +0 -1
  417. package/src/mem_pools/tx_pool/priority.ts +9 -2
  418. package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
  419. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
  420. package/src/msg_validators/attestation_validator/attestation_validator.ts +72 -14
  421. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
  422. package/src/msg_validators/attestation_validator/index.ts +1 -0
  423. package/src/msg_validators/clock_tolerance.ts +51 -0
  424. package/src/msg_validators/index.ts +1 -1
  425. package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
  426. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  427. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  428. package/src/msg_validators/proposal_validator/index.ts +3 -0
  429. package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
  430. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
  431. package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
  432. package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
  433. package/src/msg_validators/tx_validator/block_header_validator.ts +10 -9
  434. package/src/msg_validators/tx_validator/data_validator.ts +95 -71
  435. package/src/msg_validators/tx_validator/double_spend_validator.ts +23 -20
  436. package/src/msg_validators/tx_validator/factory.ts +151 -0
  437. package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
  438. package/src/msg_validators/tx_validator/gas_validator.ts +123 -0
  439. package/src/msg_validators/tx_validator/index.ts +8 -0
  440. package/src/msg_validators/tx_validator/metadata_validator.ts +72 -24
  441. package/src/msg_validators/tx_validator/phases_validator.ts +118 -0
  442. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  443. package/src/msg_validators/tx_validator/test_utils.ts +43 -0
  444. package/src/msg_validators/tx_validator/timestamp_validator.ts +52 -0
  445. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
  446. package/src/msg_validators/tx_validator/tx_proof_validator.ts +14 -8
  447. package/src/services/data_store.ts +10 -7
  448. package/src/services/discv5/discV5_service.ts +85 -39
  449. package/src/services/dummy_service.ts +198 -9
  450. package/src/services/encoding.ts +82 -6
  451. package/src/services/index.ts +5 -0
  452. package/src/services/libp2p/instrumentation.ts +126 -0
  453. package/src/services/libp2p/libp2p_service.ts +1170 -353
  454. package/src/services/peer-manager/interface.ts +29 -0
  455. package/src/services/peer-manager/metrics.ts +55 -12
  456. package/src/services/peer-manager/peer_manager.ts +657 -80
  457. package/src/services/peer-manager/peer_scoring.ts +45 -3
  458. package/src/services/reqresp/batch-tx-requester/README.md +305 -0
  459. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
  460. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  461. package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
  462. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
  463. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
  464. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
  465. package/src/services/reqresp/config.ts +26 -9
  466. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +77 -10
  467. package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
  468. package/src/services/reqresp/constants.ts +14 -0
  469. package/src/services/reqresp/index.ts +2 -0
  470. package/src/services/reqresp/interface.ts +95 -37
  471. package/src/services/reqresp/metrics.ts +40 -28
  472. package/src/services/reqresp/protocols/auth.ts +83 -0
  473. package/src/services/reqresp/protocols/block.ts +26 -4
  474. package/src/services/reqresp/protocols/block_txs/bitvector.ts +106 -0
  475. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +67 -0
  476. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +121 -0
  477. package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
  478. package/src/services/reqresp/protocols/goodbye.ts +9 -7
  479. package/src/services/reqresp/protocols/index.ts +2 -0
  480. package/src/services/reqresp/protocols/status.ts +121 -5
  481. package/src/services/reqresp/protocols/tx.ts +36 -8
  482. package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
  483. package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
  484. package/src/services/reqresp/reqresp.ts +449 -271
  485. package/src/services/reqresp/status.ts +12 -3
  486. package/src/services/service.ts +65 -22
  487. package/src/services/tx_collection/config.ts +98 -0
  488. package/src/services/tx_collection/fast_tx_collection.ts +364 -0
  489. package/src/services/tx_collection/index.ts +7 -0
  490. package/src/services/tx_collection/instrumentation.ts +35 -0
  491. package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
  492. package/src/services/tx_collection/slow_tx_collection.ts +233 -0
  493. package/src/services/tx_collection/tx_collection.ts +216 -0
  494. package/src/services/tx_collection/tx_collection_sink.ts +129 -0
  495. package/src/services/tx_collection/tx_source.ts +37 -0
  496. package/src/services/tx_file_store/config.ts +43 -0
  497. package/src/services/tx_file_store/index.ts +3 -0
  498. package/src/services/tx_file_store/instrumentation.ts +36 -0
  499. package/src/services/tx_file_store/tx_file_store.ts +173 -0
  500. package/src/services/tx_provider.ts +232 -0
  501. package/src/services/tx_provider_instrumentation.ts +54 -0
  502. package/src/test-helpers/index.ts +3 -0
  503. package/src/test-helpers/make-enrs.ts +4 -5
  504. package/src/test-helpers/make-test-p2p-clients.ts +111 -21
  505. package/src/test-helpers/mock-pubsub.ts +188 -0
  506. package/src/test-helpers/mock-tx-helpers.ts +24 -0
  507. package/src/test-helpers/reqresp-nodes.ts +87 -36
  508. package/src/test-helpers/test_tx_provider.ts +64 -0
  509. package/src/test-helpers/testbench-utils.ts +374 -0
  510. package/src/testbench/p2p_client_testbench_worker.ts +434 -89
  511. package/src/testbench/parse_log_file.ts +4 -4
  512. package/src/testbench/testbench.ts +4 -4
  513. package/src/testbench/worker_client_manager.ts +315 -59
  514. package/src/types/index.ts +2 -0
  515. package/src/util.ts +105 -91
  516. package/src/versioning.ts +11 -4
  517. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
  518. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  519. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
  520. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
  521. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  522. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
  523. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  524. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  525. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  526. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
  527. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
  528. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,30 +1,75 @@
1
+ import { insertIntoSortedArray } from '@aztec/foundation/array';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
1
4
  import { toArray } from '@aztec/foundation/iterable';
2
5
  import { type Logger, createLogger } from '@aztec/foundation/log';
6
+ import type { TypedEventEmitter } from '@aztec/foundation/types';
3
7
  import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncMultiMap } from '@aztec/kv-store';
4
- import { ClientIvcProof } from '@aztec/stdlib/proofs';
8
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
+ import type { MerkleTreeReadOperations, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
10
+ import { ChonkProof } from '@aztec/stdlib/proofs';
5
11
  import type { TxAddedToPoolStats } from '@aztec/stdlib/stats';
6
- import { Tx, TxHash } from '@aztec/stdlib/tx';
12
+ import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
7
13
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
8
14
 
9
- import { PoolInstrumentation, PoolName } from '../instrumentation.js';
15
+ import assert from 'assert';
16
+ import EventEmitter from 'node:events';
17
+
18
+ import { ArchiveCache } from '../../msg_validators/tx_validator/archive_cache.js';
19
+ import { PoolInstrumentation, PoolName, type PoolStatsCallback } from '../instrumentation.js';
20
+ import { EvictionManager } from './eviction/eviction_manager.js';
21
+ import {
22
+ FeePayerTxInfo,
23
+ type PendingTxInfo,
24
+ type PreAddPoolAccess,
25
+ type TxBlockReference,
26
+ type TxPoolOperations,
27
+ } from './eviction/eviction_strategy.js';
28
+ import { FeePayerBalanceEvictionRule } from './eviction/fee_payer_balance_eviction_rule.js';
29
+ import { InvalidTxsAfterMiningRule } from './eviction/invalid_txs_after_mining_rule.js';
30
+ import { InvalidTxsAfterReorgRule } from './eviction/invalid_txs_after_reorg_rule.js';
31
+ import { LowPriorityEvictionRule } from './eviction/low_priority_eviction_rule.js';
32
+ import { NullifierConflictPreAddRule } from './eviction/nullifier_conflict_pre_add_rule.js';
10
33
  import { getPendingTxPriority } from './priority.js';
11
- import type { TxPool } from './tx_pool.js';
34
+ import type { TxPool, TxPoolEvents, TxPoolOptions } from './tx_pool.js';
12
35
 
13
36
  /**
14
37
  * KV implementation of the Transaction Pool.
15
38
  */
16
- export class AztecKVTxPool implements TxPool {
39
+ export class AztecKVTxPool
40
+ extends (EventEmitter as new () => TypedEventEmitter<TxPoolEvents>)
41
+ implements TxPool, TxPoolOperations
42
+ {
17
43
  #store: AztecAsyncKVStore;
18
44
 
19
45
  /** Our tx pool, stored as a Map, with K: tx hash and V: the transaction. */
20
46
  #txs: AztecAsyncMap<string, Buffer>;
21
47
 
48
+ /** Holds the historical block for each tx */
49
+ #pendingTxHashToHistoricalBlockHeaderHash: AztecAsyncMap<string, string>;
50
+
22
51
  /** Index from tx hash to the block number in which they were mined, filtered by mined txs. */
23
- #minedTxHashToBlock: AztecAsyncMap<string, number>;
52
+ #minedTxHashToBlock: AztecAsyncMap<string, BlockNumber>;
24
53
 
25
54
  /** Index from tx priority (stored as hex) to its tx hash, filtered by pending txs. */
26
55
  #pendingTxPriorityToHash: AztecAsyncMultiMap<string, string>;
27
56
 
57
+ /** Map from tx hash to the block number it was originally mined in (for soft-deleted txs). */
58
+ #deletedMinedTxHashes: AztecAsyncMap<string, BlockNumber>;
59
+
60
+ /** MultiMap from block number to deleted mined tx hashes for efficient cleanup. */
61
+ #blockToDeletedMinedTxHash: AztecAsyncMultiMap<BlockNumber, string>;
62
+
63
+ #historicalHeaderToTxHash: AztecAsyncMultiMap<string, string>;
64
+
65
+ #feePayerToBalanceEntry: AztecAsyncMultiMap<string, Buffer>;
66
+
67
+ /** Index from nullifier to pending tx hash */
68
+ #pendingNullifierToTxHash: AztecAsyncMap<string, string>;
69
+
70
+ /** In-memory set of txs that should not be evicted from the pool. */
71
+ #nonEvictableTxs: Set<string>;
72
+
28
73
  /** KV store for archived txs. */
29
74
  #archive: AztecAsyncKVStore;
30
75
 
@@ -35,7 +80,9 @@ export class AztecKVTxPool implements TxPool {
35
80
  #archivedTxIndices: AztecAsyncMap<number, string>;
36
81
 
37
82
  /** Number of txs to archive. */
38
- #archivedTxLimit: number;
83
+ #archivedTxLimit: number = 0;
84
+
85
+ #evictionManager: EvictionManager;
39
86
 
40
87
  #log: Logger;
41
88
 
@@ -52,91 +99,160 @@ export class AztecKVTxPool implements TxPool {
52
99
  constructor(
53
100
  store: AztecAsyncKVStore,
54
101
  archive: AztecAsyncKVStore,
102
+ worldState: WorldStateSynchronizer,
55
103
  telemetry: TelemetryClient = getTelemetryClient(),
56
- archivedTxLimit: number = 0,
104
+ config: TxPoolOptions = {},
57
105
  log = createLogger('p2p:tx_pool'),
58
106
  ) {
107
+ super();
108
+
109
+ this.#log = log;
110
+
111
+ this.#evictionManager = new EvictionManager(this);
112
+ this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
113
+ this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(worldState));
114
+ this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(worldState));
115
+ this.#evictionManager.registerRule(
116
+ new LowPriorityEvictionRule({
117
+ //NOTE: 0 effectively disables low priority eviction
118
+ maxPoolSize: config.maxPendingTxCount ?? 0,
119
+ }),
120
+ );
121
+ this.#evictionManager.registerPreAddRule(new NullifierConflictPreAddRule());
122
+
123
+ this.updateConfig(config);
124
+
59
125
  this.#txs = store.openMap('txs');
60
126
  this.#minedTxHashToBlock = store.openMap('txHashToBlockMined');
61
127
  this.#pendingTxPriorityToHash = store.openMultiMap('pendingTxFeeToHash');
128
+ this.#deletedMinedTxHashes = store.openMap('deletedMinedTxHashes');
129
+ this.#blockToDeletedMinedTxHash = store.openMultiMap('blockToDeletedMinedTxHash');
130
+
131
+ this.#pendingTxHashToHistoricalBlockHeaderHash = store.openMap('txHistoricalBlock');
132
+ this.#historicalHeaderToTxHash = store.openMultiMap('historicalHeaderToPendingTxHash');
133
+ this.#feePayerToBalanceEntry = store.openMultiMap('feePayerToBalanceEntry');
134
+ this.#pendingNullifierToTxHash = store.openMap('pendingNullifierToTxHash');
135
+
136
+ this.#nonEvictableTxs = new Set<string>();
62
137
 
63
138
  this.#archivedTxs = archive.openMap('archivedTxs');
64
139
  this.#archivedTxIndices = archive.openMap('archivedTxIndices');
65
- this.#archivedTxLimit = archivedTxLimit;
66
140
 
67
141
  this.#store = store;
68
142
  this.#archive = archive;
69
- this.#log = log;
70
- this.#metrics = new PoolInstrumentation(telemetry, PoolName.TX_POOL, () => store.estimateSize());
143
+
144
+ this.#metrics = new PoolInstrumentation(telemetry, PoolName.TX_POOL, this.countTxs, () => store.estimateSize());
71
145
  }
72
146
 
73
- public markAsMined(txHashes: TxHash[], blockNumber: number): Promise<void> {
147
+ private countTxs: PoolStatsCallback = async () => {
148
+ const [pending = 0, mined = 0] = await Promise.all([this.getPendingTxCount(), this.getMinedTxCount()]);
149
+
150
+ return Promise.resolve({
151
+ itemCount: {
152
+ pending,
153
+ mined,
154
+ },
155
+ });
156
+ };
157
+
158
+ public async isEmpty(): Promise<boolean> {
159
+ for await (const _ of this.#txs.entriesAsync()) {
160
+ return false;
161
+ }
162
+ return true;
163
+ }
164
+
165
+ /**
166
+ * Marks transactions as mined in a block and updates the pool state accordingly.
167
+ * Removes the transactions from the pending set and adds them to the mined set.
168
+ * Also evicts any transactions that become invalid after the block is mined.
169
+ * @param txHashes - Array of transaction hashes that were mined
170
+ * @param blockHeader - The header of the block the transactions were mined in
171
+ */
172
+ public async markAsMined(txHashes: TxHash[], blockHeader: BlockHeader): Promise<void> {
74
173
  if (txHashes.length === 0) {
75
174
  return Promise.resolve();
76
175
  }
77
176
 
78
- let deletedPending = 0;
79
- return this.#store.transactionAsync(async () => {
80
- for (const hash of txHashes) {
81
- const key = hash.toString();
82
- await this.#minedTxHashToBlock.set(key, blockNumber);
177
+ const uniqueMinedNullifiers: Fr[] = [];
178
+ const uniqueMinedFeePayers: AztecAddress[] = [];
83
179
 
84
- const tx = await this.getTxByHash(hash);
85
- if (tx) {
86
- deletedPending++;
87
- const fee = getPendingTxPriority(tx);
88
- await this.#pendingTxPriorityToHash.deleteValue(fee, key);
180
+ try {
181
+ await this.#store.transactionAsync(async () => {
182
+ for (const hash of txHashes) {
183
+ const key = hash.toString();
184
+ await this.#minedTxHashToBlock.set(key, blockHeader.globalVariables.blockNumber);
185
+
186
+ const tx = await this.getTxByHash(hash);
187
+ if (tx) {
188
+ const nullifiers = tx.data.getNonEmptyNullifiers();
189
+
190
+ nullifiers.forEach(nullifier => insertIntoSortedArray(uniqueMinedNullifiers, nullifier, Fr.cmp, false));
191
+ insertIntoSortedArray(
192
+ uniqueMinedFeePayers,
193
+ tx.data.feePayer,
194
+ (a, b) => a.toField().cmp(b.toField()),
195
+ false,
196
+ );
197
+
198
+ await this.removePendingTxIndicesInDbTx(tx, key);
199
+ }
200
+
201
+ // If this tx was previously soft-deleted, remove it from the deleted sets
202
+ if (await this.#deletedMinedTxHashes.hasAsync(key)) {
203
+ const originalBlock = await this.#deletedMinedTxHashes.getAsync(key);
204
+ await this.#deletedMinedTxHashes.delete(key);
205
+ // Remove from block-to-hash mapping
206
+ if (originalBlock !== undefined) {
207
+ await this.#blockToDeletedMinedTxHash.deleteValue(originalBlock, key);
208
+ }
209
+ }
89
210
  }
90
- }
91
- this.#metrics.recordAddedObjects(txHashes.length, 'mined');
92
- this.#metrics.recordRemovedObjects(deletedPending, 'pending');
93
- });
211
+ });
212
+
213
+ await this.#evictionManager.evictAfterNewBlock(blockHeader, uniqueMinedNullifiers, uniqueMinedFeePayers);
214
+
215
+ this.#metrics.transactionsRemoved(txHashes.map(hash => hash.toBigInt()));
216
+ } catch (err) {
217
+ this.#log.warn('Unexpected error when marking txs as mined', { err });
218
+ }
94
219
  }
95
220
 
96
- public markMinedAsPending(txHashes: TxHash[]): Promise<void> {
221
+ public async markMinedAsPending(txHashes: TxHash[], latestBlock: BlockNumber): Promise<void> {
97
222
  if (txHashes.length === 0) {
98
223
  return Promise.resolve();
99
224
  }
225
+ try {
226
+ await this.#store.transactionAsync(async () => {
227
+ for (const hash of txHashes) {
228
+ const key = hash.toString();
229
+ await this.#minedTxHashToBlock.delete(key);
100
230
 
101
- let markedAsPending = 0;
102
- return this.#store.transactionAsync(async () => {
103
- for (const hash of txHashes) {
104
- const key = hash.toString();
105
- await this.#minedTxHashToBlock.delete(key);
231
+ // Clear soft-delete metadata if this tx was previously soft-deleted,
232
+ // so cleanupDeletedMinedTxs won't later hard-delete it while it's pending
233
+ const deletedBlock = await this.#deletedMinedTxHashes.getAsync(key);
234
+ if (deletedBlock !== undefined) {
235
+ await this.#deletedMinedTxHashes.delete(key);
236
+ await this.#blockToDeletedMinedTxHash.deleteValue(deletedBlock, key);
237
+ }
106
238
 
107
- const tx = await this.getTxByHash(hash);
108
- if (tx) {
109
- await this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), key);
110
- markedAsPending++;
239
+ // Rehydrate the tx in the in-memory pending txs mapping
240
+ const tx = await this.getTxByHash(hash);
241
+ if (tx) {
242
+ await this.addPendingTxIndicesInDbTx(tx, key);
243
+ }
111
244
  }
112
- }
245
+ });
113
246
 
114
- this.#metrics.recordAddedObjects(markedAsPending, 'pending');
115
- this.#metrics.recordRemovedObjects(markedAsPending, 'mined');
116
- });
247
+ await this.#evictionManager.evictAfterChainPrune(latestBlock);
248
+ } catch (err) {
249
+ this.#log.warn('Unexpected error when marking mined txs as pending', { err });
250
+ }
117
251
  }
118
252
 
119
253
  public async getPendingTxHashes(): Promise<TxHash[]> {
120
254
  const vals = await toArray(this.#pendingTxPriorityToHash.valuesAsync({ reverse: true }));
121
- return vals.map(x => TxHash.fromString(x));
122
- }
123
-
124
- public async getMinedTxHashes(): Promise<[TxHash, number][]> {
125
- const vals = await toArray(this.#minedTxHashToBlock.entriesAsync());
126
- return vals.map(([txHash, blockNumber]) => [TxHash.fromString(txHash), blockNumber]);
127
- }
128
-
129
- public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | undefined> {
130
- const key = txHash.toString();
131
- const [isMined, isKnown] = await Promise.all([this.#minedTxHashToBlock.hasAsync(key), this.#txs.hasAsync(key)]);
132
-
133
- if (isMined) {
134
- return 'mined';
135
- } else if (isKnown) {
136
- return 'pending';
137
- } else {
138
- return undefined;
139
- }
255
+ return vals.map(TxHash.fromString);
140
256
  }
141
257
 
142
258
  /**
@@ -146,12 +262,21 @@ export class AztecKVTxPool implements TxPool {
146
262
  */
147
263
  public async getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
148
264
  const buffer = await this.#txs.getAsync(txHash.toString());
149
- if (buffer) {
150
- const tx = Tx.fromBuffer(buffer);
151
- tx.setTxHash(txHash);
152
- return tx;
153
- }
154
- return undefined;
265
+ return buffer ? Tx.fromBuffer(buffer) : undefined;
266
+ }
267
+
268
+ async getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
269
+ const txs = await Promise.all(txHashes.map(txHash => this.#txs.getAsync(txHash.toString())));
270
+ return txs.map(buffer => (buffer ? Tx.fromBuffer(buffer) : undefined));
271
+ }
272
+
273
+ async hasTxs(txHashes: TxHash[]): Promise<boolean[]> {
274
+ return await Promise.all(txHashes.map(txHash => this.#txs.hasAsync(txHash.toString())));
275
+ }
276
+
277
+ async hasTx(txHash: TxHash): Promise<boolean> {
278
+ const result = await this.hasTxs([txHash]);
279
+ return result[0];
155
280
  }
156
281
 
157
282
  /**
@@ -161,102 +286,162 @@ export class AztecKVTxPool implements TxPool {
161
286
  */
162
287
  public async getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined> {
163
288
  const buffer = await this.#archivedTxs.getAsync(txHash.toString());
164
- if (buffer) {
165
- const tx = Tx.fromBuffer(buffer);
166
- tx.setTxHash(txHash);
167
- return tx;
168
- }
169
- return undefined;
289
+ return buffer ? Tx.fromBuffer(buffer) : undefined;
170
290
  }
171
291
 
172
292
  /**
173
293
  * Adds a list of transactions to the pool. Duplicates are ignored.
294
+ * Handles nullifier deduplication: if an incoming tx has a nullifier conflict with
295
+ * existing pending txs, it will either replace them (if higher fee) or be rejected.
174
296
  * @param txs - An array of txs to be added to the pool.
175
- * @returns Empty promise.
297
+ * @returns count of added transactions
176
298
  */
177
- public async addTxs(txs: Tx[]): Promise<void> {
178
- const hashesAndStats = await Promise.all(
179
- txs.map(async tx => ({ txHash: await tx.getTxHash(), txStats: await tx.getStats() })),
180
- );
181
- await this.#store.transactionAsync(async () => {
182
- let pendingCount = 0;
183
- await Promise.all(
184
- txs.map(async (tx, i) => {
299
+ public async addTxs(txs: Tx[], opts: { source?: string } = {}): Promise<number> {
300
+ if (txs.length === 0) {
301
+ return Promise.resolve(0);
302
+ }
303
+
304
+ const addedTxs: Tx[] = [];
305
+ const uniqueFeePayers: AztecAddress[] = [];
306
+ const replacedTxHashes: TxHash[] = [];
307
+ const hashesAndStats = txs.map(tx => ({ txHash: tx.getTxHash(), txStats: tx.getStats() }));
308
+ try {
309
+ await this.#store.transactionAsync(async () => {
310
+ for (let i = 0; i < txs.length; i++) {
311
+ const tx = txs[i];
185
312
  const { txHash, txStats } = hashesAndStats[i];
186
- this.#log.verbose(`Adding tx ${txHash.toString()} to pool`, {
313
+ const key = txHash.toString();
314
+ if (await this.#txs.hasAsync(key)) {
315
+ this.#log.debug(`Tx ${key} already exists in the pool`);
316
+ continue;
317
+ }
318
+
319
+ const poolAccess = this.getPreAddPoolAccess();
320
+ const { shouldReject, txHashesToEvict } = await this.#evictionManager.runPreAddRules(tx, poolAccess);
321
+ if (shouldReject) {
322
+ continue;
323
+ }
324
+
325
+ for (const txHashToEvict of txHashesToEvict) {
326
+ const txToDelete = await this.getTxByHash(txHashToEvict);
327
+ if (txToDelete) {
328
+ const evictedKey = txHashToEvict.toString();
329
+ await this.deletePendingTxInDbTx(txToDelete, evictedKey);
330
+ replacedTxHashes.push(txHashToEvict);
331
+ this.#log.verbose(`Evicted tx ${evictedKey} due to higher-fee tx ${key}`);
332
+ }
333
+ }
334
+
335
+ this.#log.verbose(`Adding tx ${key} to pool`, {
187
336
  eventName: 'tx-added-to-pool',
188
337
  ...txStats,
189
338
  } satisfies TxAddedToPoolStats);
190
339
 
191
- const key = txHash.toString();
192
340
  await this.#txs.set(key, tx.toBuffer());
341
+ addedTxs.push(tx);
342
+ insertIntoSortedArray(uniqueFeePayers, tx.data.feePayer, (a, b) => a.toField().cmp(b.toField()), false);
343
+
344
+ await this.#pendingTxHashToHistoricalBlockHeaderHash.set(
345
+ key,
346
+ (await tx.data.constants.anchorBlockHeader.hash()).toString(),
347
+ );
193
348
 
194
349
  if (!(await this.#minedTxHashToBlock.hasAsync(key))) {
195
- pendingCount++;
196
- // REFACTOR: Use an lmdb conditional write to avoid race conditions with this write tx
197
- await this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), key);
350
+ await this.addPendingTxIndicesInDbTx(tx, key);
198
351
  this.#metrics.recordSize(tx);
199
352
  }
200
- }),
353
+ }
354
+ });
355
+
356
+ await this.#evictionManager.evictAfterNewTxs(
357
+ addedTxs.map(({ txHash }) => txHash),
358
+ uniqueFeePayers,
201
359
  );
360
+ } catch (err) {
361
+ this.#log.warn('Unexpected error when adding txs', { err });
362
+ }
202
363
 
203
- this.#metrics.recordAddedObjects(pendingCount, 'pending');
204
- });
364
+ if (replacedTxHashes.length > 0) {
365
+ this.#metrics.transactionsRemoved(replacedTxHashes.map(hash => hash.toBigInt()));
366
+ }
367
+
368
+ if (addedTxs.length > 0) {
369
+ this.#metrics.transactionsAdded(addedTxs);
370
+ this.emit('txs-added', { ...opts, txs: addedTxs });
371
+ }
372
+ return addedTxs.length;
205
373
  }
206
374
 
207
375
  /**
208
376
  * Deletes transactions from the pool. Tx hashes that are not present are ignored.
209
- * @param txHashes - An array of tx hashes to be removed from the tx pool.
377
+ * Mined transactions are soft-deleted with a timestamp, pending transactions are permanently deleted.
378
+ * @param txHashes - An array of tx hashes to be deleted from the tx pool.
210
379
  * @returns Empty promise.
211
380
  */
212
- public deleteTxs(txHashes: TxHash[]): Promise<void> {
213
- let pendingDeleted = 0;
214
- let minedDeleted = 0;
381
+ public deleteTxs(txHashes: TxHash[], opts?: { permanently?: boolean }): Promise<void> {
382
+ if (txHashes.length === 0) {
383
+ return Promise.resolve();
384
+ }
215
385
 
216
386
  const deletedTxs: Tx[] = [];
217
387
  const poolDbTx = this.#store.transactionAsync(async () => {
218
388
  for (const hash of txHashes) {
219
389
  const key = hash.toString();
220
390
  const tx = await this.getTxByHash(hash);
391
+ if (!tx) {
392
+ this.#log.trace(`Skipping deletion of missing tx ${key} from pool`);
393
+ continue;
394
+ }
221
395
 
222
- if (tx) {
223
- const fee = getPendingTxPriority(tx);
224
- await this.#pendingTxPriorityToHash.deleteValue(fee, key);
225
-
226
- const isMined = await this.#minedTxHashToBlock.hasAsync(key);
227
- if (isMined) {
228
- minedDeleted++;
229
- } else {
230
- pendingDeleted++;
231
- }
232
-
233
- if (this.#archivedTxLimit) {
396
+ const minedBlockNumber = await this.#minedTxHashToBlock.getAsync(key);
397
+ const txIsPending = minedBlockNumber === undefined;
398
+ if (txIsPending) {
399
+ await this.deletePendingTxInDbTx(tx, key);
400
+ } else {
401
+ await this.deleteMinedTx(key, minedBlockNumber!, opts?.permanently ?? false);
402
+ const shouldArchiveTx = this.#archivedTxLimit && !opts?.permanently;
403
+ if (shouldArchiveTx) {
234
404
  deletedTxs.push(tx);
235
405
  }
236
-
237
- await this.#txs.delete(key);
238
- await this.#minedTxHashToBlock.delete(key);
239
406
  }
240
407
  }
241
-
242
- this.#metrics.recordRemovedObjects(pendingDeleted, 'pending');
243
- this.#metrics.recordRemovedObjects(minedDeleted, 'mined');
244
408
  });
409
+ this.#metrics.transactionsRemoved(txHashes.map(hash => hash.toBigInt()));
410
+ this.#log.debug(`Deleted ${txHashes.length} txs from pool`, { txHashes });
245
411
 
246
412
  return this.#archivedTxLimit ? poolDbTx.then(() => this.archiveTxs(deletedTxs)) : poolDbTx;
247
413
  }
248
414
 
415
+ private async deleteMinedTx(txHash: `0x${string}`, minedBlockNumber: BlockNumber, permanently: boolean) {
416
+ await this.#minedTxHashToBlock.delete(txHash);
417
+ if (permanently) {
418
+ this.#log.trace(`Deleting mined tx ${txHash} from pool`);
419
+ await this.#txs.delete(txHash);
420
+ return;
421
+ }
422
+
423
+ // Soft-delete mined transactions: remove from mined set but keep in storage
424
+ this.#log.trace(`Soft-deleting mined tx ${txHash} from pool`);
425
+ await this.#deletedMinedTxHashes.set(txHash, minedBlockNumber);
426
+ await this.#blockToDeletedMinedTxHash.set(minedBlockNumber, txHash);
427
+ }
428
+
429
+ // Assumes being called within a DB transaction
430
+ private async deletePendingTxInDbTx(tx: Tx, txHash: `0x${string}`) {
431
+ // We always permanently delete pending transactions
432
+ this.#log.trace(`Deleting pending tx ${txHash} from pool`);
433
+ await this.removePendingTxIndicesInDbTx(tx, txHash);
434
+ await this.#txs.delete(txHash);
435
+ await this.#pendingTxHashToHistoricalBlockHeaderHash.delete(txHash);
436
+ }
437
+
249
438
  /**
250
439
  * Gets all the transactions stored in the pool.
251
440
  * @returns Array of tx objects in the order they were added to the pool.
252
441
  */
253
442
  public async getAllTxs(): Promise<Tx[]> {
254
- const vals = await toArray(this.#txs.entriesAsync());
255
- return vals.map(([hash, buffer]) => {
256
- const tx = Tx.fromBuffer(buffer);
257
- tx.setTxHash(TxHash.fromString(hash));
258
- return tx;
259
- });
443
+ const vals = await toArray(this.#txs.valuesAsync());
444
+ return vals.map(buffer => Tx.fromBuffer(buffer));
260
445
  }
261
446
 
262
447
  /**
@@ -268,42 +453,294 @@ export class AztecKVTxPool implements TxPool {
268
453
  return vals.map(x => TxHash.fromString(x));
269
454
  }
270
455
 
456
+ public async getPendingTxInfos(): Promise<PendingTxInfo[]> {
457
+ const vals = await toArray(this.#pendingTxPriorityToHash.valuesAsync());
458
+ const results = await Promise.all(vals.map(val => this.getPendingTxInfo(TxHash.fromString(val))));
459
+ return results.filter((info): info is PendingTxInfo => info !== undefined);
460
+ }
461
+
462
+ private async getPendingTxInfo(txHash: TxHash): Promise<PendingTxInfo | undefined> {
463
+ let historicalBlockHash = await this.#pendingTxHashToHistoricalBlockHeaderHash.getAsync(txHash.toString());
464
+ // Not all tx might have this index created.
465
+ if (!historicalBlockHash) {
466
+ const tx = await this.getTxByHash(txHash);
467
+ if (!tx) {
468
+ this.#log.warn(`PendingTxInfo:tx ${txHash} not found`);
469
+ return undefined;
470
+ }
471
+
472
+ historicalBlockHash = (await tx.data.constants.anchorBlockHeader.hash()).toString();
473
+ await this.#pendingTxHashToHistoricalBlockHeaderHash.set(txHash.toString(), historicalBlockHash);
474
+ }
475
+
476
+ return {
477
+ txHash,
478
+ blockHash: Fr.fromString(historicalBlockHash),
479
+ isEvictable: !this.#nonEvictableTxs.has(txHash.toString()),
480
+ };
481
+ }
482
+
483
+ public async getPendingTxsReferencingBlocks(blockHashes: Fr[]): Promise<TxBlockReference[]> {
484
+ const result: TxBlockReference[] = [];
485
+ for (const blockHash of blockHashes) {
486
+ const chunk = await toArray(this.#historicalHeaderToTxHash.getValuesAsync(blockHash.toString()));
487
+ result.push(
488
+ ...chunk.map(txHash => ({
489
+ txHash: TxHash.fromString(txHash),
490
+ blockHash,
491
+ isEvictable: !this.#nonEvictableTxs.has(txHash),
492
+ })),
493
+ );
494
+ }
495
+
496
+ return result;
497
+ }
498
+
499
+ public async getPendingFeePayers(): Promise<AztecAddress[]> {
500
+ const feePayers: AztecAddress[] = [];
501
+ for await (const feePayer of this.#feePayerToBalanceEntry.keysAsync()) {
502
+ const address = AztecAddress.fromString(feePayer);
503
+ insertIntoSortedArray(feePayers, address, (a, b) => a.toField().cmp(b.toField()), false);
504
+ }
505
+ return feePayers;
506
+ }
507
+
508
+ public async *getFeePayerTxInfos(feePayer: AztecAddress): AsyncIterable<FeePayerTxInfo> {
509
+ for await (const value of this.#feePayerToBalanceEntry.getValuesAsync(feePayer.toString())) {
510
+ const info = FeePayerTxInfo.decode(value);
511
+ info.isEvictable = !this.#nonEvictableTxs.has(info.txHash.toString());
512
+ yield info;
513
+ }
514
+ }
515
+
516
+ public async getMinedTxHashes(): Promise<[TxHash, BlockNumber][]> {
517
+ const vals = await toArray(this.#minedTxHashToBlock.entriesAsync());
518
+ return vals.map(([txHash, blockNumber]) => [TxHash.fromString(txHash), blockNumber]);
519
+ }
520
+
521
+ public async getPendingTxCount(): Promise<number> {
522
+ return (await this.#pendingTxPriorityToHash.sizeAsync()) ?? 0;
523
+ }
524
+
525
+ public async getMinedTxCount(): Promise<number> {
526
+ return (await this.#minedTxHashToBlock.sizeAsync()) ?? 0;
527
+ }
528
+
529
+ public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
530
+ const key = txHash.toString();
531
+ const [isMined, isKnown, isDeleted] = await Promise.all([
532
+ this.#minedTxHashToBlock.hasAsync(key),
533
+ this.#txs.hasAsync(key),
534
+ this.#deletedMinedTxHashes.hasAsync(key),
535
+ ]);
536
+
537
+ if (isDeleted) {
538
+ return 'deleted';
539
+ } else if (isMined) {
540
+ return 'mined';
541
+ } else if (isKnown) {
542
+ return 'pending';
543
+ } else {
544
+ return undefined;
545
+ }
546
+ }
547
+
548
+ public updateConfig(cfg: TxPoolOptions): void {
549
+ if (typeof cfg.archivedTxLimit === 'number') {
550
+ assert(cfg.archivedTxLimit >= 0, 'archivedTxLimit must be greater or equal to 0');
551
+ this.#archivedTxLimit = cfg.archivedTxLimit;
552
+ }
553
+
554
+ if (this.#evictionManager) {
555
+ this.#evictionManager.updateConfig(cfg);
556
+ }
557
+ }
558
+
559
+ public markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void> {
560
+ txHashes.forEach(txHash => this.#nonEvictableTxs.add(txHash.toString()));
561
+ return Promise.resolve();
562
+ }
563
+
564
+ public clearNonEvictableTxs(): Promise<void> {
565
+ // Clear the non-evictable set after completing the DB updates above.
566
+ // This ensures pinned (non-evictable) txs are protected while we mark mined txs,
567
+ // but they won't remain pinned indefinitely across blocks. Note that eviction rules
568
+ // (including post-mining invalidation) respect the non-evictable flag while it is set.
569
+ this.#nonEvictableTxs.clear();
570
+ return Promise.resolve();
571
+ }
572
+
573
+ /**
574
+ * Permanently deletes deleted mined transactions from blocks up to and including the specified block number.
575
+ * @param blockNumber - Block number threshold. Deleted mined txs from this block or earlier will be permanently deleted.
576
+ * @returns The number of transactions permanently deleted.
577
+ */
578
+ public async cleanupDeletedMinedTxs(blockNumber: BlockNumber): Promise<number> {
579
+ let deletedCount = 0;
580
+ await this.#store.transactionAsync(async () => {
581
+ const txHashesToDelete: string[] = [];
582
+ const blocksToDelete: BlockNumber[] = [];
583
+
584
+ // Iterate through all entries and check block numbers
585
+ for await (const [block, txHash] of this.#blockToDeletedMinedTxHash.entriesAsync()) {
586
+ if (block <= blockNumber) {
587
+ // Permanently delete the transaction
588
+ await this.#txs.delete(txHash);
589
+ await this.#deletedMinedTxHashes.delete(txHash);
590
+ txHashesToDelete.push(txHash);
591
+ if (!blocksToDelete.includes(block)) {
592
+ blocksToDelete.push(block);
593
+ }
594
+ deletedCount++;
595
+ }
596
+ }
597
+ this.#metrics.transactionsRemoved(txHashesToDelete);
598
+
599
+ // Clean up block-to-hash mapping - delete all values for each block
600
+ for (const block of blocksToDelete) {
601
+ const txHashesForBlock = await toArray(this.#blockToDeletedMinedTxHash.getValuesAsync(block));
602
+ for (const txHash of txHashesForBlock) {
603
+ await this.#blockToDeletedMinedTxHash.deleteValue(block, txHash);
604
+ }
605
+ }
606
+ });
607
+
608
+ if (deletedCount > 0) {
609
+ this.#log.debug(`Permanently deleted ${deletedCount} deleted mined txs from blocks up to ${blockNumber}`);
610
+ }
611
+ return deletedCount;
612
+ }
613
+
614
+ /**
615
+ * Creates an ArchiveCache instance.
616
+ * @param db - DB for the cache to use
617
+ * @returns An ArchiveCache instance
618
+ */
619
+ protected createArchiveCache(db: MerkleTreeReadOperations): ArchiveCache {
620
+ return new ArchiveCache(db);
621
+ }
622
+
271
623
  /**
272
624
  * Archives a list of txs for future reference. The number of archived txs is limited by the specified archivedTxLimit.
625
+ * Note: Pending txs should not be archived, only finalized txs
273
626
  * @param txs - The list of transactions to archive.
274
627
  * @returns Empty promise.
275
628
  */
276
629
  private async archiveTxs(txs: Tx[]): Promise<void> {
277
- const txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
278
- await this.#archive.transactionAsync(async () => {
279
- // calcualte the head and tail indices of the archived txs by insertion order.
280
- let headIdx =
281
- ((await this.#archivedTxIndices.entriesAsync({ limit: 1, reverse: true }).next()).value?.[0] ?? -1) + 1;
282
- let tailIdx = (await this.#archivedTxIndices.entriesAsync({ limit: 1 }).next()).value?.[0] ?? 0;
283
-
284
- for (let i = 0; i < txs.length; i++) {
285
- const tx = txs[i];
286
- while (headIdx - tailIdx >= this.#archivedTxLimit) {
287
- const txHash = await this.#archivedTxIndices.getAsync(tailIdx);
288
- if (txHash) {
289
- await this.#archivedTxs.delete(txHash);
290
- await this.#archivedTxIndices.delete(tailIdx);
630
+ if (txs.length === 0) {
631
+ return;
632
+ }
633
+ if (this.#archivedTxLimit === 0) {
634
+ return;
635
+ }
636
+
637
+ try {
638
+ const txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
639
+ await this.#archive.transactionAsync(async () => {
640
+ // calculate the head and tail indices of the archived txs by insertion order.
641
+ let headIdx =
642
+ ((await this.#archivedTxIndices.entriesAsync({ limit: 1, reverse: true }).next()).value?.[0] ?? -1) + 1;
643
+ let tailIdx = (await this.#archivedTxIndices.entriesAsync({ limit: 1 }).next()).value?.[0] ?? 0;
644
+
645
+ for (let i = 0; i < txs.length; i++) {
646
+ const tx = txs[i];
647
+ while (headIdx - tailIdx >= this.#archivedTxLimit) {
648
+ const txHash = await this.#archivedTxIndices.getAsync(tailIdx);
649
+ if (txHash) {
650
+ await this.#archivedTxs.delete(txHash);
651
+ await this.#archivedTxIndices.delete(tailIdx);
652
+ }
653
+ tailIdx++;
291
654
  }
292
- tailIdx++;
655
+
656
+ const archivedTx: Tx = new Tx(
657
+ tx.txHash,
658
+ tx.data,
659
+ ChonkProof.empty(),
660
+ tx.contractClassLogFields,
661
+ tx.publicFunctionCalldata,
662
+ );
663
+ const txHash = txHashes[i].toString();
664
+ await this.#archivedTxs.set(txHash, archivedTx.toBuffer());
665
+ await this.#archivedTxIndices.set(headIdx, txHash);
666
+ headIdx++;
293
667
  }
668
+ this.#log.debug(`Archived ${txs.length} txs`, { txHashes });
669
+ this.#log.debug(`Total archived txs: ${headIdx - tailIdx}`);
670
+ });
671
+ } catch (error) {
672
+ this.#log.error(`Error archiving txs`, { error });
673
+ }
674
+ }
294
675
 
295
- const archivedTx: Tx = new Tx(
296
- tx.data,
297
- ClientIvcProof.empty(),
298
- tx.contractClassLogs,
299
- tx.enqueuedPublicFunctionCalls,
300
- tx.publicTeardownFunctionCall,
301
- );
302
- const txHash = txHashes[i].toString();
303
- await this.#archivedTxs.set(txHash, archivedTx.toBuffer());
304
- await this.#archivedTxIndices.set(headIdx, txHash);
305
- headIdx++;
676
+ // Assumes being called within a DB transaction
677
+ private async addPendingTxIndicesInDbTx(tx: Tx, txHash: string): Promise<void> {
678
+ await this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), txHash);
679
+ await this.#historicalHeaderToTxHash.set((await tx.data.constants.anchorBlockHeader.hash()).toString(), txHash);
680
+ await this.#feePayerToBalanceEntry.set(tx.data.feePayer.toString(), await FeePayerTxInfo.encode(tx, txHash));
681
+
682
+ // Add nullifier entries for conflict detection
683
+ const nullifiers = tx.data.getNonEmptyNullifiers();
684
+ for (const nullifier of nullifiers) {
685
+ await this.#pendingNullifierToTxHash.set(nullifier.toString(), txHash);
686
+ }
687
+ }
688
+
689
+ // Assumes being called within a DB transaction
690
+ private async removePendingTxIndicesInDbTx(tx: Tx, txHash: string): Promise<void> {
691
+ await this.#pendingTxPriorityToHash.deleteValue(getPendingTxPriority(tx), txHash);
692
+ await this.#historicalHeaderToTxHash.deleteValue(
693
+ (await tx.data.constants.anchorBlockHeader.hash()).toString(),
694
+ txHash,
695
+ );
696
+ await this.#feePayerToBalanceEntry.deleteValue(
697
+ tx.data.feePayer.toString(),
698
+ await FeePayerTxInfo.encode(tx, txHash),
699
+ );
700
+
701
+ // Remove nullifier entries
702
+ const nullifiers = tx.data.getNonEmptyNullifiers();
703
+ for (const nullifier of nullifiers) {
704
+ await this.#pendingNullifierToTxHash.delete(nullifier.toString());
705
+ }
706
+ }
707
+
708
+ /**
709
+ * Returns up to `limit` lowest-priority evictable pending tx hashes without hydrating transactions.
710
+ * Iterates the priority index in ascending order and skips non-evictable txs.
711
+ */
712
+ public async getLowestPriorityEvictable(limit: number): Promise<TxHash[]> {
713
+ const txsToEvict: TxHash[] = [];
714
+ if (limit <= 0) {
715
+ return txsToEvict;
716
+ }
717
+
718
+ for await (const txHashStr of this.#pendingTxPriorityToHash.valuesAsync()) {
719
+ if (this.#nonEvictableTxs.has(txHashStr)) {
720
+ continue;
306
721
  }
307
- });
722
+
723
+ txsToEvict.push(TxHash.fromString(txHashStr));
724
+ if (txsToEvict.length >= limit) {
725
+ break;
726
+ }
727
+ }
728
+
729
+ return txsToEvict;
730
+ }
731
+
732
+ /**
733
+ * Creates a PreAddPoolAccess object for use by pre-add eviction rules.
734
+ * Provides read-only access to pool state during addTxs transaction.
735
+ */
736
+ private getPreAddPoolAccess(): PreAddPoolAccess {
737
+ return {
738
+ getTxHashByNullifier: async nullifier => {
739
+ const hashStr = await this.#pendingNullifierToTxHash.getAsync(nullifier.toString());
740
+ return hashStr ? TxHash.fromString(hashStr) : undefined;
741
+ },
742
+ getPendingTxByHash: this.getTxByHash.bind(this),
743
+ getTxPriority: getPendingTxPriority,
744
+ };
308
745
  }
309
746
  }