@aztec/end-to-end 0.0.1-commit.96dac018d → 0.0.1-commit.9a89641

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 (328) hide show
  1. package/README.md +229 -14
  2. package/dest/automine/automine_test_context.d.ts +85 -0
  3. package/dest/automine/automine_test_context.d.ts.map +1 -0
  4. package/dest/automine/automine_test_context.js +98 -0
  5. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
  6. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  7. package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
  8. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
  9. package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
  10. package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
  11. package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
  12. package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
  13. package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
  14. package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
  15. package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
  16. package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
  17. package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +37 -50
  18. package/dest/automine/token/token_contract_test.d.ts +40 -0
  19. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  20. package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +35 -50
  21. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  22. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  23. package/dest/automine/token/token_test_helpers.js +97 -0
  24. package/dest/bench/client_flows/benchmark.d.ts +15 -1
  25. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  26. package/dest/bench/client_flows/benchmark.js +19 -0
  27. package/dest/bench/client_flows/client_flows_benchmark.d.ts +6 -6
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +65 -59
  30. package/dest/bench/client_flows/data_extractor.js +1 -0
  31. package/dest/bench/utils.d.ts +3 -3
  32. package/dest/bench/utils.d.ts.map +1 -1
  33. package/dest/bench/utils.js +102 -8
  34. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  35. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  36. package/dest/composed/ha/ha_full_setup.js +383 -0
  37. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  38. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  39. package/dest/fixtures/authwit_proxy.d.ts +3 -3
  40. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  41. package/dest/fixtures/authwit_proxy.js +4 -0
  42. package/dest/fixtures/e2e_prover_test.d.ts +15 -11
  43. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  44. package/dest/fixtures/e2e_prover_test.js +60 -44
  45. package/dest/fixtures/fixtures.d.ts +79 -1
  46. package/dest/fixtures/fixtures.d.ts.map +1 -1
  47. package/dest/fixtures/fixtures.js +80 -0
  48. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  49. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  50. package/dest/fixtures/get_acvm_config.js +2 -2
  51. package/dest/fixtures/get_bb_config.d.ts +1 -1
  52. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  53. package/dest/fixtures/get_bb_config.js +6 -6
  54. package/dest/fixtures/ha_setup.d.ts +4 -4
  55. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  56. package/dest/fixtures/ha_setup.js +5 -2
  57. package/dest/fixtures/index.d.ts +2 -1
  58. package/dest/fixtures/index.d.ts.map +1 -1
  59. package/dest/fixtures/index.js +1 -0
  60. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  61. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  62. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  63. package/dest/fixtures/setup.d.ts +88 -45
  64. package/dest/fixtures/setup.d.ts.map +1 -1
  65. package/dest/fixtures/setup.js +297 -202
  66. package/dest/fixtures/setup_p2p_test.d.ts +10 -6
  67. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  68. package/dest/fixtures/setup_p2p_test.js +11 -11
  69. package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
  70. package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
  71. package/dest/fixtures/standard_contracts_genesis.js +25 -0
  72. package/dest/fixtures/timing.d.ts +42 -0
  73. package/dest/fixtures/timing.d.ts.map +1 -0
  74. package/dest/fixtures/timing.js +72 -0
  75. package/dest/fixtures/token_utils.d.ts +22 -4
  76. package/dest/fixtures/token_utils.d.ts.map +1 -1
  77. package/dest/fixtures/token_utils.js +23 -6
  78. package/dest/fixtures/utils.d.ts +2 -2
  79. package/dest/fixtures/utils.d.ts.map +1 -1
  80. package/dest/fixtures/utils.js +1 -1
  81. package/dest/fixtures/wait_helpers.d.ts +135 -0
  82. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  83. package/dest/fixtures/wait_helpers.js +154 -0
  84. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  85. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  86. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  87. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  88. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  89. package/dest/forward-compatibility/wallet_service.js +109 -0
  90. package/dest/install_legacy_contracts.d.cts +10 -0
  91. package/dest/install_legacy_contracts.d.cts.map +1 -0
  92. package/dest/legacy-jest-resolver.d.cts +3 -0
  93. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  94. package/dest/multi-node/block-production/setup.d.ts +97 -0
  95. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  96. package/dest/multi-node/block-production/setup.js +158 -0
  97. package/dest/multi-node/governance/setup.d.ts +67 -0
  98. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  99. package/dest/multi-node/governance/setup.js +126 -0
  100. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  101. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  102. package/dest/multi-node/multi_node_test_context.js +347 -0
  103. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  104. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  105. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  106. package/dest/multi-node/slashing/setup.d.ts +167 -0
  107. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  108. package/dest/multi-node/slashing/setup.js +275 -0
  109. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +21 -11
  110. package/dest/p2p/p2p_network.d.ts.map +1 -0
  111. package/dest/{e2e_p2p → p2p}/p2p_network.js +95 -48
  112. package/dest/p2p/reqresp/utils.d.ts +19 -0
  113. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  114. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +45 -29
  115. package/dest/p2p/shared.d.ts +72 -0
  116. package/dest/p2p/shared.d.ts.map +1 -0
  117. package/dest/p2p/shared.js +212 -0
  118. package/dest/shared/cross_chain_test_harness.d.ts +6 -4
  119. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  120. package/dest/shared/cross_chain_test_harness.js +44 -32
  121. package/dest/shared/gas_portal_test_harness.d.ts +9 -6
  122. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  123. package/dest/shared/gas_portal_test_harness.js +28 -17
  124. package/dest/shared/jest_setup.js +32 -1
  125. package/dest/shared/submit-transactions.d.ts +1 -1
  126. package/dest/shared/submit-transactions.d.ts.map +1 -1
  127. package/dest/shared/submit-transactions.js +12 -5
  128. package/dest/shared/timing_env.d.js +5 -0
  129. package/dest/shared/timing_env.js +365 -0
  130. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  131. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  132. package/dest/shared/uniswap_l1_l2.js +55 -45
  133. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  134. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  135. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  136. package/dest/simulators/lending_simulator.d.ts +10 -3
  137. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  138. package/dest/simulators/lending_simulator.js +27 -15
  139. package/dest/simulators/token_simulator.d.ts +1 -1
  140. package/dest/simulators/token_simulator.d.ts.map +1 -1
  141. package/dest/simulators/token_simulator.js +2 -2
  142. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  143. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  144. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  145. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  146. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  147. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  148. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  149. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  150. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  151. package/dest/single-node/fees/fees_test.d.ts +95 -0
  152. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  153. package/dest/single-node/fees/fees_test.js +344 -0
  154. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  155. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  156. package/dest/single-node/l1-reorgs/setup.js +57 -0
  157. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  158. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  159. package/dest/single-node/partial-proofs/setup.js +5 -0
  160. package/dest/single-node/proving/setup.d.ts +5 -0
  161. package/dest/single-node/proving/setup.d.ts.map +1 -0
  162. package/dest/single-node/proving/setup.js +5 -0
  163. package/dest/single-node/recovery/setup.d.ts +5 -0
  164. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  165. package/dest/single-node/recovery/setup.js +5 -0
  166. package/dest/single-node/setup.d.ts +49 -0
  167. package/dest/single-node/setup.d.ts.map +1 -0
  168. package/dest/single-node/setup.js +56 -0
  169. package/dest/single-node/single_node_test_context.d.ts +374 -0
  170. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  171. package/dest/single-node/single_node_test_context.js +847 -0
  172. package/dest/spartan/setup_test_wallets.d.ts +4 -2
  173. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  174. package/dest/spartan/setup_test_wallets.js +93 -46
  175. package/dest/spartan/tx_metrics.d.ts +27 -4
  176. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  177. package/dest/spartan/tx_metrics.js +106 -21
  178. package/dest/spartan/utils/config.d.ts +10 -30
  179. package/dest/spartan/utils/config.d.ts.map +1 -1
  180. package/dest/spartan/utils/config.js +3 -1
  181. package/dest/spartan/utils/index.d.ts +3 -1
  182. package/dest/spartan/utils/index.d.ts.map +1 -1
  183. package/dest/spartan/utils/index.js +4 -0
  184. package/dest/spartan/utils/nodes.js +3 -3
  185. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  186. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  187. package/dest/spartan/utils/pod_logs.js +74 -0
  188. package/dest/test-wallet/test_wallet.d.ts +47 -25
  189. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  190. package/dest/test-wallet/test_wallet.js +197 -91
  191. package/dest/test-wallet/utils.d.ts +38 -3
  192. package/dest/test-wallet/utils.d.ts.map +1 -1
  193. package/dest/test-wallet/utils.js +65 -10
  194. package/dest/test-wallet/wallet_worker_script.js +12 -4
  195. package/dest/test-wallet/worker_wallet.d.ts +9 -8
  196. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  197. package/dest/test-wallet/worker_wallet.js +10 -4
  198. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
  199. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  200. package/dest/test-wallet/worker_wallet_schema.js +15 -2
  201. package/package.json +50 -47
  202. package/src/automine/README.md +60 -0
  203. package/src/automine/automine_test_context.ts +153 -0
  204. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  205. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  206. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +42 -61
  207. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +41 -56
  208. package/src/automine/token/token_test_helpers.ts +138 -0
  209. package/src/bench/client_flows/benchmark.ts +21 -0
  210. package/src/bench/client_flows/client_flows_benchmark.ts +105 -70
  211. package/src/bench/client_flows/data_extractor.ts +1 -0
  212. package/src/bench/utils.ts +116 -7
  213. package/src/composed/ha/ha_full_setup.ts +466 -0
  214. package/src/fixtures/authwit_proxy.ts +4 -0
  215. package/src/fixtures/e2e_prover_test.ts +80 -64
  216. package/src/fixtures/fixtures.ts +100 -0
  217. package/src/fixtures/get_acvm_config.ts +2 -8
  218. package/src/fixtures/get_bb_config.ts +8 -8
  219. package/src/fixtures/ha_setup.ts +11 -5
  220. package/src/fixtures/index.ts +1 -0
  221. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  222. package/src/fixtures/setup.ts +379 -264
  223. package/src/fixtures/setup_p2p_test.ts +15 -11
  224. package/src/fixtures/standard_contracts_genesis.ts +28 -0
  225. package/src/fixtures/timing.ts +97 -0
  226. package/src/fixtures/token_utils.ts +40 -6
  227. package/src/fixtures/utils.ts +2 -3
  228. package/src/fixtures/wait_helpers.ts +333 -0
  229. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  230. package/src/forward-compatibility/wallet_service.ts +106 -0
  231. package/src/guides/up_quick_start.sh +5 -2
  232. package/src/infra/README.md +12 -0
  233. package/src/install_legacy_contracts.cjs +75 -0
  234. package/src/legacy-jest-resolver.cjs +112 -0
  235. package/src/multi-node/README.md +96 -0
  236. package/src/multi-node/block-production/setup.ts +272 -0
  237. package/src/multi-node/governance/setup.ts +172 -0
  238. package/src/multi-node/multi_node_test_context.ts +447 -0
  239. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  240. package/src/multi-node/slashing/setup.ts +433 -0
  241. package/src/p2p/README.md +78 -0
  242. package/src/{e2e_p2p → p2p}/p2p_network.ts +115 -66
  243. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +56 -28
  244. package/src/p2p/shared.ts +329 -0
  245. package/src/shared/cross_chain_test_harness.ts +44 -21
  246. package/src/shared/gas_portal_test_harness.ts +35 -18
  247. package/src/shared/jest_setup.ts +36 -1
  248. package/src/shared/submit-transactions.ts +13 -8
  249. package/src/shared/timing_env.d.mts +39 -0
  250. package/src/shared/timing_env.mjs +363 -0
  251. package/src/shared/uniswap_l1_l2.ts +98 -54
  252. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  253. package/src/simulators/lending_simulator.ts +33 -15
  254. package/src/simulators/token_simulator.ts +6 -2
  255. package/src/single-node/README.md +66 -0
  256. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  257. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  258. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  259. package/src/single-node/fees/fees_test.ts +434 -0
  260. package/src/single-node/l1-reorgs/setup.ts +93 -0
  261. package/src/single-node/partial-proofs/setup.ts +8 -0
  262. package/src/single-node/proving/setup.ts +15 -0
  263. package/src/single-node/recovery/setup.ts +8 -0
  264. package/src/single-node/setup.ts +63 -0
  265. package/src/single-node/single_node_test_context.ts +1058 -0
  266. package/src/spartan/setup_test_wallets.ts +117 -45
  267. package/src/spartan/tx_metrics.ts +108 -24
  268. package/src/spartan/utils/config.ts +2 -0
  269. package/src/spartan/utils/index.ts +6 -0
  270. package/src/spartan/utils/nodes.ts +3 -3
  271. package/src/spartan/utils/pod_logs.ts +99 -0
  272. package/src/test-wallet/test_wallet.ts +227 -107
  273. package/src/test-wallet/utils.ts +104 -11
  274. package/src/test-wallet/wallet_worker_script.ts +11 -5
  275. package/src/test-wallet/worker_wallet.ts +19 -16
  276. package/src/test-wallet/worker_wallet_schema.ts +4 -3
  277. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
  278. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  279. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  280. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  281. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  282. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  283. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  284. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  285. package/dest/e2e_epochs/epochs_test.d.ts +0 -102
  286. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  287. package/dest/e2e_epochs/epochs_test.js +0 -386
  288. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  289. package/dest/e2e_fees/fees_test.d.ts +0 -88
  290. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  291. package/dest/e2e_fees/fees_test.js +0 -248
  292. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  293. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  294. package/dest/e2e_l1_publisher/write_json.js +0 -56
  295. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  296. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  297. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  298. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  299. package/dest/e2e_nested_contract/nested_contract_test.js +0 -56
  300. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  301. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  302. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  303. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  304. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  305. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  306. package/dest/e2e_p2p/shared.d.ts +0 -46
  307. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  308. package/dest/e2e_p2p/shared.js +0 -181
  309. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  310. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  311. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  312. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  313. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  314. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  315. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  316. package/src/e2e_epochs/epochs_test.ts +0 -487
  317. package/src/e2e_fees/fees_test.ts +0 -324
  318. package/src/e2e_l1_publisher/write_json.ts +0 -77
  319. package/src/e2e_nested_contract/nested_contract_test.ts +0 -73
  320. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  321. package/src/e2e_p2p/shared.ts +0 -290
  322. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  323. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  324. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  325. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  326. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  327. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  328. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -1,10 +1,12 @@
