@aztec/p2p 0.0.1-commit.0c875d939 → 0.0.1-commit.0dc957cde

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 (417) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +8 -7
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +34 -29
  5. package/dest/client/interface.d.ts +18 -20
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +9 -19
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +81 -104
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +23 -10
  11. package/dest/config.d.ts +126 -103
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +93 -39
  14. package/dest/errors/p2p-service.error.d.ts +9 -0
  15. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  16. package/dest/errors/p2p-service.error.js +10 -0
  17. package/dest/errors/tx-pool.error.d.ts +8 -0
  18. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  19. package/dest/errors/tx-pool.error.js +9 -0
  20. package/dest/index.d.ts +1 -2
  21. package/dest/index.d.ts.map +1 -1
  22. package/dest/index.js +0 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  24. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  26. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  27. package/dest/mem_pools/index.d.ts +1 -2
  28. package/dest/mem_pools/index.d.ts.map +1 -1
  29. package/dest/mem_pools/instrumentation.d.ts +4 -2
  30. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  31. package/dest/mem_pools/instrumentation.js +16 -14
  32. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -1
  33. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +9 -0
  35. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  36. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  38. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  42. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
  44. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
  45. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  49. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  51. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +4 -4
  54. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -7
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +12 -6
  58. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  59. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  61. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  62. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  64. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  65. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  66. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  67. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  68. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  69. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  70. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +27 -10
  71. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
  73. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +57 -15
  74. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +115 -20
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +5 -2
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +38 -46
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +12 -5
  82. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +12 -5
  83. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  84. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +297 -153
  85. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  86. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  88. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  89. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  90. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  91. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  92. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  93. package/dest/msg_validators/clock_tolerance.js +54 -3
  94. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  95. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  97. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  98. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  100. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  101. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  103. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  104. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  106. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  107. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  109. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  110. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  111. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  112. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  113. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  114. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  115. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  116. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  117. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  119. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  120. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/factory.js +247 -60
  122. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  123. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  125. package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
  126. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  128. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  129. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/index.js +2 -0
  131. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  132. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  133. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  134. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  135. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  136. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  137. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  138. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  140. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  141. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  142. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  143. package/dest/services/data_store.d.ts +1 -1
  144. package/dest/services/data_store.d.ts.map +1 -1
  145. package/dest/services/data_store.js +5 -5
  146. package/dest/services/dummy_service.d.ts +8 -5
  147. package/dest/services/dummy_service.d.ts.map +1 -1
  148. package/dest/services/dummy_service.js +10 -5
  149. package/dest/services/encoding.d.ts +6 -2
  150. package/dest/services/encoding.d.ts.map +1 -1
  151. package/dest/services/encoding.js +16 -9
  152. package/dest/services/gossipsub/topic_score_params.d.ts +30 -7
  153. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  154. package/dest/services/gossipsub/topic_score_params.js +53 -14
  155. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  156. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  157. package/dest/services/libp2p/instrumentation.js +14 -0
  158. package/dest/services/libp2p/libp2p_service.d.ts +32 -37
  159. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  160. package/dest/services/libp2p/libp2p_service.js +241 -212
  161. package/dest/services/peer-manager/metrics.d.ts +3 -1
  162. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  163. package/dest/services/peer-manager/metrics.js +6 -0
  164. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  165. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  166. package/dest/services/peer-manager/peer_manager.js +39 -11
  167. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  168. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  169. package/dest/services/peer-manager/peer_scoring.js +32 -10
  170. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  171. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  172. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  173. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  174. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  175. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  176. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  178. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  179. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  180. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  181. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  182. package/dest/services/reqresp/config.d.ts +3 -3
  183. package/dest/services/reqresp/config.d.ts.map +1 -1
  184. package/dest/services/reqresp/interface.d.ts +14 -9
  185. package/dest/services/reqresp/interface.d.ts.map +1 -1
  186. package/dest/services/reqresp/interface.js +10 -11
  187. package/dest/services/reqresp/metrics.d.ts +1 -1
  188. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  189. package/dest/services/reqresp/metrics.js +0 -1
  190. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  191. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/index.js +0 -1
  193. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  194. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  195. package/dest/services/reqresp/protocols/tx.js +1 -3
  196. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  197. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  199. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  200. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  201. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  202. package/dest/services/reqresp/reqresp.d.ts +4 -2
  203. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  204. package/dest/services/reqresp/reqresp.js +30 -12
  205. package/dest/services/service.d.ts +9 -4
  206. package/dest/services/service.d.ts.map +1 -1
  207. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  208. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  210. package/dest/services/tx_collection/file_store_tx_collection.d.ts +1 -1
  211. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  212. package/dest/services/tx_collection/file_store_tx_collection.js +4 -2
  213. package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
  214. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  215. package/dest/services/tx_collection/file_store_tx_source.js +50 -9
  216. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  217. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  218. package/dest/services/tx_collection/instrumentation.js +2 -1
  219. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  220. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  221. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  222. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  223. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  224. package/dest/services/tx_collection/request_tracker.js +84 -0
  225. package/dest/services/tx_collection/slow_tx_collection.d.ts +2 -2
  226. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  227. package/dest/services/tx_collection/slow_tx_collection.js +10 -8
  228. package/dest/services/tx_collection/tx_collection.d.ts +5 -7
  229. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  230. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  231. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  232. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  233. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  234. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  235. package/dest/services/tx_collection/tx_source.js +26 -7
  236. package/dest/services/tx_file_store/tx_file_store.js +1 -1
  237. package/dest/services/tx_provider.d.ts +3 -3
  238. package/dest/services/tx_provider.d.ts.map +1 -1
  239. package/dest/services/tx_provider.js +4 -4
  240. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  241. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  242. package/dest/test-helpers/make-test-p2p-clients.js +4 -2
  243. package/dest/test-helpers/mock-pubsub.d.ts +14 -6
  244. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  245. package/dest/test-helpers/mock-pubsub.js +43 -12
  246. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  247. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  248. package/dest/test-helpers/reqresp-nodes.js +6 -4
  249. package/dest/test-helpers/testbench-utils.d.ts +6 -3
  250. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  251. package/dest/test-helpers/testbench-utils.js +24 -4
  252. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  253. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  254. package/dest/testbench/p2p_client_testbench_worker.js +83 -26
  255. package/dest/testbench/worker_client_manager.d.ts +10 -1
  256. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  257. package/dest/testbench/worker_client_manager.js +55 -3
  258. package/dest/util.d.ts +3 -3
  259. package/dest/util.d.ts.map +1 -1
  260. package/package.json +14 -14
  261. package/src/client/factory.ts +62 -49
  262. package/src/client/interface.ts +20 -21
  263. package/src/client/p2p_client.ts +89 -135
  264. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +35 -14
  265. package/src/config.ts +139 -45
  266. package/src/errors/p2p-service.error.ts +11 -0
  267. package/src/errors/tx-pool.error.ts +12 -0
  268. package/src/index.ts +0 -1
  269. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  270. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  271. package/src/mem_pools/index.ts +0 -3
  272. package/src/mem_pools/instrumentation.ts +17 -13
  273. package/src/mem_pools/tx_pool_v2/README.md +10 -2
  274. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +11 -0
  275. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  276. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -4
  277. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  278. package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
  279. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  280. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  281. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -4
  282. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  283. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +12 -9
  284. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  285. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  286. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  287. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  288. package/src/mem_pools/tx_pool_v2/interfaces.ts +27 -10
  289. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +166 -28
  290. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -46
  291. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +28 -8
  292. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +332 -149
  293. package/src/msg_validators/attestation_validator/README.md +49 -0
  294. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  295. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  296. package/src/msg_validators/clock_tolerance.ts +72 -3
  297. package/src/msg_validators/proposal_validator/README.md +123 -0
  298. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  299. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  300. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  301. package/src/msg_validators/tx_validator/README.md +127 -0
  302. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  303. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  304. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  305. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  306. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  307. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  308. package/src/msg_validators/tx_validator/factory.ts +396 -78
  309. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  310. package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
  311. package/src/msg_validators/tx_validator/index.ts +2 -0
  312. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  313. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  314. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  315. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  316. package/src/services/data_store.ts +5 -13
  317. package/src/services/dummy_service.ts +13 -7
  318. package/src/services/encoding.ts +16 -8
  319. package/src/services/gossipsub/README.md +29 -14
  320. package/src/services/gossipsub/topic_score_params.ts +85 -17
  321. package/src/services/libp2p/instrumentation.ts +14 -0
  322. package/src/services/libp2p/libp2p_service.ts +259 -238
  323. package/src/services/peer-manager/metrics.ts +7 -0
  324. package/src/services/peer-manager/peer_manager.ts +45 -11
  325. package/src/services/peer-manager/peer_scoring.ts +27 -5
  326. package/src/services/reqresp/README.md +229 -0
  327. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  328. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  329. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  330. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  331. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  332. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  333. package/src/services/reqresp/config.ts +2 -2
  334. package/src/services/reqresp/interface.ts +21 -11
  335. package/src/services/reqresp/metrics.ts +0 -1
  336. package/src/services/reqresp/protocols/index.ts +0 -1
  337. package/src/services/reqresp/protocols/tx.ts +1 -3
  338. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  339. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  340. package/src/services/reqresp/reqresp.ts +40 -13
  341. package/src/services/service.ts +17 -3
  342. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  343. package/src/services/tx_collection/file_store_tx_collection.ts +7 -3
  344. package/src/services/tx_collection/file_store_tx_source.ts +65 -9
  345. package/src/services/tx_collection/instrumentation.ts +7 -1
  346. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  347. package/src/services/tx_collection/request_tracker.ts +127 -0
  348. package/src/services/tx_collection/slow_tx_collection.ts +8 -9
  349. package/src/services/tx_collection/tx_collection.ts +5 -6
  350. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  351. package/src/services/tx_collection/tx_source.ts +28 -8
  352. package/src/services/tx_file_store/tx_file_store.ts +1 -1
  353. package/src/services/tx_provider.ts +2 -2
  354. package/src/test-helpers/make-test-p2p-clients.ts +3 -3
  355. package/src/test-helpers/mock-pubsub.ts +47 -11
  356. package/src/test-helpers/reqresp-nodes.ts +7 -8
  357. package/src/test-helpers/testbench-utils.ts +33 -6
  358. package/src/testbench/p2p_client_testbench_worker.ts +92 -29
  359. package/src/testbench/worker_client_manager.ts +68 -6
  360. package/src/util.ts +8 -2
  361. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  362. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  363. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  364. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  365. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  366. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  367. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  368. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  369. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  370. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  371. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  372. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  373. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  374. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  375. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  376. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  377. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  378. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  379. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  380. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  381. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  382. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  383. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  384. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  385. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  386. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  387. package/dest/mem_pools/tx_pool/index.js +0 -2
  388. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  389. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  390. package/dest/mem_pools/tx_pool/priority.js +0 -15
  391. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  392. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  393. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  394. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  395. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  396. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  397. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  398. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  399. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  400. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  401. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  402. package/dest/services/reqresp/protocols/block.js +0 -32
  403. package/src/mem_pools/tx_pool/README.md +0 -270
  404. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  405. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  406. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  407. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  408. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  409. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  410. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  411. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  412. package/src/mem_pools/tx_pool/index.ts +0 -2
  413. package/src/mem_pools/tx_pool/priority.ts +0 -20
  414. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  415. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  416. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  417. package/src/services/reqresp/protocols/block.ts +0 -37
