@aztec/end-to-end 0.0.1-commit.d431d1c → 0.0.1-commit.d58ff9d0

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 (366) 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/automine/contracts/fixtures/storage_proof_fetcher.js +184 -0
  8. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts +18 -0
  9. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
  10. package/dest/automine/contracts/fixtures/storage_proof_fixture.js +120 -0
  11. package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
  12. package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
  13. package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
  14. package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
  15. package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
  16. package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
  17. package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
  18. package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
  19. package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +50 -54
  20. package/dest/automine/token/token_contract_test.d.ts +40 -0
  21. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  22. package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +44 -49
  23. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  24. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  25. package/dest/automine/token/token_test_helpers.js +97 -0
  26. package/dest/bench/client_flows/benchmark.d.ts +15 -1
  27. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  28. package/dest/bench/client_flows/benchmark.js +19 -0
  29. package/dest/bench/client_flows/client_flows_benchmark.d.ts +6 -6
  30. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  31. package/dest/bench/client_flows/client_flows_benchmark.js +68 -44
  32. package/dest/bench/client_flows/config.d.ts +2 -2
  33. package/dest/bench/client_flows/config.d.ts.map +1 -1
  34. package/dest/bench/client_flows/config.js +18 -0
  35. package/dest/bench/client_flows/data_extractor.js +1 -0
  36. package/dest/bench/utils.d.ts +7 -6
  37. package/dest/bench/utils.d.ts.map +1 -1
  38. package/dest/bench/utils.js +108 -12
  39. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  40. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  41. package/dest/composed/ha/ha_full_setup.js +383 -0
  42. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  43. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  44. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  45. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  46. package/dest/fixtures/authwit_proxy.js +34 -0
  47. package/dest/fixtures/e2e_prover_test.d.ts +18 -14
  48. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  49. package/dest/fixtures/e2e_prover_test.js +85 -74
  50. package/dest/fixtures/elu_monitor.d.ts +21 -0
  51. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  52. package/dest/fixtures/elu_monitor.js +102 -0
  53. package/dest/fixtures/fixtures.d.ts +83 -1
  54. package/dest/fixtures/fixtures.d.ts.map +1 -1
  55. package/dest/fixtures/fixtures.js +86 -0
  56. package/dest/fixtures/get_bb_config.d.ts +1 -1
  57. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  58. package/dest/fixtures/get_bb_config.js +5 -5
  59. package/dest/fixtures/ha_setup.d.ts +71 -0
  60. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  61. package/dest/fixtures/ha_setup.js +119 -0
  62. package/dest/fixtures/index.d.ts +3 -1
  63. package/dest/fixtures/index.d.ts.map +1 -1
  64. package/dest/fixtures/index.js +2 -0
  65. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  66. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  67. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  68. package/dest/fixtures/setup.d.ts +113 -60
  69. package/dest/fixtures/setup.d.ts.map +1 -1
  70. package/dest/fixtures/setup.js +330 -326
  71. package/dest/fixtures/setup_p2p_test.d.ts +22 -11
  72. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  73. package/dest/fixtures/setup_p2p_test.js +46 -35
  74. package/dest/fixtures/timing.d.ts +42 -0
  75. package/dest/fixtures/timing.d.ts.map +1 -0
  76. package/dest/fixtures/timing.js +72 -0
  77. package/dest/fixtures/token_utils.d.ts +22 -4
  78. package/dest/fixtures/token_utils.d.ts.map +1 -1
  79. package/dest/fixtures/token_utils.js +28 -7
  80. package/dest/fixtures/utils.d.ts +2 -2
  81. package/dest/fixtures/utils.d.ts.map +1 -1
  82. package/dest/fixtures/utils.js +1 -1
  83. package/dest/fixtures/wait_helpers.d.ts +135 -0
  84. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  85. package/dest/fixtures/wait_helpers.js +154 -0
  86. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  87. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  88. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  89. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  90. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  91. package/dest/forward-compatibility/wallet_service.js +109 -0
  92. package/dest/install_legacy_contracts.d.cts +10 -0
  93. package/dest/install_legacy_contracts.d.cts.map +1 -0
  94. package/dest/legacy-jest-resolver.d.cts +3 -0
  95. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  96. package/dest/multi-node/block-production/setup.d.ts +97 -0
  97. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  98. package/dest/multi-node/block-production/setup.js +158 -0
  99. package/dest/multi-node/governance/setup.d.ts +67 -0
  100. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  101. package/dest/multi-node/governance/setup.js +126 -0
  102. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  103. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  104. package/dest/multi-node/multi_node_test_context.js +347 -0
  105. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  106. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  107. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  108. package/dest/multi-node/slashing/setup.d.ts +167 -0
  109. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  110. package/dest/multi-node/slashing/setup.js +275 -0
  111. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +22 -12
  112. package/dest/p2p/p2p_network.d.ts.map +1 -0
  113. package/dest/{e2e_p2p → p2p}/p2p_network.js +99 -35
  114. package/dest/p2p/reqresp/utils.d.ts +19 -0
  115. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  116. package/dest/p2p/reqresp/utils.js +193 -0
  117. package/dest/p2p/shared.d.ts +72 -0
  118. package/dest/p2p/shared.d.ts.map +1 -0
  119. package/dest/p2p/shared.js +212 -0
  120. package/dest/shared/cross_chain_test_harness.d.ts +8 -7
  121. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  122. package/dest/shared/cross_chain_test_harness.js +44 -39
  123. package/dest/shared/gas_portal_test_harness.d.ts +8 -5
  124. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  125. package/dest/shared/gas_portal_test_harness.js +27 -15
  126. package/dest/shared/index.d.ts +2 -1
  127. package/dest/shared/index.d.ts.map +1 -1
  128. package/dest/shared/index.js +1 -0
  129. package/dest/shared/jest_setup.js +41 -1
  130. package/dest/shared/mock_state_view.d.ts +86 -0
  131. package/dest/shared/mock_state_view.d.ts.map +1 -0
  132. package/dest/shared/mock_state_view.js +186 -0
  133. package/dest/shared/submit-transactions.d.ts +4 -4
  134. package/dest/shared/submit-transactions.d.ts.map +1 -1
  135. package/dest/shared/submit-transactions.js +19 -14
  136. package/dest/shared/timing_env.d.js +5 -0
  137. package/dest/shared/timing_env.js +365 -0
  138. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  139. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  140. package/dest/shared/uniswap_l1_l2.js +67 -55
  141. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  142. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  143. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  144. package/dest/simulators/lending_simulator.d.ts +10 -3
  145. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  146. package/dest/simulators/lending_simulator.js +29 -17
  147. package/dest/simulators/token_simulator.d.ts +1 -1
  148. package/dest/simulators/token_simulator.d.ts.map +1 -1
  149. package/dest/simulators/token_simulator.js +3 -24
  150. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  151. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  152. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  153. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  154. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  155. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  156. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  157. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  158. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +18 -5
  159. package/dest/single-node/fees/fees_test.d.ts +93 -0
  160. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  161. package/dest/{e2e_fees → single-node/fees}/fees_test.js +96 -70
  162. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  163. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  164. package/dest/single-node/l1-reorgs/setup.js +57 -0
  165. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  166. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  167. package/dest/single-node/partial-proofs/setup.js +5 -0
  168. package/dest/single-node/proving/setup.d.ts +5 -0
  169. package/dest/single-node/proving/setup.d.ts.map +1 -0
  170. package/dest/single-node/proving/setup.js +5 -0
  171. package/dest/single-node/recovery/setup.d.ts +5 -0
  172. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  173. package/dest/single-node/recovery/setup.js +5 -0
  174. package/dest/single-node/setup.d.ts +49 -0
  175. package/dest/single-node/setup.d.ts.map +1 -0
  176. package/dest/single-node/setup.js +56 -0
  177. package/dest/single-node/single_node_test_context.d.ts +360 -0
  178. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  179. package/dest/single-node/single_node_test_context.js +833 -0
  180. package/dest/spartan/setup_test_wallets.d.ts +12 -3
  181. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  182. package/dest/spartan/setup_test_wallets.js +153 -49
  183. package/dest/spartan/tx_metrics.d.ts +64 -5
  184. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  185. package/dest/spartan/tx_metrics.js +280 -21
  186. package/dest/spartan/utils/bot.d.ts +28 -0
  187. package/dest/spartan/utils/bot.d.ts.map +1 -0
  188. package/dest/spartan/utils/bot.js +142 -0
  189. package/dest/spartan/utils/chaos.d.ts +79 -0
  190. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  191. package/dest/spartan/utils/chaos.js +142 -0
  192. package/dest/spartan/utils/clients.d.ts +39 -0
  193. package/dest/spartan/utils/clients.d.ts.map +1 -0
  194. package/dest/spartan/utils/clients.js +90 -0
  195. package/dest/spartan/utils/config.d.ts +19 -0
  196. package/dest/spartan/utils/config.d.ts.map +1 -0
  197. package/dest/spartan/utils/config.js +23 -0
  198. package/dest/spartan/utils/health.d.ts +63 -0
  199. package/dest/spartan/utils/health.d.ts.map +1 -0
  200. package/dest/spartan/utils/health.js +202 -0
  201. package/dest/spartan/utils/helm.d.ts +15 -0
  202. package/dest/spartan/utils/helm.d.ts.map +1 -0
  203. package/dest/spartan/utils/helm.js +47 -0
  204. package/dest/spartan/utils/index.d.ts +11 -0
  205. package/dest/spartan/utils/index.d.ts.map +1 -0
  206. package/dest/spartan/utils/index.js +22 -0
  207. package/dest/spartan/utils/k8s.d.ts +128 -0
  208. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  209. package/dest/spartan/utils/k8s.js +381 -0
  210. package/dest/spartan/utils/nodes.d.ts +40 -0
  211. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  212. package/dest/spartan/utils/nodes.js +461 -0
  213. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  214. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  215. package/dest/spartan/utils/pod_logs.js +74 -0
  216. package/dest/spartan/utils/scripts.d.ts +30 -0
  217. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  218. package/dest/spartan/utils/scripts.js +81 -0
  219. package/dest/spartan/utils.d.ts +2 -260
  220. package/dest/spartan/utils.d.ts.map +1 -1
  221. package/dest/spartan/utils.js +1 -942
  222. package/dest/test-wallet/test_wallet.d.ts +105 -0
  223. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  224. package/dest/test-wallet/test_wallet.js +320 -0
  225. package/dest/test-wallet/utils.d.ts +76 -0
  226. package/dest/test-wallet/utils.d.ts.map +1 -0
  227. package/dest/test-wallet/utils.js +126 -0
  228. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  229. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  230. package/dest/test-wallet/wallet_worker_script.js +56 -0
  231. package/dest/test-wallet/worker_wallet.d.ts +53 -0
  232. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  233. package/dest/test-wallet/worker_wallet.js +157 -0
  234. package/dest/test-wallet/worker_wallet_schema.d.ts +4 -0
  235. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  236. package/dest/test-wallet/worker_wallet_schema.js +23 -0
  237. package/package.json +53 -46
  238. package/src/automine/README.md +60 -0
  239. package/src/automine/automine_test_context.ts +153 -0
  240. package/src/automine/contracts/fixtures/storage_proof.json +915 -0
  241. package/src/automine/contracts/fixtures/storage_proof_fetcher.ts +190 -0
  242. package/src/automine/contracts/fixtures/storage_proof_fixture.ts +173 -0
  243. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  244. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  245. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +56 -69
  246. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +51 -59
  247. package/src/automine/token/token_test_helpers.ts +138 -0
  248. package/src/bench/client_flows/benchmark.ts +21 -0
  249. package/src/bench/client_flows/client_flows_benchmark.ts +111 -90
  250. package/src/bench/client_flows/config.ts +9 -1
  251. package/src/bench/client_flows/data_extractor.ts +1 -0
  252. package/src/bench/utils.ts +123 -12
  253. package/src/composed/ha/ha_full_setup.ts +466 -0
  254. package/src/fixtures/authwit_proxy.ts +54 -0
  255. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  256. package/src/fixtures/e2e_prover_test.ts +102 -103
  257. package/src/fixtures/elu_monitor.ts +126 -0
  258. package/src/fixtures/fixtures.ts +110 -0
  259. package/src/fixtures/get_bb_config.ts +7 -6
  260. package/src/fixtures/ha_setup.ts +192 -0
  261. package/src/fixtures/index.ts +2 -0
  262. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  263. package/src/fixtures/setup.ts +421 -444
  264. package/src/fixtures/setup_p2p_test.ts +54 -54
  265. package/src/fixtures/timing.ts +97 -0
  266. package/src/fixtures/token_utils.ts +46 -10
  267. package/src/fixtures/utils.ts +2 -3
  268. package/src/fixtures/wait_helpers.ts +333 -0
  269. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  270. package/src/forward-compatibility/wallet_service.ts +106 -0
  271. package/src/guides/up_quick_start.sh +7 -4
  272. package/src/infra/README.md +12 -0
  273. package/src/install_legacy_contracts.cjs +75 -0
  274. package/src/legacy-jest-resolver.cjs +112 -0
  275. package/src/multi-node/README.md +95 -0
  276. package/src/multi-node/block-production/setup.ts +272 -0
  277. package/src/multi-node/governance/setup.ts +172 -0
  278. package/src/multi-node/multi_node_test_context.ts +447 -0
  279. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  280. package/src/multi-node/slashing/setup.ts +433 -0
  281. package/src/p2p/README.md +78 -0
  282. package/src/{e2e_p2p → p2p}/p2p_network.ts +132 -57
  283. package/src/p2p/reqresp/utils.ts +263 -0
  284. package/src/p2p/shared.ts +329 -0
  285. package/src/shared/cross_chain_test_harness.ts +52 -41
  286. package/src/shared/gas_portal_test_harness.ts +34 -16
  287. package/src/shared/index.ts +1 -0
  288. package/src/shared/jest_setup.ts +51 -1
  289. package/src/shared/mock_state_view.ts +188 -0
  290. package/src/shared/submit-transactions.ts +22 -19
  291. package/src/shared/timing_env.d.mts +39 -0
  292. package/src/shared/timing_env.mjs +363 -0
  293. package/src/shared/uniswap_l1_l2.ts +109 -74
  294. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  295. package/src/simulators/lending_simulator.ts +35 -17
  296. package/src/simulators/token_simulator.ts +6 -30
  297. package/src/single-node/README.md +60 -0
  298. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  299. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  300. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +20 -9
  301. package/src/{e2e_fees → single-node/fees}/fees_test.ts +120 -95
  302. package/src/single-node/l1-reorgs/setup.ts +93 -0
  303. package/src/single-node/partial-proofs/setup.ts +8 -0
  304. package/src/single-node/proving/setup.ts +15 -0
  305. package/src/single-node/recovery/setup.ts +8 -0
  306. package/src/single-node/setup.ts +63 -0
  307. package/src/single-node/single_node_test_context.ts +1041 -0
  308. package/src/spartan/setup_test_wallets.ts +208 -34
  309. package/src/spartan/tx_metrics.ts +255 -26
  310. package/src/spartan/utils/bot.ts +188 -0
  311. package/src/spartan/utils/chaos.ts +253 -0
  312. package/src/spartan/utils/clients.ts +100 -0
  313. package/src/spartan/utils/config.ts +29 -0
  314. package/src/spartan/utils/health.ts +255 -0
  315. package/src/spartan/utils/helm.ts +84 -0
  316. package/src/spartan/utils/index.ts +71 -0
  317. package/src/spartan/utils/k8s.ts +535 -0
  318. package/src/spartan/utils/nodes.ts +543 -0
  319. package/src/spartan/utils/pod_logs.ts +99 -0
  320. package/src/spartan/utils/scripts.ts +99 -0
  321. package/src/spartan/utils.ts +1 -1246
  322. package/src/test-wallet/test_wallet.ts +426 -0
  323. package/src/test-wallet/utils.ts +205 -0
  324. package/src/test-wallet/wallet_worker_script.ts +66 -0
  325. package/src/test-wallet/worker_wallet.ts +216 -0
  326. package/src/test-wallet/worker_wallet_schema.ts +14 -0
  327. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -53
  328. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  329. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  330. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  331. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -128
  332. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  333. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  334. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  335. package/dest/e2e_epochs/epochs_test.d.ts +0 -94
  336. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  337. package/dest/e2e_epochs/epochs_test.js +0 -339
  338. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  339. package/dest/e2e_fees/fees_test.d.ts +0 -88
  340. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  341. package/dest/e2e_l1_publisher/write_json.d.ts +0 -10
  342. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  343. package/dest/e2e_l1_publisher/write_json.js +0 -62
  344. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  345. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  346. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  347. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  348. package/dest/e2e_nested_contract/nested_contract_test.js +0 -56
  349. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  350. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  351. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  352. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  353. package/dest/e2e_p2p/shared.d.ts +0 -46
  354. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  355. package/dest/e2e_p2p/shared.js +0 -184
  356. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -42
  357. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  358. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -194
  359. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  360. package/src/e2e_epochs/epochs_test.ts +0 -451
  361. package/src/e2e_l1_publisher/write_json.ts +0 -82
  362. package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
  363. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  364. package/src/e2e_p2p/shared.ts +0 -290
  365. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  366. /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
