@aztec/p2p 0.0.1-commit.d3ec352c → 0.0.1-commit.d58ff9d0

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 (575) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +4 -3
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +26 -10
  5. package/dest/client/factory.d.ts +13 -12
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +70 -21
  8. package/dest/client/interface.d.ts +104 -41
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +72 -70
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +681 -346
  13. package/dest/config.d.ts +171 -89
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +169 -58
  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 +9 -16
  20. package/dest/errors/reqresp.error.d.ts.map +1 -1
  21. package/dest/errors/reqresp.error.js +10 -17
  22. package/dest/errors/tx-pool.error.d.ts +8 -0
  23. package/dest/errors/tx-pool.error.d.ts.map +1 -0
  24. package/dest/errors/tx-pool.error.js +9 -0
  25. package/dest/index.d.ts +2 -2
  26. package/dest/index.d.ts.map +1 -1
  27. package/dest/index.js +1 -1
  28. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +154 -77
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.js +518 -3
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
  32. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  33. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +694 -295
  34. package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
  35. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/index.js +1 -2
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/mocks.js +19 -13
  40. package/dest/mem_pools/index.d.ts +3 -3
  41. package/dest/mem_pools/index.d.ts.map +1 -1
  42. package/dest/mem_pools/index.js +1 -1
  43. package/dest/mem_pools/instrumentation.d.ts +14 -1
  44. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  45. package/dest/mem_pools/instrumentation.js +51 -12
  46. package/dest/mem_pools/interface.d.ts +6 -7
  47. package/dest/mem_pools/interface.d.ts.map +1 -1
  48. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
  49. package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
  50. package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
  51. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
  52. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
  53. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
  54. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  55. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  56. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  57. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
  58. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
  59. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
  62. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
  63. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
  64. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
  65. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
  69. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  70. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
  72. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
  73. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
  74. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  77. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
  78. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
  79. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  80. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  83. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
  84. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
  85. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
  86. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
  87. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
  88. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
  89. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
  90. package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
  91. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
  92. package/dest/mem_pools/tx_pool_v2/index.js +5 -0
  93. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
  94. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  95. package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
  96. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
  97. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
  98. package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
  99. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
  100. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
  101. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
  107. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
  108. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +68 -0
  109. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
  110. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +178 -0
  111. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +91 -0
  112. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
  113. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1013 -0
  114. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +12 -5
  115. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  116. package/dest/msg_validators/attestation_validator/attestation_validator.js +78 -22
  117. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +11 -7
  118. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  119. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +25 -17
  120. package/dest/msg_validators/index.d.ts +2 -2
  121. package/dest/msg_validators/index.d.ts.map +1 -1
  122. package/dest/msg_validators/index.js +1 -1
  123. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +16 -0
  124. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  125. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
  126. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
  127. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  128. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
  129. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  130. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  131. package/dest/msg_validators/proposal_validator/index.js +3 -0
  132. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
  133. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  134. package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
  135. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  136. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  137. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  138. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  139. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  140. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  141. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  142. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  143. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  144. package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
  145. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
  147. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  148. package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
  149. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  150. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  151. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  152. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  153. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  154. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  155. package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
  156. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  157. package/dest/msg_validators/tx_validator/data_validator.js +40 -3
  158. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
  159. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  160. package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
  161. package/dest/msg_validators/tx_validator/factory.d.ts +137 -6
  162. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  163. package/dest/msg_validators/tx_validator/factory.js +268 -58
  164. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
  165. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
  166. package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
  167. package/dest/msg_validators/tx_validator/gas_validator.d.ts +105 -3
  168. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  169. package/dest/msg_validators/tx_validator/gas_validator.js +146 -67
  170. package/dest/msg_validators/tx_validator/index.d.ts +6 -1
  171. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  172. package/dest/msg_validators/tx_validator/index.js +5 -0
  173. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
  174. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  175. package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
  176. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  177. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  178. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  179. package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
  180. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  181. package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
  182. package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
  183. package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
  184. package/dest/msg_validators/tx_validator/size_validator.js +23 -0
  185. package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
  186. package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
  187. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
  188. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  189. package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
  190. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
  191. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  192. package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
  193. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
  194. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  195. package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
  196. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  197. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  198. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  199. package/dest/services/data_store.d.ts +1 -1
  200. package/dest/services/data_store.d.ts.map +1 -1
  201. package/dest/services/data_store.js +14 -10
  202. package/dest/services/discv5/discV5_service.d.ts +13 -2
  203. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  204. package/dest/services/discv5/discV5_service.js +120 -24
  205. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  206. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  207. package/dest/services/discv5/persisted_enr_store.js +145 -0
  208. package/dest/services/dummy_service.d.ts +40 -16
  209. package/dest/services/dummy_service.d.ts.map +1 -1
  210. package/dest/services/dummy_service.js +61 -14
  211. package/dest/services/encoding.d.ts +24 -7
  212. package/dest/services/encoding.d.ts.map +1 -1
  213. package/dest/services/encoding.js +48 -30
  214. package/dest/services/gossipsub/index.d.ts +3 -0
  215. package/dest/services/gossipsub/index.d.ts.map +1 -0
  216. package/dest/services/gossipsub/index.js +2 -0
  217. package/dest/services/gossipsub/scoring.d.ts +21 -3
  218. package/dest/services/gossipsub/scoring.d.ts.map +1 -1
  219. package/dest/services/gossipsub/scoring.js +24 -7
  220. package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
  221. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
  222. package/dest/services/gossipsub/topic_score_params.js +336 -0
  223. package/dest/services/index.d.ts +2 -1
  224. package/dest/services/index.d.ts.map +1 -1
  225. package/dest/services/index.js +1 -0
  226. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  227. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  228. package/dest/services/libp2p/instrumentation.js +43 -71
  229. package/dest/services/libp2p/libp2p_service.d.ts +127 -54
  230. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  231. package/dest/services/libp2p/libp2p_service.js +1324 -556
  232. package/dest/services/peer-manager/metrics.d.ts +9 -2
  233. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  234. package/dest/services/peer-manager/metrics.js +39 -21
  235. package/dest/services/peer-manager/peer_manager.d.ts +21 -4
  236. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  237. package/dest/services/peer-manager/peer_manager.js +87 -38
  238. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  239. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  240. package/dest/services/peer-manager/peer_scoring.js +134 -19
  241. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
  242. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
  243. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
  244. package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
  245. package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
  246. package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
  247. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
  248. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
  249. package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
  250. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
  251. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
  252. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
  253. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
  254. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
  255. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
  256. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
  257. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
  258. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
  259. package/dest/services/reqresp/config.d.ts +15 -3
  260. package/dest/services/reqresp/config.d.ts.map +1 -1
  261. package/dest/services/reqresp/config.js +11 -0
  262. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
  263. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  264. package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
  265. package/dest/services/reqresp/constants.d.ts +12 -0
  266. package/dest/services/reqresp/constants.d.ts.map +1 -0
  267. package/dest/services/reqresp/constants.js +7 -0
  268. package/dest/services/reqresp/interface.d.ts +27 -18
  269. package/dest/services/reqresp/interface.d.ts.map +1 -1
  270. package/dest/services/reqresp/interface.js +23 -19
  271. package/dest/services/reqresp/metrics.d.ts +6 -5
  272. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  273. package/dest/services/reqresp/metrics.js +16 -21
  274. package/dest/services/reqresp/protocols/auth.d.ts +2 -2
  275. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  276. package/dest/services/reqresp/protocols/auth.js +2 -2
  277. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +8 -3
  278. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  279. package/dest/services/reqresp/protocols/block_txs/bitvector.js +15 -2
  280. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
  281. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  282. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +35 -14
  283. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +37 -9
  284. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  285. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +85 -21
  286. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  287. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  288. package/dest/services/reqresp/protocols/index.js +0 -1
  289. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  290. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  291. package/dest/services/reqresp/protocols/status.js +4 -1
  292. package/dest/services/reqresp/protocols/tx.d.ts +8 -3
  293. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  294. package/dest/services/reqresp/protocols/tx.js +21 -3
  295. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  296. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  297. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  298. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  299. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  300. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  301. package/dest/services/reqresp/reqresp.d.ts +12 -29
  302. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  303. package/dest/services/reqresp/reqresp.js +480 -200
  304. package/dest/services/service.d.ts +78 -13
  305. package/dest/services/service.d.ts.map +1 -1
  306. package/dest/services/tx_collection/config.d.ts +11 -11
  307. package/dest/services/tx_collection/config.d.ts.map +1 -1
  308. package/dest/services/tx_collection/config.js +28 -27
  309. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  310. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  311. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  312. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  313. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  314. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  315. package/dest/services/tx_collection/index.d.ts +3 -2
  316. package/dest/services/tx_collection/index.d.ts.map +1 -1
  317. package/dest/services/tx_collection/index.js +1 -0
  318. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  319. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  320. package/dest/services/tx_collection/instrumentation.js +9 -13
  321. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  322. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  323. package/dest/services/tx_collection/request_tracker.js +84 -0
  324. package/dest/services/tx_collection/tx_collection.d.ts +49 -55
  325. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  326. package/dest/services/tx_collection/tx_collection.js +299 -71
  327. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  328. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  329. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  330. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  331. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  332. package/dest/services/tx_collection/tx_source.js +29 -7
  333. package/dest/services/tx_file_store/config.d.ts +16 -0
  334. package/dest/services/tx_file_store/config.d.ts.map +1 -0
  335. package/dest/services/tx_file_store/config.js +22 -0
  336. package/dest/services/tx_file_store/index.d.ts +4 -0
  337. package/dest/services/tx_file_store/index.d.ts.map +1 -0
  338. package/dest/services/tx_file_store/index.js +3 -0
  339. package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
  340. package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
  341. package/dest/services/tx_file_store/instrumentation.js +29 -0
  342. package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
  343. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
  344. package/dest/services/tx_file_store/tx_file_store.js +142 -0
  345. package/dest/services/tx_provider.d.ts +9 -6
  346. package/dest/services/tx_provider.d.ts.map +1 -1
  347. package/dest/services/tx_provider.js +23 -10
  348. package/dest/services/tx_provider_instrumentation.d.ts +5 -2
  349. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  350. package/dest/services/tx_provider_instrumentation.js +14 -14
  351. package/dest/test-helpers/index.d.ts +3 -1
  352. package/dest/test-helpers/index.d.ts.map +1 -1
  353. package/dest/test-helpers/index.js +2 -0
  354. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  355. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  356. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  357. package/dest/test-helpers/mock-pubsub.d.ts +46 -6
  358. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  359. package/dest/test-helpers/mock-pubsub.js +115 -14
  360. package/dest/test-helpers/mock-tx-helpers.js +1 -1
  361. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  362. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  363. package/dest/test-helpers/reqresp-nodes.js +19 -20
  364. package/dest/test-helpers/test_tx_provider.d.ts +42 -0
  365. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
  366. package/dest/test-helpers/test_tx_provider.js +44 -0
  367. package/dest/test-helpers/testbench-utils.d.ts +164 -0
  368. package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
  369. package/dest/test-helpers/testbench-utils.js +400 -0
  370. package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
  371. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  372. package/dest/testbench/p2p_client_testbench_worker.js +289 -131
  373. package/dest/testbench/worker_client_manager.d.ts +57 -6
  374. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  375. package/dest/testbench/worker_client_manager.js +277 -44
  376. package/dest/util.d.ts +13 -8
  377. package/dest/util.d.ts.map +1 -1
  378. package/dest/util.js +35 -14
  379. package/dest/versioning.d.ts +3 -6
  380. package/dest/versioning.d.ts.map +1 -1
  381. package/dest/versioning.js +3 -24
  382. package/package.json +18 -18
  383. package/src/bootstrap/bootstrap.ts +24 -7
  384. package/src/client/factory.ts +141 -46
  385. package/src/client/interface.ts +113 -49
  386. package/src/client/p2p_client.ts +342 -418
  387. package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
  388. package/src/config.ts +298 -66
  389. package/src/errors/p2p-service.error.ts +11 -0
  390. package/src/errors/reqresp.error.ts +13 -19
  391. package/src/errors/tx-pool.error.ts +12 -0
  392. package/src/index.ts +1 -1
  393. package/src/mem_pools/attestation_pool/attestation_pool.ts +594 -76
  394. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +796 -329
  395. package/src/mem_pools/attestation_pool/index.ts +9 -2
  396. package/src/mem_pools/attestation_pool/mocks.ts +29 -17
  397. package/src/mem_pools/index.ts +2 -2
  398. package/src/mem_pools/instrumentation.ts +48 -13
  399. package/src/mem_pools/interface.ts +5 -7
  400. package/src/mem_pools/tx_pool_v2/README.md +283 -0
  401. package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
  402. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
  403. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  404. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
  405. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
  406. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
  407. package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
  408. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
  409. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
  410. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
  411. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
  412. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
  413. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
  414. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
  415. package/src/mem_pools/tx_pool_v2/index.ts +12 -0
  416. package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
  417. package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
  418. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
  419. package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
  420. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
  421. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +252 -0
  422. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1215 -0
  423. package/src/msg_validators/attestation_validator/README.md +49 -0
  424. package/src/msg_validators/attestation_validator/attestation_validator.ts +71 -24
  425. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +34 -23
  426. package/src/msg_validators/index.ts +1 -1
  427. package/src/msg_validators/proposal_validator/README.md +123 -0
  428. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +32 -0
  429. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
  430. package/src/msg_validators/proposal_validator/index.ts +3 -0
  431. package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
  432. package/src/msg_validators/tx_validator/README.md +129 -0
  433. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  434. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  435. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  436. package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
  437. package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
  438. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  439. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  440. package/src/msg_validators/tx_validator/data_validator.ts +62 -7
  441. package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
  442. package/src/msg_validators/tx_validator/factory.ts +431 -57
  443. package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
  444. package/src/msg_validators/tx_validator/gas_validator.ts +206 -76
  445. package/src/msg_validators/tx_validator/index.ts +5 -0
  446. package/src/msg_validators/tx_validator/metadata_validator.ts +31 -12
  447. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  448. package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
  449. package/src/msg_validators/tx_validator/size_validator.ts +22 -0
  450. package/src/msg_validators/tx_validator/test_utils.ts +1 -1
  451. package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -19
  452. package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
  453. package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
  454. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  455. package/src/services/data_store.ts +14 -19
  456. package/src/services/discv5/discV5_service.ts +127 -15
  457. package/src/services/discv5/persisted_enr_store.ts +158 -0
  458. package/src/services/dummy_service.ts +82 -38
  459. package/src/services/encoding.ts +46 -29
  460. package/src/services/gossipsub/README.md +663 -0
  461. package/src/services/gossipsub/index.ts +2 -0
  462. package/src/services/gossipsub/scoring.ts +29 -5
  463. package/src/services/gossipsub/topic_score_params.ts +478 -0
  464. package/src/services/index.ts +1 -0
  465. package/src/services/libp2p/instrumentation.ts +48 -75
  466. package/src/services/libp2p/libp2p_service.ts +1073 -607
  467. package/src/services/peer-manager/metrics.ts +46 -21
  468. package/src/services/peer-manager/peer_manager.ts +96 -29
  469. package/src/services/peer-manager/peer_scoring.ts +130 -12
  470. package/src/services/reqresp/README.md +194 -0
  471. package/src/services/reqresp/batch-tx-requester/README.md +344 -0
  472. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
  473. package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
  474. package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
  475. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
  476. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
  477. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
  478. package/src/services/reqresp/config.ts +19 -2
  479. package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
  480. package/src/services/reqresp/constants.ts +14 -0
  481. package/src/services/reqresp/interface.ts +48 -46
  482. package/src/services/reqresp/metrics.ts +35 -27
  483. package/src/services/reqresp/protocols/auth.ts +2 -2
  484. package/src/services/reqresp/protocols/block_txs/bitvector.ts +19 -2
  485. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +44 -17
  486. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +109 -17
  487. package/src/services/reqresp/protocols/index.ts +0 -1
  488. package/src/services/reqresp/protocols/status.ts +7 -4
  489. package/src/services/reqresp/protocols/tx.ts +24 -5
  490. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  491. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  492. package/src/services/reqresp/reqresp.ts +107 -223
  493. package/src/services/service.ts +102 -31
  494. package/src/services/tx_collection/config.ts +42 -37
  495. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  496. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  497. package/src/services/tx_collection/index.ts +2 -1
  498. package/src/services/tx_collection/instrumentation.ts +5 -13
  499. package/src/services/tx_collection/request_tracker.ts +127 -0
  500. package/src/services/tx_collection/tx_collection.ts +367 -115
  501. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  502. package/src/services/tx_collection/tx_source.ts +29 -8
  503. package/src/services/tx_file_store/config.ts +37 -0
  504. package/src/services/tx_file_store/index.ts +3 -0
  505. package/src/services/tx_file_store/instrumentation.ts +36 -0
  506. package/src/services/tx_file_store/tx_file_store.ts +163 -0
  507. package/src/services/tx_provider.ts +34 -13
  508. package/src/services/tx_provider_instrumentation.ts +24 -14
  509. package/src/test-helpers/index.ts +2 -0
  510. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  511. package/src/test-helpers/mock-pubsub.ts +138 -15
  512. package/src/test-helpers/mock-tx-helpers.ts +1 -1
  513. package/src/test-helpers/reqresp-nodes.ts +18 -30
  514. package/src/test-helpers/test_tx_provider.ts +69 -0
  515. package/src/test-helpers/testbench-utils.ts +465 -0
  516. package/src/testbench/p2p_client_testbench_worker.ts +406 -130
  517. package/src/testbench/worker_client_manager.ts +355 -46
  518. package/src/util.ts +40 -19
  519. package/src/versioning.ts +3 -33
  520. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
  521. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
  522. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
  523. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
  524. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
  525. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
  526. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -116
  527. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  528. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -617
  529. package/dest/mem_pools/tx_pool/index.d.ts +0 -4
  530. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  531. package/dest/mem_pools/tx_pool/index.js +0 -3
  532. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -81
  533. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  534. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -239
  535. package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
  536. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  537. package/dest/mem_pools/tx_pool/priority.js +0 -10
  538. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -123
  539. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  540. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  541. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  542. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  543. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -395
  544. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  545. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  546. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
  547. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  548. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  549. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  550. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
  551. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  552. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
  553. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  554. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  555. package/dest/services/reqresp/protocols/block.js +0 -32
  556. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
  557. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  558. package/dest/services/tx_collection/fast_tx_collection.js +0 -300
  559. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
  560. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  561. package/dest/services/tx_collection/slow_tx_collection.js +0 -177
  562. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
  563. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
  564. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -751
  565. package/src/mem_pools/tx_pool/index.ts +0 -3
  566. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -285
  567. package/src/mem_pools/tx_pool/priority.ts +0 -13
  568. package/src/mem_pools/tx_pool/tx_pool.ts +0 -136
  569. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -314
  570. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
  571. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
  572. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
  573. package/src/services/reqresp/protocols/block.ts +0 -37
  574. package/src/services/tx_collection/fast_tx_collection.ts +0 -341
  575. package/src/services/tx_collection/slow_tx_collection.ts +0 -233
