@aztec/p2p 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774

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 (463) hide show
  1. package/README.md +129 -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 +9 -1
  5. package/dest/client/factory.d.ts +7 -7
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +39 -32
  8. package/dest/client/interface.d.ts +19 -17
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +16 -20
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +94 -105
  13. package/dest/config.d.ts +154 -106
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +134 -40
  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 +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  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 +99 -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 +267 -197
  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 +181 -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 +4 -2
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +33 -15
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -2
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +2 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  51. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +4 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +10 -6
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  60. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  61. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  63. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  64. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  66. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +18 -9
  67. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
  69. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +51 -11
  70. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +90 -19
  72. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  74. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -44
  75. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +5 -3
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +3 -2
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +256 -220
  81. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  82. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  83. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  84. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  85. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  87. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  88. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  89. package/dest/msg_validators/clock_tolerance.js +61 -3
  90. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
  91. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  93. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
  94. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  96. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
  97. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  98. package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
  99. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  100. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  102. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  103. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  105. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  106. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  107. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  108. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  109. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  110. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  112. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  113. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  114. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  115. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  116. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  118. package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
  119. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/factory.js +252 -61
  121. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  124. package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  127. package/dest/msg_validators/tx_validator/index.d.ts +5 -1
  128. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/index.js +4 -0
  130. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  131. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  132. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  133. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  134. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  135. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  136. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  137. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  138. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  139. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  140. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  141. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  142. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  143. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  144. package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
  145. package/dest/services/data_store.d.ts +1 -1
  146. package/dest/services/data_store.d.ts.map +1 -1
  147. package/dest/services/data_store.js +5 -5
  148. package/dest/services/discv5/discV5_service.d.ts +2 -1
  149. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  150. package/dest/services/discv5/discV5_service.js +35 -8
  151. package/dest/services/dummy_service.d.ts +12 -17
  152. package/dest/services/dummy_service.d.ts.map +1 -1
  153. package/dest/services/dummy_service.js +13 -20
  154. package/dest/services/encoding.d.ts +6 -2
  155. package/dest/services/encoding.d.ts.map +1 -1
  156. package/dest/services/encoding.js +14 -8
  157. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  158. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  159. package/dest/services/gossipsub/topic_score_params.js +21 -4
  160. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  161. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  162. package/dest/services/libp2p/instrumentation.js +14 -0
  163. package/dest/services/libp2p/libp2p_service.d.ts +47 -55
  164. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  165. package/dest/services/libp2p/libp2p_service.js +344 -308
  166. package/dest/services/peer-manager/metrics.d.ts +3 -1
  167. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  168. package/dest/services/peer-manager/metrics.js +6 -0
  169. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  170. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  171. package/dest/services/peer-manager/peer_manager.js +40 -11
  172. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  173. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  174. package/dest/services/peer-manager/peer_scoring.js +32 -10
  175. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  176. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +97 -107
  178. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  179. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  180. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  181. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  182. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  183. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  184. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  185. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  186. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  187. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  188. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  189. package/dest/services/reqresp/config.d.ts +3 -3
  190. package/dest/services/reqresp/config.d.ts.map +1 -1
  191. package/dest/services/reqresp/interface.d.ts +16 -18
  192. package/dest/services/reqresp/interface.d.ts.map +1 -1
  193. package/dest/services/reqresp/interface.js +10 -20
  194. package/dest/services/reqresp/metrics.d.ts +1 -1
  195. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  196. package/dest/services/reqresp/metrics.js +0 -1
  197. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  198. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  199. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
  200. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  201. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  202. package/dest/services/reqresp/protocols/index.js +0 -1
  203. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  204. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  205. package/dest/services/reqresp/protocols/tx.js +1 -3
  206. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  207. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  208. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  209. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  210. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  211. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  212. package/dest/services/reqresp/reqresp.d.ts +7 -29
  213. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  214. package/dest/services/reqresp/reqresp.js +43 -215
  215. package/dest/services/service.d.ts +10 -13
  216. package/dest/services/service.d.ts.map +1 -1
  217. package/dest/services/tx_collection/config.d.ts +2 -23
  218. package/dest/services/tx_collection/config.d.ts.map +1 -1
  219. package/dest/services/tx_collection/config.js +2 -55
  220. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  221. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  222. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  223. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  224. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  225. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  226. package/dest/services/tx_collection/index.d.ts +2 -3
  227. package/dest/services/tx_collection/index.d.ts.map +1 -1
  228. package/dest/services/tx_collection/index.js +0 -1
  229. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  230. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  231. package/dest/services/tx_collection/instrumentation.js +0 -2
  232. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  233. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  234. package/dest/services/tx_collection/request_tracker.js +84 -0
  235. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  236. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  237. package/dest/services/tx_collection/tx_collection.js +275 -119
  238. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  239. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  240. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  241. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  242. package/dest/services/tx_collection/tx_source.js +9 -7
  243. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  244. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  245. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  246. package/dest/services/tx_provider.d.ts +5 -3
  247. package/dest/services/tx_provider.d.ts.map +1 -1
  248. package/dest/services/tx_provider.js +7 -4
  249. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  250. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  251. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  252. package/dest/test-helpers/mock-pubsub.d.ts +24 -11
  253. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  254. package/dest/test-helpers/mock-pubsub.js +45 -45
  255. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  256. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  257. package/dest/test-helpers/reqresp-nodes.js +17 -19
  258. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  259. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  260. package/dest/test-helpers/test_tx_provider.js +3 -0
  261. package/dest/test-helpers/testbench-utils.d.ts +13 -15
  262. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  263. package/dest/test-helpers/testbench-utils.js +42 -15
  264. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  265. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  266. package/dest/testbench/p2p_client_testbench_worker.js +88 -42
  267. package/dest/testbench/worker_client_manager.d.ts +12 -6
  268. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  269. package/dest/testbench/worker_client_manager.js +57 -11
  270. package/dest/util.d.ts +12 -7
  271. package/dest/util.d.ts.map +1 -1
  272. package/dest/util.js +35 -14
  273. package/dest/versioning.d.ts +3 -6
  274. package/dest/versioning.d.ts.map +1 -1
  275. package/dest/versioning.js +3 -24
  276. package/package.json +15 -14
  277. package/src/bootstrap/bootstrap.ts +9 -1
  278. package/src/client/factory.ts +74 -49
  279. package/src/client/interface.ts +20 -30
  280. package/src/client/p2p_client.ts +108 -156
  281. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  282. package/src/config.ts +227 -45
  283. package/src/errors/p2p-service.error.ts +11 -0
  284. package/src/errors/reqresp.error.ts +0 -25
  285. package/src/index.ts +0 -1
  286. package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
  287. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  288. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  289. package/src/mem_pools/index.ts +0 -3
  290. package/src/mem_pools/instrumentation.ts +22 -14
  291. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  292. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -2
  293. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
  294. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  295. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  296. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  297. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
  298. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +10 -6
  299. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  300. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  301. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  302. package/src/mem_pools/tx_pool_v2/interfaces.ts +19 -8
  303. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +130 -23
  304. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  305. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +17 -2
  306. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +267 -229
  307. package/src/msg_validators/attestation_validator/README.md +49 -0
  308. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  309. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  310. package/src/msg_validators/clock_tolerance.ts +79 -3
  311. package/src/msg_validators/proposal_validator/README.md +123 -0
  312. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
  313. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
  314. package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
  315. package/src/msg_validators/tx_validator/README.md +127 -0
  316. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +6 -15
  317. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  318. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  319. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  320. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  321. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  322. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  323. package/src/msg_validators/tx_validator/factory.ts +407 -80
  324. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  325. package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
  326. package/src/msg_validators/tx_validator/index.ts +4 -0
  327. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  328. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  329. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  330. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  331. package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
  332. package/src/services/data_store.ts +5 -13
  333. package/src/services/discv5/discV5_service.ts +38 -5
  334. package/src/services/dummy_service.ts +15 -44
  335. package/src/services/encoding.ts +14 -7
  336. package/src/services/gossipsub/topic_score_params.ts +36 -4
  337. package/src/services/libp2p/instrumentation.ts +14 -0
  338. package/src/services/libp2p/libp2p_service.ts +390 -360
  339. package/src/services/peer-manager/metrics.ts +7 -0
  340. package/src/services/peer-manager/peer_manager.ts +46 -11
  341. package/src/services/peer-manager/peer_scoring.ts +27 -5
  342. package/src/services/reqresp/README.md +215 -0
  343. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  344. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +97 -119
  345. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  346. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  347. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  348. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  349. package/src/services/reqresp/config.ts +2 -2
  350. package/src/services/reqresp/interface.ts +21 -47
  351. package/src/services/reqresp/metrics.ts +0 -1
  352. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
  353. package/src/services/reqresp/protocols/index.ts +0 -1
  354. package/src/services/reqresp/protocols/tx.ts +1 -3
  355. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  356. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  357. package/src/services/reqresp/reqresp.ts +48 -261
  358. package/src/services/service.ts +13 -29
  359. package/src/services/tx_collection/config.ts +3 -80
  360. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  361. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  362. package/src/services/tx_collection/index.ts +1 -6
  363. package/src/services/tx_collection/instrumentation.ts +1 -7
  364. package/src/services/tx_collection/request_tracker.ts +127 -0
  365. package/src/services/tx_collection/tx_collection.ts +331 -176
  366. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  367. package/src/services/tx_collection/tx_source.ts +8 -7
  368. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  369. package/src/services/tx_provider.ts +7 -2
  370. package/src/test-helpers/make-test-p2p-clients.ts +4 -3
  371. package/src/test-helpers/mock-pubsub.ts +49 -66
  372. package/src/test-helpers/reqresp-nodes.ts +15 -28
  373. package/src/test-helpers/test_tx_provider.ts +5 -0
  374. package/src/test-helpers/testbench-utils.ts +54 -29
  375. package/src/testbench/p2p_client_testbench_worker.ts +91 -61
  376. package/src/testbench/worker_client_manager.ts +72 -25
  377. package/src/util.ts +33 -18
  378. package/src/versioning.ts +3 -33
  379. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  380. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  381. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
  382. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  383. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  384. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  385. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  386. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  387. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  388. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  389. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  390. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  391. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  392. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  393. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  394. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  395. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  396. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  397. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  398. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  399. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  400. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  401. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  402. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  403. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  404. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  405. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  406. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  407. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  408. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  409. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  410. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  411. package/dest/mem_pools/tx_pool/index.js +0 -2
  412. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  413. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  414. package/dest/mem_pools/tx_pool/priority.js +0 -15
  415. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  416. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  417. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  418. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  419. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  420. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  421. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  422. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  423. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  424. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  425. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  426. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  427. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  428. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  429. package/dest/services/reqresp/protocols/block.js +0 -32
  430. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  431. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  432. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  433. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  434. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  435. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  436. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  437. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  438. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  439. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  440. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  441. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  442. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -346
  443. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  444. package/src/mem_pools/tx_pool/README.md +0 -270
  445. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  446. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  447. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  448. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  449. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  450. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  451. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  452. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  453. package/src/mem_pools/tx_pool/index.ts +0 -2
  454. package/src/mem_pools/tx_pool/priority.ts +0 -20
  455. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  456. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  457. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  458. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  459. package/src/services/reqresp/protocols/block.ts +0 -37
  460. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  461. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  462. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  463. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