1
+ import { NO_FROM } from '@aztec/aztec.js/account';
1
2
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
3
  import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
3
4
  import { type FeePaymentMethod, PrivateFeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
4
5
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
5
6
  import type { AztecNode } from '@aztec/aztec.js/node';
7
+ import { FeeJuiceContract } from '@aztec/aztec.js/protocol';
6
8
  import type { Wallet } from '@aztec/aztec.js/wallet';
7
- import { CheatCodes } from '@aztec/aztec/testing';
9
+ import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
8
10
  import { createExtendedL1Client } from '@aztec/ethereum/client';
9
11
  import { RollupContract } from '@aztec/ethereum/contracts';
10
12
  import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
@@ -12,23 +14,26 @@ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
12
14
  import { ChainMonitor } from '@aztec/ethereum/test';
13
15
  import { randomBytes } from '@aztec/foundation/crypto/random';
14
16
  import { Fr } from '@aztec/foundation/curves/bn254';
17
+ import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
15
18
  import { EthAddress } from '@aztec/foundation/eth-address';
16
19
  import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi';
17
20
  import { TestERC20Bytecode } from '@aztec/l1-artifacts/TestERC20Bytecode';
18
21
  import { AMMContract } from '@aztec/noir-contracts.js/AMM';
19
22
  import { FPCContract } from '@aztec/noir-contracts.js/FPC';
20
- import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
21
23
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
22
- import { TokenContract as BananaCoin, TokenContract } from '@aztec/noir-contracts.js/Token';
23
- import { ProtocolContractAddress } from '@aztec/protocol-contracts';
24
- import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
24
+ import { TestTokenContract as BananaCoin, TestTokenContract } from '@aztec/noir-test-contracts.js/TestToken';
25
25
  import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
26
26
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
27
- import { GasSettings } from '@aztec/stdlib/gas';
28
- import { deriveSigningKey } from '@aztec/stdlib/keys';
27
+ import { Gas, GasSettings } from '@aztec/stdlib/gas';
28
+ import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
29
29
 
30
- import { MNEMONIC } from '../../fixtures/fixtures.js';
31
- import { type EndToEndContext, type SetupOptions, deployAccounts, setup, teardown } from '../../fixtures/setup.js';
30
+ import {
31
+ AUTOMINE_E2E_OPTS,
32
+ L1_DIRECT_WRITE_ACCOUNT_INDEX,
33
+ MNEMONIC,
34
+ getPaddedMaxFeesPerGas,
35
+ } from '../../fixtures/fixtures.js';
36
+ import { type EndToEndContext, type SetupOptions, setup, teardown } from '../../fixtures/setup.js';
32
37
  import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
33
38
  import { setupSponsoredFPC } from '../../fixtures/utils.js';
34
39
  import { CrossChainTestHarness } from '../../shared/cross_chain_test_harness.js';
@@ -70,13 +75,13 @@ export class ClientFlowsBenchmark {
70
75
  public bananaFPC!: FPCContract;
71
76
  public bananaFPCInstance!: ContractInstanceWithAddress;
72
77
  // Random asset we want to trade
73
- public candyBarCoin!: TokenContract;
78
+ public candyBarCoin!: TestTokenContract;
74
79
  public candyBarCoinInstance!: ContractInstanceWithAddress;
75
80
  // AMM contract
76
81
  public amm!: AMMContract;
77
82
  public ammInstance!: ContractInstanceWithAddress;
78
83
  // Liquidity token for AMM
79
- public liquidityToken!: TokenContract;
84
+ public liquidityToken!: TestTokenContract;
80
85
  public liquidityTokenInstance!: ContractInstanceWithAddress;
81
86
  // Sponsored FPC contract
82
87
  public sponsoredFPC!: SponsoredFPCContract;
@@ -87,33 +92,35 @@ export class ClientFlowsBenchmark {
87
92
 
88
93
  public realProofs = ['true', '1'].includes(process.env.REAL_PROOFS ?? '');
89
94
 
90
- public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; circuits: number }> =
91
- {
92
- // eslint-disable-next-line camelcase
93
- bridged_fee_juice: {
94
- forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
95
- circuits: 2, // FeeJuice claim + kernel inner
96
- },
97
- // eslint-disable-next-line camelcase
98
- private_fpc: {
99
- forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
100
- circuits:
101
- 2 + // FPC entrypoint + kernel inner
102
- 2 + // BananaCoin transfer_to_public + kernel inner
103
- 2 + // Account verify_private_authwit + kernel inner
104
- 2, // BananaCoin prepare_private_balance_increase + kernel inner
105
- },
106
- // eslint-disable-next-line camelcase
107
- sponsored_fpc: {
108
- forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
109
- circuits: 2, // Sponsored FPC sponsor_unconditionally + kernel inner
110
- },
111
- // eslint-disable-next-line camelcase
112
- fee_juice: {
113
- forWallet: () => Promise.resolve(undefined),
114
- circuits: 0,
115
- },
116
- };
95
+ // `apps` is the number of private function calls contributed by this payment method.
96
+ // Each app produces one execution step at proving time; the orchestrator additionally produces
97
+ // one kernel step per batch of N apps (see `expectedExecutionSteps` in `benchmark.ts`).
98
+ public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; apps: number }> = {
99
+ // eslint-disable-next-line camelcase
100
+ bridged_fee_juice: {
101
+ forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
102
+ apps: 1, // FeeJuice claim
103
+ },
104
+ // eslint-disable-next-line camelcase
105
+ private_fpc: {
106
+ forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
107
+ apps:
108
+ 1 + // FPC entrypoint
109
+ 1 + // BananaCoin transfer_to_public
110
+ 1 + // Account verify_private_authwit
111
+ 1, // BananaCoin prepare_private_balance_increase
112
+ },
113
+ // eslint-disable-next-line camelcase
114
+ sponsored_fpc: {
115
+ forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
116
+ apps: 1, // Sponsored FPC sponsor_unconditionally
117
+ },
118
+ // eslint-disable-next-line camelcase
119
+ fee_juice: {
120
+ forWallet: () => Promise.resolve(undefined),
121
+ apps: 0,
122
+ },
123
+ };
117
124
 
118
125
  public config: ClientFlowsConfig;
119
126
 
@@ -122,7 +129,7 @@ export class ClientFlowsBenchmark {
122
129
 
123
130
  constructor(testName?: string, setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {}) {
124
131
  this.logger = createLogger(`bench:client_flows${testName ? `:${testName}` : ''}`);
125
- this.setupOptions = { startProverNode: true, ...setupOptions };
132
+ this.setupOptions = { ...AUTOMINE_E2E_OPTS, startProverNode: true, ...setupOptions };
126
133
  this.config = BENCHMARK_CONFIG === 'key_flows' ? KEY_FLOWS_CONFIG : FULL_FLOWS_CONFIG;
127
134
  ProxyLogger.create();
128
135
  this.proxyLogger = ProxyLogger.getInstance();
@@ -130,11 +137,14 @@ export class ClientFlowsBenchmark {
130
137
 
131
138
  async setup() {
132
139
  this.logger.info('Setting up subsystems from fresh');
133
- this.context = await setup(0, {
140
+ // Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
141
+ // BananaCoin is the codegen'd TestToken here, so the allowlist must key on its class, not canonical Token's.
142
+ const tokenAllowList = await getTokenAllowedSetupFunctions(BananaCoin.artifact);
143
+ this.context = await setup(2, {
134
144
  ...this.setupOptions,
135
145
  fundSponsoredFPC: true,
136
- skipAccountDeployment: true,
137
146
  l1ContractsArgs: this.setupOptions,
147
+ txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
138
148
  });
139
149
  await this.applyBaseSetup();
140
150
 
@@ -148,6 +158,7 @@ export class ClientFlowsBenchmark {
148
158
 
149
159
  async teardown() {
150
160
  await this.chainMonitor.stop();
161
+ await this.userWallet?.stop();
151
162
  await teardown(this.context);
152
163
  }
153
164
 
@@ -161,11 +172,15 @@ export class ClientFlowsBenchmark {
161
172
 
162
173
  /** Admin mints bananaCoin tokens privately to the target address and redeems them. */
163
174
  async mintPrivateBananas(amount: bigint, address: AztecAddress) {
164
- const balanceBefore = await this.bananaCoin.methods.balance_of_private(address).simulate({ from: address });
175
+ const { result: balanceBefore } = await this.bananaCoin.methods
176
+ .balance_of_private(address)
177
+ .simulate({ from: address });
165
178
 
166
179
  await mintTokensToPrivate(this.bananaCoin, this.adminAddress, address, amount);
167
180
 
168
- const balanceAfter = await this.bananaCoin.methods.balance_of_private(address).simulate({ from: address });
181
+ const { result: balanceAfter } = await this.bananaCoin.methods
182
+ .balance_of_private(address)
183
+ .simulate({ from: address });
169
184
  expect(balanceAfter).toEqual(balanceBefore + amount);
170
185
  }
171
186
 
@@ -175,7 +190,7 @@ export class ClientFlowsBenchmark {
175
190
 
176
191
  let benchysPrivateSigningKey;
177
192
  if (type === 'schnorr') {
178
- benchysPrivateSigningKey = deriveSigningKey(benchysSecret);
193
+ benchysPrivateSigningKey = GrumpkinScalar.random();
179
194
  return wallet.createSchnorrAccount(benchysSecret, salt, benchysPrivateSigningKey);
180
195
  } else if (type === 'ecdsar1') {
181
196
  benchysPrivateSigningKey = randomBytes(32);
@@ -192,15 +207,7 @@ export class ClientFlowsBenchmark {
192
207
 
193
208
  async applyInitialAccounts() {
194
209
  this.logger.info('Applying initial accounts setup');
195
- const { deployedAccounts } = await deployAccounts(
196
- 2,
197
- this.logger,
198
- )({
199
- wallet: this.context.wallet,
200
- initialFundedAccounts: this.context.initialFundedAccounts,
201
- });
202
-
203
- const [{ address: adminAddress }, { address: sequencerAddress }] = deployedAccounts;
210
+ const [adminAddress, sequencerAddress] = this.context.accounts;
204
211
 
205
212
  this.adminWallet = this.context.wallet;
206
213
  this.aztecNode = this.context.aztecNodeService;
@@ -209,8 +216,7 @@ export class ClientFlowsBenchmark {
209
216
  this.adminAddress = adminAddress;
210
217
  this.sequencerAddress = sequencerAddress;
211
218
 
212
- const canonicalFeeJuice = await getCanonicalFeeJuice();
213
- this.feeJuiceContract = FeeJuiceContract.at(canonicalFeeJuice.address, this.adminWallet);
219
+ this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
214
220
  this.coinbase = EthAddress.random();
215
221
 
216
222
  const userPXEConfig = getPXEConfig();
@@ -223,17 +229,38 @@ export class ClientFlowsBenchmark {
223
229
  loggers: {
224
230
  prover: this.proxyLogger.createLogger('pxe:bb:wasm:bundle:proxied'),
225
231
  },
232
+ // The benchmark measures steady-state app cost, not first-send discovery cost. Reproduce the pre-handshake-default
233
+ // behavior of unconstrained delivery: derive the tagging secret from the (sender, recipient) key pair via ECDH
234
+ // instead of taking the current default (a non-interactive handshake, which injects two extra private app
235
+ // executions and a nullifier per cold chain). Constrained delivery is unaffected: the Noir circuit rejects
236
+ // address-derived for constrained, so the hook falls through to a handshake there.
237
+ hooks: {
238
+ resolveTaggingSecretStrategy: ({ deliveryMode }) =>
239
+ Promise.resolve(
240
+ deliveryMode === AppTaggingSecretKind.UNCONSTRAINED
241
+ ? { type: 'address-derived' }
242
+ : { type: 'non-interactive-handshake' },
243
+ ),
244
+ },
226
245
  });
227
246
  }
228
247
 
229
248
  async applySetupFeeJuice() {
230
249
  this.logger.info('Applying fee juice setup');
231
- this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.adminWallet);
250
+ this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
232
251
 
233
252
  this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
234
253
  aztecNode: this.context.aztecNodeService,
235
254
  aztecNodeAdmin: this.context.aztecNodeService,
236
- l1Client: this.context.deployL1ContractsValues.l1Client,
255
+ // Bridge from a dedicated L1 account so its direct writes don't race the sequencer publisher's
256
+ // txs on the deployer account (see L1_DIRECT_WRITE_ACCOUNT_INDEX).
257
+ l1Client: createExtendedL1Client(
258
+ this.context.config.l1RpcUrls,
259
+ MNEMONIC,
260
+ undefined,
261
+ undefined,
262
+ L1_DIRECT_WRITE_ACCOUNT_INDEX,
263
+ ),
237
264
  wallet: this.adminWallet,
238
265
  logger: this.logger,
239
266
  });
@@ -247,7 +274,9 @@ export class ClientFlowsBenchmark {
247
274
  'BC',
248
275
  'BC',
249
276
  18n,
250
- ).send({ from: this.adminAddress, wait: { returnReceipt: true } });
277
+ ).send({
278
+ from: this.adminAddress,
279
+ });
251
280
  this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
252
281
  this.bananaCoin = bananaCoin;
253
282
  this.bananaCoinInstance = bananaCoinInstance;
@@ -255,13 +284,15 @@ export class ClientFlowsBenchmark {
255
284
 
256
285
  async applyDeployCandyBarToken() {
257
286
  this.logger.info('Applying candy bar token deployment');
258
- const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TokenContract.deploy(
287
+ const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TestTokenContract.deploy(
259
288
  this.adminWallet,
260
289
  this.adminAddress,
261
290
  'CBC',
262
291
  'CBC',
263
292
  18n,
264
- ).send({ from: this.adminAddress, wait: { returnReceipt: true } });
293
+ ).send({
294
+ from: this.adminAddress,
295
+ });
265
296
  this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
266
297
  this.candyBarCoin = candyBarCoin;
267
298
  this.candyBarCoinInstance = candyBarCoinInstance;
@@ -277,7 +308,9 @@ export class ClientFlowsBenchmark {
277
308
  this.adminWallet,
278
309
  bananaCoin.address,
279
310
  this.adminAddress,
280
- ).send({ from: this.adminAddress, wait: { returnReceipt: true } });
311
+ ).send({
312
+ from: this.adminAddress,
313
+ });
281
314
 
282
315
  this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
283
316
 
@@ -321,18 +354,17 @@ export class ClientFlowsBenchmark {
321
354
 
322
355
  public async createAndFundBenchmarkingAccountOnUserWallet(accountType: AccountType) {
323
356
  const benchysAccountManager = await this.createBenchmarkingAccountManager(this.adminWallet, accountType);
324
- const benchysAccount = await benchysAccountManager.getAccount();
325
357
  const benchysAddress = benchysAccountManager.address;
326
358
  const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
327
359
  const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
328
360
  await behchysDeployMethod.send({
329
- from: AztecAddress.ZERO,
361
+ from: NO_FROM,
330
362
  fee: { paymentMethod: new FeeJuicePaymentMethodWithClaim(benchysAddress, claim) },
331
363
  });
332
364
  // Register benchy on the user's Wallet, where we're going to be interacting from
333
365
  const accountManager = await this.userWallet.createAccount({
334
- secret: benchysAccount.getSecretKey(),
335
- salt: new Fr(benchysAccount.salt),
366
+ secret: benchysAccountManager.getSecretKey(),
367
+ salt: new Fr(benchysAccountManager.getInstance().salt),
336
368
  contract: benchysAccountManager.getAccountContract(),
337
369
  });
338
370
  return accountManager.address;
@@ -340,19 +372,21 @@ export class ClientFlowsBenchmark {
340
372
 
341
373
  public async applyDeployAmm() {
342
374
  this.logger.info('Applying AMM deployment');
343
- const { contract: liquidityToken, instance: liquidityTokenInstance } = await TokenContract.deploy(
375
+ const { contract: liquidityToken, instance: liquidityTokenInstance } = await TestTokenContract.deploy(
344
376
  this.adminWallet,
345
377
  this.adminAddress,
346
378
  'LPT',
347
379
  'LPT',
348
380
  18n,
349
- ).send({ from: this.adminAddress, wait: { returnReceipt: true } });
381
+ ).send({
382
+ from: this.adminAddress,
383
+ });
350
384
  const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
351
385
  this.adminWallet,
352
386
  this.bananaCoin.address,
353
387
  this.candyBarCoin.address,
354
388
  liquidityToken.address,
355
- ).send({ from: this.adminAddress, wait: { returnReceipt: true } });
389
+ ).send({ from: this.adminAddress });
356
390
  this.logger.info(`AMM deployed at ${amm.address}`);
357
391
  await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
358
392
  this.liquidityToken = liquidityToken;
@@ -369,8 +403,9 @@ export class ClientFlowsBenchmark {
369
403
  public async getPrivateFPCPaymentMethodForWallet(wallet: Wallet, sender: AztecAddress) {
370
404
  // The private fee paying method assembled on the app side requires knowledge of the maximum
371
405
  // fee the user is willing to pay
372
- const maxFeesPerGas = (await this.aztecNode.getCurrentMinFees()).mul(1.5);
373
- const gasSettings = GasSettings.default({ maxFeesPerGas });
406
+ const maxFeesPerGas = await getPaddedMaxFeesPerGas(this.aztecNode);
407
+ const gasLimits = Gas.from((await this.aztecNode.getNodeInfo()).txsLimits.gas);
408
+ const gasSettings = GasSettings.fallback({ gasLimits, maxFeesPerGas });
374
409
  return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
375
410
  }
376
411
 
@@ -51,6 +51,7 @@ async function main() {
51
51
  // TODO(AD) do we still want to take this from witness.json?
52
52
  witness: witnessStack[i],
53
53
  vk: stepsFromFile[i].vk,
54
+ kind: stepsFromFile[i].kind,
54
55
  timings: {
55
56
  witgen: step.timings.witgen,
56
57
  gateCount: step.timings.gateCount,
@@ -2,8 +2,10 @@ import type { AztecNodeService } from '@aztec/aztec-node';
2
2
  import { AztecAddress } from '@aztec/aztec.js/addresses';
3
3
  import { BatchCall, NO_WAIT, type WaitOpts } from '@aztec/aztec.js/contracts';
4
4
  import { waitForTx } from '@aztec/aztec.js/node';
5
+ import { SlotNumber } from '@aztec/foundation/branded-types';
5
6
  import { mean, stdDev, times } from '@aztec/foundation/collection';
6
7
  import { BenchmarkingContract } from '@aztec/noir-test-contracts.js/Benchmarking';
8
+ import { type Sequencer, type SequencerEvents, SequencerState } from '@aztec/sequencer-client';
7
9
  import type { TxHash } from '@aztec/stdlib/tx';
8
10
  import type { MetricDefinition } from '@aztec/telemetry-client';
9
11
  import type { BenchmarkDataPoint, BenchmarkMetricsType, BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
@@ -11,10 +13,16 @@ import type { BenchmarkDataPoint, BenchmarkMetricsType, BenchmarkTelemetryClient
11
13
  import { mkdirSync, writeFileSync } from 'fs';
12
14
  import path from 'path';
13
15
 
16
+ import { PIPELINING_SETUP_OPTS } from '../fixtures/fixtures.js';
14
17
  import { type EndToEndContext, type SetupOptions, setup } from '../fixtures/utils.js';
15
18
 
19
+ const MAX_BENCH_WAIT_BLOCKS = 6;
20
+ const BENCH_FINAL_WAIT_TIMEOUT_SECONDS = 10;
21
+ const SEQUENCER_IDLE_TIMEOUT_MS = 60_000;
22
+ const DEFAULT_L1_PUBLISHING_TIME_SECONDS = 12;
23
+
16
24
  /**
17
- * Setup for benchmarks. Initializes a remote node with a single account and deploys a benchmark contract.
25
+ * Setup for benchmarks. Initializes a remote node with a funded hardcoded account and deploys a benchmark contract.
18
26
  */
19
27
  export async function benchmarkSetup(
20
28
  opts: Partial<SetupOptions> & {
@@ -23,11 +31,19 @@ export async function benchmarkSetup(
23
31
  benchOutput?: string;
24
32
  },
25
33
  ) {
26
- const context = await setup(1, { ...opts, telemetryConfig: { benchmark: true } });
27
- const defaultAccountAddress = context.accounts[0];
28
- const contract = await BenchmarkingContract.deploy(context.wallet).send({ from: defaultAccountAddress });
34
+ const context = await setup(1, {
35
+ ...PIPELINING_SETUP_OPTS,
36
+ ...opts,
37
+ telemetryConfig: { benchmark: true },
38
+ });
39
+ const [defaultAccountAddress] = context.accounts;
40
+ const sequencer = getSequencerClient(context);
41
+ await waitForSequencerIdle(sequencer.getSequencer());
42
+ const deployment = BenchmarkingContract.deploy(context.wallet);
43
+ const { txHash } = await deployment.send({ from: defaultAccountAddress, wait: NO_WAIT });
44
+ await waitTxs([txHash], context);
45
+ const contract = await deployment.register();
29
46
  context.logger.info(`Deployed benchmarking contract at ${contract.address}`);
30
- const sequencer = (context.aztecNode as AztecNodeService).getSequencer()!;
31
47
  const telemetry = context.telemetryClient as BenchmarkTelemetryClient;
32
48
  context.logger.warn(`Cleared benchmark data points from setup`);
33
49
  telemetry.clear();
@@ -48,6 +64,14 @@ export async function benchmarkSetup(
48
64
  return { telemetry, context, contract, sequencer };
49
65
  }
50
66
 
67
+ function getSequencerClient(context: EndToEndContext) {
68
+ const sequencer = (context.aztecNode as AztecNodeService).getSequencer();
69
+ if (!sequencer) {
70
+ throw new Error('Benchmark setup requires a local sequencer');
71
+ }
72
+ return sequencer;
73
+ }
74
+
51
75
  type MetricFilter = {
52
76
  source: MetricDefinition;
53
77
  transform: (value: number) => number;
@@ -149,15 +173,100 @@ export async function sendTxs(
149
173
  context.logger.info(`Creating ${txCount} txs`);
150
174
  const [from] = context.accounts;
151
175
  context.logger.info(`Sending ${txCount} txs`);
152
- return Promise.all(calls.map(call => call.send({ from, wait: NO_WAIT })));
176
+ return Promise.all(
177
+ calls.map(async call => {
178
+ const { txHash } = await call.send({ from, wait: NO_WAIT });
179
+ return txHash;
180
+ }),
181
+ );
153
182
  }
154
183
 
155
184
  export async function waitTxs(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
156
185
  context.logger.info(`Awaiting ${txs.length} txs to be mined`);
157
- await Promise.all(txs.map(txHash => waitForTx(context.aztecNode, txHash, txWaitOpts)));
186
+ await waitTxsWithBlockMining(txs, context, txWaitOpts);
158
187
  context.logger.info(`${txs.length} txs have been mined`);
159
188
  }
160
189
 
190
+ async function waitTxsWithBlockMining(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
191
+ const sequencer = getSequencerClient(context).getSequencer();
192
+ for (let attempt = 0; attempt <= MAX_BENCH_WAIT_BLOCKS; attempt++) {
193
+ if (await haveAllTxsMined(txs, context, txWaitOpts)) {
194
+ await waitForSequencerIdle(sequencer);
195
+ return;
196
+ }
197
+ await waitForSequencerIdle(sequencer);
198
+ context.logger.info('Mining next benchmark block while waiting for txs', {
199
+ attempt,
200
+ txs: txs.length,
201
+ });
202
+ await mineNextBenchmarkBlock(context, sequencer);
203
+ }
204
+ await Promise.all(
205
+ txs.map(txHash =>
206
+ waitForTx(context.aztecNode, txHash, {
207
+ ...txWaitOpts,
208
+ timeout: txWaitOpts?.timeout ?? BENCH_FINAL_WAIT_TIMEOUT_SECONDS,
209
+ }),
210
+ ),
211
+ );
212
+ }
213
+
214
+ async function haveAllTxsMined(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts): Promise<boolean> {
215
+ const receipts = await Promise.all(txs.map(txHash => context.aztecNode.getTxReceipt(txHash)));
216
+ for (const receipt of receipts) {
217
+ if (receipt.isDropped()) {
218
+ throw new Error(`Transaction ${receipt.txHash.toString()} was dropped. Reason: ${receipt.error ?? 'unknown'}`);
219
+ }
220
+ if (!receipt.isMined()) {
221
+ return false;
222
+ }
223
+ if (!receipt.hasExecutionSucceeded() && !txWaitOpts?.dontThrowOnRevert) {
224
+ throw new Error(
225
+ `Transaction ${receipt.txHash.toString()} reverted: ${receipt.executionResult}. Reason: ${
226
+ receipt.error ?? 'unknown'
227
+ }`,
228
+ );
229
+ }
230
+ }
231
+ return true;
232
+ }
233
+
234
+ async function mineNextBenchmarkBlock(context: EndToEndContext, sequencer: Sequencer) {
235
+ const l1PublishingTime = BigInt(context.config.l1PublishingTime ?? DEFAULT_L1_PUBLISHING_TIME_SECONDS);
236
+ const currentTimestamp = BigInt(await context.cheatCodes.eth.lastBlockTimestamp());
237
+ let targetSlot = SlotNumber((await context.cheatCodes.rollup.getSlot()) + 1);
238
+ let targetTimestamp = await context.cheatCodes.rollup.getTimestampForSlot(targetSlot);
239
+ while (targetTimestamp - l1PublishingTime - 1n <= currentTimestamp) {
240
+ targetSlot = SlotNumber(targetSlot + 1);
241
+ targetTimestamp = await context.cheatCodes.rollup.getTimestampForSlot(targetSlot);
242
+ }
243
+
244
+ const triggerTimestamp = targetTimestamp - l1PublishingTime - 1n;
245
+ await context.cheatCodes.eth.warp(triggerTimestamp, { resetBlockInterval: true });
246
+ await context.aztecNode.mineBlock();
247
+ await waitForSequencerIdle(sequencer);
248
+ }
249
+
250
+ function waitForSequencerIdle(sequencer: Sequencer, timeout = SEQUENCER_IDLE_TIMEOUT_MS): Promise<void> {
251
+ if (sequencer.status().state === SequencerState.IDLE) {
252
+ return Promise.resolve();
253
+ }
254
+ return new Promise((resolve, reject) => {
255
+ const timer = setTimeout(() => {
256
+ sequencer.off('state-changed', handler);
257
+ reject(new Error('Timeout waiting for sequencer IDLE state'));
258
+ }, timeout);
259
+ const handler = (args: Parameters<SequencerEvents['state-changed']>[0]) => {
260
+ if (args.newState === SequencerState.IDLE) {
261
+ clearTimeout(timer);
262
+ sequencer.off('state-changed', handler);
263
+ resolve();
264
+ }
265
+ };
266
+ sequencer.on('state-changed', handler);
267
+ });
268
+ }
269
+
161
270
  function randomBytesAsBigInts(length: number): bigint[] {
162
271
  return [...Array(length)].map(_ => BigInt(Math.floor(Math.random() * 255)));
163
272
  }