@aztec/p2p 0.0.1-commit.5914bae → 0.0.1-commit.59a0419c6

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 (286) hide show
  1. package/dest/client/factory.d.ts +4 -3
  2. package/dest/client/factory.d.ts.map +1 -1
  3. package/dest/client/factory.js +17 -15
  4. package/dest/client/interface.d.ts +9 -2
  5. package/dest/client/interface.d.ts.map +1 -1
  6. package/dest/client/p2p_client.d.ts +3 -2
  7. package/dest/client/p2p_client.d.ts.map +1 -1
  8. package/dest/client/p2p_client.js +30 -8
  9. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +21 -7
  10. package/dest/config.d.ts +107 -103
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +17 -12
  13. package/dest/errors/p2p-service.error.d.ts +9 -0
  14. package/dest/errors/p2p-service.error.d.ts.map +1 -0
  15. package/dest/errors/p2p-service.error.js +10 -0
  16. package/dest/index.d.ts +1 -2
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +0 -1
  19. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.js +16 -9
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
  23. package/dest/mem_pools/index.d.ts +1 -2
  24. package/dest/mem_pools/index.d.ts.map +1 -1
  25. package/dest/mem_pools/instrumentation.d.ts +4 -2
  26. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  27. package/dest/mem_pools/instrumentation.js +16 -14
  28. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
  29. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  30. package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
  31. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  32. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  33. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  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/interfaces.d.ts +10 -5
  36. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  37. package/dest/mem_pools/tx_pool_v2/interfaces.js +1 -0
  38. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +9 -7
  39. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  40. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
  41. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
  42. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
  44. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +1 -1
  45. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -0
  47. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
  48. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +20 -2
  50. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
  51. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  52. package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
  53. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
  54. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  55. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
  56. package/dest/msg_validators/clock_tolerance.d.ts +12 -1
  57. package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
  58. package/dest/msg_validators/clock_tolerance.js +54 -3
  59. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +2 -1
  60. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  61. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +2 -1
  62. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  63. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -1
  64. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  65. package/dest/msg_validators/proposal_validator/proposal_validator.js +19 -11
  66. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  67. package/dest/msg_validators/tx_validator/factory.d.ts +2 -2
  68. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  69. package/dest/msg_validators/tx_validator/factory.js +3 -3
  70. package/dest/msg_validators/tx_validator/gas_validator.d.ts +36 -4
  71. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  72. package/dest/msg_validators/tx_validator/gas_validator.js +50 -33
  73. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  74. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  75. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  76. package/dest/services/data_store.d.ts +1 -1
  77. package/dest/services/data_store.d.ts.map +1 -1
  78. package/dest/services/data_store.js +5 -5
  79. package/dest/services/dummy_service.d.ts +6 -3
  80. package/dest/services/dummy_service.d.ts.map +1 -1
  81. package/dest/services/dummy_service.js +6 -1
  82. package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
  83. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  84. package/dest/services/gossipsub/topic_score_params.js +21 -4
  85. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  86. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  87. package/dest/services/libp2p/instrumentation.js +14 -0
  88. package/dest/services/libp2p/libp2p_service.d.ts +19 -27
  89. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  90. package/dest/services/libp2p/libp2p_service.js +158 -133
  91. package/dest/services/peer-manager/metrics.d.ts +3 -1
  92. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  93. package/dest/services/peer-manager/metrics.js +6 -0
  94. package/dest/services/peer-manager/peer_manager.d.ts +6 -2
  95. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  96. package/dest/services/peer-manager/peer_manager.js +39 -11
  97. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  98. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  99. package/dest/services/peer-manager/peer_scoring.js +32 -10
  100. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
  101. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  102. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +82 -101
  103. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
  104. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  105. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
  106. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  107. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
  108. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  109. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  110. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  111. package/dest/services/reqresp/config.d.ts +3 -3
  112. package/dest/services/reqresp/config.d.ts.map +1 -1
  113. package/dest/services/reqresp/interface.d.ts +14 -9
  114. package/dest/services/reqresp/interface.d.ts.map +1 -1
  115. package/dest/services/reqresp/interface.js +10 -11
  116. package/dest/services/reqresp/metrics.d.ts +1 -1
  117. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  118. package/dest/services/reqresp/metrics.js +0 -1
  119. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  120. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  121. package/dest/services/reqresp/protocols/index.js +0 -1
  122. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  123. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  124. package/dest/services/reqresp/protocols/tx.js +1 -3
  125. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  126. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  127. package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
  128. package/dest/services/reqresp/reqresp.d.ts +4 -2
  129. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  130. package/dest/services/reqresp/reqresp.js +13 -3
  131. package/dest/services/service.d.ts +5 -2
  132. package/dest/services/service.d.ts.map +1 -1
  133. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
  134. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  135. package/dest/services/tx_collection/fast_tx_collection.js +57 -73
  136. package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
  137. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
  138. package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
  139. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  140. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  141. package/dest/services/tx_collection/request_tracker.js +84 -0
  142. package/dest/services/tx_collection/slow_tx_collection.js +1 -1
  143. package/dest/services/tx_collection/tx_collection.d.ts +3 -6
  144. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  145. package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
  146. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  147. package/dest/test-helpers/make-test-p2p-clients.js +4 -1
  148. package/dest/test-helpers/mock-pubsub.d.ts +11 -3
  149. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  150. package/dest/test-helpers/mock-pubsub.js +36 -11
  151. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  152. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  153. package/dest/test-helpers/reqresp-nodes.js +5 -3
  154. package/dest/test-helpers/testbench-utils.d.ts +1 -1
  155. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  156. package/dest/test-helpers/testbench-utils.js +21 -2
  157. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  158. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  159. package/dest/testbench/p2p_client_testbench_worker.js +73 -17
  160. package/dest/testbench/worker_client_manager.d.ts +8 -1
  161. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  162. package/dest/testbench/worker_client_manager.js +51 -2
  163. package/dest/util.d.ts +1 -1
  164. package/package.json +14 -14
  165. package/src/client/factory.ts +25 -19
  166. package/src/client/interface.ts +9 -1
  167. package/src/client/p2p_client.ts +34 -9
  168. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +21 -9
  169. package/src/config.ts +29 -17
  170. package/src/errors/p2p-service.error.ts +11 -0
  171. package/src/index.ts +0 -1
  172. package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
  173. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
  174. package/src/mem_pools/index.ts +0 -3
  175. package/src/mem_pools/instrumentation.ts +17 -13
  176. package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
  177. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  178. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
  179. package/src/mem_pools/tx_pool_v2/interfaces.ts +10 -4
  180. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +24 -12
  181. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
  182. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +3 -0
  183. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +21 -1
  184. package/src/msg_validators/attestation_validator/README.md +1 -1
  185. package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
  186. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
  187. package/src/msg_validators/clock_tolerance.ts +72 -3
  188. package/src/msg_validators/proposal_validator/README.md +4 -4
  189. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +4 -1
  190. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +4 -1
  191. package/src/msg_validators/proposal_validator/proposal_validator.ts +17 -10
  192. package/src/msg_validators/tx_validator/README.md +11 -3
  193. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  194. package/src/msg_validators/tx_validator/factory.ts +3 -1
  195. package/src/msg_validators/tx_validator/gas_validator.ts +82 -33
  196. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  197. package/src/services/data_store.ts +5 -13
  198. package/src/services/dummy_service.ts +8 -2
  199. package/src/services/gossipsub/topic_score_params.ts +36 -4
  200. package/src/services/libp2p/instrumentation.ts +14 -0
  201. package/src/services/libp2p/libp2p_service.ts +154 -143
  202. package/src/services/peer-manager/metrics.ts +7 -0
  203. package/src/services/peer-manager/peer_manager.ts +45 -11
  204. package/src/services/peer-manager/peer_scoring.ts +27 -5
  205. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  206. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +78 -111
  207. package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
  208. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
  209. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  210. package/src/services/reqresp/config.ts +2 -2
  211. package/src/services/reqresp/interface.ts +21 -11
  212. package/src/services/reqresp/metrics.ts +0 -1
  213. package/src/services/reqresp/protocols/index.ts +0 -1
  214. package/src/services/reqresp/protocols/tx.ts +1 -3
  215. package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
  216. package/src/services/reqresp/reqresp.ts +21 -2
  217. package/src/services/service.ts +6 -1
  218. package/src/services/tx_collection/fast_tx_collection.ts +57 -83
  219. package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
  220. package/src/services/tx_collection/request_tracker.ts +127 -0
  221. package/src/services/tx_collection/slow_tx_collection.ts +1 -1
  222. package/src/services/tx_collection/tx_collection.ts +3 -5
  223. package/src/test-helpers/make-test-p2p-clients.ts +3 -1
  224. package/src/test-helpers/mock-pubsub.ts +34 -5
  225. package/src/test-helpers/reqresp-nodes.ts +5 -3
  226. package/src/test-helpers/testbench-utils.ts +29 -3
  227. package/src/testbench/p2p_client_testbench_worker.ts +74 -15
  228. package/src/testbench/worker_client_manager.ts +57 -2
  229. package/src/util.ts +1 -1
  230. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  231. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  232. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  233. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  234. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  235. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  236. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  237. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  238. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  239. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  240. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  241. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
  242. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  243. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  244. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  245. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  246. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  247. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  248. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  249. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  250. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  251. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  252. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  253. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  254. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  255. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  256. package/dest/mem_pools/tx_pool/index.js +0 -2
  257. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  258. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  259. package/dest/mem_pools/tx_pool/priority.js +0 -15
  260. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  261. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  262. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  263. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  264. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  265. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
  266. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  267. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  268. package/dest/services/reqresp/protocols/block.js +0 -32
  269. package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
  270. package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
  271. package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
  272. package/src/mem_pools/tx_pool/README.md +0 -270
  273. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  274. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  275. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  276. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
  277. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  278. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  279. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  280. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  281. package/src/mem_pools/tx_pool/index.ts +0 -2
  282. package/src/mem_pools/tx_pool/priority.ts +0 -20
  283. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  284. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
  285. package/src/services/reqresp/protocols/block.ts +0 -37
  286. package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