@@ -1,4 +1,5 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { FifoSet } from '@aztec/foundation/fifo-set';
2
3
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
3
4
  import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
4
5
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
@@ -6,11 +7,16 @@ import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
6
7
  import { Tx, TxHash } from '@aztec/stdlib/tx';
7
8
  import { TxArchive } from './archive/index.js';
8
9
  import { DeletedPool } from './deleted_pool.js';
9
- import { EvictionManager, FeePayerBalanceEvictionRule, FeePayerBalancePreAddRule, InvalidTxsAfterMiningRule, InvalidTxsAfterReorgRule, LowPriorityEvictionRule, LowPriorityPreAddRule, NullifierConflictRule, TxPoolRejectionCode } from './eviction/index.js';
10
+ import { EvictionManager, FeePayerBalanceEvictionRule, FeePayerBalancePreAddRule, InsufficientFeePerGasEvictionRule, InvalidTxsAfterMiningRule, InvalidTxsAfterReorgRule, LowPriorityEvictionRule, LowPriorityPreAddRule, NullifierConflictRule, TxPoolRejectionCode } from './eviction/index.js';
10
11
  import { TxPoolV2Instrumentation } from './instrumentation.js';
11
12
  import { DEFAULT_TX_POOL_V2_CONFIG } from './interfaces.js';
