@aztec/end-to-end 0.0.1-commit.4d3c002 → 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 (298) 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 +23 -36
  18. package/dest/automine/token/token_contract_test.d.ts +40 -0
  19. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  20. package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +24 -39
  21. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  22. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  23. package/dest/automine/token/token_test_helpers.js +97 -0
  24. package/dest/bench/client_flows/benchmark.d.ts +15 -1
  25. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  26. package/dest/bench/client_flows/benchmark.js +19 -0
  27. package/dest/bench/client_flows/client_flows_benchmark.d.ts +5 -5
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +45 -29
  30. package/dest/bench/client_flows/data_extractor.js +1 -0
  31. package/dest/bench/utils.d.ts +3 -3
  32. package/dest/bench/utils.d.ts.map +1 -1
  33. package/dest/bench/utils.js +97 -6
  34. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  35. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  36. package/dest/composed/ha/ha_full_setup.js +383 -0
  37. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  38. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  39. package/dest/fixtures/authwit_proxy.d.ts +1 -1
  40. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  41. package/dest/fixtures/authwit_proxy.js +4 -0
  42. package/dest/fixtures/e2e_prover_test.d.ts +12 -9
  43. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  44. package/dest/fixtures/e2e_prover_test.js +50 -30
  45. package/dest/fixtures/fixtures.d.ts +79 -1
  46. package/dest/fixtures/fixtures.d.ts.map +1 -1
  47. package/dest/fixtures/fixtures.js +80 -0
  48. package/dest/fixtures/ha_setup.d.ts +4 -4
  49. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  50. package/dest/fixtures/ha_setup.js +5 -2
  51. package/dest/fixtures/index.d.ts +2 -1
  52. package/dest/fixtures/index.d.ts.map +1 -1
  53. package/dest/fixtures/index.js +1 -0
  54. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  55. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  56. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  57. package/dest/fixtures/setup.d.ts +71 -41
  58. package/dest/fixtures/setup.d.ts.map +1 -1
  59. package/dest/fixtures/setup.js +277 -198
  60. package/dest/fixtures/setup_p2p_test.d.ts +10 -6
  61. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  62. package/dest/fixtures/setup_p2p_test.js +11 -11
  63. package/dest/fixtures/timing.d.ts +42 -0
  64. package/dest/fixtures/timing.d.ts.map +1 -0
  65. package/dest/fixtures/timing.js +72 -0
  66. package/dest/fixtures/token_utils.d.ts +22 -4
  67. package/dest/fixtures/token_utils.d.ts.map +1 -1
  68. package/dest/fixtures/token_utils.js +21 -1
  69. package/dest/fixtures/utils.d.ts +2 -2
  70. package/dest/fixtures/utils.d.ts.map +1 -1
  71. package/dest/fixtures/utils.js +1 -1
  72. package/dest/fixtures/wait_helpers.d.ts +135 -0
  73. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  74. package/dest/fixtures/wait_helpers.js +154 -0
  75. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  76. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  77. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  78. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  79. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  80. package/dest/forward-compatibility/wallet_service.js +109 -0
  81. package/dest/install_legacy_contracts.d.cts +10 -0
  82. package/dest/install_legacy_contracts.d.cts.map +1 -0
  83. package/dest/legacy-jest-resolver.d.cts +3 -0
  84. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  85. package/dest/multi-node/block-production/setup.d.ts +97 -0
  86. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  87. package/dest/multi-node/block-production/setup.js +158 -0
  88. package/dest/multi-node/governance/setup.d.ts +67 -0
  89. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  90. package/dest/multi-node/governance/setup.js +126 -0
  91. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  92. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  93. package/dest/multi-node/multi_node_test_context.js +347 -0
  94. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  95. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  96. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  97. package/dest/multi-node/slashing/setup.d.ts +167 -0
  98. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  99. package/dest/multi-node/slashing/setup.js +275 -0
  100. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +19 -10
  101. package/dest/p2p/p2p_network.d.ts.map +1 -0
  102. package/dest/{e2e_p2p → p2p}/p2p_network.js +81 -38
  103. package/dest/p2p/reqresp/utils.d.ts +19 -0
  104. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  105. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +32 -29
  106. package/dest/p2p/shared.d.ts +72 -0
  107. package/dest/p2p/shared.d.ts.map +1 -0
  108. package/dest/p2p/shared.js +212 -0
  109. package/dest/shared/cross_chain_test_harness.d.ts +6 -4
  110. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  111. package/dest/shared/cross_chain_test_harness.js +25 -20
  112. package/dest/shared/gas_portal_test_harness.d.ts +8 -5
  113. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  114. package/dest/shared/gas_portal_test_harness.js +24 -12
  115. package/dest/shared/submit-transactions.d.ts +1 -1
  116. package/dest/shared/submit-transactions.d.ts.map +1 -1
  117. package/dest/shared/submit-transactions.js +12 -5
  118. package/dest/shared/timing_env.d.js +5 -0
  119. package/dest/shared/timing_env.js +365 -0
  120. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  121. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  122. package/dest/shared/uniswap_l1_l2.js +50 -37
  123. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  124. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  125. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  126. package/dest/simulators/lending_simulator.d.ts +10 -3
  127. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  128. package/dest/simulators/lending_simulator.js +24 -12
  129. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  130. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  131. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  132. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  133. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  134. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  135. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  136. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  137. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  138. package/dest/single-node/fees/fees_test.d.ts +93 -0
  139. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  140. package/dest/{e2e_fees → single-node/fees}/fees_test.js +78 -59
  141. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  142. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  143. package/dest/single-node/l1-reorgs/setup.js +57 -0
  144. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  145. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  146. package/dest/single-node/partial-proofs/setup.js +5 -0
  147. package/dest/single-node/proving/setup.d.ts +5 -0
  148. package/dest/single-node/proving/setup.d.ts.map +1 -0
  149. package/dest/single-node/proving/setup.js +5 -0
  150. package/dest/single-node/recovery/setup.d.ts +5 -0
  151. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  152. package/dest/single-node/recovery/setup.js +5 -0
  153. package/dest/single-node/setup.d.ts +49 -0
  154. package/dest/single-node/setup.d.ts.map +1 -0
  155. package/dest/single-node/setup.js +56 -0
  156. package/dest/single-node/single_node_test_context.d.ts +360 -0
  157. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  158. package/dest/single-node/single_node_test_context.js +833 -0
  159. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  160. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  161. package/dest/spartan/setup_test_wallets.js +28 -12
  162. package/dest/spartan/tx_metrics.d.ts +27 -4
  163. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  164. package/dest/spartan/tx_metrics.js +105 -20
  165. package/dest/spartan/utils/config.d.ts +9 -35
  166. package/dest/spartan/utils/config.d.ts.map +1 -1
  167. package/dest/spartan/utils/nodes.js +2 -2
  168. package/dest/test-wallet/test_wallet.d.ts +39 -10
  169. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  170. package/dest/test-wallet/test_wallet.js +166 -59
  171. package/dest/test-wallet/utils.d.ts +38 -3
  172. package/dest/test-wallet/utils.d.ts.map +1 -1
  173. package/dest/test-wallet/utils.js +65 -10
  174. package/dest/test-wallet/wallet_worker_script.js +12 -4
  175. package/dest/test-wallet/worker_wallet.d.ts +9 -8
  176. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  177. package/dest/test-wallet/worker_wallet.js +10 -4
  178. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
  179. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  180. package/dest/test-wallet/worker_wallet_schema.js +15 -2
  181. package/package.json +47 -42
  182. package/src/automine/README.md +60 -0
  183. package/src/automine/automine_test_context.ts +153 -0
  184. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  185. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  186. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +24 -47
  187. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +25 -48
  188. package/src/automine/token/token_test_helpers.ts +138 -0
  189. package/src/bench/client_flows/benchmark.ts +21 -0
  190. package/src/bench/client_flows/client_flows_benchmark.ts +77 -56
  191. package/src/bench/client_flows/data_extractor.ts +1 -0
  192. package/src/bench/utils.ts +110 -6
  193. package/src/composed/ha/ha_full_setup.ts +466 -0
  194. package/src/fixtures/authwit_proxy.ts +4 -0
  195. package/src/fixtures/e2e_prover_test.ts +64 -48
  196. package/src/fixtures/fixtures.ts +100 -0
  197. package/src/fixtures/ha_setup.ts +11 -5
  198. package/src/fixtures/index.ts +1 -0
  199. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  200. package/src/fixtures/setup.ts +336 -255
  201. package/src/fixtures/setup_p2p_test.ts +15 -11
  202. package/src/fixtures/timing.ts +97 -0
  203. package/src/fixtures/token_utils.ts +39 -4
  204. package/src/fixtures/utils.ts +2 -3
  205. package/src/fixtures/wait_helpers.ts +333 -0
  206. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  207. package/src/forward-compatibility/wallet_service.ts +106 -0
  208. package/src/guides/up_quick_start.sh +5 -2
  209. package/src/infra/README.md +12 -0
  210. package/src/install_legacy_contracts.cjs +75 -0
  211. package/src/legacy-jest-resolver.cjs +112 -0
  212. package/src/multi-node/README.md +95 -0
  213. package/src/multi-node/block-production/setup.ts +272 -0
  214. package/src/multi-node/governance/setup.ts +172 -0
  215. package/src/multi-node/multi_node_test_context.ts +447 -0
  216. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  217. package/src/multi-node/slashing/setup.ts +433 -0
  218. package/src/p2p/README.md +78 -0
  219. package/src/{e2e_p2p → p2p}/p2p_network.ts +92 -49
  220. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +35 -28
  221. package/src/p2p/shared.ts +329 -0
  222. package/src/shared/cross_chain_test_harness.ts +35 -14
  223. package/src/shared/gas_portal_test_harness.ts +32 -14
  224. package/src/shared/submit-transactions.ts +13 -5
  225. package/src/shared/timing_env.d.mts +39 -0
  226. package/src/shared/timing_env.mjs +363 -0
  227. package/src/shared/uniswap_l1_l2.ts +80 -43
  228. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  229. package/src/simulators/lending_simulator.ts +28 -14
  230. package/src/single-node/README.md +60 -0
  231. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  232. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  233. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  234. package/src/{e2e_fees → single-node/fees}/fees_test.ts +103 -66
  235. package/src/single-node/l1-reorgs/setup.ts +93 -0
  236. package/src/single-node/partial-proofs/setup.ts +8 -0
  237. package/src/single-node/proving/setup.ts +15 -0
  238. package/src/single-node/recovery/setup.ts +8 -0
  239. package/src/single-node/setup.ts +63 -0
  240. package/src/single-node/single_node_test_context.ts +1041 -0
  241. package/src/spartan/setup_test_wallets.ts +30 -13
  242. package/src/spartan/tx_metrics.ts +107 -23
  243. package/src/spartan/utils/nodes.ts +2 -2
  244. package/src/test-wallet/test_wallet.ts +185 -60
  245. package/src/test-wallet/utils.ts +104 -11
  246. package/src/test-wallet/wallet_worker_script.ts +11 -5
  247. package/src/test-wallet/worker_wallet.ts +19 -16
  248. package/src/test-wallet/worker_wallet_schema.ts +4 -3
  249. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
  250. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  251. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  252. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  253. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  254. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  255. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  256. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  257. package/dest/e2e_epochs/epochs_test.d.ts +0 -104
  258. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  259. package/dest/e2e_epochs/epochs_test.js +0 -389
  260. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  261. package/dest/e2e_fees/fees_test.d.ts +0 -88
  262. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  263. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  264. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  265. package/dest/e2e_l1_publisher/write_json.js +0 -56
  266. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  267. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  268. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  269. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  270. package/dest/e2e_nested_contract/nested_contract_test.js +0 -54
  271. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  272. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  273. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  274. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  275. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  276. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  277. package/dest/e2e_p2p/shared.d.ts +0 -66
  278. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  279. package/dest/e2e_p2p/shared.js +0 -212
  280. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  281. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  282. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  283. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  284. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  285. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  286. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  287. package/src/e2e_epochs/epochs_test.ts +0 -499
  288. package/src/e2e_l1_publisher/write_json.ts +0 -77
  289. package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
  290. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  291. package/src/e2e_p2p/shared.ts +0 -343
  292. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  293. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  294. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  295. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  296. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  297. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  298. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -1,21 +1,13 @@