@@ -370,14 +370,13 @@ function applyDecs2203RFactory() {
370
370
  function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
371
  return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
372
372
  }
373
- var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _initProto;
373
+ var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _initProto;
374
374
  import { BlockNumber } from '@aztec/foundation/branded-types';
375
375
  import { maxBy } from '@aztec/foundation/collection';
376
376
  import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
377
377
  import { RunningPromise } from '@aztec/foundation/running-promise';
378
378
  import { Timer } from '@aztec/foundation/timer';
379
379
  import { protocolContractsHash } from '@aztec/protocol-contracts';
380
- import { GasFees } from '@aztec/stdlib/gas';
381
380
  import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, PeerErrorSeverityByHarshness, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
382
381
  import { MerkleTreeId } from '@aztec/stdlib/trees';
383
382
  import { Tx } from '@aztec/stdlib/tx';
@@ -395,6 +394,7 @@ import { mplex } from '@libp2p/mplex';
395
394
  import { tcp } from '@libp2p/tcp';
396
395
  import { ENR } from '@nethermindeth/enr';
397
396
  import { createLibp2p } from 'libp2p';
397
+ import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
398
398
  import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
399
399
  import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
400
400
  import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
@@ -408,7 +408,7 @@ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring
408
408
  import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
409
409
  import { PeerManager } from '../peer-manager/peer_manager.js';
