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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/README.md +217 -14
  2. package/dest/automine/automine_test_context.d.ts +85 -0
  3. package/dest/automine/automine_test_context.d.ts.map +1 -0
  4. package/dest/automine/automine_test_context.js +98 -0
  5. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
  6. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  7. package/dest/automine/contracts/fixtures/storage_proof_fetcher.js +184 -0
  8. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts +18 -0
  9. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
  10. package/dest/automine/contracts/fixtures/storage_proof_fixture.js +120 -0
  11. package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
  12. package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
  13. package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
  14. package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
  15. package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
  16. package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
  17. package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
  18. package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
  19. package/dest/automine/token/blacklist_token_contract_test.js +166 -0
  20. package/dest/automine/token/token_contract_test.d.ts +40 -0
  21. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  22. package/dest/automine/token/token_contract_test.js +119 -0
  23. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  24. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  25. package/dest/automine/token/token_test_helpers.js +97 -0
  26. package/dest/bench/client_flows/benchmark.d.ts +17 -2
  27. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  28. package/dest/bench/client_flows/benchmark.js +40 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.d.ts +19 -20
  30. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  31. package/dest/bench/client_flows/client_flows_benchmark.js +155 -159
  32. package/dest/bench/client_flows/config.d.ts +2 -2
  33. package/dest/bench/client_flows/config.d.ts.map +1 -1
  34. package/dest/bench/client_flows/config.js +18 -0
  35. package/dest/bench/client_flows/data_extractor.js +4 -1
  36. package/dest/bench/utils.d.ts +11 -10
  37. package/dest/bench/utils.d.ts.map +1 -1
  38. package/dest/bench/utils.js +126 -23
  39. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  40. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  41. package/dest/composed/ha/ha_full_setup.js +383 -0
  42. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  43. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  44. package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +1 -1
  45. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  46. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  47. package/dest/fixtures/authwit_proxy.js +34 -0
  48. package/dest/fixtures/e2e_prover_test.d.ts +25 -29
  49. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  50. package/dest/fixtures/e2e_prover_test.js +147 -151
  51. package/dest/fixtures/elu_monitor.d.ts +21 -0
  52. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  53. package/dest/fixtures/elu_monitor.js +102 -0
  54. package/dest/fixtures/fixtures.d.ts +84 -3
  55. package/dest/fixtures/fixtures.d.ts.map +1 -1
  56. package/dest/fixtures/fixtures.js +87 -2
  57. package/dest/fixtures/get_acvm_config.js +1 -1
  58. package/dest/fixtures/get_bb_config.d.ts +1 -1
  59. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  60. package/dest/fixtures/get_bb_config.js +5 -5
  61. package/dest/fixtures/ha_setup.d.ts +71 -0
  62. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  63. package/dest/fixtures/ha_setup.js +119 -0
  64. package/dest/fixtures/index.d.ts +3 -1
  65. package/dest/fixtures/index.d.ts.map +1 -1
  66. package/dest/fixtures/index.js +2 -0
  67. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  68. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  69. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  70. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  71. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  72. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  73. package/dest/fixtures/setup.d.ts +269 -0
  74. package/dest/fixtures/setup.d.ts.map +1 -0
  75. package/dest/fixtures/setup.js +688 -0
  76. package/dest/fixtures/setup_p2p_test.d.ts +22 -11
  77. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  78. package/dest/fixtures/setup_p2p_test.js +49 -38
  79. package/dest/fixtures/timing.d.ts +42 -0
  80. package/dest/fixtures/timing.d.ts.map +1 -0
  81. package/dest/fixtures/timing.js +72 -0
  82. package/dest/fixtures/token_utils.d.ts +22 -4
  83. package/dest/fixtures/token_utils.d.ts.map +1 -1
  84. package/dest/fixtures/token_utils.js +28 -7
  85. package/dest/fixtures/utils.d.ts +5 -638
  86. package/dest/fixtures/utils.d.ts.map +1 -1
  87. package/dest/fixtures/utils.js +4 -647
  88. package/dest/fixtures/wait_helpers.d.ts +135 -0
  89. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  90. package/dest/fixtures/wait_helpers.js +154 -0
  91. package/dest/fixtures/web3signer.js +1 -1
  92. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  93. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  94. package/dest/fixtures/with_telemetry_utils.js +2 -2
  95. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  96. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  97. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  98. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  99. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  100. package/dest/forward-compatibility/wallet_service.js +109 -0
  101. package/dest/install_legacy_contracts.d.cts +10 -0
  102. package/dest/install_legacy_contracts.d.cts.map +1 -0
  103. package/dest/legacy-jest-resolver.d.cts +3 -0
  104. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  105. package/dest/multi-node/block-production/setup.d.ts +97 -0
  106. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  107. package/dest/multi-node/block-production/setup.js +158 -0
  108. package/dest/multi-node/governance/setup.d.ts +67 -0
  109. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  110. package/dest/multi-node/governance/setup.js +126 -0
  111. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  112. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  113. package/dest/multi-node/multi_node_test_context.js +347 -0
  114. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  115. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  116. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  117. package/dest/multi-node/slashing/setup.d.ts +167 -0
  118. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  119. package/dest/multi-node/slashing/setup.js +275 -0
  120. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +33 -21
  121. package/dest/p2p/p2p_network.d.ts.map +1 -0
  122. package/dest/p2p/p2p_network.js +389 -0
  123. package/dest/p2p/reqresp/utils.d.ts +19 -0
  124. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  125. package/dest/p2p/reqresp/utils.js +193 -0
  126. package/dest/p2p/shared.d.ts +72 -0
  127. package/dest/p2p/shared.d.ts.map +1 -0
  128. package/dest/p2p/shared.js +212 -0
  129. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  130. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  131. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  132. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  133. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  134. package/dest/quality_of_service/prometheus_client.js +67 -0
  135. package/dest/shared/cross_chain_test_harness.d.ts +22 -9
  136. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  137. package/dest/shared/cross_chain_test_harness.js +45 -40
  138. package/dest/shared/gas_portal_test_harness.d.ts +19 -6
  139. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  140. package/dest/shared/gas_portal_test_harness.js +27 -15
  141. package/dest/shared/index.d.ts +3 -2
  142. package/dest/shared/index.d.ts.map +1 -1
  143. package/dest/shared/index.js +1 -0
  144. package/dest/shared/jest_setup.js +41 -1
  145. package/dest/shared/mock_state_view.d.ts +86 -0
  146. package/dest/shared/mock_state_view.d.ts.map +1 -0
  147. package/dest/shared/mock_state_view.js +186 -0
  148. package/dest/shared/submit-transactions.d.ts +4 -4
  149. package/dest/shared/submit-transactions.d.ts.map +1 -1
  150. package/dest/shared/submit-transactions.js +19 -14
  151. package/dest/shared/timing_env.d.js +5 -0
  152. package/dest/shared/timing_env.js +365 -0
  153. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  154. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  155. package/dest/shared/uniswap_l1_l2.js +86 -54
  156. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  157. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  158. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  159. package/dest/simulators/lending_simulator.d.ts +15 -4
  160. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  161. package/dest/simulators/lending_simulator.js +29 -17
  162. package/dest/simulators/token_simulator.d.ts +1 -1
  163. package/dest/simulators/token_simulator.d.ts.map +1 -1
  164. package/dest/simulators/token_simulator.js +3 -24
  165. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  166. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  167. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  168. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  169. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  170. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  171. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  172. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  173. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +21 -10
  174. package/dest/single-node/fees/fees_test.d.ts +93 -0
  175. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  176. package/dest/single-node/fees/fees_test.js +274 -0
  177. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  178. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  179. package/dest/single-node/l1-reorgs/setup.js +57 -0
  180. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  181. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  182. package/dest/single-node/partial-proofs/setup.js +5 -0
  183. package/dest/single-node/proving/setup.d.ts +5 -0
  184. package/dest/single-node/proving/setup.d.ts.map +1 -0
  185. package/dest/single-node/proving/setup.js +5 -0
  186. package/dest/single-node/recovery/setup.d.ts +5 -0
  187. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  188. package/dest/single-node/recovery/setup.js +5 -0
  189. package/dest/single-node/setup.d.ts +49 -0
  190. package/dest/single-node/setup.d.ts.map +1 -0
  191. package/dest/single-node/setup.js +56 -0
  192. package/dest/single-node/single_node_test_context.d.ts +360 -0
  193. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  194. package/dest/single-node/single_node_test_context.js +833 -0
  195. package/dest/spartan/setup_test_wallets.d.ts +15 -5
  196. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  197. package/dest/spartan/setup_test_wallets.js +155 -50
  198. package/dest/spartan/tx_metrics.d.ts +111 -0
  199. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  200. package/dest/spartan/tx_metrics.js +507 -0
  201. package/dest/spartan/utils/bot.d.ts +28 -0
  202. package/dest/spartan/utils/bot.d.ts.map +1 -0
  203. package/dest/spartan/utils/bot.js +142 -0
  204. package/dest/spartan/utils/chaos.d.ts +79 -0
  205. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  206. package/dest/spartan/utils/chaos.js +142 -0
  207. package/dest/spartan/utils/clients.d.ts +39 -0
  208. package/dest/spartan/utils/clients.d.ts.map +1 -0
  209. package/dest/spartan/utils/clients.js +90 -0
  210. package/dest/spartan/utils/config.d.ts +19 -0
  211. package/dest/spartan/utils/config.d.ts.map +1 -0
  212. package/dest/spartan/utils/config.js +23 -0
  213. package/dest/spartan/utils/health.d.ts +63 -0
  214. package/dest/spartan/utils/health.d.ts.map +1 -0
  215. package/dest/spartan/utils/health.js +202 -0
  216. package/dest/spartan/utils/helm.d.ts +15 -0
  217. package/dest/spartan/utils/helm.d.ts.map +1 -0
  218. package/dest/spartan/utils/helm.js +47 -0
  219. package/dest/spartan/utils/index.d.ts +11 -0
  220. package/dest/spartan/utils/index.d.ts.map +1 -0
  221. package/dest/spartan/utils/index.js +22 -0
  222. package/dest/spartan/utils/k8s.d.ts +128 -0
  223. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  224. package/dest/spartan/utils/k8s.js +381 -0
  225. package/dest/spartan/utils/nodes.d.ts +40 -0
  226. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  227. package/dest/spartan/utils/nodes.js +461 -0
  228. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  229. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  230. package/dest/spartan/utils/pod_logs.js +74 -0
  231. package/dest/spartan/utils/scripts.d.ts +30 -0
  232. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  233. package/dest/spartan/utils/scripts.js +81 -0
  234. package/dest/spartan/utils.d.ts +2 -221
  235. package/dest/spartan/utils.d.ts.map +1 -1
  236. package/dest/spartan/utils.js +1 -782
  237. package/dest/test-wallet/test_wallet.d.ts +105 -0
  238. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  239. package/dest/test-wallet/test_wallet.js +320 -0
  240. package/dest/test-wallet/utils.d.ts +76 -0
  241. package/dest/test-wallet/utils.d.ts.map +1 -0
  242. package/dest/test-wallet/utils.js +126 -0
  243. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  244. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  245. package/dest/test-wallet/wallet_worker_script.js +56 -0
  246. package/dest/test-wallet/worker_wallet.d.ts +53 -0
  247. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  248. package/dest/test-wallet/worker_wallet.js +157 -0
  249. package/dest/test-wallet/worker_wallet_schema.d.ts +4 -0
  250. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  251. package/dest/test-wallet/worker_wallet_schema.js +23 -0
  252. package/package.json +54 -46
  253. package/src/automine/README.md +60 -0
  254. package/src/automine/automine_test_context.ts +153 -0
  255. package/src/automine/contracts/fixtures/storage_proof.json +915 -0
  256. package/src/automine/contracts/fixtures/storage_proof_fetcher.ts +190 -0
  257. package/src/automine/contracts/fixtures/storage_proof_fixture.ts +173 -0
  258. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  259. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  260. package/src/automine/token/blacklist_token_contract_test.ts +208 -0
  261. package/src/automine/token/token_contract_test.ts +146 -0
  262. package/src/automine/token/token_test_helpers.ts +138 -0
  263. package/src/bench/client_flows/benchmark.ts +45 -2
  264. package/src/bench/client_flows/client_flows_benchmark.ts +222 -251
  265. package/src/bench/client_flows/config.ts +9 -1
  266. package/src/bench/client_flows/data_extractor.ts +2 -1
  267. package/src/bench/utils.ts +144 -25
  268. package/src/composed/ha/ha_full_setup.ts +466 -0
  269. package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +1 -1
  270. package/src/fixtures/authwit_proxy.ts +54 -0
  271. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  272. package/src/fixtures/e2e_prover_test.ts +172 -205
  273. package/src/fixtures/elu_monitor.ts +126 -0
  274. package/src/fixtures/fixtures.ts +111 -3
  275. package/src/fixtures/get_acvm_config.ts +1 -1
  276. package/src/fixtures/get_bb_config.ts +7 -6
  277. package/src/fixtures/ha_setup.ts +192 -0
  278. package/src/fixtures/index.ts +2 -0
  279. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  280. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  281. package/src/fixtures/setup.ts +987 -0
  282. package/src/fixtures/setup_p2p_test.ts +57 -57
  283. package/src/fixtures/timing.ts +97 -0
  284. package/src/fixtures/token_utils.ts +46 -10
  285. package/src/fixtures/utils.ts +26 -966
  286. package/src/fixtures/wait_helpers.ts +333 -0
  287. package/src/fixtures/web3signer.ts +1 -1
  288. package/src/fixtures/with_telemetry_utils.ts +2 -2
  289. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  290. package/src/forward-compatibility/wallet_service.ts +106 -0
  291. package/src/guides/up_quick_start.sh +7 -4
  292. package/src/infra/README.md +12 -0
  293. package/src/install_legacy_contracts.cjs +75 -0
  294. package/src/legacy-jest-resolver.cjs +112 -0
  295. package/src/multi-node/README.md +95 -0
  296. package/src/multi-node/block-production/setup.ts +272 -0
  297. package/src/multi-node/governance/setup.ts +172 -0
  298. package/src/multi-node/multi_node_test_context.ts +447 -0
  299. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  300. package/src/multi-node/slashing/setup.ts +433 -0
  301. package/src/p2p/README.md +78 -0
  302. package/src/p2p/p2p_network.ts +542 -0
  303. package/src/p2p/reqresp/utils.ts +263 -0
  304. package/src/p2p/shared.ts +329 -0
  305. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  306. package/src/quality_of_service/prometheus_client.ts +113 -0
  307. package/src/shared/cross_chain_test_harness.ts +51 -44
  308. package/src/shared/gas_portal_test_harness.ts +35 -17
  309. package/src/shared/index.ts +2 -1
  310. package/src/shared/jest_setup.ts +51 -1
  311. package/src/shared/mock_state_view.ts +188 -0
  312. package/src/shared/submit-transactions.ts +22 -19
  313. package/src/shared/timing_env.d.mts +39 -0
  314. package/src/shared/timing_env.mjs +363 -0
  315. package/src/shared/uniswap_l1_l2.ts +136 -115
  316. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  317. package/src/simulators/lending_simulator.ts +36 -18
  318. package/src/simulators/token_simulator.ts +6 -30
  319. package/src/single-node/README.md +60 -0
  320. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  321. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  322. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +23 -15
  323. package/src/single-node/fees/fees_test.ts +368 -0
  324. package/src/single-node/l1-reorgs/setup.ts +93 -0
  325. package/src/single-node/partial-proofs/setup.ts +8 -0
  326. package/src/single-node/proving/setup.ts +15 -0
  327. package/src/single-node/recovery/setup.ts +8 -0
  328. package/src/single-node/setup.ts +63 -0
  329. package/src/single-node/single_node_test_context.ts +1041 -0
  330. package/src/spartan/setup_test_wallets.ts +217 -36
  331. package/src/spartan/tx_metrics.ts +460 -0
  332. package/src/spartan/utils/bot.ts +188 -0
  333. package/src/spartan/utils/chaos.ts +253 -0
  334. package/src/spartan/utils/clients.ts +100 -0
  335. package/src/spartan/utils/config.ts +29 -0
  336. package/src/spartan/utils/health.ts +255 -0
  337. package/src/spartan/utils/helm.ts +84 -0
  338. package/src/spartan/utils/index.ts +71 -0
  339. package/src/spartan/utils/k8s.ts +535 -0
  340. package/src/spartan/utils/nodes.ts +543 -0
  341. package/src/spartan/utils/pod_logs.ts +99 -0
  342. package/src/spartan/utils/scripts.ts +99 -0
  343. package/src/spartan/utils.ts +1 -983
  344. package/src/test-wallet/test_wallet.ts +426 -0
  345. package/src/test-wallet/utils.ts +205 -0
  346. package/src/test-wallet/wallet_worker_script.ts +66 -0
  347. package/src/test-wallet/worker_wallet.ts +216 -0
  348. package/src/test-wallet/worker_wallet_schema.ts +14 -0
  349. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -54
  350. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  351. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +0 -185
  352. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -41
  353. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  354. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -108
  355. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -36
  356. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  357. package/dest/e2e_deploy_contract/deploy_test.js +0 -45
  358. package/dest/e2e_epochs/epochs_test.d.ts +0 -93
  359. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  360. package/dest/e2e_epochs/epochs_test.js +0 -337
  361. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  362. package/dest/e2e_fees/fees_test.d.ts +0 -85
  363. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  364. package/dest/e2e_fees/fees_test.js +0 -263
  365. package/dest/e2e_l1_publisher/write_json.d.ts +0 -10
  366. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  367. package/dest/e2e_l1_publisher/write_json.js +0 -58
  368. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  369. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  370. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -29
  371. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  372. package/dest/e2e_nested_contract/nested_contract_test.js +0 -64
  373. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  374. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  375. package/dest/e2e_p2p/inactivity_slash_test.js +0 -139
  376. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  377. package/dest/e2e_p2p/p2p_network.js +0 -320
  378. package/dest/e2e_p2p/shared.d.ts +0 -46
  379. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  380. package/dest/e2e_p2p/shared.js +0 -184
  381. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -35
  382. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  383. package/dest/e2e_token_contract/token_contract_test.js +0 -126
  384. package/dest/fixtures/setup_l1_contracts.d.ts +0 -477
  385. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  386. package/dest/fixtures/setup_l1_contracts.js +0 -17
  387. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  388. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  389. package/dest/fixtures/snapshot_manager.js +0 -505
  390. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  391. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  392. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +0 -256
  393. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -179
  394. package/src/e2e_deploy_contract/deploy_test.ts +0 -78
  395. package/src/e2e_epochs/epochs_test.ts +0 -438
  396. package/src/e2e_fees/fees_test.ts +0 -382
  397. package/src/e2e_l1_publisher/write_json.ts +0 -77
  398. package/src/e2e_nested_contract/nested_contract_test.ts +0 -96
  399. package/src/e2e_p2p/inactivity_slash_test.ts +0 -182
  400. package/src/e2e_p2p/p2p_network.ts +0 -476
  401. package/src/e2e_p2p/shared.ts +0 -285
  402. package/src/e2e_token_contract/token_contract_test.ts +0 -167
  403. package/src/fixtures/setup_l1_contracts.ts +0 -26
  404. package/src/fixtures/snapshot_manager.ts +0 -665
