@aztec/p2p 0.0.1-commit.dbf9cec → 0.0.1-commit.ddcf04837

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 (339) hide show
  1. package/README.md +129 -3
  2. package/dest/client/factory.d.ts +2 -2
  3. package/dest/client/factory.d.ts.map +1 -1
  4. package/dest/client/factory.js +25 -11
  5. package/dest/client/interface.d.ts +9 -2
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +3 -2
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +46 -38
  10. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
  11. package/dest/config.d.ts +125 -100
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +92 -33
  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/index.d.ts +1 -2
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +0 -1
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  24. package/dest/mem_pools/index.d.ts +1 -2
  25. package/dest/mem_pools/index.d.ts.map +1 -1
  26. package/dest/mem_pools/instrumentation.d.ts +4 -2
  27. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  28. package/dest/mem_pools/instrumentation.js +16 -14
  29. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  30. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  31. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  32. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  33. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  34. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  35. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  36. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  38. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  39. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  41. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +9 -5
  42. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  44. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +25 -10
  45. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +39 -12
  47. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  48. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  50. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  51. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  52. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  53. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  54. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +24 -6
  56. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  57. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  58. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  59. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  60. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  61. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  62. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  63. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  64. package/dest/msg_validators/clock_tolerance.js +54 -3
  65. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +7 -4
  66. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  68. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +7 -4
  69. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  70. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  71. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +15 -8
  72. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  73. package/dest/msg_validators/proposal_validator/proposal_validator.js +67 -47
  74. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  75. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  76. package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
  77. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  78. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  79. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  80. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  81. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  82. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  83. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  84. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  85. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/tx_validator/data_validator.js +35 -2
  87. package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
  88. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  89. package/dest/msg_validators/tx_validator/factory.js +36 -10
  90. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  93. package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
  94. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/gas_validator.js +49 -17
  96. package/dest/msg_validators/tx_validator/index.d.ts +2 -1
  97. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  98. package/dest/msg_validators/tx_validator/index.js +1 -0
  99. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  100. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  101. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  102. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  103. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  104. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  105. package/dest/services/data_store.d.ts +1 -1
  106. package/dest/services/data_store.d.ts.map +1 -1
  107. package/dest/services/data_store.js +5 -5
  108. package/dest/services/dummy_service.d.ts +6 -3
  109. package/dest/services/dummy_service.d.ts.map +1 -1
  110. package/dest/services/dummy_service.js +6 -1
  111. package/dest/services/encoding.d.ts +5 -1
  112. package/dest/services/encoding.d.ts.map +1 -1
  113. package/dest/services/encoding.js +7 -1
  114. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  115. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  116. package/dest/services/gossipsub/topic_score_params.js +21 -4
  117. package/dest/services/libp2p/libp2p_service.d.ts +15 -25
  118. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  119. package/dest/services/libp2p/libp2p_service.js +165 -126
  120. package/dest/services/peer-manager/metrics.d.ts +3 -1
  121. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  122. package/dest/services/peer-manager/metrics.js +6 -0
  123. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  124. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  125. package/dest/services/peer-manager/peer_manager.js +39 -11
  126. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  127. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  128. package/dest/services/peer-manager/peer_scoring.js +32 -10
  129. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  130. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  131. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +69 -65
  132. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
  133. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  134. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  135. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  136. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  137. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  138. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  139. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  140. package/dest/services/reqresp/config.d.ts +3 -3
  141. package/dest/services/reqresp/config.d.ts.map +1 -1
  142. package/dest/services/reqresp/interface.d.ts +14 -9
  143. package/dest/services/reqresp/interface.d.ts.map +1 -1
  144. package/dest/services/reqresp/interface.js +10 -11
  145. package/dest/services/reqresp/metrics.d.ts +1 -1
  146. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  147. package/dest/services/reqresp/metrics.js +0 -1
  148. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  149. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  150. package/dest/services/reqresp/protocols/index.js +0 -1
  151. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  152. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  153. package/dest/services/reqresp/protocols/tx.js +1 -3
  154. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  155. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  156. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  157. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  158. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  159. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  160. package/dest/services/reqresp/reqresp.d.ts +4 -2
  161. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  162. package/dest/services/reqresp/reqresp.js +28 -11
  163. package/dest/services/service.d.ts +5 -2
  164. package/dest/services/service.d.ts.map +1 -1
  165. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  166. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  167. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  168. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  169. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  170. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  171. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  172. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  173. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  174. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  175. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  176. package/dest/services/tx_collection/request_tracker.js +84 -0
  177. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  178. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  179. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  180. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  181. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  182. package/dest/services/tx_collection/tx_source.js +9 -7
  183. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  184. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  185. package/dest/test-helpers/mock-pubsub.d.ts +11 -3
  186. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  187. package/dest/test-helpers/mock-pubsub.js +35 -10
  188. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  189. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  190. package/dest/test-helpers/reqresp-nodes.js +1 -2
  191. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  192. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  193. package/dest/test-helpers/testbench-utils.js +23 -3
  194. package/dest/testbench/p2p_client_testbench_worker.js +68 -16
  195. package/dest/testbench/worker_client_manager.d.ts +10 -1
  196. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  197. package/dest/testbench/worker_client_manager.js +55 -3
  198. package/dest/util.d.ts +1 -1
  199. package/package.json +14 -14
  200. package/src/client/factory.ts +43 -14
  201. package/src/client/interface.ts +9 -1
  202. package/src/client/p2p_client.ts +50 -39
  203. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -9
  204. package/src/config.ts +137 -35
  205. package/src/errors/p2p-service.error.ts +11 -0
  206. package/src/index.ts +0 -1
  207. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  208. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  209. package/src/mem_pools/index.ts +0 -3
  210. package/src/mem_pools/instrumentation.ts +17 -13
  211. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  212. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  213. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  214. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  215. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  216. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  217. package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
  218. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +60 -14
  219. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  220. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
  221. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +28 -6
  222. package/src/msg_validators/attestation_validator/README.md +49 -0
  223. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  224. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  225. package/src/msg_validators/clock_tolerance.ts +72 -3
  226. package/src/msg_validators/proposal_validator/README.md +123 -0
  227. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +17 -4
  228. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +23 -7
  229. package/src/msg_validators/proposal_validator/proposal_validator.ts +79 -49
  230. package/src/msg_validators/tx_validator/README.md +5 -1
  231. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  232. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  233. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  234. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  235. package/src/msg_validators/tx_validator/data_validator.ts +42 -1
  236. package/src/msg_validators/tx_validator/factory.ts +43 -3
  237. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  238. package/src/msg_validators/tx_validator/gas_validator.ts +65 -16
  239. package/src/msg_validators/tx_validator/index.ts +1 -0
  240. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  241. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  242. package/src/services/data_store.ts +5 -13
  243. package/src/services/dummy_service.ts +8 -2
  244. package/src/services/encoding.ts +9 -1
  245. package/src/services/gossipsub/topic_score_params.ts +36 -4
  246. package/src/services/libp2p/libp2p_service.ts +164 -139
  247. package/src/services/peer-manager/metrics.ts +7 -0
  248. package/src/services/peer-manager/peer_manager.ts +45 -11
  249. package/src/services/peer-manager/peer_scoring.ts +27 -5
  250. package/src/services/reqresp/README.md +229 -0
  251. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  252. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
  253. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  254. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  255. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  256. package/src/services/reqresp/config.ts +2 -2
  257. package/src/services/reqresp/interface.ts +21 -11
  258. package/src/services/reqresp/metrics.ts +0 -1
  259. package/src/services/reqresp/protocols/index.ts +0 -1
  260. package/src/services/reqresp/protocols/tx.ts +1 -3
  261. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  262. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  263. package/src/services/reqresp/reqresp.ts +37 -12
  264. package/src/services/service.ts +6 -1
  265. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  266. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  267. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  268. package/src/services/tx_collection/request_tracker.ts +127 -0
  269. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  270. package/src/services/tx_collection/tx_collection.ts +3 -5
  271. package/src/services/tx_collection/tx_source.ts +8 -7
  272. package/src/test-helpers/make-test-p2p-clients.ts +1 -1
  273. package/src/test-helpers/mock-pubsub.ts +31 -5
  274. package/src/test-helpers/reqresp-nodes.ts +3 -3
  275. package/src/test-helpers/testbench-utils.ts +30 -3
  276. package/src/testbench/p2p_client_testbench_worker.ts +72 -15
  277. package/src/testbench/worker_client_manager.ts +68 -6
  278. package/src/util.ts +1 -1
  279. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  280. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  281. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  282. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  283. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  284. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  285. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  286. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  287. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  288. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  289. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  290. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  291. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  292. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  293. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  294. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  295. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  296. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  297. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  298. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  299. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  300. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  301. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  302. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  303. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  304. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  305. package/dest/mem_pools/tx_pool/index.js +0 -2
  306. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  307. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  308. package/dest/mem_pools/tx_pool/priority.js +0 -15
  309. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  310. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  311. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  312. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  313. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  314. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  315. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  316. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  317. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  318. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  319. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  320. package/dest/services/reqresp/protocols/block.js +0 -32
  321. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  322. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  323. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  324. package/src/mem_pools/tx_pool/README.md +0 -270
  325. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  326. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  327. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  328. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  329. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  330. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  331. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  332. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  333. package/src/mem_pools/tx_pool/index.ts +0 -2
  334. package/src/mem_pools/tx_pool/priority.ts +0 -20
  335. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  336. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  337. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  338. package/src/services/reqresp/protocols/block.ts +0 -37
  339. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -1,4 +1,3 @@