410
410
  import { PeerScoring } from '../peer-manager/peer_scoring.js';
411
- import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
411
+ import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
412
412
  import { ReqResp } from '../reqresp/reqresp.js';
413
413
  import { P2PInstrumentation } from './instrumentation.js';
414
414
  _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
@@ -430,12 +430,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
430
430
  [Attributes.BLOCK_ARCHIVE]: request.archiveRoot.toString()
431
431
  })), _dec6 = trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx)=>({
432
432
  [Attributes.TX_HASH]: requestedTxHash.toString()
433
- })), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
434
- [Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
435
- })), _dec8 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
436
- [Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
437
- [Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
438
- [Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
439
433
  }));
440
434
  /**
441
435
  * Lib P2P implementation of the P2PService interface.
@@ -450,6 +444,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
450
444
  epochCache;
451
445
  proofVerifier;
452
446
  worldStateSynchronizer;
447
+ blockMinFeesProvider;
453
448
  static{
454
449
  ({ e: [_initProto] } = _apply_decs_2203_r(this, [
455
450
  [
@@ -486,16 +481,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
486
481
  _dec6,
487
482
  2,
488
483
  "validateRequestedTxs"
489
- ],
490
- [
491
- _dec7,
492
- 2,
493
- "validateRequestedBlock"
494
- ],
495
- [
496
- _dec8,
497
- 2,
498
- "validateCheckpointAttestation"
499
484
  ]
500
485
  ], []));
501
486
  }
@@ -507,7 +492,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
507
492
  checkpointAttestationValidator;
508
493
  protocolVersion;
509
494
  topicStrings;
510
- feesCache;
511
495
  /** Callback invoked when a duplicate proposal is detected (triggers slashing). */ duplicateProposalCallback;
512
496
  /** Callback invoked when a duplicate attestation is detected (triggers slashing). */ duplicateAttestationCallback;
513
497
  /**
@@ -519,13 +503,18 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
519
503
  * Callback for when a checkpoint proposal is received from a peer.
520
504
  * @param checkpoint - The checkpoint proposal received from the peer.
521
505
  * @returns The attestations for the checkpoint, if any.
522
- */ checkpointReceivedCallback;
506
+ */ allNodesCheckpointReceivedCallback;
507
+ /**
508
+ * Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
509
+ * @param checkpoint - The checkpoint proposal received from the peer.
510
+ * @returns The attestations for the checkpoint, if any.
511
+ */ validatorCheckpointReceivedCallback;
523
512
  gossipSubEventHandler;
524
513
  instrumentation;
525
514
  telemetry;
526
515
  logger;
527
- constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
528
- super(telemetry, 'LibP2PService'), this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
516
+ constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, blockMinFeesProvider, telemetry, logger = createLogger('p2p:libp2p_service')){
517
+ super(telemetry, 'LibP2PService'), this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.blockMinFeesProvider = blockMinFeesProvider, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
529
518
  this.telemetry = telemetry;
530
519
  // Create child logger with fisherman prefix if in fisherman mode
531
520
  this.logger = config.fishermanMode ? logger.createChild('[FISHERMAN]') : logger;
@@ -541,13 +530,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
541
530
  this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
542
531
  this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
543
532
  this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
533
+ const p2pPropagationTime = config.attestationPropagationTime;
544
534
  const proposalValidatorOpts = {
545
535
  txsPermitted: !config.disableTransactions,
546
- maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
536
+ maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
537
+ p2pPropagationTime
547
538
  };
548
539
  this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
549
540
  this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
550
- this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) : new CheckpointAttestationValidator(epochCache);
541
+ this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry, {
542
+ l1PublishingTime: config.l1PublishingTime
543
+ }) : new CheckpointAttestationValidator(epochCache, {
544
+ l1PublishingTime: config.l1PublishingTime
545
+ });
551
546
  this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
552
547
  this.blockReceivedCallback = async (block)=>{
553
548
  this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
@@ -555,8 +550,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
555
550
  });
556
551
  return true;
557
552
  };
558
- this.checkpointReceivedCallback = (checkpoint)=>{
559
- this.logger.debug(`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`);
553
+ this.allNodesCheckpointReceivedCallback = (_checkpoint)=>{
554
+ throw new CheckpointProposalReceivedCallbackNotRegisteredError();
555
+ };
556
+ this.validatorCheckpointReceivedCallback = (_checkpoint)=>{
560
557
  return Promise.resolve(undefined);
561
558
  };
562
559
  }
