@aztec/end-to-end 0.0.1-commit.c2eed6949 → 0.0.1-commit.c52d6e7

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 (312) 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 +23 -36
  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 +24 -39
  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 +56 -58
  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 +97 -6
  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 +1 -1
  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 +12 -9
  43. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  44. package/dest/fixtures/e2e_prover_test.js +53 -35
  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 +2 -2
  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 +81 -42
  64. package/dest/fixtures/setup.d.ts.map +1 -1
  65. package/dest/fixtures/setup.js +289 -198
  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 +19 -10
  110. package/dest/p2p/p2p_network.d.ts.map +1 -0
  111. package/dest/{e2e_p2p → p2p}/p2p_network.js +82 -38
  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 +32 -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 +33 -21
  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 +26 -15
  124. package/dest/shared/submit-transactions.d.ts +1 -1
  125. package/dest/shared/submit-transactions.d.ts.map +1 -1
  126. package/dest/shared/submit-transactions.js +12 -5
  127. package/dest/shared/timing_env.d.js +5 -0
  128. package/dest/shared/timing_env.js +365 -0
  129. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  130. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  131. package/dest/shared/uniswap_l1_l2.js +50 -37
  132. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  133. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  134. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  135. package/dest/simulators/lending_simulator.d.ts +10 -3
  136. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  137. package/dest/simulators/lending_simulator.js +24 -12
  138. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  139. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  140. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  141. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  142. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  143. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  144. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  145. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  146. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  147. package/dest/single-node/fees/fees_test.d.ts +95 -0
  148. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  149. package/dest/single-node/fees/fees_test.js +344 -0
  150. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  151. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  152. package/dest/single-node/l1-reorgs/setup.js +57 -0
  153. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  154. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  155. package/dest/single-node/partial-proofs/setup.js +5 -0
  156. package/dest/single-node/proving/setup.d.ts +5 -0
  157. package/dest/single-node/proving/setup.d.ts.map +1 -0
  158. package/dest/single-node/proving/setup.js +5 -0
  159. package/dest/single-node/recovery/setup.d.ts +5 -0
  160. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  161. package/dest/single-node/recovery/setup.js +5 -0
  162. package/dest/single-node/setup.d.ts +49 -0
  163. package/dest/single-node/setup.d.ts.map +1 -0
  164. package/dest/single-node/setup.js +56 -0
  165. package/dest/single-node/single_node_test_context.d.ts +374 -0
  166. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  167. package/dest/single-node/single_node_test_context.js +847 -0
  168. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  169. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  170. package/dest/spartan/setup_test_wallets.js +84 -50
  171. package/dest/spartan/tx_metrics.d.ts +27 -4
  172. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  173. package/dest/spartan/tx_metrics.js +105 -20
  174. package/dest/spartan/utils/config.d.ts +9 -35
  175. package/dest/spartan/utils/config.d.ts.map +1 -1
  176. package/dest/spartan/utils/nodes.js +2 -2
  177. package/dest/test-wallet/test_wallet.d.ts +39 -10
  178. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  179. package/dest/test-wallet/test_wallet.js +166 -59
  180. package/dest/test-wallet/utils.d.ts +38 -3
  181. package/dest/test-wallet/utils.d.ts.map +1 -1
  182. package/dest/test-wallet/utils.js +65 -10
  183. package/dest/test-wallet/wallet_worker_script.js +12 -4
  184. package/dest/test-wallet/worker_wallet.d.ts +9 -8
  185. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  186. package/dest/test-wallet/worker_wallet.js +10 -4
  187. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
  188. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  189. package/dest/test-wallet/worker_wallet_schema.js +15 -2
  190. package/package.json +47 -42
  191. package/src/automine/README.md +60 -0
  192. package/src/automine/automine_test_context.ts +153 -0
  193. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  194. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  195. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +24 -47
  196. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +25 -48
  197. package/src/automine/token/token_test_helpers.ts +138 -0
  198. package/src/bench/client_flows/benchmark.ts +21 -0
  199. package/src/bench/client_flows/client_flows_benchmark.ts +106 -80
  200. package/src/bench/client_flows/data_extractor.ts +1 -0
  201. package/src/bench/utils.ts +110 -6
  202. package/src/composed/ha/ha_full_setup.ts +466 -0
  203. package/src/fixtures/authwit_proxy.ts +4 -0
  204. package/src/fixtures/e2e_prover_test.ts +68 -52
  205. package/src/fixtures/fixtures.ts +100 -0
  206. package/src/fixtures/get_acvm_config.ts +2 -8
  207. package/src/fixtures/get_bb_config.ts +1 -2
  208. package/src/fixtures/ha_setup.ts +11 -5
  209. package/src/fixtures/index.ts +1 -0
  210. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  211. package/src/fixtures/setup.ts +361 -256
  212. package/src/fixtures/setup_p2p_test.ts +15 -11
  213. package/src/fixtures/standard_contracts_genesis.ts +28 -0
  214. package/src/fixtures/timing.ts +97 -0
  215. package/src/fixtures/token_utils.ts +40 -8
  216. package/src/fixtures/utils.ts +2 -3
  217. package/src/fixtures/wait_helpers.ts +333 -0
  218. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  219. package/src/forward-compatibility/wallet_service.ts +106 -0
  220. package/src/guides/up_quick_start.sh +5 -2
  221. package/src/infra/README.md +12 -0
  222. package/src/install_legacy_contracts.cjs +75 -0
  223. package/src/legacy-jest-resolver.cjs +112 -0
  224. package/src/multi-node/README.md +96 -0
  225. package/src/multi-node/block-production/setup.ts +272 -0
  226. package/src/multi-node/governance/setup.ts +172 -0
  227. package/src/multi-node/multi_node_test_context.ts +447 -0
  228. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  229. package/src/multi-node/slashing/setup.ts +433 -0
  230. package/src/p2p/README.md +78 -0
  231. package/src/{e2e_p2p → p2p}/p2p_network.ts +95 -50
  232. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +35 -28
  233. package/src/p2p/shared.ts +329 -0
  234. package/src/shared/cross_chain_test_harness.ts +36 -17
  235. package/src/shared/gas_portal_test_harness.ts +34 -17
  236. package/src/shared/submit-transactions.ts +13 -5
  237. package/src/shared/timing_env.d.mts +39 -0
  238. package/src/shared/timing_env.mjs +363 -0
  239. package/src/shared/uniswap_l1_l2.ts +80 -43
  240. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  241. package/src/simulators/lending_simulator.ts +28 -14
  242. package/src/single-node/README.md +66 -0
  243. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  244. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  245. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  246. package/src/single-node/fees/fees_test.ts +434 -0
  247. package/src/single-node/l1-reorgs/setup.ts +93 -0
  248. package/src/single-node/partial-proofs/setup.ts +8 -0
  249. package/src/single-node/proving/setup.ts +15 -0
  250. package/src/single-node/recovery/setup.ts +8 -0
  251. package/src/single-node/setup.ts +63 -0
  252. package/src/single-node/single_node_test_context.ts +1058 -0
  253. package/src/spartan/setup_test_wallets.ts +87 -47
  254. package/src/spartan/tx_metrics.ts +107 -23
  255. package/src/spartan/utils/nodes.ts +2 -2
  256. package/src/test-wallet/test_wallet.ts +185 -60
  257. package/src/test-wallet/utils.ts +104 -11
  258. package/src/test-wallet/wallet_worker_script.ts +11 -5
  259. package/src/test-wallet/worker_wallet.ts +19 -16
  260. package/src/test-wallet/worker_wallet_schema.ts +4 -3
  261. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
  262. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  263. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  264. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  265. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  266. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  267. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  268. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  269. package/dest/e2e_epochs/epochs_test.d.ts +0 -104
  270. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  271. package/dest/e2e_epochs/epochs_test.js +0 -389
  272. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  273. package/dest/e2e_fees/fees_test.d.ts +0 -88
  274. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  275. package/dest/e2e_fees/fees_test.js +0 -255
  276. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  277. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  278. package/dest/e2e_l1_publisher/write_json.js +0 -56
  279. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  280. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  281. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  282. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  283. package/dest/e2e_nested_contract/nested_contract_test.js +0 -54
  284. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  285. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  286. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  287. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  288. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  289. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  290. package/dest/e2e_p2p/shared.d.ts +0 -66
  291. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  292. package/dest/e2e_p2p/shared.js +0 -212
  293. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  294. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  295. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  296. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  297. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  298. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  299. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  300. package/src/e2e_epochs/epochs_test.ts +0 -499
  301. package/src/e2e_fees/fees_test.ts +0 -331
  302. package/src/e2e_l1_publisher/write_json.ts +0 -77
  303. package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
  304. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  305. package/src/e2e_p2p/shared.ts +0 -343
  306. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  307. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  308. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  309. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  310. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  311. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  312. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -4,6 +4,7 @@ import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