1
- import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
1
  import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
3
- import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
4
- import { NO_FROM } from '@aztec/aztec.js/account';
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';
10
+ import { CheatCodes } from '@aztec/aztec/testing';
19
11
  import { SPONSORED_FPC_SALT } from '@aztec/constants';
20
12
  import { isAnvilTestChain } from '@aztec/ethereum/chain';
21
13
  import { createExtendedL1Client } from '@aztec/ethereum/client';
@@ -30,15 +22,15 @@ import {
30
22
  deployAztecL1Contracts,
31
23
  } from '@aztec/ethereum/deploy-aztec-l1-contracts';
32
24
  import type { Delayer } from '@aztec/ethereum/l1-tx-utils';
33
- import { EthCheatCodes, EthCheatCodesWithState, startAnvil } from '@aztec/ethereum/test';
25
+ import { EthCheatCodes, EthCheatCodesWithState, startAnvil, warmBlobKzg } from '@aztec/ethereum/test';
34
26
  import type { Anvil } from '@aztec/ethereum/test';
27
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
35
28
  import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
36
29
  import { SecretValue } from '@aztec/foundation/config';
37
30
  import { randomBytes } from '@aztec/foundation/crypto/random';
38
31
  import { tryRmDir } from '@aztec/foundation/fs';