@@ -569,7 +566,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
569
566
  * @param txPool - The transaction pool to be accessed by the service.
570
567
  * @returns The new service.
571
568
  */ static async new(config, peerId, deps) {
572
- const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, telemetry, logger, packageVersion } = deps;
569
+ const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, blockMinFeesProvider, telemetry, logger, packageVersion } = deps;
573
570
  const { p2pPort, maxPeerCount, listenAddress } = config;
574
571
  const bindAddrTcp = convertToMultiaddr(listenAddress, p2pPort, 'tcp');
575
572
  const datastore = new AztecDatastore(peerStore);
@@ -609,9 +606,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
609
606
  const l1Constants = epochCache.getL1Constants();
610
607
  const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
611
608
  slotDurationMs: l1Constants.slotDuration * 1000,
609
+ ethereumSlotDuration: l1Constants.ethereumSlotDuration,
612
610
  heartbeatIntervalMs: config.gossipsubInterval,
613
611
  targetCommitteeSize: l1Constants.targetCommitteeSize,
614
612
  blockDurationMs: config.blockDurationMs,
613
+ l1PublishingTime: config.l1PublishingTime,
614
+ p2pPropagationTime: config.attestationPropagationTime,
615
615
  expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
616
616
  });
617
617
  const node = await createLibp2p({
@@ -726,6 +726,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
726
726
  const peerScoring = new PeerScoring(config, telemetry);
727
727
  const reqresp = new ReqResp(config, node, peerScoring, createLogger(`${logger.module}:reqresp`));
728
728
  const peerManager = new PeerManager(node, peerDiscoveryService, config, telemetry, createLogger(`${logger.module}:peer_manager`), peerScoring, reqresp, worldStateSynchronizer, protocolVersion, epochCache);
729
+ // Gate req/resp data protocols for unauthenticated peers when p2pAllowOnlyValidators is enabled
730
+ reqresp.setShouldRejectPeer((peerId)=>peerManager.shouldDisableP2PGossip(peerId));
729
731
  // Configure application-specific scoring for gossipsub.
730
732
  // The weight scales app score to align with gossipsub thresholds:
731
733
  // - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
@@ -733,7 +735,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
733
735
  // Note: positive topic scores can offset penalties, so alignment is best-effort.
734
736
  node.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
735
737
  node.services.pubsub.score.params.appSpecificScore = (peerId)=>peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
736
- return new LibP2PService(config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
738
+ return new LibP2PService(config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, blockMinFeesProvider, telemetry, logger);
737
739
  }
738
740
  /**
739
741
  * Starts the LibP2P service.
@@ -752,13 +754,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
752
754
  // Create request response protocol handlers
753
755
  const txHandler = reqRespTxHandler(this.mempools);
754
756
  const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
755
- const blockHandler = reqRespBlockHandler(this.archiver);
756
757
  const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
757
758
  const requestResponseHandlers = {
758
759
  [ReqRespSubProtocol.PING]: pingHandler,
759
760
  [ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
760
- [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
761
- [ReqRespSubProtocol.BLOCK]: blockHandler.bind(this)
761
+ [ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
762
762
  };
763
763
  if (!this.config.disableTransactions) {
764
764
  const blockTxsHandler = reqRespBlockTxsHandler(this.mempools.attestationPool, this.archiver, this.mempools.txPool);
@@ -771,8 +771,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
771
771
  const reqrespSubProtocolValidators = {
772
772
  ...DEFAULT_SUB_PROTOCOL_VALIDATORS,
773
773
  [ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
774
- [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
775
- [ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this)
774
+ [ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
776
775
  };
777
776
  await this.peerManager.initializePeers();
778
777
  await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
@@ -860,8 +859,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
860
859
  registerBlockReceivedCallback(callback) {
861
860
  this.blockReceivedCallback = callback;
862
861
  }
863
- registerCheckpointReceivedCallback(callback) {
864
- this.checkpointReceivedCallback = callback;
862
+ registerValidatorCheckpointReceivedCallback(callback) {
863
+ this.validatorCheckpointReceivedCallback = callback;
864
+ }
865
+ registerAllNodesCheckpointReceivedCallback(callback) {
866
+ this.allNodesCheckpointReceivedCallback = callback;
867
+ }
868
+ async notifyOwnCheckpointProposal(checkpoint) {
869
+ await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
865
870
  }
866
871
  /**
867
872
  * Registers a callback to be invoked when a duplicate proposal is detected.
@@ -927,6 +932,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
927
932
  if (!validator || !validator.addMessage(msgId)) {
928
933
  this.instrumentation.incMessagePrevalidationStatus(false, topicType);
929
934
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
935
+ if (topicType === TopicType.tx) {
936
+ this.logger.verbose(`Ignoring already-seen tx gossip message`, {
937
+ msgId,
938
+ source: source.toString()
939
+ });
940
+ }
930
941
  return {
931
942
  result: false,
932
943
  topicType
@@ -1032,29 +1043,79 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1032
1043
  return;
1033
1044
  }
1034
1045
  async validateReceivedMessage(validationFunc, msgId, source, topicType) {
1046
+ // Default to reject result with a penalty if validation function throws an error
1035
1047
  let resultAndObj = {
1036
- result: TopicValidatorResult.Reject
1048
+ result: TopicValidatorResult.Reject,
1049
+ severity: PeerErrorSeverity.MidToleranceError
1037
1050
  };
1038
1051
  const timer = new Timer();
1039
1052
  try {
1040
1053
  resultAndObj = await validationFunc();
1041
1054
  } catch (err) {
1042
- this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
1043
- this.logger.error(`Error deserializing and validating gossipsub message`, err, {
1055
+ this.logger.error(`Error validating gossipsub message`, err, {
1044
1056
  msgId,
1045
1057
  source: source.toString(),
1046
1058
  topicType
1047
1059
  });
1048
1060
  }
1061
+ const validationTimeMs = timer.ms();
1062
+ const mcacheWindowMs = this.config.gossipsubMcacheLength * this.config.gossipsubInterval;
1063
+ if (validationTimeMs > mcacheWindowMs * 0.75) {
1064
+ this.instrumentation.incSlowValidation(topicType);
1065
+ this.logger.warn(`Gossip validation for ${topicType} took ${validationTimeMs}ms, approaching mcache eviction window of ${mcacheWindowMs}ms. ` + `Message forwarding may be skipped if validation exceeds the window.`, {
1066
+ msgId,
1067
+ source: source.toString(),
1068
+ topicType,
1069
+ validationTimeMs,
1070
+ mcacheWindowMs
1071
+ });
1072
+ }
1049
1073
  if (resultAndObj.result === TopicValidatorResult.Accept) {
1074
+ this.logger.debug(`Message ${topicType} accepted by validator`, {
1075
+ msgId,
1076
+ source: source.toString(),
1077
+ topicType
1078
+ });
1050
1079
  this.instrumentation.recordMessageValidation(topicType, timer);
1080
+ } else if (resultAndObj.result === TopicValidatorResult.Reject) {
1081
+ this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
1082
+ msgId,
1083
+ source: source.toString(),
1084
+ topicType,
1085
+ severity: resultAndObj.severity
1086
+ });
1087
+ this.peerManager.penalizePeer(source, resultAndObj.severity);
1088
+ } else {
1089
+ this.logger.trace(`Message ${topicType} ignored by validator`, {
1090
+ msgId,
1091
+ source: source.toString(),
1092
+ topicType
1093
+ });
1051
1094
  }
1052
1095
  this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
1053
1096
  return resultAndObj;
1054
1097
  }
1098
+ tryDeserialize(deserializeFunc, msgId, source) {
1099
+ try {
1100
+ return deserializeFunc();
1101
+ } catch (err) {
1102
+ this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
1103
+ err,
1104
+ msgId,
1105
+ source: source.toString()
1106
+ });
1107
+ return undefined;
1108
+ }
1109
+ }
1055
1110
  async handleGossipedTx(payloadData, msgId, source) {
1056
1111
  const validationFunc = async ()=>{
1057
- const tx = Tx.fromBuffer(payloadData);
1112
+ const tx = this.tryDeserialize(()=>Tx.fromBuffer(payloadData), msgId, source);
1113
+ if (!tx) {
1114
+ return {
1115
+ result: TopicValidatorResult.Reject,
1116
+ severity: PeerErrorSeverity.LowToleranceError
1117
+ };
1118
+ }
1058
1119
  const currentBlockNumber = await this.archiver.getBlockNumber();
1059
1120
  const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
1060
1121
  // Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
@@ -1070,14 +1131,22 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1070
1131
  const txBlockNumber = BlockNumber(currentBlockNumber + 1);
1071
1132
  severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
1072
1133
  }
1073
- this.peerManager.penalizePeer(source, severity);
1134
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
1135
+ validator: name,
1136
+ severity,
1137
+ source: source.toString()
1138
+ });
1074
1139
  return {
1075
- result: TopicValidatorResult.Reject
1140
+ result: TopicValidatorResult.Reject,
1141
+ severity
1076
1142
  };
1077
1143
  }
1078
1144
  // Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
1079
1145
  const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
1080
1146
  if (canAdd === 'ignored') {
1147
+ this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
1148
+ source: source.toString()
1149
+ });
1081
1150
  return {
1082
1151
  result: TopicValidatorResult.Ignore,
1083
1152
  obj: tx
@@ -1087,10 +1156,15 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1087
1156
  const secondStageValidators = this.createSecondStageMessageValidators();
1088
1157
  const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
1089
1158
  if (!secondStageOutcome.allPassed) {
1090
- const { severity } = secondStageOutcome.failure;
1091
- this.peerManager.penalizePeer(source, severity);
1159
+ const { severity, name } = secondStageOutcome.failure;
1160
+ this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
1161
+ validator: name,
1162
+ severity,
1163
+ source: source.toString()
1164
+ });
1092
1165
  return {
1093
- result: TopicValidatorResult.Reject
1166
+ result: TopicValidatorResult.Reject,
1167
+ severity
1094
1168
  };
1095
1169
  }
1096
1170
  // Pool add: persist the tx
@@ -1102,7 +1176,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1102
1176
  });
1103
1177
  const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
1104
1178
  const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
1105
- this.logger.trace(`Validate propagated tx`, {
1179
+ this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
1106
1180
  wasAccepted,
1107
1181
  wasIgnored,
1108
1182
  [Attributes.P2P_ID]: source.toString()
@@ -1122,9 +1196,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1122
1196
  source: source.toString(),
1123
1197
  txHash: txHash.toString()
1124
1198
  });
1125
- this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
1126
1199
  return {
1127
- result: TopicValidatorResult.Reject
1200
+ result: TopicValidatorResult.Reject,
1201
+ severity: PeerErrorSeverity.HighToleranceError
1128
1202
  };
1129
1203
  }
1130
1204
  };
@@ -1145,7 +1219,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1145
1219
  * Process a checkpoint attestation from a peer.
1146
1220
  * Validates the attestation and adds it to the pool.
1147
1221
  */ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
1148
- const { result, obj: attestation } = await this.validateReceivedMessage(()=>this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)), msgId, source, TopicType.checkpoint_attestation);
1222
+ const { result, obj: attestation } = await this.validateReceivedMessage(()=>{
1223
+ const attestation = this.tryDeserialize(()=>CheckpointAttestation.fromBuffer(payloadData), msgId, source);
1224
+ if (!attestation) {
1225
+ return Promise.resolve({
1226
+ result: TopicValidatorResult.Reject,
1227
+ severity: PeerErrorSeverity.LowToleranceError
1228
+ });
1229
+ }
1230
+ return this.validateAndStoreCheckpointAttestation(source, attestation);
1231
+ }, msgId, source, TopicType.checkpoint_attestation);
1149
1232
  if (result !== TopicValidatorResult.Accept || !attestation) {
1150
1233
  return;
1151
1234
  }