@@ -6,7 +6,8 @@ import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
6
6
  import { Tx, TxHash } from '@aztec/stdlib/tx';
7
7
  import { TxArchive } from './archive/index.js';
8
8
  import { DeletedPool } from './deleted_pool.js';
9
- import { EvictionManager, FeePayerBalanceEvictionRule, FeePayerBalancePreAddRule, InvalidTxsAfterMiningRule, InvalidTxsAfterReorgRule, LowPriorityEvictionRule, LowPriorityPreAddRule, NullifierConflictRule } from './eviction/index.js';
9
+ import { EvictionManager, FeePayerBalanceEvictionRule, FeePayerBalancePreAddRule, InsufficientFeePerGasEvictionRule, InvalidTxsAfterMiningRule, InvalidTxsAfterReorgRule, LowPriorityEvictionRule, LowPriorityPreAddRule, NullifierConflictRule, TxPoolRejectionCode } from './eviction/index.js';
10
+ import { TxPoolV2Instrumentation } from './instrumentation.js';
10
11
  import { DEFAULT_TX_POOL_V2_CONFIG } from './interfaces.js';
11
12
  import { buildTxMetaData, checkNullifierConflict } from './tx_metadata.js';
12
13
  import { TxPoolIndices } from './tx_pool_indices.js';