@@ -1,2 +1,26 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJwX2NsaWVudF90ZXN0YmVuY2hfd29ya2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3AycF9jbGllbnRfdGVzdGJlbmNoX3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
1
+ import { type DistributionPattern } from '../test-helpers/index.js';
2
+ export type { DistributionPattern } from '../test-helpers/testbench-utils.js';
3
+ export interface BenchReqRespCommand {
4
+ type: 'BENCH_REQRESP';
5
+ txCount: number;
6
+ peerCount: number;
7
+ distribution: DistributionPattern;
8
+ timeoutMs: number;
9
+ isAggregator: boolean;
10
+ peerIndex: number;
11
+ pinnedPeerIndex?: number;
12
+ pinnedPeerId?: string;
13
+ blockNumber: number;
14
+ seed: number;
15
+ }
16
+ export interface BenchResultMessage {
17
+ type: 'BENCH_RESULT';
18
+ durationMs: number;
19
+ fetchedCount: number;
20
+ success: boolean;
21
+ error?: string;
22
+ }
23
+ export interface BenchReadyMessage {
24
+ type: 'BENCH_READY';
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJwX2NsaWVudF90ZXN0YmVuY2hfd29ya2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3AycF9jbGllbnRfdGVzdGJlbmNoX3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE4Q0EsT0FBTyxFQUVMLEtBQUssbUJBQW1CLEVBT3pCLE1BQU0sMEJBQTBCLENBQUM7QUFHbEMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFOUUsTUFBTSxXQUFXLG1CQUFtQjtJQUNsQyxJQUFJLEVBQUUsZUFBZSxDQUFDO0lBQ3RCLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDaEIsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7SUFDbEMsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixZQUFZLEVBQUUsT0FBTyxDQUFDO0lBQ3RCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUN0QixXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLElBQUksRUFBRSxNQUFNLENBQUM7Q0FDZDtBQUVELE1BQU0sV0FBVyxrQkFBa0I7SUFDakMsSUFBSSxFQUFFLGNBQWMsQ0FBQztJQUNyQixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUNqQixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEI7QUFFRCxNQUFNLFdBQVcsaUJBQWlCO0lBQ2hDLElBQUksRUFBRSxhQUFhLENBQUM7Q0FDckIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"p2p_client_testbench_worker.d.ts","sourceRoot":"","sources":["../../src/testbench/p2p_client_testbench_worker.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"p2p_client_testbench_worker.d.ts","sourceRoot":"","sources":["../../src/testbench/p2p_client_testbench_worker.ts"],"names":[],"mappings":"AA8CA,OAAO,EAEL,KAAK,mBAAmB,EAOzB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;CACrB"}
@@ -1,114 +1,58 @@
1
1
  /**
2
2
  * A testbench worker that creates a p2p client and listens for commands from the parent.
3
3
  *
4
- * Used when running testbench commands
4
+ * Used when running testbench commands.
5
5
  */ import { MockL2BlockSource } from '@aztec/archiver/test';
6
- import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
7
- import { EthAddress } from '@aztec/foundation/eth-address';
6
+ import { BlockNumber } from '@aztec/foundation/branded-types';
7
+ import { SecretValue } from '@aztec/foundation/config';
8
+ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
9
+ import { Fr } from '@aztec/foundation/curves/bn254';
8
10
  import { createLogger } from '@aztec/foundation/log';
9
11
  import { sleep } from '@aztec/foundation/sleep';
12
+ import { DateProvider, Timer } from '@aztec/foundation/timer';
10
13
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
11
- import { P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
12
- import { Tx, TxStatus } from '@aztec/stdlib/tx';
14
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
15
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
16
+ import { EmptyL1RollupConstants } from '@aztec/stdlib/epoch-helpers';
17
+ import { GasFees } from '@aztec/stdlib/gas';
18
+ import { P2PMessage } from '@aztec/stdlib/p2p';
19
+ import { ChonkProof } from '@aztec/stdlib/proofs';
20
+ import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing';
21
+ import { Tx } from '@aztec/stdlib/tx';
13
22
  import { getTelemetryClient } from '@aztec/telemetry-client';
14
23
  import { TopicValidatorResult } from '@libp2p/interface';
15
- import EventEmitter from 'events';
24
+ import { peerIdFromString } from '@libp2p/peer-id';
16
25
  import { createP2PClient } from '../index.js';
17
- import { LibP2PService } from '../services/libp2p/libp2p_service.js';
18
- import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
19
- // Simple mock implementation
20
- function mockTxPool() {
21
- // Mock all methods
22
- const pool = {
23
- isEmpty: ()=>Promise.resolve(false),
24
- addTxs: ()=>Promise.resolve(1),
25
- getTxByHash: ()=>Promise.resolve(undefined),
26
- getArchivedTxByHash: ()=>Promise.resolve(undefined),
27
- markAsMined: ()=>Promise.resolve(),
28
- markMinedAsPending: ()=>Promise.resolve(),
29
- deleteTxs: ()=>Promise.resolve(),
30
- getAllTxs: ()=>Promise.resolve([]),
31
- getAllTxHashes: ()=>Promise.resolve([]),
32
- getPendingTxHashes: ()=>Promise.resolve([]),
33
- getPendingTxCount: ()=>Promise.resolve(0),
34
- getMinedTxHashes: ()=>Promise.resolve([]),
35
- getTxStatus: ()=>Promise.resolve(TxStatus.PENDING),
36
- getTxsByHash: ()=>Promise.resolve([]),
37
- hasTxs: ()=>Promise.resolve([]),
38
- hasTx: ()=>Promise.resolve(false),
39
- updateConfig: ()=>{},
40
- markTxsAsNonEvictable: ()=>Promise.resolve(),
41
- cleanupDeletedMinedTxs: ()=>Promise.resolve(0)
42
- };
43
- return Object.assign(new EventEmitter(), pool);
44
- }
45
- function mockAttestationPool() {
46
- return {
47
- isEmpty: ()=>Promise.resolve(false),
48
- addAttestations: ()=>Promise.resolve(),
49
- deleteAttestations: ()=>Promise.resolve(),
50
- deleteAttestationsOlderThan: ()=>Promise.resolve(),
51
- deleteAttestationsForSlot: ()=>Promise.resolve(),
52
- deleteAttestationsForSlotAndProposal: ()=>Promise.resolve(),
53
- getAttestationsForSlot: ()=>Promise.resolve([]),
54
- getAttestationsForSlotAndProposal: ()=>Promise.resolve([]),
55
- addBlockProposal: ()=>Promise.resolve(),
56
- getBlockProposal: ()=>Promise.resolve(undefined),
57
- hasBlockProposal: ()=>Promise.resolve(false),
58
- hasAttestation: ()=>Promise.resolve(false),
59
- canAddProposal: ()=>Promise.resolve(true),
60
- canAddAttestation: ()=>Promise.resolve(true)
61
- };
62
- }
63
- function mockEpochCache() {
64
- return {
65
- getCommittee: ()=>Promise.resolve({
66
- committee: [],
67
- seed: 1n,
68
- epoch: EpochNumber.ZERO
69
- }),
70
- getProposerIndexEncoding: ()=>'0x',
71
- getEpochAndSlotNow: ()=>({
72
- epoch: EpochNumber.ZERO,
73
- slot: SlotNumber.ZERO,
74
- ts: 0n
75
- }),
76
- computeProposerIndex: ()=>0n,
77
- getProposerAttesterAddressInCurrentOrNextSlot: ()=>Promise.resolve({
78
- currentProposer: EthAddress.ZERO,
79
- nextProposer: EthAddress.ZERO,
80
- currentSlot: SlotNumber.ZERO,
81
- nextSlot: SlotNumber.ZERO
82
- }),
83
- getEpochAndSlotInNextL1Slot: ()=>({
84
- epoch: EpochNumber.ZERO,
85
- slot: SlotNumber.ZERO,
86
- ts: 0n,
87
- now: 0n
88
- }),
89
- isInCommittee: ()=>Promise.resolve(false),
90
- getRegisteredValidators: ()=>Promise.resolve([]),
91
- filterInCommittee: ()=>Promise.resolve([])
92
- };
26
+ import { LibP2PService } from '../services/index.js';
27
+ import { BatchTxRequester } from '../services/reqresp/batch-tx-requester/batch_tx_requester.js';
28
+ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
29
+ import { RequestTracker } from '../services/tx_collection/request_tracker.js';
30
+ import { AlwaysTrueCircuitVerifier } from '../test-helpers/index.js';
31
+ import { BENCHMARK_CONSTANTS, InMemoryAttestationPool, InMemoryTxPool, UNLIMITED_RATE_LIMIT_QUOTA, createMockEpochCache, createMockWorldStateSynchronizer, filterTxsByDistribution } from '../test-helpers/index.js';
32
+ const txCache = new Map();
33
+ const BENCH_L1_CONSTANTS = {
34
+ ...EmptyL1RollupConstants,
35
+ slotDuration: 12,
36
+ ethereumSlotDuration: 4
37
+ };
38
+ class TestbenchL2BlockSource extends MockL2BlockSource {
39
+ getL1Constants() {
40
+ return Promise.resolve(BENCH_L1_CONSTANTS);
41
+ }
93
42
  }
94
- function mockWorldStateSynchronizer() {
43
+ function createBenchmarkEpochCache() {
95
44
  return {
96
- status: ()=>Promise.resolve({
97
- syncSummary: {
98
- latestBlockNumber: 0,
99
- latestBlockHash: '',
100
- finalizedBlockNumber: 0,
101
- treesAreSynched: false,
102
- oldestHistoricBlockNumber: 0
103
- }
104
- })
45
+ ...createMockEpochCache(),
46
+ getL1Constants: ()=>BENCH_L1_CONSTANTS
105
47
  };
106
48
  }
107
49
  class TestLibP2PService extends LibP2PService {
108
50
  disableTxValidation;
109
51
  gossipMessageCount = 0;
110
- constructor(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:test:libp2p_service'), disableTxValidation = true){
111
- super(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
52
+ constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:test:libp2p_service'), disableTxValidation = true){
53
+ super(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, {
54
+ getCurrentMinFees: ()=>Promise.resolve(GasFees.empty())
55
+ }, telemetry, logger);
112
56
  this.disableTxValidation = disableTxValidation;
113
57
  }
114
58
  getGossipMessageCount() {
@@ -125,7 +69,7 @@ class TestLibP2PService extends LibP2PService {
125
69
  const txHash = tx.getTxHash();
126
70
  const txHashString = txHash.toString();
127
71
  this.logger.verbose(`Received tx ${txHashString} from external peer ${source.toString()}.`);
128
- await this.mempools.txPool.addTxs([
72
+ await this.mempools.txPool.addPendingTxs([
129
73
  tx
130
74
  ]);
131
75
  } else {
@@ -141,66 +85,280 @@ class TestLibP2PService extends LibP2PService {
141
85
  await super.handleNewGossipMessage(msg, msgId, source);
142
86
  }
143
87
  }
88
+ async function generateDeterministicTxs(txCount, seed, config) {
89
+ const cached = txCache.get(seed) ?? [];
90
+ if (cached.length >= txCount) {
91
+ return cached.slice(0, txCount);
92
+ }
93
+ const expirationTimestampBase = BigInt(seed);
94
+ for(let i = cached.length; i < txCount; i++){
95
+ const txSeed = seed * 10000 + i;
96
+ const tx = await mockTx(txSeed, {
97
+ chainId: new Fr(config.l1ChainId),
98
+ version: new Fr(config.rollupVersion),
99
+ vkTreeRoot: getVKTreeRoot(),
100
+ protocolContractsHash,
101
+ feePayer: makeAztecAddress(txSeed + 1),
102
+ chonkProof: ChonkProof.empty(),
103
+ numberOfNonRevertiblePublicCallRequests: 0,
104
+ numberOfRevertiblePublicCallRequests: 0,
105
+ numberOfRevertibleNullifiers: 0,
106
+ hasPublicTeardownCallRequest: false,
107
+ publicCalldataSize: 0
108
+ });
109
+ tx.data.expirationTimestamp = expirationTimestampBase + BigInt(i);
110
+ await tx.recomputeHash();
111
+ cached.push(tx);
112
+ }
113
+ txCache.set(seed, cached);
114
+ return cached.slice(0, txCount);
115
+ }
116
+ async function createBlockProposal(blockNumber, txHashes, seed) {
117
+ const archiveRoot = new Fr(BigInt(seed) * 1000000n + BigInt(blockNumber));
118
+ return await makeBlockProposal({
119
+ signer: Secp256k1Signer.random(),
120
+ blockHeader: makeBlockHeader(1, {
121
+ blockNumber: BlockNumber(blockNumber)
122
+ }),
123
+ archiveRoot,
124
+ txHashes
125
+ });
126
+ }
127
+ function installUnlimitedRateLimits(client) {
128
+ const reqResp = client.p2pService.reqresp;
129
+ const rateLimiter = reqResp.rateLimiter;
130
+ rateLimiter.getRateLimits = ()=>UNLIMITED_RATE_LIMIT_QUOTA;
131
+ rateLimiter.allow = ()=>RateLimitStatus.Allowed;
132
+ }
133
+ /** Resets peer scores to prevent cross-case contamination in benchmarks. */ function resetPeerScores(client) {
134
+ const peerManager = client.p2pService.peerManager;
135
+ const peerScoring = peerManager?.peerScoring;
136
+ if (peerScoring?.resetAllScores) {
137
+ peerScoring.resetAllScores();
138
+ }
139
+ }
140
+ /** Returns the number of connected peers for connectivity checks. */ function getConnectedPeerCount(client) {
141
+ const p2pService = client.p2pService;
142
+ const connectionSampler = p2pService?.reqresp?.getConnectionSampler?.();
143
+ if (connectionSampler?.getPeerListSortedByConnectionCountAsc) {
144
+ return connectionSampler.getPeerListSortedByConnectionCountAsc().length;
145
+ }
146
+ return 0;
147
+ }
148
+ async function runAggregatorBenchmark(client, blockProposal, timeoutMs, pinnedPeerId, pinnedPeerIndex, logger, expectedPeerCount) {
149
+ let timer = new Timer();
150
+ try {
151
+ installUnlimitedRateLimits(client);
152
+ const txHashes = blockProposal.txHashes;
153
+ logger.info(`[BENCH] Using block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`);
154
+ const p2pService = client.p2pService;
155
+ const batchTxRequesterService = p2pService.getBatchTxRequesterService();
156
+ const minPeersRequired = Math.max(1, expectedPeerCount - 1);
157
+ const maxWaitMs = BENCHMARK_CONSTANTS.MAX_PEER_WAIT_MS;
158
+ const waitInterval = BENCHMARK_CONSTANTS.PEER_CHECK_INTERVAL_MS;
159
+ let waited = 0;
160
+ while(waited < maxWaitMs){
161
+ const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
162
+ if (connectedPeers.length >= minPeersRequired) {
163
+ logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers, starting benchmark`);
164
+ break;
165
+ }
166
+ logger.debug(`[BENCH] Waiting for peers: ${connectedPeers.length}/${minPeersRequired} (waited ${waited}ms)`);
167
+ await sleep(waitInterval);
168
+ waited += waitInterval;
169
+ }
170
+ const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
171
+ logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers`);
172
+ logger.info(`[BENCH] Requesting ${txHashes.length} tx hashes: ${txHashes.slice(0, 3).map((h)=>h.toString()).join(', ')}...`);
173
+ let pinnedPeer;
174
+ if (pinnedPeerId) {
175
+ pinnedPeer = peerIdFromString(pinnedPeerId);
176
+ } else if (pinnedPeerIndex !== undefined) {
177
+ if (pinnedPeerIndex > 0 && pinnedPeerIndex <= connectedPeers.length) {
178
+ pinnedPeer = connectedPeers[pinnedPeerIndex - 1];
179
+ }
180
+ }
181
+ const noopTxValidator = {
182
+ validateTx: (_tx)=>Promise.resolve({
183
+ result: 'valid'
184
+ })
185
+ };
186
+ timer = new Timer();
187
+ const tracker = RequestTracker.create(txHashes, new Date(Date.now() + timeoutMs));
188
+ const batchRequester = new BatchTxRequester(tracker, blockProposal, pinnedPeer, batchTxRequesterService, logger, new DateProvider(), {
189
+ txValidator: noopTxValidator
190
+ });
191
+ const fetchedTxs = await BatchTxRequester.collectAllTxs(batchRequester.run());
192
+ const durationMs = timer.ms();
193
+ return {
194
+ type: 'BENCH_RESULT',
195
+ durationMs,
196
+ fetchedCount: fetchedTxs.length,
197
+ success: fetchedTxs.length === txHashes.length
198
+ };
199
+ } catch (err) {
200
+ return {
201
+ type: 'BENCH_RESULT',
202
+ durationMs: timer.ms(),
203
+ fetchedCount: 0,
204
+ success: false,
205
+ error: err?.message ?? String(err)
206
+ };
207
+ }
208
+ }
209
+ let workerClient = null;
210
+ let workerTxPool = null;
211
+ let workerAttestationPool = null;
212
+ let workerConfig = null;
213
+ let workerLogger = null;
214
+ let kvStore = null;
215
+ async function stopWorker() {
216
+ try {
217
+ if (workerClient) {
218
+ await workerClient.stop();
219
+ workerClient = null;
220
+ }
221
+ } catch (e) {
222
+ workerLogger?.error('Error stopping worker client', e);
223
+ }
224
+ try {
225
+ if (kvStore?.close) {
226
+ await kvStore.close();
227
+ kvStore = null;
228
+ }
229
+ } catch (e) {
230
+ workerLogger?.error('Error closing kv store', e);
231
+ }
232
+ }
233
+ function gracefulExit(code = 0) {
234
+ try {
235
+ if (process.connected) {
236
+ process.disconnect();
237
+ }
238
+ } catch {
239
+ // IPC channel already closed
240
+ }
241
+ // Safety fallback if lingering handles prevent the event loop from draining
242
+ setTimeout(()=>process.exit(code), 5000).unref();
243
+ }
144
244
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
145
245
  process.on('message', async (msg)=>{
146
- const { type, config, clientIndex } = msg;
246
+ const { type, config: rawConfig, clientIndex } = msg;
147
247
  try {
148
248
  if (type === 'START') {
149
- const txPool = mockTxPool();
150
- const attestationPool = mockAttestationPool();
151
- const epochCache = mockEpochCache();
152
- const worldState = mockWorldStateSynchronizer();
153
- const l2BlockSource = new MockL2BlockSource();
249
+ const config = {
250
+ ...rawConfig,
251
+ peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
252
+ priceBumpPercentage: 10n
253
+ };
254
+ workerConfig = config;
255
+ workerTxPool = new InMemoryTxPool();
256
+ workerAttestationPool = new InMemoryAttestationPool();
257
+ const epochCache = createBenchmarkEpochCache();
258
+ const worldState = createMockWorldStateSynchronizer();
259
+ const l2BlockSource = new TestbenchL2BlockSource();
154
260
  const proofVerifier = new AlwaysTrueCircuitVerifier();
155
- const kvStore = await openTmpStore(`test-${clientIndex}`);
156
- const logger = createLogger(`p2p:${clientIndex}`);
261
+ kvStore = await openTmpStore(`test-${clientIndex}`, true, BENCHMARK_CONSTANTS.KV_STORE_MAP_SIZE_KB);
262
+ workerLogger = createLogger(`p2p:${clientIndex}`);
263
+ workerTxPool.setLogger(workerLogger);
157
264
  const telemetry = getTelemetryClient();
158
265
  const deps = {
159
- txPool,
160
- attestationPool,
266
+ txPool: workerTxPool,
267
+ attestationPool: workerAttestationPool,
161
268
  store: kvStore,
162
- logger
269
+ logger: workerLogger
163
270
  };
164
- const client = await createP2PClient(P2PClientType.Full, config, l2BlockSource, proofVerifier, worldState, epochCache, 'test-p2p-bench-worker', undefined, telemetry, deps);
165
- // Create test service with validation disabled
166
- const testService = new TestLibP2PService(P2PClientType.Full, config, client.p2pService.node, client.p2pService.peerDiscoveryService, client.p2pService.mempools, client.p2pService.reqresp, client.p2pService.peerManager, client.p2pService.archiver, epochCache, proofVerifier, worldState, telemetry, logger, true);
167
- // Replace the existing p2pService with our test version
271
+ const client = await createP2PClient(config, l2BlockSource, proofVerifier, worldState, epochCache, {
272
+ getCurrentMinFees: ()=>Promise.resolve(GasFees.empty())
273
+ }, 'test-p2p-bench-worker', undefined, telemetry, deps, await l2BlockSource.getInitialHeader().hash());
274
+ const testService = new TestLibP2PService(config, client.p2pService.node, client.p2pService.peerDiscoveryService, client.p2pService.reqresp, client.p2pService.peerManager, client.p2pService.mempools, client.p2pService.archiver, epochCache, proofVerifier, worldState, telemetry, workerLogger, true);
168
275
  client.p2pService = testService;
169
276
  await client.start();
170
- // Wait until the client is ready
171
277
  for(let i = 0; i < 100; i++){
172
278
  const isReady = client.isReady();
173
- logger.debug(`Client ${clientIndex} isReady: ${isReady}`);
279
+ workerLogger.debug(`Client ${clientIndex} isReady: ${isReady}`);
174
280
  if (isReady) {
175
281
  break;
176
282
  }
177
283
  await sleep(1000);
178
284
  }
179
- // Listen for commands from parent
180
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
181
- process.on('message', async (cmd)=>{
182
- switch(cmd.type){
183
- case 'STOP':
184
- await client.stop();
185
- process.exit(0);
186
- break;
187
- case 'SEND_TX':
188
- await client.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
285
+ workerClient = client;
286
+ const peerId = client.p2pService.node.peerId.toString();
287
+ process.send({
288
+ type: 'READY',
289
+ peerId
290
+ });
291
+ return;
292
+ }
293
+ const cmd = msg;
294
+ switch(cmd.type){
295
+ case 'STOP':
296
+ await stopWorker();
297
+ gracefulExit(0);
298
+ break;
299
+ case 'SEND_TX':
300
+ if (workerClient) {
301
+ await workerClient.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
302
+ process.send({
303
+ type: 'TX_SENT'
304
+ });
305
+ }
306
+ break;
307
+ case 'GET_PEER_COUNT':
308
+ process.send({
309
+ type: 'PEER_COUNT',
310
+ count: workerClient ? getConnectedPeerCount(workerClient) : 0
311
+ });
312
+ break;
313
+ case 'BENCH_REQRESP':
314
+ {
315
+ const benchCmd = cmd;
316
+ if (!workerClient || !workerTxPool || !workerAttestationPool || !workerConfig || !workerLogger) {
189
317
  process.send({
190
- type: 'TX_SENT'
318
+ type: 'BENCH_RESULT',
319
+ durationMs: 0,
320
+ fetchedCount: 0,
321
+ success: false,
322
+ error: 'Worker not initialized'
191
323
  });
192
324
  break;
325
+ }
326
+ // Reset state before each benchmark run to avoid cross-run contamination
327
+ workerTxPool.resetState();
328
+ workerAttestationPool.resetState();
329
+ resetPeerScores(workerClient);
330
+ installUnlimitedRateLimits(workerClient);
331
+ const allTxs = await generateDeterministicTxs(benchCmd.txCount, benchCmd.seed, workerConfig);
332
+ const txHashes = allTxs.map((tx)=>tx.getTxHash());
333
+ const blockProposal = await createBlockProposal(benchCmd.blockNumber, txHashes, benchCmd.seed);
334
+ await workerAttestationPool.tryAddBlockProposal(blockProposal);
335
+ workerLogger.debug(`[BENCH] Added block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`);
336
+ if (benchCmd.isAggregator) {
337
+ workerTxPool.clearTxs();
338
+ workerLogger.info(`[BENCH] Aggregator starting benchmark: txCount=${benchCmd.txCount}, distribution=${benchCmd.distribution}`);
339
+ const result = await runAggregatorBenchmark(workerClient, blockProposal, benchCmd.timeoutMs, benchCmd.pinnedPeerId, benchCmd.pinnedPeerIndex, workerLogger, benchCmd.peerCount);
340
+ process.send(result);
341
+ } else {
342
+ const myTxs = filterTxsByDistribution(allTxs, benchCmd.peerIndex, benchCmd.peerCount, benchCmd.distribution, benchCmd.pinnedPeerIndex);
343
+ workerTxPool.setTxs(myTxs);
344
+ workerLogger.info(`[BENCH] Peer ${benchCmd.peerIndex} populated tx pool with ${myTxs.length}/${benchCmd.txCount} txs (${benchCmd.distribution})`);
345
+ process.send({
346
+ type: 'BENCH_READY'
347
+ });
348
+ }
349
+ break;
193
350
  }
194
- });
351
+ }
352
+ } catch (err) {
353
+ try {
195
354
  process.send({
196
- type: 'READY'
355
+ type: 'ERROR',
356
+ error: err.message
197
357
  });
358
+ } catch {
359
+ // IPC channel may be closed
198
360
  }
199
- } catch (err) {
200
- process.send({
201
- type: 'ERROR',
202
- error: err.message
203
- });
204
- process.exit(1);
361
+ await stopWorker();
362
+ gracefulExit(1);
205
363
  }
206
364
  });
@@ -2,33 +2,63 @@ import type { Logger } from '@aztec/foundation/log';
2
2
  import type { ChainConfig } from '@aztec/stdlib/config';
3
3
  import { type ChildProcess } from 'child_process';
4
4
  import { type P2PConfig } from '../config.js';
5
+ import type { DistributionPattern } from './p2p_client_testbench_worker.js';
5
6
  declare const testChainConfig: ChainConfig;
7
+ export interface ReqRespBenchmarkConfig {
8
+ txCount: number;
9
+ distribution: DistributionPattern;
10
+ timeoutMs: number;
11
+ pinnedPeerIndex?: number;
12
+ blockNumber?: number;
13
+ seed?: number;
14
+ }
15
+ export interface ReqRespBenchmarkResult {
16
+ txCount: number;
17
+ distribution: DistributionPattern;
18
+ durationMs: number;
19
+ fetchedCount: number;
20
+ success: boolean;
21
+ error?: string;
22
+ }
6
23
  declare class WorkerClientManager {
7
24
  processes: ChildProcess[];
8
25
  peerIdPrivateKeys: string[];
9
26
  peerEnrs: string[];
10
27
  ports: number[];
28
+ peerIds: string[];
11
29
  private p2pConfig;
12
30
  private logger;
13
31
  private messageReceivedByClient;
14
32
  constructor(logger: Logger, p2pConfig: Partial<P2PConfig>);
15
33
  destroy(): void;
16
34
  /**
17
- * Creates a client configuration object
35
+ * Creates a client configuration object for IPC.
36
+ * Note: We send the raw peerIdPrivateKey string instead of SecretValue
37
+ * because SecretValue.toJSON() returns '[Redacted]', losing the value.
38
+ * The worker must re-wrap it in SecretValue.
39
+ * We also omit priceBumpPercentage since it's a bigint and can't be
40
+ * serialized over IPC (which uses JSON under the hood).
18
41
  */
19
42
  private createClientConfig;
20
43
  /**
21
- * Spawns a worker process and returns a promise that resolves when the worker is ready
44
+ * Spawns a worker process and returns a promise that resolves when the worker is ready.
45
+ * Config uses raw string for peerIdPrivateKey (not SecretValue) for IPC serialization.
22
46
  */
23
47
  private spawnWorkerProcess;
24
48
  /**
25
- * Creates a number of worker clients in separate processes
26
- * All are configured to connect to each other and overrided with the test specific config
49
+ * Creates a number of worker clients in separate processes.
50
+ * All are configured to connect to each other and overridden with the test-specific config.
27
51
  *
28
52
  * @param numberOfClients - The number of clients to create
53
+ * @param options - Optional overrides for seeding/bootstrapping strategy
29
54
  * @returns The ENRs of the created clients
30
55
  */
31
- makeWorkerClients(numberOfClients: number): Promise<string[]>;
56
+ makeWorkerClients(numberOfClients: number, options?: {
57
+ bootstrapMode?: 'subset' | 'all';
58
+ seedPeerLimit?: number;
59
+ batchSize?: number;
60
+ batchDelayMs?: number;
61
+ }): Promise<string[]>;
32
62
  purgeMessageReceivedByClient(): void;
33
63
  numberOfClientsThatReceivedMessage(): number;
34
64
  /**
@@ -46,6 +76,27 @@ declare class WorkerClientManager {
46
76
  * Cleans up all worker processes with timeout and force kill if needed
47
77
  */
48
78
  cleanup(): Promise<void>;
79
+ /**
80
+ * Checks that the aggregator (client 0) has sufficient peer connections before running a benchmark.
81
+ * This prevents benchmark cases from starting with degraded connectivity after a previous case
82
+ * caused connection failures.
83
+ */
84
+ waitForConnectivity(minPeers: number, timeoutMs?: number): Promise<number>;
85
+ private getPeerCount;
86
+ /**
87
+ * Run a req/resp benchmark across all worker clients.
88
+ *
89
+ * This sends a BENCH_REQRESP command to all workers:
90
+ * - Aggregator (client 0) runs the collector and returns timing results
91
+ * - Responders (clients 1..N) populate their tx pools based on distribution
92
+ *
93
+ * All workers generate the same txs deterministically from a shared seed,
94
+ * then filter based on their peerIndex and distribution pattern.
95
+ */
96
+ runReqRespBenchmark(config: ReqRespBenchmarkConfig): Promise<ReqRespBenchmarkResult>;
97
+ private waitForBenchReady;
98
+ private waitForBenchResult;
49
99
  }
50
100
  export { WorkerClientManager, testChainConfig };
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyX2NsaWVudF9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3dvcmtlcl9jbGllbnRfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFJeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQVFuRSxRQUFBLE1BQU0sZUFBZSxFQUFFLFdBTXRCLENBQUM7QUFFRixjQUFNLG1CQUFtQjtJQUNoQixTQUFTLEVBQUUsWUFBWSxFQUFFLENBQU07SUFDL0IsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDakMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQ3hCLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBTTtJQUM1QixPQUFPLENBQUMsU0FBUyxDQUFxQjtJQUN0QyxPQUFPLENBQUMsTUFBTSxDQUFTO0lBQ3ZCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBZ0I7SUFFL0MsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBR3hEO0lBRUQsT0FBTyxTQUtOO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBaUIxQjs7T0FFRztJQUNILE9BQU8sQ0FBQyxrQkFBa0I7SUFvRDFCOzs7Ozs7T0FNRztJQUNHLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxNQUFNLHFCQXlDOUM7SUFFRCw0QkFBNEIsU0FFM0I7SUFFRCxrQ0FBa0MsV0FFakM7SUFFRDs7Ozs7T0FLRztJQUNHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQTRDcEQ7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FBQyxnQkFBZ0I7SUFzQ3hCOztPQUVHO0lBQ0csT0FBTyxrQkFnQ1o7Q0FDRjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQyJ9
101
+ export type { DistributionPattern } from './p2p_client_testbench_worker.js';
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyX2NsaWVudF9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3dvcmtlcl9jbGllbnRfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUtuRSxPQUFPLEtBQUssRUFBMkMsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVFySCxRQUFBLE1BQU0sZUFBZSxFQUFFLFdBSXRCLENBQUM7QUFFRixNQUFNLFdBQVcsc0JBQXNCO0lBQ3JDLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDaEIsWUFBWSxFQUFFLG1CQUFtQixDQUFDO0lBQ2xDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDZjtBQUVELE1BQU0sV0FBVyxzQkFBc0I7SUFDckMsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7SUFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQztJQUNuQixZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDakIsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0NBQ2hCO0FBRUQsY0FBTSxtQkFBbUI7SUFDaEIsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFNO0lBQy9CLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQ2pDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBTTtJQUN4QixLQUFLLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDckIsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQzlCLE9BQU8sQ0FBQyxTQUFTLENBQXFCO0lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFDdkIsT0FBTyxDQUFDLHVCQUF1QixDQUFnQjtJQUUvQyxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFHeEQ7SUFFRCxPQUFPLFNBSU47SUFFRDs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLGtCQUFrQjtJQW9CMUI7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLGtCQUFrQjtJQWtHMUI7Ozs7Ozs7T0FPRztJQUNHLGlCQUFpQixDQUNyQixlQUFlLEVBQUUsTUFBTSxFQUN2QixPQUFPLEdBQUU7UUFDUCxhQUFhLENBQUMsRUFBRSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUN2QixTQUFTLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDbkIsWUFBWSxDQUFDLEVBQUUsTUFBTSxDQUFDO0tBQ2xCLHFCQStEUDtJQUVELDRCQUE0QixTQUUzQjtJQUVELGtDQUFrQyxXQUVqQztJQUVEOzs7OztPQUtHO0lBQ0csVUFBVSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBOENwRDtJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLGdCQUFnQjtJQXFDeEI7O09BRUc7SUFDRyxPQUFPLGtCQWdDWjtJQUVEOzs7O09BSUc7SUFDRyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsR0FBRSxNQUFlLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQWtCdkY7SUFFRCxPQUFPLENBQUMsWUFBWTtJQThCcEI7Ozs7Ozs7OztPQVNHO0lBQ0csbUJBQW1CLENBQUMsTUFBTSxFQUFFLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQWtFekY7SUFFRCxPQUFPLENBQUMsaUJBQWlCO0lBa0N6QixPQUFPLENBQUMsa0JBQWtCO0NBaUMzQjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNoRCxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAIxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAQnE,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IAC5B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,SAKN;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoD1B;;;;;;OAMG;IACG,iBAAiB,CAAC,eAAe,EAAE,MAAM,qBAyC9C;IAED,4BAA4B,SAE3B;IAED,kCAAkC,WAEjC;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBA4CpD;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACG,OAAO,kBAgCZ;CACF;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAKxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAKnE,OAAO,KAAK,EAA2C,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAQrH,QAAA,MAAM,eAAe,EAAE,WAItB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,SAIN;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;;;;;;OAOG;IACG,iBAAiB,CACrB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KAClB,qBA+DP;IAED,4BAA4B,SAE3B;IAED,kCAAkC,WAEjC;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBA8CpD;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACG,OAAO,kBAgCZ;IAED;;;;OAIG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBvF;IAED,OAAO,CAAC,YAAY;IA8BpB;;;;;;;;;OASG;IACG,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkEzF;IAED,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;CAiC3B;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC"}