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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/README.md +229 -14
  2. package/dest/automine/automine_test_context.d.ts +85 -0
  3. package/dest/automine/automine_test_context.d.ts.map +1 -0
  4. package/dest/automine/automine_test_context.js +98 -0
  5. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
  6. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  7. package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
  8. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
  9. package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
  10. package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
  11. package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
  12. package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
  13. package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
  14. package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
  15. package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
  16. package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
  17. package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +23 -36
  18. package/dest/automine/token/token_contract_test.d.ts +40 -0
  19. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  20. package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +24 -39
  21. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  22. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  23. package/dest/automine/token/token_test_helpers.js +97 -0
  24. package/dest/bench/client_flows/benchmark.d.ts +15 -1
  25. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  26. package/dest/bench/client_flows/benchmark.js +19 -0
  27. package/dest/bench/client_flows/client_flows_benchmark.d.ts +5 -5
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +55 -54
  30. package/dest/bench/utils.d.ts +3 -3
  31. package/dest/bench/utils.d.ts.map +1 -1
  32. package/dest/bench/utils.js +97 -6
  33. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  34. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  35. package/dest/composed/ha/ha_full_setup.js +383 -0
  36. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  37. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  38. package/dest/fixtures/authwit_proxy.d.ts +1 -1
  39. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  40. package/dest/fixtures/authwit_proxy.js +4 -0
  41. package/dest/fixtures/e2e_prover_test.d.ts +12 -9
  42. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  43. package/dest/fixtures/e2e_prover_test.js +53 -35
  44. package/dest/fixtures/fixtures.d.ts +79 -1
  45. package/dest/fixtures/fixtures.d.ts.map +1 -1
  46. package/dest/fixtures/fixtures.js +80 -0
  47. package/dest/fixtures/ha_setup.d.ts +4 -4
  48. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  49. package/dest/fixtures/ha_setup.js +5 -2
  50. package/dest/fixtures/index.d.ts +2 -1
  51. package/dest/fixtures/index.d.ts.map +1 -1
  52. package/dest/fixtures/index.js +1 -0
  53. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  54. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  55. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  56. package/dest/fixtures/setup.d.ts +81 -42
  57. package/dest/fixtures/setup.d.ts.map +1 -1
  58. package/dest/fixtures/setup.js +290 -198
  59. package/dest/fixtures/setup_p2p_test.d.ts +10 -6
  60. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  61. package/dest/fixtures/setup_p2p_test.js +11 -11
  62. package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
  63. package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
  64. package/dest/fixtures/standard_contracts_genesis.js +25 -0
  65. package/dest/fixtures/timing.d.ts +42 -0
  66. package/dest/fixtures/timing.d.ts.map +1 -0
  67. package/dest/fixtures/timing.js +72 -0
  68. package/dest/fixtures/token_utils.d.ts +22 -4
  69. package/dest/fixtures/token_utils.d.ts.map +1 -1
  70. package/dest/fixtures/token_utils.js +23 -6
  71. package/dest/fixtures/utils.d.ts +2 -2
  72. package/dest/fixtures/utils.d.ts.map +1 -1
  73. package/dest/fixtures/utils.js +1 -1
  74. package/dest/fixtures/wait_helpers.d.ts +135 -0
  75. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  76. package/dest/fixtures/wait_helpers.js +154 -0
  77. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  78. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  79. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  80. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  81. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  82. package/dest/forward-compatibility/wallet_service.js +109 -0
  83. package/dest/install_legacy_contracts.d.cts +13 -0
  84. package/dest/install_legacy_contracts.d.cts.map +1 -0
  85. package/dest/legacy-jest-resolver.d.cts +3 -0
  86. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  87. package/dest/multi-node/block-production/setup.d.ts +97 -0
  88. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  89. package/dest/multi-node/block-production/setup.js +158 -0
  90. package/dest/multi-node/governance/setup.d.ts +67 -0
  91. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  92. package/dest/multi-node/governance/setup.js +126 -0
  93. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  94. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  95. package/dest/multi-node/multi_node_test_context.js +347 -0
  96. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  97. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  98. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  99. package/dest/multi-node/slashing/setup.d.ts +167 -0
  100. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  101. package/dest/multi-node/slashing/setup.js +275 -0
  102. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +19 -10
  103. package/dest/p2p/p2p_network.d.ts.map +1 -0
  104. package/dest/{e2e_p2p → p2p}/p2p_network.js +82 -38
  105. package/dest/p2p/reqresp/utils.d.ts +19 -0
  106. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  107. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +32 -29
  108. package/dest/p2p/shared.d.ts +72 -0
  109. package/dest/p2p/shared.d.ts.map +1 -0
  110. package/dest/p2p/shared.js +212 -0
  111. package/dest/shared/cross_chain_test_harness.d.ts +6 -4
  112. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  113. package/dest/shared/cross_chain_test_harness.js +33 -21
  114. package/dest/shared/gas_portal_test_harness.d.ts +8 -5
  115. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  116. package/dest/shared/gas_portal_test_harness.js +24 -12
  117. package/dest/shared/submit-transactions.d.ts +1 -1
  118. package/dest/shared/submit-transactions.d.ts.map +1 -1
  119. package/dest/shared/submit-transactions.js +12 -5
  120. package/dest/shared/timing_env.d.js +5 -0
  121. package/dest/shared/timing_env.js +365 -0
  122. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  123. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  124. package/dest/shared/uniswap_l1_l2.js +50 -37
  125. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  126. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  127. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  128. package/dest/simulators/lending_simulator.d.ts +10 -3
  129. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  130. package/dest/simulators/lending_simulator.js +24 -12
  131. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  132. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  133. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  134. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  135. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  136. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  137. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  138. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  139. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  140. package/dest/single-node/fees/fees_test.d.ts +95 -0
  141. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  142. package/dest/single-node/fees/fees_test.js +347 -0
  143. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  144. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  145. package/dest/single-node/l1-reorgs/setup.js +57 -0
  146. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  147. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  148. package/dest/single-node/partial-proofs/setup.js +5 -0
  149. package/dest/single-node/proving/setup.d.ts +5 -0
  150. package/dest/single-node/proving/setup.d.ts.map +1 -0
  151. package/dest/single-node/proving/setup.js +5 -0
  152. package/dest/single-node/recovery/setup.d.ts +5 -0
  153. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  154. package/dest/single-node/recovery/setup.js +5 -0
  155. package/dest/single-node/setup.d.ts +49 -0
  156. package/dest/single-node/setup.d.ts.map +1 -0
  157. package/dest/single-node/setup.js +56 -0
  158. package/dest/single-node/single_node_test_context.d.ts +374 -0
  159. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  160. package/dest/single-node/single_node_test_context.js +847 -0
  161. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  162. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  163. package/dest/spartan/setup_test_wallets.js +89 -55
  164. package/dest/spartan/tx_metrics.d.ts +27 -4
  165. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  166. package/dest/spartan/tx_metrics.js +105 -20
  167. package/dest/spartan/utils/config.d.ts +9 -35
  168. package/dest/spartan/utils/config.d.ts.map +1 -1
  169. package/dest/spartan/utils/gossip_metrics.d.ts +9 -0
  170. package/dest/spartan/utils/gossip_metrics.d.ts.map +1 -0
  171. package/dest/spartan/utils/gossip_metrics.js +77 -0
  172. package/dest/spartan/utils/index.d.ts +2 -1
  173. package/dest/spartan/utils/index.d.ts.map +1 -1
  174. package/dest/spartan/utils/index.js +2 -0
  175. package/dest/spartan/utils/nodes.js +2 -2
  176. package/dest/test-wallet/test_wallet.d.ts +39 -10
  177. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  178. package/dest/test-wallet/test_wallet.js +185 -79
  179. package/dest/test-wallet/utils.d.ts +38 -3
  180. package/dest/test-wallet/utils.d.ts.map +1 -1
  181. package/dest/test-wallet/utils.js +65 -10
  182. package/dest/test-wallet/wallet_worker_script.js +12 -4
  183. package/dest/test-wallet/worker_wallet.d.ts +9 -8
  184. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  185. package/dest/test-wallet/worker_wallet.js +10 -4
  186. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
  187. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  188. package/dest/test-wallet/worker_wallet_schema.js +15 -2
  189. package/package.json +48 -43
  190. package/src/automine/README.md +60 -0
  191. package/src/automine/automine_test_context.ts +153 -0
  192. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  193. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  194. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +24 -47
  195. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +25 -48
  196. package/src/automine/token/token_test_helpers.ts +138 -0
  197. package/src/bench/client_flows/benchmark.ts +21 -0
  198. package/src/bench/client_flows/client_flows_benchmark.ts +105 -75
  199. package/src/bench/utils.ts +110 -6
  200. package/src/composed/ha/ha_full_setup.ts +466 -0
  201. package/src/fixtures/authwit_proxy.ts +4 -0
  202. package/src/fixtures/e2e_prover_test.ts +68 -52
  203. package/src/fixtures/fixtures.ts +100 -0
  204. package/src/fixtures/ha_setup.ts +11 -5
  205. package/src/fixtures/index.ts +1 -0
  206. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  207. package/src/fixtures/setup.ts +361 -255
  208. package/src/fixtures/setup_p2p_test.ts +15 -11
  209. package/src/fixtures/standard_contracts_genesis.ts +28 -0
  210. package/src/fixtures/timing.ts +97 -0
  211. package/src/fixtures/token_utils.ts +40 -8
  212. package/src/fixtures/utils.ts +2 -3
  213. package/src/fixtures/wait_helpers.ts +333 -0
  214. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  215. package/src/forward-compatibility/wallet_service.ts +106 -0
  216. package/src/guides/up_quick_start.sh +5 -2
  217. package/src/infra/README.md +12 -0
  218. package/src/install_legacy_contracts.cjs +81 -0
  219. package/src/legacy-jest-resolver.cjs +98 -0
  220. package/src/multi-node/README.md +96 -0
  221. package/src/multi-node/block-production/setup.ts +272 -0
  222. package/src/multi-node/governance/setup.ts +172 -0
  223. package/src/multi-node/multi_node_test_context.ts +447 -0
  224. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  225. package/src/multi-node/slashing/setup.ts +433 -0
  226. package/src/p2p/README.md +78 -0
  227. package/src/{e2e_p2p → p2p}/p2p_network.ts +95 -50
  228. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +35 -28
  229. package/src/p2p/shared.ts +329 -0
  230. package/src/shared/cross_chain_test_harness.ts +36 -17
  231. package/src/shared/gas_portal_test_harness.ts +32 -14
  232. package/src/shared/submit-transactions.ts +13 -5
  233. package/src/shared/timing_env.d.mts +39 -0
  234. package/src/shared/timing_env.mjs +363 -0
  235. package/src/shared/uniswap_l1_l2.ts +80 -43
  236. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  237. package/src/simulators/lending_simulator.ts +28 -14
  238. package/src/single-node/README.md +66 -0
  239. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  240. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  241. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  242. package/src/{e2e_fees → single-node/fees}/fees_test.ts +176 -70
  243. package/src/single-node/l1-reorgs/setup.ts +93 -0
  244. package/src/single-node/partial-proofs/setup.ts +8 -0
  245. package/src/single-node/proving/setup.ts +15 -0
  246. package/src/single-node/recovery/setup.ts +8 -0
  247. package/src/single-node/setup.ts +63 -0
  248. package/src/single-node/single_node_test_context.ts +1058 -0
  249. package/src/spartan/setup_test_wallets.ts +91 -50
  250. package/src/spartan/tx_metrics.ts +107 -23
  251. package/src/spartan/utils/gossip_metrics.ts +108 -0
  252. package/src/spartan/utils/index.ts +3 -0
  253. package/src/spartan/utils/nodes.ts +2 -2
  254. package/src/test-wallet/test_wallet.ts +213 -81
  255. package/src/test-wallet/utils.ts +104 -11
  256. package/src/test-wallet/wallet_worker_script.ts +11 -5
  257. package/src/test-wallet/worker_wallet.ts +19 -16
  258. package/src/test-wallet/worker_wallet_schema.ts +4 -3
  259. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
  260. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  261. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  262. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  263. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  264. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  265. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  266. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  267. package/dest/e2e_epochs/epochs_test.d.ts +0 -104
  268. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  269. package/dest/e2e_epochs/epochs_test.js +0 -389
  270. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  271. package/dest/e2e_fees/fees_test.d.ts +0 -88
  272. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  273. package/dest/e2e_fees/fees_test.js +0 -255
  274. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  275. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  276. package/dest/e2e_l1_publisher/write_json.js +0 -56
  277. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  278. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  279. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  280. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  281. package/dest/e2e_nested_contract/nested_contract_test.js +0 -54
  282. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  283. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  284. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  285. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  286. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  287. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  288. package/dest/e2e_p2p/shared.d.ts +0 -66
  289. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  290. package/dest/e2e_p2p/shared.js +0 -212
  291. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  292. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  293. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  294. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  295. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  296. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  297. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  298. package/src/e2e_epochs/epochs_test.ts +0 -499
  299. package/src/e2e_l1_publisher/write_json.ts +0 -77
  300. package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
  301. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  302. package/src/e2e_p2p/shared.ts +0 -343
  303. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  304. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  305. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  306. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  307. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  308. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  309. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env -S node --no-warnings
