@aztec/end-to-end 0.0.1-commit.3fd054f6 → 0.0.1-commit.431c48d

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