@@ -22,6 +23,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
22
23
  #l2BlockSource;
23
24
  #worldStateSynchronizer;
24
25
  #createTxValidator;
26
+ #checkAllowedSetupCalls;
25
27
  // === In-Memory Indices ===
26
28
  #indices = new TxPoolIndices();
27
29
  // === Config & Services ===
@@ -30,14 +32,17 @@ import { TxPoolIndices } from './tx_pool_indices.js';
30
32
  #deletedPool;
31
33
  #evictionManager;
32
34
  #dateProvider;
35
+ #instrumentation;
36
+ #evictedTxHashes = new Set();
33
37
  #log;
34
38
  #callbacks;
35
- constructor(store, archiveStore, deps, callbacks, config = {}, dateProvider, log){
39
+ constructor(store, archiveStore, deps, callbacks, telemetry, config = {}, dateProvider, log){
36
40
  this.#store = store;
37
41
  this.#txsDB = store.openMap('txs');
38
42
  this.#l2BlockSource = deps.l2BlockSource;
39
43
  this.#worldStateSynchronizer = deps.worldStateSynchronizer;
40
44
  this.#createTxValidator = deps.createTxValidator;
45
+ this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
41
46
  this.#config = {
42
47
  ...DEFAULT_TX_POOL_V2_CONFIG,
43
48
  ...config
@@ -45,6 +50,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
45
50
  this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
46
51
  this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
47
52
  this.#dateProvider = dateProvider;
53
+ this.#instrumentation = new TxPoolV2Instrumentation(telemetry, ()=>this.#indices.getTotalMetadataBytes());
48
54
  this.#log = log;
49
55
  this.#callbacks = callbacks;
50
56
  // Setup eviction manager with rules
@@ -57,6 +63,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
57
63
  }));
58
64
  // Post-event eviction rules (run after events to check ALL pending txs)
59
65
  this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
66
+ this.#evictionManager.registerRule(new InsufficientFeePerGasEvictionRule(deps.blockMinFeesProvider));
60
67
  this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(deps.worldStateSynchronizer));
61
68
  this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(deps.worldStateSynchronizer));
62
69
  // LowPriorityEvictionRule handles cases where txs become pending via prepareForSlot (unprotect)
@@ -122,8 +129,35 @@ import { TxPoolIndices } from './tx_pool_indices.js';
122
129
  const accepted = [];
123
130
  const ignored = [];
124
131
  const rejected = [];
132
+ const errors = new Map();
125
133
  const acceptedPending = new Set();
134
+ // Phase 1: Pre-compute all throwable I/O outside the transaction.
135
+ // If any pre-computation throws, the entire call fails before mutations happen.
136
+ const precomputed = new Map();
137
+ const validator = await this.#createTxValidator();
138
+ for (const tx of txs){
139
+ const txHash = tx.getTxHash();
140
+ const txHashStr = txHash.toString();
141
+ const meta = await buildTxMetaData(tx);
142
+ const minedBlockId = await this.#getMinedBlockId(txHash);
143
+ // Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction)
144
+ let isValid = true;
145
+ if (!minedBlockId) {
146
+ isValid = await this.#validateMeta(meta, validator);
147
+ }
148
+ precomputed.set(txHashStr, {
149
+ meta,
150
+ minedBlockId,
151
+ isValid
152
+ });
153
+ }
154
+ // Phase 2: Apply mutations inside the transaction using only pre-computed results,
155
+ // in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
126
156
  const poolAccess = this.#createPreAddPoolAccess();
157
+ const preAddContext = opts.feeComparisonOnly !== undefined ? {
158
+ feeComparisonOnly: opts.feeComparisonOnly,
159
+ priceBumpPercentage: this.#config.priceBumpPercentage
160
+ } : undefined;
127
161
  await this.#store.transactionAsync(async ()=>{