2
+ /**
3
+ * Standalone entrypoint that spins up a local Aztec network (L1 + node) and exposes a {@link NodeEmbeddedWallet} over
4
+ * JSON-RPC.
5
+ *
6
+ * Intended for forward-compatibility testing: an **old** release image runs this script so that **new** tests can send
7
+ * new artifacts to old runtime code (loadContractArtifact, ACIR simulator, class-ID computation, entrypoint encoding,
8
+ * etc.).
9
+ */
10
+ import { getSchnorrAccountContractAddress } from '@aztec/accounts/schnorr';
11
+ import { getInitialTestAccountsData } from '@aztec/accounts/testing';
12
+ import { createLocalNetwork } from '@aztec/aztec';
13
+ import { Fr } from '@aztec/aztec.js/fields';
14
+ import { WalletSchema } from '@aztec/aztec.js/wallet';
15
+ import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
16
+ import { createNamespacedSafeJsonRpcServer, startHttpRpcServer } from '@aztec/foundation/json-rpc/server';
17
+ import { createLogger } from '@aztec/foundation/log';
18
+ import { AztecNodeApiSchema } from '@aztec/stdlib/interfaces/client';
19
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
20
+
21
+ const logger = createLogger('wallet-service');
22
+
23
+ const { ETHEREUM_HOSTS = 'http://localhost:8545', NODE_PORT = '8080', WALLET_PORT = '8081' } = process.env;
24
+
25
+ async function main() {
26
+ const l1RpcUrls = ETHEREUM_HOSTS.split(',').map(url => url.trim());
27
+
28
+ // Some tests (e.g. AMM) need 4 accounts but only 3 are funded via genesis. Generate deterministic keys for a 4th
29
+ // account so we can compute its address before network startup and include it in genesis funding. We cannot do this
30
+ // in the test because Wallet interface does not expose account creation functionality (only TestWallet exposes that
31
+ // but that's not used in forward compatibility testing).
32
+ const extraAccountSecret = Fr.fromHexString('0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef');
33
+ const extraAccountSalt = Fr.ZERO;
34
+ const extraAccountSigningKey = GrumpkinScalar.random();
35
+ const extraAccountAddress = await getSchnorrAccountContractAddress(
36
+ extraAccountSigningKey,
37
+ extraAccountSalt,
38
+ extraAccountSecret,
39
+ );
40
+
41
+ logger.info('Starting wallet service...', { l1RpcUrls });
42
+
43
+ // createLocalNetwork deploys L1 contracts, starts the node, and optionally deploys funded test accounts (when
44
+ // TEST_ACCOUNTS=true via env). We are not proving anything just like is done when local network is started by
45
+ // the `aztecStart` function. The extra account address is passed via prefundAddresses so it gets fee juice at genesis.
46
+ const { node, stop: stopNetwork } = await createLocalNetwork(
47
+ { l1RpcUrls, realProofs: false, prefundAddresses: [extraAccountAddress.toString()] },
48
+ logger.info,
49
+ );
50
+
51
+ // Create an ephemeral embedded wallet backed by the local node.
52
+ const wallet = await EmbeddedWallet.create(node, { ephemeral: true });
53
+
54
+ // Re-register the initial test accounts so they are available via wallet.getAccounts(). createLocalNetwork deploys
55
+ // them onchain but uses a temporary wallet that is then stopped.
56
+ //
57
+ // We use the non-lazy import path (@aztec/accounts/testing, not /lazy) to avoid the dynamic JSON import that is
58
+ // incompatible with Node.js import attribute enforcement.
59
+ const testAccountsData = await getInitialTestAccountsData();
60
+ const accounts = await Promise.all(
61
+ testAccountsData.map(({ secret, salt, signingKey }) =>
62
+ wallet.createSchnorrInitializerlessAccount(secret, salt, signingKey),
63
+ ),
64
+ );
65
+
66
+ // Register and deploy the 4th account.
67
+ const extraAccount = await wallet.createSchnorrAccount(extraAccountSecret, extraAccountSalt, extraAccountSigningKey);
68
+ const deployMethod = await extraAccount.getDeployMethod();
69
+ await deployMethod.send({ from: accounts[0].address });
70
+
71
+ logger.info('Embedded wallet created', {
72
+ accounts: [...accounts, extraAccount].map(a => a.address.toString()),
73
+ });
74
+
75
+ // Contract artifacts are large, so allow generous body sizes for RPC requests.
76
+ const rpcOptions = { maxBodySizeBytes: '50mb' };
77
+
78
+ // Serve node RPC
79
+ const nodeRpcServer = createNamespacedSafeJsonRpcServer({ aztec: [node, AztecNodeApiSchema] }, rpcOptions);
80
+ const nodeHttpServer = await startHttpRpcServer(nodeRpcServer, { port: NODE_PORT });
81
+ logger.info(`Node JSON-RPC server listening on port ${nodeHttpServer.port}`);
82
+
83
+ // Serve wallet RPC
84
+ const walletRpcServer = createNamespacedSafeJsonRpcServer({ wallet: [wallet, WalletSchema] }, rpcOptions);
85
+ const walletHttpServer = await startHttpRpcServer(walletRpcServer, { port: WALLET_PORT });
86
+ logger.info(`Wallet JSON-RPC server listening on port ${walletHttpServer.port}`);
87
+
88
+ const shutdown = async () => {
89
+ logger.info('Shutting down...');
90
+ nodeHttpServer.close();
91
+ walletHttpServer.close();
92
+ await wallet.stop();
93
+ await stopNetwork();
94
+ process.exit(0);
95
+ };
96
+
97
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
98
+ process.once('SIGINT', shutdown);
99
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
100
+ process.once('SIGTERM', shutdown);
101
+ }
102
+
103
+ main().catch(err => {
104
+ logger.error('Wallet service failed to start', err);
105
+ process.exit(1);
106
+ });
@@ -18,10 +18,8 @@ aztec-wallet() {
18
18
 
19
19
  aztec-wallet import-test-accounts
20
20
 
21
- # docs:start:declare-accounts
22
21
  aztec-wallet create-account -a alice -f test0
23
22
  aztec-wallet create-account -a bob -f test0
24
- # docs:end:declare-accounts
25
23
 
26
24
  aztec-wallet bridge-fee-juice 1000000000000000000000 accounts:alice --mint --no-wait
27
25
 
@@ -40,6 +38,11 @@ fi
40
38
 
41
39
  TRANSFER_AMOUNT=42
42
40
 
41
+ # Alice's bridged fee-juice claim is only consumable inboxLag (2) checkpoints after the L1->L2 message
42
+ # is inserted. The token deploy and mint above produced two blocks; force one more here (a public mint
43
+ # from test0, which leaves the alice/bob private balances untouched) so the claim is available below.
44
+ aztec-wallet send mint_to_public -ca last --args accounts:test0 1 -f test0
45
+
43
46
  aztec-wallet send transfer_in_private -ca last --args accounts:alice accounts:bob $TRANSFER_AMOUNT 0 -f alice --payment method=fee_juice,claim
44
47
 
45
48
  # Test end result
@@ -0,0 +1,12 @@
1
+ # `infra` e2e test category
2
+
3
+ Infrastructure tests cover deployment, network targeting, and ops scenarios that are not about a
4
+ single protocol behavior. A test belongs here when its primary concern is network targeting or
5
+ operational smoke-testing rather than correctness of a specific consensus, block-building, or
6
+ proving behavior.
7
+
8
+ ## Tests
9
+
10
+ | File | Contents |
11
+ |---|---|
12
+ | `public_testnet_transfer.test.ts` | Deploy and transfer on a public L1 network (Sepolia) or local Anvil, parameterized by `L1_CHAIN_ID`. With no `L1_CHAIN_ID` set the test targets local Anvil and runs in CI; with Sepolia credentials (`SEQ_PUBLISHER_PRIVATE_KEY`, `ETHEREUM_HOSTS`, `L1_CHAIN_ID=11155111`) it runs against the live public testnet. |
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ // Unpacks the committed legacy artifact tarballs (legacy-contracts/<version>.tar.gz) into the
3
+ // gitignored .legacy-contracts/<version>/ cache. See legacy-contracts/README.md for the tarball
4
+ // layout and how versions are added.
5
+ //
6
+ // Called from legacy-jest-resolver.cjs, which unpacks on demand at first use — both locally and in
7
+ // the isolated CI test containers (which bind-mount the checkout read-write).
8
+ //
9
+ // Idempotent and concurrency-safe: extraction goes to a temp dir and is renamed into place, so
10
+ // parallel callers (e.g. compat test containers starting together) race benignly.
11
+ /* eslint-disable @typescript-eslint/no-require-imports */
12
+
13
+ const path = require('path');
14
+ const fs = require('fs');
15
+ const { execFileSync } = require('child_process');
16
+
17
+ // Package dir names whose artifacts/*.json the jest resolver redirects to historical versions.
18
+ const REDIRECTED = ['noir-contracts.js', 'noir-test-contracts.js', 'accounts'];
19
+
20
+ const e2eRoot = path.resolve(__dirname, '..');
21
+ const tarballDir = path.join(e2eRoot, 'legacy-contracts');
22
+ const cacheBase = path.join(e2eRoot, '.legacy-contracts');
23
+
24
+ function cacheRoot(version) {
25
+ return path.join(cacheBase, version);
26
+ }
27
+
28
+ /** Versions with committed artifacts, derived from the tarballs present. */
29
+ function listVersions() {
30
+ if (!fs.existsSync(tarballDir)) {
31
+ return [];
32
+ }
33
+ return fs
34
+ .readdirSync(tarballDir)
35
+ .filter(f => f.endsWith('.tar.gz'))
36
+ .map(f => f.slice(0, -'.tar.gz'.length))
37
+ .sort();
38
+ }
39
+
40
+ function installLegacyContracts(version) {
41
+ if (!version) {
42
+ throw new Error('installLegacyContracts: version is required');
43
+ }
44
+ const dest = cacheRoot(version);
45
+ if (fs.existsSync(dest)) {
46
+ return;
47
+ }
48
+ const tarball = path.join(tarballDir, `${version}.tar.gz`);
49
+ if (!fs.existsSync(tarball)) {
50
+ throw new Error(`[legacy-contracts] no committed artifacts for ${version} (expected ${tarball})`);
51
+ }
52
+
53
+ fs.mkdirSync(cacheBase, { recursive: true });
54
+ // Extract to a temp sibling and rename into place: rename is atomic on the same filesystem, so a
55
+ // concurrent caller either sees the complete cache or none of it.
56
+ const tmp = fs.mkdtempSync(path.join(cacheBase, `.${version}.tmp-`));
57
+ try {
58
+ process.stderr.write(`[legacy-contracts] unpacking ${path.basename(tarball)} -> ${dest}\n`);
59
+ execFileSync('tar', ['-xzf', tarball, '-C', tmp], { stdio: ['ignore', 'ignore', 'inherit'] });
60
+ for (const pkg of REDIRECTED) {
61
+ if (!fs.existsSync(path.join(tmp, version, pkg, 'artifacts'))) {
62
+ throw new Error(`[legacy-contracts] ${path.basename(tarball)} is missing ${pkg}/artifacts`);
63
+ }
64
+ }
65
+ try {
66
+ fs.renameSync(path.join(tmp, version), dest);
67
+ } catch (err) {
68
+ if (!fs.existsSync(dest)) {
69
+ throw err;
70
+ }
71
+ }
72
+ } finally {
73
+ fs.rmSync(tmp, { recursive: true, force: true });
74
+ }
75
+ }
76
+
77
+ module.exports = { installLegacyContracts, listVersions, cacheRoot, REDIRECTED };
78
+
79
+ if (require.main === module) {
80
+ installLegacyContracts(process.argv[2]);
81
+ }
@@ -0,0 +1,98 @@
1
+ // Custom Jest resolver. When CONTRACT_ARTIFACTS_VERSION is set, redirects *only* JSON artifact files under
2
+ // @aztec/noir-contracts.js/artifacts/, @aztec/noir-test-contracts.js/artifacts/, and @aztec/accounts/artifacts/ to
3
+ // that version's historical artifacts, committed as legacy-contracts/<version>.tar.gz and unpacked on demand into
4
+ // .legacy-contracts/<version>/ by install_legacy_contracts.cjs.
5
+ //
6
+ // Why JSON-only: the JSON artifact is the actual interchange surface a "deployed contract" exposes. The TS wrapper is
7
+ // generated client-side ergonomics that's tightly coupled to the current @aztec/aztec.js API. Redirecting the wrapper
8
+ // would couple this test to a moving aztec.js surface and break at import time on unrelated breaking changes; we want
9
+ // to fail only on actual artifact-compat regressions.
10
+ //
11
+ // Missing artifacts: legacy version tarballs are immutable, so an artifact missing from the unpacked cache means the
12
+ // contract was added after that release — there's nothing to compat-test. Rather than failing or silently falling
13
+ // back to the workspace artifact (which would turn the compat run into a regular e2e run that always passes), we log
14
+ // the miss and exit the process cleanly with code 0. The test never runs, but the per-test CI log captures the
15
+ // explanatory line so the reason is auditable. This keeps the change scoped to this resolver, avoiding a new
16
+ // exit-code contract in the shared ci3 test runner.
17
+ //
18
+ // Activated by env var; passthrough otherwise.
19
+ /* eslint-disable @typescript-eslint/no-require-imports */
20
+
21
+ const path = require('path');
22
+ const fs = require('fs');
23
+ const { installLegacyContracts, REDIRECTED, cacheRoot } = require('./install_legacy_contracts.cjs');
24
+
25
+ const version = process.env.CONTRACT_ARTIFACTS_VERSION;
26
+ const cacheDir = version ? cacheRoot(version) : null;
27
+
28
+ // Unpack on demand at first use. Idempotent and concurrency-safe, so parallel jest workers and
29
+ // isolated test containers (which share the checkout) race benignly.
30
+ if (version) {
31
+ installLegacyContracts(version);
32
+ }
33
+
34
+ let bannerPrinted = false;
35
+ const seen = new Set();
36
+
37
+ function printBannerOnce() {
38
+ if (bannerPrinted || !version) {
39
+ return;
40
+ }
41
+ bannerPrinted = true;
42
+ const lines = ['='.repeat(60), `[legacy-contracts][jest] CONTRACT_ARTIFACTS_VERSION=${version}`];
43
+ for (const pkg of REDIRECTED) {
44
+ lines.push(`[legacy-contracts][jest] redirecting ${pkg}/artifacts/*.json -> .legacy-contracts/${version}/...`);
45
+ }
46
+ lines.push('='.repeat(60));
47
+ process.stderr.write(lines.join('\n') + '\n');
48
+ }
49
+
50
+ // Match a resolved absolute path against the workspace artifacts dirs and return the legacy cache equivalent, or null
51
+ // if it's not an artifact path we should redirect.
52
+ function legacyArtifactPath(resolved) {
53
+ if (!resolved.endsWith('.json')) {
54
+ return null;
55
+ }
56
+ for (const pkg of REDIRECTED) {
57
+ // pkg = 'noir-contracts.js' -> match '/noir-contracts.js/artifacts/'
58
+ const marker = `/${pkg}/artifacts/`;
59
+ const idx = resolved.indexOf(marker);
60
+ if (idx === -1) {
61
+ continue;
62
+ }
63
+ const basename = resolved.slice(idx + marker.length);
64
+ return path.join(cacheDir, pkg, 'artifacts', basename);
65
+ }
66
+ return null;
67
+ }
68
+
69
+ module.exports = function legacyResolver(request, options) {
70
+ // Always run the default resolver first. We only inspect (and possibly rewrite) the *result*; this catches both
71
+ // bare-specifier imports of `@aztec/noir-contracts.js/artifacts/foo.json` and the relative `../artifacts/foo.json`
72
+ // imports inside the workspace TS wrapper classes — both resolve to the same workspace artifact path that we then
73
+ // redirect.
74
+ const resolved = options.defaultResolver(request, options);
75
+ if (!version) {
76
+ return resolved;
77
+ }
78
+ printBannerOnce();
79
+ const legacy = legacyArtifactPath(resolved);
80
+ if (!legacy) {
81
+ return resolved;
82
+ }
83
+ if (!fs.existsSync(legacy)) {
84
+ // Contract was added after this historical release, there is nothing to compat-test for it. Exit the process
85
+ // cleanly with code 0 so the test runner reports the run as passed.
86
+ fs.writeSync(
87
+ 2,
88
+ `[legacy-contracts][jest] artifact ${path.basename(legacy)} not in legacy cache @${version}; ` +
89
+ `assumed added after this release. No compat coverage applicable for this version, treating as passed.\n`,
90
+ );
91
+ process.exit(0);
92
+ }
93
+ if (!seen.has(resolved)) {
94
+ seen.add(resolved);
95
+ process.stderr.write(`[legacy-contracts][jest] redirected ${path.basename(legacy)} -> ${legacy}\n`);
96
+ }
97
+ return legacy;
98
+ };
@@ -0,0 +1,96 @@
1
+ # `multi-node` e2e test category
2
+
3
+ Multi-node tests run N validator nodes sharing an in-memory `MockGossipSubNetwork` bus (no real
4
+ libp2p). This is the category for any multi-node test whose subject — proposals, attestations,
5
+ checkpointing, pruning/recovery, offense detection — is faithfully reproduced by the mock-gossip bus.
6
+ Tests that need *real networking* (peer discovery / discv5, the req/resp protocol, gossip mesh
7
+ formation, peer auth/scoring, transport behavior) belong in the `p2p` category instead.
8
+
9
+ ## Base class
10
+
11
+ `MultiNodeTestContext` (`multi_node_test_context.ts`) extends `SingleNodeTestContext` (in
12
+ `../single-node/`) with the N-validator topology:
13
+
14
+ - `createValidatorNode` / `createValidatorNodeAt(index)` spawn nodes on the mock-gossip bus; passing
15
+ the same index to two calls (with different coinbases) models an equivocating proposer that shares
16
+ a key across two nodes. Validators with no spawned node stay registered-but-offline.
17
+ - The per-validator registration accessors (`validatorAt` / `addressAt` / `privateKeyAt`) for the
18
+ validators registered at genesis via `initialValidators`.
19
+ - `getSlashingContracts()` for the rollup / slasher / slashing-proposer L1 contracts.
20
+ - The committee convergence helpers `waitForAllNodes*` and `findSlotsWithProposers`.
21
+
22
+ The environment (in-process anvil + L1 deploy), the prover lifecycle, and the proving / reorg waiters
23
+ all live on the parent and are inherited.
24
+
25
+ ## Shared presets and helpers
26
+
27
+ These are exported from `multi_node_test_context.ts` and spread into a `setup(...)` call rather than
28
+ copy-pasted:
29
+
30
+ - `buildMockGossipValidators(n)` — the deterministic validator set (keys from
31
+ `getPrivateKeyFromIndex(i + 3)`), passed as `initialValidators`.
32
+ - `MOCK_GOSSIP_MULTI_VALIDATOR_OPTS` — a tight committee on the mock bus with no prover
33
+ (`{ mockGossipSubNetwork, skipInitialSequencer, startProverNode: false, aztecProofSubmissionEpochs:
34
+ NO_REORG_SUBMISSION_EPOCHS, numberOfAccounts: 0 }`, the constant re-exported from `../single-node/setup.ts`).
35
+ Tests that want a prover leave `startProverNode` explicit.
36
+ - `SLASHER_ENABLED_MULTI_VALIDATOR_OPTS` — the same committee with the slasher turned on, used by the
37
+ offense-detection tests.
38
+ - `defaultSlashingPenalties(unit?)` / `withOnlyOffense(offense, unit?)` — build the per-offense
39
+ `slash*Penalty` knobs; `withOnlyOffense` zeroes all but the named offense to isolate one offense.
40
+ - `setupHaPairs(test, validators, { baseOpts, coinbases })` — stands up two HA pairs (nodes 0/1 share
41
+ keys pk1+pk2, nodes 2/3 share pk3+pk4), each pair on a shared slashing-protection DB with distinct
42
+ per-node coinbases. Used by the `high-availability/` tests.
43
+
44
+ ## Organizing principle
45
+
46
+ The top level groups tests by node topology and setup model; the second level names the primary
47
+ behavior under test, not the shared setup or a flag. Multiple-blocks-per-slot and proposer pipelining
48
+ are default traits of block production here, not separate categories. Each file has a single top-level
49
+ `describe` named to match its path, and a co-located `setup.ts` holds shared setup. A `.parallel`
50
+ suffix marks files with more than one top-level `it`; CI splits each `it` into its own job.
51
+
52
+ ## Subfolders
53
+
54
+ | Folder | Base / preset | Contents |
55
+ |---|---|---|
56
+ | `block-production/` | `MultiNodeTestContext` + wide-slot / block-production timing (`setup.ts`) | Happy-path committee block production with multiple blocks per slot and pipelining as the default cadence: `simple`, `high_tps`, `first_slot` (blocks on the first two slots of an epoch), `deploy_and_call_ordering` (a contract deployed and called in separate blocks of one slot), `cross_chain_messages.parallel` (multi-block slots carrying L2→L1 and L1→L2 messages), `proposed_chain.parallel` (txs anchored to proposed blocks; non-validators re-execute and sync multi-block slots), `proof_boundary.parallel` (the proof-submission deadline vs. the pipelining boundary slot, across five proof-landing scenarios), `redistribution.parallel` (checkpoint budget redistributed so a late tx burst fits across the last blocks), `blob_promotion` (a promotion-disabled node fetches blobs while peers skip them, and a high-block-count checkpoint still proves), `multi_validator_node.parallel` (one physical node hosting 5 validator keys builds blocks and collects quorum attestations; after withdrawing 2 validators, signing is filtered to the active committee only). |
57
+ | `recovery/` | `MultiNodeTestContext` + wide-slot / block-production timing | The chain detects a bad/withheld/conflicting proposal and recovers: `proposal_failure_recovery.parallel` (all nodes prune and recover when a proposer fails to publish to L1), `pipeline_prune` (an uncheckpointed-blocks prune under pipelined MBPS, then recovery to a multi-block checkpoint), `equivocation_recovery` (an L1-confirmed checkpoint overrides a gossip-only equivocating proposal, the chain heals, and observers record the offense). |
58
+ | `invalid-attestations/` | `MultiNodeTestContext` (slasher on) | Invalid checkpoints are detected, invalidated on L1, and the chain progresses: `invalidate_block.parallel`, a six-validator suite injecting insufficient/fake/high-s/unrecoverable/shuffled attestations and withheld blobs. |
59
+ | `high-availability/` | `MultiNodeTestContext` + `setupHaPairs` | HA-pair sync and handoff between nodes that share validator keys: `ha_sync` (a peer that did not build a block syncs to the proposed chain tip over P2P), `ha_checkpoint_handoff` (a peer records and takes over a pipelined checkpoint when its partner proposes the previous slot). |
60
+ | `slashing/` | `MultiNodeTestContext` + `SLASHER_ENABLED_MULTI_VALIDATOR_OPTS` (`setup.ts`) | Offense detection and the sentinel that drives it. Equivocation — both duplicate-proposal and duplicate-attestation — (`equivocation_offenses`), broadcast of an invalid block or checkpoint proposal (`broadcasted_invalid_block_proposal_slash`, `broadcasted_invalid_checkpoint_proposal_slash.parallel`), attesting to an invalid checkpoint (`attested_invalid_proposal.parallel`), data withholding (`data_withholding_slash`), inactivity (`inactivity_slash`, `inactivity_slash_with_consecutive_epochs`, sharing the `InactivityTest` fixture in `inactivity_setup.ts`), the slasher veto path (`slash_veto_demo`), and sentinel observability (`validators_sentinel.parallel`, `multiple_validators_sentinel.parallel`, `sentinel_status_slash.parallel`). `setup.ts` holds the two timing profiles (`baseSlashingOpts`, `SENTINEL_TIMING`), the shared offense lookup (`findSlashOffense`), and the slashing waiters (`awaitCommitteeExists`, `awaitOffenseDetected`, `advanceToEpochBeforeProposer`, `findUpcomingProposerSlot`, `awaitCommitteeKicked`, `awaitProposalExecution`). |
61
+ | `governance/` | `MultiNodeTestContext` + `MOCK_GOSSIP_MULTI_VALIDATOR_OPTS` + `GOVERNANCE_TIMING` (`setup.ts`) | A validator committee drives an L1 governance upgrade. `upgrade_governance_proposer` (the committee signals a new governance-proposer payload, reaches quorum, and the proposal executes) and `add_rollup` (a new rollup version is registered and the nodes migrate to it, exercising L1↔L2 bridging on both rollups). |
62
+
63
+ ## Helper surface
64
+
65
+ Prefer these named waiters over hand-rolled `retryUntil` / raw `.on` / `sleep` polling in test bodies.
66
+
67
+ On `SingleNodeTestContext` (inherited):
68
+
69
+ - `waitUntilEpochStarts(epoch)` / `waitUntilNextEpochStarts()` — epoch-boundary waiters.
70
+ - `waitUntilCheckpointNumber(n)` / `waitUntilProvenCheckpointNumber(n)` — checkpoint waiters.
71
+ - `waitUntilLastSlotOfProofSubmissionWindow(epoch)` — proof-window timing.
72
+ - `waitForNodeToSync(blockNumber, type)` — single-node sync wait.
73
+ - `watchSequencerEvents(sequencers, …)` accumulates state-changes and fail-events across sequencers;
74
+ `assertNoFailuresFromSequencers(failEvents)` asserts none fired.
75
+ - `waitForSequencerEvent(sequencer, event, match?, opts)` — one-shot wait for a matching event, with
76
+ timeout and listener cleanup.
77
+ - `assertMultipleBlocksPerSlot(n)` — asserts some checkpoint has at least `n` blocks (MBPS).
78
+
79
+ Added by `MultiNodeTestContext`:
80
+
81
+ - `waitForAllNodes(predicate, opts)` and the conveniences
82
+ `waitForAllNodesToReachProvenCheckpoint(target, opts)` and
83
+ `waitForAllNodesToReachBlockAtSlot(slot, tag, match?, opts)` — multi-node convergence.
84
+ - `findSlotsWithProposers(count, predicate, opts)` — finds N consecutive slots whose proposers
85
+ satisfy `predicate`, warping the L1 clock forward and retrying on `EpochNotStable`.
86
+
87
+ On `ChainMonitor` (`@aztec/ethereum/test`):
88
+
89
+ - `waitUntilCheckpoint(n)` / `waitUntilCheckpointProven(n)`, `waitUntilL2Slot(slot)`,
90
+ `waitUntilL1Block` / `waitUntilL1Timestamp`.
91
+
92
+ Node-only / wallet-only waits (no context dependency) live in `../fixtures/wait_helpers.ts`:
93
+
94
+ - `waitForBlockNumber(node, target, { tag })` / `waitForProvenBlock(node, target)`.
95
+ - `waitForNodeCheckpoint(node, target, opts)` / `waitForNodeProvenCheckpoint(node, target)`.
96
+ - `waitForTxs(node, txHashes, opts)` — the plural form of `waitForTx`.