@@ -1160,9 +1243,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1160
1243
  const validationResult = await this.checkpointAttestationValidator.validate(attestation);
1161
1244
  if (validationResult.result === 'reject') {
1162
1245
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1163
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1164
1246
  return {
1165
- result: TopicValidatorResult.Reject
1247
+ result: TopicValidatorResult.Reject,
1248
+ severity: validationResult.severity
1166
1249
  };
1167
1250
  }
1168
1251
  if (validationResult.result === 'ignore') {
@@ -1189,9 +1272,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1189
1272
  obj: attestation
1190
1273
  };
1191
1274
  }
1192
- // Could not add (cap reached for signer), no need to re-broadcast
1275
+ // Could not add (cap reached for signer), penalize and do not re-broadcast
1193
1276
  if (!added) {
1194
- this.logger.warn(`Dropping checkpoint attestation due to cap`, {
1277
+ this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
1195
1278
  slot: slot.toString(),
1196
1279
  archive: attestation.archive.toString(),
1197
1280
  source: peerId.toString(),
@@ -1199,8 +1282,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1199
1282
  count
1200
1283
  });
1201
1284
  return {
1202
- result: TopicValidatorResult.Ignore,
1203
- obj: attestation
1285
+ result: TopicValidatorResult.Reject,
1286
+ severity: PeerErrorSeverity.HighToleranceError
1204
1287
  };
1205
1288
  }
