@aztec/end-to-end 0.0.1-commit.4d79d1f2d → 0.0.1-commit.4d9804df

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 (343) hide show
  1. package/README.md +217 -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 +39 -52
  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 +37 -52
  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 +62 -53
  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 +15 -0
  40. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  41. package/dest/fixtures/authwit_proxy.js +34 -0
  42. package/dest/fixtures/e2e_prover_test.d.ts +17 -13
  43. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  44. package/dest/fixtures/e2e_prover_test.js +82 -74
  45. package/dest/fixtures/elu_monitor.d.ts +21 -0
  46. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  47. package/dest/fixtures/elu_monitor.js +102 -0
  48. package/dest/fixtures/fixtures.d.ts +83 -1
  49. package/dest/fixtures/fixtures.d.ts.map +1 -1
  50. package/dest/fixtures/fixtures.js +86 -0
  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 +5 -5
  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 +8 -3
  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 +99 -48
  64. package/dest/fixtures/setup.d.ts.map +1 -1
  65. package/dest/fixtures/setup.js +319 -262
  66. package/dest/fixtures/setup_p2p_test.d.ts +14 -7
  67. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  68. package/dest/fixtures/setup_p2p_test.js +21 -18
  69. package/dest/fixtures/timing.d.ts +42 -0
  70. package/dest/fixtures/timing.d.ts.map +1 -0
  71. package/dest/fixtures/timing.js +72 -0
  72. package/dest/fixtures/token_utils.d.ts +22 -4
  73. package/dest/fixtures/token_utils.d.ts.map +1 -1
  74. package/dest/fixtures/token_utils.js +26 -8
  75. package/dest/fixtures/utils.d.ts +2 -2
  76. package/dest/fixtures/utils.d.ts.map +1 -1
  77. package/dest/fixtures/utils.js +1 -1
  78. package/dest/fixtures/wait_helpers.d.ts +135 -0
  79. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  80. package/dest/fixtures/wait_helpers.js +154 -0
  81. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  82. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  83. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  84. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  85. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  86. package/dest/forward-compatibility/wallet_service.js +109 -0
  87. package/dest/install_legacy_contracts.d.cts +10 -0
  88. package/dest/install_legacy_contracts.d.cts.map +1 -0
  89. package/dest/legacy-jest-resolver.d.cts +3 -0
  90. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  91. package/dest/multi-node/block-production/setup.d.ts +97 -0
  92. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  93. package/dest/multi-node/block-production/setup.js +158 -0
  94. package/dest/multi-node/governance/setup.d.ts +67 -0
  95. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  96. package/dest/multi-node/governance/setup.js +126 -0
  97. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  98. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  99. package/dest/multi-node/multi_node_test_context.js +347 -0
  100. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  101. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  102. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  103. package/dest/multi-node/slashing/setup.d.ts +167 -0
  104. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  105. package/dest/multi-node/slashing/setup.js +275 -0
  106. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +21 -11
  107. package/dest/p2p/p2p_network.d.ts.map +1 -0
  108. package/dest/{e2e_p2p → p2p}/p2p_network.js +97 -37
  109. package/dest/p2p/reqresp/utils.d.ts +19 -0
  110. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  111. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +67 -27
  112. package/dest/p2p/shared.d.ts +72 -0
  113. package/dest/p2p/shared.d.ts.map +1 -0
  114. package/dest/p2p/shared.js +212 -0
  115. package/dest/shared/cross_chain_test_harness.d.ts +6 -4
  116. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  117. package/dest/shared/cross_chain_test_harness.js +36 -31
  118. package/dest/shared/gas_portal_test_harness.d.ts +8 -5
  119. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  120. package/dest/shared/gas_portal_test_harness.js +26 -14
  121. package/dest/shared/index.d.ts +2 -1
  122. package/dest/shared/index.d.ts.map +1 -1
  123. package/dest/shared/index.js +1 -0
  124. package/dest/shared/jest_setup.js +41 -1
  125. package/dest/shared/mock_state_view.d.ts +86 -0
  126. package/dest/shared/mock_state_view.d.ts.map +1 -0
  127. package/dest/shared/mock_state_view.js +186 -0
  128. package/dest/shared/submit-transactions.d.ts +1 -1
  129. package/dest/shared/submit-transactions.d.ts.map +1 -1
  130. package/dest/shared/submit-transactions.js +12 -5
  131. package/dest/shared/timing_env.d.js +5 -0
  132. package/dest/shared/timing_env.js +365 -0
  133. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  134. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  135. package/dest/shared/uniswap_l1_l2.js +55 -45
  136. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  137. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  138. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  139. package/dest/simulators/lending_simulator.d.ts +10 -3
  140. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  141. package/dest/simulators/lending_simulator.js +27 -15
  142. package/dest/simulators/token_simulator.d.ts +1 -1
  143. package/dest/simulators/token_simulator.d.ts.map +1 -1
  144. package/dest/simulators/token_simulator.js +2 -2
  145. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  146. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  147. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  148. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  149. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  150. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  151. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  152. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  153. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  154. package/dest/single-node/fees/fees_test.d.ts +93 -0
  155. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  156. package/dest/{e2e_fees → single-node/fees}/fees_test.js +89 -63
  157. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  158. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  159. package/dest/single-node/l1-reorgs/setup.js +57 -0
  160. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  161. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  162. package/dest/single-node/partial-proofs/setup.js +5 -0
  163. package/dest/single-node/proving/setup.d.ts +5 -0
  164. package/dest/single-node/proving/setup.d.ts.map +1 -0
  165. package/dest/single-node/proving/setup.js +5 -0
  166. package/dest/single-node/recovery/setup.d.ts +5 -0
  167. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  168. package/dest/single-node/recovery/setup.js +5 -0
  169. package/dest/single-node/setup.d.ts +49 -0
  170. package/dest/single-node/setup.d.ts.map +1 -0
  171. package/dest/single-node/setup.js +56 -0
  172. package/dest/single-node/single_node_test_context.d.ts +360 -0
  173. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  174. package/dest/single-node/single_node_test_context.js +833 -0
  175. package/dest/spartan/setup_test_wallets.d.ts +11 -2
  176. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  177. package/dest/spartan/setup_test_wallets.js +121 -46
  178. package/dest/spartan/tx_metrics.d.ts +27 -4
  179. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  180. package/dest/spartan/tx_metrics.js +106 -21
  181. package/dest/spartan/utils/bot.d.ts +3 -2
  182. package/dest/spartan/utils/bot.d.ts.map +1 -1
  183. package/dest/spartan/utils/bot.js +2 -1
  184. package/dest/spartan/utils/config.d.ts +10 -30
  185. package/dest/spartan/utils/config.d.ts.map +1 -1
  186. package/dest/spartan/utils/config.js +3 -1
  187. package/dest/spartan/utils/index.d.ts +4 -2
  188. package/dest/spartan/utils/index.d.ts.map +1 -1
  189. package/dest/spartan/utils/index.js +5 -1
  190. package/dest/spartan/utils/k8s.d.ts +3 -1
  191. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  192. package/dest/spartan/utils/k8s.js +6 -0
  193. package/dest/spartan/utils/nodes.d.ts +4 -5
  194. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  195. package/dest/spartan/utils/nodes.js +11 -11
  196. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  197. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  198. package/dest/spartan/utils/pod_logs.js +74 -0
  199. package/dest/test-wallet/test_wallet.d.ts +48 -25
  200. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  201. package/dest/test-wallet/test_wallet.js +197 -91
  202. package/dest/test-wallet/utils.d.ts +38 -3
  203. package/dest/test-wallet/utils.d.ts.map +1 -1
  204. package/dest/test-wallet/utils.js +65 -10
  205. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  206. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  207. package/dest/test-wallet/wallet_worker_script.js +56 -0
  208. package/dest/test-wallet/worker_wallet.d.ts +53 -0
  209. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  210. package/dest/test-wallet/worker_wallet.js +157 -0
  211. package/dest/test-wallet/worker_wallet_schema.d.ts +4 -0
  212. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  213. package/dest/test-wallet/worker_wallet_schema.js +23 -0
  214. package/package.json +50 -47
  215. package/src/automine/README.md +60 -0
  216. package/src/automine/automine_test_context.ts +153 -0
  217. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  218. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  219. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +44 -63
  220. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +43 -58
  221. package/src/automine/token/token_test_helpers.ts +138 -0
  222. package/src/bench/client_flows/benchmark.ts +21 -0
  223. package/src/bench/client_flows/client_flows_benchmark.ts +102 -64
  224. package/src/bench/client_flows/data_extractor.ts +1 -0
  225. package/src/bench/utils.ts +116 -7
  226. package/src/composed/ha/ha_full_setup.ts +466 -0
  227. package/src/fixtures/authwit_proxy.ts +54 -0
  228. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  229. package/src/fixtures/e2e_prover_test.ts +97 -93
  230. package/src/fixtures/elu_monitor.ts +126 -0
  231. package/src/fixtures/fixtures.ts +110 -0
  232. package/src/fixtures/get_bb_config.ts +7 -6
  233. package/src/fixtures/ha_setup.ts +14 -6
  234. package/src/fixtures/index.ts +1 -0
  235. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  236. package/src/fixtures/setup.ts +406 -351
  237. package/src/fixtures/setup_p2p_test.ts +23 -27
  238. package/src/fixtures/timing.ts +97 -0
  239. package/src/fixtures/token_utils.ts +42 -7
  240. package/src/fixtures/utils.ts +2 -3
  241. package/src/fixtures/wait_helpers.ts +333 -0
  242. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  243. package/src/forward-compatibility/wallet_service.ts +106 -0
  244. package/src/guides/up_quick_start.sh +5 -2
  245. package/src/infra/README.md +12 -0
  246. package/src/install_legacy_contracts.cjs +75 -0
  247. package/src/legacy-jest-resolver.cjs +112 -0
  248. package/src/multi-node/README.md +95 -0
  249. package/src/multi-node/block-production/setup.ts +272 -0
  250. package/src/multi-node/governance/setup.ts +172 -0
  251. package/src/multi-node/multi_node_test_context.ts +447 -0
  252. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  253. package/src/multi-node/slashing/setup.ts +433 -0
  254. package/src/p2p/README.md +78 -0
  255. package/src/{e2e_p2p → p2p}/p2p_network.ts +116 -47
  256. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +82 -26
  257. package/src/p2p/shared.ts +329 -0
  258. package/src/shared/cross_chain_test_harness.ts +42 -17
  259. package/src/shared/gas_portal_test_harness.ts +33 -15
  260. package/src/shared/index.ts +1 -0
  261. package/src/shared/jest_setup.ts +51 -1
  262. package/src/shared/mock_state_view.ts +188 -0
  263. package/src/shared/submit-transactions.ts +13 -5
  264. package/src/shared/timing_env.d.mts +39 -0
  265. package/src/shared/timing_env.mjs +363 -0
  266. package/src/shared/uniswap_l1_l2.ts +98 -54
  267. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  268. package/src/simulators/lending_simulator.ts +33 -15
  269. package/src/simulators/token_simulator.ts +6 -2
  270. package/src/single-node/README.md +60 -0
  271. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  272. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  273. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  274. package/src/{e2e_fees → single-node/fees}/fees_test.ts +114 -70
  275. package/src/single-node/l1-reorgs/setup.ts +93 -0
  276. package/src/single-node/partial-proofs/setup.ts +8 -0
  277. package/src/single-node/proving/setup.ts +15 -0
  278. package/src/single-node/recovery/setup.ts +8 -0
  279. package/src/single-node/setup.ts +63 -0
  280. package/src/single-node/single_node_test_context.ts +1041 -0
  281. package/src/spartan/setup_test_wallets.ts +165 -41
  282. package/src/spartan/tx_metrics.ts +108 -24
  283. package/src/spartan/utils/bot.ts +4 -1
  284. package/src/spartan/utils/config.ts +2 -0
  285. package/src/spartan/utils/index.ts +7 -0
  286. package/src/spartan/utils/k8s.ts +8 -0
  287. package/src/spartan/utils/nodes.ts +17 -12
  288. package/src/spartan/utils/pod_logs.ts +99 -0
  289. package/src/test-wallet/test_wallet.ts +228 -107
  290. package/src/test-wallet/utils.ts +104 -11
  291. package/src/test-wallet/wallet_worker_script.ts +66 -0
  292. package/src/test-wallet/worker_wallet.ts +216 -0
  293. package/src/test-wallet/worker_wallet_schema.ts +14 -0
  294. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
  295. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  296. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  297. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  298. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  299. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  300. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  301. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  302. package/dest/e2e_epochs/epochs_test.d.ts +0 -100
  303. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  304. package/dest/e2e_epochs/epochs_test.js +0 -367
  305. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  306. package/dest/e2e_fees/fees_test.d.ts +0 -88
  307. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  308. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  309. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  310. package/dest/e2e_l1_publisher/write_json.js +0 -56
  311. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  312. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  313. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  314. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  315. package/dest/e2e_nested_contract/nested_contract_test.js +0 -56
  316. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  317. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  318. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  319. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  320. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  321. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  322. package/dest/e2e_p2p/shared.d.ts +0 -46
  323. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  324. package/dest/e2e_p2p/shared.js +0 -181
  325. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  326. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  327. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  328. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  329. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  330. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  331. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  332. package/src/e2e_epochs/epochs_test.ts +0 -487
  333. package/src/e2e_l1_publisher/write_json.ts +0 -77
  334. package/src/e2e_nested_contract/nested_contract_test.ts +0 -73
  335. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  336. package/src/e2e_p2p/shared.ts +0 -290
  337. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  338. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  339. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  340. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  341. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  342. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  343. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -1,22 +1,13 @@