1
- import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
2
1
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
3
2
  import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
4
3
  import { createLogger } from '@aztec/foundation/log';
@@ -9,6 +8,7 @@ import { L2TipsKVStore } from '@aztec/kv-store/stores';
9
8
  import {
10
9
  type CheckpointId,
11
10
  type EthAddress,
11
+ GENESIS_BLOCK_HEADER_HASH,
12
12
  type L2Block,
13
13
  type L2BlockId,
14
14
  type L2BlockSource,
@@ -18,7 +18,6 @@ import {
18
18
  type L2TipsStore,
19
19
  } from '@aztec/stdlib/block';
20
20
  import type { ContractDataSource } from '@aztec/stdlib/contract';
21
- import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
22
21
  import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
23
22
  import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
24
23
  import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
@@ -111,27 +110,6 @@ export class P2PClient extends WithTracer implements P2P {
111
110
  this.telemetry,
112
111
  );
113
112
 
114
- // Default to collecting all txs when we see a valid proposal
115
- // This can be overridden by the validator client to validate, and it will call getTxsForBlockProposal on its own
116
- // Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
117
- // TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
118
- // validator-client code into here so we can validate a proposal is reasonable.
119
- this.registerBlockProposalHandler(async (block, sender) => {
120
- this.log.debug(`Received block proposal from ${sender.toString()}`);
121
- // TODO(palla/txs): Need to subtract validatorReexecuteDeadlineMs from this deadline (see ValidatorClient.getReexecutionDeadline)
122
- const constants = this.txCollection.getConstants();
123
- const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
124
- const deadline = new Date(nextSlotTimestampSeconds * 1000);
125
- const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.blockHeader.lastArchive.root);
126
- if (!parentBlock) {
127
- this.log.debug(`Cannot collect txs for proposal as parent block not found`);
128
- return false;
129
- }
130
- const blockNumber = BlockNumber(parentBlock.getBlockNumber() + 1);
131
- await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
132
- return true;
133
- });
134
-
135
113
  this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