128
162
  for (const tx of txs){
129
163
  const txHash = tx.getTxHash();
@@ -133,85 +167,112 @@ import { TxPoolIndices } from './tx_pool_indices.js';
133
167
  ignored.push(txHash);
134
168
  continue;
135
169
  }
136
- // Check mined status first (applies to all paths)
137
- const minedBlockId = await this.#getMinedBlockId(txHash);
170
+ const { meta, minedBlockId, isValid } = precomputed.get(txHashStr);
138
171
  const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr);
139
172
  if (minedBlockId) {
140
173
  // Already mined - add directly (protection already set if pre-protected)
141
174
  await this.#addTx(tx, {
142
175
  mined: minedBlockId
143
- }, opts);
176
+ }, opts, meta);
144
177
  accepted.push(txHash);
145
178
  } else if (preProtectedSlot !== undefined) {
146
179
  // Pre-protected and not mined - add as protected (bypass validation)
147
180
  await this.#addTx(tx, {
148
181
  protected: preProtectedSlot
149
- }, opts);
182
+ }, opts, meta);
150
183
  accepted.push(txHash);
184
+ } else if (!isValid) {
185
+ // Failed pre-computed validation
186
+ rejected.push(txHash);
151
187
  } else {
152
- // Regular pending tx - validate and run pre-add rules
153
- const result = await this.#tryAddRegularPendingTx(tx, opts, poolAccess, acceptedPending, ignored);
188
+ // Regular pending tx - run pre-add rules using pre-computed metadata
189
+ const result = await this.#tryAddRegularPendingTx(tx, meta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext);
154
190
  if (result.status === 'accepted') {
155
191
  acceptedPending.add(txHashStr);
156
- } else if (result.status === 'rejected') {
157
- rejected.push(txHash);
158
192
  } else {
159
193
  ignored.push(txHash);
160
194
  }
161
195
  }
162
196
  }
197
+ // Run post-add eviction rules for pending txs (inside transaction for atomicity)
198
+ if (acceptedPending.size > 0) {
199
+ const feePayers = Array.from(acceptedPending).map((txHash)=>this.#indices.getMetadata(txHash).feePayer);
200
+ const uniqueFeePayers = new Set(feePayers);
201
+ await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [
202
+ ...uniqueFeePayers
203
+ ]);
204
+ }
163
205
  });
164
206
  // Build final accepted list for pending txs (excludes intra-batch evictions)
165
207
  for (const txHashStr of acceptedPending){
166
208
  accepted.push(TxHash.fromString(txHashStr));
167
209
  }
168
- // Run post-add eviction rules for pending txs
169
- if (acceptedPending.size > 0) {
170
- const feePayers = Array.from(acceptedPending).map((txHash)=>this.#indices.getMetadata(txHash).feePayer);
171
- const uniqueFeePayers = new Set(feePayers);
172
- await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [
173
- ...uniqueFeePayers
174
- ]);
210
+ // Record metrics
211
+ if (ignored.length > 0) {
212
+ this.#instrumentation.recordIgnored(ignored.length);
213
+ }
214
+ if (rejected.length > 0) {
215
+ this.#instrumentation.recordRejected(rejected.length);
175
216
  }
176
217
  return {
177
218
  accepted,
178
219
  ignored,
179
- rejected
220
+ rejected,
221
+ ...errors.size > 0 ? {
222
+ errors
223
+ } : {}
180
224
  };
181
225
  }
182
- /** Validates and adds a regular pending tx. Returns status. */ async #tryAddRegularPendingTx(tx, opts, poolAccess, acceptedPending, ignored) {
183
- const txHash = tx.getTxHash();
184
- const txHashStr = txHash.toString();
185
- // Build metadata and validate using metadata
186
- const meta = await buildTxMetaData(tx);
187
- if (!await this.#validateMeta(meta)) {
188
- return {
189
- status: 'rejected'
190
- };
191
- }
226
+ /** Adds a validated pending tx, running pre-add rules and evicting conflicts. */ async #tryAddRegularPendingTx(tx, precomputedMeta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext) {
227
+ const txHashStr = tx.getTxHash().toString();
192
228
  // Run pre-add rules
193
- const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
229
+ const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext);
194
230
  if (preAddResult.shouldIgnore) {
195
- this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason}`);
231
+ this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`);
232
+ if (preAddResult.reason && preAddResult.reason.code !== TxPoolRejectionCode.INTERNAL_ERROR) {
233
+ errors.set(txHashStr, preAddResult.reason);
234
+ }
196
235
  return {
197
236
  status: 'ignored'
198
237
  };
199
238
  }