- import { type InitialAccountData, generateSchnorrAccounts, getInitialTestAccountsData } from '@aztec/accounts/testing';
3
- import { type Archiver, createArchiver } from '@aztec/archiver';
4
- import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
1
+ import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
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
- import { type AztecNode, createAztecNodeClient, waitForNode } from '@aztec/aztec.js/node';
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
- import { withLogNameSuffix } from '@aztec/foundation/log';
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 { TestWallet, deployFundedSchnorrAccounts } from '@aztec/test-wallet/server';
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';
@@ -84,17 +72,16 @@ import {
84
72
  } from 'viem/accounts';
85
73
  import { type Chain, foundry } from 'viem/chains';
86
74
 
75
+ import { TestWallet } from '../test-wallet/test_wallet.js';
87
76
  import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
88
77
  import { getACVMConfig } from './get_acvm_config.js';
89
78
  import { getBBConfig } from './get_bb_config.js';
90
79
  import { isMetricsLoggingRequested, setupMetricsLogger } from './logging.js';
80
+ import { testSpan } from './timing.js';
91
81
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
92
82
 
93
83
  export { startAnvil };
94
84
 
95
- const { AZTEC_NODE_URL = '' } = process.env;
96
- const getAztecUrl = () => AZTEC_NODE_URL;
97
-
98
85
  let telemetry: TelemetryClient | undefined = undefined;