136
114
  this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
137
115
  }
@@ -279,7 +257,11 @@ export class P2PClient extends WithTracer implements P2P {
279
257
  });
280
258
  }
281
259
 
282
- this.blockStream!.start();
260
+ // Should never happen: all branches above call initBlockStream()
261
+ if (!this.blockStream) {
262
+ throw new Error('Block stream not initialized');
263
+ }
264
+ this.blockStream.start();
283
265
  await this.txCollection.start();
284
266
  this.txFileStore?.start();
285
267
 
@@ -341,7 +323,11 @@ export class P2PClient extends WithTracer implements P2P {
341
323
  /** Triggers a sync to the archiver. Used for testing. */
342
324
  public async sync() {
343
325
  this.initBlockStream();
344
- await this.blockStream!.sync();
326
+ // Should never happen: initBlockStream() creates blockStream if absent
327
+ if (!this.blockStream) {
328
+ throw new Error('Block stream not initialized');
329
+ }
330
+ await this.blockStream.sync();
345
331
  }
346
332
 
347
333
  @trackSpan('p2pClient.broadcastProposal', async proposal => ({
@@ -379,6 +365,8 @@ export class P2PClient extends WithTracer implements P2P {
379
365
  // Store our own last-block proposal so we can respond to req/resp requests for it.
380
366
  await this.attestationPool.tryAddBlockProposal(blockProposal);
381
367
  }
368
+ // Gossipsub doesn't deliver own messages, so fire the all-nodes handler locally
369
+ await this.p2pService.notifyOwnCheckpointProposal(proposal.toCore());
382
370
  return this.p2pService.propagate(proposal);
383
371
  }
384
372
 
@@ -410,8 +398,12 @@ export class P2PClient extends WithTracer implements P2P {
410
398
  this.p2pService.registerBlockReceivedCallback(handler);
411
399
  }
412
400
 
413
- public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
414
- this.p2pService.registerCheckpointReceivedCallback(handler);
401
+ public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
402
+ this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
403
+ }
404
+
405
+ public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
406
+ this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
415
407
  }
416
408
 
417
409
  public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
@@ -691,31 +683,50 @@ export class P2PClient extends WithTracer implements P2P {
691
683
  }
692
684
 
693
685
  /**
694
- * Returns true if the prune crossed a checkpoint boundary.
695
- * If the old and new checkpoint numbers are the same, the prune is within a single checkpoint.
696
- * If they differ, the prune spans across checkpoints (epoch prune).
686
+ * Returns true if the prune is an epoch prune (new checkpoint number is less than old).
687
+ * If the checkpoint number stays the same or increases, the prune is within a checkpoint.
697
688
  */
698
689
  private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
699
690
  const tips = await this.l2Tips.getL2Tips();
700
691
  const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
701
- if (oldCheckpointNumber <= CheckpointNumber.ZERO) {
692
+ if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
702
693
  return false;
703
694
  }
704
- const isEpochPrune = oldCheckpointNumber !== newCheckpoint.number;
705
- this.log.info(
706
- `Detected epoch prune: ${isEpochPrune}. Old checkpoint: ${oldCheckpointNumber}, new checkpoint: ${newCheckpoint.number}`,
707
- );
695
+ const newCheckpointNumber = newCheckpoint.number;
696
+ // We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
697
+ // To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
698
+ // This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
699
+ const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
700
+ const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
701
+ if (isEpochPrune) {
702
+ this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
703
+ oldCheckpointNumber,
704
+ newCheckpointNumber,
705
+ thresholdForEpochPrune,
706
+ });
707
+ }
708
708
  return isEpochPrune;