200
- // Evict conflicts
201
- for (const evictHashStr of preAddResult.txHashesToEvict){
202
- await this.#deleteTx(evictHashStr);
203
- this.#log.debug(`Evicted tx ${evictHashStr} due to higher-fee tx ${txHashStr}`, {
204
- evictedTxHash: evictHashStr,
205
- replacementTxHash: txHashStr
206
- });
207
- if (acceptedPending.has(evictHashStr)) {
208
- // Evicted tx was from this batch - mark as ignored in result
209
- acceptedPending.delete(evictHashStr);
210
- ignored.push(TxHash.fromString(evictHashStr));
239
+ // Evict conflicts, grouped by rule name for metrics
240
+ if (preAddResult.evictions && preAddResult.evictions.length > 0) {
241
+ const byReason = new Map();
242
+ for (const { txHash: evictHash, reason } of preAddResult.evictions){
243
+ const group = byReason.get(reason);
244
+ if (group) {
245
+ group.push(evictHash);
246
+ } else {
247
+ byReason.set(reason, [
248
+ evictHash
249
+ ]);
250
+ }
251
+ }
252
+ for (const [reason, hashes] of byReason){
253
+ await this.#evictTxs(hashes, reason);
211
254
  }
255
+ for (const evictHashStr of preAddResult.txHashesToEvict){
256
+ this.#log.debug(`Evicted tx ${evictHashStr} due to higher-fee tx ${txHashStr}`, {
257
+ evictedTxHash: evictHashStr,
258
+ replacementTxHash: txHashStr
259
+ });
260
+ if (acceptedPending.has(evictHashStr)) {
261
+ // Evicted tx was from this batch - mark as ignored in result
262
+ acceptedPending.delete(evictHashStr);
263
+ ignored.push(TxHash.fromString(evictHashStr));
264
+ }
265
+ }
266
+ }
267
+ // Randomly drop the transaction for testing purposes (report as accepted so it propagates)
268
+ if (this.#config.dropTransactionsProbability > 0 && Math.random() < this.#config.dropTransactionsProbability) {
269
+ this.#log.debug(`Dropping tx ${txHashStr} (simulated drop for testing)`);
270
+ return {
271
+ status: 'accepted'
272
+ };
212
273
  }
213
274
  // Add the transaction
214
- await this.#addTx(tx, 'pending', opts);
275
+ await this.#addTx(tx, 'pending', opts, precomputedMeta);
215
276
  return {
216
277
  status: 'accepted'
217
278
  };
@@ -220,38 +281,44 @@ import { TxPoolIndices } from './tx_pool_indices.js';
220
281
  const txHashStr = tx.getTxHash().toString();
221
282
  // Check if already in pool
222
283
  if (this.#indices.has(txHashStr)) {
284
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
223
285
  return 'ignored';
224
286
  }
225
- // Build metadata and validate using metadata
287
+ // Build metadata and check pre-add rules
226
288
  const meta = await buildTxMetaData(tx);
227
- const validationResult = await this.#validateMeta(meta, undefined, 'can add pending');
228
- if (validationResult !== true) {
229
- return 'rejected';
230
- }
231
- // Use pre-add rules
232
289
  const poolAccess = this.#createPreAddPoolAccess();
233
290
  const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
234
- return preAddResult.shouldIgnore ? 'ignored' : 'accepted';
291
+ if (preAddResult.shouldIgnore) {
292
+ this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
293
+ reason: preAddResult.reason?.message ?? 'no reason provided'
294
+ });
295
+ return 'ignored';
296
+ }
297
+ return 'accepted';
235
298
  }
236
299
  async addProtectedTxs(txs, block, opts) {
237
300
  const slotNumber = block.globalVariables.slotNumber;
301
+ // Precompute setup-call allow-list flags outside the store transaction
302
+ const allowedFlags = await Promise.all(txs.map((tx)=>this.#checkAllowedSetupCalls(tx)));
238
303
  await this.#store.transactionAsync(async ()=>{
239
- for (const tx of txs){
304
+ for(let i = 0; i < txs.length; i++){
305
+ const tx = txs[i];
240
306
  const txHash = tx.getTxHash();
241
307
  const txHashStr = txHash.toString();
242
308
  const isNew = !this.#indices.has(txHashStr);
243
309
  const minedBlockId = await this.#getMinedBlockId(txHash);
244
310
  if (isNew) {
311
+ const meta = await buildTxMetaData(tx, allowedFlags[i]);
245
312
  // New tx - add as mined or protected (callback emitted by #addTx)
246
313
  if (minedBlockId) {
247
314
  await this.#addTx(tx, {
248
315
  mined: minedBlockId
249
- }, opts);
316
+ }, opts, meta);
250
317
  this.#indices.setProtection(txHashStr, slotNumber);
251
318
  } else {
252
319
  await this.#addTx(tx, {
253
320
  protected: slotNumber
254
- }, opts);
321
+ }, opts, meta);
255
322
  }
256
323
  } else {
257
324
  // Existing tx - update protection and mined status
@@ -264,20 +331,53 @@ import { TxPoolIndices } from './tx_pool_indices.js';
264
331
  }
265
332
  });
266
333
  }
267
- protectTxs(txHashes, block) {
334
+ async protectTxs(txHashes, block) {
268
335
  const slotNumber = block.globalVariables.slotNumber;
269
336
  const missing = [];
270
- for (const txHash of txHashes){
271
- const txHashStr = txHash.toString();
272
- if (this.#indices.has(txHashStr)) {
273
- // Update protection for existing tx
274
- this.#indices.updateProtection(txHashStr, slotNumber);
275
- } else {
276
- // Pre-record protection for tx we don't have yet
277
- this.#indices.setProtection(txHashStr, slotNumber);
278
- missing.push(txHash);
337
+ let softDeletedHits = 0;
338
+ let missingPreviouslyEvicted = 0;
339
+ await this.#store.transactionAsync(async ()=>{
340
+ for (const txHash of txHashes){
341
+ const txHashStr = txHash.toString();
342
+ if (this.#indices.has(txHashStr)) {
343
+ // Update protection for existing tx
344
+ this.#indices.updateProtection(txHashStr, slotNumber);
345
+ } else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
346
+ // Resurrect soft-deleted tx as protected
347
+ const buffer = await this.#txsDB.getAsync(txHashStr);
348
+ if (buffer) {
349
+ const tx = Tx.fromBuffer(buffer);
350
+ await this.#addTx(tx, {
351
+ protected: slotNumber
352
+ });
353
+ softDeletedHits++;
354
+ } else {
355
+ // Data missing despite soft-delete flag — treat as truly missing
356
+ this.#indices.setProtection(txHashStr, slotNumber);
357
+ missing.push(txHash);
358
+ }
359
+ } else {
360
+ // Truly missing — pre-record protection for tx we don't have yet
361
+ this.#indices.setProtection(txHashStr, slotNumber);
362
+ missing.push(txHash);
363
+ if (this.#evictedTxHashes.has(txHashStr)) {
364
+ missingPreviouslyEvicted++;
365
+ }
366
+ }
279
367
  }
368
+ });
369
+ // Record metrics
370
+ if (softDeletedHits > 0) {
371
+ this.#instrumentation.recordSoftDeletedHits(softDeletedHits);
280
372
  }
