@aztec/p2p 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a

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 (447) hide show
  1. package/README.md +129 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +9 -1
  5. package/dest/client/factory.d.ts +5 -4
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +33 -15
  8. package/dest/client/interface.d.ts +14 -5
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +13 -9
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +93 -49
  13. package/dest/config.d.ts +153 -102
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +134 -35
  16. package/dest/errors/p2p-service.error.d.ts +9 -0
  17. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  18. package/dest/errors/p2p-service.error.js +10 -0
  19. package/dest/errors/reqresp.error.d.ts +1 -20
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +0 -21
  22. package/dest/index.d.ts +1 -2
  23. package/dest/index.d.ts.map +1 -1
  24. package/dest/index.js +0 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
  26. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  27. package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
  28. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  29. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
  31. package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
  32. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/mocks.js +6 -4
  34. package/dest/mem_pools/index.d.ts +1 -2
  35. package/dest/mem_pools/index.d.ts.map +1 -1
  36. package/dest/mem_pools/instrumentation.d.ts +4 -2
  37. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  38. package/dest/mem_pools/instrumentation.js +33 -15
  39. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  40. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  41. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
  42. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  43. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  44. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  45. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  46. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  47. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  48. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
  49. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
  51. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
  52. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
  54. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
  55. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
  57. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +12 -5
  58. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  59. package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
  60. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
  61. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  62. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
  63. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  64. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  65. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  66. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
  67. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  68. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
  69. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  70. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  71. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +97 -88
  72. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
  73. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
  75. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  76. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  77. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  78. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  79. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  80. package/dest/msg_validators/clock_tolerance.js +61 -3
  81. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
  82. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  83. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
  84. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
  85. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  86. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
  87. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
  88. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  89. package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
  90. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  92. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
  93. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  94. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  95. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  96. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  97. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  98. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  99. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  100. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  101. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  102. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  103. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  104. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  105. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  106. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  107. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  108. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  109. package/dest/msg_validators/tx_validator/factory.d.ts +27 -7
  110. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  111. package/dest/msg_validators/tx_validator/factory.js +47 -17
  112. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  113. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  114. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  115. package/dest/msg_validators/tx_validator/gas_validator.d.ts +48 -7
  116. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  117. package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
  118. package/dest/msg_validators/tx_validator/index.d.ts +4 -1
  119. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  120. package/dest/msg_validators/tx_validator/index.js +3 -0
  121. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  122. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  123. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  124. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  125. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  126. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  127. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  128. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  129. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  130. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  131. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  132. package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
  133. package/dest/services/data_store.d.ts +1 -1
  134. package/dest/services/data_store.d.ts.map +1 -1
  135. package/dest/services/data_store.js +5 -5
  136. package/dest/services/discv5/discV5_service.d.ts +2 -1
  137. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  138. package/dest/services/discv5/discV5_service.js +35 -8
  139. package/dest/services/dummy_service.d.ts +11 -15
  140. package/dest/services/dummy_service.d.ts.map +1 -1
  141. package/dest/services/dummy_service.js +12 -16
  142. package/dest/services/encoding.d.ts +5 -1
  143. package/dest/services/encoding.d.ts.map +1 -1
  144. package/dest/services/encoding.js +7 -1
  145. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  146. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  147. package/dest/services/gossipsub/topic_score_params.js +21 -4
  148. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  149. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  150. package/dest/services/libp2p/instrumentation.js +14 -0
  151. package/dest/services/libp2p/libp2p_service.d.ts +36 -46
  152. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  153. package/dest/services/libp2p/libp2p_service.js +296 -244
  154. package/dest/services/peer-manager/metrics.d.ts +3 -1
  155. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  156. package/dest/services/peer-manager/metrics.js +6 -0
  157. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  158. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  159. package/dest/services/peer-manager/peer_manager.js +40 -11
  160. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  161. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  162. package/dest/services/peer-manager/peer_scoring.js +32 -10
  163. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  164. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  165. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +84 -71
  166. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
  167. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  168. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  169. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  170. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  171. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
  172. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  173. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
  174. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  175. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  176. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  177. package/dest/services/reqresp/config.d.ts +3 -3
  178. package/dest/services/reqresp/config.d.ts.map +1 -1
  179. package/dest/services/reqresp/interface.d.ts +16 -18
  180. package/dest/services/reqresp/interface.d.ts.map +1 -1
  181. package/dest/services/reqresp/interface.js +10 -20
  182. package/dest/services/reqresp/metrics.d.ts +1 -1
  183. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  184. package/dest/services/reqresp/metrics.js +0 -1
  185. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  186. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  187. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
  188. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  189. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  190. package/dest/services/reqresp/protocols/index.js +0 -1
  191. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  192. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  193. package/dest/services/reqresp/protocols/tx.js +1 -3
  194. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  195. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  196. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  197. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  198. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  199. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  200. package/dest/services/reqresp/reqresp.d.ts +7 -29
  201. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  202. package/dest/services/reqresp/reqresp.js +41 -214
  203. package/dest/services/service.d.ts +9 -12
  204. package/dest/services/service.d.ts.map +1 -1
  205. package/dest/services/tx_collection/config.d.ts +2 -23
  206. package/dest/services/tx_collection/config.d.ts.map +1 -1
  207. package/dest/services/tx_collection/config.js +2 -55
  208. package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
  209. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
  210. package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
  211. package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
  212. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
  213. package/dest/services/tx_collection/file_store_tx_source.js +39 -29
  214. package/dest/services/tx_collection/index.d.ts +2 -3
  215. package/dest/services/tx_collection/index.d.ts.map +1 -1
  216. package/dest/services/tx_collection/index.js +0 -1
  217. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  218. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  219. package/dest/services/tx_collection/instrumentation.js +0 -2
  220. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  221. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  222. package/dest/services/tx_collection/request_tracker.js +84 -0
  223. package/dest/services/tx_collection/tx_collection.d.ts +36 -55
  224. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  225. package/dest/services/tx_collection/tx_collection.js +275 -119
  226. package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
  227. package/dest/services/tx_collection/tx_collection_sink.js +2 -2
  228. package/dest/services/tx_collection/tx_source.d.ts +6 -5
  229. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  230. package/dest/services/tx_collection/tx_source.js +9 -7
  231. package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
  232. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  233. package/dest/services/tx_file_store/tx_file_store.js +4 -14
  234. package/dest/services/tx_provider.d.ts +3 -1
  235. package/dest/services/tx_provider.d.ts.map +1 -1
  236. package/dest/services/tx_provider.js +3 -0
  237. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  238. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  239. package/dest/test-helpers/make-test-p2p-clients.js +5 -2
  240. package/dest/test-helpers/mock-pubsub.d.ts +23 -9
  241. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  242. package/dest/test-helpers/mock-pubsub.js +44 -44
  243. package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
  244. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  245. package/dest/test-helpers/reqresp-nodes.js +16 -18
  246. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  247. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  248. package/dest/test-helpers/test_tx_provider.js +3 -0
  249. package/dest/test-helpers/testbench-utils.d.ts +12 -14
  250. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  251. package/dest/test-helpers/testbench-utils.js +42 -15
  252. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  253. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  254. package/dest/testbench/p2p_client_testbench_worker.js +85 -39
  255. package/dest/testbench/worker_client_manager.d.ts +12 -6
  256. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  257. package/dest/testbench/worker_client_manager.js +57 -11
  258. package/dest/util.d.ts +12 -7
  259. package/dest/util.d.ts.map +1 -1
  260. package/dest/util.js +35 -14
  261. package/dest/versioning.d.ts +3 -6
  262. package/dest/versioning.d.ts.map +1 -1
  263. package/dest/versioning.js +3 -24
  264. package/package.json +15 -14
  265. package/src/bootstrap/bootstrap.ts +9 -1
  266. package/src/client/factory.ts +57 -8
  267. package/src/client/interface.ts +15 -11
  268. package/src/client/p2p_client.ts +106 -70
  269. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  270. package/src/config.ts +226 -36
  271. package/src/errors/p2p-service.error.ts +11 -0
  272. package/src/errors/reqresp.error.ts +0 -25
  273. package/src/index.ts +0 -1
  274. package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
  275. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
  276. package/src/mem_pools/attestation_pool/mocks.ts +13 -8
  277. package/src/mem_pools/index.ts +0 -3
  278. package/src/mem_pools/instrumentation.ts +22 -14
  279. package/src/mem_pools/tx_pool_v2/README.md +9 -1
  280. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
  281. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  282. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  283. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
  284. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  285. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
  286. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
  287. package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
  288. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
  289. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  290. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
  291. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +101 -94
  292. package/src/msg_validators/attestation_validator/README.md +49 -0
  293. package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
  294. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
  295. package/src/msg_validators/clock_tolerance.ts +79 -3
  296. package/src/msg_validators/proposal_validator/README.md +123 -0
  297. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
  298. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
  299. package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
  300. package/src/msg_validators/tx_validator/README.md +15 -3
  301. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
  302. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  303. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  304. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  305. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  306. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  307. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  308. package/src/msg_validators/tx_validator/factory.ts +61 -10
  309. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  310. package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
  311. package/src/msg_validators/tx_validator/index.ts +3 -0
  312. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  313. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  314. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  315. package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
  316. package/src/services/data_store.ts +5 -13
  317. package/src/services/discv5/discV5_service.ts +38 -5
  318. package/src/services/dummy_service.ts +14 -39
  319. package/src/services/encoding.ts +9 -1
  320. package/src/services/gossipsub/topic_score_params.ts +36 -4
  321. package/src/services/libp2p/instrumentation.ts +14 -0
  322. package/src/services/libp2p/libp2p_service.ts +321 -276
  323. package/src/services/peer-manager/metrics.ts +7 -0
  324. package/src/services/peer-manager/peer_manager.ts +46 -11
  325. package/src/services/peer-manager/peer_scoring.ts +27 -5
  326. package/src/services/reqresp/README.md +215 -0
  327. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  328. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +83 -77
  329. package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
  330. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  331. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
  332. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  333. package/src/services/reqresp/config.ts +2 -2
  334. package/src/services/reqresp/interface.ts +21 -47
  335. package/src/services/reqresp/metrics.ts +0 -1
  336. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
  337. package/src/services/reqresp/protocols/index.ts +0 -1
  338. package/src/services/reqresp/protocols/tx.ts +1 -3
  339. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  340. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  341. package/src/services/reqresp/reqresp.ts +45 -260
  342. package/src/services/service.ts +12 -28
  343. package/src/services/tx_collection/config.ts +3 -80
  344. package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
  345. package/src/services/tx_collection/file_store_tx_source.ts +43 -31
  346. package/src/services/tx_collection/index.ts +1 -6
  347. package/src/services/tx_collection/instrumentation.ts +1 -7
  348. package/src/services/tx_collection/request_tracker.ts +127 -0
  349. package/src/services/tx_collection/tx_collection.ts +331 -176
  350. package/src/services/tx_collection/tx_collection_sink.ts +2 -2
  351. package/src/services/tx_collection/tx_source.ts +8 -7
  352. package/src/services/tx_file_store/tx_file_store.ts +5 -17
  353. package/src/services/tx_provider.ts +5 -0
  354. package/src/test-helpers/make-test-p2p-clients.ts +4 -1
  355. package/src/test-helpers/mock-pubsub.ts +46 -60
  356. package/src/test-helpers/reqresp-nodes.ts +13 -23
  357. package/src/test-helpers/test_tx_provider.ts +5 -0
  358. package/src/test-helpers/testbench-utils.ts +53 -28
  359. package/src/testbench/p2p_client_testbench_worker.ts +89 -55
  360. package/src/testbench/worker_client_manager.ts +72 -25
  361. package/src/util.ts +33 -18
  362. package/src/versioning.ts +3 -33
  363. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  364. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  365. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
  366. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  367. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  368. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  369. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  370. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  371. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  372. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  373. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  374. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  375. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  376. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  377. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  378. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  379. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  380. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  381. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  382. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  383. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  384. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  385. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  386. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  387. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  388. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  389. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  390. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  391. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  392. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  393. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  394. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  395. package/dest/mem_pools/tx_pool/index.js +0 -2
  396. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  397. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  398. package/dest/mem_pools/tx_pool/priority.js +0 -15
  399. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  400. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  401. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  402. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  403. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  404. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  405. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  406. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  407. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  408. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  409. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  410. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  411. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  412. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  413. package/dest/services/reqresp/protocols/block.js +0 -32
  414. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
  415. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  416. package/dest/services/tx_collection/fast_tx_collection.js +0 -327
  417. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  418. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  419. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  420. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
  421. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  422. package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
  423. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
  424. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  425. package/dest/services/tx_collection/slow_tx_collection.js +0 -211
  426. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
  427. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  428. package/src/mem_pools/tx_pool/README.md +0 -270
  429. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  430. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  431. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  432. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  433. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  434. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  435. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  436. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  437. package/src/mem_pools/tx_pool/index.ts +0 -2
  438. package/src/mem_pools/tx_pool/priority.ts +0 -20
  439. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  440. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  441. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  442. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  443. package/src/services/reqresp/protocols/block.ts +0 -37
  444. package/src/services/tx_collection/fast_tx_collection.ts +0 -387
  445. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
  446. package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
  447. package/src/services/tx_collection/slow_tx_collection.ts +0 -266