4
4
  import { type FeePaymentMethod, PrivateFeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
5
5
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
6
6
  import type { AztecNode } from '@aztec/aztec.js/node';
7
+ import { FeeJuiceContract } from '@aztec/aztec.js/protocol';
7
8
  import type { Wallet } from '@aztec/aztec.js/wallet';
8
9
  import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
9
10
  import { createExtendedL1Client } from '@aztec/ethereum/client';
@@ -13,23 +14,26 @@ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
13
14
  import { ChainMonitor } from '@aztec/ethereum/test';
14
15
  import { randomBytes } from '@aztec/foundation/crypto/random';
15
16
  import { Fr } from '@aztec/foundation/curves/bn254';
17
+ import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
16
18
  import { EthAddress } from '@aztec/foundation/eth-address';
17
19
  import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi';
18
20
  import { TestERC20Bytecode } from '@aztec/l1-artifacts/TestERC20Bytecode';
19
21
  import { AMMContract } from '@aztec/noir-contracts.js/AMM';
20
22
  import { FPCContract } from '@aztec/noir-contracts.js/FPC';
21
- import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
22
23
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
23
- import { TokenContract as BananaCoin, TokenContract } from '@aztec/noir-contracts.js/Token';
24
- import { ProtocolContractAddress } from '@aztec/protocol-contracts';
25
- import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
24
+ import { TestTokenContract as BananaCoin, TestTokenContract } from '@aztec/noir-test-contracts.js/TestToken';
26
25
  import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
27
26
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
28
- import { GasSettings } from '@aztec/stdlib/gas';
29
- import { deriveSigningKey } from '@aztec/stdlib/keys';
27
+ import { Gas, GasSettings } from '@aztec/stdlib/gas';
28
+ import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
30
29
 
31
- import { MNEMONIC } from '../../fixtures/fixtures.js';
32
- 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';
33
37
  import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
34
38
  import { setupSponsoredFPC } from '../../fixtures/utils.js';
35
39
  import { CrossChainTestHarness } from '../../shared/cross_chain_test_harness.js';
@@ -71,13 +75,13 @@ export class ClientFlowsBenchmark {
71
75
  public bananaFPC!: FPCContract;
72
76
  public bananaFPCInstance!: ContractInstanceWithAddress;
73
77
  // Random asset we want to trade
74
- public candyBarCoin!: TokenContract;
78
+ public candyBarCoin!: TestTokenContract;
75
79
  public candyBarCoinInstance!: ContractInstanceWithAddress;
76
80
  // AMM contract
77
81
  public amm!: AMMContract;
78
82
  public ammInstance!: ContractInstanceWithAddress;
79
83
  // Liquidity token for AMM
80
- public liquidityToken!: TokenContract;
84
+ public liquidityToken!: TestTokenContract;
81
85
  public liquidityTokenInstance!: ContractInstanceWithAddress;
82
86
  // Sponsored FPC contract
83
87
  public sponsoredFPC!: SponsoredFPCContract;
@@ -88,33 +92,35 @@ export class ClientFlowsBenchmark {
88
92
 
89
93
  public realProofs = ['true', '1'].includes(process.env.REAL_PROOFS ?? '');
90
94
 
91
- public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; circuits: number }> =
92
- {
93
- // eslint-disable-next-line camelcase
94
- bridged_fee_juice: {
95
- forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
96
- circuits: 2, // FeeJuice claim + kernel inner
97
- },
98
- // eslint-disable-next-line camelcase
99
- private_fpc: {
100
- forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
101
- circuits:
102
- 2 + // FPC entrypoint + kernel inner
103
- 2 + // BananaCoin transfer_to_public + kernel inner
104
- 2 + // Account verify_private_authwit + kernel inner
105
- 2, // BananaCoin prepare_private_balance_increase + kernel inner
106
- },
107
- // eslint-disable-next-line camelcase
108
- sponsored_fpc: {
109
- forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
110
- circuits: 2, // Sponsored FPC sponsor_unconditionally + kernel inner
111
- },
112
- // eslint-disable-next-line camelcase
113
- fee_juice: {
114
- forWallet: () => Promise.resolve(undefined),
115
- circuits: 0,
116
- },
117
- };
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
+ };
118
124
 
119
125
  public config: ClientFlowsConfig;
120
126
 
@@ -123,7 +129,7 @@ export class ClientFlowsBenchmark {
123
129
 
124
130
  constructor(testName?: string, setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {}) {
125
131
  this.logger = createLogger(`bench:client_flows${testName ? `:${testName}` : ''}`);
126
- this.setupOptions = { startProverNode: true, ...setupOptions };
132
+ this.setupOptions = { ...AUTOMINE_E2E_OPTS, startProverNode: true, ...setupOptions };
127
133
  this.config = BENCHMARK_CONFIG === 'key_flows' ? KEY_FLOWS_CONFIG : FULL_FLOWS_CONFIG;
128
134
  ProxyLogger.create();
129
135
  this.proxyLogger = ProxyLogger.getInstance();
@@ -132,11 +138,11 @@ export class ClientFlowsBenchmark {
132
138
  async setup() {
133
139
  this.logger.info('Setting up subsystems from fresh');
134
140
  // Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
135
- const tokenAllowList = await getTokenAllowedSetupFunctions();
136
- this.context = await setup(0, {
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, {
137
144
  ...this.setupOptions,
138
145
  fundSponsoredFPC: true,
139
- skipAccountDeployment: true,
140
146
  l1ContractsArgs: this.setupOptions,
141
147
  txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
142
148
  });
@@ -184,7 +190,7 @@ export class ClientFlowsBenchmark {
184
190
 
185
191
  let benchysPrivateSigningKey;
186
192
  if (type === 'schnorr') {
187
- benchysPrivateSigningKey = deriveSigningKey(benchysSecret);
193
+ benchysPrivateSigningKey = GrumpkinScalar.random();
188
194
  return wallet.createSchnorrAccount(benchysSecret, salt, benchysPrivateSigningKey);
189
195
  } else if (type === 'ecdsar1') {
190
196
  benchysPrivateSigningKey = randomBytes(32);
@@ -201,15 +207,7 @@ export class ClientFlowsBenchmark {
201
207
 
202
208
  async applyInitialAccounts() {
203
209
  this.logger.info('Applying initial accounts setup');
204
- const { deployedAccounts } = await deployAccounts(
205
- 2,
206
- this.logger,
207
- )({
208
- wallet: this.context.wallet,
209
- initialFundedAccounts: this.context.initialFundedAccounts,
210
- });
211
-
212
- const [{ address: adminAddress }, { address: sequencerAddress }] = deployedAccounts;
210
+ const [adminAddress, sequencerAddress] = this.context.accounts;
213
211
 
214
212
  this.adminWallet = this.context.wallet;
215
213
  this.aztecNode = this.context.aztecNodeService;
@@ -218,8 +216,7 @@ export class ClientFlowsBenchmark {
218
216
  this.adminAddress = adminAddress;
219
217
  this.sequencerAddress = sequencerAddress;
220
218
 
221
- const canonicalFeeJuice = await getCanonicalFeeJuice();
222
- this.feeJuiceContract = FeeJuiceContract.at(canonicalFeeJuice.address, this.adminWallet);
219
+ this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
223
220
  this.coinbase = EthAddress.random();
224
221
 
225
222
  const userPXEConfig = getPXEConfig();
@@ -232,17 +229,38 @@ export class ClientFlowsBenchmark {
232
229
  loggers: {
233
230
  prover: this.proxyLogger.createLogger('pxe:bb:wasm:bundle:proxied'),
234
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
+ },
235
245
  });
236
246
  }
237
247
 
238
248
  async applySetupFeeJuice() {
239
249
  this.logger.info('Applying fee juice setup');
240
- this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.adminWallet);
250
+ this.feeJuiceContract = FeeJuiceContract.withWallet(this.adminWallet);
241
251
 
242
252
  this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
243
253
  aztecNode: this.context.aztecNodeService,
244
254
  aztecNodeAdmin: this.context.aztecNodeService,
245
- 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
+ ),
246
264
  wallet: this.adminWallet,
247
265
  logger: this.logger,
248
266
  });
@@ -250,11 +268,14 @@ export class ClientFlowsBenchmark {
250
268
 
251
269
  async applyDeployBananaToken() {
252
270
  this.logger.info('Applying banana token deployment');
253
- const {
254
- receipt: { contract: bananaCoin, instance: bananaCoinInstance },
255
- } = await BananaCoin.deploy(this.adminWallet, this.adminAddress, 'BC', 'BC', 18n).send({
271
+ const { contract: bananaCoin, instance: bananaCoinInstance } = await BananaCoin.deploy(
272
+ this.adminWallet,
273
+ this.adminAddress,
274
+ 'BC',
275
+ 'BC',
276
+ 18n,
277
+ ).send({
256
278
  from: this.adminAddress,
257
- wait: { returnReceipt: true },
258
279
  });
259
280
  this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
260
281
  this.bananaCoin = bananaCoin;
@@ -263,11 +284,14 @@ export class ClientFlowsBenchmark {
263
284
 
264
285
  async applyDeployCandyBarToken() {
265
286
  this.logger.info('Applying candy bar token deployment');
266
- const {
267
- receipt: { contract: candyBarCoin, instance: candyBarCoinInstance },
268
- } = await TokenContract.deploy(this.adminWallet, this.adminAddress, 'CBC', 'CBC', 18n).send({
287
+ const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TestTokenContract.deploy(
288
+ this.adminWallet,
289
+ this.adminAddress,
290
+ 'CBC',
291
+ 'CBC',
292
+ 18n,
293
+ ).send({
269
294
  from: this.adminAddress,
270
- wait: { returnReceipt: true },
271
295
  });
272
296
  this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
273
297
  this.candyBarCoin = candyBarCoin;
@@ -280,11 +304,12 @@ export class ClientFlowsBenchmark {
280
304
  expect((await this.context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
281
305
 
282
306
  const bananaCoin = this.bananaCoin;
283
- const {
284
- receipt: { contract: bananaFPC, instance: bananaFPCInstance },
285
- } = await FPCContract.deploy(this.adminWallet, bananaCoin.address, this.adminAddress).send({
307
+ const { contract: bananaFPC, instance: bananaFPCInstance } = await FPCContract.deploy(
308
+ this.adminWallet,
309
+ bananaCoin.address,
310
+ this.adminAddress,
311
+ ).send({
286
312
  from: this.adminAddress,
287
- wait: { returnReceipt: true },
288
313
  });
289
314
 
290
315
  this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
@@ -329,7 +354,6 @@ export class ClientFlowsBenchmark {
329
354
 
330
355
  public async createAndFundBenchmarkingAccountOnUserWallet(accountType: AccountType) {
331
356
  const benchysAccountManager = await this.createBenchmarkingAccountManager(this.adminWallet, accountType);
332
- const benchysAccount = await benchysAccountManager.getAccount();
333
357
  const benchysAddress = benchysAccountManager.address;
334
358
  const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
335
359
  const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
@@ -339,8 +363,8 @@ export class ClientFlowsBenchmark {
339
363
  });
340
364
  // Register benchy on the user's Wallet, where we're going to be interacting from
341
365
  const accountManager = await this.userWallet.createAccount({
342
- secret: benchysAccount.getSecretKey(),
343
- salt: new Fr(benchysAccount.salt),
366
+ secret: benchysAccountManager.getSecretKey(),
367
+ salt: new Fr(benchysAccountManager.getInstance().salt),
344
368
  contract: benchysAccountManager.getAccountContract(),
345
369
  });
346
370
  return accountManager.address;
@@ -348,20 +372,21 @@ export class ClientFlowsBenchmark {
348
372
 
349
373
  public async applyDeployAmm() {
350
374
  this.logger.info('Applying AMM deployment');
351
- const {
352
- receipt: { contract: liquidityToken, instance: liquidityTokenInstance },
353
- } = await TokenContract.deploy(this.adminWallet, this.adminAddress, 'LPT', 'LPT', 18n).send({
375
+ const { contract: liquidityToken, instance: liquidityTokenInstance } = await TestTokenContract.deploy(
376
+ this.adminWallet,
377
+ this.adminAddress,
378
+ 'LPT',
379
+ 'LPT',
380
+ 18n,
381
+ ).send({
354
382
  from: this.adminAddress,
355
- wait: { returnReceipt: true },
356
383
  });
357
- const {
358
- receipt: { contract: amm, instance: ammInstance },
359
- } = await AMMContract.deploy(
384
+ const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
360
385
  this.adminWallet,
361
386
  this.bananaCoin.address,
362
387
  this.candyBarCoin.address,
363
388
  liquidityToken.address,
364
- ).send({ from: this.adminAddress, wait: { returnReceipt: true } });
389
+ ).send({ from: this.adminAddress });
365
390
  this.logger.info(`AMM deployed at ${amm.address}`);
366
391
  await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
367
392
  this.liquidityToken = liquidityToken;
@@ -378,8 +403,9 @@ export class ClientFlowsBenchmark {
378
403
  public async getPrivateFPCPaymentMethodForWallet(wallet: Wallet, sender: AztecAddress) {
379
404
  // The private fee paying method assembled on the app side requires knowledge of the maximum
380
405
  // fee the user is willing to pay
381
- const maxFeesPerGas = (await this.aztecNode.getCurrentMinFees()).mul(1.5);
382
- 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 });
383
409
  return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
384
410
  }
385
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;
@@ -159,10 +183,90 @@ export async function sendTxs(
159
183
 
160
184
  export async function waitTxs(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
161
185
  context.logger.info(`Awaiting ${txs.length} txs to be mined`);
162
- await Promise.all(txs.map(txHash => waitForTx(context.aztecNode, txHash, txWaitOpts)));
186
+ await waitTxsWithBlockMining(txs, context, txWaitOpts);
163
187
  context.logger.info(`${txs.length} txs have been mined`);
164
188
  }
165
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
+
166
270
  function randomBytesAsBigInts(length: number): bigint[] {
167
271
  return [...Array(length)].map(_ => BigInt(Math.floor(Math.random() * 255)));
168
272
  }