39
32
  import { withLoggerBindings } from '@aztec/foundation/log/server';
40
33
  import { retryUntil } from '@aztec/foundation/retry';
41
- import { sleep } from '@aztec/foundation/sleep';
42
34
  import { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
43
35
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
44
36
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
@@ -46,12 +38,17 @@ import type { P2PClientDeps } from '@aztec/p2p';
46
38
  import { MockGossipSubNetwork, getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
47
39
  import { protocolContractsHash } from '@aztec/protocol-contracts';
48
40
  import type { ProverNodeConfig } from '@aztec/prover-node';
49
- import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
41
+ import { type PXEConfig, type PXECreationOptions, getPXEConfig } from '@aztec/pxe/server';
50
42
  import type { SequencerClient } from '@aztec/sequencer-client';
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';
51
47
  import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
52
- import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
48
+ import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
53
49
  import { tryStop } from '@aztec/stdlib/interfaces/server';
54
50
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
51
+ import type { GenesisData } from '@aztec/stdlib/world-state';
55
52
  import {
56
53
  type TelemetryClient,
57
54
  type TelemetryClientConfig,
@@ -59,7 +56,7 @@ import {
59
56
  initTelemetryClient,
60
57
  } from '@aztec/telemetry-client';
61
58
  import { BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
62
- import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
59
+ import { createFundedInitializerlessAccounts } from '@aztec/wallets/testing';
63
60
  import { getGenesisValues } from '@aztec/world-state/testing';
64
61
 
65
62
  import fs from 'fs/promises';
@@ -80,6 +77,7 @@ import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS }
80
77
  import { getACVMConfig } from './get_acvm_config.js';
81
78
  import { getBBConfig } from './get_bb_config.js';
82
79
  import { isMetricsLoggingRequested, setupMetricsLogger } from './logging.js';
80
+ import { testSpan } from './timing.js';
83
81
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
84
82
 
85
83
  export { startAnvil };
@@ -112,6 +110,8 @@ export async function setupSharedBlobStorage(config: { dataDirectory?: string }
112
110
  /**
113
111
  * Sets up Private eXecution Environment (PXE) and returns the corresponding test wallet.
114
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.
115
115
  * @param opts - Partial configuration for the PXE.
116
116
  * @param logger - The logger to be used.
117
117
  * @param actor - Actor label to include in log output (e.g., 'pxe-test').
@@ -119,6 +119,7 @@ export async function setupSharedBlobStorage(config: { dataDirectory?: string }
119
119
  */
120
120
  export async function setupPXEAndGetWallet(
121
121
  aztecNode: AztecNode,
122
+ nodeDebug: AztecNodeDebug | undefined,
122
123
  opts: Partial<PXEConfig> = {},
123
124
  logger = getLogger(),
124
125
  actor?: string,
@@ -139,7 +140,10 @@ export async function setupPXEAndGetWallet(
139
140
 
140
141
  const teardown = configuredDataDirectory ? () => Promise.resolve() : () => tryRmDir(PXEConfig.dataDirectory!);
141
142
 
142
- const wallet = await TestWallet.create(aztecNode, PXEConfig, { loggerActorLabel: actor });
143
+ const wallet = await TestWallet.create(aztecNode, PXEConfig, {
144
+ loggerActorLabel: actor,
145
+ nodeDebug,
146
+ });
143
147
 
144
148
  return {
145
149
  wallet,
@@ -149,7 +153,7 @@ export async function setupPXEAndGetWallet(
149
153
  }
150
154
 
151
155
  /** Options for the e2e tests setup */
152
- export type SetupOptions = {
156
+ export type SetupOptions<TDeployExtraL1ContractsReturnType = unknown> = {
153
157
  /** State load */
154
158
  stateLoad?: string;
155
159
  /** Whether to enable metrics collection, if undefined, metrics collection is disabled */
@@ -158,10 +162,11 @@ export type SetupOptions = {
158
162
  deployL1ContractsValues?: DeployAztecL1ContractsReturnType;
159
163
  /** Initial fee juice for default accounts */
160
164
  initialAccountFeeJuice?: Fr;
161
- /** Number of initial accounts funded with fee juice */
162
- numberOfInitialFundedAccounts?: number;
163
- /** Data of the initial funded accounts */
164
- 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[];
165
170
  /** An initial set of validators */
166
171
  initialValidators?: (Operator & { privateKey: `0x${string}` })[];
167
172
  /** Anvil Start time */
@@ -178,10 +183,28 @@ export type SetupOptions = {
178
183
  proverNodeConfig?: Partial<ProverNodeConfig>;
179
184
  /** Whether to use a mock gossip sub network for p2p clients. */
180
185
  mockGossipSubNetwork?: boolean;
181
- /** Whether to disable the anvil test watcher (can still be manually started) */
182
- disableAnvilTestWatcher?: boolean;
183
- /** 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
+ */
184
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>;
185
208
  /** How many accounts to seed and unlock in anvil. */
186
209
  anvilAccounts?: number;
187
210
  /** Port to start anvil (defaults to 8545) */
@@ -197,20 +220,26 @@ export type SetupOptions = {
197
220
  zkPassportArgs?: ZKPassportArgs;
198
221
  /** Whether to fund the sponsored FPC in genesis (defaults to false). */
199
222
  fundSponsoredFPC?: boolean;
200
- /** Whether to skip deploying accounts during setup (legacy behavior for tests using deployAccounts helper). */
201
- skipAccountDeployment?: boolean;
202
223
  /** L1 contracts deployment arguments. */
203
224
  l1ContractsArgs?: Partial<DeployAztecL1ContractsArgs>;
204
- /** Wallet minimum fee padding multiplier (defaults to 0.5, which is 50% padding). */
225
+ /** Wallet minimum fee padding multiplier */
205
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;
206
235
  } & Partial<AztecNodeConfig>;
207
236
 
208
237
  /** Context for an end-to-end test as returned by the `setup` function */
209
- export type EndToEndContext = {
238
+ export type EndToEndContext<TDeployExtraL1ContractsReturnType = unknown> = {
210
239
  /** The Anvil instance (only set if anvil was started locally). */
211
240
  anvil: Anvil | undefined;
212
241
  /** The Aztec Node service or client a connected to it. */
213
- aztecNode: AztecNode;
242
+ aztecNode: AztecNode & AztecNodeDebug;
214
243
  /** The Aztec Node as a service. */
215
244
  aztecNodeService: AztecNodeService;
216
245
  /** Client to the Aztec Node admin interface. */
@@ -225,8 +254,8 @@ export type EndToEndContext = {
225
254
  config: AztecNodeConfig;
226
255
  /** The Aztec Node configuration (alias for config for backward compatibility). */
227
256
  aztecNodeConfig: AztecNodeConfig;
228
- /** The data for the initial funded accounts. */
229
- initialFundedAccounts: InitialAccountData[];
257
+ /** Data for the extra accounts funded at genesis but not created by setup (the test creates/deploys them). */
258
+ additionallyFundedAccounts: InitialAccountData[];
230
259
  /** The wallet to be used. */
231
260
  wallet: TestWallet;
232
261
  /** The wallets to be used. */
@@ -237,8 +266,6 @@ export type EndToEndContext = {
237
266
  cheatCodes: CheatCodes;
238
267
  /** The cheat codes for L1 */
239
268
  ethCheatCodes: EthCheatCodes;
240
- /** The anvil test watcher. */
241
- watcher: AnvilTestWatcher;
242
269
  /** Allows tweaking current system time, used by the epoch cache only. */
243
270
  dateProvider: TestDateProvider;
244
271
  /** Telemetry client */
@@ -249,8 +276,10 @@ export type EndToEndContext = {
249
276
  sequencerDelayer: Delayer | undefined;
250
277
  /** Delayer for prover node L1 txs (only when enableDelayer and startProverNode are true). */
251
278
  proverDelayer: Delayer | undefined;
252
- /** Prefilled public data used for setting up nodes. */
253
- prefilledPublicData: PublicDataTreeLeaf[] | 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,16 +368,12 @@ 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;
291
371
  // Enable the tx delayer for tests (default config has it disabled, so we force-enable it here)
292
372
  config.enableDelayer = true;
293
373
  config.listenAddress = '127.0.0.1';
294
374
 
295
375
  config.minTxPoolAgeMs = opts.minTxPoolAgeMs ?? 0;
296
376
 
297
- const logger = getLogger();
298
-
299
377
  // Create a temp directory for any services that need it and cleanup later
300
378
  const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex'));
301
379
  await fs.mkdir(directoryToCleanup, { recursive: true });
@@ -309,16 +387,19 @@ export async function setup(
309
387
  if (!isAnvilTestChain(chain.id)) {
310
388
  throw new Error(`No ETHEREUM_HOSTS set but non anvil chain requested`);
311
389
  }
312
- const res = await startAnvil({
313
- l1BlockTime: opts.ethereumSlotDuration,
314
- accounts: opts.anvilAccounts,
315
- port: opts.anvilPort ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : undefined),
316
- slotsInAnEpoch: opts.anvilSlotsInAnEpoch,
317
- dateProvider,
318
- });
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
+ );
319
399
  anvil = res.anvil;
320
400
  config.l1RpcUrls = [res.rpcUrl];
321
401
  }
402
+ logger.trace('Started anvil and L1 RPC client');
322
403
 
323
404
  // Enable logging metrics to a local file named after the test suite
324
405
  if (isMetricsLoggingRequested()) {
@@ -335,6 +416,7 @@ export async function setup(
335
416
  if (opts.l1StartTime) {
336
417
  await ethCheatCodes.warp(opts.l1StartTime, { resetBlockInterval: true });
337
418
  }
419
+ logger.trace('Initialized L1 cheat codes and applied state/time overrides');
338
420
 
339
421
  let publisherPrivKeyHex: `0x${string}` | undefined = undefined;
340
422
  let publisherHdAccount: HDAccount | PrivateKeyAccount | undefined = undefined;
@@ -362,24 +444,30 @@ export async function setup(
362
444
  if (config.coinbase === undefined) {
363
445
  config.coinbase = EthAddress.fromString(publisherHdAccount.address);
364
446
  }
447
+ logger.trace('Resolved L1 publisher account');
365
448
 
366
- // Determine which addresses to fund in genesis
367
- const initialFundedAccounts =
368
- opts.initialFundedAccounts ??
369
- (await generateSchnorrAccounts(opts.numberOfInitialFundedAccounts ?? Math.max(numberOfAccounts, 10)));
370
- 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);
371
455
 
372
456
  // Optionally fund the sponsored FPC
373
457
  if (opts.fundSponsoredFPC) {
374
458
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
375
459
  addressesToFund.push(sponsoredFPCAddress);
376
460
  }
461
+ logger.trace('Generated test accounts to fund at genesis');
377
462
 
378
- const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(
463
+ const genesisTimestamp = BigInt(Math.floor(Date.now() / 1000));
464
+ const { genesisArchiveRoot, genesis, fundingNeeded } = await getGenesisValues(
379
465
  addressesToFund,
380
466
  opts.initialAccountFeeJuice,
381
467
  opts.genesisPublicData,
468
+ genesisTimestamp,
382
469
  );
470
+ logger.trace('Computed genesis values');
383
471
 
384
472
  const wasAutomining = await ethCheatCodes.isAutoMining();
385
473
  const enableAutomine = opts.automineL1Setup && !wasAutomining && isAnvilTestChain(chain.id);
@@ -389,18 +477,21 @@ export async function setup(
389
477
 
390
478
  const l1Client = createExtendedL1Client(config.l1RpcUrls, publisherHdAccount!, chain);
391
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
+
392
485
  // Deploy Multicall3 if running locally
393
486
  await deployMulticall3(l1Client, logger);
394
487
 
395
488
  // Force viem to refresh its nonce cache to avoid "nonce too low" errors in subsequent transactions
396
489
  // This is necessary because deployMulticall3 sends multiple transactions and viem may cache a stale nonce
397
490
  await l1Client.getTransactionCount({ address: l1Client.account.address });
491
+ logger.trace('Deployed Multicall3');
398
492
 
399
- const deployL1ContractsValues: DeployAztecL1ContractsReturnType = await deployAztecL1Contracts(
400
- config.l1RpcUrls[0],
401
- publisherPrivKeyHex!,
402
- chain.id,
403
- {
493
+ const deployL1ContractsValues: DeployAztecL1ContractsReturnType = await testSpan('setup:env:l1-deploy', () =>
494
+ deployAztecL1Contracts(config.l1RpcUrls[0], publisherPrivKeyHex!, chain.id, {
404
495
  ...getL1ContractsConfigEnvVars(),
405
496
  ...opts,
406
497
  ...opts.l1ContractsArgs,
@@ -410,20 +501,52 @@ export async function setup(
410
501
  initialValidators: opts.initialValidators,
411
502
  feeJuicePortalInitialBalance: fundingNeeded,
412
503
  realVerifier: false,
413
- },
504
+ }),
414
505
  );
415
506
 
416
- config.l1Contracts = deployL1ContractsValues.l1ContractAddresses;
507
+ Object.assign(config, deployL1ContractsValues.l1ContractAddresses);
417
508
  config.rollupVersion = deployL1ContractsValues.rollupVersion;
418
509
 
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
+ }
526
+ }
527
+
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 });
541
+ }
542
+
419
543
  if (enableAutomine) {
420
- await ethCheatCodes.setAutomine(false);
421
- await ethCheatCodes.setIntervalMining(config.ethereumSlotDuration);
544
+ await ethCheatCodes.startIntervalMiningWithFreshBlock(config.ethereumSlotDuration);
422
545
  }
423
546
 
424
547
  // In compose mode (no local anvil), sync dateProvider to L1 time since it may have drifted
425
- // ahead of system time due to the local-network watcher warping time forward on each filled slot.
426
- // When running with a local anvil, the dateProvider is kept in sync via the stdout listener.
548
+ // ahead of system time. When running with a local anvil, the dateProvider is kept in sync via
549
+ // the stdout listener.
427
550
  if (!anvil) {
428
551
  dateProvider.setTime((await ethCheatCodes.lastBlockTimestamp()) * 1000);
429
552
  }
@@ -431,61 +554,43 @@ export async function setup(
431
554
  if (opts.l2StartTime) {
432
555
  await ethCheatCodes.warp(opts.l2StartTime, { resetBlockInterval: true });
433
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');
434
571
 
435
- const watcher = new AnvilTestWatcher(
436
- new EthCheatCodesWithState(config.l1RpcUrls, dateProvider),
437
- deployL1ContractsValues.l1ContractAddresses.rollupAddress,
438
- deployL1ContractsValues.l1Client,
439
- dateProvider,
440
- );
441
- if (!opts.disableAnvilTestWatcher) {
442
- await watcher.start();
443
- }
444
-
445
- // Use metricsPort-based telemetry if provided, otherwise use the regular telemetry client
446
- const telemetryClient = opts.metricsPort
447
- ? await getEndToEndTestTelemetryClient(opts.metricsPort)
448
- : await getTelemetryClient(opts.telemetryConfig);
449
-
450
- await setupSharedBlobStorage(config);
451
-
452
- logger.verbose('Creating and synching an aztec node', config);
453
-
454
- const acvmConfig = await getACVMConfig(logger);
455
572
  if (acvmConfig) {
456
573
  config.acvmWorkingDirectory = acvmConfig.acvmWorkingDirectory;
457
574
  config.acvmBinaryPath = acvmConfig.acvmBinaryPath;
458
575
  }
576
+ logger.trace('Resolved ACVM config');
459
577
 
460
- const bbConfig = await getBBConfig(logger);
461
578
  if (bbConfig) {
462
579
  config.bbBinaryPath = bbConfig.bbBinaryPath;
463
580
  config.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
464
581
  }
582
+ logger.trace('Resolved Barretenberg config');
583
+
584
+ logger.verbose('Creating and synching an aztec node', config);
465
585
 
466
586
  let mockGossipSubNetwork: MockGossipSubNetwork | undefined;
467
587
  let p2pClientDeps: P2PClientDeps | undefined = undefined;
468
588
 
469
589
  if (opts.mockGossipSubNetwork) {
470
- mockGossipSubNetwork = new MockGossipSubNetwork();
590
+ mockGossipSubNetwork = new MockGossipSubNetwork(opts.mockGossipSubNetworkLatency);
471
591
  p2pClientDeps = { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) };
472
592
  }
473
593
 
474
- // Transactions built against the genesis state must be included in block 1, otherwise they are dropped.
475
- // To avoid test failures from dropped transactions, we ensure progression beyond genesis before proceeding.
476
- // For account deployments, we set minTxsPerBlock=1 and deploy accounts sequentially for guaranteed success.
477
- // If no accounts need deployment, we await an empty block to confirm network progression.
478
- const originalMinTxsPerBlock = config.minTxsPerBlock;
479
- if (originalMinTxsPerBlock === undefined) {
480
- throw new Error('minTxsPerBlock is undefined in e2e test setup');
481
- }
482
-
483
- // Only set minTxsPerBlock=1 if we're going to deploy accounts and need reliable block inclusion
484
- const shouldDeployAccounts = numberOfAccounts > 0 && !opts.skipAccountDeployment;
485
- // Only set minTxsPerBlock=0 if we need an empty block (no accounts at all, not skipped deployment)
486
- const needsEmptyBlock = numberOfAccounts === 0 && !opts.skipAccountDeployment;
487
- config.minTxsPerBlock = shouldDeployAccounts ? 1 : needsEmptyBlock ? 0 : originalMinTxsPerBlock;
488
-
489
594
  config.p2pEnabled = opts.mockGossipSubNetwork || config.p2pEnabled;
490
595
  config.p2pIp = opts.p2pIp ?? config.p2pIp ?? '127.0.0.1';
491
596
 
@@ -495,14 +600,29 @@ export async function setup(
495
600
  }
496
601
  }
497
602
 
498
- const aztecNodeService = await withLoggerBindings({ actor: 'node-0' }, () =>
499
- AztecNodeService.createAndSync(
500
- config,
501
- { dateProvider, telemetry: telemetryClient, p2pClientDeps },
502
- { 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
+ ),
503
622
  ),
504
623
  );
505
624
  const sequencerClient = aztecNodeService.getSequencer();
625
+ logger.trace('Created and synced aztec node');
506
626
 
507
627
  let proverNode: AztecNodeService | undefined = undefined;
508
628
  if (opts.startProverNode) {
@@ -516,16 +636,19 @@ export async function setup(
516
636
  rpcTxProviders: [aztecNodeService],
517
637
  };
518
638
 
519
- ({ proverNode } = await createAndSyncProverNode(
520
- proverNodePrivateKeyHex,
521
- config,
522
- {
523
- ...config.proverNodeConfig,
524
- dataDirectory: proverNodeDataDirectory,
525
- },
526
- { dateProvider, p2pClientDeps, telemetry: telemetryClient },
527
- { prefilledPublicData },
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
+ ),
528
650
  ));
651
+ logger.trace('Created prover node');
529
652
  }
530
653
 
531
654
  const sequencerDelayer = sequencerClient?.getDelayer();
@@ -536,13 +659,22 @@ export async function setup(
536
659
  pxeConfig.dataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
537
660
  // For tests we only want proving enabled if specifically requested
538
661
  pxeConfig.proverEnabled = !!pxeOpts.proverEnabled;
539
- 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
+ );
540
670
 
541
671
  if (opts.walletMinFeePadding !== undefined) {
542
672
  wallet.setMinFeePadding(opts.walletMinFeePadding);
543
673
  }
674
+ logger.trace('Created PXE and test wallet');
544
675
 
545
676
  const cheatCodes = await CheatCodes.create(config.l1RpcUrls, aztecNodeService, dateProvider);
677
+ logger.trace('Created cheat codes');
546
678
 
547
679
  if (
548
680
  (opts.aztecTargetCommitteeSize && opts.aztecTargetCommitteeSize > 0) ||
@@ -556,64 +688,48 @@ export async function setup(
556
688
  );
557
689
  await cheatCodes.rollup.setupEpoch();
558
690
  await cheatCodes.rollup.debugRollup();
691
+ logger.trace('Advanced chain to set up validator committee');
559
692
  }
560
693
 
561
694
  let accounts: AztecAddress[] = [];
562
695
 
563
- if (shouldDeployAccounts) {
564
- logger.info(
565
- `${numberOfAccounts} accounts are being deployed. Reliably progressing past genesis by setting minTxsPerBlock to 1 and waiting for the accounts to be deployed`,
566
- );
567
- const accountsData = initialFundedAccounts.slice(0, numberOfAccounts);
568
- const accountManagers = await deployFundedSchnorrAccounts(wallet, accountsData);
569
- accounts = accountManagers.map(accountManager => accountManager.address);
570
- } else if (needsEmptyBlock) {
571
- logger.info('No accounts are being deployed, waiting for an empty block 1 to be mined');
572
- while ((await aztecNodeService.getBlockNumber()) === 0) {
573
- await sleep(2000);
574
- }
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);
575
702
  }
576
- // If skipAccountDeployment is true, we don't deploy or wait - tests will handle account deployment later
703
+ logger.trace('Created funded test accounts');
577
704
 
578
- // Now we restore the original minTxsPerBlock setting if we changed it.
579
- if (sequencerClient && config.minTxsPerBlock !== originalMinTxsPerBlock) {
580
- sequencerClient.getSequencer().updateConfig({ minTxsPerBlock: originalMinTxsPerBlock });
581
- }
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);
582
711
 
583
- if (initialFundedAccounts.length < numberOfAccounts) {
584
- throw new Error(
585
- `Unable to deploy ${numberOfAccounts} accounts. Only ${initialFundedAccounts.length} accounts were funded.`,
586
- );
587
- }
712
+ if (acvmConfig?.cleanup) {
713
+ await acvmConfig.cleanup();
714
+ }
588
715
 
589
- const teardown = async () => {
590
- try {
591
- await tryStop(wallet, logger);
592
- await tryStop(aztecNodeService, logger);
593
- await tryStop(proverNode, logger);
716
+ if (bbConfig?.cleanup) {
717
+ await bbConfig.cleanup();
718
+ }
594
719
 
595
- if (acvmConfig?.cleanup) {
596
- await acvmConfig.cleanup();
597
- }
720
+ await tryStop(anvil, logger);
598
721
 
599
- if (bbConfig?.cleanup) {
600
- await bbConfig.cleanup();
601
- }
602
-
603
- await tryStop(watcher, logger);
604
- await tryStop(anvil, logger);
605
-
606
- await tryRmDir(directoryToCleanup, logger);
607
- } catch (err) {
608
- logger.error(`Error during e2e test teardown`, err);
609
- } finally {
610
- try {
611
- await telemetryClient.stop();
722
+ await tryRmDir(directoryToCleanup, logger);
612
723
  } catch (err) {
613
- 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
+ }
614
731
  }
615
- }
616
- };
732
+ });
617
733
 
618
734
  return {
619
735
  anvil,
@@ -626,10 +742,11 @@ export async function setup(
626
742
  aztecNodeConfig: config,
627
743
  dateProvider,
628
744
  deployL1ContractsValues,
629
- initialFundedAccounts,
745
+ additionallyFundedAccounts,
630
746
  logger,
631
747
  mockGossipSubNetwork,
632
- prefilledPublicData,
748
+ genesis,
749
+ extraL1DeployResult,
633
750
  proverNode,
634
751
  sequencerDelayer,
635
752
  proverDelayer,
@@ -638,7 +755,6 @@ export async function setup(
638
755
  telemetryClient,
639
756
  wallet,
640
757
  accounts,
641
- watcher,
642
758
  acvmConfig,
643
759
  bbConfig,
644
760
  directoryToCleanup,
@@ -705,11 +821,16 @@ export async function registerSponsoredFPC(wallet: Wallet): Promise<void> {
705
821
  await wallet.registerContract(await getSponsoredFPCInstance(), SponsoredFPCContract.artifact);
706
822
  }
707
823
 
708
- 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
+ ) {
709
830
  targetBlock ??= await node.getBlockNumber();
710
831
 
711
832
  await retryUntil(
712
- async () => (await node.getProvenBlockNumber()) >= targetBlock,
833
+ async () => (await node.getBlockNumber('proven')) >= targetBlock,
713
834
  'proven chain status',
714
835
  timeoutSec,
715
836
  intervalSec,
@@ -729,10 +850,10 @@ export function createAndSyncProverNode(
729
850
  dateProvider: DateProvider;
730
851
  p2pClientDeps?: P2PClientDeps;
731
852
  },
732
- options: { prefilledPublicData: PublicDataTreeLeaf[]; dontStart?: boolean },
853
+ options: { genesis?: GenesisData; dontStart?: boolean },
733
854
  ): Promise<{ proverNode: AztecNodeService }> {
734
855
  return withLoggerBindings({ actor: 'prover-0' }, async () => {
735
- const proverNode = await AztecNodeService.createAndSync(
856
+ const proverNode = await createAztecNodeService(
736
857
  {
737
858
  ...baseConfig,
738
859
  ...configOverrides,
@@ -742,7 +863,7 @@ export function createAndSyncProverNode(
742
863
  proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
743
864
  },
744
865
  deps,
745
- { ...options, dontStartProverNode: options.dontStart },
866
+ { genesis: options.genesis, dontStartProverNode: options.dontStart },
746
867
  );
747
868
 
748
869
  if (!proverNode.getProverNode()) {
@@ -800,96 +921,56 @@ export async function expectMappingDelta<K, V extends number | bigint>(
800
921
  }
801
922
 
802
923
  /**
803
- * Registers the contract class used for test accounts and publicly deploys the instances requested.
804
- * 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).
805
929
  */
806
- export async function ensureAccountContractsPublished(wallet: Wallet, accountsToDeploy: AztecAddress[]) {
807
- const accountsAndAddresses = await Promise.all(
808
- accountsToDeploy.map(async address => {
809
- return {
810
- address,
811
- deployed: (await wallet.getContractMetadata(address)).isContractPublished,
812
- };
813
- }),
814
- );
815
- const instances = (
816
- await Promise.all(
817
- accountsAndAddresses
818
- .filter(({ deployed }) => !deployed)
819
- .map(({ address }) => wallet.getContractMetadata(address)),
820
- )
821
- ).map(contractMetadata => contractMetadata.instance);
822
- const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
823
- if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
824
- await (await publishContractClass(wallet, SchnorrAccountContractArtifact)).send({ from: accountsToDeploy[0] });
825
- }
826
- const requests = instances.map(instance => publishInstance(wallet, instance!));
827
- const batch = new BatchCall(wallet, requests);
828
- 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
+ });
829
941
  }
830
942
 
831
943
  /**
832
- * Helper function to deploy accounts.
833
- * 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).
834
948
  */
835
- export const deployAccounts =
836
- (numberOfAccounts: number, logger: Logger) =>
837
- async ({ wallet, initialFundedAccounts }: { wallet: TestWallet; initialFundedAccounts: InitialAccountData[] }) => {
838
- if (initialFundedAccounts.length < numberOfAccounts) {
839
- throw new Error(`Cannot deploy more than ${initialFundedAccounts.length} initial accounts.`);
840
- }
841
-
842
- logger.verbose('Deploying accounts funded with fee juice...');
843
- const deployedAccounts = initialFundedAccounts.slice(0, numberOfAccounts);
844
- // Serial due to https://github.com/AztecProtocol/aztec-packages/issues/12045
845
- for (let i = 0; i < deployedAccounts.length; i++) {
846
- const accountManager = await wallet.createSchnorrAccount(
847
- deployedAccounts[i].secret,
848
- deployedAccounts[i].salt,
849
- deployedAccounts[i].signingKey,
850
- );
851
- const deployMethod = await accountManager.getDeployMethod();
852
- await deployMethod.send({
853
- from: NO_FROM,
854
- skipClassPublication: i !== 0, // Publish the contract class at most once.
855
- });
856
- }
857
-
858
- return { deployedAccounts };
859
- };
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
+ }
860
959
 
861
960
  /**
862
- * Registers the contract class used for test accounts and publicly deploys the instances requested.
863
- * 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.
864
964
  */
865
- export async function publicDeployAccounts(
866
- wallet: Wallet,
867
- accountsToDeploy: AztecAddress[],
868
- waitUntilProven = false,
869
- node?: AztecNode,
870
- ) {
871
- const instances = (await Promise.all(accountsToDeploy.map(account => wallet.getContractMetadata(account)))).map(
872
- metadata => metadata.instance,
873
- );
874
-
875
- const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
876
- const alreadyRegistered = (await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered;
877
-
878
- const calls: ContractFunctionInteraction[] = await Promise.all([
879
- ...(!alreadyRegistered ? [publishContractClass(wallet, SchnorrAccountContractArtifact)] : []),
880
- ...instances.map(instance => publishInstance(wallet, instance!)),
881
- ]);
882
-
883
- const batch = new BatchCall(wallet, calls);
884
-
885
- const { receipt: txReceipt } = await batch.send({ from: accountsToDeploy[0] });
886
- if (waitUntilProven) {
887
- if (!node) {
888
- throw new Error('Need to provide an AztecNode to wait for proven.');
889
- } else {
890
- await waitForProven(node, txReceipt);
891
- }
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 });
892
972
  }
973
+ await wallet.registerContract(instance, HandshakeRegistryArtifact);
893
974
  }
894
975
 
895
976
  /**