12
13
  import { buildTxMetaData, checkNullifierConflict } from './tx_metadata.js';
13
14
  import { TxPoolIndices } from './tx_pool_indices.js';
15
+ /**
16
+ * Maximum number of full transactions to load into memory at once when finalizing a block.
17
+ * Bounds peak memory while archiving and hard-deleting mined txs (~23k txs/epoch at 10 TPS would
18
+ * otherwise OOM the node).
19
+ */ const FINALIZE_BLOCK_CHUNK_SIZE = 100;
14
20
  /**
15
21
  * Implementation of TxPoolV2 logic.
16
22
  *
@@ -23,6 +29,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
23
29
  #l2BlockSource;
24
30
  #worldStateSynchronizer;
25
31
  #createTxValidator;
32
+ #checkAllowedSetupCalls;
26
33
  // === In-Memory Indices ===
27
34
  #indices = new TxPoolIndices();
28
35
  // === Config & Services ===
@@ -32,7 +39,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
32
39
  #evictionManager;
33
40
  #dateProvider;
34
41
  #instrumentation;
35
- #evictedTxHashes = new Set();
42
+ #evictedTxHashes;
36
43
  #log;
37
44
  #callbacks;
38
45
  constructor(store, archiveStore, deps, callbacks, telemetry, config = {}, dateProvider, log){
@@ -41,10 +48,12 @@ import { TxPoolIndices } from './tx_pool_indices.js';
41
48
  this.#l2BlockSource = deps.l2BlockSource;
42
49
  this.#worldStateSynchronizer = deps.worldStateSynchronizer;
43
50
  this.#createTxValidator = deps.createTxValidator;
51
+ this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
44
52
  this.#config = {
45
53
  ...DEFAULT_TX_POOL_V2_CONFIG,
46
54
  ...config
47
55
  };
56
+ this.#evictedTxHashes = FifoSet.withLimit(this.#config.evictedTxCacheSize);
48
57
  this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
49
58
  this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
50
59
  this.#dateProvider = dateProvider;
@@ -61,6 +70,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
61
70
  }));
62
71
  // Post-event eviction rules (run after events to check ALL pending txs)
63
72
  this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
73
+ this.#evictionManager.registerRule(new InsufficientFeePerGasEvictionRule(deps.blockMinFeesProvider));
64
74
  this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(deps.worldStateSynchronizer));
65
75
  this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(deps.worldStateSynchronizer));
66
76
  // LowPriorityEvictionRule handles cases where txs become pending via prepareForSlot (unprotect)
@@ -81,30 +91,63 @@ import { TxPoolIndices } from './tx_pool_indices.js';
81
91
  */ async hydrateFromDatabase() {
82
92
  // Step 0: Hydrate deleted pool state
83
93
  await this.#deletedPool.hydrateFromDatabase();
84
- // Step 1: Load all transactions from DB (excluding soft-deleted)
85
- const { loaded, errors: deserializationErrors } = await this.#loadAllTxsFromDb();
86
- // Step 2: Check mined status for each tx
87
- await this.#markMinedStatusBatch(loaded.map((l)=>l.meta));
88
- // Step 3: Partition by mined status
89
- const mined = [];
90
- const nonMined = [];
91
- for (const entry of loaded){
92
- if (entry.meta.minedL2BlockId !== undefined) {
93
- mined.push(entry.meta);
94
+ // Step 1: Stream txs from DB, building metadata and mined status one at a time.
95
+ const minedMetas = [];
96
+ const pendingMetas = [];
97
+ const deserializationErrors = [];
98
+ for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()){
99
+ // Skip soft-deleted transactions - they stay in DB but not in indices
100
+ if (this.#deletedPool.isSoftDeleted(txHashStr)) {
101
+ continue;
102
+ }
103
+ let meta;
104
+ let txEffect;
105
+ try {
106
+ const tx = Tx.fromBuffer(buffer);
107
+ // Resolve allowed-setup-calls and the tx effect concurrently
108
+ // getTxEffect failures are non-fatal (we just treat the tx as not-yet-mined), so
109
+ // its rejection is swallowed before the Promise.all so it can't fail-fast the batch.
110
+ const txEffectPromise = this.#l2BlockSource.getTxEffect(tx.getTxHash()).catch((err)=>{
111
+ this.#log.warn(`Failed to check mined status for tx ${txHashStr}`, {
112
+ err
113
+ });
114
+ return undefined;
115
+ });
116
+ const [allowedSetupCalls, fetchedTxEffect] = await Promise.all([
117
+ this.#checkAllowedSetupCalls(tx),
118
+ txEffectPromise
119
+ ]);
120
+ meta = await buildTxMetaData(tx, allowedSetupCalls);
121
+ txEffect = fetchedTxEffect;
122
+ } catch (err) {
123
+ this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, {
124
+ err
125
+ });
126
+ deserializationErrors.push(txHashStr);
127
+ continue;
128
+ }
129
+ if (txEffect) {
130
+ meta.minedL2BlockId = {
131
+ number: txEffect.l2BlockNumber,
132
+ hash: txEffect.l2BlockHash.toString()
133
+ };
134
+ }
135
+ if (meta.minedL2BlockId !== undefined) {
136
+ minedMetas.push(meta);
94
137
  } else {
95
- nonMined.push(entry);
138
+ pendingMetas.push(meta);
96
139
  }
