@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928

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 (483) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +5 -4
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +39 -16
  8. package/dest/client/interface.d.ts +52 -12
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +36 -20
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +142 -81
  13. package/dest/config.d.ts +163 -98
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +130 -20
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +272 -199
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +224 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +9 -4
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +28 -9
  39. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
  40. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
  42. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
  43. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
  45. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
  48. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
  51. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  54. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  55. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
  62. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
  65. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
  66. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  67. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
  68. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  69. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  71. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  72. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  74. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
  75. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
  77. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +41 -9
  78. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
  81. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +55 -41
  86. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +19 -4
  87. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +86 -32
  89. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
  90. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  91. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +262 -131
  92. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  93. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  94. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  95. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  96. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  97. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  98. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -5
  99. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  100. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
  101. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -5
  102. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  103. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
  104. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +35 -10
  105. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  106. package/dest/msg_validators/proposal_validator/proposal_validator.js +128 -56
  107. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  108. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  110. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  111. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  112. package/dest/msg_validators/tx_validator/allowed_public_setup.js +21 -32
  113. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  114. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  116. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  117. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  118. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  119. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  120. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  121. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  122. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  123. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  124. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  125. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  126. package/dest/msg_validators/tx_validator/factory.d.ts +25 -7
  127. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  128. package/dest/msg_validators/tx_validator/factory.js +55 -16
  129. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  130. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  131. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  132. package/dest/msg_validators/tx_validator/gas_validator.d.ts +53 -7
  133. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  135. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  136. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/index.js +3 -0
  138. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  139. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  141. package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
  142. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
  144. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  145. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  147. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  148. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  149. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  150. package/dest/services/data_store.d.ts +1 -1
  151. package/dest/services/data_store.d.ts.map +1 -1
  152. package/dest/services/data_store.js +5 -5
  153. package/dest/services/discv5/discV5_service.d.ts +13 -2
  154. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  155. package/dest/services/discv5/discV5_service.js +119 -23
  156. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  157. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  158. package/dest/services/discv5/persisted_enr_store.js +145 -0
  159. package/dest/services/dummy_service.d.ts +18 -16
  160. package/dest/services/dummy_service.d.ts.map +1 -1
  161. package/dest/services/dummy_service.js +21 -16
  162. package/dest/services/encoding.d.ts +23 -6
  163. package/dest/services/encoding.d.ts.map +1 -1
  164. package/dest/services/encoding.js +32 -16
  165. package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
  166. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  167. package/dest/services/gossipsub/topic_score_params.js +4 -14
  168. package/dest/services/libp2p/instrumentation.d.ts +6 -1
  169. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  170. package/dest/services/libp2p/instrumentation.js +21 -0
  171. package/dest/services/libp2p/libp2p_service.d.ts +51 -51
  172. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  173. package/dest/services/libp2p/libp2p_service.js +499 -333
  174. package/dest/services/peer-manager/peer_manager.d.ts +31 -3
  175. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  176. package/dest/services/peer-manager/peer_manager.js +125 -25
  177. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  178. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  179. package/dest/services/peer-manager/peer_scoring.js +102 -13
  180. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
  181. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  182. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +81 -86
  183. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  184. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  185. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  186. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  187. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  188. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  189. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  190. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  191. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  192. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  193. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  194. package/dest/services/reqresp/config.d.ts +15 -3
  195. package/dest/services/reqresp/config.d.ts.map +1 -1
  196. package/dest/services/reqresp/config.js +11 -0
  197. package/dest/services/reqresp/interface.d.ts +16 -18
  198. package/dest/services/reqresp/interface.d.ts.map +1 -1
  199. package/dest/services/reqresp/interface.js +10 -20
  200. package/dest/services/reqresp/metrics.d.ts +1 -1
  201. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  202. package/dest/services/reqresp/metrics.js +0 -1
  203. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  204. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  205. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  206. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  207. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  208. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  209. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
  210. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  211. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
  212. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  213. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  214. package/dest/services/reqresp/protocols/index.js +0 -1
  215. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  216. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  217. package/dest/services/reqresp/protocols/tx.js +1 -3
  218. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  219. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  220. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  221. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  222. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  223. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  224. package/dest/services/reqresp/reqresp.d.ts +7 -29
  225. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  226. package/dest/services/reqresp/reqresp.js +73 -215
  227. package/dest/services/service.d.ts +43 -18
  228. package/dest/services/service.d.ts.map +1 -1
  229. package/dest/services/tx_collection/config.d.ts +2 -23
  230. package/dest/services/tx_collection/config.d.ts.map +1 -1
  231. package/dest/services/tx_collection/config.js +2 -55
  232. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  233. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  234. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  235. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  236. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  237. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  238. package/dest/services/tx_collection/index.d.ts +2 -3
  239. package/dest/services/tx_collection/index.d.ts.map +1 -1
  240. package/dest/services/tx_collection/index.js +0 -1
  241. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  242. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  243. package/dest/services/tx_collection/instrumentation.js +0 -2
  244. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  245. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  246. package/dest/services/tx_collection/request_tracker.js +84 -0
  247. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  248. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  249. package/dest/services/tx_collection/tx_collection.js +275 -119
  250. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  251. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  252. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  253. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  254. package/dest/services/tx_collection/tx_source.js +13 -8
  255. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  256. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  257. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  258. package/dest/services/tx_provider.d.ts +3 -1
  259. package/dest/services/tx_provider.d.ts.map +1 -1
  260. package/dest/services/tx_provider.js +3 -0
  261. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  262. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  263. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  264. package/dest/test-helpers/mock-pubsub.d.ts +33 -9
  265. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  266. package/dest/test-helpers/mock-pubsub.js +57 -44
  267. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  268. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  269. package/dest/test-helpers/reqresp-nodes.js +16 -18
  270. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  271. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  272. package/dest/test-helpers/test_tx_provider.js +3 -0
  273. package/dest/test-helpers/testbench-utils.d.ts +15 -14
  274. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  275. package/dest/test-helpers/testbench-utils.js +49 -15
  276. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  277. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  278. package/dest/testbench/p2p_client_testbench_worker.js +104 -41
  279. package/dest/testbench/worker_client_manager.d.ts +12 -6
  280. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  281. package/dest/testbench/worker_client_manager.js +57 -11
  282. package/dest/util.d.ts +12 -7
  283. package/dest/util.d.ts.map +1 -1
  284. package/dest/util.js +35 -14
  285. package/dest/versioning.d.ts +3 -6
  286. package/dest/versioning.d.ts.map +1 -1
  287. package/dest/versioning.js +3 -24
  288. package/package.json +17 -17
  289. package/src/bootstrap/bootstrap.ts +17 -3
  290. package/src/client/factory.ts +62 -9
  291. package/src/client/interface.ts +48 -18
  292. package/src/client/p2p_client.ts +159 -113
  293. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  294. package/src/config.ts +233 -20
  295. package/src/errors/p2p-service.error.ts +11 -0
  296. package/src/errors/reqresp.error.ts +13 -19
  297. package/src/index.ts +0 -1
  298. package/src/mem_pools/attestation_pool/attestation_pool.ts +327 -242
  299. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
  300. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  301. package/src/mem_pools/index.ts +0 -3
  302. package/src/mem_pools/instrumentation.ts +18 -12
  303. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  304. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
  305. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
  306. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -5
  307. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
  308. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  309. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  310. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  311. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
  312. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
  313. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
  314. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  315. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  316. package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
  317. package/src/mem_pools/tx_pool_v2/interfaces.ts +40 -8
  318. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
  319. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
  320. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +107 -32
  321. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +291 -137
  322. package/src/msg_validators/attestation_validator/README.md +49 -0
  323. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  324. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  325. package/src/msg_validators/proposal_validator/README.md +123 -0
  326. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  327. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  328. package/src/msg_validators/proposal_validator/proposal_validator.ts +150 -58
  329. package/src/msg_validators/tx_validator/README.md +17 -3
  330. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  331. package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
  332. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  333. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  334. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  335. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  336. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  337. package/src/msg_validators/tx_validator/factory.ts +66 -9
  338. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  339. package/src/msg_validators/tx_validator/gas_validator.ts +117 -39
  340. package/src/msg_validators/tx_validator/index.ts +3 -0
  341. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  342. package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
  343. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  344. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  345. package/src/services/data_store.ts +5 -13
  346. package/src/services/discv5/discV5_service.ts +126 -14
  347. package/src/services/discv5/persisted_enr_store.ts +158 -0
  348. package/src/services/dummy_service.ts +26 -40
  349. package/src/services/encoding.ts +35 -19
  350. package/src/services/gossipsub/README.md +33 -11
  351. package/src/services/gossipsub/topic_score_params.ts +9 -18
  352. package/src/services/libp2p/instrumentation.ts +22 -0
  353. package/src/services/libp2p/libp2p_service.ts +560 -369
  354. package/src/services/peer-manager/peer_manager.ts +138 -24
  355. package/src/services/peer-manager/peer_scoring.ts +102 -8
  356. package/src/services/reqresp/README.md +194 -0
  357. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  358. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
  359. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  360. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  361. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  362. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  363. package/src/services/reqresp/config.ts +19 -2
  364. package/src/services/reqresp/interface.ts +21 -47
  365. package/src/services/reqresp/metrics.ts +0 -1
  366. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  367. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
  368. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
  369. package/src/services/reqresp/protocols/index.ts +0 -1
  370. package/src/services/reqresp/protocols/tx.ts +1 -3
  371. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  372. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  373. package/src/services/reqresp/reqresp.ts +84 -259
  374. package/src/services/service.ts +51 -35
  375. package/src/services/tx_collection/config.ts +3 -80
  376. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  377. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  378. package/src/services/tx_collection/index.ts +1 -6
  379. package/src/services/tx_collection/instrumentation.ts +1 -7
  380. package/src/services/tx_collection/request_tracker.ts +127 -0
  381. package/src/services/tx_collection/tx_collection.ts +331 -176
  382. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  383. package/src/services/tx_collection/tx_source.ts +10 -8
  384. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  385. package/src/services/tx_provider.ts +5 -0
  386. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  387. package/src/test-helpers/mock-pubsub.ts +61 -60
  388. package/src/test-helpers/reqresp-nodes.ts +13 -23
  389. package/src/test-helpers/test_tx_provider.ts +5 -0
  390. package/src/test-helpers/testbench-utils.ts +63 -28
  391. package/src/testbench/p2p_client_testbench_worker.ts +111 -57
  392. package/src/testbench/worker_client_manager.ts +72 -25
  393. package/src/util.ts +33 -18
  394. package/src/versioning.ts +3 -33
  395. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  396. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  397. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  398. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  399. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  400. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  401. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  402. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  403. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  404. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  405. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  406. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  407. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  408. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  409. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  410. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  411. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  412. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  413. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  414. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  415. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  416. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  417. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  418. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  419. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  420. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  421. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  422. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  423. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  424. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  425. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  426. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  427. package/dest/mem_pools/tx_pool/index.js +0 -2
  428. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  429. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  430. package/dest/mem_pools/tx_pool/priority.js +0 -15
  431. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  432. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  433. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  434. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  435. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  436. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  437. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  438. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  439. package/dest/msg_validators/clock_tolerance.js +0 -37
  440. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
  441. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  442. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
  443. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  444. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  445. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  446. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  447. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  448. package/dest/services/reqresp/protocols/block.js +0 -32
  449. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  450. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  451. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  452. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  453. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  454. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  455. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  456. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  457. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  458. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  459. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  460. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  461. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  462. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  463. package/src/mem_pools/tx_pool/README.md +0 -270
  464. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  465. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  466. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  467. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  468. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  469. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  470. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  471. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  472. package/src/mem_pools/tx_pool/index.ts +0 -2
  473. package/src/mem_pools/tx_pool/priority.ts +0 -20
  474. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  475. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  476. package/src/msg_validators/clock_tolerance.ts +0 -51
  477. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
  478. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  479. package/src/services/reqresp/protocols/block.ts +0 -37
  480. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  481. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  482. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  483. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,4 +1,5 @@