709
709
  }
710
710
 
711
711
  /** Checks if the slot has changed and calls prepareForSlot if so. */
712
712
  private async maybeCallPrepareForSlot(): Promise<void> {
713
- const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
714
- if (currentSlot <= this.lastSlotProcessed) {
713
+ // If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
714
+ const l2Tips = await this.l2Tips.getL2Tips();
715
+ const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
716
+
717
+ let slot;
718
+ if (this.epochCache.isProposerPipeliningEnabled() && hasProposedCheckpoint) {
719
+ const { targetSlot } = this.epochCache.getTargetAndNextSlot();
720
+ slot = targetSlot;
721
+ } else {
722
+ const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
723
+ slot = currentSlot;
724
+ }
725
+ if (slot <= this.lastSlotProcessed) {
715
726
  return;
716
727
  }
717
- this.lastSlotProcessed = currentSlot;
718
- await this.txPool.prepareForSlot(currentSlot);
728
+ this.lastSlotProcessed = slot;
729
+ await this.txPool.prepareForSlot(slot);
719
730
  }
720
731
 
721
732
  private async startServiceIfSynched() {
@@ -3,11 +3,11 @@ import { SecretValue } from '@aztec/foundation/config';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { sleep } from '@aztec/foundation/sleep';
5
5
  import { DateProvider, Timer, executeTimeout } from '@aztec/foundation/timer';
6
- import type { DataStoreConfig } from '@aztec/kv-store/config';
7
6
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
8
7
  import type { L2BlockSource } from '@aztec/stdlib/block';
9
8
  import type { ContractDataSource } from '@aztec/stdlib/contract';
10
9
  import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
10
+ import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
11
11
  import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
12
12
  import type { Tx, TxValidationResult } from '@aztec/stdlib/tx';
13
13
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
@@ -19,7 +19,7 @@ import type { P2PConfig } from '../../../config.js';
19
19
  import { BatchTxRequesterCollector, SendBatchRequestCollector } from '../../../services/index.js';
20
20
  import type { IBatchRequestTxValidator } from '../../../services/reqresp/batch-tx-requester/tx_validator.js';
21
21
  import { RateLimitStatus } from '../../../services/reqresp/rate-limiter/rate_limiter.js';
22
- import { MissingTxsTracker } from '../../../services/tx_collection/missing_txs_tracker.js';
22
+ import { RequestTracker } from '../../../services/tx_collection/request_tracker.js';
23
23
  import {
24
24
  AlwaysTrueCircuitVerifier,
25
25
  BENCHMARK_CONSTANTS,
@@ -213,10 +213,9 @@ async function runCollector(cmd: Extract<WorkerCommand, { type: 'RUN_COLLECTOR'
213
213
  const fetched = await executeTimeout(
214
214
  (_signal: AbortSignal) =>
215
215
  collector.collectTxs(
216
- MissingTxsTracker.fromArray(parsedTxHashes),
216
+ RequestTracker.create(parsedTxHashes, new Date(Date.now() + internalTimeoutMs)),
217
217
  parsedProposal,
218
218
  pinnedPeer,
219
- internalTimeoutMs,
220
219
  ),
221
220
  timeoutMs,
222
221
  () => new Error(`Collector timed out after ${timeoutMs}ms`),
@@ -231,10 +230,9 @@ async function runCollector(cmd: Extract<WorkerCommand, { type: 'RUN_COLLECTOR'
231
230
  const fetched = await executeTimeout(
232
231
  (_signal: AbortSignal) =>
233
232
  collector.collectTxs(
234
- MissingTxsTracker.fromArray(parsedTxHashes),
233
+ RequestTracker.create(parsedTxHashes, new Date(Date.now() + internalTimeoutMs)),
235
234
  parsedProposal,
236
235
  pinnedPeer,
237
- internalTimeoutMs,
238
236
  ),
239
237
  timeoutMs,
240
238
  () => new Error(`Collector timed out after ${timeoutMs}ms`),
@@ -261,9 +259,20 @@ async function stopClient() {
261
259
  attestationPool = undefined;
262
260
  }
263
261
 
262
+ function gracefulExit(code: number = 0) {
263
+ try {
264
+ if (process.connected) {
265
+ process.disconnect();
266
+ }
267
+ } catch {
268
+ // IPC channel already closed
269
+ }
270
+ setTimeout(() => process.exit(code), 5000).unref();
271
+ }
272
+
264
273
  process.on('disconnect', () => {
265
274
  ipcDisconnected = true;
266
- void stopClient().finally(() => process.exit(0));
275
+ void stopClient();
267
276
  });
268
277
 
269
278
  process.on('error', err => {
@@ -327,7 +336,7 @@ process.on('message', (msg: WorkerCommand) => {
327
336
  case 'STOP': {
328
337
  await stopClient();
329
338
  await sendMessage({ type: 'STOPPED', requestId });
330
- process.exit(0);
339
+ gracefulExit(0);
331
340
  break;
332
341
  }
333
342
  default: {
@@ -338,7 +347,8 @@ process.on('message', (msg: WorkerCommand) => {
338
347
  } catch (err: any) {
339
348
  await sendMessage({ type: 'ERROR', requestId, error: err?.message ?? String(err) });
340
349
  if (msg.type === 'START') {
341
- process.exit(1);
350
+ await stopClient();
351
+ gracefulExit(1);
342
352
  }
343
353
  }
344
354
  })();
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' | 'expectedBlockProposalsPerSlot'> {
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;
@@ -190,11 +213,36 @@ export interface P2PConfig
190
213
 
191
214
  /** Minimum age (ms) a transaction must have been in the pool before it's eligible for block building. */
192
215
  minTxPoolAgeMs: number;
216
+
217
+ /** Minimum percentage fee increase required to replace an existing tx via RPC (0 = no bump). */
218
+ priceBumpPercentage: bigint;
193
219
  }
194
220
 
195
221
  export const DEFAULT_P2P_PORT = 40400;
196
222
 
197
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
+ },
198
246
  p2pEnabled: {
199
247
  env: 'P2P_ENABLED',
200
248
  description: 'A flag dictating whether the P2P subsystem should be enabled.',
@@ -225,6 +273,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
225
273
  description: 'The frequency in which to check for new peers.',
226
274
  ...numberConfigHelper(30_000),
227
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
+ },
228
281
  l2QueueSize: {
229
282
  env: 'P2P_L2_QUEUE_SIZE',
230
283
  description: 'Size of queue of L2 blocks to store.',
@@ -390,15 +443,16 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
390
443
  },
391
444
  p2pStoreMapSizeKb: {
392
445
  env: 'P2P_STORE_MAP_SIZE_KB',
393
- parseEnv: (val: string | undefined) => (val ? +val : undefined),
446
+ parseEnv: (val: string) => +val,
394
447
  description: 'The maximum possible size of the P2P DB in KB. Overwrites the general dataStoreMapSizeKb.',
395
448
  },
396
- txPublicSetupAllowList: {
449
+ txPublicSetupAllowListExtend: {
397
450
  env: 'TX_PUBLIC_SETUP_ALLOWLIST',
398
451
  parseEnv: (val: string) => parseAllowList(val),
399
- 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 +.',
400
454
  printDefault: () =>
401
- 'AuthRegistry, FeeJuice.increase_public_balance, Token.increase_public_balance, FPC.prepare_fee',
455
+ 'Default: AuthRegistry._set_authorized, AuthRegistry.set_authorized, FeeJuice._increase_public_balance',
402
456
  },
403
457
  maxPendingTxCount: {
404
458
  env: 'P2P_MAX_PENDING_TX_COUNT',
@@ -448,6 +502,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
448
502
  description: 'Alters the format of p2p messages to include things like broadcast timestamp FOR TESTING ONLY',
449
503
  ...booleanConfigHelper(false),
450
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
+ },
451
510
  fishermanMode: {
452
511
  env: 'FISHERMAN_MODE',
453
512
  description:
@@ -464,6 +523,12 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
464
523
  description: 'Minimum age (ms) a transaction must have been in the pool before it is eligible for block building.',
465
524
  ...numberConfigHelper(2_000),
466
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
+ },
467
532
  ...sharedSequencerConfigMappings,
468
533
  ...p2pReqRespConfigMappings,
469
534
  ...batchTxRequesterConfigMappings,
@@ -521,13 +586,44 @@ export const bootnodeConfigMappings = pickConfigMappings(
521
586
  bootnodeConfigKeys,
522
587
  );
523
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
+
524
618
  /**
525
619
  * Parses a string to a list of allowed elements.
526
- * Each encoded is expected to be of one of the following formats
527
- * `I:${address}`
528
- * `I:${address}:${selector}`
529
- * `C:${classId}`
530
- * `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).
531
627
  *
532
628
  * @param value The string to parse
533
629
  * @returns A list of allowed elements
@@ -540,31 +636,37 @@ export function parseAllowList(value: string): AllowedElement[] {
540
636
  }
541
637
 
542
638
  for (const val of value.split(',')) {
543
- const [typeString, identifierString, selectorString] = val.split(':');
544
- 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) : {};
545
653
 
546
654
  if (typeString === 'I') {
547
- if (selector) {
548
- entries.push({
549
- address: AztecAddress.fromString(identifierString),
550
- selector,
551
- });
552
- } else {
553
- entries.push({
554
- address: AztecAddress.fromString(identifierString),
555
- });
556
- }
655
+ entries.push({
656
+ address: AztecAddress.fromString(identifierString),
657
+ selector,
658
+ ...flags,
659
+ });
557
660
  } else if (typeString === 'C') {
558
- if (selector) {
559
- entries.push({
560
- classId: Fr.fromHexString(identifierString),
561
- selector,
562
- });
563
- } else {
564
- entries.push({
565
- classId: Fr.fromHexString(identifierString),
566
- });
567
- }
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
+ );
568
670
  }
569
671
  }
570
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
+ }
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 () => {