97
140
  }
98
- // Step 4: Validate non-mined transactions
99
- const { valid, invalid } = await this.#revalidateMetadata(nonMined.map((e)=>e.meta), 'on startup');
100
- // Step 5: Populate mined indices (these don't need conflict resolution)
101
- for (const meta of mined){
141
+ // Step 2: Validate non-mined transactions
142
+ const { valid, invalid } = await this.#revalidateMetadata(pendingMetas, 'on startup');
143
+ // Step 3: Populate mined indices (these don't need conflict resolution)
144
+ for (const meta of minedMetas){
102
145
  this.#indices.addMined(meta);
103
146
  }
104
- // Step 6: Rebuild pending pool by running pre-add rules for each tx
147
+ // Step 4: Rebuild pending pool by running pre-add rules for each tx
105
148
  // This resolves nullifier conflicts, fee payer balance issues, and pool size limits
106
149
  const { rejected } = await this.#rebuildPendingPool(valid);
107
- // Step 7: Delete invalid and rejected txs from DB only (indices were never populated for these)
150
+ // Step 5: Delete invalid and rejected txs from DB only (indices were never populated for these)
108
151
  const toDelete = [
109
152
  ...deserializationErrors,
110
153
  ...invalid,
@@ -128,9 +171,32 @@ import { TxPoolIndices } from './tx_pool_indices.js';
128
171
  const rejected = [];
129
172
  const errors = new Map();
130
173
  const acceptedPending = new Set();
174
+ // Phase 1: Pre-compute all throwable I/O outside the transaction.
175
+ // If any pre-computation throws, the entire call fails before mutations happen.
176
+ const precomputed = new Map();
177
+ const validator = await this.#createTxValidator();
178
+ for (const tx of txs){
179
+ const txHash = tx.getTxHash();
180
+ const txHashStr = txHash.toString();
181
+ const meta = await buildTxMetaData(tx);
182
+ const minedBlockId = await this.#getMinedBlockId(txHash);
183
+ // Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction)
184
+ let isValid = true;
185
+ if (!minedBlockId) {
186
+ isValid = await this.#validateMeta(meta, validator);
187
+ }
188
+ precomputed.set(txHashStr, {
189
+ meta,
190
+ minedBlockId,
191
+ isValid
192
+ });
193
+ }
194
+ // Phase 2: Apply mutations inside the transaction using only pre-computed results,
195
+ // in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
131
196
  const poolAccess = this.#createPreAddPoolAccess();
132
197
  const preAddContext = opts.feeComparisonOnly !== undefined ? {
133
- feeComparisonOnly: opts.feeComparisonOnly
198
+ feeComparisonOnly: opts.feeComparisonOnly,
199
+ priceBumpPercentage: this.#config.priceBumpPercentage
134
200
  } : undefined;
135
201
  await this.#store.transactionAsync(async ()=>{
136
202
  for (const tx of txs){
@@ -141,33 +207,41 @@ import { TxPoolIndices } from './tx_pool_indices.js';
141
207
  ignored.push(txHash);
142
208
  continue;
143
209
  }
144
- // Check mined status first (applies to all paths)
145
- const minedBlockId = await this.#getMinedBlockId(txHash);
210
+ const { meta, minedBlockId, isValid } = precomputed.get(txHashStr);
146
211
  const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr);
147
212
  if (minedBlockId) {
148
213
  // Already mined - add directly (protection already set if pre-protected)
149
214
  await this.#addTx(tx, {
150
215
  mined: minedBlockId
151
- }, opts);
216
+ }, opts, meta);
152
217
  accepted.push(txHash);
153
218
  } else if (preProtectedSlot !== undefined) {
154
219
  // Pre-protected and not mined - add as protected (bypass validation)
155
220
  await this.#addTx(tx, {
156
221
  protected: preProtectedSlot
157
- }, opts);
222
+ }, opts, meta);
158
223
  accepted.push(txHash);
224
+ } else if (!isValid) {
225
+ // Failed pre-computed validation
226
+ rejected.push(txHash);
159
227
  } else {
160
- // Regular pending tx - validate and run pre-add rules
161
- const result = await this.#tryAddRegularPendingTx(tx, opts, poolAccess, acceptedPending, ignored, errors, preAddContext);
228
+ // Regular pending tx - run pre-add rules using pre-computed metadata
229
+ const result = await this.#tryAddRegularPendingTx(tx, meta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext);
162
230
  if (result.status === 'accepted') {
163
231
  acceptedPending.add(txHashStr);
164
- } else if (result.status === 'rejected') {
165
- rejected.push(txHash);
166
232
  } else {
167
233
  ignored.push(txHash);
168
234
  }
169
235
  }