1
- import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
1
  import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
3
- import { type Archiver, createArchiver } from '@aztec/archiver';
4
- import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
2
+ import { type AztecNodeConfig, AztecNodeService, createAztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
5
3
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
6
- import {
7
- BatchCall,
8
- type ContractFunctionInteraction,
9
- type ContractMethod,
10
- getContractClassFromArtifact,
11
- waitForProven,
12
- } from '@aztec/aztec.js/contracts';
4
+ import type { ContractMethod } from '@aztec/aztec.js/contracts';
13
5
  import { publishContractClass, publishInstance } from '@aztec/aztec.js/deployment';
14
6
  import { Fr } from '@aztec/aztec.js/fields';
15
7
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
16
8
  import type { AztecNode } from '@aztec/aztec.js/node';
17
9
  import type { Wallet } from '@aztec/aztec.js/wallet';
18
- import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
19
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
10
+ import { CheatCodes } from '@aztec/aztec/testing';
20
11
  import { SPONSORED_FPC_SALT } from '@aztec/constants';
21
12
  import { isAnvilTestChain } from '@aztec/ethereum/chain';
22
13
  import { createExtendedL1Client } from '@aztec/ethereum/client';
@@ -30,36 +21,34 @@ import {
30
21
  type ZKPassportArgs,
31
22
  deployAztecL1Contracts,
32
23
  } from '@aztec/ethereum/deploy-aztec-l1-contracts';
33
- import {
34
- DelayedTxUtils,
35
- EthCheatCodes,
36
- EthCheatCodesWithState,
37
- createDelayedL1TxUtilsFromViemWallet,
38
- startAnvil,
39
- } from '@aztec/ethereum/test';
24
+ import type { Delayer } from '@aztec/ethereum/l1-tx-utils';
25
+ import { EthCheatCodes, EthCheatCodesWithState, startAnvil, warmBlobKzg } from '@aztec/ethereum/test';
26
+ import type { Anvil } from '@aztec/ethereum/test';
27
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
40
28
  import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
41
29
  import { SecretValue } from '@aztec/foundation/config';
42
30
  import { randomBytes } from '@aztec/foundation/crypto/random';
43
31
  import { tryRmDir } from '@aztec/foundation/fs';
44
32
  import { withLoggerBindings } from '@aztec/foundation/log/server';
45
33
  import { retryUntil } from '@aztec/foundation/retry';
46
- import { sleep } from '@aztec/foundation/sleep';
47
34
  import { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
48
- import type { DataStoreConfig } from '@aztec/kv-store/config';
49
35
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
50
36
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
51
37
  import type { P2PClientDeps } from '@aztec/p2p';
52
38
  import { MockGossipSubNetwork, getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
53
39
  import { protocolContractsHash } from '@aztec/protocol-contracts';
54
- import { type ProverNode, type ProverNodeConfig, type ProverNodeDeps, createProverNode } from '@aztec/prover-node';
55
- import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
40
+ import type { ProverNodeConfig } from '@aztec/prover-node';
41
+ import { type PXEConfig, type PXECreationOptions, getPXEConfig } from '@aztec/pxe/server';
56
42
  import type { SequencerClient } from '@aztec/sequencer-client';
57
- import type { TestSequencerClient } from '@aztec/sequencer-client/test';
43
+ import { AuthRegistryArtifact, getStandardAuthRegistry } from '@aztec/standard-contracts/auth-registry';
44
+ import { HandshakeRegistryArtifact, getStandardHandshakeRegistry } from '@aztec/standard-contracts/handshake-registry';
45
+ import { PublicChecksArtifact, getStandardPublicChecks } from '@aztec/standard-contracts/public-checks';
46
+ import { ARTIFACT_VERSION_BEFORE_INJECTION } from '@aztec/stdlib/abi';
58
47
  import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
59
- import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
48
+ import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
60
49
  import { tryStop } from '@aztec/stdlib/interfaces/server';
61
- import type { P2PClientType } from '@aztec/stdlib/p2p';
62
50
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
51
+ import type { GenesisData } from '@aztec/stdlib/world-state';
63
52
  import {
64
53
  type TelemetryClient,
65
54
  type TelemetryClientConfig,
@@ -67,10 +56,9 @@ import {
67
56
  initTelemetryClient,
68
57
  } from '@aztec/telemetry-client';
69
58
  import { BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
70
- import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
59
+ import { createFundedInitializerlessAccounts } from '@aztec/wallets/testing';
71
60
  import { getGenesisValues } from '@aztec/world-state/testing';
72
61
 
73
- import type { Anvil } from '@viem/anvil';
74
62
  import fs from 'fs/promises';
75
63
  import { tmpdir } from 'os';
76
64
  import path from 'path';
@@ -89,6 +77,7 @@ import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS }
89
77
  import { getACVMConfig } from './get_acvm_config.js';
90
78
  import { getBBConfig } from './get_bb_config.js';
91
79
  import { isMetricsLoggingRequested, setupMetricsLogger } from './logging.js';
80
+ import { testSpan } from './timing.js';
92
81
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
93
82
 
94
83
  export { startAnvil };
@@ -121,6 +110,8 @@ export async function setupSharedBlobStorage(config: { dataDirectory?: string }
121
110
  /**
122
111
  * Sets up Private eXecution Environment (PXE) and returns the corresponding test wallet.
123
112
  * @param aztecNode - An instance of Aztec Node.
113
+ * @param nodeDebug - The node's debug API, used to register public function signatures for named traces; pass
114
+ * `undefined` when the node does not expose it.
124
115
  * @param opts - Partial configuration for the PXE.
125
116
  * @param logger - The logger to be used.
126
117
  * @param actor - Actor label to include in log output (e.g., 'pxe-test').
@@ -128,6 +119,7 @@ export async function setupSharedBlobStorage(config: { dataDirectory?: string }
128
119
  */
129
120
  export async function setupPXEAndGetWallet(
130
121
  aztecNode: AztecNode,
122
+ nodeDebug: AztecNodeDebug | undefined,
131
123
  opts: Partial<PXEConfig> = {},
132
124
  logger = getLogger(),
133
125
  actor?: string,
@@ -148,7 +140,10 @@ export async function setupPXEAndGetWallet(
148
140
 
149
141
  const teardown = configuredDataDirectory ? () => Promise.resolve() : () => tryRmDir(PXEConfig.dataDirectory!);
150
142
 
151
- const wallet = await TestWallet.create(aztecNode, PXEConfig, { loggerActorLabel: actor });
143
+ const wallet = await TestWallet.create(aztecNode, PXEConfig, {
144
+ loggerActorLabel: actor,
145
+ nodeDebug,
146
+ });
152
147
 
153
148
  return {
154
149
  wallet,
@@ -158,7 +153,7 @@ export async function setupPXEAndGetWallet(
158
153
  }
159
154
 
160
155
  /** Options for the e2e tests setup */
161
- export type SetupOptions = {
156
+ export type SetupOptions<TDeployExtraL1ContractsReturnType = unknown> = {
162
157
  /** State load */
163
158
  stateLoad?: string;
164
159
  /** Whether to enable metrics collection, if undefined, metrics collection is disabled */
@@ -167,10 +162,11 @@ export type SetupOptions = {
167
162
  deployL1ContractsValues?: DeployAztecL1ContractsReturnType;
168
163
  /** Initial fee juice for default accounts */
169
164
  initialAccountFeeJuice?: Fr;
170
- /** Number of initial accounts funded with fee juice */
171
- numberOfInitialFundedAccounts?: number;
172
- /** Data of the initial funded accounts */
173
- initialFundedAccounts?: InitialAccountData[];
165
+ /**
166
+ * Extra accounts to fund at genesis beyond the `numberOfAccounts` initializerless accounts that setup
167
+ * creates. Setup funds these but does NOT create or deploy them — the test creates/deploys them itself
168
+ */
169
+ additionallyFundedAccounts?: InitialAccountData[];
174
170
  /** An initial set of validators */
175
171
  initialValidators?: (Operator & { privateKey: `0x${string}` })[];
176
172
  /** Anvil Start time */
@@ -187,40 +183,69 @@ export type SetupOptions = {
187
183
  proverNodeConfig?: Partial<ProverNodeConfig>;
188
184
  /** Whether to use a mock gossip sub network for p2p clients. */
189
185
  mockGossipSubNetwork?: boolean;
190
- /** Whether to disable the anvil test watcher (can still be manually started) */
191
- disableAnvilTestWatcher?: boolean;
192
- /** Whether to enable anvil automine during deployment of L1 contracts (consider defaulting this to true). */
186
+ /** Whether to add simulated latency to the mock gossipsub network (in ms) */
187
+ mockGossipSubNetworkLatency?: number;
188
+ /**
189
+ * Whether to mine the L1 setup txs (Multicall3 + rollup contract deployment) under anvil automine
190
+ * instead of waiting on the block interval. Defaults to `true` (set in `setupInner`); only suites
191
+ * that assert on genesis-relative L1 timing need to opt out with `false`.
192
+ */
193
193
  automineL1Setup?: boolean;
194
+ /**
195
+ * Hook invoked after the Aztec L1 rollup contracts are deployed but BEFORE the node/sequencer
196
+ * start, while anvil automine is still enabled (when `automineL1Setup` is true, the default).
197
+ * Deploy extra L1 contracts a test needs here (e.g. a cross-chain token portal + ERC20) so they
198
+ * mine instantly under automine instead of paying the L1 block interval once the node is running
199
+ * (and racing the live sequencer/archiver). The resolved value is exposed on the returned context
200
+ * as `extraL1DeployResult`. The hook receives setup's L1 deployer client (the same one used to
201
+ * deploy Multicall3).
202
+ */
203
+ deployExtraL1Contracts?: (deps: {
204
+ l1Client: ExtendedViemWalletClient;
205
+ deployL1ContractsValues: DeployAztecL1ContractsReturnType;
206
+ logger: Logger;
207
+ }) => Promise<TDeployExtraL1ContractsReturnType>;
194
208
  /** How many accounts to seed and unlock in anvil. */
195
209
  anvilAccounts?: number;
196
210
  /** Port to start anvil (defaults to 8545) */
197
211
  anvilPort?: number;
212
+ /**
213
+ * Number of slots per epoch for Anvil's finality simulation.
214
+ * Anvil reports `finalized = latest - slotsInAnEpoch * 2`.
215
+ */
216
+ anvilSlotsInAnEpoch?: number;
198
217
  /** Key to use for publishing L1 contracts */
199
218
  l1PublisherKey?: SecretValue<`0x${string}`>;
200
219
  /** ZkPassport configuration (domain, scope, mock verifier) */
201
220
  zkPassportArgs?: ZKPassportArgs;
202
221
  /** Whether to fund the sponsored FPC in genesis (defaults to false). */
203
222
  fundSponsoredFPC?: boolean;
204
- /** Whether to skip deploying accounts during setup (legacy behavior for tests using deployAccounts helper). */
205
- skipAccountDeployment?: boolean;
206
223
  /** L1 contracts deployment arguments. */
207
224
  l1ContractsArgs?: Partial<DeployAztecL1ContractsArgs>;
208
- /** Wallet minimum fee padding multiplier (defaults to 0.5, which is 50% padding). */
225
+ /** Wallet minimum fee padding multiplier */
209
226
  walletMinFeePadding?: number;
227
+ /** Whether the initial node should be a lightweight RPC-only node (no sequencer, no validator).
228
+ * Use for tests that create their own validator nodes and don't need the initial sequencer. */
229
+ skipInitialSequencer?: boolean;
230
+ /** Whether to swap the production Sequencer for the minimal AutomineSequencer.
231
+ * Use only for single-sequencer non-block-building tests. See AUTOMINE_E2E_OPTS in `fixtures.ts`. */
232
+ useAutomineSequencer?: boolean;
233
+ /** Options forwarded to PXE creation (e.g. execution hooks). */
234
+ pxeCreationOptions?: PXECreationOptions;
210
235
  } & Partial<AztecNodeConfig>;
211
236
 
212
237
  /** Context for an end-to-end test as returned by the `setup` function */
213
- export type EndToEndContext = {
238
+ export type EndToEndContext<TDeployExtraL1ContractsReturnType = unknown> = {
214
239
  /** The Anvil instance (only set if anvil was started locally). */
215
240
  anvil: Anvil | undefined;
216
241
  /** The Aztec Node service or client a connected to it. */
217
- aztecNode: AztecNode;
242
+ aztecNode: AztecNode & AztecNodeDebug;
218
243
  /** The Aztec Node as a service. */
219
244
  aztecNodeService: AztecNodeService;
220
245
  /** Client to the Aztec Node admin interface. */
221
246
  aztecNodeAdmin: AztecNodeAdmin;
222
- /** The prover node service (only set if startProverNode is true) */
223
- proverNode: ProverNode | undefined;
247
+ /** The aztec node running the prover node subsystem (only set if startProverNode is true). */
248
+ proverNode: AztecNodeService | undefined;
224
249
  /** A client to the sequencer service. */
225
250
  sequencer: SequencerClient | undefined;
226
251
  /** Return values from deployAztecL1Contracts function. */
@@ -229,8 +254,8 @@ export type EndToEndContext = {
229
254
  config: AztecNodeConfig;
230
255
  /** The Aztec Node configuration (alias for config for backward compatibility). */
231
256
  aztecNodeConfig: AztecNodeConfig;
232
- /** The data for the initial funded accounts. */
233
- initialFundedAccounts: InitialAccountData[];
257
+ /** Data for the extra accounts funded at genesis but not created by setup (the test creates/deploys them). */
258
+ additionallyFundedAccounts: InitialAccountData[];
234
259
  /** The wallet to be used. */
235
260
  wallet: TestWallet;
236
261
  /** The wallets to be used. */
@@ -241,16 +266,20 @@ export type EndToEndContext = {
241
266
  cheatCodes: CheatCodes;
242
267
  /** The cheat codes for L1 */
243
268
  ethCheatCodes: EthCheatCodes;
244
- /** The anvil test watcher. */
245
- watcher: AnvilTestWatcher;
246
269
  /** Allows tweaking current system time, used by the epoch cache only. */
247
270
  dateProvider: TestDateProvider;
248
271
  /** Telemetry client */
249
272
  telemetryClient: TelemetryClient;
250
273
  /** Mock gossip sub network used for gossipping messages (only if mockGossipSubNetwork was set to true in opts) */
251
274
  mockGossipSubNetwork: MockGossipSubNetwork | undefined;
252
- /** Prefilled public data used for setting up nodes. */
253
- prefilledPublicData: PublicDataTreeLeaf[] | undefined;
275
+ /** Delayer for sequencer L1 txs (only when enableDelayer is true). */
276
+ sequencerDelayer: Delayer | undefined;
277
+ /** Delayer for prover node L1 txs (only when enableDelayer and startProverNode are true). */
278
+ proverDelayer: Delayer | undefined;
279
+ /** Genesis data used for setting up nodes. */
280
+ genesis: GenesisData | undefined;
281
+ /** Resolved value of the `deployExtraL1Contracts` setup hook, if one was provided. */
282
+ extraL1DeployResult: TDeployExtraL1ContractsReturnType;
254
283
  /** ACVM config (only set if running locally). */
255
284
  acvmConfig: Awaited<ReturnType<typeof getACVMConfig>>;
256
285
  /** BB config (only set if running locally). */
@@ -261,22 +290,75 @@ export type EndToEndContext = {
261
290
  teardown: () => Promise<void>;
262
291
  };
263
292
 
293
+ /**
294
+ * When CONTRACT_ARTIFACTS_VERSION is set (backwards compatibility testing), asserts that the loaded artifact's
295
+ * aztecVersion matches the expected version. This is a sanity check verifying that the legacy artifact resolver
296
+ * actually swapped in the correct version.
297
+ */
298
+ function assertContractArtifactsVersion() {
299
+ const expected = process.env.CONTRACT_ARTIFACTS_VERSION;
300
+ if (!expected) {
301
+ return;
302
+ }
303
+ const { aztecVersion } = SponsoredFPCContract.artifact;
304
+ // TODO(F-557): Remove this bypass once pre-version artifacts are no longer tested.
305
+ if (aztecVersion === ARTIFACT_VERSION_BEFORE_INJECTION) {
306
+ createLogger('e2e:setup').info(
307
+ `Skipping artifact version check: artifact predates version injection (CONTRACT_ARTIFACTS_VERSION=${expected})`,
308
+ );
309
+ return;
310
+ }
311
+ if (aztecVersion !== expected) {
312
+ throw new Error(
313
+ `Artifact version mismatch: expected ${expected} but got ${aztecVersion}. ` +
314
+ `The legacy artifact resolver may not have swapped in the correct version.`,
315
+ );
316
+ }
317
+ }
318
+
264
319
  /**
265
320
  * Sets up the environment for the end-to-end tests.
266
321
  * @param numberOfAccounts - The number of new accounts to be created once the PXE is initiated.
267
322
  * @param opts - Options to pass to the node initialization and to the setup script.
268
323
  * @param pxeOpts - Options to pass to the PXE initialization.
269
324
  */
270
- export async function setup(
325
+ export function setup<TDeployExtraL1ContractsReturnType = unknown>(
271
326
  numberOfAccounts = 1,
272
- opts: SetupOptions = {},
327
+ opts: SetupOptions<TDeployExtraL1ContractsReturnType> = {},
273
328
  pxeOpts: Partial<PXEConfig> = {},
274
329
  chain: Chain = foundry,
275
- ): Promise<EndToEndContext> {
330
+ ): Promise<EndToEndContext<TDeployExtraL1ContractsReturnType>> {
331
+ // Tag the top-level env spin-up with the prover mode (none → fake → real), the largest config-driven
332
+ // swing in setup cost, so the three factories are comparable on the span leaderboard. The internals
333
+ // (anvil / l1-deploy / sequencer-start / pxe / wallet:create) decompose this further.
334
+ const proverMode = opts.realProofs ? 'real' : opts.startProverNode ? 'fake' : 'none';
335
+ return testSpan(`setup:env:${proverMode}`, async () => {
336
+ const ctx = await setupInner(numberOfAccounts, opts, pxeOpts, chain);
337
+ if (process.env.EXIT_E2E_AFTER_SETUP) {
338
+ ctx.logger.info('EXIT_E2E_AFTER_SETUP is set; aborting before the test body runs');
339
+ throw new Error('EXIT_E2E_AFTER_SETUP');
340
+ }
341
+ return ctx;
342
+ });
343
+ }
344
+
345
+ async function setupInner<TDeployExtraL1ContractsReturnType = unknown>(
346
+ numberOfAccounts: number,
347
+ opts: SetupOptions<TDeployExtraL1ContractsReturnType>,
348
+ pxeOpts: Partial<PXEConfig>,
349
+ chain: Chain,
350
+ ): Promise<EndToEndContext<TDeployExtraL1ContractsReturnType>> {
351
+ assertContractArtifactsVersion();
352
+ const logger = getLogger();
276
353
  let anvil: Anvil | undefined;
277
354
  try {
278
355
  opts.aztecTargetCommitteeSize ??= 0;
279
- opts.slasherFlavor ??= 'none';
356
+ opts.slasherEnabled ??= false;
357
+ // Mine the L1 setup txs (Multicall3 + rollup contract deployment) immediately instead of
358
+ // waiting on anvil's block interval — this is the dominant cost of e2e setup. Suites that
359
+ // assert on genesis-relative L1 timing can opt out by passing `automineL1Setup: false`.
360
+ opts.automineL1Setup ??= true;
361
+ logger.trace('Starting e2e test setup');
280
362
 
281
363
  const config: AztecNodeConfig & SetupOptions = { ...getConfigEnvVars(), ...opts };
282
364
  // use initialValidators for the node config
@@ -286,11 +368,11 @@ export async function setup(
286
368
  config.maxPendingTxCount = opts.maxPendingTxCount ?? TEST_MAX_PENDING_TX_POOL_COUNT;
287
369
  // For tests we only want proving enabled if specifically requested
288
370
  config.realProofs = !!opts.realProofs;
289
- // Only enforce the time table if requested
290
- config.enforceTimeTable = !!opts.enforceTimeTable;
371
+ // Enable the tx delayer for tests (default config has it disabled, so we force-enable it here)
372
+ config.enableDelayer = true;
291
373
  config.listenAddress = '127.0.0.1';
292
374
 
293
- const logger = getLogger();
375
+ config.minTxPoolAgeMs = opts.minTxPoolAgeMs ?? 0;
294
376
 
295
377
  // Create a temp directory for any services that need it and cleanup later
296
378
  const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex'));
@@ -299,18 +381,25 @@ export async function setup(
299
381
  config.dataDirectory = directoryToCleanup;
300
382
  }
301
383
 
384
+ const dateProvider = new TestDateProvider();
385
+
302
386
  if (!config.l1RpcUrls?.length) {
303
387
  if (!isAnvilTestChain(chain.id)) {
304
388
  throw new Error(`No ETHEREUM_HOSTS set but non anvil chain requested`);
305
389
  }
306
- const res = await startAnvil({
307
- l1BlockTime: opts.ethereumSlotDuration,
308
- accounts: opts.anvilAccounts,
309
- port: opts.anvilPort ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : undefined),
310
- });
390
+ const res = await testSpan('setup:env:anvil', () =>
391
+ startAnvil({
392
+ l1BlockTime: opts.ethereumSlotDuration,
393
+ accounts: opts.anvilAccounts,
394
+ port: opts.anvilPort ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : undefined),
395
+ slotsInAnEpoch: opts.anvilSlotsInAnEpoch,
396
+ dateProvider,
397
+ }),
398
+ );
311
399
  anvil = res.anvil;
312
400
  config.l1RpcUrls = [res.rpcUrl];
313
401
  }
402
+ logger.trace('Started anvil and L1 RPC client');
314
403
 
315
404
  // Enable logging metrics to a local file named after the test suite
316
405
  if (isMetricsLoggingRequested()) {
@@ -318,8 +407,6 @@ export async function setup(
318
407
  logger.info(`Logging metrics to ${filename}`);
319
408
  setupMetricsLogger(filename);
320
409
  }
321
-
322
- const dateProvider = new TestDateProvider();
323
410
  const ethCheatCodes = new EthCheatCodesWithState(config.l1RpcUrls, dateProvider);
324
411
 
325
412
  if (opts.stateLoad) {
@@ -329,6 +416,7 @@ export async function setup(
329
416
  if (opts.l1StartTime) {
330
417
  await ethCheatCodes.warp(opts.l1StartTime, { resetBlockInterval: true });
331
418
  }
419
+ logger.trace('Initialized L1 cheat codes and applied state/time overrides');
332
420
 
333
421
  let publisherPrivKeyHex: `0x${string}` | undefined = undefined;
334
422
  let publisherHdAccount: HDAccount | PrivateKeyAccount | undefined = undefined;
@@ -337,11 +425,11 @@ export async function setup(
337
425
  publisherPrivKeyHex = opts.l1PublisherKey.getValue();
338
426
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
339
427
  } else if (
340
- config.publisherPrivateKeys &&
341
- config.publisherPrivateKeys.length > 0 &&
342
- config.publisherPrivateKeys[0].getValue() != NULL_KEY
428
+ config.sequencerPublisherPrivateKeys &&
429
+ config.sequencerPublisherPrivateKeys.length > 0 &&
430
+ config.sequencerPublisherPrivateKeys[0].getValue() != NULL_KEY
343
431
  ) {
344
- publisherPrivKeyHex = config.publisherPrivateKeys[0].getValue();
432
+ publisherPrivKeyHex = config.sequencerPublisherPrivateKeys[0].getValue();
345
433
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
346
434
  } else if (!MNEMONIC) {
347
435
  throw new Error(`Mnemonic not provided and no publisher private key`);
@@ -350,30 +438,36 @@ export async function setup(
350
438
  const publisherPrivKeyRaw = publisherHdAccount.getHdKey().privateKey;
351
439
  const publisherPrivKey = publisherPrivKeyRaw === null ? null : Buffer.from(publisherPrivKeyRaw);
352
440
  publisherPrivKeyHex = `0x${publisherPrivKey!.toString('hex')}` as const;
353
- config.publisherPrivateKeys = [new SecretValue(publisherPrivKeyHex)];
441
+ config.sequencerPublisherPrivateKeys = [new SecretValue(publisherPrivKeyHex)];
354
442
  }
355
443
 
356
444
  if (config.coinbase === undefined) {
357
445
  config.coinbase = EthAddress.fromString(publisherHdAccount.address);
358
446
  }
447
+ logger.trace('Resolved L1 publisher account');
359
448
 
360
- // Determine which addresses to fund in genesis
361
- const initialFundedAccounts =
362
- opts.initialFundedAccounts ??
363
- (await generateSchnorrAccounts(opts.numberOfInitialFundedAccounts ?? Math.max(numberOfAccounts, 10)));
364
- const addressesToFund = initialFundedAccounts.map(a => a.address);
449
+ // The accounts setup creates itself: `numberOfAccounts` initializerless accounts, generated here and
450
+ // funded at genesis so they are immediately usable.
451
+ const defaultAccounts = await generateSchnorrAccounts(numberOfAccounts);
452
+ // Extra accounts the test wants funded at genesis but will create/deploy itself.
453
+ const additionallyFundedAccounts = opts.additionallyFundedAccounts ?? [];
454
+ const addressesToFund = [...defaultAccounts, ...additionallyFundedAccounts].map(a => a.address);
365
455
 
366
456
  // Optionally fund the sponsored FPC
367
457
  if (opts.fundSponsoredFPC) {
368
458
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
369
459
  addressesToFund.push(sponsoredFPCAddress);
370
460
  }
461
+ logger.trace('Generated test accounts to fund at genesis');
371
462
 
372
- const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(
463
+ const genesisTimestamp = BigInt(Math.floor(Date.now() / 1000));
464
+ const { genesisArchiveRoot, genesis, fundingNeeded } = await getGenesisValues(
373
465
  addressesToFund,
374
466
  opts.initialAccountFeeJuice,
375
467
  opts.genesisPublicData,
468
+ genesisTimestamp,
376
469
  );
470
+ logger.trace('Computed genesis values');
377
471
 
378
472
  const wasAutomining = await ethCheatCodes.isAutoMining();
379
473
  const enableAutomine = opts.automineL1Setup && !wasAutomining && isAnvilTestChain(chain.id);
@@ -383,18 +477,21 @@ export async function setup(
383
477
 
384
478
  const l1Client = createExtendedL1Client(config.l1RpcUrls, publisherHdAccount!, chain);
385
479
 
480
+ // Warm both KZG trusted setups (ours + anvil's) in parallel
481
+ if (anvil && isAnvilTestChain(chain.id)) {
482
+ await warmBlobKzg(l1Client, logger);
483
+ }
484
+
386
485
  // Deploy Multicall3 if running locally
387
486
  await deployMulticall3(l1Client, logger);
388
487
 
389
488
  // Force viem to refresh its nonce cache to avoid "nonce too low" errors in subsequent transactions
390
489
  // This is necessary because deployMulticall3 sends multiple transactions and viem may cache a stale nonce
391
490
  await l1Client.getTransactionCount({ address: l1Client.account.address });
491
+ logger.trace('Deployed Multicall3');
392
492
 
393
- const deployL1ContractsValues: DeployAztecL1ContractsReturnType = await deployAztecL1Contracts(
394
- config.l1RpcUrls[0],
395
- publisherPrivKeyHex!,
396
- chain.id,
397
- {
493
+ const deployL1ContractsValues: DeployAztecL1ContractsReturnType = await testSpan('setup:env:l1-deploy', () =>
494
+ deployAztecL1Contracts(config.l1RpcUrls[0], publisherPrivKeyHex!, chain.id, {
398
495
  ...getL1ContractsConfigEnvVars(),
399
496
  ...opts,
400
497
  ...opts.l1ContractsArgs,
@@ -404,76 +501,96 @@ export async function setup(
404
501
  initialValidators: opts.initialValidators,
405
502
  feeJuicePortalInitialBalance: fundingNeeded,
406
503
  realVerifier: false,
407
- },
504
+ }),
408
505
  );
409
506
 
410
- config.l1Contracts = deployL1ContractsValues.l1ContractAddresses;
507
+ Object.assign(config, deployL1ContractsValues.l1ContractAddresses);
411
508
  config.rollupVersion = deployL1ContractsValues.rollupVersion;
412
509
 
413
- if (enableAutomine) {
414
- await ethCheatCodes.setAutomine(false);
415
- await ethCheatCodes.setIntervalMining(config.ethereumSlotDuration);
416
- dateProvider.setTime((await ethCheatCodes.timestamp()) * 1000);
510
+ // Propagate L1-contracts-config overrides back to the node config so the archiver's
511
+ // `l1Constants` (and any other node-side consumer) agrees with what was actually deployed.
512
+ // Without this, a per-test override like `aztecEpochDuration: 4` lands on the rollup contract
513
+ // but the node config keeps the default (32), so `archiver.isEpochComplete(0)` computes
514
+ // `endSlot=31` and `EpochTestSettler`/`EpochMonitor` never fires — letting the
515
+ // `aztecProofSubmissionEpochs` window expire mid-test and prune the pending chain.
516
+ // Skip undefined values: callers (e.g. `P2PNetworkTest`) sometimes build `l1ContractsArgs`
517
+ // by spreading a partial `AztecNodeConfig`, which leaves unset fields (notably `dataDirectory`)
518
+ // as `undefined`. A blind Object.assign would then clobber the temp `dataDirectory` set earlier
519
+ // in this function and crash `setupSharedBlobStorage`.
520
+ if (opts.l1ContractsArgs) {
521
+ for (const [key, value] of Object.entries(opts.l1ContractsArgs)) {
522
+ if (value !== undefined) {
523
+ (config as unknown as Record<string, unknown>)[key] = value;
524
+ }
525
+ }
417
526
  }
418
527
 
419
- if (opts.l2StartTime) {
420
- await ethCheatCodes.warp(opts.l2StartTime, { resetBlockInterval: true });
528
+ // Deploy any test-specific L1 contracts while automine is still on and before the node starts,
529
+ // so they mine instantly rather than paying the L1 block interval once the sequencer is live.
530
+ let extraL1DeployResult: TDeployExtraL1ContractsReturnType = undefined as TDeployExtraL1ContractsReturnType;
531
+ if (opts.deployExtraL1Contracts) {
532
+ logger.trace('Running deployExtraL1Contracts hook');
533
+ extraL1DeployResult = await opts.deployExtraL1Contracts({
534
+ l1Client,
535
+ deployL1ContractsValues,
536
+ logger,
537
+ });
538
+ // The hook reused `l1Client` to send deploy txs, so refresh viem's nonce cache to avoid a
539
+ // stale cached nonce for later transactions on the publisher account.
540
+ await l1Client.getTransactionCount({ address: l1Client.account.address });
421
541
  }
422
542
 
423
- const watcher = new AnvilTestWatcher(
424
- new EthCheatCodesWithState(config.l1RpcUrls, dateProvider),
425
- deployL1ContractsValues.l1ContractAddresses.rollupAddress,
426
- deployL1ContractsValues.l1Client,
427
- dateProvider,
428
- );
429
- if (!opts.disableAnvilTestWatcher) {
430
- await watcher.start();
543
+ if (enableAutomine) {
544
+ await ethCheatCodes.startIntervalMiningWithFreshBlock(config.ethereumSlotDuration);
431
545
  }
432
546
 
433
- // Use metricsPort-based telemetry if provided, otherwise use the regular telemetry client
434
- const telemetryClient = opts.metricsPort
435
- ? await getEndToEndTestTelemetryClient(opts.metricsPort)
436
- : await getTelemetryClient(opts.telemetryConfig);
437
-
438
- await setupSharedBlobStorage(config);
547
+ // In compose mode (no local anvil), sync dateProvider to L1 time since it may have drifted
548
+ // ahead of system time. When running with a local anvil, the dateProvider is kept in sync via
549
+ // the stdout listener.
550
+ if (!anvil) {
551
+ dateProvider.setTime((await ethCheatCodes.lastBlockTimestamp()) * 1000);
552
+ }
439
553
 
440
- logger.verbose('Creating and synching an aztec node', config);
554
+ if (opts.l2StartTime) {
555
+ await ethCheatCodes.warp(opts.l2StartTime, { resetBlockInterval: true });
556
+ }
557
+ logger.trace('Deployed L1 rollup contracts');
558
+
559
+ // These boot steps are independent and write disjoint config keys, so run them concurrently:
560
+ // telemetry returns a client (no config write), shared blob storage writes blobFileStore* keys,
561
+ // and the ACVM/BB config resolvers write their own acvm*/bb* keys.
562
+ const [telemetryClient, , acvmConfig, bbConfig] = await Promise.all([
563
+ // Use metricsPort-based telemetry if provided, otherwise use the regular telemetry client
564
+ opts.metricsPort ? getEndToEndTestTelemetryClient(opts.metricsPort) : getTelemetryClient(opts.telemetryConfig),
565
+ setupSharedBlobStorage(config),
566
+ getACVMConfig(logger),
567
+ getBBConfig(logger),
568
+ ]);
569
+ logger.trace('Created telemetry client');
570
+ logger.trace('Set up shared blob storage');
441
571
 
442
- const acvmConfig = await getACVMConfig(logger);
443
572
  if (acvmConfig) {
444
573
  config.acvmWorkingDirectory = acvmConfig.acvmWorkingDirectory;
445
574
  config.acvmBinaryPath = acvmConfig.acvmBinaryPath;
446
575
  }
576
+ logger.trace('Resolved ACVM config');
447
577
 
448
- const bbConfig = await getBBConfig(logger);
449
578
  if (bbConfig) {
450
579
  config.bbBinaryPath = bbConfig.bbBinaryPath;
451
580
  config.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
452
581
  }
582
+ logger.trace('Resolved Barretenberg config');
583
+
584
+ logger.verbose('Creating and synching an aztec node', config);
453
585
 
454
586
  let mockGossipSubNetwork: MockGossipSubNetwork | undefined;
455
- let p2pClientDeps: P2PClientDeps<P2PClientType.Full> | undefined = undefined;
587
+ let p2pClientDeps: P2PClientDeps | undefined = undefined;
456
588
 
457
589
  if (opts.mockGossipSubNetwork) {
458
- mockGossipSubNetwork = new MockGossipSubNetwork();
590
+ mockGossipSubNetwork = new MockGossipSubNetwork(opts.mockGossipSubNetworkLatency);
459
591
  p2pClientDeps = { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) };
460
592
  }
461
593
 
462
- // Transactions built against the genesis state must be included in block 1, otherwise they are dropped.
463
- // To avoid test failures from dropped transactions, we ensure progression beyond genesis before proceeding.
464
- // For account deployments, we set minTxsPerBlock=1 and deploy accounts sequentially for guaranteed success.
465
- // If no accounts need deployment, we await an empty block to confirm network progression.
466
- const originalMinTxsPerBlock = config.minTxsPerBlock;
467
- if (originalMinTxsPerBlock === undefined) {
468
- throw new Error('minTxsPerBlock is undefined in e2e test setup');
469
- }
470
-
471
- // Only set minTxsPerBlock=1 if we're going to deploy accounts and need reliable block inclusion
472
- const shouldDeployAccounts = numberOfAccounts > 0 && !opts.skipAccountDeployment;
473
- // Only set minTxsPerBlock=0 if we need an empty block (no accounts at all, not skipped deployment)
474
- const needsEmptyBlock = numberOfAccounts === 0 && !opts.skipAccountDeployment;
475
- config.minTxsPerBlock = shouldDeployAccounts ? 1 : needsEmptyBlock ? 0 : originalMinTxsPerBlock;
476
-
477
594
  config.p2pEnabled = opts.mockGossipSubNetwork || config.p2pEnabled;
478
595
  config.p2pIp = opts.p2pIp ?? config.p2pIp ?? '127.0.0.1';
479
596
 
@@ -483,57 +600,81 @@ export async function setup(
483
600
  }
484
601
  }
485
602
 
486
- const aztecNodeService = await withLoggerBindings({ actor: 'node-0' }, () =>
487
- AztecNodeService.createAndSync(
488
- config,
489
- { dateProvider, telemetry: telemetryClient, p2pClientDeps },
490
- { prefilledPublicData },
603
+ // When skipInitialSequencer is set, the initial node is a lightweight RPC-only node.
604
+ // We apply these overrides to a copy so they don't leak into the returned config.
605
+ // Keep P2P enabled if mockGossipSubNetwork is used (needed for tx propagation to validators).
606
+ const initialNodeConfig = opts.skipInitialSequencer
607
+ ? {
608
+ ...config,
609
+ disableValidator: true,
610
+ ...(opts.mockGossipSubNetwork ? {} : { p2pEnabled: false, bootstrapNodes: [] as string[] }),
611
+ }
612
+ : config;
613
+ logger.trace('Prepared aztec node config');
614
+
615
+ const aztecNodeService = await testSpan('setup:env:sequencer-start', () =>
616
+ withLoggerBindings({ actor: 'node-0' }, () =>
617
+ createAztecNodeService(
618
+ initialNodeConfig,
619
+ { dateProvider, telemetry: telemetryClient, p2pClientDeps },
620
+ { genesis, dontStartSequencer: opts.skipInitialSequencer },
621
+ ),
491
622
  ),
492
623
  );
493
624
  const sequencerClient = aztecNodeService.getSequencer();
625
+ logger.trace('Created and synced aztec node');
494
626
 
495
- if (sequencerClient) {
496
- const publisher = (sequencerClient as TestSequencerClient).sequencer.publisher;
497
- publisher.l1TxUtils = DelayedTxUtils.fromL1TxUtils(publisher.l1TxUtils, config.ethereumSlotDuration, l1Client);
498
- }
499
-
500
- let proverNode: ProverNode | undefined = undefined;
627
+ let proverNode: AztecNodeService | undefined = undefined;
501
628
  if (opts.startProverNode) {
502
629
  logger.verbose('Creating and syncing a simulated prover node...');
503
630
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
504
631
  const proverNodePrivateKeyHex: Hex = `0x${proverNodePrivateKey!.toString('hex')}`;
505
632
  const proverNodeDataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
506
- const proverNodeConfig = {
507
- ...config.proverNodeConfig,
508
- dataDirectory: proverNodeDataDirectory,
509
- p2pEnabled: !!mockGossipSubNetwork,
633
+
634
+ const p2pClientDeps: Partial<P2PClientDeps> = {
635
+ p2pServiceFactory: mockGossipSubNetwork && getMockPubSubP2PServiceFactory(mockGossipSubNetwork!),
636
+ rpcTxProviders: [aztecNodeService],
510
637
  };
511
- proverNode = await createAndSyncProverNode(
512
- proverNodePrivateKeyHex,
513
- config,
514
- proverNodeConfig,
515
- aztecNodeService,
516
- prefilledPublicData,
517
- {
518
- p2pClientDeps: mockGossipSubNetwork
519
- ? { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) }
520
- : undefined,
521
- },
522
- );
638
+
639
+ ({ proverNode } = await testSpan('setup:env:prover-node', () =>
640
+ createAndSyncProverNode(
641
+ proverNodePrivateKeyHex,
642
+ config,
643
+ {
644
+ ...config.proverNodeConfig,
645
+ dataDirectory: proverNodeDataDirectory,
646
+ },
647
+ { dateProvider, p2pClientDeps, telemetry: telemetryClient },
648
+ { genesis },
649
+ ),
650
+ ));
651
+ logger.trace('Created prover node');
523
652
  }
524
653
 
654
+ const sequencerDelayer = sequencerClient?.getDelayer();
655
+ const proverDelayer = proverNode?.getProverNode()?.getDelayer();
656
+
525
657
  logger.verbose('Creating a pxe...');
526
658
  const pxeConfig = { ...getPXEConfig(), ...pxeOpts };
527
659
  pxeConfig.dataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
528
660
  // For tests we only want proving enabled if specifically requested
529
661
  pxeConfig.proverEnabled = !!pxeOpts.proverEnabled;
530
- const wallet = await TestWallet.create(aztecNodeService, pxeConfig, { loggerActorLabel: 'pxe-0' });
662
+ const wallet = await testSpan('setup:env:pxe', () =>
663
+ TestWallet.create(aztecNodeService, pxeConfig, {
664
+ loggerActorLabel: 'pxe-0',
665
+ // In-process node implements the debug API, so register public function signatures for named traces.
666
+ nodeDebug: aztecNodeService,
667
+ ...opts.pxeCreationOptions,
668
+ }),
669
+ );
531
670
 
532
671
  if (opts.walletMinFeePadding !== undefined) {
533
672
  wallet.setMinFeePadding(opts.walletMinFeePadding);
534
673
  }
674
+ logger.trace('Created PXE and test wallet');
535
675
 
536
676
  const cheatCodes = await CheatCodes.create(config.l1RpcUrls, aztecNodeService, dateProvider);
677
+ logger.trace('Created cheat codes');
537
678
 
538
679
  if (
539
680
  (opts.aztecTargetCommitteeSize && opts.aztecTargetCommitteeSize > 0) ||
@@ -547,64 +688,48 @@ export async function setup(
547
688
  );
548
689
  await cheatCodes.rollup.setupEpoch();
549
690
  await cheatCodes.rollup.debugRollup();
691
+ logger.trace('Advanced chain to set up validator committee');
550
692
  }
551
693
 
552
694
  let accounts: AztecAddress[] = [];
553
695
 
554
- if (shouldDeployAccounts) {
555
- logger.info(
556
- `${numberOfAccounts} accounts are being deployed. Reliably progressing past genesis by setting minTxsPerBlock to 1 and waiting for the accounts to be deployed`,
557
- );
558
- const accountsData = initialFundedAccounts.slice(0, numberOfAccounts);
559
- const accountManagers = await deployFundedSchnorrAccounts(wallet, accountsData);
560
- accounts = accountManagers.map(accountManager => accountManager.address);
561
- } else if (needsEmptyBlock) {
562
- logger.info('No accounts are being deployed, waiting for an empty block 1 to be mined');
563
- while ((await aztecNodeService.getBlockNumber()) === 0) {
564
- await sleep(2000);
565
- }
696
+ // Create the default accounts. They are initializerless, so this is a PXE-side operation (registration
697
+ // + a simulated store call) with no on-chain tx, independent of the sequencer.
698
+ if (numberOfAccounts > 0) {
699
+ logger.info(`Creating ${numberOfAccounts} initializerless test accounts`);
700
+ await testSpan('wallet:create', () => createFundedInitializerlessAccounts(wallet, defaultAccounts));
701
+ accounts = defaultAccounts.map(a => a.address);
566
702
  }
567
- // If skipAccountDeployment is true, we don't deploy or wait - tests will handle account deployment later
703
+ logger.trace('Created funded test accounts');
568
704
 
569
- // Now we restore the original minTxsPerBlock setting if we changed it.
570
- if (sequencerClient && config.minTxsPerBlock !== originalMinTxsPerBlock) {
571
- sequencerClient.getSequencer().updateConfig({ minTxsPerBlock: originalMinTxsPerBlock });
572
- }
573
-
574
- if (initialFundedAccounts.length < numberOfAccounts) {
575
- throw new Error(
576
- `Unable to deploy ${numberOfAccounts} accounts. Only ${initialFundedAccounts.length} accounts were funded.`,
577
- );
578
- }
579
-
580
- const teardown = async () => {
581
- try {
582
- await tryStop(wallet, logger);
583
- await tryStop(aztecNodeService, logger);
584
- await tryStop(proverNode, logger);
705
+ const teardown = () =>
706
+ testSpan('teardown:env', async () => {
707
+ try {
708
+ await tryStop(wallet, logger);
709
+ await tryStop(aztecNodeService, logger);
710
+ await tryStop(proverNode, logger);
585
711
 
586
- if (acvmConfig?.cleanup) {
587
- await acvmConfig.cleanup();
588
- }
712
+ if (acvmConfig?.cleanup) {
713
+ await acvmConfig.cleanup();
714
+ }
589
715
 
590
- if (bbConfig?.cleanup) {
591
- await bbConfig.cleanup();
592
- }
716
+ if (bbConfig?.cleanup) {
717
+ await bbConfig.cleanup();
718
+ }
593
719
 
594
- await tryStop(watcher, logger);
595
- await tryStop(anvil, logger);
720
+ await tryStop(anvil, logger);
596
721
 
597
- await tryRmDir(directoryToCleanup, logger);
598
- } catch (err) {
599
- logger.error(`Error during e2e test teardown`, err);
600
- } finally {
601
- try {
602
- await telemetryClient.stop();
722
+ await tryRmDir(directoryToCleanup, logger);
603
723
  } catch (err) {
604
- logger.error(`Error during telemetry client stop`, err);
724
+ logger.error(`Error during e2e test teardown`, err);
725
+ } finally {
726
+ try {
727
+ await telemetryClient.stop();
728
+ } catch (err) {
729
+ logger.error(`Error during telemetry client stop`, err);
730
+ }
605
731
  }
606
- }
607
- };
732
+ });
608
733
 
609
734
  return {
610
735
  anvil,
@@ -617,17 +742,19 @@ export async function setup(
617
742
  aztecNodeConfig: config,
618
743
  dateProvider,
619
744
  deployL1ContractsValues,
620
- initialFundedAccounts,
745
+ additionallyFundedAccounts,
621
746
  logger,
622
747
  mockGossipSubNetwork,
623
- prefilledPublicData,
748
+ genesis,
749
+ extraL1DeployResult,
624
750
  proverNode,
751
+ sequencerDelayer,
752
+ proverDelayer,
625
753
  sequencer: sequencerClient,
626
754
  teardown,
627
755
  telemetryClient,
628
756
  wallet,
629
757
  accounts,
630
- watcher,
631
758
  acvmConfig,
632
759
  bbConfig,
633
760
  directoryToCleanup,
@@ -694,92 +821,58 @@ export async function registerSponsoredFPC(wallet: Wallet): Promise<void> {
694
821
  await wallet.registerContract(await getSponsoredFPCInstance(), SponsoredFPCContract.artifact);
695
822
  }
696
823
 
697
- export async function waitForProvenChain(node: AztecNode, targetBlock?: BlockNumber, timeoutSec = 60, intervalSec = 1) {
824
+ export async function waitForProvenChain(
825
+ node: AztecNode,
826
+ targetBlock?: BlockNumber,
827
+ timeoutSec = 60,
828
+ intervalSec = 0.25,
829
+ ) {
698
830
  targetBlock ??= await node.getBlockNumber();
699
831
 
700
832
  await retryUntil(
701
- async () => (await node.getProvenBlockNumber()) >= targetBlock,
833
+ async () => (await node.getBlockNumber('proven')) >= targetBlock,
702
834
  'proven chain status',
703
835
  timeoutSec,
704
836
  intervalSec,
705
837
  );
706
838
  }
707
839
 
840
+ /**
841
+ * Creates an AztecNodeService with the prover node enabled as a subsystem.
842
+ * Returns both the aztec node service (for lifecycle management) and the prover node (for test internals access).
843
+ */
708
844
  export function createAndSyncProverNode(
709
845
  proverNodePrivateKey: `0x${string}`,
710
- aztecNodeConfig: AztecNodeConfig,
711
- proverNodeConfig: Partial<ProverNodeConfig> & Pick<DataStoreConfig, 'dataDirectory'> & { dontStart?: boolean },
712
- aztecNode: AztecNode | undefined,
713
- prefilledPublicData: PublicDataTreeLeaf[] = [],
714
- proverNodeDeps: ProverNodeDeps = {},
715
- ) {
846
+ baseConfig: AztecNodeConfig,
847
+ configOverrides: Pick<AztecNodeConfig, 'dataDirectory'>,
848
+ deps: {
849
+ telemetry?: TelemetryClient;
850
+ dateProvider: DateProvider;
851
+ p2pClientDeps?: P2PClientDeps;
852
+ },
853
+ options: { genesis?: GenesisData; dontStart?: boolean },
854
+ ): Promise<{ proverNode: AztecNodeService }> {
716
855
  return withLoggerBindings({ actor: 'prover-0' }, async () => {
717
- const aztecNodeTxProvider = aztecNode && {
718
- getTxByHash: aztecNode.getTxByHash.bind(aztecNode),
719
- getTxsByHash: aztecNode.getTxsByHash.bind(aztecNode),
720
- stop: () => Promise.resolve(),
721
- };
722
-
723
- const blobClient = await createBlobClientWithFileStores(aztecNodeConfig, createLogger('blob-client:prover-node'));
724
-
725
- const archiverConfig = { ...aztecNodeConfig, dataDirectory: proverNodeConfig.dataDirectory };
726
- const archiver = await createArchiver(
727
- archiverConfig,
728
- { blobClient, dateProvider: proverNodeDeps.dateProvider },
729
- { blockUntilSync: true },
730
- );
731
-
732
- const proverConfig: ProverNodeConfig = {
733
- ...aztecNodeConfig,
734
- txCollectionNodeRpcUrls: [],
735
- realProofs: false,
736
- proverAgentCount: 2,
737
- publisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
738
- proverNodeMaxPendingJobs: 10,
739
- proverNodeMaxParallelBlocksPerEpoch: 32,
740
- proverNodePollingIntervalMs: 200,
741
- txGatheringIntervalMs: 1000,
742
- txGatheringBatchSize: 10,
743
- txGatheringMaxParallelRequestsPerNode: 10,
744
- txGatheringTimeoutMs: 24_000,
745
- proverNodeFailedEpochStore: undefined,
746
- proverId: EthAddress.fromNumber(1),
747
- proverNodeEpochProvingDelayMs: undefined,
748
- ...proverNodeConfig,
749
- };
750
-
751
- const l1TxUtils = createDelayedL1TxUtils(
752
- aztecNodeConfig,
753
- proverNodePrivateKey,
754
- 'prover-node',
755
- proverNodeDeps.dateProvider,
856
+ const proverNode = await createAztecNodeService(
857
+ {
858
+ ...baseConfig,
859
+ ...configOverrides,
860
+ p2pPort: 0,
861
+ enableProverNode: true,
862
+ disableValidator: true,
863
+ proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
864
+ },
865
+ deps,
866
+ { genesis: options.genesis, dontStartProverNode: options.dontStart },
756
867
  );
757
868
 
758
- const proverNode = await createProverNode(
759
- proverConfig,
760
- { ...proverNodeDeps, aztecNodeTxProvider, archiver: archiver as Archiver, l1TxUtils },
761
- { prefilledPublicData },
762
- );
763
- getLogger().info(`Created and synced prover node`, { publisherAddress: l1TxUtils.client.account!.address });
764
- if (!proverNodeConfig.dontStart) {
765
- await proverNode.start();
869
+ if (!proverNode.getProverNode()) {
870
+ throw new Error('Prover node subsystem was not created despite enableProverNode being set');
766
871
  }
767
- return proverNode;
768
- });
769
- }
770
872
 
771
- function createDelayedL1TxUtils(
772
- aztecNodeConfig: AztecNodeConfig,
773
- privateKey: `0x${string}`,
774
- logName: string,
775
- dateProvider?: DateProvider,
776
- ) {
777
- const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
778
-
779
- const log = createLogger(logName);
780
- const l1TxUtils = createDelayedL1TxUtilsFromViemWallet(l1Client, log, dateProvider, aztecNodeConfig);
781
- l1TxUtils.enableDelayer(aztecNodeConfig.ethereumSlotDuration);
782
- return l1TxUtils;
873
+ getLogger().info(`Created and synced prover node`);
874
+ return { proverNode };
875
+ });
783
876
  }
784
877
 
785
878
  export type BalancesFn = ReturnType<typeof getBalancesFn>;
@@ -790,7 +883,9 @@ export function getBalancesFn(
790
883
  ): (...addresses: (AztecAddress | { address: AztecAddress })[]) => Promise<bigint[]> {
791
884
  const balances = async (...addressLikes: (AztecAddress | { address: AztecAddress })[]) => {
792
885
  const addresses = addressLikes.map(addressLike => ('address' in addressLike ? addressLike.address : addressLike));
793
- const b = await Promise.all(addresses.map(address => method(address).simulate({ from: address })));
886
+ const b = await Promise.all(
887
+ addresses.map(async address => (await method(address).simulate({ from: address })).result),
888
+ );
794
889
  const debugString = `${symbol} balances: ${addresses.map((address, i) => `${address}: ${b[i]}`).join(', ')}`;
795
890
  logger.verbose(debugString);
796
891
  return b;
@@ -826,96 +921,56 @@ export async function expectMappingDelta<K, V extends number | bigint>(
826
921
  }
827
922
 
828
923
  /**
829
- * Registers the contract class used for test accounts and publicly deploys the instances requested.
830
- * Use this when you need to make a public call to an account contract, such as for requesting a public authwit.
924
+ * Registers the auth_registry contract class and publishes its standard instance if not already
925
+ * present, and registers the artifact with PXE. Publishing is required before exercising the public
926
+ * authwit path (which relies on the AVM's deployment-nullifier check); the PXE-side registration is
927
+ * required so revert messages from AuthRegistry calls can be enriched (otherwise assertion strings
928
+ * surface as generic "Assertion failed:" and tests that match on the real message fail).
831
929
  */
832
- export async function ensureAccountContractsPublished(wallet: Wallet, accountsToDeploy: AztecAddress[]) {
833
- const accountsAndAddresses = await Promise.all(
834
- accountsToDeploy.map(async address => {
835
- return {
836
- address,
837
- deployed: (await wallet.getContractMetadata(address)).isContractPublished,
838
- };
839
- }),
840
- );
841
- const instances = (
842
- await Promise.all(
843
- accountsAndAddresses
844
- .filter(({ deployed }) => !deployed)
845
- .map(({ address }) => wallet.getContractMetadata(address)),
846
- )
847
- ).map(contractMetadata => contractMetadata.instance);
848
- const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
849
- if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
850
- await (await publishContractClass(wallet, SchnorrAccountContractArtifact)).send({ from: accountsToDeploy[0] });
851
- }
852
- const requests = instances.map(instance => publishInstance(wallet, instance!));
853
- const batch = new BatchCall(wallet, requests);
854
- await batch.send({ from: accountsToDeploy[0] });
930
+ export async function ensureAuthRegistryPublished(wallet: Wallet, from: AztecAddress) {
931
+ await testSpan('setup:auth-registry', async () => {
932
+ const { instance, contractClass } = await getStandardAuthRegistry();
933
+ if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
934
+ await (await publishContractClass(wallet, AuthRegistryArtifact)).send({ from });
935
+ }
936
+ if (!(await wallet.getContractMetadata(instance.address)).isContractPublished) {
937
+ await publishInstance(wallet, instance).send({ from });
938
+ }
939
+ await wallet.registerContract(instance, AuthRegistryArtifact);
940
+ });
855
941
  }
856
942
 
857
943
  /**
858
- * Helper function to deploy accounts.
859
- * Returns deployed account data that can be used by tests.
944
+ * Registers the public_checks contract class and publishes its standard instance if not already
945
+ * present, and registers the artifact with PXE. Required for any contract that calls
946
+ * `privately_check_timestamp` / `privately_check_block_number` (which dispatch into the
947
+ * deployed PublicChecks contract via an enqueued public call).
860
948
  */
861
- export const deployAccounts =
862
- (numberOfAccounts: number, logger: Logger) =>
863
- async ({ wallet, initialFundedAccounts }: { wallet: TestWallet; initialFundedAccounts: InitialAccountData[] }) => {
864
- if (initialFundedAccounts.length < numberOfAccounts) {
865
- throw new Error(`Cannot deploy more than ${initialFundedAccounts.length} initial accounts.`);
866
- }
867
-
868
- logger.verbose('Deploying accounts funded with fee juice...');
869
- const deployedAccounts = initialFundedAccounts.slice(0, numberOfAccounts);
870
- // Serial due to https://github.com/AztecProtocol/aztec-packages/issues/12045
871
- for (let i = 0; i < deployedAccounts.length; i++) {
872
- const accountManager = await wallet.createSchnorrAccount(
873
- deployedAccounts[i].secret,
874
- deployedAccounts[i].salt,
875
- deployedAccounts[i].signingKey,
876
- );
877
- const deployMethod = await accountManager.getDeployMethod();
878
- await deployMethod.send({
879
- from: AztecAddress.ZERO,
880
- skipClassPublication: i !== 0, // Publish the contract class at most once.
881
- });
882
- }
883
-
884
- return { deployedAccounts };
885
- };
949
+ export async function ensurePublicChecksPublished(wallet: Wallet, from: AztecAddress) {
950
+ const { instance, contractClass } = await getStandardPublicChecks();
951
+ if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
952
+ await (await publishContractClass(wallet, PublicChecksArtifact)).send({ from });
953
+ }
954
+ if (!(await wallet.getContractMetadata(instance.address)).isContractPublished) {
955
+ await publishInstance(wallet, instance).send({ from });
956
+ }
957
+ await wallet.registerContract(instance, PublicChecksArtifact);
958
+ }
886
959
 
887
960
  /**
888
- * Registers the contract class used for test accounts and publicly deploys the instances requested.
889
- * Use this when you need to make a public call to an account contract, such as for requesting a public authwit.
961
+ * Registers the handshake_registry contract class and publishes its standard instance if not
962
+ * already present, and registers the artifact with PXE. Required for constrained-delivery flows
963
+ * that call into the HandshakeRegistry at its well-known address.
890
964
  */
891
- export async function publicDeployAccounts(
892
- wallet: Wallet,
893
- accountsToDeploy: AztecAddress[],
894
- waitUntilProven = false,
895
- node?: AztecNode,
896
- ) {
897
- const instances = (await Promise.all(accountsToDeploy.map(account => wallet.getContractMetadata(account)))).map(
898
- metadata => metadata.instance,
899
- );
900
-
901
- const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
902
- const alreadyRegistered = (await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered;
903
-
904
- const calls: ContractFunctionInteraction[] = await Promise.all([
905
- ...(!alreadyRegistered ? [publishContractClass(wallet, SchnorrAccountContractArtifact)] : []),
906
- ...instances.map(instance => publishInstance(wallet, instance!)),
907
- ]);
908
-
909
- const batch = new BatchCall(wallet, calls);
910
-
911
- const txReceipt = await batch.send({ from: accountsToDeploy[0] });
912
- if (waitUntilProven) {
913
- if (!node) {
914
- throw new Error('Need to provide an AztecNode to wait for proven.');
915
- } else {
916
- await waitForProven(node, txReceipt);
917
- }
965
+ export async function ensureHandshakeRegistryPublished(wallet: Wallet, from: AztecAddress) {
966
+ const { instance, contractClass } = await getStandardHandshakeRegistry();
967
+ if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
968
+ await (await publishContractClass(wallet, HandshakeRegistryArtifact)).send({ from });
969
+ }
970
+ if (!(await wallet.getContractMetadata(instance.address)).isContractPublished) {
971
+ await publishInstance(wallet, instance).send({ from });
918
972
  }
973
+ await wallet.registerContract(instance, HandshakeRegistryArtifact);
919
974
  }
920
975
 
921
976
  /**