@aztec/p2p 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5a9928

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 (522) hide show
  1. package/README.md +130 -3
  2. package/dest/bootstrap/bootstrap.d.ts +1 -1
  3. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  4. package/dest/bootstrap/bootstrap.js +22 -6
  5. package/dest/client/factory.d.ts +11 -10
  6. package/dest/client/factory.d.ts.map +1 -1
  7. package/dest/client/factory.js +64 -17
  8. package/dest/client/interface.d.ts +86 -40
  9. package/dest/client/interface.d.ts.map +1 -1
  10. package/dest/client/p2p_client.d.ts +67 -64
  11. package/dest/client/p2p_client.d.ts.map +1 -1
  12. package/dest/client/p2p_client.js +251 -251
  13. package/dest/config.d.ts +173 -94
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +158 -44
  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 +106 -55
  29. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  30. package/dest/mem_pools/attestation_pool/attestation_pool.js +302 -195
  31. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  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 +274 -115
  34. package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
  35. package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
  36. package/dest/mem_pools/attestation_pool/index.js +1 -1
  37. package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
  38. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  39. package/dest/mem_pools/attestation_pool/mocks.js +7 -5
  40. package/dest/mem_pools/index.d.ts +2 -2
  41. package/dest/mem_pools/index.d.ts.map +1 -1
  42. package/dest/mem_pools/instrumentation.d.ts +12 -5
  43. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  44. package/dest/mem_pools/instrumentation.js +38 -17
  45. package/dest/mem_pools/interface.d.ts +3 -3
  46. package/dest/mem_pools/interface.d.ts.map +1 -1
  47. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
  48. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
  49. package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
  50. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
  51. package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
  52. package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
  53. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
  54. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
  55. package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
  56. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
  57. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
  58. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +8 -4
  59. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
  60. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
  61. package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +15 -5
  62. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
  63. package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
  64. package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
  65. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
  66. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
  67. package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
  68. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
  69. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
  70. package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
  71. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
  72. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
  73. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +6 -5
  74. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
  75. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
  76. package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -8
  77. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
  78. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
  79. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +15 -6
  80. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
  81. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
  82. package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
  83. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
  84. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
  85. package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
  86. package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
  87. package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
  88. package/dest/mem_pools/tx_pool_v2/index.js +2 -1
  89. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +25 -0
  90. package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
  91. package/dest/mem_pools/tx_pool_v2/instrumentation.js +67 -0
  92. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +62 -16
  93. package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
  94. package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -1
  95. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +81 -15
  96. package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
  97. package/dest/mem_pools/tx_pool_v2/tx_metadata.js +147 -19
  98. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +26 -3
  99. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
  100. package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +79 -43
  101. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +27 -7
  102. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
  103. package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +94 -32
  104. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +62 -9
  105. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
  106. package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +537 -246
  107. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
  108. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  109. package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
  110. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
  111. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  112. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
  113. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +12 -5
  114. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
  115. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
  116. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
  117. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
  118. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
  119. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
  120. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
  121. package/dest/msg_validators/proposal_validator/proposal_validator.js +130 -48
  122. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
  123. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  124. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
  125. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
  126. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
  127. package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
  128. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
  129. package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
  130. package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
  131. package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
  132. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
  133. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  134. package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
  135. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
  136. package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
  137. package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
  138. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
  139. package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
  140. package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
  141. package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
  142. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  143. package/dest/msg_validators/tx_validator/data_validator.js +36 -2
  144. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
  145. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  146. package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
  147. package/dest/msg_validators/tx_validator/factory.d.ts +133 -7
  148. package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
  149. package/dest/msg_validators/tx_validator/factory.js +261 -61
  150. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
  151. package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
  152. package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
  153. package/dest/msg_validators/tx_validator/gas_validator.d.ts +104 -3
  154. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  155. package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
  156. package/dest/msg_validators/tx_validator/index.d.ts +5 -1
  157. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
  158. package/dest/msg_validators/tx_validator/index.js +4 -0
  159. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  160. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  161. package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
  162. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
  163. package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
  164. package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
  165. package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
  166. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  167. package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
  168. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
  169. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  170. package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
  171. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
  172. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  173. package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
  174. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
  175. package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
  176. package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
  177. package/dest/services/data_store.d.ts +1 -1
  178. package/dest/services/data_store.d.ts.map +1 -1
  179. package/dest/services/data_store.js +5 -5
  180. package/dest/services/discv5/discV5_service.d.ts +13 -2
  181. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  182. package/dest/services/discv5/discV5_service.js +119 -23
  183. package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
  184. package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
  185. package/dest/services/discv5/persisted_enr_store.js +145 -0
  186. package/dest/services/dummy_service.d.ts +25 -19
  187. package/dest/services/dummy_service.d.ts.map +1 -1
  188. package/dest/services/dummy_service.js +28 -20
  189. package/dest/services/encoding.d.ts +24 -7
  190. package/dest/services/encoding.d.ts.map +1 -1
  191. package/dest/services/encoding.js +43 -26
  192. package/dest/services/gossipsub/topic_score_params.d.ts +23 -17
  193. package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
  194. package/dest/services/gossipsub/topic_score_params.js +36 -24
  195. package/dest/services/libp2p/instrumentation.d.ts +6 -1
  196. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  197. package/dest/services/libp2p/instrumentation.js +21 -0
  198. package/dest/services/libp2p/libp2p_service.d.ts +71 -60
  199. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  200. package/dest/services/libp2p/libp2p_service.js +602 -407
  201. package/dest/services/peer-manager/metrics.d.ts +3 -1
  202. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  203. package/dest/services/peer-manager/metrics.js +6 -0
  204. package/dest/services/peer-manager/peer_manager.d.ts +31 -3
  205. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  206. package/dest/services/peer-manager/peer_manager.js +127 -26
  207. package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
  208. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  209. package/dest/services/peer-manager/peer_scoring.js +102 -13
  210. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +5 -8
  211. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
  212. package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +95 -127
  213. package/dest/services/reqresp/batch-tx-requester/interface.d.ts +11 -11
  214. package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
  215. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
  216. package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
  217. package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
  218. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
  219. package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
  220. package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
  221. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
  222. package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
  223. package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
  224. package/dest/services/reqresp/config.d.ts +15 -3
  225. package/dest/services/reqresp/config.d.ts.map +1 -1
  226. package/dest/services/reqresp/config.js +11 -0
  227. package/dest/services/reqresp/interface.d.ts +25 -18
  228. package/dest/services/reqresp/interface.d.ts.map +1 -1
  229. package/dest/services/reqresp/interface.js +23 -19
  230. package/dest/services/reqresp/metrics.d.ts +1 -1
  231. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  232. package/dest/services/reqresp/metrics.js +0 -1
  233. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
  234. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  235. package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
  236. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
  237. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
  238. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
  239. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -7
  240. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  241. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +57 -24
  242. package/dest/services/reqresp/protocols/index.d.ts +1 -2
  243. package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
  244. package/dest/services/reqresp/protocols/index.js +0 -1
  245. package/dest/services/reqresp/protocols/tx.d.ts +7 -1
  246. package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
  247. package/dest/services/reqresp/protocols/tx.js +21 -3
  248. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
  249. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  250. package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
  251. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  252. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
  253. package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
  254. package/dest/services/reqresp/reqresp.d.ts +7 -29
  255. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  256. package/dest/services/reqresp/reqresp.js +85 -219
  257. package/dest/services/service.d.ts +63 -19
  258. package/dest/services/service.d.ts.map +1 -1
  259. package/dest/services/tx_collection/config.d.ts +11 -14
  260. package/dest/services/tx_collection/config.d.ts.map +1 -1
  261. package/dest/services/tx_collection/config.js +26 -33
  262. package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
  263. package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
  264. package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
  265. package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
  266. package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
  267. package/dest/services/tx_collection/file_store_tx_source.js +100 -0
  268. package/dest/services/tx_collection/index.d.ts +3 -3
  269. package/dest/services/tx_collection/index.d.ts.map +1 -1
  270. package/dest/services/tx_collection/index.js +1 -1
  271. package/dest/services/tx_collection/instrumentation.js +1 -2
  272. package/dest/services/tx_collection/request_tracker.d.ts +53 -0
  273. package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
  274. package/dest/services/tx_collection/request_tracker.js +84 -0
  275. package/dest/services/tx_collection/tx_collection.d.ts +45 -51
  276. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  277. package/dest/services/tx_collection/tx_collection.js +296 -68
  278. package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
  279. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  280. package/dest/services/tx_collection/tx_collection_sink.js +28 -31
  281. package/dest/services/tx_collection/tx_source.d.ts +13 -7
  282. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  283. package/dest/services/tx_collection/tx_source.js +29 -7
  284. package/dest/services/tx_file_store/config.d.ts +1 -3
  285. package/dest/services/tx_file_store/config.d.ts.map +1 -1
  286. package/dest/services/tx_file_store/config.js +0 -4
  287. package/dest/services/tx_file_store/tx_file_store.d.ts +4 -5
  288. package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
  289. package/dest/services/tx_file_store/tx_file_store.js +13 -20
  290. package/dest/services/tx_provider.d.ts +6 -4
  291. package/dest/services/tx_provider.d.ts.map +1 -1
  292. package/dest/services/tx_provider.js +12 -8
  293. package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
  294. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  295. package/dest/test-helpers/make-test-p2p-clients.js +5 -3
  296. package/dest/test-helpers/mock-pubsub.d.ts +56 -6
  297. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  298. package/dest/test-helpers/mock-pubsub.js +128 -14
  299. package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
  300. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  301. package/dest/test-helpers/reqresp-nodes.js +17 -19
  302. package/dest/test-helpers/test_tx_provider.d.ts +3 -1
  303. package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
  304. package/dest/test-helpers/test_tx_provider.js +3 -0
  305. package/dest/test-helpers/testbench-utils.d.ts +49 -37
  306. package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
  307. package/dest/test-helpers/testbench-utils.js +142 -50
  308. package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
  309. package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
  310. package/dest/testbench/p2p_client_testbench_worker.js +112 -49
  311. package/dest/testbench/worker_client_manager.d.ts +12 -6
  312. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  313. package/dest/testbench/worker_client_manager.js +57 -11
  314. package/dest/util.d.ts +13 -8
  315. package/dest/util.d.ts.map +1 -1
  316. package/dest/util.js +35 -14
  317. package/dest/versioning.d.ts +3 -6
  318. package/dest/versioning.d.ts.map +1 -1
  319. package/dest/versioning.js +3 -24
  320. package/package.json +17 -17
  321. package/src/bootstrap/bootstrap.ts +17 -3
  322. package/src/client/factory.ts +129 -28
  323. package/src/client/interface.ts +88 -48
  324. package/src/client/p2p_client.ts +284 -317
  325. package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
  326. package/src/config.ts +280 -49
  327. package/src/errors/p2p-service.error.ts +11 -0
  328. package/src/errors/reqresp.error.ts +13 -19
  329. package/src/errors/tx-pool.error.ts +12 -0
  330. package/src/index.ts +1 -1
  331. package/src/mem_pools/attestation_pool/attestation_pool.ts +373 -236
  332. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +298 -119
  333. package/src/mem_pools/attestation_pool/index.ts +3 -3
  334. package/src/mem_pools/attestation_pool/mocks.ts +14 -8
  335. package/src/mem_pools/index.ts +1 -1
  336. package/src/mem_pools/instrumentation.ts +27 -17
  337. package/src/mem_pools/interface.ts +2 -2
  338. package/src/mem_pools/tx_pool_v2/README.md +85 -11
  339. package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
  340. package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
  341. package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
  342. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +6 -4
  343. package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +21 -6
  344. package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
  345. package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
  346. package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
  347. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -6
  348. package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -10
  349. package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -10
  350. package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
  351. package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
  352. package/src/mem_pools/tx_pool_v2/index.ts +2 -1
  353. package/src/mem_pools/tx_pool_v2/instrumentation.ts +96 -0
  354. package/src/mem_pools/tx_pool_v2/interfaces.ts +63 -16
  355. package/src/mem_pools/tx_pool_v2/tx_metadata.ts +215 -27
  356. package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +91 -43
  357. package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +122 -33
  358. package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +602 -242
  359. package/src/msg_validators/attestation_validator/README.md +49 -0
  360. package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
  361. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
  362. package/src/msg_validators/proposal_validator/README.md +123 -0
  363. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
  364. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
  365. package/src/msg_validators/proposal_validator/proposal_validator.ts +155 -49
  366. package/src/msg_validators/tx_validator/README.md +129 -0
  367. package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
  368. package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
  369. package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
  370. package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
  371. package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
  372. package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
  373. package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
  374. package/src/msg_validators/tx_validator/data_validator.ts +44 -1
  375. package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
  376. package/src/msg_validators/tx_validator/factory.ts +413 -80
  377. package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
  378. package/src/msg_validators/tx_validator/gas_validator.ts +195 -54
  379. package/src/msg_validators/tx_validator/index.ts +4 -0
  380. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  381. package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
  382. package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
  383. package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
  384. package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
  385. package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
  386. package/src/services/data_store.ts +5 -13
  387. package/src/services/discv5/discV5_service.ts +126 -14
  388. package/src/services/discv5/persisted_enr_store.ts +158 -0
  389. package/src/services/dummy_service.ts +38 -46
  390. package/src/services/encoding.ts +42 -26
  391. package/src/services/gossipsub/README.md +59 -22
  392. package/src/services/gossipsub/topic_score_params.ts +58 -31
  393. package/src/services/libp2p/instrumentation.ts +22 -0
  394. package/src/services/libp2p/libp2p_service.ts +687 -466
  395. package/src/services/peer-manager/metrics.ts +7 -0
  396. package/src/services/peer-manager/peer_manager.ts +140 -25
  397. package/src/services/peer-manager/peer_scoring.ts +102 -8
  398. package/src/services/reqresp/README.md +194 -0
  399. package/src/services/reqresp/batch-tx-requester/README.md +46 -7
  400. package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +92 -138
  401. package/src/services/reqresp/batch-tx-requester/interface.ts +14 -10
  402. package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
  403. package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
  404. package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
  405. package/src/services/reqresp/config.ts +19 -2
  406. package/src/services/reqresp/interface.ts +45 -46
  407. package/src/services/reqresp/metrics.ts +0 -1
  408. package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
  409. package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +36 -32
  410. package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +64 -20
  411. package/src/services/reqresp/protocols/index.ts +0 -1
  412. package/src/services/reqresp/protocols/tx.ts +23 -3
  413. package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
  414. package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
  415. package/src/services/reqresp/reqresp.ts +100 -263
  416. package/src/services/service.ts +80 -35
  417. package/src/services/tx_collection/config.ts +40 -49
  418. package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
  419. package/src/services/tx_collection/file_store_tx_source.ts +129 -0
  420. package/src/services/tx_collection/index.ts +2 -6
  421. package/src/services/tx_collection/instrumentation.ts +1 -1
  422. package/src/services/tx_collection/request_tracker.ts +127 -0
  423. package/src/services/tx_collection/tx_collection.ts +362 -110
  424. package/src/services/tx_collection/tx_collection_sink.ts +32 -36
  425. package/src/services/tx_collection/tx_source.ts +29 -8
  426. package/src/services/tx_file_store/config.ts +0 -6
  427. package/src/services/tx_file_store/tx_file_store.ts +15 -25
  428. package/src/services/tx_provider.ts +15 -9
  429. package/src/test-helpers/make-test-p2p-clients.ts +7 -6
  430. package/src/test-helpers/mock-pubsub.ts +152 -14
  431. package/src/test-helpers/reqresp-nodes.ts +15 -28
  432. package/src/test-helpers/test_tx_provider.ts +5 -0
  433. package/src/test-helpers/testbench-utils.ts +171 -68
  434. package/src/testbench/p2p_client_testbench_worker.ts +121 -64
  435. package/src/testbench/worker_client_manager.ts +72 -25
  436. package/src/util.ts +40 -19
  437. package/src/versioning.ts +3 -33
  438. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
  439. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
  440. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
  441. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
  442. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
  443. package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
  444. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
  445. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
  446. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
  447. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
  448. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
  449. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
  450. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
  451. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
  452. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
  453. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
  454. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
  455. package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
  456. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
  457. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
  458. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
  459. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
  460. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
  461. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
  462. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
  463. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
  464. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
  465. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
  466. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
  467. package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
  468. package/dest/mem_pools/tx_pool/index.d.ts +0 -3
  469. package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
  470. package/dest/mem_pools/tx_pool/index.js +0 -2
  471. package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
  472. package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
  473. package/dest/mem_pools/tx_pool/priority.js +0 -15
  474. package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
  475. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
  476. package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
  477. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
  478. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
  479. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
  480. package/dest/msg_validators/clock_tolerance.d.ts +0 -21
  481. package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
  482. package/dest/msg_validators/clock_tolerance.js +0 -37
  483. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
  484. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
  485. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
  486. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
  487. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
  488. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
  489. package/dest/services/reqresp/protocols/block.d.ts +0 -9
  490. package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
  491. package/dest/services/reqresp/protocols/block.js +0 -32
  492. package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -52
  493. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
  494. package/dest/services/tx_collection/fast_tx_collection.js +0 -307
  495. package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
  496. package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
  497. package/dest/services/tx_collection/proposal_tx_collector.js +0 -49
  498. package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
  499. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
  500. package/dest/services/tx_collection/slow_tx_collection.js +0 -177
  501. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -336
  502. package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
  503. package/src/mem_pools/tx_pool/README.md +0 -270
  504. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
  505. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
  506. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
  507. package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
  508. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
  509. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
  510. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
  511. package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
  512. package/src/mem_pools/tx_pool/index.ts +0 -2
  513. package/src/mem_pools/tx_pool/priority.ts +0 -20
  514. package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
  515. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
  516. package/src/msg_validators/clock_tolerance.ts +0 -51
  517. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
  518. package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
  519. package/src/services/reqresp/protocols/block.ts +0 -37
  520. package/src/services/tx_collection/fast_tx_collection.ts +0 -354
  521. package/src/services/tx_collection/proposal_tx_collector.ts +0 -112
  522. package/src/services/tx_collection/slow_tx_collection.ts +0 -233