170
236
  }
237
+ // Run post-add eviction rules for pending txs (inside transaction for atomicity)
238
+ if (acceptedPending.size > 0) {
239
+ const feePayers = Array.from(acceptedPending).map((txHash)=>this.#indices.getMetadata(txHash).feePayer);
240
+ const uniqueFeePayers = new Set(feePayers);
241
+ await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [
242
+ ...uniqueFeePayers
243
+ ]);
244
+ }
171
245
  });
172
246
  // Build final accepted list for pending txs (excludes intra-batch evictions)
173
247
  for (const txHashStr of acceptedPending){
@@ -180,14 +254,6 @@ import { TxPoolIndices } from './tx_pool_indices.js';
180
254
  if (rejected.length > 0) {
181
255
  this.#instrumentation.recordRejected(rejected.length);
182
256
  }
183
- // Run post-add eviction rules for pending txs
184
- if (acceptedPending.size > 0) {
185
- const feePayers = Array.from(acceptedPending).map((txHash)=>this.#indices.getMetadata(txHash).feePayer);
186
- const uniqueFeePayers = new Set(feePayers);
187
- await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [
188
- ...uniqueFeePayers
189
- ]);
190
- }
191
257
  return {
192
258
  accepted,
193
259
  ignored,
@@ -197,18 +263,10 @@ import { TxPoolIndices } from './tx_pool_indices.js';
197
263
  } : {}
198
264
  };
199
265
  }
200
- /** Validates and adds a regular pending tx. Returns status. */ async #tryAddRegularPendingTx(tx, opts, poolAccess, acceptedPending, ignored, errors, preAddContext) {
201
- const txHash = tx.getTxHash();
202
- const txHashStr = txHash.toString();
203
- // Build metadata and validate using metadata
204
- const meta = await buildTxMetaData(tx);
205
- if (!await this.#validateMeta(meta)) {
206
- return {
207
- status: 'rejected'
208
- };
209
- }
266
+ /** Adds a validated pending tx, running pre-add rules and evicting conflicts. */ async #tryAddRegularPendingTx(tx, precomputedMeta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext) {
267
+ const txHashStr = tx.getTxHash().toString();
210
268
  // Run pre-add rules