@@ -0,0 +1,213 @@
1
+ import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
2
+ import type { FieldLike } from '@aztec/aztec.js/abi';
3
+ import { NO_FROM } from '@aztec/aztec.js/account';
4
+ import type { AztecAddress, CompleteAddress } from '@aztec/aztec.js/addresses';
5
+ import type { AztecNode } from '@aztec/aztec.js/node';
6
+ import type { AccountManager } from '@aztec/aztec.js/wallet';
7
+ import { BlockNumber } from '@aztec/foundation/branded-types';
8
+ import { type DeliveryEvent, OnchainDeliveryTestContract } from '@aztec/noir-test-contracts.js/OnchainDeliveryTest';
9
+ import type { CustomRequest, ResolveCustomRequest, ResolveTaggingSecretStrategy } from '@aztec/pxe/config';
10
+ import type { AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
11
+
12
+ import { jest } from '@jest/globals';
13
+
14
+ import { AUTOMINE_E2E_OPTS } from '../../fixtures/fixtures.js';
15
+ import { ensureHandshakeRegistryPublished, setup, setupPXEAndGetWallet } from '../../fixtures/setup.js';
16
+ import { TestWallet } from '../../test-wallet/test_wallet.js';
17
+
18
+ // Builds the hook serving custom requests issued during the sender's simulations. Installed on the sender PXE at
19
+ // creation but built only once the recipient exists, since serving typically needs the recipient's wallet and keys.
20
+ export type CustomRequestResponder = (
21
+ recipient: TestWallet,
22
+ recipientAccount: InitialAccountData,
23
+ recipientCompleteAddress: CompleteAddress,
24
+ ) => ResolveCustomRequest;
25
+
26
+ export type Mode = 'constrained' | 'unconstrained';
27
+
28
+ // A single mode applies to both the event and note sends; `{ events, notes }` sends each in its own mode, which
29
+ // exercises cross-mode handshake reuse: bootstrap in one mode, deliver in the other on the same handshake.
30
+ export type DeliveryMode = Mode | { events: Mode; notes: Mode };
31
+
32
+ const formatMode = (mode: DeliveryMode): string => (typeof mode === 'string' ? mode : `${mode.events}->${mode.notes}`);
33
+
34
+ // Onchain private delivery has two orthogonal axes: the delivery MODE (constrained = nullifier-chained sequence;
35
+ // unconstrained = no nullifier, windowed scan) and the tagging-secret SOURCE, which the wallet's
36
+ // `resolveTaggingSecretStrategy` hook selects. This harness exercises (strategy, mode) cells end to end across two
37
+ // PXEs that share only a node: the sender PXE sends, the recipient PXE discovers purely from onchain logs plus the
38
+ // HandshakeRegistry.
39
+ //
40
+ // Cross-PXE is the meaningful setup: the recipient PXE holds no sender state, so a cell only "discovers" a message if
41
+ // the source truly reached it.
42
+ export function buildMessageDeliveryTest(opts: {
43
+ // Names the tagging-secret source, e.g. 'non-interactive handshake' or 'arbitrary secret'. The describe title is
44
+ // derived as `${strategy} x ${mode}`.
45
+ strategy: string;
46
+ mode: DeliveryMode;
47
+ // Required: every cell states its source explicitly rather than leaning on the PXE default (covered by unit tests).
48
+ senderHook: ResolveTaggingSecretStrategy;
49
+ // Recipient-side setup the source requires (e.g. registering a raw arbitrary secret); runs once after deployment.
50
+ recipientRegistration?: (
51
+ recipient: TestWallet,
52
+ recipientAddress: AztecAddress,
53
+ sender: AztecAddress,
54
+ ) => Promise<void>;
55
+ // Serves the custom requests issued during the sender's simulations (e.g. the registry's interactive-handshake
56
+ // signature request).
57
+ customRequestResponder?: CustomRequestResponder;
58
+ // Extra `it()`s to register in this cell's suite, e.g. assertions against state a custom `senderHook` recorded.
59
+ // Called inside the same `describe`, after the two baseline assertions below, so it shares their `beforeAll`
60
+ // instead of depending on Jest's cross-`describe` execution order.
61
+ additionalTests?: () => void;
62
+ }) {
63
+ const { strategy, mode, senderHook, recipientRegistration, customRequestResponder, additionalTests } = opts;
64
+ const description = `${strategy} x ${formatMode(mode)}`;
65
+
66
+ describe(description, () => {
67
+ jest.setTimeout(300_000);
68
+
69
+ const eventValues = [10n, 20n, 30n];
70
+ const noteValues = [40n, 50n, 60n];
71
+
72
+ let aztecNode: AztecNode & AztecNodeDebug;
73
+ let walletSender: TestWallet;
74
+ let walletRecipient: TestWallet;
75
+ let sender: AztecAddress;
76
+ let recipient: AztecAddress;
77
+ let contractSender: OnchainDeliveryTestContract;
78
+ let teardownSender: () => Promise<void>;
79
+ let teardownRecipient: () => Promise<void>;
80
+ // Discovery results captured in beforeAll, so the assertions in the actual tests below stay pure.
81
+ // A failure during delivery fails beforeAll loudly instead of being swallowed as an expected red.
82
+ let discoveredEvents: FieldLike[];
83
+ let readNotes: bigint[];
84
+
85
+ const { events: eventMode, notes: noteMode } = typeof mode === 'string' ? { events: mode, notes: mode } : mode;
86
+ const sendEvent = (value: bigint) =>
87
+ eventMode === 'constrained'
88
+ ? contractSender.methods.emit_event(recipient, value)
89
+ : contractSender.methods.emit_event_unconstrained(recipient, value);
90
+ const sendNote = (value: bigint) =>
91
+ noteMode === 'constrained'
92
+ ? contractSender.methods.emit_note(recipient, value)
93
+ : contractSender.methods.emit_note_unconstrained(recipient, value);
94
+
95
+ let additionallyFundedAccounts: InitialAccountData[];
96
+ let recipientAccount: AccountManager | undefined;
97
+ let customRequestCount = 0;
98
+
99
+ beforeAll(async () => {
100
+ // The sender PXE holds the sender and carries this cell's tagging-secret-strategy hook. The recipient is funded
101
+ // at genesis here but created and deployed on the isolated recipient PXE below, so it carries no sender state
102
+ // from other cells.
103
+ ({
104
+ aztecNode,
105
+ additionallyFundedAccounts,
106
+ wallet: walletSender,
107
+ accounts: [sender],
108
+ teardown: teardownSender,
109
+ } = await setup(1, {
110
+ ...AUTOMINE_E2E_OPTS,
111
+ additionallyFundedAccounts: await generateSchnorrAccounts(1, 'schnorr'),
112
+ pxeCreationOptions: {
113
+ hooks: {
114
+ resolveTaggingSecretStrategy: senderHook,
115
+ resolveCustomRequest: async (request: CustomRequest) => {
116
+ if (!customRequestResponder) {
117
+ throw new Error('A custom request arrived but this test cell has no customRequestResponder configured');
118
+ }
119
+ if (!recipientAccount) {
120
+ throw new Error('A custom request arrived before the recipient wallet was created');
121
+ }
122
+ customRequestCount++;
123
+ const respond = customRequestResponder(
124
+ walletRecipient,
125
+ additionallyFundedAccounts[0],
126
+ await recipientAccount.getCompleteAddress(),
127
+ );
128
+ return respond(request);
129
+ },
130
+ },
131
+ },
132
+ }));
133
+
134
+ ({ wallet: walletRecipient, teardown: teardownRecipient } = await setupPXEAndGetWallet(
135
+ aztecNode,
136
+ aztecNode,
137
+ {},
138
+ undefined,
139
+ 'pxe-recipient',
140
+ ));
141
+ recipientAccount = await walletRecipient.createSchnorrAccount(
142
+ additionallyFundedAccounts[0].secret,
143
+ additionallyFundedAccounts[0].salt,
144
+ additionallyFundedAccounts[0].signingKey,
145
+ );
146
+ await (await recipientAccount.getDeployMethod()).send({ from: NO_FROM });
147
+ recipient = recipientAccount.address;
148
+
149
+ await ensureHandshakeRegistryPublished(walletSender, sender);
150
+ const { contract: deployed, instance } = await OnchainDeliveryTestContract.deploy(walletSender).send({
151
+ from: sender,
152
+ });
153
+ contractSender = deployed;
154
+
155
+ await ensureHandshakeRegistryPublished(walletRecipient, recipient);
156
+ await walletRecipient.registerContract(instance, OnchainDeliveryTestContract.artifact);
157
+
158
+ await recipientRegistration?.(walletRecipient, recipient, sender);
159
+
160
+ // Constrained sends to one pair are strictly ordered, so deliver one tx at a time. The first send bootstraps the
161
+ // handshake (when the source is a handshake); the rest reuse it.
162
+ const blockNumbers: number[] = [];
163
+ for (const value of eventValues) {
164
+ const { receipt } = await sendEvent(value).send({ from: sender });
165
+ blockNumbers.push(receipt.blockNumber!);
166
+ }
167
+ for (const value of noteValues) {
168
+ await sendNote(value).send({ from: sender });
169
+ }
170
+
171
+ await walletRecipient.sync();
172
+
173
+ const events = await walletRecipient.getPrivateEvents<DeliveryEvent>(
174
+ OnchainDeliveryTestContract.events.DeliveryEvent,
175
+ {
176
+ contractAddress: contractSender.address,
177
+ fromBlock: BlockNumber(Math.min(...blockNumbers)),
178
+ toBlock: BlockNumber(Math.max(...blockNumbers) + 1),
179
+ scopes: [recipient],
180
+ },
181
+ );
182
+ discoveredEvents = events.map(e => e.event.value);
183
+
184
+ const contractRecipient = OnchainDeliveryTestContract.at(contractSender.address, walletRecipient);
185
+ const { result } = await contractRecipient.methods.get_note_values(recipient).simulate({ from: recipient });
186
+ readNotes = result.storage.slice(0, Number(result.len));
187
+ });
188
+
189
+ afterAll(async () => {
190
+ await teardownRecipient();
191
+ await teardownSender();
192
+ });
193
+
194
+ it('the recipient PXE discovers the events delivered by the sender PXE', () => {
195
+ expect(discoveredEvents.length).toBe(eventValues.length);
196
+ for (const value of eventValues) {
197
+ expect(discoveredEvents).toContainEqual(value);
198
+ }
199
+ });
200
+
201
+ it('the recipient PXE reads back the notes delivered by the sender PXE', () => {
202
+ expect(readNotes).toEqual(noteValues);
203
+ });
204
+
205
+ if (customRequestResponder) {
206
+ it('the custom request hook fires exactly once, on the send that bootstraps the tagging secret', () => {
207
+ expect(customRequestCount).toBe(1);
208
+ });
209
+ }
210
+
211
+ additionalTests?.();
212
+ });
213
+ }
@@ -0,0 +1,208 @@
1
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { computeSecretHash } from '@aztec/aztec.js/crypto';
3
+ import { Fr } from '@aztec/aztec.js/fields';
4
+ import { createLogger } from '@aztec/aztec.js/log';
5
+ import type { TxHash } from '@aztec/aztec.js/tx';
6
+ import type { TokenContract } from '@aztec/noir-contracts.js/Token';
7
+ import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist';
8
+ import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
9
+ import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
10
+
11
+ import { jest } from '@jest/globals';
12
+
13
+ import { ensureAuthRegistryPublished } from '../../fixtures/setup.js';
14
+ import { TokenSimulator } from '../../simulators/token_simulator.js';
15
+ import { AutomineTestContext, type AutomineTestOpts } from '../automine_test_context.js';
16
+
17
+ export class Role {
18
+ private isAdmin = false;
19
+ private isMinter = false;
20
+ private isBlacklisted = false;
21
+
22
+ withAdmin() {
23
+ this.isAdmin = true;
24
+ return this;
25
+ }
26
+
27
+ withMinter() {
28
+ this.isMinter = true;
29
+ return this;
30
+ }
31
+
32
+ withBlacklisted() {
33
+ this.isBlacklisted = true;
34
+ return this;
35
+ }
36
+
37
+ toNoirStruct() {
38
+ // We need to use lowercase identifiers as those are what the noir interface expects
39
+ // eslint-disable-next-line camelcase
40
+ return { is_admin: this.isAdmin, is_minter: this.isMinter, is_blacklisted: this.isBlacklisted };
41
+ }
42
+ }
43
+
44
+ /**
45
+ * TokenBlacklist-domain harness over the automine topology: extends {@link AutomineTestContext} with a
46
+ * {@link TokenSimulator}, the {@link Role} helper, the TokenBlacklist deploy plus a bad-account and
47
+ * authwit proxy, and the role-change-delay warp. Base setup and mint run in {@link setup}.
48
+ */
49
+ export class BlacklistTokenContractTest extends AutomineTestContext {
50
+ // This value MUST match the same value that we have in the contract
51
+ static CHANGE_ROLES_DELAY = 86400;
52
+
53
+ asset!: TokenBlacklistContract;
54
+ tokenSim!: TokenSimulator;
55
+ badAccount!: InvalidAccountContract;
56
+ authwitProxy!: GenericProxyContract;
57
+
58
+ adminAddress!: AztecAddress;
59
+ otherAddress!: AztecAddress;
60
+ blacklistedAddress!: AztecAddress;
61
+
62
+ private testName: string;
63
+
64
+ constructor(testName: string) {
65
+ super();
66
+ this.testName = testName;
67
+ }
68
+
69
+ async crossTimestampOfChange() {
70
+ await this.markProvenAndWarp(BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
71
+ }
72
+
73
+ /**
74
+ * Applies base setup:
75
+ * 1. Add 3 accounts.
76
+ * 2. Publicly deploy accounts, deploy token contract and a "bad account".
77
+ */
78
+ async applyBaseSetup() {
79
+ // Bumped from 2 min: pipelined cadence (~24s/dependent-tx) makes the 3-account deploy plus token/bad-account/
80
+ // proxy deploys exceed the original window.
81
+ jest.setTimeout(600_000);
82
+
83
+ this.cheatCodes = this.context.cheatCodes;
84
+ this.aztecNode = this.context.aztecNodeService;
85
+ this.sequencer = this.context.sequencer!;
86
+ this.wallet = this.context.wallet;
87
+ [this.adminAddress, this.otherAddress, this.blacklistedAddress] = this.context.accounts;
88
+
89
+ this.logger.info('Setting up blacklist token contract');
90
+ await ensureAuthRegistryPublished(this.wallet, this.adminAddress);
91
+
92
+ this.logger.verbose(`Deploying TokenContract...`);
93
+ ({ contract: this.asset } = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
94
+ from: this.adminAddress,
95
+ }));
96
+ this.logger.verbose(`Token deployed to ${this.asset.address}`);
97
+
98
+ this.logger.verbose(`Deploying bad account...`);
99
+ ({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
100
+ from: this.adminAddress,
101
+ }));
102
+ this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
103
+
104
+ // Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
105
+ // (so their notes are in scope), but msg_sender in the target must differ from the note owner
106
+ // to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
107
+ this.logger.verbose(`Deploying generic proxy...`);
108
+ ({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
109
+ from: this.adminAddress,
110
+ }));
111
+ this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
112
+
113
+ await this.crossTimestampOfChange();
114
+
115
+ this.tokenSim = new TokenSimulator(
116
+ this.asset as unknown as TokenContract,
117
+ this.wallet,
118
+ this.adminAddress,
119
+ this.logger,
120
+ [this.adminAddress, this.otherAddress, this.blacklistedAddress],
121
+ );
122
+
123
+ expect(
124
+ (await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
125
+ ).toEqual(new Role().withAdmin().toNoirStruct());
126
+ }
127
+
128
+ override async setup(opts: AutomineTestOpts = {}) {
129
+ await super.setup({ numberOfAccounts: 3, ...opts });
130
+ // hydrateFromContext repoints `this.logger` at the context logger; restore the harness-named one.
131
+ this.logger = createLogger(`e2e:automine:blacklist:${this.testName}`);
132
+ await this.applyBaseSetup();
133
+ }
134
+
135
+ async addPendingShieldNoteToPXE(
136
+ contract: TokenBlacklistContract,
137
+ recipient: AztecAddress,
138
+ amount: bigint,
139
+ secretHash: Fr,
140
+ txHash: TxHash,
141
+ ) {
142
+ const txEffects = await this.aztecNode.getTxEffect(txHash);
143
+ await contract.methods
144
+ .process_transparent_note(
145
+ contract.address,
146
+ amount,
147
+ secretHash,
148
+ txHash.hash,
149
+ txEffects!.data.noteHashes,
150
+ txEffects!.data.nullifiers[0],
151
+ recipient,
152
+ )
153
+ .simulate({ from: recipient });
154
+ }
155
+
156
+ async applyMint() {
157
+ this.logger.info('Applying mint setup');
158
+ const { asset, tokenSim } = this;
159
+ const amount = 10000n;
160
+
161
+ const adminMinterRole = new Role().withAdmin().withMinter();
162
+ await this.asset.methods
163
+ .update_roles(this.adminAddress, adminMinterRole.toNoirStruct())
164
+ .send({ from: this.adminAddress });
165
+
166
+ const blacklistRole = new Role().withBlacklisted();
167
+ await this.asset.methods
168
+ .update_roles(this.blacklistedAddress, blacklistRole.toNoirStruct())
169
+ .send({ from: this.adminAddress });
170
+
171
+ await this.crossTimestampOfChange();
172
+
173
+ expect(
174
+ (await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
175
+ ).toEqual(adminMinterRole.toNoirStruct());
176
+
177
+ this.logger.verbose(`Minting ${amount} publicly...`);
178
+ await asset.methods.mint_public(this.adminAddress, amount).send({ from: this.adminAddress });
179
+
180
+ this.logger.verbose(`Minting ${amount} privately...`);
181
+ const secret = Fr.random();
182
+ const secretHash = await computeSecretHash(secret);
183
+ const { receipt } = await asset.methods.mint_private(amount, secretHash).send({ from: this.adminAddress });
184
+
185
+ await this.addPendingShieldNoteToPXE(asset, this.adminAddress, amount, secretHash, receipt.txHash);
186
+ await asset.methods.redeem_shield(this.adminAddress, amount, secret).send({ from: this.adminAddress });
187
+ this.logger.verbose(`Minting complete.`);
188
+
189
+ tokenSim.mintPublic(this.adminAddress, amount);
190
+
191
+ const { result: publicBalance } = await asset.methods
192
+ .balance_of_public(this.adminAddress)
193
+ .simulate({ from: this.adminAddress });
194
+ this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
195
+ expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(this.adminAddress));
196
+
197
+ tokenSim.mintPrivate(this.adminAddress, amount);
198
+ const { result: privateBalance } = await asset.methods
199
+ .balance_of_private(this.adminAddress)
200
+ .simulate({ from: this.adminAddress });
201
+ this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
202
+ expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(this.adminAddress));
203
+
204
+ const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: this.adminAddress });
205
+ this.logger.verbose(`Total supply: ${totalSupply}`);
206
+ expect(totalSupply).toEqual(tokenSim.totalSupply);
207
+ }
208
+ }
@@ -0,0 +1,146 @@
1
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { createLogger } from '@aztec/aztec.js/log';
3
+ import type { AztecNode } from '@aztec/aztec.js/node';
4
+ import { TokenContract } from '@aztec/noir-contracts.js/Token';
5
+ import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
6
+ import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
7
+
8
+ import { jest } from '@jest/globals';
9
+
10
+ import { ensureAuthRegistryPublished } from '../../fixtures/setup.js';
11
+ import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
12
+ import { TokenSimulator } from '../../simulators/token_simulator.js';
13
+ import { AutomineTestContext, type AutomineTestOpts } from '../automine_test_context.js';
14
+
15
+ const { METRICS_PORT: metricsPort } = process.env;
16
+
17
+ /**
18
+ * Token-domain harness over the automine topology: extends {@link AutomineTestContext} with a
19
+ * {@link TokenSimulator}, the USDC Token deploy plus a bad-account and authwit proxy, and an optional
20
+ * mint. Base setup is opt-in via {@link applyBaseSnapshots} (run during `setup()`); {@link applyMint}
21
+ * is called explicitly after `setup()`.
22
+ */
23
+ export class TokenContractTest extends AutomineTestContext {
24
+ static TOKEN_NAME = 'USDC';
25
+ static TOKEN_SYMBOL = 'USD';
26
+ static TOKEN_DECIMALS = 18n;
27
+ metricsPort?: number;
28
+ asset!: TokenContract;
29
+ tokenSim!: TokenSimulator;
30
+ node!: AztecNode;
31
+
32
+ badAccount!: InvalidAccountContract;
33
+ authwitProxy!: GenericProxyContract;
34
+ adminAddress!: AztecAddress;
35
+ otherAddress!: AztecAddress;
36
+ account2Address!: AztecAddress;
37
+
38
+ private shouldApplyBaseSetup = false;
39
+ private testName: string;
40
+
41
+ constructor(testName: string) {
42
+ super();
43
+ this.testName = testName;
44
+ this.metricsPort = metricsPort ? parseInt(metricsPort) : undefined;
45
+ }
46
+
47
+ /**
48
+ * Registers that base setup should be applied during setup().
49
+ * Call this before setup() to deploy 3 accounts, publicly deploy accounts, token contract and a "bad account".
50
+ */
51
+ applyBaseSnapshots() {
52
+ this.shouldApplyBaseSetup = true;
53
+ }
54
+
55
+ /**
56
+ * Applies base setup: deploys 3 accounts, publicly deploys accounts, token contract and a "bad account".
57
+ */
58
+ private async applyBaseSetup() {
59
+ // Adding a timeout of 2 minutes in here such that it is propagated to the underlying tests
60
+ jest.setTimeout(120_000);
61
+
62
+ this.node = this.context.aztecNodeService;
63
+ this.wallet = this.context.wallet;
64
+ [this.adminAddress, this.otherAddress, this.account2Address] = this.context.accounts;
65
+
66
+ this.logger.info('Applying base setup - deploying token contract');
67
+ await ensureAuthRegistryPublished(this.wallet, this.adminAddress);
68
+
69
+ this.logger.verbose(`Deploying TokenContract...`);
70
+ ({ contract: this.asset } = await TokenContract.deploy(
71
+ this.wallet,
72
+ this.adminAddress,
73
+ TokenContractTest.TOKEN_NAME,
74
+ TokenContractTest.TOKEN_SYMBOL,
75
+ TokenContractTest.TOKEN_DECIMALS,
76
+ ).send({ from: this.adminAddress }));
77
+ this.logger.verbose(`Token deployed to ${this.asset.address}`);
78
+
79
+ this.logger.verbose(`Deploying bad account...`);
80
+ ({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
81
+ from: this.adminAddress,
82
+ }));
83
+ this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
84
+
85
+ // Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
86
+ // (so their notes are in scope), but msg_sender in the target must differ from the note owner
87
+ // to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
88
+ this.logger.verbose(`Deploying generic proxy...`);
89
+ ({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
90
+ from: this.adminAddress,
91
+ }));
92
+ this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
93
+
94
+ this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
95
+ this.adminAddress,
96
+ this.otherAddress,
97
+ ]);
98
+
99
+ expect((await this.asset.methods.get_admin().simulate({ from: this.adminAddress })).result).toBe(
100
+ this.adminAddress.toBigInt(),
101
+ );
102
+ }
103
+
104
+ override async setup(opts: AutomineTestOpts = {}) {
105
+ await super.setup({ numberOfAccounts: 3, metricsPort: this.metricsPort, ...opts });
106
+ // hydrateFromContext repoints `this.logger` at the context logger; restore the harness-named one.
107
+ this.logger = createLogger(`e2e:automine:token:${this.testName}`);
108
+
109
+ if (this.shouldApplyBaseSetup) {
110
+ await this.applyBaseSetup();
111
+ }
112
+ }
113
+
114
+ /** Mints an initial public and private balance to the admin account. Call after {@link setup}. */
115
+ async applyMint() {
116
+ this.logger.info('Applying mint setup');
117
+ const { asset, adminAddress, tokenSim } = this;
118
+ const amount = 10000n;
119
+
120
+ this.logger.verbose(`Minting ${amount} publicly...`);
121
+ await asset.methods.mint_to_public(adminAddress, amount).send({ from: adminAddress });
122
+ tokenSim.mintPublic(adminAddress, amount);
123
+
124
+ const { result: publicBalance } = await asset.methods
125
+ .balance_of_public(adminAddress)
126
+ .simulate({ from: adminAddress });
127
+ this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
128
+ expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(adminAddress));
129
+
130
+ this.logger.verbose(`Minting ${amount} privately...`);
131
+ await mintTokensToPrivate(asset, adminAddress, adminAddress, amount);
132
+ tokenSim.mintPrivate(adminAddress, amount);
133
+
134
+ const { result: privateBalance } = await asset.methods
135
+ .balance_of_private(adminAddress)
136
+ .simulate({ from: adminAddress });
137
+ this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
138
+ expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(adminAddress));
139
+
140
+ const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: adminAddress });
141
+ this.logger.verbose(`Total supply: ${totalSupply}`);
142
+ expect(totalSupply).toEqual(tokenSim.totalSupply);
143
+
144
+ this.logger.verbose(`Minting complete.`);
145
+ }
146
+ }