99
86
  async function getTelemetryClient(partialConfig: Partial<TelemetryClientConfig> & { benchmark?: boolean } = {}) {
100
87
  if (!telemetry) {
@@ -123,16 +110,19 @@ export async function setupSharedBlobStorage(config: { dataDirectory?: string }
123
110
  /**
124
111
  * Sets up Private eXecution Environment (PXE) and returns the corresponding test wallet.
125
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.
126
115
  * @param opts - Partial configuration for the PXE.
127
116
  * @param logger - The logger to be used.
128
- * @param useLogSuffix - Whether to add a randomly generated suffix to the PXE debug logs.
117
+ * @param actor - Actor label to include in log output (e.g., 'pxe-test').
129
118
  * @returns A test wallet, logger and teardown function.
130
119
  */
131
120
  export async function setupPXEAndGetWallet(
132
121
  aztecNode: AztecNode,
122
+ nodeDebug: AztecNodeDebug | undefined,
133
123
  opts: Partial<PXEConfig> = {},
134
124
  logger = getLogger(),
135
- useLogSuffix = false,
125
+ actor?: string,
136
126
  ): Promise<{
137
127
  wallet: TestWallet;
138
128
  logger: Logger;
@@ -151,7 +141,8 @@ export async function setupPXEAndGetWallet(
151
141
  const teardown = configuredDataDirectory ? () => Promise.resolve() : () => tryRmDir(PXEConfig.dataDirectory!);
152
142
 
153
143
  const wallet = await TestWallet.create(aztecNode, PXEConfig, {
154
- useLogSuffix,
144
+ loggerActorLabel: actor,
145
+ nodeDebug,
155
146
  });
156
147
 
157
148
  return {
@@ -162,7 +153,7 @@ export async function setupPXEAndGetWallet(
162
153
  }
163
154
 
164
155
  /** Options for the e2e tests setup */
165
- export type SetupOptions = {
156
+ export type SetupOptions<TDeployExtraL1ContractsReturnType = unknown> = {
166
157
  /** State load */
167
158
  stateLoad?: string;
168
159
  /** Whether to enable metrics collection, if undefined, metrics collection is disabled */
@@ -171,10 +162,11 @@ export type SetupOptions = {
171
162
  deployL1ContractsValues?: DeployAztecL1ContractsReturnType;
172
163
  /** Initial fee juice for default accounts */
173
164
  initialAccountFeeJuice?: Fr;
174
- /** Number of initial accounts funded with fee juice */
175
- numberOfInitialFundedAccounts?: number;
176
- /** Data of the initial funded accounts */
177
- 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[];
178
170
  /** An initial set of validators */
179
171
  initialValidators?: (Operator & { privateKey: `0x${string}` })[];
180
172
  /** Anvil Start time */
@@ -191,39 +183,70 @@ export type SetupOptions = {
191
183
  proverNodeConfig?: Partial<ProverNodeConfig>;
192
184
  /** Whether to use a mock gossip sub network for p2p clients. */
193
185
  mockGossipSubNetwork?: boolean;
194
- /** Whether to disable the anvil test watcher (can still be manually started) */
195
- disableAnvilTestWatcher?: boolean;
196
- /** 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
+ */
197
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>;
198
208
  /** How many accounts to seed and unlock in anvil. */
199
209
  anvilAccounts?: number;
200
210
  /** Port to start anvil (defaults to 8545) */
201
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;
202
217
  /** Key to use for publishing L1 contracts */
203
218
  l1PublisherKey?: SecretValue<`0x${string}`>;
204
219
  /** ZkPassport configuration (domain, scope, mock verifier) */
205
220
  zkPassportArgs?: ZKPassportArgs;
206
221
  /** Whether to fund the sponsored FPC in genesis (defaults to false). */
207
222
  fundSponsoredFPC?: boolean;
208
- /** Whether to skip deploying accounts during setup (legacy behavior for tests using deployAccounts helper). */
209
- skipAccountDeployment?: boolean;
210
223
  /** L1 contracts deployment arguments. */
211
224
  l1ContractsArgs?: Partial<DeployAztecL1ContractsArgs>;
225
+ /** Wallet minimum fee padding multiplier */
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;
212
235
  } & Partial<AztecNodeConfig>;
213
236
 
214
237
  /** Context for an end-to-end test as returned by the `setup` function */
215
- export type EndToEndContext = {
238
+ export type EndToEndContext<TDeployExtraL1ContractsReturnType = unknown> = {
216
239
  /** The Anvil instance (only set if anvil was started locally). */
217
240
  anvil: Anvil | undefined;
218
241
  /** The Aztec Node service or client a connected to it. */
219
- aztecNode: AztecNode;
220
- /** The Aztec Node as a service (only set if running locally). */
221
- aztecNodeService: AztecNodeService | undefined;
222
- /** Client to the Aztec Node admin interface (undefined if connected to remote environment) */
223
- aztecNodeAdmin: AztecNodeAdmin | undefined;
224
- /** The prover node service (only set if startProverNode is true) */
225
- proverNode: ProverNode | undefined;
226
- /** A client to the sequencer service (undefined if connected to remote environment) */
242
+ aztecNode: AztecNode & AztecNodeDebug;
243
+ /** The Aztec Node as a service. */
244
+ aztecNodeService: AztecNodeService;
245
+ /** Client to the Aztec Node admin interface. */
246
+ aztecNodeAdmin: AztecNodeAdmin;
247
+ /** The aztec node running the prover node subsystem (only set if startProverNode is true). */
248
+ proverNode: AztecNodeService | undefined;
249
+ /** A client to the sequencer service. */
227
250
  sequencer: SequencerClient | undefined;
228
251
  /** Return values from deployAztecL1Contracts function. */
229
252
  deployL1ContractsValues: DeployAztecL1ContractsReturnType;
@@ -231,8 +254,8 @@ export type EndToEndContext = {
231
254
  config: AztecNodeConfig;
232
255
  /** The Aztec Node configuration (alias for config for backward compatibility). */
233
256
  aztecNodeConfig: AztecNodeConfig;
234
- /** The data for the initial funded accounts. */
235
- initialFundedAccounts: InitialAccountData[];
257
+ /** Data for the extra accounts funded at genesis but not created by setup (the test creates/deploys them). */
258
+ additionallyFundedAccounts: InitialAccountData[];
236
259
  /** The wallet to be used. */
237
260
  wallet: TestWallet;
238
261
  /** The wallets to be used. */
@@ -243,95 +266,54 @@ export type EndToEndContext = {
243
266
  cheatCodes: CheatCodes;
244
267
  /** The cheat codes for L1 */
245
268
  ethCheatCodes: EthCheatCodes;
246
- /** The anvil test watcher (undefined if connected to remote environment) */
247
- watcher: AnvilTestWatcher | undefined;
248
- /** Allows tweaking current system time, used by the epoch cache only (undefined if connected to remote environment) */
249
- dateProvider: TestDateProvider | undefined;
269
+ /** Allows tweaking current system time, used by the epoch cache only. */
270
+ dateProvider: TestDateProvider;
250
271
  /** Telemetry client */
251
- telemetryClient: TelemetryClient | undefined;
272
+ telemetryClient: TelemetryClient;
252
273
  /** Mock gossip sub network used for gossipping messages (only if mockGossipSubNetwork was set to true in opts) */
253
274
  mockGossipSubNetwork: MockGossipSubNetwork | undefined;
254
- /** Prefilled public data used for setting up nodes. */
255
- 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;
256
283
  /** ACVM config (only set if running locally). */
257
284
  acvmConfig: Awaited<ReturnType<typeof getACVMConfig>>;
258
285
  /** BB config (only set if running locally). */
259
286
  bbConfig: Awaited<ReturnType<typeof getBBConfig>>;
260
287
  /** Directory to cleanup on teardown. */
261
- directoryToCleanup: string | undefined;
288
+ directoryToCleanup: string;
262
289
  /** Function to stop the started services. */
263
290
  teardown: () => Promise<void>;
264
291
  };
265
292
 
266
293
  /**
267
- * Function to setup the test against a remote deployment. It is assumed that L1 contract are already deployed
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.
268
297
  */
269
- async function setupWithRemoteEnvironment(
270
- account: HDAccount | PrivateKeyAccount,
271
- config: AztecNodeConfig,
272
- logger: Logger,
273
- numberOfAccounts: number,
274
- ): Promise<EndToEndContext> {
275
- const aztecNodeUrl = getAztecUrl();
276
- logger.verbose(`Creating Aztec Node client to remote host ${aztecNodeUrl}`);
277
- const aztecNode = createAztecNodeClient(aztecNodeUrl);
278
- await waitForNode(aztecNode, logger);
279
- logger.verbose('JSON RPC client connected to Aztec Node');
280
- logger.verbose(`Retrieving contract addresses from ${aztecNodeUrl}`);
281
- const { l1ContractAddresses, rollupVersion } = await aztecNode.getNodeInfo();
282
-
283
- const l1Client = createExtendedL1Client(config.l1RpcUrls, account, foundry);
284
-
285
- const deployL1ContractsValues: DeployAztecL1ContractsReturnType = {
286
- l1ContractAddresses,
287
- l1Client,
288
- rollupVersion,
289
- };
290
- const ethCheatCodes = new EthCheatCodes(config.l1RpcUrls, new DateProvider());
291
- const wallet = await TestWallet.create(aztecNode);
292
- const cheatCodes = await CheatCodes.create(config.l1RpcUrls, aztecNode, new DateProvider());
293
- const teardown = () => Promise.resolve();
294
-
295
- logger.verbose('Populating wallet from already registered accounts...');
296
- const initialFundedAccounts = await getInitialTestAccountsData();
297
-
298
- if (initialFundedAccounts.length < numberOfAccounts) {
299
- throw new Error(`Required ${numberOfAccounts} accounts. Found ${initialFundedAccounts.length}.`);
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
+ );
300
316
  }
301
-
302
- const testAccounts = await Promise.all(
303
- initialFundedAccounts.slice(0, numberOfAccounts).map(async account => {
304
- const accountManager = await wallet.createSchnorrAccount(account.secret, account.salt, account.signingKey);
305
- return accountManager.address;
306
- }),
307
- );
308
-
309
- return {
310
- anvil: undefined,
311
- aztecNode,
312
- aztecNodeService: undefined,
313
- aztecNodeAdmin: undefined,
314
- sequencer: undefined,
315
- proverNode: undefined,
316
- deployL1ContractsValues,
317
- config,
318
- aztecNodeConfig: config,
319
- initialFundedAccounts,
320
- wallet,
321
- accounts: testAccounts,
322
- logger,
323
- cheatCodes,
324
- ethCheatCodes,
325
- prefilledPublicData: undefined,
326
- mockGossipSubNetwork: undefined,
327
- watcher: undefined,
328
- dateProvider: undefined,
329
- telemetryClient: undefined,
330
- acvmConfig: undefined,
331
- bbConfig: undefined,
332
- directoryToCleanup: undefined,
333
- teardown,
334
- };
335
317
  }
336
318
 
337
319
  /**
@@ -340,16 +322,43 @@ async function setupWithRemoteEnvironment(
340
322
  * @param opts - Options to pass to the node initialization and to the setup script.
341
323
  * @param pxeOpts - Options to pass to the PXE initialization.
342
324
  */
343
- export async function setup(
325
+ export function setup<TDeployExtraL1ContractsReturnType = unknown>(
344
326
  numberOfAccounts = 1,
345
- opts: SetupOptions = {},
327
+ opts: SetupOptions<TDeployExtraL1ContractsReturnType> = {},
346
328
  pxeOpts: Partial<PXEConfig> = {},
347
329
  chain: Chain = foundry,
348
- ): 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();
349
353
  let anvil: Anvil | undefined;
350
354
  try {
351
355
  opts.aztecTargetCommitteeSize ??= 0;
352
- 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');
353
362
 
354
363
  const config: AztecNodeConfig & SetupOptions = { ...getConfigEnvVars(), ...opts };
355
364
  // use initialValidators for the node config
@@ -359,11 +368,11 @@ export async function setup(
359
368
  config.maxPendingTxCount = opts.maxPendingTxCount ?? TEST_MAX_PENDING_TX_POOL_COUNT;
360
369
  // For tests we only want proving enabled if specifically requested
361
370
  config.realProofs = !!opts.realProofs;
362
- // Only enforce the time table if requested
363
- 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;
364
373
  config.listenAddress = '127.0.0.1';
365
374
 
366
- const logger = getLogger();
375
+ config.minTxPoolAgeMs = opts.minTxPoolAgeMs ?? 0;
367
376
 
368
377
  // Create a temp directory for any services that need it and cleanup later
369
378
  const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex'));
@@ -372,24 +381,25 @@ export async function setup(
372
381
  config.dataDirectory = directoryToCleanup;
373
382
  }
374
383
 
384
+ const dateProvider = new TestDateProvider();
385
+
375
386
  if (!config.l1RpcUrls?.length) {
376
387
  if (!isAnvilTestChain(chain.id)) {
377
388
  throw new Error(`No ETHEREUM_HOSTS set but non anvil chain requested`);
378
389
  }
379
- if (AZTEC_NODE_URL) {
380
- throw new Error(
381
- `AZTEC_NODE_URL provided but no ETHEREUM_HOSTS set. Refusing to run, please set both variables so tests can deploy L1 contracts to the same Anvil instance`,
382
- );
383
- }
384
-
385
- const res = await startAnvil({
386
- l1BlockTime: opts.ethereumSlotDuration,
387
- accounts: opts.anvilAccounts,
388
- port: opts.anvilPort,
389
- });
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
+ );
390
399
  anvil = res.anvil;
391
400
  config.l1RpcUrls = [res.rpcUrl];
392
401
  }
402
+ logger.trace('Started anvil and L1 RPC client');
393
403
 
394
404
  // Enable logging metrics to a local file named after the test suite
395
405
  if (isMetricsLoggingRequested()) {
@@ -397,8 +407,6 @@ export async function setup(
397
407
  logger.info(`Logging metrics to ${filename}`);
398
408
  setupMetricsLogger(filename);
399
409
  }
400
-
401
- const dateProvider = new TestDateProvider();
402
410
  const ethCheatCodes = new EthCheatCodesWithState(config.l1RpcUrls, dateProvider);
403
411
 
404
412
  if (opts.stateLoad) {
@@ -408,6 +416,7 @@ export async function setup(
408
416
  if (opts.l1StartTime) {
409
417
  await ethCheatCodes.warp(opts.l1StartTime, { resetBlockInterval: true });
410
418
  }
419
+ logger.trace('Initialized L1 cheat codes and applied state/time overrides');
411
420
 
412
421
  let publisherPrivKeyHex: `0x${string}` | undefined = undefined;
413
422
  let publisherHdAccount: HDAccount | PrivateKeyAccount | undefined = undefined;
@@ -416,11 +425,11 @@ export async function setup(
416
425
  publisherPrivKeyHex = opts.l1PublisherKey.getValue();
417
426
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
418
427
  } else if (
419
- config.publisherPrivateKeys &&
420
- config.publisherPrivateKeys.length > 0 &&
421
- config.publisherPrivateKeys[0].getValue() != NULL_KEY
428
+ config.sequencerPublisherPrivateKeys &&
429
+ config.sequencerPublisherPrivateKeys.length > 0 &&
430
+ config.sequencerPublisherPrivateKeys[0].getValue() != NULL_KEY
422
431
  ) {
423
- publisherPrivKeyHex = config.publisherPrivateKeys[0].getValue();
432
+ publisherPrivKeyHex = config.sequencerPublisherPrivateKeys[0].getValue();
424
433
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
425
434
  } else if (!MNEMONIC) {
426
435
  throw new Error(`Mnemonic not provided and no publisher private key`);
@@ -429,35 +438,36 @@ export async function setup(
429
438
  const publisherPrivKeyRaw = publisherHdAccount.getHdKey().privateKey;
430
439
  const publisherPrivKey = publisherPrivKeyRaw === null ? null : Buffer.from(publisherPrivKeyRaw);
431
440
  publisherPrivKeyHex = `0x${publisherPrivKey!.toString('hex')}` as const;
432
- config.publisherPrivateKeys = [new SecretValue(publisherPrivKeyHex)];
441
+ config.sequencerPublisherPrivateKeys = [new SecretValue(publisherPrivKeyHex)];
433
442
  }
434
443
 
435
444
  if (config.coinbase === undefined) {
436
445
  config.coinbase = EthAddress.fromString(publisherHdAccount.address);
437
446
  }
447
+ logger.trace('Resolved L1 publisher account');
438
448
 
439
- if (AZTEC_NODE_URL) {
440
- // we are setting up against a remote environment, l1 contracts are assumed to already be deployed
441
- return await setupWithRemoteEnvironment(publisherHdAccount!, config, logger, numberOfAccounts);
442
- }
443
-
444
- // Determine which addresses to fund in genesis
445
- const initialFundedAccounts =
446
- opts.initialFundedAccounts ??
447
- (await generateSchnorrAccounts(opts.numberOfInitialFundedAccounts ?? Math.max(numberOfAccounts, 10)));
448
- 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);
449
455
 
450
456
  // Optionally fund the sponsored FPC
451
457
  if (opts.fundSponsoredFPC) {
452
458
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
453
459
  addressesToFund.push(sponsoredFPCAddress);
454
460
  }
461
+ logger.trace('Generated test accounts to fund at genesis');
455
462
 
456
- const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(
463
+ const genesisTimestamp = BigInt(Math.floor(Date.now() / 1000));
464
+ const { genesisArchiveRoot, genesis, fundingNeeded } = await getGenesisValues(
457
465
  addressesToFund,
458
466
  opts.initialAccountFeeJuice,
459
467
  opts.genesisPublicData,
468
+ genesisTimestamp,
460
469
  );
470
+ logger.trace('Computed genesis values');
461
471
 
462
472
  const wasAutomining = await ethCheatCodes.isAutoMining();
463
473
  const enableAutomine = opts.automineL1Setup && !wasAutomining && isAnvilTestChain(chain.id);
@@ -467,18 +477,21 @@ export async function setup(
467
477
 
468
478
  const l1Client = createExtendedL1Client(config.l1RpcUrls, publisherHdAccount!, chain);
469
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
+
470
485
  // Deploy Multicall3 if running locally
471
486
  await deployMulticall3(l1Client, logger);
472
487
 
473
488
  // Force viem to refresh its nonce cache to avoid "nonce too low" errors in subsequent transactions
474
489
  // This is necessary because deployMulticall3 sends multiple transactions and viem may cache a stale nonce
475
490
  await l1Client.getTransactionCount({ address: l1Client.account.address });
491
+ logger.trace('Deployed Multicall3');
476
492
 
477
- const deployL1ContractsValues: DeployAztecL1ContractsReturnType = await deployAztecL1Contracts(
478
- config.l1RpcUrls[0],
479
- publisherPrivKeyHex!,
480
- chain.id,
481
- {
493
+ const deployL1ContractsValues: DeployAztecL1ContractsReturnType = await testSpan('setup:env:l1-deploy', () =>
494
+ deployAztecL1Contracts(config.l1RpcUrls[0], publisherPrivKeyHex!, chain.id, {
482
495
  ...getL1ContractsConfigEnvVars(),
483
496
  ...opts,
484
497
  ...opts.l1ContractsArgs,
@@ -488,76 +501,96 @@ export async function setup(
488
501
  initialValidators: opts.initialValidators,
489
502
  feeJuicePortalInitialBalance: fundingNeeded,
490
503
  realVerifier: false,
491
- },
504
+ }),
492
505
  );
493
506
 
494
- config.l1Contracts = deployL1ContractsValues.l1ContractAddresses;
507
+ Object.assign(config, deployL1ContractsValues.l1ContractAddresses);
495
508
  config.rollupVersion = deployL1ContractsValues.rollupVersion;
496
509
 
497
- if (enableAutomine) {
498
- await ethCheatCodes.setAutomine(false);
499
- await ethCheatCodes.setIntervalMining(config.ethereumSlotDuration);
500
- 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
+ }
501
526
  }
502
527
 
503
- if (opts.l2StartTime) {
504
- 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 });
505
541
  }
506
542
 
507
- const watcher = new AnvilTestWatcher(
508
- new EthCheatCodesWithState(config.l1RpcUrls, dateProvider),
509
- deployL1ContractsValues.l1ContractAddresses.rollupAddress,
510
- deployL1ContractsValues.l1Client,
511
- dateProvider,
512
- );
513
- if (!opts.disableAnvilTestWatcher) {
514
- await watcher.start();
543
+ if (enableAutomine) {
544
+ await ethCheatCodes.startIntervalMiningWithFreshBlock(config.ethereumSlotDuration);
515
545
  }
516
546
 
517
- // Use metricsPort-based telemetry if provided, otherwise use the regular telemetry client
518
- const telemetryClient = opts.metricsPort
519
- ? await getEndToEndTestTelemetryClient(opts.metricsPort)
520
- : await getTelemetryClient(opts.telemetryConfig);
521
-
522
- 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
+ }
523
553
 
524
- 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');
525
571
 
526
- const acvmConfig = await getACVMConfig(logger);
527
572
  if (acvmConfig) {
528
573
  config.acvmWorkingDirectory = acvmConfig.acvmWorkingDirectory;
529
574
  config.acvmBinaryPath = acvmConfig.acvmBinaryPath;
530
575
  }
576
+ logger.trace('Resolved ACVM config');
531
577
 
532
- const bbConfig = await getBBConfig(logger);
533
578
  if (bbConfig) {
534
579
  config.bbBinaryPath = bbConfig.bbBinaryPath;
535
580
  config.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
536
581
  }
582
+ logger.trace('Resolved Barretenberg config');
583
+
584
+ logger.verbose('Creating and synching an aztec node', config);
537
585
 
538
586
  let mockGossipSubNetwork: MockGossipSubNetwork | undefined;
539
- let p2pClientDeps: P2PClientDeps<P2PClientType.Full> | undefined = undefined;
587
+ let p2pClientDeps: P2PClientDeps | undefined = undefined;
540
588
 
541
589
  if (opts.mockGossipSubNetwork) {
542
- mockGossipSubNetwork = new MockGossipSubNetwork();
590
+ mockGossipSubNetwork = new MockGossipSubNetwork(opts.mockGossipSubNetworkLatency);
543
591
  p2pClientDeps = { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) };
544
592
  }
545
593
 
546
- // Transactions built against the genesis state must be included in block 1, otherwise they are dropped.
547
- // To avoid test failures from dropped transactions, we ensure progression beyond genesis before proceeding.
548
- // For account deployments, we set minTxsPerBlock=1 and deploy accounts sequentially for guaranteed success.
549
- // If no accounts need deployment, we await an empty block to confirm network progression.
550
- const originalMinTxsPerBlock = config.minTxsPerBlock;
551
- if (originalMinTxsPerBlock === undefined) {
552
- throw new Error('minTxsPerBlock is undefined in e2e test setup');
553
- }
554
-
555
- // Only set minTxsPerBlock=1 if we're going to deploy accounts and need reliable block inclusion
556
- const shouldDeployAccounts = numberOfAccounts > 0 && !opts.skipAccountDeployment;
557
- // Only set minTxsPerBlock=0 if we need an empty block (no accounts at all, not skipped deployment)
558
- const needsEmptyBlock = numberOfAccounts === 0 && !opts.skipAccountDeployment;
559
- config.minTxsPerBlock = shouldDeployAccounts ? 1 : needsEmptyBlock ? 0 : originalMinTxsPerBlock;
560
-
561
594
  config.p2pEnabled = opts.mockGossipSubNetwork || config.p2pEnabled;
562
595
  config.p2pIp = opts.p2pIp ?? config.p2pIp ?? '127.0.0.1';
563
596
 
@@ -567,46 +600,81 @@ export async function setup(
567
600
  }
568
601
  }
569
602
 
570
- const aztecNodeService = await AztecNodeService.createAndSync(
571
- config,
572
- { dateProvider, telemetry: telemetryClient, p2pClientDeps, logger: createLogger('node:MAIN-aztec-node') },
573
- { 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
+ ),
622
+ ),
574
623
  );
575
624
  const sequencerClient = aztecNodeService.getSequencer();
625
+ logger.trace('Created and synced aztec node');
576
626
 
577
- if (sequencerClient) {
578
- const publisher = (sequencerClient as TestSequencerClient).sequencer.publisher;
579
- publisher.l1TxUtils = DelayedTxUtils.fromL1TxUtils(publisher.l1TxUtils, config.ethereumSlotDuration, l1Client);
580
- }
581
-
582
- let proverNode: ProverNode | undefined = undefined;
627
+ let proverNode: AztecNodeService | undefined = undefined;
583
628
  if (opts.startProverNode) {
584
629
  logger.verbose('Creating and syncing a simulated prover node...');
585
630
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
586
631
  const proverNodePrivateKeyHex: Hex = `0x${proverNodePrivateKey!.toString('hex')}`;
587
632
  const proverNodeDataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
588
- const proverNodeConfig = {
589
- ...config.proverNodeConfig,
590
- dataDirectory: proverNodeDataDirectory,
591
- p2pEnabled: false,
633
+
634
+ const p2pClientDeps: Partial<P2PClientDeps> = {
635
+ p2pServiceFactory: mockGossipSubNetwork && getMockPubSubP2PServiceFactory(mockGossipSubNetwork!),
636
+ rpcTxProviders: [aztecNodeService],
592
637
  };
593
- proverNode = await createAndSyncProverNode(
594
- proverNodePrivateKeyHex,
595
- config,
596
- proverNodeConfig,
597
- aztecNodeService,
598
- prefilledPublicData,
599
- );
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');
600
652
  }
601
653
 
654
+ const sequencerDelayer = sequencerClient?.getDelayer();
655
+ const proverDelayer = proverNode?.getProverNode()?.getDelayer();
656
+
602
657
  logger.verbose('Creating a pxe...');
603
658
  const pxeConfig = { ...getPXEConfig(), ...pxeOpts };
604
659
  pxeConfig.dataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
605
660
  // For tests we only want proving enabled if specifically requested
606
661
  pxeConfig.proverEnabled = !!pxeOpts.proverEnabled;
607
- const wallet = await TestWallet.create(aztecNodeService, pxeConfig);
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
+ );
670
+
671
+ if (opts.walletMinFeePadding !== undefined) {
672
+ wallet.setMinFeePadding(opts.walletMinFeePadding);
673
+ }
674
+ logger.trace('Created PXE and test wallet');
608
675
 
609
676
  const cheatCodes = await CheatCodes.create(config.l1RpcUrls, aztecNodeService, dateProvider);
677
+ logger.trace('Created cheat codes');
610
678
 
611
679
  if (
612
680
  (opts.aztecTargetCommitteeSize && opts.aztecTargetCommitteeSize > 0) ||
@@ -620,64 +688,48 @@ export async function setup(
620
688
  );
621
689
  await cheatCodes.rollup.setupEpoch();
622
690
  await cheatCodes.rollup.debugRollup();
691
+ logger.trace('Advanced chain to set up validator committee');
623
692
  }
624
693
 
625
694
  let accounts: AztecAddress[] = [];
626
695
 
627
- if (shouldDeployAccounts) {
628
- logger.info(
629
- `${numberOfAccounts} accounts are being deployed. Reliably progressing past genesis by setting minTxsPerBlock to 1 and waiting for the accounts to be deployed`,
630
- );
631
- const accountsData = initialFundedAccounts.slice(0, numberOfAccounts);
632
- const accountManagers = await deployFundedSchnorrAccounts(wallet, aztecNodeService, accountsData);
633
- accounts = accountManagers.map(accountManager => accountManager.address);
634
- } else if (needsEmptyBlock) {
635
- logger.info('No accounts are being deployed, waiting for an empty block 1 to be mined');
636
- while ((await aztecNodeService.getBlockNumber()) === 0) {
637
- await sleep(2000);
638
- }
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);
639
702
  }
640
- // If skipAccountDeployment is true, we don't deploy or wait - tests will handle account deployment later
703
+ logger.trace('Created funded test accounts');
641
704
 
642
- // Now we restore the original minTxsPerBlock setting if we changed it.
643
- if (sequencerClient && config.minTxsPerBlock !== originalMinTxsPerBlock) {
644
- sequencerClient.getSequencer().updateConfig({ minTxsPerBlock: originalMinTxsPerBlock });
645
- }
646
-
647
- if (initialFundedAccounts.length < numberOfAccounts) {
648
- throw new Error(
649
- `Unable to deploy ${numberOfAccounts} accounts. Only ${initialFundedAccounts.length} accounts were funded.`,
650
- );
651
- }
652
-
653
- const teardown = async () => {
654
- try {
655
- await tryStop(wallet, logger);
656
- await tryStop(aztecNodeService, logger);
657
- 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);
658
711
 
659
- if (acvmConfig?.cleanup) {
660
- await acvmConfig.cleanup();
661
- }
712
+ if (acvmConfig?.cleanup) {
713
+ await acvmConfig.cleanup();
714
+ }
662
715
 
663
- if (bbConfig?.cleanup) {
664
- await bbConfig.cleanup();
665
- }
716
+ if (bbConfig?.cleanup) {
717
+ await bbConfig.cleanup();
718
+ }
666
719
 
667
- await tryStop(watcher, logger);
668
- await tryStop(anvil, logger);
720
+ await tryStop(anvil, logger);
669
721
 
670
- await tryRmDir(directoryToCleanup, logger);
671
- } catch (err) {
672
- logger.error(`Error during e2e test teardown`, err);
673
- } finally {
674
- try {
675
- await telemetryClient?.stop();
722
+ await tryRmDir(directoryToCleanup, logger);
676
723
  } catch (err) {
677
- 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
+ }
678
731
  }
679
- }
680
- };
732
+ });
681
733
 
682
734
  return {
683
735
  anvil,
@@ -690,17 +742,19 @@ export async function setup(
690
742
  aztecNodeConfig: config,
691
743
  dateProvider,
692
744
  deployL1ContractsValues,
693
- initialFundedAccounts,
745
+ additionallyFundedAccounts,
694
746
  logger,
695
747
  mockGossipSubNetwork,
696
- prefilledPublicData,
748
+ genesis,
749
+ extraL1DeployResult,
697
750
  proverNode,
751
+ sequencerDelayer,
752
+ proverDelayer,
698
753
  sequencer: sequencerClient,
699
754
  teardown,
700
755
  telemetryClient,
701
756
  wallet,
702
757
  accounts,
703
- watcher,
704
758
  acvmConfig,
705
759
  bbConfig,
706
760
  directoryToCleanup,
@@ -767,104 +821,71 @@ export async function registerSponsoredFPC(wallet: Wallet): Promise<void> {
767
821
  await wallet.registerContract(await getSponsoredFPCInstance(), SponsoredFPCContract.artifact);
768
822
  }
769
823
 
770
- 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
+ ) {
771
830
  targetBlock ??= await node.getBlockNumber();
772
831
 
773
832
  await retryUntil(
774
- async () => (await node.getProvenBlockNumber()) >= targetBlock,
833
+ async () => (await node.getBlockNumber('proven')) >= targetBlock,
775
834
  'proven chain status',
776
835
  timeoutSec,
777
836
  intervalSec,
778
837
  );
779
838
  }
780
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
+ */
781
844
  export function createAndSyncProverNode(
782
845
  proverNodePrivateKey: `0x${string}`,
783
- aztecNodeConfig: AztecNodeConfig,
784
- proverNodeConfig: Partial<ProverNodeConfig> & Pick<DataStoreConfig, 'dataDirectory'> & { dontStart?: boolean },
785
- aztecNode: AztecNode | undefined,
786
- prefilledPublicData: PublicDataTreeLeaf[] = [],
787
- proverNodeDeps: ProverNodeDeps = {},
788
- ) {
789
- return withLogNameSuffix('prover-node', async () => {
790
- const aztecNodeTxProvider = aztecNode && {
791
- getTxByHash: aztecNode.getTxByHash.bind(aztecNode),
792
- getTxsByHash: aztecNode.getTxsByHash.bind(aztecNode),
793
- stop: () => Promise.resolve(),
794
- };
795
-
796
- const blobClient = await createBlobClientWithFileStores(aztecNodeConfig, createLogger('blob-client:prover-node'));
797
-
798
- const archiverConfig = { ...aztecNodeConfig, dataDirectory: proverNodeConfig.dataDirectory };
799
- const archiver = await createArchiver(
800
- archiverConfig,
801
- { blobClient, dateProvider: proverNodeDeps.dateProvider },
802
- { blockUntilSync: true },
803
- );
804
-
805
- const proverConfig: ProverNodeConfig = {
806
- ...aztecNodeConfig,
807
- txCollectionNodeRpcUrls: [],
808
- realProofs: false,
809
- proverAgentCount: 2,
810
- publisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
811
- proverNodeMaxPendingJobs: 10,
812
- proverNodeMaxParallelBlocksPerEpoch: 32,
813
- proverNodePollingIntervalMs: 200,
814
- txGatheringIntervalMs: 1000,
815
- txGatheringBatchSize: 10,
816
- txGatheringMaxParallelRequestsPerNode: 10,
817
- txGatheringTimeoutMs: 24_000,
818
- proverNodeFailedEpochStore: undefined,
819
- proverId: EthAddress.fromNumber(1),
820
- proverNodeEpochProvingDelayMs: undefined,
821
- ...proverNodeConfig,
822
- };
823
-
824
- const l1TxUtils = createDelayedL1TxUtils(
825
- aztecNodeConfig,
826
- proverNodePrivateKey,
827
- 'prover-node',
828
- proverNodeDeps.dateProvider,
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 }> {
855
+ return withLoggerBindings({ actor: 'prover-0' }, async () => {
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 },
829
867
  );
830
868
 
831
- const proverNode = await createProverNode(
832
- proverConfig,
833
- { ...proverNodeDeps, aztecNodeTxProvider, archiver: archiver as Archiver, l1TxUtils },
834
- { prefilledPublicData },
835
- );
836
- getLogger().info(`Created and synced prover node`, { publisherAddress: l1TxUtils.client.account!.address });
837
- if (!proverNodeConfig.dontStart) {
838
- await proverNode.start();
869
+ if (!proverNode.getProverNode()) {
870
+ throw new Error('Prover node subsystem was not created despite enableProverNode being set');
839
871
  }
840
- return proverNode;
841
- });
842
- }
843
872
 
844
- function createDelayedL1TxUtils(
845
- aztecNodeConfig: AztecNodeConfig,
846
- privateKey: `0x${string}`,
847
- logName: string,
848
- dateProvider?: DateProvider,
849
- ) {
850
- const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
851
-
852
- const log = createLogger(logName);
853
- const l1TxUtils = createDelayedL1TxUtilsFromViemWallet(l1Client, log, dateProvider, aztecNodeConfig);
854
- l1TxUtils.enableDelayer(aztecNodeConfig.ethereumSlotDuration);
855
- return l1TxUtils;
873
+ getLogger().info(`Created and synced prover node`);
874
+ return { proverNode };
875
+ });
856
876
  }
857
877
 
858
878
  export type BalancesFn = ReturnType<typeof getBalancesFn>;
859
879
  export function getBalancesFn(
860
880
  symbol: string,
861
881
  method: ContractMethod,
862
- from: AztecAddress,
863
882
  logger: any,
864
883
  ): (...addresses: (AztecAddress | { address: AztecAddress })[]) => Promise<bigint[]> {
865
884
  const balances = async (...addressLikes: (AztecAddress | { address: AztecAddress })[]) => {
866
885
  const addresses = addressLikes.map(addressLike => ('address' in addressLike ? addressLike.address : addressLike));
867
- const b = await Promise.all(addresses.map(address => method(address).simulate({ from })));
886
+ const b = await Promise.all(
887
+ addresses.map(async address => (await method(address).simulate({ from: address })).result),
888
+ );
868
889
  const debugString = `${symbol} balances: ${addresses.map((address, i) => `${address}: ${b[i]}`).join(', ')}`;
869
890
  logger.verbose(debugString);
870
891
  return b;
@@ -900,100 +921,56 @@ export async function expectMappingDelta<K, V extends number | bigint>(
900
921
  }
901
922
 
902
923
  /**
903
- * Registers the contract class used for test accounts and publicly deploys the instances requested.
904
- * 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).
905
929
  */
906
- export async function ensureAccountContractsPublished(wallet: Wallet, accountsToDeploy: AztecAddress[]) {
907
- const accountsAndAddresses = await Promise.all(
908
- accountsToDeploy.map(async address => {
909
- return {
910
- address,
911
- deployed: (await wallet.getContractMetadata(address)).isContractPublished,
912
- };
913
- }),
914
- );
915
- const instances = (
916
- await Promise.all(
917
- accountsAndAddresses
918
- .filter(({ deployed }) => !deployed)
919
- .map(({ address }) => wallet.getContractMetadata(address)),
920
- )
921
- ).map(contractMetadata => contractMetadata.instance);
922
- const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
923
- if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
924
- await (await publishContractClass(wallet, SchnorrAccountContractArtifact))
925
- .send({ from: accountsToDeploy[0] })
926
- .wait();
927
- }
928
- const requests = instances.map(instance => publishInstance(wallet, instance!));
929
- const batch = new BatchCall(wallet, requests);
930
- await batch.send({ from: accountsToDeploy[0] }).wait();
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
+ });
931
941
  }
932
942
 
933
943
  /**
934
- * Helper function to deploy accounts.
935
- * 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).
936
948
  */
937
- export const deployAccounts =
938
- (numberOfAccounts: number, logger: Logger) =>
939
- async ({ wallet, initialFundedAccounts }: { wallet: TestWallet; initialFundedAccounts: InitialAccountData[] }) => {
940
- if (initialFundedAccounts.length < numberOfAccounts) {
941
- throw new Error(`Cannot deploy more than ${initialFundedAccounts.length} initial accounts.`);
942
- }
943
-
944
- logger.verbose('Deploying accounts funded with fee juice...');
945
- const deployedAccounts = initialFundedAccounts.slice(0, numberOfAccounts);
946
- // Serial due to https://github.com/AztecProtocol/aztec-packages/issues/12045
947
- for (let i = 0; i < deployedAccounts.length; i++) {
948
- const accountManager = await wallet.createSchnorrAccount(
949
- deployedAccounts[i].secret,
950
- deployedAccounts[i].salt,
951
- deployedAccounts[i].signingKey,
952
- );
953
- const deployMethod = await accountManager.getDeployMethod();
954
- await deployMethod
955
- .send({
956
- from: AztecAddress.ZERO,
957
- skipClassPublication: i !== 0, // Publish the contract class at most once.
958
- })
959
- .wait();
960
- }
961
-
962
- return { deployedAccounts };
963
- };
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
+ }
964
959
 
965
960
  /**
966
- * Registers the contract class used for test accounts and publicly deploys the instances requested.
967
- * 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.
968
964
  */
969
- export async function publicDeployAccounts(
970
- wallet: Wallet,
971
- accountsToDeploy: AztecAddress[],
972
- waitUntilProven = false,
973
- node?: AztecNode,
974
- ) {
975
- const instances = (await Promise.all(accountsToDeploy.map(account => wallet.getContractMetadata(account)))).map(
976
- metadata => metadata.instance,
977
- );
978
-
979
- const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
980
- const alreadyRegistered = (await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered;
981
-
982
- const calls: ContractFunctionInteraction[] = await Promise.all([
983
- ...(!alreadyRegistered ? [publishContractClass(wallet, SchnorrAccountContractArtifact)] : []),
984
- ...instances.map(instance => publishInstance(wallet, instance!)),
985
- ]);
986
-
987
- const batch = new BatchCall(wallet, calls);
988
-
989
- const txReceipt = await batch.send({ from: accountsToDeploy[0] }).wait();
990
- if (waitUntilProven) {
991
- if (!node) {
992
- throw new Error('Need to provide an AztecNode to wait for proven.');
993
- } else {
994
- await waitForProven(node, txReceipt);
995
- }
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 });
996
972
  }
973
+ await wallet.registerContract(instance, HandshakeRegistryArtifact);
997
974
  }
998
975
 
999
976
  /**