package/dest/config.js CHANGED
@@ -1,15 +1,41 @@
1
- import { booleanConfigHelper, getConfigFromMappings, getDefaultConfig, numberConfigHelper, percentageConfigHelper, pickConfigMappings, secretStringConfigHelper } from '@aztec/foundation/config';
1
+ import { bigintConfigHelper, booleanConfigHelper, getConfigFromMappings, getDefaultConfig, numberConfigHelper, optionalNumberConfigHelper, percentageConfigHelper, pickConfigMappings, secretStringConfigHelper } from '@aztec/foundation/config';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
- import { dataConfigMappings } from '@aztec/kv-store/config';
4
3
  import { FunctionSelector } from '@aztec/stdlib/abi/function-selector';
5
4
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
6
5
  import { chainConfigMappings, sharedSequencerConfigMappings } from '@aztec/stdlib/config';
6
+ import { dataConfigMappings } from '@aztec/stdlib/kv-store';
7
7
  import { batchTxRequesterConfigMappings } from './services/reqresp/batch-tx-requester/config.js';
8
8
  import { p2pReqRespConfigMappings } from './services/reqresp/config.js';
9
9
  import { txCollectionConfigMappings } from './services/tx_collection/config.js';
10
10
  import { txFileStoreConfigMappings } from './services/tx_file_store/config.js';