373
+ if (missing.length > 0) {
374
+ this.#log.debug(`protectTxs missing tx hashes: ${missing.map((h)=>h.toString()).join(', ')}`);
375
+ this.#instrumentation.recordMissingOnProtect(missing.length);
376
+ }
377
+ if (missingPreviouslyEvicted > 0) {
378
+ this.#instrumentation.recordMissingPreviouslyEvicted(missingPreviouslyEvicted);
379
+ }
380
+ this.#log.info(`Protected ${txHashes.length} txs, missing: ${missing.length}, soft-deleted hits: ${softDeletedHits}`);
281
381
  return missing;
282
382
  }
283
383
  async addMinedTxs(txs, block, opts) {
@@ -316,47 +416,53 @@ import { TxPoolIndices } from './tx_pool_indices.js';
316
416
  found.push(meta);
317
417
  }
318
418
  }
319
- // Step 4: Mark txs as mined (only those we have in the pool)
320
- for (const meta of found){
321
- this.#indices.markAsMined(meta, blockId);
322
- await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
419
+ await this.#store.transactionAsync(async ()=>{
420
+ // Step 4: Mark txs as mined (only those we have in the pool)
421
+ for (const meta of found){
422
+ this.#indices.markAsMined(meta, blockId);
423
+ await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
424
+ }
425
+ // Step 5: Run post-event eviction rules (inside transaction for atomicity)
426
+ await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
427
+ });
428
+ if (found.length > 0) {
429
+ this.#callbacks.onTxsMined(found.map((m)=>m.txHash));
323
430
  }
324
- // Step 5: Run eviction rules (remove pending txs with conflicting nullifiers/expired timestamps)
325
- await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
326
431
  this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
327
432
  }
328
433
  async prepareForSlot(slotNumber) {
329
- // Step 0: Clean up slot-deleted txs from previous slots
330
- await this.#deletedPool.cleanupSlotDeleted(slotNumber);
331
- // Step 1: Find expired protected txs
332
- const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
333
- // Step 2: Clear protection for all expired entries (including those without metadata)
334
- this.#indices.clearProtection(expiredProtected);
335
- // Step 3: Filter to only txs that have metadata and are not mined
336
- const txsToRestore = this.#indices.filterRestorable(expiredProtected);
337
- if (txsToRestore.length === 0) {
338
- return;
339
- }
340
- this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
341
- // Step 4: Validate for pending pool
342
- const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
343
- // Step 5: Resolve nullifier conflicts and add winners to pending indices
344
- const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
345
- // Step 6: Delete invalid and evicted txs
346
- await this.#deleteTxsBatch([
347
- ...invalid,
348
- ...toEvict
349
- ]);
350
- // Step 7: Run eviction rules (enforce pool size limit)
351
- if (added.length > 0) {
352
- const feePayers = added.map((meta)=>meta.feePayer);
353
- const uniqueFeePayers = new Set(feePayers);
354
- await this.#evictionManager.evictAfterNewTxs(added.map((m)=>m.txHash), [
355
- ...uniqueFeePayers
356
- ]);
357
- }
434
+ await this.#store.transactionAsync(async ()=>{
435
+ // Step 0: Clean up slot-deleted txs from previous slots
436
+ await this.#deletedPool.cleanupSlotDeleted(slotNumber);
437
+ // Step 1: Find expired protected txs
438
+ const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
439
+ // Step 2: Clear protection for all expired entries (including those without metadata)
440
+ this.#indices.clearProtection(expiredProtected);
441
+ // Step 3: Filter to only txs that have metadata and are not mined
442
+ const txsToRestore = this.#indices.filterRestorable(expiredProtected);
443
+ if (txsToRestore.length === 0) {
444
+ this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
445
+ return;
446
+ }
447
+ this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
448
+ // Step 4: Validate for pending pool
449
+ const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
450
+ // Step 5: Resolve nullifier conflicts and add winners to pending indices
451
+ const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
452
+ // Step 6: Delete invalid txs and evict conflict losers
453
+ await this.#deleteTxsBatch(invalid);
454
+ await this.#evictTxs(toEvict, 'NullifierConflict');
455
+ // Step 7: Run eviction rules (enforce pool size limit)
456
+ if (added.length > 0) {
457
+ const feePayers = added.map((meta)=>meta.feePayer);
458
+ const uniqueFeePayers = new Set(feePayers);
459
+ await this.#evictionManager.evictAfterNewTxs(added.map((m)=>m.txHash), [
460
+ ...uniqueFeePayers
461
+ ]);
462
+ }
463
+ });
358
464
  }