1
1
  import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { FifoSet } from '@aztec/foundation/fifo-set';
2
3
  import type { Logger } from '@aztec/foundation/log';
3
4
  import type { DateProvider } from '@aztec/foundation/timer';
4
5
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
@@ -17,6 +18,7 @@ import {
17
18
  EvictionManager,
18
19
  FeePayerBalanceEvictionRule,
19
20
  FeePayerBalancePreAddRule,
21
+ InsufficientFeePerGasEvictionRule,
20
22
  InvalidTxsAfterMiningRule,
21
23
  InvalidTxsAfterReorgRule,
22
24
  LowPriorityEvictionRule,
@@ -39,13 +41,29 @@ import {
39
41
  import { type TxMetaData, type TxState, buildTxMetaData, checkNullifierConflict } from './tx_metadata.js';
40
42
  import { TxPoolIndices } from './tx_pool_indices.js';
41
43
 
44
+ /**
45
+ * Maximum number of finalized txs to archive or hard-delete per serial-queue item. Bounds both
46
+ * peak memory (~23k txs/epoch at 10 TPS would otherwise OOM the node) and, more importantly, how
47
+ * long finalization occupies the pool's serial queue per item: gossip tx validation waits on that
48
+ * queue, so each item must stay well under the gossipsub mcache eviction window.
49
+ */
50
+ export const FINALIZE_BLOCK_CHUNK_SIZE = 16;
51
+
42
52
  /**
43
53
  * Callbacks for the implementation to notify the outer class about events and metrics.
44
54
  */
55
+ /** A tx that has just transitioned to mined, with the time it spent in the pool. */
56
+ export interface MinedTxInfo {
57
+ txHash: string;
58
+ /** Wall-clock ms from receipt into the pool to being marked mined. Undefined when the
59
+ * receive time is unknown (e.g. a tx hydrated from the DB on restart, receivedAt === 0). */
60
+ minedDelayMs?: number;
61
+ }
62
+
45
63
  export interface TxPoolV2Callbacks {
46
64
  onTxsAdded: (txs: Tx[], opts: { source?: string }) => void;
47
65
  onTxsRemoved: (txHashes: string[] | bigint[]) => void;
48
- onTxsMined: (txHashes: string[]) => void;
66
+ onTxsMined: (minedTxs: MinedTxInfo[]) => void;
49
67
  }
50
68
 
51
69
  /**
@@ -56,12 +74,16 @@ export interface TxPoolV2Callbacks {
56
74
  export class TxPoolV2Impl {
57
75
  // === Persistence ===
58
76
  #store: AztecAsyncKVStore;
77
+ /** Tx data without its proof. Proofs live in #proofsDB so a tx can be read without loading its proof. */
59
78
  #txsDB: AztecAsyncMap<string, Buffer>;
79
+ /** Tx proofs, keyed by tx hash. Written and deleted in lockstep with #txsDB. */
80
+ #proofsDB: AztecAsyncMap<string, Buffer>;
60
81
 
61
82
  // === Dependencies ===
62
83
  #l2BlockSource: L2BlockSource;
63
84
  #worldStateSynchronizer: WorldStateSynchronizer;
64
85
  #createTxValidator: TxPoolV2Dependencies['createTxValidator'];
86
+ #checkAllowedSetupCalls: TxPoolV2Dependencies['checkAllowedSetupCalls'];
65
87
 
66
88
  // === In-Memory Indices ===
67
89
  #indices: TxPoolIndices = new TxPoolIndices();
@@ -73,7 +95,7 @@ export class TxPoolV2Impl {
73
95
  #evictionManager: EvictionManager;
74
96
  #dateProvider: DateProvider;
75
97
  #instrumentation: TxPoolV2Instrumentation;
76
- #evictedTxHashes: Set<string> = new Set();
98
+ #evictedTxHashes: FifoSet<string>;
77
99
  #log: Logger;
78
100
  #callbacks: TxPoolV2Callbacks;
79
101
 
@@ -89,14 +111,17 @@ export class TxPoolV2Impl {
89
111
  ) {
90
112
  this.#store = store;
91
113
  this.#txsDB = store.openMap('txs');
114
+ this.#proofsDB = store.openMap('tx_proofs');
92
115
 
93
116
  this.#l2BlockSource = deps.l2BlockSource;
94
117
  this.#worldStateSynchronizer = deps.worldStateSynchronizer;
95
118
  this.#createTxValidator = deps.createTxValidator;
119
+ this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
96
120
 
97
121
  this.#config = { ...DEFAULT_TX_POOL_V2_CONFIG, ...config };
122
+ this.#evictedTxHashes = FifoSet.withLimit<string>(this.#config.evictedTxCacheSize);
98
123
  this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
99
- this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
124
+ this.#deletedPool = new DeletedPool(store, txHashStr => this.#deleteTxData(txHashStr), log);
100
125
  this.#dateProvider = dateProvider;
101
126
  this.#instrumentation = new TxPoolV2Instrumentation(telemetry, () => this.#indices.getTotalMetadataBytes());
102
127
  this.#log = log;
@@ -114,6 +139,7 @@ export class TxPoolV2Impl {
114
139
 
115
140
  // Post-event eviction rules (run after events to check ALL pending txs)
116
141
  this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
142
+ this.#evictionManager.registerRule(new InsufficientFeePerGasEvictionRule(deps.blockMinFeesProvider));
117
143
  this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(deps.worldStateSynchronizer));
118
144
  this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(deps.worldStateSynchronizer));
119
145
  // LowPriorityEvictionRule handles cases where txs become pending via prepareForSlot (unprotect)
@@ -136,46 +162,74 @@ export class TxPoolV2Impl {
136
162
  // Step 0: Hydrate deleted pool state
137
163
  await this.#deletedPool.hydrateFromDatabase();
138
164
 
139
- // Step 1: Load all transactions from DB (excluding soft-deleted)
140
- const { loaded, errors: deserializationErrors } = await this.#loadAllTxsFromDb();
165
+ // Step 1: Stream txs from DB, building metadata and mined status one at a time.
166
+ const minedMetas: TxMetaData[] = [];
167
+ const pendingMetas: TxMetaData[] = [];
168
+ const deserializationErrors: string[] = [];
169
+
170
+ for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()) {
171
+ // Skip soft-deleted transactions - they stay in DB but not in indices
172
+ if (this.#deletedPool.isSoftDeleted(txHashStr)) {
173
+ continue;
174
+ }
175
+
176
+ let meta: TxMetaData;
177
+ let txEffect: Awaited<ReturnType<L2BlockSource['getTxEffect']>>;
178
+ try {
179
+ const tx = Tx.fromBuffer(buffer);
180
+ // Resolve allowed-setup-calls and the tx effect concurrently
181
+ // getTxEffect failures are non-fatal (we just treat the tx as not-yet-mined), so
182
+ // its rejection is swallowed before the Promise.all so it can't fail-fast the batch.
183
+ const txEffectPromise = this.#l2BlockSource.getTxEffect(tx.getTxHash()).catch(err => {
184
+ this.#log.warn(`Failed to check mined status for tx ${txHashStr}`, { err });
185
+ return undefined;
186
+ });
187
+ const [allowedSetupCalls, fetchedTxEffect] = await Promise.all([
188
+ this.#checkAllowedSetupCalls(tx),
189
+ txEffectPromise,
190
+ ]);
191
+ meta = await buildTxMetaData(tx, allowedSetupCalls);
192
+ txEffect = fetchedTxEffect;
193
+ } catch (err) {
194
+ this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
195
+ deserializationErrors.push(txHashStr);
196
+ continue;
197
+ }
141
198
 
142
- // Step 2: Check mined status for each tx
143
- await this.#markMinedStatusBatch(loaded.map(l => l.meta));
199
+ if (txEffect) {
200
+ meta.minedL2BlockId = {
201
+ number: txEffect.l2BlockNumber,
202
+ hash: txEffect.l2BlockHash.toString(),
203
+ };
204
+ }
144
205
 
145
- // Step 3: Partition by mined status
146
- const mined: TxMetaData[] = [];
147
- const nonMined: { tx: Tx; meta: TxMetaData }[] = [];
148
- for (const entry of loaded) {
149
- if (entry.meta.minedL2BlockId !== undefined) {
150
- mined.push(entry.meta);
206
+ if (meta.minedL2BlockId !== undefined) {
207
+ minedMetas.push(meta);
151
208
  } else {
152
- nonMined.push(entry);
209
+ pendingMetas.push(meta);
153
210
  }
154
211
  }
155
212
 
156
- // Step 4: Validate non-mined transactions
157
- const { valid, invalid } = await this.#revalidateMetadata(
158
- nonMined.map(e => e.meta),
159
- 'on startup',
160
- );
213
+ // Step 2: Validate non-mined transactions
214
+ const { valid, invalid } = await this.#revalidateMetadata(pendingMetas, 'on startup');
161
215
 
162
- // Step 5: Populate mined indices (these don't need conflict resolution)
163
- for (const meta of mined) {
216
+ // Step 3: Populate mined indices (these don't need conflict resolution)
217
+ for (const meta of minedMetas) {
164
218
  this.#indices.addMined(meta);
165
219
  }
166
220
 
167
- // Step 6: Rebuild pending pool by running pre-add rules for each tx
221
+ // Step 4: Rebuild pending pool by running pre-add rules for each tx
168
222
  // This resolves nullifier conflicts, fee payer balance issues, and pool size limits
169
223
  const { rejected } = await this.#rebuildPendingPool(valid);
170
224
 
171
- // Step 7: Delete invalid and rejected txs from DB only (indices were never populated for these)
225
+ // Step 5: Delete invalid and rejected txs from DB only (indices were never populated for these)
172
226
  const toDelete = [...deserializationErrors, ...invalid, ...rejected];
173
227
  if (toDelete.length === 0) {
174
228
  return;
175
229
  }
176
230
  await this.#store.transactionAsync(async () => {
177
231
  for (const txHashStr of toDelete) {
178
- await this.#txsDB.delete(txHashStr);
232
+ await this.#deleteTxData(txHashStr);
179
233
  }
180
234
  });
181
235
  this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup`, { txHashes: toDelete });
@@ -214,7 +268,9 @@ export class TxPoolV2Impl {
214
268
  // in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
215
269
  const poolAccess = this.#createPreAddPoolAccess();
216
270
  const preAddContext: PreAddContext | undefined =
217
- opts.feeComparisonOnly !== undefined ? { feeComparisonOnly: opts.feeComparisonOnly } : undefined;
271
+ opts.feeComparisonOnly !== undefined
272
+ ? { feeComparisonOnly: opts.feeComparisonOnly, priceBumpPercentage: this.#config.priceBumpPercentage }
273
+ : undefined;
218
274
 
219
275
  await this.#store.transactionAsync(async () => {
220
276
  for (const tx of txs) {
@@ -352,6 +408,7 @@ export class TxPoolV2Impl {
352
408
 
353
409
  // Check if already in pool
354
410
  if (this.#indices.has(txHashStr)) {
411
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
355
412
  return 'ignored';
356
413
  }
357
414
 
@@ -360,26 +417,37 @@ export class TxPoolV2Impl {
360
417
  const poolAccess = this.#createPreAddPoolAccess();
361
418
  const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
362
419
 
363
- return preAddResult.shouldIgnore ? 'ignored' : 'accepted';
420
+ if (preAddResult.shouldIgnore) {
421
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
422
+ reason: preAddResult.reason?.message ?? 'no reason provided',
423
+ });
424
+ return 'ignored';
425
+ }
426
+ return 'accepted';
364
427
  }
365
428
 
366
429
  async addProtectedTxs(txs: Tx[], block: BlockHeader, opts: { source?: string }): Promise<void> {
367
430
  const slotNumber = block.globalVariables.slotNumber;
368
431
 
432
+ // Precompute setup-call allow-list flags outside the store transaction
433
+ const allowedFlags = await Promise.all(txs.map(tx => this.#checkAllowedSetupCalls(tx)));
434
+
369
435
  await this.#store.transactionAsync(async () => {
370
- for (const tx of txs) {
436
+ for (let i = 0; i < txs.length; i++) {
437
+ const tx = txs[i];
371
438
  const txHash = tx.getTxHash();
372
439
  const txHashStr = txHash.toString();
373
440
  const isNew = !this.#indices.has(txHashStr);
374
441
  const minedBlockId = await this.#getMinedBlockId(txHash);
375
442
 
376
443
  if (isNew) {
444
+ const meta = await buildTxMetaData(tx, allowedFlags[i]);
377
445
  // New tx - add as mined or protected (callback emitted by #addTx)
378
446
  if (minedBlockId) {
379
- await this.#addTx(tx, { mined: minedBlockId }, opts);
447
+ await this.#addTx(tx, { mined: minedBlockId }, opts, meta);
380
448
  this.#indices.setProtection(txHashStr, slotNumber);
381
449
  } else {
382
- await this.#addTx(tx, { protected: slotNumber }, opts);
450
+ await this.#addTx(tx, { protected: slotNumber }, opts, meta);
383
451
  }
384
452
  } else {
385
453
  // Existing tx - update protection and mined status
@@ -407,10 +475,11 @@ export class TxPoolV2Impl {
407
475
  // Update protection for existing tx
408
476
  this.#indices.updateProtection(txHashStr, slotNumber);
409
477
  } else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
410
- // Resurrect soft-deleted tx as protected
478
+ // Resurrect soft-deleted tx as protected. Load the proof too: #addTx rewrites both entries, so re-adding
479
+ // a proofless tx would wipe the stored proof.
411
480
  const buffer = await this.#txsDB.getAsync(txHashStr);
412
481
  if (buffer) {
413
- const tx = Tx.fromBuffer(buffer);
482
+ const tx = await this.#loadTxWithProof(txHashStr, buffer);
414
483
  await this.#addTx(tx, { protected: slotNumber });
415
484
  softDeletedHits++;
416
485
  } else {
@@ -500,7 +569,15 @@ export class TxPoolV2Impl {
500
569
  });
501
570
 
502
571
  if (found.length > 0) {
503
- this.#callbacks.onTxsMined(found.map(m => m.txHash));
572
+ // receivedAt is 0 for txs hydrated from the DB on restart (true receive time lost) — leave
573
+ // their delay undefined so the metric isn't polluted by epoch-sized values.
574
+ const now = this.#dateProvider.now();
575
+ this.#callbacks.onTxsMined(
576
+ found.map(m => ({
577
+ txHash: m.txHash,
578
+ minedDelayMs: m.receivedAt > 0 ? now - m.receivedAt : undefined,
579
+ })),
580
+ );
504
581
  }
505
582
 
506
583
  this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
@@ -525,29 +602,62 @@ export class TxPoolV2Impl {
525
602
  }
526
603
 
527
604
  this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
605
+ await this.#restoreUnprotectedToPending(txsToRestore, 'during prepareForSlot');
606
+ });
607
+ }
528
608
 
529
- // Step 4: Validate for pending pool
530
- const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
609
+ async unprotectTxs(txHashes: TxHash[], slotNumber: SlotNumber): Promise<void> {
610
+ const hashStrs = txHashes.map(h => h.toString());
531
611
 
532
- // Step 5: Resolve nullifier conflicts and add winners to pending indices
533
- const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
612
+ await this.#store.transactionAsync(async () => {
613
+ // Only release entries still recorded at this exact slot. A tx that another, still-live proposal
614
+ // raised to a higher slot via updateProtection must keep that protection. Mined txs have no
615
+ // protection entry and so are never matched here.
616
+ const matching = this.#indices.findProtectedTxsAtSlot(hashStrs, slotNumber);
617
+ if (matching.length === 0) {
618
+ this.#log.debug(`Unprotecting txs for slot ${slotNumber}: no matching protections to release`);
619
+ return;
620
+ }
534
621
 
535
- // Step 6: Delete invalid txs and evict conflict losers
536
- await this.#deleteTxsBatch(invalid);
537
- await this.#evictTxs(toEvict, 'NullifierConflict');
622
+ this.#indices.clearProtection(matching);
538
623
 
539
- // Step 7: Run eviction rules (enforce pool size limit)
540
- if (added.length > 0) {
541
- const feePayers = added.map(meta => meta.feePayer);
542
- const uniqueFeePayers = new Set<string>(feePayers);
543
- await this.#evictionManager.evictAfterNewTxs(
544
- added.map(m => m.txHash),
545
- [...uniqueFeePayers],
546
- );
624
+ const txsToRestore = this.#indices.filterRestorable(matching);
625
+ if (txsToRestore.length === 0) {
626
+ return;
547
627
  }
628
+
629
+ this.#log.info(`Unprotecting ${txsToRestore.length} txs from failed proposal at slot ${slotNumber}`);
630
+ await this.#restoreUnprotectedToPending(txsToRestore, 'during unprotectTxs');
548
631
  });
549
632
  }
550
633
 
634
+ /**
635
+ * Returns just-unprotected txs to the pending pool: revalidates them, resolves nullifier
636
+ * conflicts, deletes losers, then enforces the pool size limit. Must run inside a store
637
+ * transaction; callers clear the protection entries before invoking.
638
+ */
639
+ async #restoreUnprotectedToPending(txsToRestore: TxMetaData[], context: string): Promise<void> {
640
+ // Step 1: Validate for pending pool
641
+ const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, context);
642
+
643
+ // Step 2: Resolve nullifier conflicts and add winners to pending indices
644
+ const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
645
+
646
+ // Step 3: Delete invalid txs and evict conflict losers
647
+ await this.#deleteTxsBatch(invalid);
648
+ await this.#evictTxs(toEvict, 'NullifierConflict');
649
+
650
+ // Step 4: Run eviction rules (enforce pool size limit)
651
+ if (added.length > 0) {
652
+ const feePayers = added.map(meta => meta.feePayer);
653
+ const uniqueFeePayers = new Set<string>(feePayers);
654
+ await this.#evictionManager.evictAfterNewTxs(
655
+ added.map(m => m.txHash),
656
+ [...uniqueFeePayers],
657
+ );
658
+ }
659
+ }
660
+
551
661
  async handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void> {
552
662
  // Step 1: Find transactions mined after the prune point
553
663
  const txsToUnmine = this.#indices.findTxsMinedAfter(latestBlock.number);
@@ -616,59 +726,142 @@ export class TxPoolV2Impl {
616
726
  this.#log.info(`Deleted ${txHashes.length} failed txs`, { txHashes: txHashes.map(h => h.toString()) });
617
727
  }
618
728
 
619
- async handleFinalizedBlock(block: BlockHeader): Promise<void> {
620
- const blockNumber = block.globalVariables.blockNumber;
621
-
622
- // Step 1: Find mined txs at or before finalized block
623
- const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
729
+ /**
730
+ * Resolves what a finalized block event should process: the cutoff block and the mined txs at or
731
+ * before it. The wrapper feeds the result to archiveFinalizedTxs / finalizeTxs in chunks, each as
732
+ * its own serial-queue item, so gossip-driven pool operations can interleave with finalization
733
+ * instead of stalling behind an entire epoch's worth of tx processing.
734
+ */
735
+ async prepareFinalization(block: BlockHeader): Promise<{ cutoffBlock: BlockNumber; txHashes: string[] }> {
736
+ // Hold finalized txs for a configurable margin behind the finalized tip so a prover still
737
+ // proving an epoch with already-finalized blocks isn't starved of its txs. 0 deletes at the finalized tip.
738
+ const cutoffBlock = await this.#finalizationCutoffBlock(block);
739
+ return { cutoffBlock, txHashes: this.#indices.findTxsMinedAtOrBefore(cutoffBlock) };
740
+ }
624
741
 
625
- await this.#store.transactionAsync(async () => {
626
- // Step 2: Collect mined txs for archiving (before deletion)
627
- const txsToArchive: Tx[] = [];
628
- if (this.#archive.isEnabled()) {
629
- for (const txHashStr of minedTxsToFinalize) {
630
- const buffer = await this.#txsDB.getAsync(txHashStr);
631
- if (buffer) {
632
- txsToArchive.push(Tx.fromBuffer(buffer));
633
- }
634
- }
742
+ /**
743
+ * Copies the given finalized txs into the archive. The pool stores txs proof-stripped, which is
744
+ * exactly the archive format, so buffers are copied as-is without deserialization.
745
+ */
746
+ async archiveFinalizedTxs(txHashes: string[]): Promise<void> {
747
+ if (!this.#archive.isEnabled()) {
748
+ return;
749
+ }
750
+ const entries: { txHash: string; buffer: Buffer }[] = [];
751
+ for (const txHash of txHashes) {
752
+ const buffer = await this.#txsDB.getAsync(txHash);
753
+ if (buffer) {
754
+ entries.push({ txHash, buffer });
635
755
  }
756
+ }
757
+ await this.#archive.archiveTxBuffers(entries);
758
+ }
636
759
 
637
- // Step 3: Delete mined txs from active pool
638
- await this.#deleteTxsBatch(minedTxsToFinalize);
639
-
640
- // Step 4: Finalize soft-deleted txs
641
- await this.#deletedPool.finalizeBlock(blockNumber);
760
+ /**
761
+ * Deletes a batch of finalized mined txs from the active pool. Callers may invoke this in
762
+ * chunks: a crash between chunks leaves some finalized txs mined, and the next finalized-block
763
+ * event lists and deletes them again (the operation is idempotent), so per-chunk atomicity is
764
+ * sufficient. Since other pool operations may interleave between the finalization plan being
765
+ * computed and this call, each tx is re-checked to still be mined at or before the cutoff.
766
+ */
767
+ async deleteFinalizedTxs(txHashes: string[], cutoffBlock: BlockNumber): Promise<void> {
768
+ const stillFinalized = txHashes.filter(txHash => {
769
+ const minedBlock = this.#indices.getMetadata(txHash)?.minedL2BlockId?.number;
770
+ return minedBlock !== undefined && minedBlock <= cutoffBlock;
771
+ });
772
+ if (stillFinalized.length === 0) {
773
+ return;
774
+ }
775
+ await this.#store.transactionAsync(async () => {
776
+ await this.#deleteTxsBatch(stillFinalized);
777
+ });
778
+ }
642
779
 
643
- // Step 5: Archive mined txs
644
- if (txsToArchive.length > 0) {
645
- await this.#archive.archiveTxs(txsToArchive);
646
- }
780
+ /** Finalizes soft-deleted txs up to the cutoff and logs the completed finalization. */
781
+ async completeFinalization(
782
+ txHashes: string[],
783
+ cutoffBlock: BlockNumber,
784
+ finalizedBlockNumber: BlockNumber,
785
+ ): Promise<void> {
786
+ await this.#store.transactionAsync(async () => {
787
+ await this.#deletedPool.finalizeBlock(cutoffBlock);
647
788
  });
648
789
 
649
- if (minedTxsToFinalize.length > 0) {
650
- this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
651
- txHashes: minedTxsToFinalize,
790
+ if (txHashes.length > 0) {
791
+ this.#log.info(`Finalized ${txHashes.length} mined txs from blocks up to ${cutoffBlock}`, {
792
+ txHashes,
793
+ finalizedBlockNumber,
794
+ cutoffBlock,
652
795
  });
653
796
  }
654
797
  }
655
798
 
799
+ /**
800
+ * Resolves the block up to which finalized txs may be deleted, given `keepFinalizedTxsForSlots`.
801
+ * With a margin of 0 this is just the finalized block. Otherwise we keep txs whose block is within
802
+ * the margin (in slots) of the finalized tip: take the target slot `finalizedSlot - margin`, find the
803
+ * latest checkpoint at or before it with a single reverse range query (`limit: 1`), and use that
804
+ * checkpoint's last block as the cutoff. This rounds to a checkpoint boundary, so it can retain slightly
805
+ * more than the configured margin but never less, and never deletes past the finalized block.
806
+ */
807
+ async #finalizationCutoffBlock(block: BlockHeader): Promise<BlockNumber> {
808
+ const keepSlots = this.#config.keepFinalizedTxsForSlots;
809
+ if (keepSlots <= 0) {
810
+ return block.globalVariables.blockNumber;
811
+ }
812
+
813
+ // The goal here really is to ensure we keep transactions long enough for them to be proven.
814
+ // So we could be smart and calculate the number of slots until the end of the proof submission window.
815
+ // Our approach here is a lot simpler however and we just keep transactions for the configured number
816
+ // of slots past L1 finalisation. This means we may keep transactions in the mined pool for longer
817
+ // than strictly necessary.
818
+ const targetSlot = block.getSlot() - keepSlots;
819
+ if (targetSlot < 0) {
820
+ // The margin reaches past genesis: keep everything.
821
+ return BlockNumber(0);
822
+ }
823
+
824
+ const [checkpoint] = await this.#l2BlockSource.getCheckpointsData({
825
+ fromSlot: SlotNumber(targetSlot),
826
+ limit: 1,
827
+ reverse: true,
828
+ });
829
+ // No checkpoint at or before the target slot (e.g. early chain): keep everything.
830
+ return checkpoint ? BlockNumber(checkpoint.startBlock + checkpoint.blockCount - 1) : BlockNumber(0);
831
+ }
832
+
656
833
  // === Query Methods ===
657
834
 
658
- async getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
659
- const buffer = await this.#txsDB.getAsync(txHash.toString());
660
- return buffer ? Tx.fromBuffer(buffer) : undefined;
835
+ async getTxByHash(txHash: TxHash, opts: { includeProof?: boolean } = {}): Promise<Tx | undefined> {
836
+ const txHashStr = txHash.toString();
837
+ const buffer = await this.#txsDB.getAsync(txHashStr);
838
+ if (!buffer) {
839
+ return undefined;
840
+ }
841
+ return opts.includeProof === false ? Tx.fromBuffer(buffer) : this.#loadTxWithProof(txHashStr, buffer);
661
842
  }
662
843
 
663
- async getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
844
+ async getTxsByHash(txHashes: TxHash[], opts: { includeProof?: boolean } = {}): Promise<(Tx | undefined)[]> {
664
845
  const results: (Tx | undefined)[] = [];
665
846
  for (const h of txHashes) {
666
- const buffer = await this.#txsDB.getAsync(h.toString());
667
- results.push(buffer ? Tx.fromBuffer(buffer) : undefined);
847
+ results.push(await this.getTxByHash(h, opts));
668
848
  }
669
849
  return results;
670
850
  }
671
851
 
852
+ /** Deserializes a tx blob loaded from #txsDB together with its separately-stored proof. */
853
+ async #loadTxWithProof(txHashStr: string, buffer: Buffer): Promise<Tx> {
854
+ const proofBuffer = await this.#proofsDB.getAsync(txHashStr);
855
+ if (!proofBuffer) {
856
+ // #addTx always writes a proof entry (an empty proof serializes to a 4-byte sentinel), so a missing entry
857
+ // means the blob/proof invariant is broken. Return the proofless tx but flag it, since a consumer that needs
858
+ // the proof (eg serving peers) would otherwise fail far away from the root cause.
859
+ this.#log.warn(`Missing stored proof for tx ${txHashStr}`, { txHash: txHashStr });
860
+ return Tx.fromBuffer(buffer);
861
+ }
862
+ return Tx.fromBuffers(buffer, proofBuffer);
863
+ }
864
+
672
865
  hasTxs(txHashes: TxHash[]): boolean[] {
673
866
  return txHashes.map(h => {
674
867
  const hashStr = h.toString();
@@ -704,6 +897,11 @@ export class TxPoolV2Impl {
704
897
  return this.#indices.getPendingTxCount();
705
898
  }
706
899
 
900
+ hasEligiblePendingTxs(minCount: number): boolean {
901
+ const maxReceivedAt = this.#dateProvider.now() - this.#config.minTxPoolAgeMs;
902
+ return this.#indices.hasEligiblePendingTxs(maxReceivedAt, minCount);
903
+ }
904
+
707
905
  getMinedTxHashes(): [TxHash, L2BlockId][] {
708
906
  return this.#indices.getMinedTxs().map(([hash, blockId]) => [TxHash.fromString(hash), blockId]);
709
907
  }
@@ -747,6 +945,9 @@ export class TxPoolV2Impl {
747
945
  if (config.minTxPoolAgeMs !== undefined) {
748
946
  this.#config.minTxPoolAgeMs = config.minTxPoolAgeMs;
749
947
  }
948
+ if (config.keepFinalizedTxsForSlots !== undefined) {
949
+ this.#config.keepFinalizedTxsForSlots = config.keepFinalizedTxsForSlots;
950
+ }
750
951
  // Update eviction rules with new config
751
952
  this.#evictionManager.updateConfig(config);
752
953
  }
@@ -795,7 +996,8 @@ export class TxPoolV2Impl {
795
996
  const meta = precomputedMeta ?? (await buildTxMetaData(tx));
796
997
  meta.receivedAt = this.#dateProvider.now();
797
998
 
798
- await this.#txsDB.set(txHashStr, tx.toBuffer());
999
+ await this.#txsDB.set(txHashStr, tx.withoutProof().toBuffer());
1000
+ await this.#proofsDB.set(txHashStr, tx.chonkProof.toBuffer());
799
1001
  await this.#deletedPool.clearSoftDeleted(txHashStr);
800
1002
  this.#callbacks.onTxsAdded([tx], opts);
801
1003
 
@@ -834,6 +1036,12 @@ export class TxPoolV2Impl {
834
1036
  await this.#deletedPool.deleteTx(txHashStr);
835
1037
  }
836
1038
 
1039
+ /** Hard-deletes a tx's stored data (tx blob and proof) from the DB. */
1040
+ async #deleteTxData(txHashStr: string): Promise<void> {
1041
+ await this.#txsDB.delete(txHashStr);
1042
+ await this.#proofsDB.delete(txHashStr);
1043
+ }
1044
+
837
1045
  /** Deletes a batch of transactions, emitting callbacks individually for each. */
838
1046
  async #deleteTxsBatch(txHashes: string[]): Promise<void> {
839
1047
  for (const txHashStr of txHashes) {
@@ -849,21 +1057,11 @@ export class TxPoolV2Impl {
849
1057
  this.#instrumentation.recordEvictions(txHashes.length, reason);
850
1058
  for (const txHashStr of txHashes) {
851
1059
  this.#log.debug(`Evicting tx ${txHashStr}`, { txHash: txHashStr, reason });
852
- this.#addToEvictedCache(txHashStr);
1060
+ this.#evictedTxHashes.add(txHashStr);
853
1061
  }
854
1062
  await this.#deleteTxsBatch(txHashes);
855
1063
  }
856
1064
 
857
- /** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */
858
- #addToEvictedCache(txHashStr: string): void {
859
- if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
860
- // FIFO eviction: remove the first (oldest) entry
861
- const oldest = this.#evictedTxHashes.values().next().value!;
862
- this.#evictedTxHashes.delete(oldest);
863
- }
864
- this.#evictedTxHashes.add(txHashStr);
865
- }
866
-
867
1065
  // ============================================================================
868
1066
  // PRIVATE HELPERS - Validation & Conflict Resolution
869
1067
  // ============================================================================
@@ -958,50 +1156,6 @@ export class TxPoolV2Impl {
958
1156
  };
959
1157
  }
960
1158
 
961
- /** Loads all transactions from the database, returning loaded txs and deserialization errors */
962
- async #loadAllTxsFromDb(): Promise<{
963
- loaded: { tx: Tx; meta: TxMetaData }[];
964
- errors: string[];
965
- }> {
966
- const loaded: { tx: Tx; meta: TxMetaData }[] = [];
967
- const errors: string[] = [];
968
-
969
- for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()) {
970
- // Skip soft-deleted transactions - they stay in DB but not in indices
971
- if (this.#deletedPool.isSoftDeleted(txHashStr)) {
972
- continue;
973
- }
974
-
975
- try {
976
- const tx = Tx.fromBuffer(buffer);
977
- const meta = await buildTxMetaData(tx);
978
- loaded.push({ tx, meta });
979
- } catch (err) {
980
- this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
981
- errors.push(txHashStr);
982
- }
983
- }
984
-
985
- return { loaded, errors };
986
- }
987
-
988
- /** Queries block source and marks mined status on transaction metadata */
989
- async #markMinedStatusBatch(metas: TxMetaData[]): Promise<void> {
990
- for (const meta of metas) {
991
- try {
992
- const txEffect = await this.#l2BlockSource.getTxEffect(TxHash.fromString(meta.txHash));
993
- if (txEffect) {
994
- meta.minedL2BlockId = {
995
- number: txEffect.l2BlockNumber,
996
- hash: txEffect.l2BlockHash.toString(),
997
- };
998
- }
999
- } catch (err) {
1000
- this.#log.warn(`Failed to check mined status for tx ${meta.txHash}`, { err });
1001
- }
1002
- }
1003
- }
1004
-
1005
1159
  /**
1006
1160
  * Rebuilds the pending pool by processing each tx through pre-add rules.
1007
1161
  * Starts with an empty pending pool and adds txs one by one, resolving conflicts.
@@ -1076,7 +1230,7 @@ export class TxPoolV2Impl {
1076
1230
  const publicStateSource = new DatabasePublicStateSource(db);
1077
1231
  const balance = await publicStateSource.storageRead(
1078
1232
  ProtocolContractAddress.FeeJuice,
1079
- await computeFeePayerBalanceStorageSlot(AztecAddress.fromString(feePayer)),
1233
+ await computeFeePayerBalanceStorageSlot(AztecAddress.fromStringUnsafe(feePayer)),
1080
1234
  );
1081
1235
  return balance.toBigInt();
1082
1236
  },