1206
1289
  // Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
@@ -1238,9 +1321,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1238
1321
  const validationResult = await this.blockProposalValidator.validate(block);
1239
1322
  if (validationResult.result === 'reject') {
1240
1323
  this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
1241
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1242
1324
  return {
1243
- result: TopicValidatorResult.Reject
1325
+ result: TopicValidatorResult.Reject,
1326
+ severity: validationResult.severity
1244
1327
  };
1245
1328
  }
1246
1329
  if (validationResult.result === 'ignore') {
@@ -1270,7 +1353,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1270
1353
  }
1271
1354
  // Too many blocks received for this slot and index, penalize peer and do not re-broadcast
1272
1355
  if (!added) {
1273
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1274
1356
  this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
1275
1357
  ...block.toBlockInfo(),
1276
1358
  indexWithinCheckpoint: block.indexWithinCheckpoint,
@@ -1282,7 +1364,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1282
1364
  result: TopicValidatorResult.Reject,
1283
1365
  metadata: {
1284
1366
  isEquivocated
1285
- }
1367
+ },
1368
+ severity: PeerErrorSeverity.HighToleranceError
1286
1369
  };
1287
1370
  }
1288
1371
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1356,9 +1439,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1356
1439
  const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
1357
1440
  if (validationResult.result === 'reject') {
1358
1441
  this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
1359
- this.peerManager.penalizePeer(peerId, validationResult.severity);
1360
1442
  return {
1361
- result: TopicValidatorResult.Reject
1443
+ result: TopicValidatorResult.Reject,
1444
+ severity: validationResult.severity
1362
1445
  };
1363
1446
  }
1364
1447
  if (validationResult.result === 'ignore') {
@@ -1375,18 +1458,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1375
1458
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1376
1459
  [Attributes.P2P_ID]: peerId.toString()
1377
1460
  });
1378
- const { result, obj, metadata: { isEquivocated } = {} } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1379
- if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1461
+ const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
1462
+ const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
1463
+ if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
1380
1464
  this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
1381
1465
  [Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
1382
1466
  [Attributes.P2P_ID]: peerId.toString(),
1383
1467
  isEquivocated,
1384
- result
1468
+ result: blockProposalResult.result
1385
1469
  });
1386
1470
  return {
1387
- result: TopicValidatorResult.Reject
1471
+ result: TopicValidatorResult.Reject,
1472
+ severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
1388
1473
  };
1389
- } else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1474
+ } else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
1390
1475
  processBlock = true;
1391
1476
  }
1392
1477
  }