11
11
  export const DEFAULT_P2P_PORT = 40400;
12
+ /** Default endpoints used to discover this machine's public IPv4 when `queryForIp` is enabled. */ export const DEFAULT_PUBLIC_IP_SERVICES = [
13
+ 'https://api.ipify.org/',
14
+ 'https://checkip.amazonaws.com/',
15
+ 'https://ifconfig.me/ip',
16
+ 'https://icanhazip.com/'
17
+ ];
12
18
  export const p2pConfigMappings = {
19
+ validateMaxTxsPerBlock: {
20
+ env: 'VALIDATOR_MAX_TX_PER_BLOCK',
21
+ description: 'Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set.',
22
+ ...optionalNumberConfigHelper()
23
+ },
24
+ validateMaxTxsPerCheckpoint: {
25
+ env: 'VALIDATOR_MAX_TX_PER_CHECKPOINT',
26
+ description: 'Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set.',
27
+ ...optionalNumberConfigHelper()
28
+ },
29
+ validateMaxL2BlockGas: {
30
+ env: 'VALIDATOR_MAX_L2_BLOCK_GAS',
31
+ description: 'Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected.',
32
+ ...optionalNumberConfigHelper()
33
+ },
34
+ validateMaxDABlockGas: {
35
+ env: 'VALIDATOR_MAX_DA_BLOCK_GAS',
36
+ description: 'Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected.',
37
+ ...optionalNumberConfigHelper()
38
+ },
13
39
  p2pEnabled: {
14
40
  env: 'P2P_ENABLED',
15
41
  description: 'A flag dictating whether the P2P subsystem should be enabled.',
@@ -40,6 +66,11 @@ export const p2pConfigMappings = {
40
66
  description: 'The frequency in which to check for new peers.',
41
67
  ...numberConfigHelper(30_000)
42
68
  },
69
+ peerFailedBanTimeMs: {
70
+ env: 'P2P_PEER_FAILED_BAN_TIME_MS',
71
+ description: 'How long to ban a peer after it fails maximum dial attempts.',
72
+ ...numberConfigHelper(5 * 60 * 1000)
73
+ },
43
74
  l2QueueSize: {
44
75
  env: 'P2P_L2_QUEUE_SIZE',
45
76
  description: 'Size of queue of L2 blocks to store.',
@@ -98,6 +129,12 @@ export const p2pConfigMappings = {
98
129
  description: 'If announceUdpAddress or announceTcpAddress are not provided, query for the IP address of the machine. Default is false.',
99
130
  ...booleanConfigHelper()
100
131
  },
132
+ publicIpServices: {
133
+ env: 'P2P_PUBLIC_IP_SERVICES',
134
+ parseEnv: (val)=>val.split(',').map((s)=>s.trim()).filter(Boolean),
135
+ description: 'Comma-separated HTTPS URLs that return plain-text public IPv4. Used when P2P_QUERY_FOR_IP is true and P2P_IP is unset. Tried in order until one succeeds.',
136
+ defaultValue: DEFAULT_PUBLIC_IP_SERVICES
137
+ },
101
138
  gossipsubInterval: {
102
139
  env: 'P2P_GOSSIPSUB_INTERVAL_MS',
103
140
  description: 'The interval of the gossipsub heartbeat to perform maintenance tasks.',
@@ -131,7 +168,7 @@ export const p2pConfigMappings = {
131
168
  gossipsubMcacheLength: {
132
169
  env: 'P2P_GOSSIPSUB_MCACHE_LENGTH',
133
170
  description: 'The number of gossipsub interval message cache windows to keep.',
134
- ...numberConfigHelper(6)
171
+ ...numberConfigHelper(12)
135
172
  },
136
173
  gossipsubMcacheGossip: {
137
174
  env: 'P2P_GOSSIPSUB_MCACHE_GOSSIP',
@@ -203,14 +240,14 @@ export const p2pConfigMappings = {
203
240
  },
204
241
  p2pStoreMapSizeKb: {
205
242
  env: 'P2P_STORE_MAP_SIZE_KB',
206
- parseEnv: (val)=>val ? +val : undefined,
243
+ ...optionalNumberConfigHelper(),
207
244
  description: 'The maximum possible size of the P2P DB in KB. Overwrites the general dataStoreMapSizeKb.'
208
245
  },
209
- txPublicSetupAllowList: {
246
+ txPublicSetupAllowListExtend: {
210
247
  env: 'TX_PUBLIC_SETUP_ALLOWLIST',
211
248
  parseEnv: (val)=>parseAllowList(val),
212
- description: 'The list of functions calls allowed to run in setup',
213
- printDefault: ()=>'AuthRegistry, FeeJuice.increase_public_balance, Token.increase_public_balance, FPC.prepare_fee'
249
+ description: '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 +.',
250
+ printDefault: ()=>'Default: AuthRegistry._set_authorized, AuthRegistry.set_authorized, FeeJuice._increase_public_balance'
214
251
  },
215
252
  maxPendingTxCount: {
216
253
  env: 'P2P_MAX_PENDING_TX_COUNT',
@@ -224,6 +261,11 @@ export const p2pConfigMappings = {
224
261
  description: 'The number of messages to keep in the seen message cache',
225
262
  ...numberConfigHelper(100_000)
226
263
  },
264
+ txValidationCacheSize: {
265
+ env: 'P2P_TX_VALIDATION_CACHE_SIZE',
266
+ description: 'Maximum number of items to keep in the tx validation LRU cache.',
267
+ ...numberConfigHelper(5_000)
268
+ },
227
269
  p2pDisableStatusHandshake: {
228
270
  env: 'P2P_DISABLE_STATUS_HANDSHAKE',
229
271
  description: 'True to disable the status handshake on peer connected.',
@@ -259,6 +301,11 @@ export const p2pConfigMappings = {
259
301
  description: 'Alters the format of p2p messages to include things like broadcast timestamp FOR TESTING ONLY',
260
302
  ...booleanConfigHelper(false)
261
303
  },
304
+ l1PublishingTime: {
305
+ env: 'SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT',
306
+ description: 'How much time (in seconds) we allow in the slot for publishing the L1 tx (defaults to 1 L1 slot).',
307
+ ...optionalNumberConfigHelper()
308
+ },
262
309
  fishermanMode: {
263
310
  env: 'FISHERMAN_MODE',
264
311
  description: 'Whether to run in fisherman mode: validates all proposals and attestations but does not broadcast attestations or participate in consensus.',
@@ -268,11 +315,38 @@ export const p2pConfigMappings = {
268
315
  description: 'Broadcast block proposals even when a conflicting proposal for the same slot already exists in the pool (for testing purposes only).',
269
316
  ...booleanConfigHelper(false)
270
317
  },
318
+ skipIncomingProposals: {
319
+ description: 'Drop incoming block and checkpoint proposals at the libp2p dispatch layer (for testing only)',
320
+ ...booleanConfigHelper(false)
321
+ },
322
+ skipProposalSlotValidation: {
323
+ description: 'Accept proposal gossip regardless of slot timing (for testing only)',
324
+ ...booleanConfigHelper(false)
325
+ },
326
+ skipCheckpointProposalValidation: {
327
+ description: 'Skip checkpoint proposal validation and always attest, broadcasting the attestation before processing the embedded last block',
328
+ ...booleanConfigHelper(false)
329
+ },
271
330
  minTxPoolAgeMs: {
272
331
  env: 'P2P_MIN_TX_POOL_AGE_MS',
273
332
  description: 'Minimum age (ms) a transaction must have been in the pool before it is eligible for block building.',
274
333
  ...numberConfigHelper(2_000)
275
334
  },
335
+ slashDataWithholdingToleranceSlots: {
336
+ env: 'SLASH_DATA_WITHHOLDING_TOLERANCE_SLOTS',
337
+ description: 'L2 slots to wait after a checkpoint slot before declaring its txs missing. Drives both the data-withholding slasher check and the missing-tx collection deadline.',
338
+ ...numberConfigHelper(3)
339
+ },
340
+ p2pMissingTxCollectionDeadlineSlots: {
341
+ env: 'P2P_MISSING_TX_COLLECTION_DEADLINE_SLOTS',
342
+ description: 'Optional deadline (in L2 slots after the block slot) for collecting missing txs for unproven mined blocks. Clamped up to the data-withholding tolerance window so collection never gives up before the slash verdict.',
343
+ ...optionalNumberConfigHelper()
344
+ },
345
+ priceBumpPercentage: {
346
+ env: 'P2P_RPC_PRICE_BUMP_PERCENTAGE',
347
+ description: 'Minimum percentage fee increase required to replace an existing tx via RPC. Even at 0%, replacement still requires paying at least 1 unit more.',
348
+ ...bigintConfigHelper(10n)
349
+ },
276
350
  ...sharedSequencerConfigMappings,
277
351
  ...p2pReqRespConfigMappings,
278
352
  ...batchTxRequesterConfigMappings,
@@ -300,20 +374,45 @@ const bootnodeConfigKeys = [
300
374
  'dataStoreMapSizeKb',
301
375
  'bootstrapNodes',
302
376
  'l1ChainId',
303
- 'queryForIp'
377
+ 'queryForIp',
378
+ 'publicIpServices'
304
379
  ];
305
380
  export const bootnodeConfigMappings = pickConfigMappings({
306
381
  ...p2pConfigMappings,
307
382
  ...dataConfigMappings,
308
383
  ...chainConfigMappings
309
384
  }, bootnodeConfigKeys);
385
+ /**
386
+ * Parses a `+`-separated flags string into validation properties for an allow list entry.
387
+ * Supported flags: `os` (onlySelf), `rn` (rejectNullMsgSender), `cl=N` (calldataLength).
388
+ */ function parseFlags(flags, entry) {
389
+ const result = {};
390
+ for (const flag of flags.split('+')){
391
+ if (flag === 'os') {
392
+ result.onlySelf = true;
393
+ } else if (flag === 'rn') {
394
+ result.rejectNullMsgSender = true;
395
+ } else if (flag.startsWith('cl=')) {
396
+ const n = parseInt(flag.slice(3), 10);
397
+ if (isNaN(n) || n < 0) {
398
+ throw new Error(`Invalid allow list entry "${entry}": invalid calldataLength in flag "${flag}". Expected a non-negative integer.`);
399
+ }
400
+ result.calldataLength = n;
401
+ } else {
402
+ throw new Error(`Invalid allow list entry "${entry}": unknown flag "${flag}". Supported flags: os, rn, cl=N.`);
403
+ }
404
+ }
405
+ return result;
406
+ }
310
407
  /**
311
408
  * Parses a string to a list of allowed elements.
312
- * Each encoded is expected to be of one of the following formats
313
- * `I:${address}`
314
- * `I:${address}:${selector}`
315
- * `C:${classId}`
316
- * `C:${classId}:${selector}`
409
+ * Each entry is expected to be of one of the following formats:
410
+ * `I:${address}:${selector}` — instance (contract address) with function selector
411
+ * `C:${classId}:${selector}` — class with function selector
412
+ *
413
+ * An optional flags segment can be appended after the selector:
414
+ * `I:${address}:${selector}:${flags}` or `C:${classId}:${selector}:${flags}`
415
+ * where flags is a `+`-separated list of: `os` (onlySelf), `rn` (rejectNullMsgSender), `cl=N` (calldataLength).
317
416
  *
318
417
  * @param value The string to parse
319
418
  * @returns A list of allowed elements
@@ -323,30 +422,30 @@ export const bootnodeConfigMappings = pickConfigMappings({
323
422
  return entries;
324
423
  }
325
424
  for (const val of value.split(',')){
326
- const [typeString, identifierString, selectorString] = val.split(':');
327
- const selector = selectorString !== undefined ? FunctionSelector.fromString(selectorString) : undefined;
425
+ const trimmed = val.trim();
426
+ if (!trimmed) {
427
+ continue;
428
+ }
429
+ const [typeString, identifierString, selectorString, flagsString] = trimmed.split(':');
430
+ if (!selectorString) {
431
+ throw new Error(`Invalid allow list entry "${trimmed}": selector is required. Expected format: I:address:selector or C:classId:selector`);
432
+ }
433
+ const selector = FunctionSelector.fromString(selectorString);
434
+ const flags = flagsString ? parseFlags(flagsString, trimmed) : {};
328
435
  if (typeString === 'I') {
329
- if (selector) {
330
- entries.push({
331
- address: AztecAddress.fromString(identifierString),
332
- selector
333
- });
334
- } else {
335
- entries.push({
336
- address: AztecAddress.fromString(identifierString)
337
- });
338
- }
436
+ entries.push({
437
+ address: AztecAddress.fromString(identifierString),
438
+ selector,
439
+ ...flags
440
+ });
339
441
  } else if (typeString === 'C') {
340
- if (selector) {
341
- entries.push({
342
- classId: Fr.fromHexString(identifierString),
343
- selector
344
- });
345
- } else {
346
- entries.push({
347
- classId: Fr.fromHexString(identifierString)
348
- });
349
- }
442
+ entries.push({
443
+ classId: Fr.fromHexString(identifierString),
444
+ selector,
445
+ ...flags
446
+ });
447
+ } else {
448
+ throw new Error(`Invalid allow list entry "${trimmed}": unknown type "${typeString}". Expected "I" (instance) or "C" (class).`);
350
449
  }
351
450
  }
352
451
  return entries;
@@ -0,0 +1,9 @@
1
+ /** Checkpoint Proposal Received Callback Not Registered Error
2
+ *
3
+ * Error triggered if the allNodesCheckpointReceivedCallback is not registered
4
+ * @category Errors
5
+ */
6
+ export declare class CheckpointProposalReceivedCallbackNotRegisteredError extends Error {
7
+ constructor();
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJwLXNlcnZpY2UuZXJyb3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvcDJwLXNlcnZpY2UuZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILHFCQUFhLG9EQUFxRCxTQUFRLEtBQUs7SUFDN0UsY0FHQztDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"p2p-service.error.d.ts","sourceRoot":"","sources":["../../src/errors/p2p-service.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,oDAAqD,SAAQ,KAAK;IAC7E,cAGC;CACF"}
@@ -0,0 +1,10 @@
1
+ /** Checkpoint Proposal Received Callback Not Registered Error
2
+ *
3
+ * Error triggered if the allNodesCheckpointReceivedCallback is not registered
4
+ * @category Errors
5
+ */ export class CheckpointProposalReceivedCallbackNotRegisteredError extends Error {
6
+ constructor(){
7
+ super('FATAL (allNodesCheckpointReceivedCallback): All nodes should register a checkpoint proposal handler');
8
+ this.name = 'CheckpointProposalReceivedCallbackNotRegisteredError';
9
+ }
10
+ }
@@ -6,23 +6,4 @@
6
6
  export declare class IndividualReqRespTimeoutError extends Error {
7
7
  constructor();
8
8
  }
9
- /** Collective request timeout error
10
- *
11
- * This error will be thrown when a req resp request times out regardless of the peer.
12
- * @category Errors
13
- */
14
- export declare class CollectiveReqRespTimeoutError extends Error {
15
- constructor();
16
- }
17
- /** Invalid response error
18
- *
19
- * This error will be thrown when a response is received that is not valid.
20
- *
21
- * This error does not need to be punished as message validators will handle punishing invalid
22
- * requests
23
- * @category Errors
24
- */
25
- export declare class InvalidResponseError extends Error {
26
- constructor();
27
- }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5lcnJvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9yZXFyZXNwLmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSxLQUFLO0lBQ3RELGNBRUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSxLQUFLO0lBQ3RELGNBRUM7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxxQkFBYSxvQkFBcUIsU0FBUSxLQUFLO0lBQzdDLGNBRUM7Q0FDRiJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5lcnJvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9yZXFyZXNwLmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSxLQUFLO0lBQ3RELGNBRUM7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"reqresp.error.d.ts","sourceRoot":"","sources":["../../src/errors/reqresp.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,cAEC;CACF;AAED;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,cAEC;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,cAEC;CACF"}
1
+ {"version":3,"file":"reqresp.error.d.ts","sourceRoot":"","sources":["../../src/errors/reqresp.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,cAEC;CACF"}
@@ -7,24 +7,3 @@
7
7
  super(`Request to peer timed out`);
8
8
  }
9
9
  }
10
- /** Collective request timeout error
11
- *
12
- * This error will be thrown when a req resp request times out regardless of the peer.
13
- * @category Errors
14
- */ export class CollectiveReqRespTimeoutError extends Error {
15
- constructor(){
16
- super(`Request to all peers timed out`);
17
- }
18
- }
19
- /** Invalid response error
20
- *
21
- * This error will be thrown when a response is received that is not valid.
22
- *
23
- * This error does not need to be punished as message validators will handle punishing invalid
24
- * requests
25
- * @category Errors
26
- */ export class InvalidResponseError extends Error {
27
- constructor(){
28
- super(`Invalid response received`);
29
- }
30
- }
package/dest/index.d.ts CHANGED
@@ -5,8 +5,7 @@ export * from './client/index.js';
5
5
  export * from './enr/index.js';
6
6
  export * from './config.js';
7
7
  export * from './mem_pools/attestation_pool/index.js';
8
- export * from './mem_pools/tx_pool/index.js';
9
8
  export * from './mem_pools/tx_pool_v2/index.js';
10
9
  export * from './msg_validators/index.js';
11
10
  export * from './services/index.js';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHFCQUFxQixDQUFDIn0=
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxxQkFBcUIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC"}
package/dest/index.js CHANGED
@@ -4,7 +4,6 @@ export * from './client/index.js';
4
4
  export * from './enr/index.js';
5
5
  export * from './config.js';
6
6
  export * from './mem_pools/attestation_pool/index.js';
7
- export * from './mem_pools/tx_pool/index.js';
8
7
  export * from './mem_pools/tx_pool_v2/index.js';
9
8
  export * from './msg_validators/index.js';
10
9
  export * from './services/index.js';
@@ -1,91 +1,123 @@
1
- import { SlotNumber } from '@aztec/foundation/branded-types';
1
+ import type { CheckpointProposalHash, SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
3
3
  import { BlockProposal, CheckpointAttestation, type CheckpointProposalCore } from '@aztec/stdlib/p2p';
4
4
  import { type TelemetryClient } from '@aztec/telemetry-client';
5
5
  /** Result of trying to add an item (proposal or attestation) to the pool */
6
6
  export type TryAddResult = {
7
- /** Whether the item was added */
7
+ /** Whether the item was accepted into pool state. False when it already existed, was invalid, or hit a cap. */
8
8
  added: boolean;
9
- /** Whether the exact item already existed */
9
+ /** Whether the exact signed payload (matched by payload hash) already existed in the pool. */
10
10
  alreadyExists: boolean;
11
- /** Count of items for the position. Meaning varies by method:
12
- * - tryAddBlockProposal: proposals at (slot, indexWithinCheckpoint)
13
- * - tryAddCheckpointProposal: proposals at slot
14
- * - tryAddCheckpointAttestation: attestations by this signer for this slot */
11
+ /** Number of distinct signed-payload hashes seen for the position. Meaning varies by method:
12
+ * - tryAddBlockProposal: distinct payload hashes at (slot, indexWithinCheckpoint)
13
+ * - tryAddCheckpointProposal: distinct payload hashes at slot
14
+ * - tryAddCheckpointAttestation: distinct payload hashes by this signer for this slot */
15
15
  count: number;
16
16
  };
17
- export declare const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 5;
18
- export declare const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
17
+ export type ProposalsForSlot = {
18
+ blockProposals: BlockProposal[];
19
+ checkpointProposals: CheckpointProposalCore[];
20
+ };
21
+ export declare const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
22
+ export declare const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
19
23
  /** Maximum attestations a single signer can make per slot before being rejected. */
20
- export declare const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 3;
24
+ export declare const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
21
25
  /** Public API interface for attestation pools. Used for typing mocks and test implementations. */
22
- export type AttestationPoolApi = Pick<AttestationPool, 'tryAddBlockProposal' | 'getBlockProposal' | 'tryAddCheckpointProposal' | 'getCheckpointProposal' | 'addOwnCheckpointAttestations' | 'tryAddCheckpointAttestation' | 'deleteOlderThan' | 'getCheckpointAttestationsForSlot' | 'getCheckpointAttestationsForSlotAndProposal' | 'hasBlockProposalsForSlot' | 'isEmpty'>;
26
+ export type AttestationPoolApi = Pick<AttestationPool, 'tryAddBlockProposal' | 'getBlockProposalByArchive' | 'getProposalsForSlot' | 'tryAddCheckpointProposal' | 'getCheckpointProposal' | 'addOwnCheckpointAttestations' | 'tryAddCheckpointAttestation' | 'deleteOlderThan' | 'getCheckpointAttestationsForSlot' | 'getCheckpointAttestationsForSlotAndProposal' | 'hasBlockProposalsForSlot' | 'isEmpty'>;
23
27
  /**
24
28
  * Pool for storing attestations and proposals collected by a validator.
25
29
  *
26
30
  * Attestations and proposals observed via the p2p network are stored for requests
27
31
  * from the validator to produce a block, or to serve to other peers.
32
+ *
33
+ * Equivocation detection: distinct *signed payload hashes* arriving at the same
34
+ * position are tracked in the matching index multimap so the equivocation count
35
+ * reaches 2 even when archive collides on `feeAssetPriceModifier` variants.
36
+ * Proposal bytes are retained per accepted payload hash, up to the same equivocation
37
+ * caps, for slashing watchers that need signed P2P proposals.
28
38
  */
29
39
  export declare class AttestationPool {
30
40
  private store;
31
41
  private log;
32
42
  private metrics;
33
- private checkpointAttestations;
34
- private checkpointProposals;
35
- private checkpointProposalsForSlot;
36
- private blockProposals;
37
- private blockProposalsForSlotAndIndex;
38
- private checkpointAttestationsPerSlotAndSigner;
43
+ private attestationPerSlotAndSigner;
44
+ private attestationHashesPerSlotAndSigner;
45
+ private checkpointProposalsPerSlotAndHash;
46
+ private checkpointProposalHashesPerSlot;
47
+ private blockProposalsPerSlotIndexAndHash;
48
+ private blockProposalHashesPerSlotAndIndex;
49
+ private blockProposalKeysPerArchive;
39
50
  constructor(store: AztecAsyncKVStore, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
40
51
  private poolStats;
41
52
  /** Returns whether the pool is empty. */
42
53
  isEmpty(): Promise<boolean>;
43
- private getProposalKey;
44
- private getAttestationKey;
45
- /** Returns range bounds for querying all attestations for a given slot. */
46
- private getAttestationKeyRangeForSlot;
47
- /** Returns range bounds for querying all attestations for a given (slot, proposalId). */
48
- private getAttestationKeyRangeForProposal;
49
- /** Creates a key for the per-signer-per-slot attestation index. Uses padded slot for lexicographic ordering. */
50
- private getSlotSignerKey;
51
54
  /** Number of bits reserved for indexWithinCheckpoint in position keys. */
52
55
  private static readonly INDEX_BITS;
53
56
  /** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */
54
57
  private static readonly MAX_INDEX;
55
- /** Creates a position key for block proposals: (slot << 10) | indexWithinCheckpoint. */
58
+ /** Decimal digits used to left-pad slot numbers in string keys.
59
+ * 10 digits ≈ 3500 years at 36 s/slot, leaving ample headroom. */
60
+ private static readonly SLOT_PAD_DIGITS;
61
+ /** Fixed-width decimal slot string for use in composite string keys. */
62
+ private slotPaddedKey;
63
+ /** Fixed-width decimal index string for use in composite string keys. */
64
+ private indexPaddedKey;
65
+ /** Key for retained block proposals. */
66
+ private getBlockProposalKey;
67
+ /** Range bounds for all retained block proposals in a slot. */
68
+ private getBlockProposalKeyRangeForSlot;
69
+ /** Key for retained checkpoint proposals. */
70
+ private getCheckpointProposalKey;
71
+ /** Range bounds for all retained checkpoint proposals in a slot. */
72
+ private getCheckpointProposalKeyRangeForSlot;
73
+ /** Key for the per-(slot, signer) attestation main store and equivocation index. */
74
+ private getSlotSignerKey;
75
+ /**
76
+ * Returns range bounds for querying all attestations for a given slot.
77
+ * Fixed-width padding ensures the slot prefix sorts cleanly, so using the next
78
+ * slot's prefix as the upper bound captures exactly the current slot's entries.
79
+ */
80
+ private getAttestationKeyRangeForSlot;
81
+ /** Creates a position key for block proposals: slot * 1024 + indexWithinCheckpoint.
82
+ * Uses multiplication instead of bit-shift to avoid 32-bit signed integer overflow
83
+ * (bit-shift overflows after slot ~2^21, roughly 278 days of uptime). */
56
84
  private getBlockPositionKey;
85
+ private multimapHasValue;
57
86
  /**
58
87
  * Attempts to add a block proposal to the pool.
59
88
  *
60
- * This method performs validation and addition in a single call:
61
- * - Checks if the proposal already exists (returns alreadyExists: true if so)
62
- * - Checks if the position has reached the proposal cap (returns added: false if so)
63
- * - Adds the proposal if validation passes
89
+ * - Detects duplicates by signed-payload hash (not archive); a re-broadcast of the
90
+ * exact same signed payload returns `alreadyExists: true`.
91
+ * - Distinct payload hashes at the same `(slot, indexWithinCheckpoint)` are tracked
92
+ * in the equivocation index and retained up to the cap.
64
93
  *
65
94
  * @param blockProposal - The block proposal to add
66
95
  * @returns Result indicating whether the proposal was added and duplicate detection info
67
96
  */
68
97
  tryAddBlockProposal(blockProposal: BlockProposal): Promise<TryAddResult>;
69
- /** Gets the count of block proposals for a given position (slot, indexWithinCheckpoint). */
70
- private getBlockProposalCountForPosition;
71
- private addBlockProposal;
72
98
  /**
73
- * Get block proposal by its ID.
99
+ * Get block proposal by archive root.
74
100
  *
75
- * @param id - The ID of the block proposal to retrieve. The ID is proposal.payload.archive
101
+ * Resolves the archive root through the archive index and returns the first
102
+ * retained proposal for that archive. This lookup is used by block-txs req/resp,
103
+ * where any retained proposal for the requested archive gives the tx hash list.
76
104
  *
77
- * @return The block proposal if it exists, otherwise undefined.
105
+ * @param archiveRoot - The archive root to look up
106
+ * @return The block proposal if it exists and its archive matches, otherwise undefined.
78
107
  */
79
- getBlockProposal(id: string): Promise<BlockProposal | undefined>;
108
+ getBlockProposalByArchive(archiveRoot: string): Promise<BlockProposal | undefined>;
109
+ /** Returns retained signed proposals for a slot. */
110
+ getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot>;
80
111
  /** Checks if any block proposals exist for a given slot (at index 0). */
81
112
  hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean>;
82
113
  /**
83
114
  * Attempts to add a checkpoint proposal to the pool.
84
115
  *
85
- * This method performs validation and addition in a single call:
86
- * - Checks if the proposal already exists (returns alreadyExists: true if so)
87
- * - Checks if the slot has reached the proposal cap (returns added: false if so)
88
- * - Adds the proposal if validation passes
116
+ * - Detects duplicates by signed-payload hash (not archive); a re-broadcast of the
117
+ * exact same signed payload returns `alreadyExists: true`.
118
+ * - Distinct payload hashes at the same slot are tracked in the equivocation index.
119
+ * Distinct payload bytes are retained up to the same cap so slashing watchers
120
+ * can recover signed proposals.
89
121
  *
90
122
  * Note: This method only handles the CheckpointProposalCore. If the original
91
123
  * CheckpointProposal contains a lastBlock, the caller should extract it via
@@ -95,37 +127,44 @@ export declare class AttestationPool {
95
127
  * @returns Result indicating whether the proposal was added and duplicate detection info
96
128
  */
97
129
  tryAddCheckpointProposal(proposal: CheckpointProposalCore): Promise<TryAddResult>;
98
- private addCheckpointProposal;
99
130
  /**
100
- * Get checkpoint proposal by its ID.
131
+ * Get a retained checkpoint proposal stored for the given slot.
132
+ * If multiple proposals were retained for an equivocation, returns the lowest
133
+ * payload hash deterministically.
101
134
  *
102
135
  * Returns a CheckpointProposalCore (without lastBlock info) since the lastBlock
103
136
  * is extracted and stored separately as a BlockProposal when added.
104
137
  *
105
- * @param id - The ID of the checkpoint proposal to retrieve (proposal.archive)
106
- * @return The checkpoint proposal core if it exists, otherwise undefined.
138
+ * @param slot - The slot to look up
139
+ * @return The checkpoint proposal core if one is stored, otherwise undefined.
107
140
  */
108
- getCheckpointProposal(id: string): Promise<CheckpointProposalCore | undefined>;
141
+ getCheckpointProposal(slot: SlotNumber): Promise<CheckpointProposalCore | undefined>;
109
142
  /**
110
143
  * Adds own checkpoint attestations to the pool.
111
- * Skips validations on number of checkpoint attestations stored for the given slot.
144
+ * Skips per-signer cap and equivocation tracking; the caller is trusted.
145
+ * Each (slot, signer) gets a single stored attestation; later additions overwrite.
112
146
  */
113
147
  addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void>;
114
148
  /**
115
149
  * Get all checkpoint attestations for a given slot.
116
150
  *
151
+ * Returns one attestation per (slot, signer) — the first seen for each signer.
152
+ * Later equivocating attestations from the same signer are tracked in the index
153
+ * but their bytes are not retained.
154
+ *
117
155
  * @param slot - The slot to query
118
156
  * @return CheckpointAttestations
119
157
  */
120
158
  getCheckpointAttestationsForSlot(slot: SlotNumber): Promise<CheckpointAttestation[]>;
121
159
  /**
122
- * Get checkpoint attestations for slot and given proposal.
160
+ * Get checkpoint attestations for a slot whose signed payload matches the given
161
+ * proposal payload hash.
123
162
  *
124
163
  * @param slot - The slot to query
125
- * @param proposalId - The proposal to query
126
- * @return CheckpointAttestations
164
+ * @param proposalPayloadHash - Hex-encoded keccak256 of the target proposal's signed payload
165
+ * @return CheckpointAttestations whose `getPayloadHash()` matches `proposalPayloadHash`
127
166
  */
128
- getCheckpointAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<CheckpointAttestation[]>;
167
+ getCheckpointAttestationsForSlotAndProposal(slot: SlotNumber, proposalPayloadHash: CheckpointProposalHash): Promise<CheckpointAttestation[]>;
129
168
  /**
130
169
  * Delete all pool data (attestations, proposals) older than the given slot.
131
170
  *
@@ -135,18 +174,19 @@ export declare class AttestationPool {
135
174
  /**
136
175
  * Attempts to add a checkpoint attestation to the pool.
137
176
  *
138
- * This method performs validation and addition in a single call:
139
- * - Checks if the attestation already exists (returns alreadyExists: true if so)
140
- * - Checks if this signer has reached the per-signer attestation cap for this slot
141
- * - Adds the attestation if validation passes
177
+ * - Detects duplicates by signed-payload hash (not archive); a re-broadcast of the
178
+ * exact same signed payload from the same signer returns `alreadyExists: true`.
179
+ * - Distinct payload hashes from the same (slot, signer) are tracked in the
180
+ * equivocation index. The first one's bytes are stored; later distinct hashes
181
+ * bump `count` so libp2p can fire its duplicate callback.
142
182
  *
143
183
  * @param attestation - The checkpoint attestation to add
144
- * @returns Result indicating whether the attestation was added, existence info, and count of
145
- * attestations by this signer for this slot (for equivocation detection)
184
+ * @returns Result indicating whether the attestation was added, existence info,
185
+ * and number of distinct payload hashes by this signer for this slot
186
+ * (for equivocation detection).
146
187
  */
147
188
  tryAddCheckpointAttestation(attestation: CheckpointAttestation): Promise<TryAddResult>;
148
- private getSignerAttestationCountForSlot;
149
189
  }
150
190
  /** Creates an AttestationPool backed by a temporary store for testing. */
151
191
  export declare function createTestAttestationPool(telemetry?: TelemetryClient): Promise<AttestationPool>;
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF5QixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUlwRixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEVBQ0wsYUFBYSxFQUNiLHFCQUFxQixFQUVyQixLQUFLLHNCQUFzQixFQUM1QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUluRiw0RUFBNEU7QUFDNUUsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixpQ0FBaUM7SUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUNmLDZDQUE2QztJQUM3QyxhQUFhLEVBQUUsT0FBTyxDQUFDO0lBQ3ZCOzs7bUZBRytFO0lBQy9FLEtBQUssRUFBRSxNQUFNLENBQUM7Q0FDZixDQUFDO0FBRUYsZUFBTyxNQUFNLGlDQUFpQyxJQUFJLENBQUM7QUFDbkQsZUFBTyxNQUFNLGdDQUFnQyxJQUFJLENBQUM7QUFDbEQsb0ZBQW9GO0FBQ3BGLGVBQU8sTUFBTSxvQ0FBb0MsSUFBSSxDQUFDO0FBRXRELGtHQUFrRztBQUNsRyxNQUFNLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUNuQyxlQUFlLEVBQ2IscUJBQXFCLEdBQ3JCLGtCQUFrQixHQUNsQiwwQkFBMEIsR0FDMUIsdUJBQXVCLEdBQ3ZCLDhCQUE4QixHQUM5Qiw2QkFBNkIsR0FDN0IsaUJBQWlCLEdBQ2pCLGtDQUFrQyxHQUNsQyw2Q0FBNkMsR0FDN0MsMEJBQTBCLEdBQzFCLFNBQVMsQ0FDWixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxxQkFBYSxlQUFlO0lBMEJ4QixPQUFP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
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQXFCLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzdHLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFxQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVGLE9BQU8sRUFDTCxhQUFhLEVBQ2IscUJBQXFCLEVBRXJCLEtBQUssc0JBQXNCLEVBQzVCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBSW5GLDRFQUE0RTtBQUM1RSxNQUFNLE1BQU0sWUFBWSxHQUFHO0lBQ3pCLCtHQUErRztJQUMvRyxLQUFLLEVBQUUsT0FBTyxDQUFDO0lBQ2YsOEZBQThGO0lBQzlGLGFBQWEsRUFBRSxPQUFPLENBQUM7SUFDdkI7Ozs4RkFHMEY7SUFDMUYsS0FBSyxFQUFFLE1BQU0sQ0FBQztDQUNmLENBQUM7QUFFRixNQUFNLE1BQU0sZ0JBQWdCLEdBQUc7SUFDN0IsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ2hDLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLENBQUM7Q0FDL0MsQ0FBQztBQUVGLGVBQU8sTUFBTSxpQ0FBaUMsSUFBSSxDQUFDO0FBQ25ELGVBQU8sTUFBTSxnQ0FBZ0MsSUFBSSxDQUFDO0FBQ2xELG9GQUFvRjtBQUNwRixlQUFPLE1BQU0sb0NBQW9DLElBQUksQ0FBQztBQUV0RCxrR0FBa0c7QUFDbEcsTUFBTSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FDbkMsZUFBZSxFQUNiLHFCQUFxQixHQUNyQiwyQkFBMkIsR0FDM0IscUJBQXFCLEdBQ3JCLDBCQUEwQixHQUMxQix1QkFBdUIsR0FDdkIs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