211
- const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess, preAddContext);
269
+ const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext);
212
270
  if (preAddResult.shouldIgnore) {
213
271
  this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`);
214
272
  if (preAddResult.reason && preAddResult.reason.code !== TxPoolRejectionCode.INTERNAL_ERROR) {
@@ -246,8 +304,15 @@ import { TxPoolIndices } from './tx_pool_indices.js';
246
304
  }
247
305
  }
248
306
  }
307
+ // Randomly drop the transaction for testing purposes (report as accepted so it propagates)
308
+ if (this.#config.dropTransactionsProbability > 0 && Math.random() < this.#config.dropTransactionsProbability) {
309
+ this.#log.debug(`Dropping tx ${txHashStr} (simulated drop for testing)`);
310
+ return {
311
+ status: 'accepted'
312
+ };
313
+ }
249
314
  // Add the transaction
250
- await this.#addTx(tx, 'pending', opts);
315
+ await this.#addTx(tx, 'pending', opts, precomputedMeta);
251
316
  return {
252
317
  status: 'accepted'
253
318
  };
@@ -256,38 +321,44 @@ import { TxPoolIndices } from './tx_pool_indices.js';
256
321
  const txHashStr = tx.getTxHash().toString();
257
322
  // Check if already in pool
258
323
  if (this.#indices.has(txHashStr)) {
324
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
259
325
  return 'ignored';
260
326
  }
261
- // Build metadata and validate using metadata
327
+ // Build metadata and check pre-add rules
262
328
  const meta = await buildTxMetaData(tx);
263
- const validationResult = await this.#validateMeta(meta, undefined, 'can add pending');
264
- if (validationResult !== true) {
265
- return 'rejected';
266
- }
267
- // Use pre-add rules
268
329
  const poolAccess = this.#createPreAddPoolAccess();
269
330
  const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
270
- return preAddResult.shouldIgnore ? 'ignored' : 'accepted';
331
+ if (preAddResult.shouldIgnore) {
332
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
333
+ reason: preAddResult.reason?.message ?? 'no reason provided'
334
+ });
335
+ return 'ignored';
336
+ }
337
+ return 'accepted';
271
338
  }
272
339
  async addProtectedTxs(txs, block, opts) {
273
340
  const slotNumber = block.globalVariables.slotNumber;
341
+ // Precompute setup-call allow-list flags outside the store transaction
342
+ const allowedFlags = await Promise.all(txs.map((tx)=>this.#checkAllowedSetupCalls(tx)));
274
343
  await this.#store.transactionAsync(async ()=>{
275
- for (const tx of txs){
344
+ for(let i = 0; i < txs.length; i++){
345
+ const tx = txs[i];
276
346
  const txHash = tx.getTxHash();
277
347
  const txHashStr = txHash.toString();
278
348
  const isNew = !this.#indices.has(txHashStr);
279
349
  const minedBlockId = await this.#getMinedBlockId(txHash);
280
350
  if (isNew) {
351
+ const meta = await buildTxMetaData(tx, allowedFlags[i]);
281
352
  // New tx - add as mined or protected (callback emitted by #addTx)
282
353
  if (minedBlockId) {
283
354
  await this.#addTx(tx, {
284
355
  mined: minedBlockId
285
- }, opts);
356
+ }, opts, meta);
286
357
  this.#indices.setProtection(txHashStr, slotNumber);
287
358
  } else {
288
359
  await this.#addTx(tx, {
289
360
  protected: slotNumber
290
- }, opts);
361
+ }, opts, meta);
291
362
  }
292
363
  } else {
293
364
  // Existing tx - update protection and mined status
@@ -305,34 +376,36 @@ import { TxPoolIndices } from './tx_pool_indices.js';
305
376
  const missing = [];
306
377
  let softDeletedHits = 0;
307
378
  let missingPreviouslyEvicted = 0;
308
- for (const txHash of txHashes){
309
- const txHashStr = txHash.toString();
310
- if (this.#indices.has(txHashStr)) {
311
- // Update protection for existing tx
312
- this.#indices.updateProtection(txHashStr, slotNumber);
313
- } else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
314
- // Resurrect soft-deleted tx as protected
315
- const buffer = await this.#txsDB.getAsync(txHashStr);
316
- if (buffer) {
317
- const tx = Tx.fromBuffer(buffer);
318
- await this.#addTx(tx, {
319
- protected: slotNumber
320
- });
321
- softDeletedHits++;
379
+ await this.#store.transactionAsync(async ()=>{
380
+ for (const txHash of txHashes){
381
+ const txHashStr = txHash.toString();
382
+ if (this.#indices.has(txHashStr)) {
383
+ // Update protection for existing tx
384
+ this.#indices.updateProtection(txHashStr, slotNumber);
385
+ } else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
386
+ // Resurrect soft-deleted tx as protected
387
+ const buffer = await this.#txsDB.getAsync(txHashStr);
388
+ if (buffer) {
389
+ const tx = Tx.fromBuffer(buffer);
390
+ await this.#addTx(tx, {
391
+ protected: slotNumber
392
+ });
393
+ softDeletedHits++;
394
+ } else {
395
+ // Data missing despite soft-delete flag — treat as truly missing
396
+ this.#indices.setProtection(txHashStr, slotNumber);
397
+ missing.push(txHash);
398
+ }
322
399
  } else {
323
- // Data missing despite soft-delete flag treat as truly missing
400
+ // Truly missing pre-record protection for tx we don't have yet
324
401
  this.#indices.setProtection(txHashStr, slotNumber);
325
402
  missing.push(txHash);
326
- }
327
- } else {
328
- // Truly missing — pre-record protection for tx we don't have yet
329
- this.#indices.setProtection(txHashStr, slotNumber);
330
- missing.push(txHash);
331
- if (this.#evictedTxHashes.has(txHashStr)) {
332
- missingPreviouslyEvicted++;
403
+ if (this.#evictedTxHashes.has(txHashStr)) {
404
+ missingPreviouslyEvicted++;
405
+ }
333
406
  }
334
407
  }
335
- }
408
+ });
336
409
  // Record metrics
337
410
  if (softDeletedHits > 0) {
338
411
  this.#instrumentation.recordSoftDeletedHits(softDeletedHits);
@@ -383,44 +456,51 @@ import { TxPoolIndices } from './tx_pool_indices.js';
383
456
  found.push(meta);
384
457
  }
385
458
  }
386
- // Step 4: Mark txs as mined (only those we have in the pool)
387
- for (const meta of found){
388
- this.#indices.markAsMined(meta, blockId);
389
- await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
459
+ await this.#store.transactionAsync(async ()=>{
460
+ // Step 4: Mark txs as mined (only those we have in the pool)
461
+ for (const meta of found){
462
+ this.#indices.markAsMined(meta, blockId);
463
+ await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
464
+ }
465
+ // Step 5: Run post-event eviction rules (inside transaction for atomicity)
466
+ await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
467
+ });
468
+ if (found.length > 0) {
469
+ this.#callbacks.onTxsMined(found.map((m)=>m.txHash));
390
470
  }
391
- // Step 5: Run eviction rules (remove pending txs with conflicting nullifiers/expired timestamps)
392
- await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
393
471
  this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
394
472
  }
395
473
  async prepareForSlot(slotNumber) {
396
- // Step 0: Clean up slot-deleted txs from previous slots
397
- await this.#deletedPool.cleanupSlotDeleted(slotNumber);
398
- // Step 1: Find expired protected txs
399
- const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
400
- // Step 2: Clear protection for all expired entries (including those without metadata)
401
- this.#indices.clearProtection(expiredProtected);
402
- // Step 3: Filter to only txs that have metadata and are not mined
403
- const txsToRestore = this.#indices.filterRestorable(expiredProtected);
404
- if (txsToRestore.length === 0) {
405
- this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
406
- return;
407
- }
408
- this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
409
- // Step 4: Validate for pending pool
410
- const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
411
- // Step 5: Resolve nullifier conflicts and add winners to pending indices
412
- const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
413
- // Step 6: Delete invalid txs and evict conflict losers
414
- await this.#deleteTxsBatch(invalid);
415
- await this.#evictTxs(toEvict, 'NullifierConflict');
416
- // Step 7: Run eviction rules (enforce pool size limit)
417
- if (added.length > 0) {
418
- const feePayers = added.map((meta)=>meta.feePayer);
419
- const uniqueFeePayers = new Set(feePayers);
420
- await this.#evictionManager.evictAfterNewTxs(added.map((m)=>m.txHash), [
421
- ...uniqueFeePayers
422
- ]);
423
- }
474
+ await this.#store.transactionAsync(async ()=>{
475
+ // Step 0: Clean up slot-deleted txs from previous slots
476
+ await this.#deletedPool.cleanupSlotDeleted(slotNumber);
477
+ // Step 1: Find expired protected txs
478
+ const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
479
+ // Step 2: Clear protection for all expired entries (including those without metadata)
480
+ this.#indices.clearProtection(expiredProtected);
481
+ // Step 3: Filter to only txs that have metadata and are not mined
482
+ const txsToRestore = this.#indices.filterRestorable(expiredProtected);
483
+ if (txsToRestore.length === 0) {
484
+ this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
485
+ return;
486
+ }
487
+ this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
488
+ // Step 4: Validate for pending pool
489
+ const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
490
+ // Step 5: Resolve nullifier conflicts and add winners to pending indices
491
+ const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
492
+ // Step 6: Delete invalid txs and evict conflict losers
493
+ await this.#deleteTxsBatch(invalid);
494
+ await this.#evictTxs(toEvict, 'NullifierConflict');
495
+ // Step 7: Run eviction rules (enforce pool size limit)
496
+ if (added.length > 0) {
497
+ const feePayers = added.map((meta)=>meta.feePayer);
498
+ const uniqueFeePayers = new Set(feePayers);
499
+ await this.#evictionManager.evictAfterNewTxs(added.map((m)=>m.txHash), [
500
+ ...uniqueFeePayers
501
+ ]);
502
+ }
503
+ });
424
504
  }
425
505
  async handlePrunedBlocks(latestBlock, options) {
426
506
  // Step 1: Find transactions mined after the prune point
@@ -430,45 +510,48 @@ import { TxPoolIndices } from './tx_pool_indices.js';
430
510
  return;
431
511
  }
432
512
  this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`);