@@ -1413,7 +1498,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1413
1498
  // Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
1414
1499
  // Note: We still return the checkpoint obj so the lastBlock can be processed if valid
1415
1500
  if (!added) {
1416
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
1417
1501
  this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
1418
1502
  ...checkpoint.toCheckpointInfo(),
1419
1503
  count,
@@ -1425,7 +1509,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1425
1509
  metadata: {
1426
1510
  isEquivocated,
1427
1511
  processBlock
1428
- }
1512
+ },
1513
+ severity: PeerErrorSeverity.HighToleranceError
1429
1514
  };
1430
1515
  }
1431
1516
  // If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
@@ -1475,9 +1560,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1475
1560
  archive: checkpoint.archive.toString(),
1476
1561
  source: sender.toString()
1477
1562
  });
1563
+ await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
1478
1564
  // Call the checkpoint received callback with the core version (without lastBlock)
1479
1565
  // to validate and potentially generate attestations
1480
- const attestations = await this.checkpointReceivedCallback(checkpoint, sender);
1566
+ const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
1481
1567
  if (attestations && attestations.length > 0) {
1482
1568
  // If the callback returned attestations, add them to the pool and propagate them
1483
1569
  await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
@@ -1597,45 +1683,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1597
1683
  return false;
1598
1684
  }
1599
1685
  }
1600
- /**
1601
- * Validates a BLOCK response.
1602
- *
1603
- * If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
1604
- * Penalizes on block number mismatch or hash mismatch.
1605
- *
1606
- * @param requestedBlockNumber - The requested block number.
1607
- * @param responseBlock - The block returned by the peer.
1608
- * @param peerId - The peer that returned the block.
1609
- * @returns True if the response is valid, false otherwise.
1610
- */ async validateRequestedBlock(requestedBlockNumber, responseBlock, peerId) {
1611
- try {
1612
- const reqNum = Number(requestedBlockNumber.toString());
1613
- if (responseBlock.number !== reqNum) {
1614
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
1615
- return false;
1616
- }
1617
- const local = await this.archiver.getBlock(BlockNumber(reqNum));
1618
- if (!local) {
1619
- // We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
1620
- // TODO: Consider extending this validator to accept an expected hash or
1621
- // performing quorum-based checks when using P2P syncing prior to L1 sync.
1622
- this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
1623
- return false;
1624
- }
1625
- const [localHash, respHash] = await Promise.all([
1626
- local.hash(),
1627
- responseBlock.hash()
1628
- ]);
1629
- if (!localHash.equals(respHash)) {
1630
- this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
1631
- return false;
1632
- }
1633
- return true;
1634
- } catch (e) {
1635
- this.logger.warn(`Error validating requested block`, e);
1636
- return false;
1637
- }
1638
- }
1639
1686
  async validateRequestedTx(tx, peerId, txValidator, requested) {
1640
1687
  const penalize = (severity)=>this.peerManager.penalizePeer(peerId, severity);
1641
1688
  if (requested && !requested.has(tx.getTxHash().toString())) {
@@ -1654,17 +1701,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1654
1701
  rollupVersion: this.config.rollupVersion
1655
1702
  });
1656
1703
  }
1657
- async getGasFees(blockNumber) {
1658
- if (blockNumber === this.feesCache?.blockNumber) {
1659
- return this.feesCache.gasFees;
1660
- }
1661
- const header = await this.archiver.getBlockHeader(blockNumber);
1662
- const gasFees = header?.globalVariables.gasFees ?? GasFees.empty();
1663
- this.feesCache = {
1664
- blockNumber,
1665
- gasFees
1666
- };
1667
- return gasFees;
1704
+ getGasFees() {
1705
+ return this.blockMinFeesProvider.getCurrentMinFees();
1668
1706
  }
1669
1707
  /**
1670
1708
  * Get the BatchTxRequesterLibP2PService dependencies for creating BatchTxRequester instances
@@ -1694,7 +1732,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1694
1732
  }
1695
1733
  }
1696
1734
  /** Creates the first stage (fast) validators for gossiped transactions. */ async createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp) {
1697
- const gasFees = await this.getGasFees(currentBlockNumber);
1735
+ const gasFees = await this.getGasFees();
1698
1736
  const allowedInSetup = [
1699
1737
  ...await getDefaultAllowedSetupFunctions(),
1700
1738
  ...this.config.txPublicSetupAllowListExtend ?? []
@@ -1776,19 +1814,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
1776
1814
  }
1777
1815
  return PeerErrorSeverity.HighToleranceError;
1778
1816
  }
1779
- /**
1780
- * Validate a checkpoint attestation.
1781
- *
1782
- * @param attestation - The checkpoint attestation to validate.
1783
- * @returns True if the checkpoint attestation is valid, false otherwise.
1784
- */ async validateCheckpointAttestation(peerId, attestation) {
1785
- const result = await this.checkpointAttestationValidator.validate(attestation);
1786
- if (result.result === 'reject') {
1787
- this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
1788
- this.peerManager.penalizePeer(peerId, result.severity);
1789
- }
1790
- return result;
1791
- }
1792
1817
  getPeerScore(peerId) {
1793
1818
  return this.node.services.pubsub.score.score(peerId.toString());
1794
1819
  }
