@aztec/p2p 0.0.1-commit.1bb068fb5 → 0.0.1-commit.1dcfe2301

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 (413) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +7 -7
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +32 -28
  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 +20 -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 +2 -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 +1 -1
  47. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  48. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  50. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +4 -4
  51. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -7
  52. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  53. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  54. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +12 -6
  55. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  56. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  58. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  59. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  60. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  61. package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
  62. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  63. package/dest/mem_pools/tx_pool_v2/index.js +1 -1
  64. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  65. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  66. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  67. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +24 -10
  68. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  69. package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
  70. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +54 -15
  71. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  72. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +112 -20
  73. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +5 -2
  74. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  75. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +38 -46
  76. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
  77. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  78. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +12 -5
  79. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +12 -5
  80. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  81. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +296 -153
  82. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  83. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  85. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  86. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  87. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  88. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  89. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  90. package/dest/msg_validators/clock_tolerance.js +54 -3
  91. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  92. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  93. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  94. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  95. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  96. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  97. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  98. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  99. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  100. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
  101. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  102. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
  103. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  104. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  105. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  106. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  107. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  108. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  109. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  110. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  111. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  112. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  113. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  114. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  116. package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
  117. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  118. package/dest/msg_validators/tx_validator/factory.js +247 -60
  119. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  120. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  121. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  122. package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
  123. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/gas_validator.js +112 -43
  125. package/dest/msg_validators/tx_validator/index.d.ts +3 -1
  126. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/index.js +2 -0
  128. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  129. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  130. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  131. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  132. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  133. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  134. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  135. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  136. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  137. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
  138. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  139. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  140. package/dest/services/data_store.d.ts +1 -1
  141. package/dest/services/data_store.d.ts.map +1 -1
  142. package/dest/services/data_store.js +5 -5
  143. package/dest/services/dummy_service.d.ts +8 -5
  144. package/dest/services/dummy_service.d.ts.map +1 -1
  145. package/dest/services/dummy_service.js +10 -5
  146. package/dest/services/encoding.d.ts +6 -2
  147. package/dest/services/encoding.d.ts.map +1 -1
  148. package/dest/services/encoding.js +16 -9
  149. package/dest/services/gossipsub/topic_score_params.d.ts +30 -7
  150. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  151. package/dest/services/gossipsub/topic_score_params.js +53 -14
  152. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  153. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  154. package/dest/services/libp2p/instrumentation.js +14 -0
  155. package/dest/services/libp2p/libp2p_service.d.ts +29 -36
  156. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  157. package/dest/services/libp2p/libp2p_service.js +236 -197
  158. package/dest/services/peer-manager/metrics.d.ts +3 -1
  159. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  160. package/dest/services/peer-manager/metrics.js +6 -0
  161. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  162. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  163. package/dest/services/peer-manager/peer_manager.js +39 -11
  164. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  165. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  166. package/dest/services/peer-manager/peer_scoring.js +32 -10
  167. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
  168. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  169. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
  170. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
  171. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  172. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  173. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  174. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  175. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  176. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  177. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  178. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
  179. package/dest/services/reqresp/config.d.ts +3 -3
  180. package/dest/services/reqresp/config.d.ts.map +1 -1
  181. package/dest/services/reqresp/interface.d.ts +14 -9
  182. package/dest/services/reqresp/interface.d.ts.map +1 -1
  183. package/dest/services/reqresp/interface.js +10 -11
  184. package/dest/services/reqresp/metrics.d.ts +1 -1
  185. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  186. package/dest/services/reqresp/metrics.js +0 -1
  187. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  188. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  189. package/dest/services/reqresp/protocols/index.js +0 -1
  190. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  192. package/dest/services/reqresp/protocols/tx.js +1 -3
  193. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  194. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  195. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  196. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  197. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  199. package/dest/services/reqresp/reqresp.d.ts +4 -2
  200. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  201. package/dest/services/reqresp/reqresp.js +30 -12
  202. package/dest/services/service.d.ts +9 -4
  203. package/dest/services/service.d.ts.map +1 -1
  204. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  205. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  206. package/dest/services/tx_collection/fast_tx_collection.js +65 -75
  207. package/dest/services/tx_collection/file_store_tx_collection.d.ts +1 -1
  208. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  209. package/dest/services/tx_collection/file_store_tx_collection.js +4 -2
  210. package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
  211. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  212. package/dest/services/tx_collection/file_store_tx_source.js +50 -9
  213. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  214. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  215. package/dest/services/tx_collection/instrumentation.js +2 -1
  216. package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
  217. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  218. package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
  219. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  220. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  221. package/dest/services/tx_collection/request_tracker.js +84 -0
  222. package/dest/services/tx_collection/slow_tx_collection.d.ts +2 -2
  223. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  224. package/dest/services/tx_collection/slow_tx_collection.js +10 -8
  225. package/dest/services/tx_collection/tx_collection.d.ts +5 -7
  226. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  227. package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
  228. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  229. package/dest/services/tx_collection/tx_collection_sink.js +13 -22
  230. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  231. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  232. package/dest/services/tx_collection/tx_source.js +26 -7
  233. package/dest/services/tx_file_store/tx_file_store.js +1 -1
  234. package/dest/services/tx_provider.d.ts +3 -3
  235. package/dest/services/tx_provider.d.ts.map +1 -1
  236. package/dest/services/tx_provider.js +4 -4
  237. package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
  238. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  239. package/dest/test-helpers/make-test-p2p-clients.js +1 -2
  240. package/dest/test-helpers/mock-pubsub.d.ts +14 -6
  241. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  242. package/dest/test-helpers/mock-pubsub.js +43 -12
  243. package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
  244. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  245. package/dest/test-helpers/reqresp-nodes.js +3 -4
  246. package/dest/test-helpers/testbench-utils.d.ts +6 -3
  247. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  248. package/dest/test-helpers/testbench-utils.js +24 -4
  249. package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
  250. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  251. package/dest/testbench/p2p_client_testbench_worker.js +78 -26
  252. package/dest/testbench/worker_client_manager.d.ts +10 -1
  253. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  254. package/dest/testbench/worker_client_manager.js +55 -3
  255. package/dest/util.d.ts +3 -3
  256. package/dest/util.d.ts.map +1 -1
  257. package/package.json +14 -14
  258. package/src/client/factory.ts +55 -47
  259. package/src/client/interface.ts +20 -21
  260. package/src/client/p2p_client.ts +89 -135
  261. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
  262. package/src/config.ts +139 -45
  263. package/src/errors/p2p-service.error.ts +11 -0
  264. package/src/errors/tx-pool.error.ts +12 -0
  265. package/src/index.ts +0 -1
  266. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  267. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  268. package/src/mem_pools/index.ts +0 -3
  269. package/src/mem_pools/instrumentation.ts +17 -13
  270. package/src/mem_pools/tx_pool_v2/README.md +10 -2
  271. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +11 -0
  272. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  273. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -4
  274. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
  275. package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
  276. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  277. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -4
  278. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
  279. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +12 -9
  280. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  281. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  282. package/src/mem_pools/tx_pool_v2/index.ts +1 -1
  283. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  284. package/src/mem_pools/tx_pool_v2/interfaces.ts +24 -10
  285. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +160 -28
  286. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -46
  287. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +28 -8
  288. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +330 -149
  289. package/src/msg_validators/attestation_validator/README.md +49 -0
  290. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  291. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  292. package/src/msg_validators/clock_tolerance.ts +72 -3
  293. package/src/msg_validators/proposal_validator/README.md +123 -0
  294. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  295. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  296. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  297. package/src/msg_validators/tx_validator/README.md +119 -0
  298. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
  299. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  300. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  301. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  302. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  303. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  304. package/src/msg_validators/tx_validator/factory.ts +394 -78
  305. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  306. package/src/msg_validators/tx_validator/gas_validator.ts +145 -33
  307. package/src/msg_validators/tx_validator/index.ts +2 -0
  308. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  309. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  310. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  311. package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
  312. package/src/services/data_store.ts +5 -13
  313. package/src/services/dummy_service.ts +13 -7
  314. package/src/services/encoding.ts +16 -8
  315. package/src/services/gossipsub/README.md +29 -14
  316. package/src/services/gossipsub/topic_score_params.ts +85 -17
  317. package/src/services/libp2p/instrumentation.ts +14 -0
  318. package/src/services/libp2p/libp2p_service.ts +251 -225
  319. package/src/services/peer-manager/metrics.ts +7 -0
  320. package/src/services/peer-manager/peer_manager.ts +45 -11
  321. package/src/services/peer-manager/peer_scoring.ts +27 -5
  322. package/src/services/reqresp/README.md +229 -0
  323. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  324. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
  325. package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
  326. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  327. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  328. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
  329. package/src/services/reqresp/config.ts +2 -2
  330. package/src/services/reqresp/interface.ts +21 -11
  331. package/src/services/reqresp/metrics.ts +0 -1
  332. package/src/services/reqresp/protocols/index.ts +0 -1
  333. package/src/services/reqresp/protocols/tx.ts +1 -3
  334. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  335. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  336. package/src/services/reqresp/reqresp.ts +40 -13
  337. package/src/services/service.ts +17 -3
  338. package/src/services/tx_collection/fast_tx_collection.ts +71 -76
  339. package/src/services/tx_collection/file_store_tx_collection.ts +7 -3
  340. package/src/services/tx_collection/file_store_tx_source.ts +65 -9
  341. package/src/services/tx_collection/instrumentation.ts +7 -1
  342. package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
  343. package/src/services/tx_collection/request_tracker.ts +127 -0
  344. package/src/services/tx_collection/slow_tx_collection.ts +8 -9
  345. package/src/services/tx_collection/tx_collection.ts +5 -6
  346. package/src/services/tx_collection/tx_collection_sink.ts +15 -29
  347. package/src/services/tx_collection/tx_source.ts +28 -8
  348. package/src/services/tx_file_store/tx_file_store.ts +1 -1
  349. package/src/services/tx_provider.ts +2 -2
  350. package/src/test-helpers/make-test-p2p-clients.ts +1 -3
  351. package/src/test-helpers/mock-pubsub.ts +44 -11
  352. package/src/test-helpers/reqresp-nodes.ts +5 -8
  353. package/src/test-helpers/testbench-utils.ts +33 -6
  354. package/src/testbench/p2p_client_testbench_worker.ts +89 -29
  355. package/src/testbench/worker_client_manager.ts +68 -6
  356. package/src/util.ts +8 -2
  357. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  358. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  359. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  360. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  361. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  362. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  363. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  364. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  365. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  366. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  367. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  368. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  369. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  370. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  372. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  373. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  375. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  376. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  377. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  378. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  379. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  380. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  381. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  382. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  383. package/dest/mem_pools/tx_pool/index.js +0 -2
  384. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  385. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  386. package/dest/mem_pools/tx_pool/priority.js +0 -15
  387. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  388. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  389. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  390. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  391. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  392. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  393. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  394. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  395. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  396. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  397. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  398. package/dest/services/reqresp/protocols/block.js +0 -32
  399. package/src/mem_pools/tx_pool/README.md +0 -270
  400. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  401. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  402. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  403. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  404. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  405. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  406. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  407. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  408. package/src/mem_pools/tx_pool/index.ts +0 -2
  409. package/src/mem_pools/tx_pool/priority.ts +0 -20
  410. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  411. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  412. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  413. package/src/services/reqresp/protocols/block.ts +0 -37