@@ -1,21 +1,21 @@
1
- import { compactArray } from '@aztec/foundation/collection';
1
+ import { times } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
- import { RunningPromise } from '@aztec/foundation/promise';
4
- import { DateProvider } from '@aztec/foundation/timer';
3
+ import { sleep } from '@aztec/foundation/sleep';
4
+ import { DateProvider, elapsed } from '@aztec/foundation/timer';
5
+ import { TxHash } from '@aztec/stdlib/tx';
5
6
  import { getTelemetryClient } from '@aztec/telemetry-client';
6
- import { FastTxCollection } from './fast_tx_collection.js';
7
- import { SlowTxCollection } from './slow_tx_collection.js';
7
+ import { BatchTxRequester } from '../reqresp/batch-tx-requester/batch_tx_requester.js';
8
+ import { FileStoreTxCollection } from './file_store_tx_collection.js';
9
+ import { RequestTracker } from './request_tracker.js';
8
10
  import { TxCollectionSink } from './tx_collection_sink.js';
9
11
  /**
10
- * Coordinates tx collection from remote RPC nodes and reqresp.
12
+ * Coordinates tx collection from remote RPC nodes, reqresp, and file store.
11
13
  *
12
- * The slow collection loops are used for periodically collecting missing txs from mined blocks,
13
- * from remote RPC nodes and via reqresp. The fast collection methods are used to quickly gather
14
- * txs, usually for attesting to block proposals or preparing to prove an epoch. The slow and fast
15
- * collection instances both send their txs to the collection sink, which handles metrics and adds
16
- * them to the tx pool. Whenever a tx is added to either the sink or the pool, this service is notified
17
- * via events and notifies the slow and fast collection loops to stop collecting that tx, so that we don't
18
- * collect the same tx multiple times.
14
+ * Runs a sequential pipeline: node RPC → reqresp → file store. Node collection starts immediately,
15
+ * reqresp starts after a configured delay, and file store (if configured) starts after a further
16
+ * delay. All paths send txs to the collection sink, which handles metrics and adds them to the
17
+ * tx pool. Whenever a tx is added to the sink or the pool, this service is notified and stops
18
+ * collecting that tx across all in-flight requests.
19
19
  */ export class TxCollection {
20
20
  p2pService;
21
21
  nodes;
@@ -24,13 +24,14 @@ import { TxCollectionSink } from './tx_collection_sink.js';
24
24
  config;
25
25
  dateProvider;
26
26
  log;
27
- /** Slow collection background loops */ slowCollection;
28
- /** Fast collection methods */ fastCollection;
29
- /** Loop for periodically reconciling found transactions from the tx pool in case we missed some */ reconcileFoundTxsLoop;
30
- /** Handles txs found by the slow and fast collection loops */ txCollectionSink;
27
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
28
+ requests;
29
+ /** The collector for txs via reqresp */ reqRespTxsCollector;
30
+ /** File store collection for the fast (proposal/proving) path */ fileStoreFastCollection;
31
+ /** Handles txs found by collection paths before adding to the pool */ txCollectionSink;
31
32
  /** Handler for the txs-added event from the tx pool */ handleTxsAddedToPool;
32
33
  /** Handler for the txs-added event from the tx collection sink */ handleTxsFound;
33
- constructor(p2pService, nodes, constants, txPool, config, dateProvider = new DateProvider(), telemetryClient = getTelemetryClient(), log = createLogger('p2p:tx_collection_service')){
34
+ constructor(p2pService, nodes, constants, txPool, config, fileStoreSources = [], dateProvider = new DateProvider(), telemetryClient = getTelemetryClient(), log = createLogger('p2p:tx_collection_service')){
34
35
  this.p2pService = p2pService;
35
36
  this.nodes = nodes;
36
37
  this.constants = constants;
@@ -38,10 +39,14 @@ import { TxCollectionSink } from './tx_collection_sink.js';
38
39
  this.config = config;
39
40
  this.dateProvider = dateProvider;
40
41
  this.log = log;
42
+ this.requests = new Set();
41
43
  this.txCollectionSink = new TxCollectionSink(this.txPool, telemetryClient, this.log);
42
- this.fastCollection = new FastTxCollection(this.p2pService, this.nodes, this.txCollectionSink, this.config, this.dateProvider, this.log);
43
- this.slowCollection = new SlowTxCollection(this.p2pService.reqResp, this.nodes, this.txCollectionSink, this.fastCollection, constants, this.config, this.dateProvider, this.log);
44
- this.reconcileFoundTxsLoop = new RunningPromise(()=>this.reconcileFoundTxsWithPool(), this.log, this.config.txCollectionReconcileIntervalMs);
44
+ this.reqRespTxsCollector = (requestTracker, blockTxsSource, pinnedPeer)=>BatchTxRequester.collectAllTxs(new BatchTxRequester(requestTracker, blockTxsSource, pinnedPeer, this.p2pService, this.log, this.dateProvider).run());
45
+ this.fileStoreFastCollection = new FileStoreTxCollection(fileStoreSources, this.txCollectionSink, {
46
+ workerCount: config.txCollectionFileStoreFastWorkerCount,
47
+ backoffBaseMs: config.txCollectionFileStoreFastBackoffBaseMs,
48
+ backoffMaxMs: config.txCollectionFileStoreFastBackoffMaxMs
49
+ }, this.dateProvider, this.log);
45
50
  this.handleTxsFound = (args)=>{
46
51
  this.foundTxs(args.txs);
47
52
  };
@@ -54,75 +59,298 @@ import { TxCollectionSink } from './tx_collection_sink.js';
54
59
  };
55
60
  this.txPool.on('txs-added', this.handleTxsAddedToPool);
56
61
  }
57
- /** Starts all collection loops. */ start() {
58
- this.slowCollection.start();
59
- this.reconcileFoundTxsLoop.start();
60
- // TODO(palla/txs): Collect mined unproven tx hashes for txs we dont have in the pool and populate missingTxs on startup
61
- return Promise.resolve();
62
- }
63
- /** Stops all activity. */ async stop() {
64
- await Promise.all([
65
- this.slowCollection.stop(),
66
- this.fastCollection.stop(),
67
- this.reconcileFoundTxsLoop.stop()
68
- ]);
62
+ /** Stops all activity. Cancels in-flight requests; file store workers self-terminate. */ stop() {
63
+ this.requests.forEach((request)=>{
64
+ request.requestTracker.cancel();
65
+ });
69
66
  this.txPool.removeListener('txs-added', this.handleTxsAddedToPool);
70
67
  this.txCollectionSink.removeListener('txs-added', this.handleTxsFound);
71
68
  }
72
- /** Force trigger the slow collection and reconciliation loops */ async trigger() {
73
- await Promise.all([
74
- this.reconcileFoundTxsLoop.trigger(),
75
- this.slowCollection.trigger()
76
- ]);
77
- }
78
69
  /** Returns L1 rollup constants. */ getConstants() {
79
70
  return this.constants;
80
71
  }
81
- /** Starts collecting the given tx hashes for the given L2Block in the slow loop */ startCollecting(block, txHashes) {
82
- return this.slowCollection.startCollecting(block, txHashes);
83
- }
84
- /** Collects the set of txs for the given block proposal as fast as possible */ collectFastForProposal(blockProposal, blockNumber, txHashes, opts) {
85
- return this.collectFastFor({
86
- type: 'proposal',
87
- blockProposal,
88
- blockNumber
89
- }, txHashes, opts);
90
- }
91
72
  /** Collects the set of txs for the given mined block as fast as possible */ collectFastForBlock(block, txHashes, opts) {
92
73
  return this.collectFastFor({
93
74
  type: 'block',
94
75
  block
95
76
  }, txHashes, opts);
96
77
  }
97
- /** Collects the set of txs for the given proposal or block as fast as possible */ collectFastFor(input, txHashes, opts) {
98
- return this.fastCollection.collectFastFor(input, txHashes, opts);
78
+ /** Collects the set of txs for the given proposal or block as fast as possible */ async collectFastFor(input, txHashes, opts) {
79
+ const timeout = opts.deadline.getTime() - this.dateProvider.now();
80
+ if (timeout <= 0) {
81
+ this.log.warn(`Deadline for fast tx collection is in the past (${timeout}ms)`, {
82
+ deadline: opts.deadline.getTime(),
83
+ now: this.dateProvider.now()
84
+ });
85
+ return [];
86
+ }
87
+ const hashes = txHashes.map((h)=>typeof h === 'string' ? TxHash.fromString(h) : h);
88
+ const blockInfo = input.type === 'proposal' ? {
89
+ ...input.blockProposal.toBlockInfo(),
90
+ blockNumber: input.blockNumber
91
+ } : {
92
+ ...input.block.toBlockInfo()
93
+ };
94
+ const request = {
95
+ ...input,
96
+ blockInfo,
97
+ requestTracker: RequestTracker.create(hashes, opts.deadline, this.dateProvider)
98
+ };
99
+ const [duration] = await elapsed(()=>this.collectFast(request, {
100
+ pinnedPeer: opts.pinnedPeer
101
+ }));
102
+ this.log.verbose(`Collected ${request.requestTracker.collectedTxs.length} txs out of ${hashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`, {
103
+ ...blockInfo,
104
+ duration,
105
+ requestType: input.type,
106
+ missingTxs: [
107
+ ...request.requestTracker.missingTxHashes
108
+ ]
109
+ });
110
+ return request.requestTracker.collectedTxs;
99
111
  }
100
- /** Mark the given txs as found. Stops collecting them. */ foundTxs(txs) {
101
- this.slowCollection.foundTxs(txs);
102
- this.fastCollection.foundTxs(txs);
112
+ async collectFast(request, opts) {
113
+ this.requests.add(request);
114
+ const { blockInfo } = request;
115
+ this.log.debug(`Starting fast collection of ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
116
+ ...blockInfo,
117
+ requestType: request.type,
118
+ deadline: request.requestTracker.deadline
119
+ });
120
+ try {
121
+ // 1. Start node collection in the background.
122
+ // Note: this will be a noop if no nodes are configured.
123
+ const nodeCollectionPromise = this.collectFastFromNodes(request);
124
+ // 2. Wait before starting reqresp, interruptible by cancellation or node exhaustion.
125
+ await Promise.race([
126
+ request.requestTracker.cancellationToken,
127
+ sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs),
128
+ nodeCollectionPromise
129
+ ]);
130
+ // 3. Start reqresp in the background (runs in parallel with node collection).
131
+ // Note: this will be a noop if all TXs were already found.
132
+ const reqRespPromise = this.collectFastViaReqResp(request, opts);
133
+ // 4. Wait before starting file store, interruptible by cancellation.
134
+ await Promise.race([
135
+ request.requestTracker.cancellationToken,
136
+ sleep(this.config.txCollectionFileStoreFastDelayMs),
137
+ reqRespPromise
138
+ ]);
139
+ // 5. Start file store collection in the background. Self-terminates on tracker cancel / all-found.
140
+ // Note: this will be a noop if all TXs were already found.
141
+ const fileStorePromise = this.fileStoreFastCollection.startCollecting(request.requestTracker, this.getAddContext(request));
142
+ // 6. Wait for all paths to settle.
143
+ // NOTE: The request will automatically be cancelled after `opt.deadline` is reached.
144
+ await Promise.allSettled([
145
+ reqRespPromise,
146
+ nodeCollectionPromise,
147
+ fileStorePromise
148
+ ]);
149
+ } catch (err) {
150
+ this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, {
151
+ ...blockInfo,
152
+ missingTxs: request.requestTracker.missingTxHashes.values().map((txHash)=>txHash.toString())
153
+ });
154
+ } finally{
155
+ request.requestTracker.cancel();
156
+ this.requests.delete(request);
157
+ }
103
158
  }
104
159
  /**
105
- * Stop collecting all txs for blocks less than or requal to the block number specified.
160
+ * Starts collecting txs from all configured nodes. We send `txCollectionFastMaxParallelRequestsPerNode` requests
161
+ * in parallel to each node. We keep track of the number of attempts made to collect each tx, so we can prioritize
162
+ * the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
163
+ * tx is requested more than once at the same time to the same node.
164
+ */ async collectFastFromNodes(request) {
165
+ if (this.nodes.length === 0) {
166
+ return;
167
+ }
168
+ // Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
169
+ const attemptsPerTx = [
170
+ ...request.requestTracker.missingTxHashes
171
+ ].map((txHash)=>({
172
+ txHash,
173
+ attempts: 0,
174
+ found: false
175
+ }));
176
+ // Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
177
+ await Promise.allSettled(this.nodes.map((node)=>this.collectFastFromNode(request, node, attemptsPerTx)));
178
+ }
179
+ async collectFastFromNode(request, node, attemptsPerTx) {
180
+ const notFinished = ()=>!request.requestTracker.checkCancelled();
181
+ const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
182
+ const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
183
+ const activeRequestsToThisNode = new Set(); // Track the txs being actively requested to this node
184
+ const processBatch = async ()=>{
185
+ while(notFinished()){
186
+ // Pull tx hashes from the attemptsPerTx array, which is sorted by attempts,
187
+ // so we prioritize txs that have been requested less often.
188
+ const batch = [];
189
+ let index = 0;
190
+ while(batch.length < maxBatchSize){
191
+ const txToRequest = attemptsPerTx[index++];
192
+ if (!txToRequest) {
193
+ break;
194
+ } else if (!request.requestTracker.isMissing(txToRequest.txHash)) {
195
+ // Mark as found if it was found somewhere else, we'll then remove it from the array.
196
+ // We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
197
+ txToRequest.found = true;
198
+ } else if (!activeRequestsToThisNode.has(txToRequest.txHash)) {
199
+ // If the tx is not already being requested to this node, add it to the current batch and increase attempts.
200
+ // Note that we increase the attempts *before* making the request, so the next `collectFastFromNode` that
201
+ // needs to grab txs to send, will pick txs that have been requested less often, instead of all requesting
202
+ // the same txs at the same time.
203
+ batch.push(txToRequest);
204
+ activeRequestsToThisNode.add(txToRequest.txHash);
205
+ txToRequest.attempts++;
206
+ }
207
+ }
208
+ // After modifying the array by removing txs or updating attempts, re-sort it and trim the found txs from the end.
209
+ attemptsPerTx.sort((a, b)=>a.found === b.found ? a.attempts - b.attempts : Number(a.found) - Number(b.found));
210
+ const firstFoundTxIndex = attemptsPerTx.findIndex((tx)=>tx.found);
211
+ if (firstFoundTxIndex !== -1) {
212
+ attemptsPerTx.length = firstFoundTxIndex;
213
+ }
214
+ // If we see no more txs to request, we can stop this "process" loop
215
+ if (batch.length === 0) {
216
+ return;
217
+ }
218
+ const txHashes = batch.map(({ txHash })=>txHash);
219
+ // Collect this batch from the node
220
+ await this.txCollectionSink.collect(async ()=>{
221
+ const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
222
+ for (const tx of result.validTxs){
223
+ request.requestTracker.markFetched(tx);
224
+ }
225
+ return result;
226
+ }, txHashes, {
227
+ description: `fast ${node.getInfo()}`,
228
+ node: node.getInfo(),
229
+ method: 'fast-node-rpc',
230
+ ...request.blockInfo
231
+ }, this.getAddContext(request));
232
+ // Clear from the active requests the txs we just requested
233
+ for (const requestedTx of batch){
234
+ activeRequestsToThisNode.delete(requestedTx.txHash);
235
+ }
236
+ // Sleep a bit until hitting the node again, but wake up immediately on cancellation
237
+ if (notFinished()) {
238
+ await Promise.race([
239
+ sleep(this.config.txCollectionFastNodeIntervalMs),
240
+ request.requestTracker.cancellationToken
241
+ ]);
242
+ }
243
+ }
244
+ };
245
+ // Kick off N parallel requests to the node, up to the maxParallelRequests limit
246
+ await Promise.all(times(maxParallelRequests, processBatch));
247
+ }
248
+ async collectFastViaReqResp(request, opts) {
249
+ const pinnedPeer = opts.pinnedPeer;
250
+ const blockInfo = request.blockInfo;
251
+ const slotNumber = blockInfo.slotNumber;
252
+ if (request.requestTracker.timeoutMs < 100) {
253
+ this.log.warn(`Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`, {
254
+ timeoutMs: request.requestTracker.timeoutMs,
255
+ ...blockInfo
256
+ });
257
+ return;
258
+ }
259
+ if (request.requestTracker.checkCancelled()) {
260
+ this.log.debug(`No txs to collect via reqresp for ${request.type} at slot ${blockInfo.slotNumber}`, {
261
+ ...blockInfo
262
+ });
263
+ return;
264
+ }
265
+ this.log.debug(`Starting fast reqresp for ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
266
+ ...blockInfo,
267
+ timeoutMs: request.requestTracker.timeoutMs,
268
+ pinnedPeer
269
+ });
270
+ try {
271
+ await this.txCollectionSink.collect(async ()=>{
272
+ let blockTxsSource;
273
+ if (request.type === 'proposal') {
274
+ blockTxsSource = request.blockProposal;
275
+ } else if (request.type === 'block') {
276
+ blockTxsSource = {
277
+ txHashes: request.block.body.txEffects.map((e)=>e.txHash),
278
+ archive: request.block.archive.root
279
+ };
280
+ } else {
281
+ throw new Error(`Unknown request type: ${request.type}`);
282
+ }
283
+ const result = await this.reqRespTxsCollector(request.requestTracker, blockTxsSource, pinnedPeer);
284
+ return {
285
+ validTxs: result,
286
+ invalidTxHashes: []
287
+ };
288
+ }, Array.from(request.requestTracker.missingTxHashes), {
289
+ description: `reqresp for slot ${slotNumber}`,
290
+ method: 'fast-req-resp',
291
+ ...opts,
292
+ ...request.blockInfo
293
+ }, this.getAddContext(request));
294
+ } catch (err) {
295
+ this.log.error(`Error sending fast reqresp request for txs`, err, {
296
+ txs: [
297
+ ...request.requestTracker.missingTxHashes
298
+ ],
299
+ ...blockInfo
300
+ });
301
+ }
302
+ }
303
+ /** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */ getAddContext(request) {
304
+ if (request.type === 'proposal') {
305
+ return {
306
+ type: 'proposal',
307
+ blockHeader: request.blockProposal.blockHeader
308
+ };
309
+ } else {
310
+ return {
311
+ type: 'mined',
312
+ block: request.block
313
+ };
314
+ }
315
+ }
316
+ /** Mark the given txs as found. Stops collecting them across all in-flight requests. */ foundTxs(txs) {
317
+ for (const request of this.requests){
318
+ for (const tx of txs){
319
+ if (request.requestTracker.markFetched(tx)) {
320
+ this.log.trace(`Found tx ${tx.txHash.toString()} for fast collection request`, {
321
+ ...request.blockInfo,
322
+ txHash: tx.txHash.toString(),
323
+ type: request.type
324
+ });
325
+ if (request.requestTracker.allFetched()) {
326
+ this.log.trace(`All txs found for fast collection request`, {
327
+ ...request.blockInfo,
328
+ type: request.type
329
+ });
330
+ break;
331
+ }
332
+ }
333
+ }
334
+ }
335
+ }
336
+ /**
337
+ * Stop collecting all txs for blocks less than or equal to the block number specified.
106
338
  * To be called when we no longer care about gathering txs up to a certain block, eg when they become proven or finalized.
107
339
  */ stopCollectingForBlocksUpTo(blockNumber) {
108
- this.slowCollection.stopCollectingForBlocksUpTo(blockNumber);
109
- this.fastCollection.stopCollectingForBlocksUpTo(blockNumber);
340
+ for (const request of this.requests){
341
+ if (request.blockInfo.blockNumber <= blockNumber) {
342
+ request.requestTracker.cancel();
343
+ }
344
+ }
110
345
  }
111
346
  /**
112
347
  * Stop collecting all txs for blocks greater than the block number specified.
113
348
  * To be called when there is a chain prune and previously mined txs are no longer relevant.
114
349
  */ stopCollectingForBlocksAfter(blockNumber) {
115
- this.slowCollection.stopCollectingForBlocksAfter(blockNumber);
116
- this.fastCollection.stopCollectingForBlocksAfter(blockNumber);
117
- }
118
- /** Every now and then, check if the pool has received one of the txs we are looking for, just to catch any race conditions */ async reconcileFoundTxsWithPool() {
119
- const missingTxHashes = this.slowCollection.getMissingTxHashes();
120
- const foundTxs = compactArray(await this.txPool.getTxsByHash(missingTxHashes));
121
- if (foundTxs.length > 0) {
122
- this.log.verbose(`Found ${foundTxs.length} txs in the pool during reconciliation`, {
123
- foundTxs: foundTxs.map((t)=>t.getTxHash().toString())
124
- });
125
- this.foundTxs(foundTxs);
350
+ for (const request of this.requests){
351
+ if (request.blockInfo.blockNumber > blockNumber) {
352
+ request.requestTracker.cancel();
353
+ }
126
354
  }
127
355
  }
128
356
  }
@@ -1,25 +1,35 @@
1
1
  import type { Logger } from '@aztec/foundation/log';
2
2
  import type { TypedEventEmitter } from '@aztec/foundation/types';
3
- import { Tx, type TxHash } from '@aztec/stdlib/tx';
3
+ import type { L2Block } from '@aztec/stdlib/block';
4
+ import type { BlockHeader, Tx } from '@aztec/stdlib/tx';
4
5
  import type { TelemetryClient } from '@aztec/telemetry-client';
5
- import type { TxPool, TxPoolEvents } from '../../mem_pools/tx_pool/tx_pool.js';
6
+ import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/index.js';
6
7
  import type { CollectionMethod } from './tx_collection.js';
7
- declare const TxCollectionSink_base: new () => TypedEventEmitter<TxPoolEvents>;
8
+ import type { TxSourceCollectionResult } from './tx_source.js';
9
+ /** Context determining how collected txs should be added to the pool. */
10
+ export type TxAddContext = {
11
+ type: 'proposal';
12
+ blockHeader: BlockHeader;
13
+ } | {
14
+ type: 'mined';
15
+ block: L2Block;
16
+ };
17
+ declare const TxCollectionSink_base: new () => TypedEventEmitter<TxPoolV2Events>;
8
18
  /**
9
- * Executes collection requests from the fast and slow collection loops, and handles collected txs
19
+ * Executes collection requests from fast collection paths, and handles collected txs
10
20
  * by adding them to the tx pool and emitting events, as well as handling logging and metrics.
11
21
  */
12
22
  export declare class TxCollectionSink extends TxCollectionSink_base {
13
23
  private readonly txPool;
14
24
  private readonly log;
15
25
  private readonly instrumentation;
16
- constructor(txPool: TxPool, telemetryClient: TelemetryClient, log: Logger);
17
- collect(collectValidTxsFn: (txHashes: TxHash[]) => Promise<(Tx | undefined)[]>, requested: TxHash[], info: Record<string, any> & {
26
+ constructor(txPool: TxPoolV2, telemetryClient: TelemetryClient, log: Logger);
27
+ collect(collectValidTxsFn: () => Promise<TxSourceCollectionResult>, requested: string[], info: Record<string, any> & {
18
28
  description: string;
19
29
  method: CollectionMethod;
20
- }): Promise<{
30
+ }, context: TxAddContext): Promise<{
21
31
  txs: Tx[];
22
- requested: TxHash[];
32
+ requested: string[];
23
33
  duration: number;
24
34
  } | {
25
35
  txs: Tx[];
@@ -27,4 +37,4 @@ export declare class TxCollectionSink extends TxCollectionSink_base {
27
37
  private foundTxs;
28
38
  }
29
39
  export {};
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfY29sbGVjdGlvbl9zaW5rLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9jb2xsZWN0aW9uX3NpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJL0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRS9FLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBRTNEOzs7R0FHRztBQUNILHFCQUFhLGdCQUFpQixTQUFRLHFCQUEyRDtJQUk3RixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFFdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBTHRCLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUE4QjtJQUU5RCxZQUNtQixNQUFNLEVBQUUsTUFBTSxFQUMvQixlQUFlLEVBQUUsZUFBZSxFQUNmLEdBQUcsRUFBRSxNQUFNLEVBSTdCO0lBRVksT0FBTyxDQUNsQixpQkFBaUIsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUN0RSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQTtLQUFFOzs7Ozs7T0F1RTlFO1lBRWEsUUFBUTtDQXdCdkIifQ==
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfY29sbGVjdGlvbl9zaW5rLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9jb2xsZWN0aW9uX3NpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJL0QsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCx5RUFBeUU7QUFDekUsTUFBTSxNQUFNLFlBQVksR0FBRztJQUFFLElBQUksRUFBRSxVQUFVLENBQUM7SUFBQyxXQUFXLEVBQUUsV0FBVyxDQUFBO0NBQUUsR0FBRztJQUFFLElBQUksRUFBRSxPQUFPLENBQUM7SUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFBO0NBQUUsQ0FBQzs7QUFFOUc7OztHQUdHO0FBQ0gscUJBQWEsZ0JBQWlCLFNBQVEscUJBQTZEO0lBSS9GLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUV2QixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUc7SUFMdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQThCO0lBRTlELFlBQ21CLE1BQU0sRUFBRSxRQUFRLEVBQ2pDLGVBQWUsRUFBRSxlQUFlLEVBQ2YsR0FBRyxFQUFFLE1BQU0sRUFJN0I7SUFFWSxPQUFPLENBQ2xCLGlCQUFpQixFQUFFLE1BQU0sT0FBTyxDQUFDLHdCQUF3QixDQUFDLEVBQzFELFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO1FBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFBO0tBQUUsRUFDN0UsT0FBTyxFQUFFLFlBQVk7Ozs7OztPQXdEdEI7WUFFYSxRQUFRO0NBNkJ2QiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"tx_collection_sink.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_collection_sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAE/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;;AAE3D;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBAA2D;IAI7F,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAE9D,YACmB,MAAM,EAAE,MAAM,EAC/B,eAAe,EAAE,eAAe,EACf,GAAG,EAAE,MAAM,EAI7B;IAEY,OAAO,CAClB,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,EACtE,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE;;;;;;OAuE9E;YAEa,QAAQ;CAwBvB"}
1
+ {"version":3,"file":"tx_collection_sink.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_collection_sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;;AAE9G;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBAA6D;IAI/F,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAE9D,YACmB,MAAM,EAAE,QAAQ,EACjC,eAAe,EAAE,eAAe,EACf,GAAG,EAAE,MAAM,EAI7B;IAEY,OAAO,CAClB,iBAAiB,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,EAC1D,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,EAC7E,OAAO,EAAE,YAAY;;;;;;OAwDtB;YAEa,QAAQ;CA6BvB"}
@@ -2,7 +2,7 @@ import { elapsed } from '@aztec/foundation/timer';
2
2
  import EventEmitter from 'node:events';
3
3
  import { TxCollectionInstrumentation } from './instrumentation.js';
4
4
  /**
5
- * Executes collection requests from the fast and slow collection loops, and handles collected txs
5
+ * Executes collection requests from fast collection paths, and handles collected txs
6
6
  * by adding them to the tx pool and emitting events, as well as handling logging and metrics.
7
7
  */ export class TxCollectionSink extends EventEmitter {
8
8
  txPool;
@@ -12,46 +12,37 @@ import { TxCollectionInstrumentation } from './instrumentation.js';
12
12
  super(), this.txPool = txPool, this.log = log;
13
13
  this.instrumentation = new TxCollectionInstrumentation(telemetryClient, 'TxCollection');
14
14
  }
15
- async collect(collectValidTxsFn, requested, info) {
15
+ async collect(collectValidTxsFn, requested, info, context) {
16
16
  this.log.trace(`Requesting ${requested.length} txs via ${info.description}`, {
17
17
  ...info,
18
- requestedTxs: requested.map((t)=>t.toString())
18
+ requestedTxs: requested
19
19
  });
20
20
  // Execute collection function and measure the time taken, catching any errors.
21
- const [duration, txs] = await elapsed(async ()=>{
21
+ const [duration, { validTxs, invalidTxHashes }] = await elapsed(async ()=>{
22
22
  try {
23
- const response = await collectValidTxsFn(requested);
24
- return response.filter((tx)=>tx !== undefined);
23
+ return await collectValidTxsFn();
25
24
  } catch (err) {
26
25
  this.log.error(`Error collecting txs via ${info.description}`, err, {
27
26
  ...info,
28
- requestedTxs: requested.map((hash)=>hash.toString())
27
+ requestedTxs: requested
29
28
  });
30
- return [];
29
+ return {
30
+ validTxs: [],
31
+ invalidTxHashes: []
32
+ };
31
33
  }
32
34
  });
33
- if (txs.length === 0) {
35
+ if (validTxs.length === 0 && invalidTxHashes.length === 0) {
34
36
  this.log.trace(`No txs found via ${info.description}`, {
35
37
  ...info,
36
- requestedTxs: requested.map((t)=>t.toString())
38
+ requestedTxs: requested
37
39
  });
38
40
  return {
39
- txs,
41
+ txs: validTxs,
40
42
  requested,
41
43
  duration
42
44
  };
43
45
  }
44
- // Validate tx hashes for all collected txs from external sources
45
- const validTxs = [];
46
- const invalidTxHashes = [];
47
- await Promise.all(txs.map(async (tx)=>{
48
- const isValid = await tx.validateTxHash();
49
- if (isValid) {
50
- validTxs.push(tx);
51
- } else {
52
- invalidTxHashes.push(tx.getTxHash().toString());
53
- }
54
- }));
55
46
  if (invalidTxHashes.length > 0) {
56
47
  this.log.warn(`Rejecting ${invalidTxHashes.length} txs with invalid hashes from ${info.description}`, {
57
48
  ...info,
@@ -61,7 +52,7 @@ import { TxCollectionInstrumentation } from './instrumentation.js';
61
52
  if (validTxs.length === 0) {
62
53
  this.log.trace(`No valid txs found via ${info.description} after validation`, {
63
54
  ...info,
64
- requestedTxs: requested.map((t)=>t.toString()),
55
+ requestedTxs: requested,
65
56
  invalidTxHashes
66
57
  });
67
58
  return {
@@ -74,26 +65,32 @@ import { TxCollectionInstrumentation } from './instrumentation.js';
74
65
  ...info,
75
66
  duration,
76
67
  txs: validTxs.map((t)=>t.getTxHash().toString()),
77
- requestedTxs: requested.map((t)=>t.toString()),
68
+ requestedTxs: requested,
78
69
  rejectedCount: invalidTxHashes.length
79
70
  });
80
71
  return await this.foundTxs(validTxs, {
81
72
  ...info,
82
73
  duration
83
- });
74
+ }, context);
84
75
  }
85
- async foundTxs(txs, info) {
76
+ async foundTxs(txs, info, context) {
86
77
  // Report metrics for the collection
87
78
  this.instrumentation.increaseTxsFor(info.method, txs.length, info.duration);
88
- // Mark txs as found in the slow missing txs set and all fast requests
79
+ // Mark txs as found in all in-flight collection requests
89
80
  this.emit('txs-added', {
90
81
  txs
91
82
  });
92
- // Add the txs to the tx pool (should not fail, but we catch it just in case)
83
+ // Add the txs to the tx pool using the appropriate method based on context
93
84
  try {
94
- await this.txPool.addTxs(txs, {
95
- source: `tx-collection`
96
- });
85
+ if (context.type === 'mined') {
86
+ await this.txPool.addMinedTxs(txs, context.block.header, {
87
+ source: 'tx-collection'
88
+ });
89
+ } else {
90
+ await this.txPool.addProtectedTxs(txs, context.blockHeader, {
91
+ source: 'tx-collection'
92
+ });
93
+ }
97
94
  } catch (err) {
98
95
  this.log.error(`Error adding txs to the pool via ${info.description}`, err, {
99
96
  ...info,
@@ -1,18 +1,24 @@
1
1
  import type { ChainConfig } from '@aztec/stdlib/config';
2
2
  import { type AztecNode } from '@aztec/stdlib/interfaces/client';
3
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
3
+ import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
4
4
  import { type ComponentsVersions } from '@aztec/stdlib/versioning';
5
+ export type TxSourceCollectionResult = {
6
+ validTxs: Tx[];
7
+ invalidTxHashes: string[];
8
+ };
5
9
  export interface TxSource {
6
10
  getInfo(): string;
7
- getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
11
+ getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
8
12
  }
9
13
  export declare class NodeRpcTxSource implements TxSource {
10
14
  private readonly client;
15
+ private readonly txValidator;
11
16
  private readonly info;
12
- constructor(client: Pick<AztecNode, 'getTxsByHash'>, info: string);
13
- static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource;
17
+ constructor(client: Pick<AztecNode, 'getTxsByHash'>, txValidator: TxValidator, info: string);
18
+ static fromUrl(nodeUrl: string, txValidator: TxValidator, versions: ComponentsVersions): NodeRpcTxSource;
14
19
  getInfo(): string;
15
- getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
20
+ getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
21
+ private verifyTxs;
16
22
  }
17
- export declare function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig): NodeRpcTxSource[];
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxrQkFBa0IsRUFBbUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRyxNQUFNLFdBQVcsUUFBUTtJQUN2QixPQUFPLElBQUksTUFBTSxDQUFDO0lBQ2xCLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUMvRDtBQUVELHFCQUFhLGVBQWdCLFlBQVcsUUFBUTtJQUU1QyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBRnZCLFlBQ21CLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUN2QyxJQUFJLEVBQUUsTUFBTSxFQUMzQjtJQUVKLE9BQWMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixHQUFHLGVBQWUsQ0FHcEY7SUFFTSxPQUFPLFdBRWI7SUFFTSxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBRW5FO0NBQ0Y7QUFFRCx3QkFBZ0Isc0JBQXNCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLHFCQUc5RSJ9
23
+ export declare function createNodeRpcTxSources(urls: string[], txValidator: TxValidator, chainConfig: ChainConfig): NodeRpcTxSource[];
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQW1DLE1BQU0sMEJBQTBCLENBQUM7QUFHcEcsTUFBTSxNQUFNLHdCQUF3QixHQUFHO0lBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFBO0NBQUUsQ0FBQztBQUVyRixNQUFNLFdBQVcsUUFBUTtJQUN2QixPQUFPLElBQUksTUFBTSxDQUFDO0lBQ2xCLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7Q0FDckU7QUFFRCxxQkFBYSxlQUFnQixZQUFXLFFBQVE7SUFFNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVztJQUM1QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFIdkIsWUFDbUIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQ3ZDLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLElBQUksRUFBRSxNQUFNLEVBQzNCO0lBRUosT0FBYyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsR0FBRyxlQUFlLENBRzlHO0lBRU0sT0FBTyxXQUViO0lBRVksWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FHL0U7WUFFYSxTQUFTO0NBZ0J4QjtBQUVELHdCQUFnQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxxQkFHeEcifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CAC/D;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,IAAI,EAAE,MAAM,EAC3B;IAEJ,OAAc,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAGpF;IAEM,OAAO,WAEb;IAEM,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAEnE;CACF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,qBAG9E"}
1
+ {"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,wBAAwB,GAAG;IAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACrE;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHvB,YACmB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,MAAM,EAC3B;IAEJ,OAAc,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CAG9G;IAEM,OAAO,WAEb;IAEY,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAG/E;YAEa,SAAS;CAgBxB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,qBAGxG"}