@@ -6,6 +6,7 @@ export declare class PeerManagerMetrics {
6
6
  private sentGoodbyes;
7
7
  private receivedGoodbyes;
8
8
  private peerCount;
9
+ private healthyPeerCount;
9
10
  private lowScoreDisconnects;
10
11
  private peerConnectionDuration;
11
12
  private peerConnectedAt;
@@ -14,8 +15,9 @@ export declare class PeerManagerMetrics {
14
15
  recordGoodbyeSent(reason: GoodByeReason): void;
15
16
  recordGoodbyeReceived(reason: GoodByeReason): void;
16
17
  recordPeerCount(count: number): void;
18
+ recordHealthyPeerCount(count: number): void;
17
19
  recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect'): void;
18
20
  peerConnected(id: PeerId): void;
19
21
  peerDisconnected(id: PeerId): void;
20
22
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BlZXItbWFuYWdlci9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFLTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxNQUFNLEVBSVosTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsYUFBYSxFQUF1QixNQUFNLCtCQUErQixDQUFDO0FBRW5GLHFCQUFhLGtCQUFrQjthQVlYLGVBQWUsRUFBRSxlQUFlO0lBWGxELE9BQU8sQ0FBQyxZQUFZLENBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0I7SUFDeEMsT0FBTyxDQUFDLFNBQVMsQ0FBUTtJQUN6QixPQUFPLENBQUMsbUJBQW1CLENBQWdCO0lBQzNDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBWTtJQUUxQyxPQUFPLENBQUMsZUFBZSxDQUFrRDtJQUV6RSxTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRS9CLFlBQ2tCLGVBQWUsR0FBRSxlQUFzQyxFQUN2RSxJQUFJLFNBQWdCLEVBMEJyQjtJQUVNLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxhQUFhLFFBRTdDO0lBRU0scUJBQXFCLENBQUMsTUFBTSxFQUFFLGFBQWEsUUFFakQ7SUFFTSxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFbkM7SUFFTSx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxHQUFHLFlBQVksUUFFbEU7SUFFTSxhQUFhLENBQUMsRUFBRSxFQUFFLE1BQU0sUUFFOUI7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxRQUtqQztDQUNGIn0=
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BlZXItbWFuYWdlci9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFLTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxNQUFNLEVBSVosTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsYUFBYSxFQUF1QixNQUFNLCtCQUErQixDQUFDO0FBRW5GLHFCQUFhLGtCQUFrQjthQWFYLGVBQWUsRUFBRSxlQUFlO0lBWmxELE9BQU8sQ0FBQyxZQUFZLENBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0I7SUFDeEMsT0FBTyxDQUFDLFNBQVMsQ0FBUTtJQUN6QixPQUFPLENBQUMsZ0JBQWdCLENBQVE7SUFDaEMsT0FBTyxDQUFDLG1CQUFtQixDQUFnQjtJQUMzQyxPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFFMUMsT0FBTyxDQUFDLGVBQWUsQ0FBa0Q7SUFFekUsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixZQUNrQixlQUFlLEdBQUUsZUFBc0MsRUFDdkUsSUFBSSxTQUFnQixFQTJCckI7SUFFTSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsYUFBYSxRQUU3QztJQUVNLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxhQUFhLFFBRWpEO0lBRU0sZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLFFBRW5DO0lBRU0sc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFMUM7SUFFTSx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxHQUFHLFlBQVksUUFFbEU7SUFFTSxhQUFhLENBQUMsRUFBRSxFQUFFLE1BQU0sUUFFOUI7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxRQU1qQztDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,MAAM,EAIZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AAEnF,qBAAa,kBAAkB;aAYX,eAAe,EAAE,eAAe;IAXlD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,sBAAsB,CAAY;IAE1C,OAAO,CAAC,eAAe,CAAkD;IAEzE,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACkB,eAAe,GAAE,eAAsC,EACvE,IAAI,SAAgB,EA0BrB;IAEM,iBAAiB,CAAC,MAAM,EAAE,aAAa,QAE7C;IAEM,qBAAqB,CAAC,MAAM,EAAE,aAAa,QAEjD;IAEM,eAAe,CAAC,KAAK,EAAE,MAAM,QAEnC;IAEM,wBAAwB,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,QAElE;IAEM,aAAa,CAAC,EAAE,EAAE,MAAM,QAE9B;IAEM,gBAAgB,CAAC,EAAE,EAAE,MAAM,QAKjC;CACF"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,MAAM,EAIZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AAEnF,qBAAa,kBAAkB;aAaX,eAAe,EAAE,eAAe;IAZlD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,sBAAsB,CAAY;IAE1C,OAAO,CAAC,eAAe,CAAkD;IAEzE,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACkB,eAAe,GAAE,eAAsC,EACvE,IAAI,SAAgB,EA2BrB;IAEM,iBAAiB,CAAC,MAAM,EAAE,aAAa,QAE7C;IAEM,qBAAqB,CAAC,MAAM,EAAE,aAAa,QAEjD;IAEM,eAAe,CAAC,KAAK,EAAE,MAAM,QAEnC;IAEM,sBAAsB,CAAC,KAAK,EAAE,MAAM,QAE1C;IAEM,wBAAwB,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,QAElE;IAEM,aAAa,CAAC,EAAE,EAAE,MAAM,QAE9B;IAEM,gBAAgB,CAAC,EAAE,EAAE,MAAM,QAMjC;CACF"}