433
- // Step 2: Mark ALL un-mined txs with their original mined block number
434
- // This ensures they get soft-deleted if removed later, and only hard-deleted
435
- // when their original mined block is finalized
436
- await this.#deletedPool.markFromPrunedBlock(txsToUnmine.map((m)=>({
437
- txHash: m.txHash,
438
- minedAtBlock: BlockNumber(m.minedL2BlockId.number)
439
- })));
440
- // Step 3: Unmine - clear mined status from metadata
441
- for (const meta of txsToUnmine){
442
- this.#indices.markAsUnmined(meta);
443
- }
444
- // If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
445
- if (options?.deleteAllTxs) {
446
- const allTxHashes = txsToUnmine.map((m)=>m.txHash);
447
- await this.#deleteTxsBatch(allTxHashes);
448
- this.#log.info(`Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`);
449
- return;
450
- }
451
- // Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
452
- const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
453
- // Step 5: Validate for pending pool
454
- const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
455
- // Step 6: Resolve nullifier conflicts and add winners to pending indices
456
- const { toEvict } = this.#applyNullifierConflictResolution(valid);
457
- // Step 7: Delete invalid txs and evict conflict losers
458
- await this.#deleteTxsBatch(invalid);
459
- await this.#evictTxs(toEvict, 'NullifierConflict');
460
- this.#log.info(`Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`, {
461
- txHashesRestored: valid.map((m)=>m.txHash),
462
- txHashesInvalid: invalid,
463
- txHashesEvicted: toEvict
513
+ await this.#store.transactionAsync(async ()=>{
514
+ // Step 2: Mark ALL un-mined txs with their original mined block number
515
+ // This ensures they get soft-deleted if removed later, and only hard-deleted
516
+ // when their original mined block is finalized
517
+ await this.#deletedPool.markFromPrunedBlock(txsToUnmine.map((m)=>({
518
+ txHash: m.txHash,
519
+ minedAtBlock: BlockNumber(m.minedL2BlockId.number)
520
+ })));
521
+ // Step 3: Unmine - clear mined status from metadata
522
+ for (const meta of txsToUnmine){
523
+ this.#indices.markAsUnmined(meta);
524
+ }
525
+ // If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
526
+ if (options?.deleteAllTxs) {
527
+ const allTxHashes = txsToUnmine.map((m)=>m.txHash);
528
+ await this.#deleteTxsBatch(allTxHashes);
529
+ this.#log.info(`Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`);
530
+ return;
531
+ }
532
+ // Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
533
+ const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
534
+ // Step 5: Validate for pending pool
535
+ const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
536
+ // Step 6: Resolve nullifier conflicts and add winners to pending indices
537
+ const { toEvict } = this.#applyNullifierConflictResolution(valid);
538
+ // Step 7: Delete invalid txs and evict conflict losers
539
+ await this.#deleteTxsBatch(invalid);
540
+ await this.#evictTxs(toEvict, 'NullifierConflict');
541
+ this.#log.info(`Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`, {
542
+ txHashesRestored: valid.map((m)=>m.txHash),
543
+ txHashesInvalid: invalid,
544
+ txHashesEvicted: toEvict
545
+ });
546
+ // Step 8: Run eviction rules for ALL pending txs (not just restored ones)
547
+ // This handles cases like existing pending txs with invalid fee payer balances
548
+ await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
464
549
  });
465
- // Step 8: Run eviction rules for ALL pending txs (not just restored ones)
466
- // This handles cases like existing pending txs with invalid fee payer balances
467
- await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
468
550
  }
469
551
  async handleFailedExecution(txHashes) {
470
- // Delete failed txs
471
- await this.#deleteTxsBatch(txHashes.map((h)=>h.toString()));
552
+ await this.#store.transactionAsync(async ()=>{
553
+ await this.#deleteTxsBatch(txHashes.map((h)=>h.toString()));
554
+ });
472
555
  this.#log.info(`Deleted ${txHashes.length} failed txs`, {
473
556
  txHashes: txHashes.map((h)=>h.toString())
474
557
  });
@@ -477,24 +560,29 @@ import { TxPoolIndices } from './tx_pool_indices.js';
477
560
  const blockNumber = block.globalVariables.blockNumber;
478
561
  // Step 1: Find mined txs at or before finalized block
479
562
  const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