359
- async handlePrunedBlocks(latestBlock) {
465
+ async handlePrunedBlocks(latestBlock, options) {
360
466
  // Step 1: Find transactions mined after the prune point
361
467
  const txsToUnmine = this.#indices.findTxsMinedAfter(latestBlock.number);
362
468
  if (txsToUnmine.length === 0) {
@@ -364,40 +470,48 @@ import { TxPoolIndices } from './tx_pool_indices.js';
364
470
  return;
365
471
  }
366
472
  this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`);
367
- // Step 2: Mark ALL un-mined txs with their original mined block number
368
- // This ensures they get soft-deleted if removed later, and only hard-deleted
369
- // when their original mined block is finalized
370
- await this.#deletedPool.markFromPrunedBlock(txsToUnmine.map((m)=>({
371
- txHash: m.txHash,
372
- minedAtBlock: BlockNumber(m.minedL2BlockId.number)
373
- })));
374
- // Step 3: Unmine - clear mined status from metadata
375
- for (const meta of txsToUnmine){
376
- this.#indices.markAsUnmined(meta);
377
- }
378
- // Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
379
- const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
380
- // Step 4: Validate for pending pool
381
- const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
382
- // Step 6: Resolve nullifier conflicts and add winners to pending indices
383
- const { toEvict } = this.#applyNullifierConflictResolution(valid);
384
- // Step 7: Delete invalid and evicted txs
385
- await this.#deleteTxsBatch([
386
- ...invalid,
387
- ...toEvict
388
- ]);
389
- 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`, {
390
- txHashesRestored: valid.map((m)=>m.txHash),
391
- txHashesInvalid: invalid,
392
- txHashesEvicted: toEvict
473
+ await this.#store.transactionAsync(async ()=>{
474
+ // Step 2: Mark ALL un-mined txs with their original mined block number
475
+ // This ensures they get soft-deleted if removed later, and only hard-deleted
476
+ // when their original mined block is finalized
477
+ await this.#deletedPool.markFromPrunedBlock(txsToUnmine.map((m)=>({
478
+ txHash: m.txHash,
479
+ minedAtBlock: BlockNumber(m.minedL2BlockId.number)
480
+ })));
481
+ // Step 3: Unmine - clear mined status from metadata
482
+ for (const meta of txsToUnmine){
483
+ this.#indices.markAsUnmined(meta);
484
+ }
485
+ // If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
486
+ if (options?.deleteAllTxs) {
487
+ const allTxHashes = txsToUnmine.map((m)=>m.txHash);
488
+ await this.#deleteTxsBatch(allTxHashes);
489
+ this.#log.info(`Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`);
490
+ return;
491
+ }
492
+ // Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
493
+ const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
494
+ // Step 5: Validate for pending pool
495
+ const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
496
+ // Step 6: Resolve nullifier conflicts and add winners to pending indices
497
+ const { toEvict } = this.#applyNullifierConflictResolution(valid);
498
+ // Step 7: Delete invalid txs and evict conflict losers
499
+ await this.#deleteTxsBatch(invalid);
500
+ await this.#evictTxs(toEvict, 'NullifierConflict');
501
+ 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`, {
502
+ txHashesRestored: valid.map((m)=>m.txHash),
503
+ txHashesInvalid: invalid,
504
+ txHashesEvicted: toEvict
505
+ });
506
+ // Step 8: Run eviction rules for ALL pending txs (not just restored ones)
507
+ // This handles cases like existing pending txs with invalid fee payer balances
508
+ await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
393
509
  });
394
- // Step 8: Run eviction rules for ALL pending txs (not just restored ones)
395
- // This handles cases like existing pending txs with invalid fee payer balances
396
- await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
397
510
  }
398
511
  async handleFailedExecution(txHashes) {
399
- // Delete failed txs
400
- await this.#deleteTxsBatch(txHashes.map((h)=>h.toString()));
512
+ await this.#store.transactionAsync(async ()=>{
513
+ await this.#deleteTxsBatch(txHashes.map((h)=>h.toString()));
514
+ });
401
515
  this.#log.info(`Deleted ${txHashes.length} failed txs`, {
402
516
  txHashes: txHashes.map((h)=>h.toString())
403
517
  });
@@ -406,24 +520,26 @@ import { TxPoolIndices } from './tx_pool_indices.js';
406
520
  const blockNumber = block.globalVariables.blockNumber;
407
521
  // Step 1: Find mined txs at or before finalized block
408
522
  const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
409
- // Step 2: Collect mined txs for archiving (before deletion)
410
- const txsToArchive = [];
411
- if (this.#archive.isEnabled()) {
412
- for (const txHashStr of minedTxsToFinalize){
413
- const buffer = await this.#txsDB.getAsync(txHashStr);
414
- if (buffer) {
415
- txsToArchive.push(Tx.fromBuffer(buffer));
523
+ await this.#store.transactionAsync(async ()=>{
524
+ // Step 2: Collect mined txs for archiving (before deletion)
525
+ const txsToArchive = [];
526
+ if (this.#archive.isEnabled()) {
527
+ for (const txHashStr of minedTxsToFinalize){
528
+ const buffer = await this.#txsDB.getAsync(txHashStr);
529
+ if (buffer) {
530
+ txsToArchive.push(Tx.fromBuffer(buffer));
531
+ }
416
532
  }
417
533
  }
418
- }
419
- // Step 3: Delete mined txs from active pool
420
- await this.#deleteTxsBatch(minedTxsToFinalize);
421
- // Step 4: Finalize soft-deleted txs
422
- await this.#deletedPool.finalizeBlock(blockNumber);
423
- // Step 5: Archive mined txs
424
- if (txsToArchive.length > 0) {
425
- await this.#archive.archiveTxs(txsToArchive);
426
- }
534
+ // Step 3: Delete mined txs from active pool
535
+ await this.#deleteTxsBatch(minedTxsToFinalize);
536
+ // Step 4: Finalize soft-deleted txs
537
+ await this.#deletedPool.finalizeBlock(blockNumber);
538
+ // Step 5: Archive mined txs
539
+ if (txsToArchive.length > 0) {
540
+ await this.#archive.archiveTxs(txsToArchive);
541
+ }
542
+ });
427
543
  if (minedTxsToFinalize.length > 0) {
428
544
  this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
429
545
  txHashes: minedTxsToFinalize
@@ -528,7 +644,10 @@ import { TxPoolIndices } from './tx_pool_indices.js';
528
644
  }
529
645
  // === Metrics ===
530
646
  countTxs() {
531
- return this.#indices.countTxs();
647
+ return {
648
+ ...this.#indices.countTxs(),
649
+ softDeleted: this.#deletedPool.getSoftDeletedCount()
650
+ };
532
651
  }
533
652
  // ============================================================================
534
653
  // PRIVATE HELPERS - Transaction Management
@@ -536,9 +655,9 @@ import { TxPoolIndices } from './tx_pool_indices.js';
536
655
  /**
537
656
  * Adds a new transaction to the pool with the specified state.
538
657
  * Emits onTxsAdded callback immediately after DB write.
539
- */ async #addTx(tx, state, opts = {}) {
658
+ */ async #addTx(tx, state, opts = {}, precomputedMeta) {
540
659
  const txHashStr = tx.getTxHash().toString();
541
- const meta = await buildTxMetaData(tx);
660
+ const meta = precomputedMeta ?? await buildTxMetaData(tx);
542
661
  meta.receivedAt = this.#dateProvider.now();
543
662
  await this.#txsDB.set(txHashStr, tx.toBuffer());
544
663
  await this.#deletedPool.clearSoftDeleted(txHashStr);
@@ -554,9 +673,11 @@ import { TxPoolIndices } from './tx_pool_indices.js';
554
673
  this.#indices.addMined(meta);
555
674
  }
556
675
  const stateStr = typeof state === 'string' ? state : Object.keys(state)[0];
557
- this.#log.verbose(`Added ${stateStr} tx ${txHashStr}`, {
676
+ this.#log.debug(`Added tx ${txHashStr} as ${stateStr}`, {
558
677
  eventName: 'tx-added-to-pool',
559
- state: stateStr
678
+ txHash: txHashStr,
679
+ state: stateStr,
680
+ source: opts.source
560
681
  });
561
682
  return meta;
562
683
  }
@@ -579,6 +700,28 @@ import { TxPoolIndices } from './tx_pool_indices.js';
579
700
  await this.#deleteTx(txHashStr);
580
701
  }
581
702
  }
703
+ /** Evicts transactions: records eviction metric with reason, caches hashes, then deletes. */ async #evictTxs(txHashes, reason) {
704
+ if (txHashes.length === 0) {
705
+ return;
706
+ }
707
+ this.#instrumentation.recordEvictions(txHashes.length, reason);
708
+ for (const txHashStr of txHashes){
709
+ this.#log.debug(`Evicting tx ${txHashStr}`, {
710
+ txHash: txHashStr,
711
+ reason
712
+ });
713
+ this.#addToEvictedCache(txHashStr);
714
+ }
715
+ await this.#deleteTxsBatch(txHashes);
716
+ }
717
+ /** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */ #addToEvictedCache(txHashStr) {
718
+ if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
719
+ // FIFO eviction: remove the first (oldest) entry
720
+ const oldest = this.#evictedTxHashes.values().next().value;
721
+ this.#evictedTxHashes.delete(oldest);
722
+ }
723
+ this.#evictedTxHashes.add(txHashStr);
724
+ }
582
725
  // ============================================================================
583
726
  // PRIVATE HELPERS - Validation & Conflict Resolution
584
727
  // ============================================================================
@@ -669,7 +812,8 @@ import { TxPoolIndices } from './tx_pool_indices.js';
669
812
  }
670
813
  try {
671
814
  const tx = Tx.fromBuffer(buffer);
672
- const meta = await buildTxMetaData(tx);
815
+ const allowedSetupCalls = await this.#checkAllowedSetupCalls(tx);
816
+ const meta = await buildTxMetaData(tx, allowedSetupCalls);
673
817
  loaded.push({
674
818
  tx,
675
819
  meta
@@ -717,7 +861,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
717
861
  if (preAddResult.shouldIgnore) {
718
862
  // Transaction rejected - mark for deletion from DB
719
863
  rejected.push(meta.txHash);
720
- this.#log.debug(`Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason}`);
864
+ this.#log.debug(`Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason?.message ?? 'unknown reason'}`);
721
865
  continue;
722
866
  }
723
867
  // Evict any conflicting txs identified by pre-add rules
@@ -753,7 +897,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
753
897
  getFeePayerPendingTxs: (feePayer)=>this.#indices.getFeePayerPendingTxs(feePayer),
754
898
  getPendingTxCount: ()=>this.#indices.getPendingTxCount(),
755
899
  getLowestPriorityPending: (limit)=>this.#indices.getLowestPriorityPending(limit),
756
- deleteTxs: (txHashes)=>this.#deleteTxsBatch(txHashes)
900
+ deleteTxs: (txHashes, reason)=>this.#evictTxs(txHashes, reason ?? 'unknown')
757
901
  };
758
902
  }
759
903
  #createPreAddPoolAccess() {