package/src/config.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  type ConfigMappingsType,
3
3
  SecretValue,
4
+ bigintConfigHelper,
4
5
  booleanConfigHelper,
5
6
  getConfigFromMappings,
6
7
  getDefaultConfig,
@@ -10,7 +11,6 @@ import {
10
11
  secretStringConfigHelper,
11
12
  } from '@aztec/foundation/config';
12
13
  import { Fr } from '@aztec/foundation/curves/bn254';
13
- import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
14
14
  import { FunctionSelector } from '@aztec/stdlib/abi/function-selector';
15
15
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
16
16
  import {
@@ -20,6 +20,7 @@ import {
20
20
  chainConfigMappings,
21
21
  sharedSequencerConfigMappings,
22
22
  } from '@aztec/stdlib/config';
23
+ import { type DataStoreConfig, dataConfigMappings } from '@aztec/stdlib/kv-store';
23
24
 
24
25
  import {
25
26
  type BatchTxRequesterConfig,
@@ -38,7 +39,26 @@ export interface P2PConfig
38
39
  ChainConfig,
39
40
  TxCollectionConfig,
40
41
  TxFileStoreConfig,
41
- Pick<SequencerConfig, 'blockDurationMs'> {
42
+ Pick<
43
+ SequencerConfig,
44
+ | 'blockDurationMs'
45
+ | 'expectedBlockProposalsPerSlot'
46
+ | 'l1PublishingTime'
47
+ | 'maxTxsPerBlock'
48
+ | 'attestationPropagationTime'
49
+ > {
50
+ /** Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set. */
51
+ validateMaxTxsPerBlock?: number;
52
+
53
+ /** Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set. */
54
+ validateMaxTxsPerCheckpoint?: number;
55
+
56
+ /** Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected. */
57
+ validateMaxL2BlockGas?: number;
58
+
59
+ /** Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected. */
60
+ validateMaxDABlockGas?: number;
61
+
42
62
  /** A flag dictating whether the P2P subsystem should be enabled. */
43
63
  p2pEnabled: boolean;
44
64
 
@@ -57,6 +77,9 @@ export interface P2PConfig
57
77
  /** The frequency in which to check for new peers. */
58
78
  peerCheckIntervalMS: number;
59
79
 
80
+ /** How long to ban a peer after it fails MAX_DIAL_ATTEMPTS dials. */
81
+ peerFailedBanTimeMs: number;
82
+
60
83
  /** Size of queue of L2 blocks to store. */
61
84
  l2QueueSize: number;
62
85
 
@@ -150,8 +173,8 @@ export interface P2PConfig
150
173
  /** The maximum possible size of the P2P DB in KB. Overwrites the general dataStoreMapSizeKb. */
151
174
  p2pStoreMapSizeKb?: number;
152
175
 
153
- /** Which calls are allowed in the public setup phase of a tx. */
154
- txPublicSetupAllowList: AllowedElement[];
176
+ /** Additional entries to extend the default setup allow list. */
177
+ txPublicSetupAllowListExtend: AllowedElement[];
155
178
 
156
179
  /** The maximum number of pending txs before evicting lower priority txs. */
157
180
  maxPendingTxCount: number;
@@ -173,10 +196,7 @@ export interface P2PConfig
173
196
  /** Whether transactions are disabled for this node. This means transactions will be rejected at the RPC and P2P layers. */
174
197
  disableTransactions: boolean;
175
198
 
176
- /** True to simulate discarding transactions. - For testing purposes only*/
177
- dropTransactions: boolean;
178
-
179
- /** The probability that a transaction is discarded. - For testing purposes only */
199
+ /** The probability that a transaction is discarded (0 = disabled). - For testing purposes only */
180
200
  dropTransactionsProbability: number;
181
201
 
182
202
  /** Whether to delete transactions from the pool after a reorg instead of moving them back to pending. */
@@ -193,11 +213,36 @@ export interface P2PConfig
193
213
 
194
214
  /** Minimum age (ms) a transaction must have been in the pool before it's eligible for block building. */
195
215
  minTxPoolAgeMs: number;
216
+
217
+ /** Minimum percentage fee increase required to replace an existing tx via RPC (0 = no bump). */
218
+ priceBumpPercentage: bigint;
196
219
  }
197
220
 
198
221
  export const DEFAULT_P2P_PORT = 40400;
199
222
 
200
223
  export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
224
+ validateMaxTxsPerBlock: {
225
+ env: 'VALIDATOR_MAX_TX_PER_BLOCK',
226
+ description:
227
+ 'Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set.',
228
+ parseEnv: (val: string) => parseInt(val, 10),
229
+ },
230
+ validateMaxTxsPerCheckpoint: {
231
+ env: 'VALIDATOR_MAX_TX_PER_CHECKPOINT',
232
+ description:
233
+ 'Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set.',
234
+ parseEnv: (val: string) => parseInt(val, 10),
235
+ },
236
+ validateMaxL2BlockGas: {
237
+ env: 'VALIDATOR_MAX_L2_BLOCK_GAS',
238
+ description: 'Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected.',
239
+ parseEnv: (val: string) => parseInt(val, 10),
240
+ },
241
+ validateMaxDABlockGas: {
242
+ env: 'VALIDATOR_MAX_DA_BLOCK_GAS',
243
+ description: 'Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected.',
244
+ parseEnv: (val: string) => parseInt(val, 10),
245
+ },
201
246
  p2pEnabled: {
202
247
  env: 'P2P_ENABLED',
203
248
  description: 'A flag dictating whether the P2P subsystem should be enabled.',
@@ -228,6 +273,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
228
273
  description: 'The frequency in which to check for new peers.',
229
274
  ...numberConfigHelper(30_000),
230
275
  },
276
+ peerFailedBanTimeMs: {
277
+ env: 'P2P_PEER_FAILED_BAN_TIME_MS',
278
+ description: 'How long to ban a peer after it fails maximum dial attempts.',
279
+ ...numberConfigHelper(5 * 60 * 1000),
280
+ },
231
281
  l2QueueSize: {
232
282
  env: 'P2P_L2_QUEUE_SIZE',
233
283
  description: 'Size of queue of L2 blocks to store.',
@@ -321,7 +371,7 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
321
371
  gossipsubMcacheLength: {
322
372
  env: 'P2P_GOSSIPSUB_MCACHE_LENGTH',
323
373
  description: 'The number of gossipsub interval message cache windows to keep.',
324
- ...numberConfigHelper(6),
374
+ ...numberConfigHelper(12),
325
375
  },
326
376
  gossipsubMcacheGossip: {
327
377
  env: 'P2P_GOSSIPSUB_MCACHE_GOSSIP',
@@ -393,15 +443,16 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
393
443
  },
394
444
  p2pStoreMapSizeKb: {
395
445
  env: 'P2P_STORE_MAP_SIZE_KB',
396
- parseEnv: (val: string | undefined) => (val ? +val : undefined),
446
+ parseEnv: (val: string) => +val,
397
447
  description: 'The maximum possible size of the P2P DB in KB. Overwrites the general dataStoreMapSizeKb.',
398
448
  },
399
- txPublicSetupAllowList: {
449
+ txPublicSetupAllowListExtend: {
400
450
  env: 'TX_PUBLIC_SETUP_ALLOWLIST',
401
451
  parseEnv: (val: string) => parseAllowList(val),
402
- description: 'The list of functions calls allowed to run in setup',
452
+ description:
453
+ 'Additional entries to extend the default setup allow list. Format: I:address:selector[:flags],C:classId:selector[:flags]. Flags: os (onlySelf), rn (rejectNullMsgSender), cl=N (calldataLength), joined with +.',
403
454
  printDefault: () =>
404
- 'AuthRegistry, FeeJuice.increase_public_balance, Token.increase_public_balance, FPC.prepare_fee',
455
+ 'Default: AuthRegistry._set_authorized, AuthRegistry.set_authorized, FeeJuice._increase_public_balance',
405
456
  },
406
457
  maxPendingTxCount: {
407
458
  env: 'P2P_MAX_PENDING_TX_COUNT',
@@ -430,11 +481,6 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
430
481
  description: 'Number of auth attempts to allow before peer is banned. Number is inclusive',
431
482
  ...numberConfigHelper(3),
432
483
  },
433
- dropTransactions: {
434
- env: 'P2P_DROP_TX',
435
- description: 'True to simulate discarding transactions. - For testing purposes only',
436
- ...booleanConfigHelper(false),
437
- },
438
484
  dropTransactionsProbability: {
439
485
  env: 'P2P_DROP_TX_CHANCE',
440
486
  description: 'The probability that a transaction is discarded (0 - 1). - For testing purposes only',
@@ -456,6 +502,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
456
502
  description: 'Alters the format of p2p messages to include things like broadcast timestamp FOR TESTING ONLY',
457
503
  ...booleanConfigHelper(false),
458
504
  },
505
+ l1PublishingTime: {
506
+ env: 'SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT',
507
+ description: 'How much time (in seconds) we allow in the slot for publishing the L1 tx (defaults to 1 L1 slot).',
508
+ parseEnv: (val: string) => parseInt(val, 10),
509
+ },
459
510
  fishermanMode: {
460
511
  env: 'FISHERMAN_MODE',
461
512
  description:
@@ -472,6 +523,12 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
472
523
  description: 'Minimum age (ms) a transaction must have been in the pool before it is eligible for block building.',
473
524
  ...numberConfigHelper(2_000),
474
525
  },
526
+ priceBumpPercentage: {
527
+ env: 'P2P_RPC_PRICE_BUMP_PERCENTAGE',
528
+ description:
529
+ 'Minimum percentage fee increase required to replace an existing tx via RPC. Even at 0%, replacement still requires paying at least 1 unit more.',
530
+ ...bigintConfigHelper(10n),
531
+ },
475
532
  ...sharedSequencerConfigMappings,
476
533
  ...p2pReqRespConfigMappings,
477
534
  ...batchTxRequesterConfigMappings,
@@ -529,13 +586,44 @@ export const bootnodeConfigMappings = pickConfigMappings(
529
586
  bootnodeConfigKeys,
530
587
  );
531
588
 
589
+ /**
590
+ * Parses a `+`-separated flags string into validation properties for an allow list entry.
591
+ * Supported flags: `os` (onlySelf), `rn` (rejectNullMsgSender), `cl=N` (calldataLength).
592
+ */
593
+ function parseFlags(
594
+ flags: string,
595
+ entry: string,
596
+ ): { onlySelf?: boolean; rejectNullMsgSender?: boolean; calldataLength?: number } {
597
+ const result: { onlySelf?: boolean; rejectNullMsgSender?: boolean; calldataLength?: number } = {};
598
+ for (const flag of flags.split('+')) {
599
+ if (flag === 'os') {
600
+ result.onlySelf = true;
601
+ } else if (flag === 'rn') {
602
+ result.rejectNullMsgSender = true;
603
+ } else if (flag.startsWith('cl=')) {
604
+ const n = parseInt(flag.slice(3), 10);
605
+ if (isNaN(n) || n < 0) {
606
+ throw new Error(
607
+ `Invalid allow list entry "${entry}": invalid calldataLength in flag "${flag}". Expected a non-negative integer.`,
608
+ );
609
+ }
610
+ result.calldataLength = n;
611
+ } else {
612
+ throw new Error(`Invalid allow list entry "${entry}": unknown flag "${flag}". Supported flags: os, rn, cl=N.`);
613
+ }
614
+ }
615
+ return result;
616
+ }
617
+
532
618
  /**
533
619
  * Parses a string to a list of allowed elements.
534
- * Each encoded is expected to be of one of the following formats
535
- * `I:${address}`
536
- * `I:${address}:${selector}`
537
- * `C:${classId}`
538
- * `C:${classId}:${selector}`
620
+ * Each entry is expected to be of one of the following formats:
621
+ * `I:${address}:${selector}` — instance (contract address) with function selector
622
+ * `C:${classId}:${selector}` — class with function selector
623
+ *
624
+ * An optional flags segment can be appended after the selector:
625
+ * `I:${address}:${selector}:${flags}` or `C:${classId}:${selector}:${flags}`
626
+ * where flags is a `+`-separated list of: `os` (onlySelf), `rn` (rejectNullMsgSender), `cl=N` (calldataLength).
539
627
  *
540
628
  * @param value The string to parse
541
629
  * @returns A list of allowed elements
@@ -548,31 +636,37 @@ export function parseAllowList(value: string): AllowedElement[] {
548
636
  }
549
637
 
550
638
  for (const val of value.split(',')) {
551
- const [typeString, identifierString, selectorString] = val.split(':');
552
- const selector = selectorString !== undefined ? FunctionSelector.fromString(selectorString) : undefined;
639
+ const trimmed = val.trim();
640
+ if (!trimmed) {
641
+ continue;
642
+ }
643
+ const [typeString, identifierString, selectorString, flagsString] = trimmed.split(':');
644
+
645
+ if (!selectorString) {
646
+ throw new Error(
647
+ `Invalid allow list entry "${trimmed}": selector is required. Expected format: I:address:selector or C:classId:selector`,
648
+ );
649
+ }
650
+
651
+ const selector = FunctionSelector.fromString(selectorString);
652
+ const flags = flagsString ? parseFlags(flagsString, trimmed) : {};
553
653
 
554
654
  if (typeString === 'I') {
555
- if (selector) {
556
- entries.push({
557
- address: AztecAddress.fromString(identifierString),
558
- selector,
559
- });
560
- } else {
561
- entries.push({
562
- address: AztecAddress.fromString(identifierString),
563
- });
564
- }
655
+ entries.push({
656
+ address: AztecAddress.fromString(identifierString),
657
+ selector,
658
+ ...flags,
659
+ });
565
660
  } else if (typeString === 'C') {
566
- if (selector) {
567
- entries.push({
568
- classId: Fr.fromHexString(identifierString),
569
- selector,
570
- });
571
- } else {
572
- entries.push({
573
- classId: Fr.fromHexString(identifierString),
574
- });
575
- }
661
+ entries.push({
662
+ classId: Fr.fromHexString(identifierString),
663
+ selector,
664
+ ...flags,
665
+ });
666
+ } else {
667
+ throw new Error(
668
+ `Invalid allow list entry "${trimmed}": unknown type "${typeString}". Expected "I" (instance) or "C" (class).`,
669
+ );
576
670
  }
577
671
  }
578
672
 
@@ -0,0 +1,11 @@
1
+ /** Checkpoint Proposal Received Callback Not Registered Error
2
+ *
3
+ * Error triggered if the allNodesCheckpointReceivedCallback is not registered
4
+ * @category Errors
5
+ */
6
+ export class CheckpointProposalReceivedCallbackNotRegisteredError extends Error {
7
+ constructor() {
8
+ super('FATAL (allNodesCheckpointReceivedCallback): All nodes should register a checkpoint proposal handler');
9
+ this.name = 'CheckpointProposalReceivedCallbackNotRegisteredError';
10
+ }
11
+ }
@@ -0,0 +1,12 @@
1
+ import type { TxPoolRejectionError } from '../mem_pools/tx_pool_v2/eviction/interfaces.js';
2
+
3
+ /** Error thrown when a transaction is not added to the mempool. */
4
+ export class TxPoolError extends Error {
5
+ public readonly data: TxPoolRejectionError;
6
+
7
+ constructor(public readonly reason: TxPoolRejectionError) {
8
+ super(reason.message);
9
+ this.name = 'TxPoolError';
10
+ this.data = reason;
11
+ }
12
+ }
package/src/index.ts CHANGED
@@ -6,7 +6,6 @@ export * from './client/index.js';
6
6
  export * from './enr/index.js';
7
7
  export * from './config.js';
8
8
  export * from './mem_pools/attestation_pool/index.js';
9
- export * from './mem_pools/tx_pool/index.js';
10
9
  export * from './mem_pools/tx_pool_v2/index.js';
11
10
  export * from './msg_validators/index.js';
12
11
  export * from './services/index.js';
@@ -26,10 +26,10 @@ export type TryAddResult = {
26
26
  count: number;
27
27
  };
28
28
 
29
- export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 5;
30
- export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
29
+ export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
30
+ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
31
31
  /** Maximum attestations a single signer can make per slot before being rejected. */
32
- export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 3;
32
+ export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
33
33
 
34
34
  /** Public API interface for attestation pools. Used for typing mocks and test implementations. */
35
35
  export type AttestationPoolApi = Pick<
@@ -154,14 +154,16 @@ export class AttestationPool {
154
154
  /** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */
155
155
  private static readonly MAX_INDEX = (1 << AttestationPool.INDEX_BITS) - 1;
156
156
 
157
- /** Creates a position key for block proposals: (slot << 10) | indexWithinCheckpoint. */
157
+ /** Creates a position key for block proposals: slot * 1024 + indexWithinCheckpoint.
158
+ * Uses multiplication instead of bit-shift to avoid 32-bit signed integer overflow
159
+ * (bit-shift overflows after slot ~2^21, roughly 278 days of uptime). */
158
160
  private getBlockPositionKey(slot: number, indexWithinCheckpoint: number): number {
159
161
  if (indexWithinCheckpoint > AttestationPool.MAX_INDEX) {
160
162
  throw new Error(
161
163
  `Value for indexWithinCheckpoint ${indexWithinCheckpoint} exceeds maximum ${AttestationPool.MAX_INDEX}`,
162
164
  );
163
165
  }
164
- return (slot << AttestationPool.INDEX_BITS) | indexWithinCheckpoint;
166
+ return slot * (1 << AttestationPool.INDEX_BITS) + indexWithinCheckpoint;
165
167
  }
166
168
 
167
169
  /**
@@ -278,7 +280,7 @@ export class AttestationPool {
278
280
  * @returns Result indicating whether the proposal was added and duplicate detection info
279
281
  */
280
282
  public async tryAddCheckpointProposal(proposal: CheckpointProposalCore): Promise<TryAddResult> {
281
- return await this.store.transactionAsync(async () => {
283
+ const result = await this.store.transactionAsync(async () => {
282
284
  const proposalId = proposal.archive.toString();
283
285
 
284
286
  // Check if already exists
@@ -304,6 +306,8 @@ export class AttestationPool {
304
306
 
305
307
  return { added: true, alreadyExists: false, count: count + 1 };
306
308
  });
309
+
310
+ return result;
307
311
  }
308
312
 
309
313
  /** Internal method - must be called within a transaction. */
@@ -345,7 +349,7 @@ export class AttestationPool {
345
349
  await this.store.transactionAsync(async () => {
346
350
  for (const attestation of attestations) {
347
351
  const slotNumber = attestation.payload.header.slotNumber;
348
- const proposalId = attestation.archive;
352
+ const proposalId = attestation.archive.toString();
349
353
  const sender = attestation.getSender();
350
354
 
351
355
  // Skip attestations with invalid signatures
@@ -359,11 +363,10 @@ export class AttestationPool {
359
363
  }
360
364
 
361
365
  const address = sender.toString();
366
+ const ownKey = this.getAttestationKey(slotNumber, proposalId, address);
362
367
 
363
- await this.checkpointAttestations.set(
364
- this.getAttestationKey(slotNumber, proposalId, address),
365
- attestation.toBuffer(),
366
- );
368
+ await this.checkpointAttestations.set(ownKey, attestation.toBuffer());
369
+ this.metrics.trackMempoolItemAdded(ownKey);
367
370
 
368
371
  this.log.debug(`Added own checkpoint attestation for slot ${slotNumber} from ${address}`, {
369
372
  signature: attestation.signature.toString(),
@@ -429,6 +432,7 @@ export class AttestationPool {
429
432
  const attestationEndKey = new Fr(oldestSlot).toString();
430
433
  for await (const key of this.checkpointAttestations.keysAsync({ end: attestationEndKey })) {
431
434
  await this.checkpointAttestations.delete(key);
435
+ this.metrics.trackMempoolItemRemoved(key);
432
436
  numberOfAttestations++;
433
437
  }
434
438
 
@@ -452,7 +456,7 @@ export class AttestationPool {
452
456
 
453
457
  // Delete block proposals for slots < oldestSlot, using blockProposalsForSlotAndIndex as index
454
458
  // Key format: (slot << INDEX_BITS) | indexWithinCheckpoint
455
- const blockPositionEndKey = oldestSlot << AttestationPool.INDEX_BITS;
459
+ const blockPositionEndKey = oldestSlot * (1 << AttestationPool.INDEX_BITS);
456
460
  for await (const positionKey of this.blockProposalsForSlotAndIndex.keysAsync({ end: blockPositionEndKey })) {
457
461
  const proposalIds = await toArray(this.blockProposalsForSlotAndIndex.getValuesAsync(positionKey));
458
462
  for (const proposalId of proposalIds) {
@@ -526,6 +530,7 @@ export class AttestationPool {
526
530
 
527
531
  // Add the attestation
528
532
  await this.checkpointAttestations.set(key, attestation.toBuffer());
533
+ this.metrics.trackMempoolItemAdded(key);
529
534
 
530
535
  // Track this attestation in the per-signer-per-slot index for duplicate detection
531
536
  const slotSignerKey = this.getSlotSignerKey(slotNumber, signerAddress);
@@ -446,12 +446,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
446
446
  const result2 = await ap.tryAddBlockProposal(proposal2);
447
447
  expect(result2.count).toBe(2);
448
448
 
449
- // Add a third proposal for same position
449
+ // Third proposal for same position should be rejected (cap is 2)
450
450
  const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
451
451
  const result3 = await ap.tryAddBlockProposal(proposal3);
452
452
 
453
- expect(result3.added).toBe(true);
454
- expect(result3.count).toBe(3);
453
+ expect(result3.added).toBe(false);
454
+ expect(result3.count).toBe(2);
455
455
  });
456
456
 
457
457
  it('should return added=false when exceeding capacity', async () => {
@@ -666,12 +666,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
666
666
  const result2 = await ap.tryAddCheckpointProposal(proposal2);
667
667
  expect(result2.count).toBe(2);
668
668
 
669
- // Add a third proposal for same slot
669
+ // Third proposal for same slot should be rejected (cap is 2)
670
670
  const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
671
671
  const result3 = await ap.tryAddCheckpointProposal(proposal3);
672
672
 
673
- expect(result3.added).toBe(true);
674
- expect(result3.count).toBe(3);
673
+ expect(result3.added).toBe(false);
674
+ expect(result3.count).toBe(2);
675
675
  });
676
676
 
677
677
  it('should not count attestations as proposals for duplicate detection', async () => {
@@ -1,6 +1,3 @@
1
1
  export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
2
2
  export { type MemPools } from './interface.js';
3
- // Old TxPool exports - kept temporarily for external consumers
4
- export { type TxPool } from './tx_pool/tx_pool.js';
5
- // New TxPoolV2 exports
6
3
  export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
@@ -73,7 +73,7 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
73
73
  private defaultAttributes;
74
74
  private meter: Meter;
75
75
 
76
- private txAddedTimestamp: Map<bigint, number> = new Map<bigint, number>();
76
+ private mempoolItemAddedTimestamp: Map<bigint | string, number> = new Map<bigint | string, number>();
77
77
 
78
78
  constructor(
79
79
  telemetry: TelemetryClient,
@@ -114,22 +114,26 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
114
114
  }
115
115
 
116
116
  public transactionsAdded(transactions: Tx[]) {
117
- const timestamp = Date.now();
118
- for (const transaction of transactions) {
119
- this.txAddedTimestamp.set(transaction.txHash.toBigInt(), timestamp);
120
- }
117
+ transactions.forEach(tx => this.trackMempoolItemAdded(tx.txHash.toBigInt()));
121
118
  }
122
119
 
123
120
  public transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>) {
124
- const timestamp = Date.now();
125
121
  for (const hash of hashes) {
126
- const key = BigInt(hash);
127
- const addedAt = this.txAddedTimestamp.get(key);
128
- if (addedAt !== undefined) {
129
- this.txAddedTimestamp.delete(key);
130
- if (addedAt < timestamp) {
131
- this.minedDelay.record(timestamp - addedAt);
132
- }
122
+ this.trackMempoolItemRemoved(BigInt(hash));
123
+ }
124
+ }
125
+
126
+ public trackMempoolItemAdded(key: bigint | string): void {
127
+ this.mempoolItemAddedTimestamp.set(key, Date.now());
128
+ }
129
+
130
+ public trackMempoolItemRemoved(key: bigint | string): void {
131
+ const timestamp = Date.now();
132
+ const addedAt = this.mempoolItemAddedTimestamp.get(key);
133
+ if (addedAt !== undefined) {
134
+ this.mempoolItemAddedTimestamp.delete(key);
135
+ if (addedAt < timestamp) {
136
+ this.minedDelay.record(timestamp - addedAt);
133
137
  }
134
138
  }
135
139
  }
@@ -79,7 +79,7 @@ Lightweight metadata stored alongside each transaction:
79
79
  - `claimAmount`: Fee payer's claim from bridging
80
80
  - `feeLimit`: Maximum fee the tx can pay
81
81
  - `nullifiers`: For conflict detection
82
- - `includeByTimestamp`: Expiration timestamp
82
+ - `expirationTimestamp`: Expiration timestamp
83
83
  - `minedL2BlockId`: Set when mined (undefined otherwise)
84
84
 
85
85
  State is derived by TxPoolIndices:
@@ -158,7 +158,7 @@ Checked before adding a transaction to the pending pool:
158
158
 
159
159
  | Rule | Purpose |
160
160
  |------|---------|
161
- | `NullifierConflictRule` | Handles transactions with conflicting nullifiers. Higher priority tx wins. |
161
+ | `NullifierConflictRule` | Handles transactions with conflicting nullifiers. Higher priority tx wins. For RPC submissions, a configurable price bump percentage is required. |
162
162
  | `FeePayerBalancePreAddRule` | Ensures fee payer has sufficient balance for all their pending txs. |
163
163
  | `LowPriorityPreAddRule` | Rejects txs when pool is full and new tx has lowest priority. |
164
164
 
@@ -233,6 +233,14 @@ await pool.updateConfig({
233
233
  });
234
234
  ```
235
235
 
236
+ ### Price Bump (RPC Transaction Replacement)
237
+
238
+ When a transaction is submitted via RPC and clashes on nullifiers with an existing pool transaction, the incoming tx must pay at least `priceBumpPercentage`% more in priority fee (i.e. `>= existingFee + existingFee * bump / 100`) to replace it. This prevents spam via small fee increments. The same bump applies when the pool is full and the incoming tx needs to evict the lowest-priority tx.
239
+
240
+ - **Env var**: `P2P_RPC_PRICE_BUMP_PERCENTAGE` (default: 10)
241
+ - **Scope**: RPC submissions only. P2P gossip uses `comparePriority` (fee + hash tiebreaker) with no bump.
242
+ - Even with a 0% bump, a replacement tx must pay at least 1 unit more than the existing fee.
243
+
236
244
  ## Return Values
237
245
 
238
246
  ### AddTxsResult
@@ -301,6 +301,17 @@ export class DeletedPool {
301
301
  return this.#state.size;
302
302
  }
303
303
 
304
+ /** Gets the count of soft-deleted transactions (both prune-based and slot-based). */
305
+ getSoftDeletedCount(): number {
306
+ let count = this.#slotDeletedTxs.size;
307
+ for (const state of this.#state.values()) {
308
+ if (state.softDeleted) {
309
+ count++;
310
+ }
311
+ }
312
+ return count;
313
+ }
314
+
304
315
  /**
305
316
  * Gets all transaction hashes from pruned blocks.
306
317
  */
@@ -9,9 +9,12 @@ import {
9
9
  EvictionEvent,
10
10
  type EvictionRule,
11
11
  type PoolOperations,
12
+ type PreAddContext,
12
13
  type PreAddPoolAccess,
13
14
  type PreAddResult,
14
15
  type PreAddRule,
16
+ type TaggedEviction,
17
+ TxPoolRejectionCode,
15
18
  } from './interfaces.js';
16
19
 
17
20
  /**
@@ -47,21 +50,27 @@ export class EvictionManager {
47
50
  * Runs all pre-add rules for an incoming transaction.
48
51
  * Returns combined result of all rules.
49
52
  */
50
- async runPreAddRules(incomingMeta: TxMetaData, poolAccess: PreAddPoolAccess): Promise<PreAddResult> {
51
- const allTxHashesToEvict: string[] = [];
53
+ async runPreAddRules(
54
+ incomingMeta: TxMetaData,
55
+ poolAccess: PreAddPoolAccess,
56
+ context?: PreAddContext,
57
+ ): Promise<PreAddResult> {
58
+ const evictions: TaggedEviction[] = [];
59
+ const seen = new Set<string>();
52
60
 
53
61
  for (const rule of this.preAddRules) {
54
62
  try {
55
- const result = await rule.check(incomingMeta, poolAccess);
63
+ const result = await rule.check(incomingMeta, poolAccess, context);
56
64
 
57
65
  if (result.shouldIgnore) {
58
66
  return result;
59
67
  }
60
68
 
61
- // Collect txs to evict from all rules
69
+ // Collect txs to evict from all rules, tagged with the rule name
62
70
  for (const txHash of result.txHashesToEvict) {
63
- if (!allTxHashesToEvict.includes(txHash)) {
64
- allTxHashesToEvict.push(txHash);
71
+ if (!seen.has(txHash)) {
72
+ seen.add(txHash);
73
+ evictions.push({ txHash, reason: rule.name });
65
74
  }
66
75
  }
67
76
  } catch (err) {
@@ -70,14 +79,18 @@ export class EvictionManager {
70
79
  return {
71
80
  shouldIgnore: true,
72
81
  txHashesToEvict: [],
73
- reason: `pre-add rule ${rule.name} error: ${err}`,
82
+ reason: {
83
+ code: TxPoolRejectionCode.INTERNAL_ERROR,
84
+ message: `Pre-add rule ${rule.name} error: ${err}`,
85
+ },
74
86
  };
75
87
  }
76
88
  }
77
89
 
78
90
  return {
79
91
  shouldIgnore: false,
80
- txHashesToEvict: allTxHashesToEvict,
92
+ txHashesToEvict: evictions.map(e => e.txHash),
93
+ evictions,
81
94
  };
82
95
  }
83
96