480
- // Step 2: Collect mined txs for archiving (before deletion)
481
- const txsToArchive = [];
563
+ // Step 2: Archive in chunks if archiving is enabled. Hydrating an entire epoch's worth of
564
+ // mined txs at once would OOM under load. When archiving is disabled there is no need to hydrate the txs at all.
482
565
  if (this.#archive.isEnabled()) {
483
- for (const txHashStr of minedTxsToFinalize){
484
- const buffer = await this.#txsDB.getAsync(txHashStr);
485
- if (buffer) {
486
- txsToArchive.push(Tx.fromBuffer(buffer));
566
+ for(let i = 0; i < minedTxsToFinalize.length; i += FINALIZE_BLOCK_CHUNK_SIZE){
567
+ const chunk = minedTxsToFinalize.slice(i, i + FINALIZE_BLOCK_CHUNK_SIZE);
568
+ const txsToArchive = [];
569
+ for (const txHashStr of chunk){
570
+ const buffer = await this.#txsDB.getAsync(txHashStr);
571
+ if (buffer) {
572
+ txsToArchive.push(Tx.fromBuffer(buffer));
573
+ }
574
+ }
575
+ if (txsToArchive.length > 0) {
576
+ await this.#archive.archiveTxs(txsToArchive);
487
577
  }
488
578
  }
489
579
  }
490
- // Step 3: Delete mined txs from active pool
491
- await this.#deleteTxsBatch(minedTxsToFinalize);
492
- // Step 4: Finalize soft-deleted txs
493
- await this.#deletedPool.finalizeBlock(blockNumber);
494
- // Step 5: Archive mined txs
495
- if (txsToArchive.length > 0) {
496
- await this.#archive.archiveTxs(txsToArchive);
497
- }
580
+ // Step 3: Delete mined txs from the active pool and finalize soft-deleted txs in one
581
+ // transaction. Only tx hashes are touched here, so memory is bounded and atomicity is preserved.
582
+ await this.#store.transactionAsync(async ()=>{
583
+ await this.#deleteTxsBatch(minedTxsToFinalize);
584
+ await this.#deletedPool.finalizeBlock(blockNumber);
585
+ });
498
586
  if (minedTxsToFinalize.length > 0) {
499
587
  this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
500
588
  txHashes: minedTxsToFinalize
@@ -610,9 +698,9 @@ import { TxPoolIndices } from './tx_pool_indices.js';
610
698
  /**
611
699
  * Adds a new transaction to the pool with the specified state.
612
700
  * Emits onTxsAdded callback immediately after DB write.
613
- */ async #addTx(tx, state, opts = {}) {
701
+ */ async #addTx(tx, state, opts = {}, precomputedMeta) {
614
702
  const txHashStr = tx.getTxHash().toString();
615
- const meta = await buildTxMetaData(tx);
703
+ const meta = precomputedMeta ?? await buildTxMetaData(tx);
616
704
  meta.receivedAt = this.#dateProvider.now();
617
705
  await this.#txsDB.set(txHashStr, tx.toBuffer());
618
706
  await this.#deletedPool.clearSoftDeleted(txHashStr);
@@ -665,18 +753,10 @@ import { TxPoolIndices } from './tx_pool_indices.js';
665
753
  txHash: txHashStr,
666
754
  reason
667
755
  });
668
- this.#addToEvictedCache(txHashStr);
756
+ this.#evictedTxHashes.add(txHashStr);
669
757
  }
670
758
  await this.#deleteTxsBatch(txHashes);
671
759
  }
672
- /** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */ #addToEvictedCache(txHashStr) {
673
- if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
674
- // FIFO eviction: remove the first (oldest) entry
675
- const oldest = this.#evictedTxHashes.values().next().value;
676
- this.#evictedTxHashes.delete(oldest);
677
- }
678
- this.#evictedTxHashes.add(txHashStr);
679
- }
680
760
  // ============================================================================
681
761
  // PRIVATE HELPERS - Validation & Conflict Resolution
682
762
  // ============================================================================
@@ -757,50 +837,6 @@ import { TxPoolIndices } from './tx_pool_indices.js';
757
837
  hash: txEffect.l2BlockHash.toString()
758
838
  };
759
839
  }
760
- /** Loads all transactions from the database, returning loaded txs and deserialization errors */ async #loadAllTxsFromDb() {
761
- const loaded = [];
762
- const errors = [];
763
- for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()){
764
- // Skip soft-deleted transactions - they stay in DB but not in indices
765
- if (this.#deletedPool.isSoftDeleted(txHashStr)) {
766
- continue;
767
- }
768
- try {
769
- const tx = Tx.fromBuffer(buffer);
770
- const meta = await buildTxMetaData(tx);
771
- loaded.push({
772
- tx,
773
- meta
774
- });
775
- } catch (err) {
776
- this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, {
777
- err
778
- });
779
- errors.push(txHashStr);
780
- }
781
- }
782
- return {
783
- loaded,
784
- errors
785
- };
786
- }
787
- /** Queries block source and marks mined status on transaction metadata */ async #markMinedStatusBatch(metas) {
788
- for (const meta of metas){
789
- try {
790
- const txEffect = await this.#l2BlockSource.getTxEffect(TxHash.fromString(meta.txHash));
791
- if (txEffect) {
792
- meta.minedL2BlockId = {
793
- number: txEffect.l2BlockNumber,
794
- hash: txEffect.l2BlockHash.toString()
795
- };
796
- }
797
- } catch (err) {
798
- this.#log.warn(`Failed to check mined status for tx ${meta.txHash}`, {
799
- err
800
- });
801
- }
802
- }
803
- }
804
840
  /**
805
841
  * Rebuilds the pending pool by processing each tx through pre-add rules.
806
842
  * Starts with an empty pending pool and adds txs one by one, resolving conflicts.