@aztec/end-to-end 0.0.1-commit.96dac018d → 0.0.1-commit.9a89641

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 (328) 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 +37 -50
  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 +35 -50
  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 +6 -6
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +65 -59
  30. package/dest/bench/client_flows/data_extractor.js +1 -0
  31. package/dest/bench/utils.d.ts +3 -3
  32. package/dest/bench/utils.d.ts.map +1 -1
  33. package/dest/bench/utils.js +102 -8
  34. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  35. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  36. package/dest/composed/ha/ha_full_setup.js +383 -0
  37. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  38. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  39. package/dest/fixtures/authwit_proxy.d.ts +3 -3
  40. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  41. package/dest/fixtures/authwit_proxy.js +4 -0
  42. package/dest/fixtures/e2e_prover_test.d.ts +15 -11
  43. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  44. package/dest/fixtures/e2e_prover_test.js +60 -44
  45. package/dest/fixtures/fixtures.d.ts +79 -1
  46. package/dest/fixtures/fixtures.d.ts.map +1 -1
  47. package/dest/fixtures/fixtures.js +80 -0
  48. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  49. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  50. package/dest/fixtures/get_acvm_config.js +2 -2
  51. package/dest/fixtures/get_bb_config.d.ts +1 -1
  52. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  53. package/dest/fixtures/get_bb_config.js +6 -6
  54. package/dest/fixtures/ha_setup.d.ts +4 -4
  55. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  56. package/dest/fixtures/ha_setup.js +5 -2
  57. package/dest/fixtures/index.d.ts +2 -1
  58. package/dest/fixtures/index.d.ts.map +1 -1
  59. package/dest/fixtures/index.js +1 -0
  60. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  61. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  62. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  63. package/dest/fixtures/setup.d.ts +88 -45
  64. package/dest/fixtures/setup.d.ts.map +1 -1
  65. package/dest/fixtures/setup.js +297 -202
  66. package/dest/fixtures/setup_p2p_test.d.ts +10 -6
  67. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  68. package/dest/fixtures/setup_p2p_test.js +11 -11
  69. package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
  70. package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
  71. package/dest/fixtures/standard_contracts_genesis.js +25 -0
  72. package/dest/fixtures/timing.d.ts +42 -0
  73. package/dest/fixtures/timing.d.ts.map +1 -0
  74. package/dest/fixtures/timing.js +72 -0
  75. package/dest/fixtures/token_utils.d.ts +22 -4
  76. package/dest/fixtures/token_utils.d.ts.map +1 -1
  77. package/dest/fixtures/token_utils.js +23 -6
  78. package/dest/fixtures/utils.d.ts +2 -2
  79. package/dest/fixtures/utils.d.ts.map +1 -1
  80. package/dest/fixtures/utils.js +1 -1
  81. package/dest/fixtures/wait_helpers.d.ts +135 -0
  82. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  83. package/dest/fixtures/wait_helpers.js +154 -0
  84. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  85. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  86. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  87. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  88. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  89. package/dest/forward-compatibility/wallet_service.js +109 -0
  90. package/dest/install_legacy_contracts.d.cts +10 -0
  91. package/dest/install_legacy_contracts.d.cts.map +1 -0
  92. package/dest/legacy-jest-resolver.d.cts +3 -0
  93. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  94. package/dest/multi-node/block-production/setup.d.ts +97 -0
  95. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  96. package/dest/multi-node/block-production/setup.js +158 -0
  97. package/dest/multi-node/governance/setup.d.ts +67 -0
  98. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  99. package/dest/multi-node/governance/setup.js +126 -0
  100. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  101. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  102. package/dest/multi-node/multi_node_test_context.js +347 -0
  103. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  104. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  105. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  106. package/dest/multi-node/slashing/setup.d.ts +167 -0
  107. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  108. package/dest/multi-node/slashing/setup.js +275 -0
  109. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +21 -11
  110. package/dest/p2p/p2p_network.d.ts.map +1 -0
  111. package/dest/{e2e_p2p → p2p}/p2p_network.js +95 -48
  112. package/dest/p2p/reqresp/utils.d.ts +19 -0
  113. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  114. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +45 -29
  115. package/dest/p2p/shared.d.ts +72 -0
  116. package/dest/p2p/shared.d.ts.map +1 -0
  117. package/dest/p2p/shared.js +212 -0
  118. package/dest/shared/cross_chain_test_harness.d.ts +6 -4
  119. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  120. package/dest/shared/cross_chain_test_harness.js +44 -32
  121. package/dest/shared/gas_portal_test_harness.d.ts +9 -6
  122. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  123. package/dest/shared/gas_portal_test_harness.js +28 -17
  124. package/dest/shared/jest_setup.js +32 -1
  125. package/dest/shared/submit-transactions.d.ts +1 -1
  126. package/dest/shared/submit-transactions.d.ts.map +1 -1
  127. package/dest/shared/submit-transactions.js +12 -5
  128. package/dest/shared/timing_env.d.js +5 -0
  129. package/dest/shared/timing_env.js +365 -0
  130. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  131. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  132. package/dest/shared/uniswap_l1_l2.js +55 -45
  133. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  134. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  135. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  136. package/dest/simulators/lending_simulator.d.ts +10 -3
  137. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  138. package/dest/simulators/lending_simulator.js +27 -15
  139. package/dest/simulators/token_simulator.d.ts +1 -1
  140. package/dest/simulators/token_simulator.d.ts.map +1 -1
  141. package/dest/simulators/token_simulator.js +2 -2
  142. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  143. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  144. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  145. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  146. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  147. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  148. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  149. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  150. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  151. package/dest/single-node/fees/fees_test.d.ts +95 -0
  152. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  153. package/dest/single-node/fees/fees_test.js +344 -0
  154. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  155. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  156. package/dest/single-node/l1-reorgs/setup.js +57 -0
  157. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  158. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  159. package/dest/single-node/partial-proofs/setup.js +5 -0
  160. package/dest/single-node/proving/setup.d.ts +5 -0
  161. package/dest/single-node/proving/setup.d.ts.map +1 -0
  162. package/dest/single-node/proving/setup.js +5 -0
  163. package/dest/single-node/recovery/setup.d.ts +5 -0
  164. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  165. package/dest/single-node/recovery/setup.js +5 -0
  166. package/dest/single-node/setup.d.ts +49 -0
  167. package/dest/single-node/setup.d.ts.map +1 -0
  168. package/dest/single-node/setup.js +56 -0
  169. package/dest/single-node/single_node_test_context.d.ts +374 -0
  170. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  171. package/dest/single-node/single_node_test_context.js +847 -0
  172. package/dest/spartan/setup_test_wallets.d.ts +4 -2
  173. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  174. package/dest/spartan/setup_test_wallets.js +93 -46
  175. package/dest/spartan/tx_metrics.d.ts +27 -4
  176. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  177. package/dest/spartan/tx_metrics.js +106 -21
  178. package/dest/spartan/utils/config.d.ts +10 -30
  179. package/dest/spartan/utils/config.d.ts.map +1 -1
  180. package/dest/spartan/utils/config.js +3 -1
  181. package/dest/spartan/utils/index.d.ts +3 -1
  182. package/dest/spartan/utils/index.d.ts.map +1 -1
  183. package/dest/spartan/utils/index.js +4 -0
  184. package/dest/spartan/utils/nodes.js +3 -3
  185. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  186. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  187. package/dest/spartan/utils/pod_logs.js +74 -0
  188. package/dest/test-wallet/test_wallet.d.ts +47 -25
  189. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  190. package/dest/test-wallet/test_wallet.js +197 -91
  191. package/dest/test-wallet/utils.d.ts +38 -3
  192. package/dest/test-wallet/utils.d.ts.map +1 -1
  193. package/dest/test-wallet/utils.js +65 -10
  194. package/dest/test-wallet/wallet_worker_script.js +12 -4
  195. package/dest/test-wallet/worker_wallet.d.ts +9 -8
  196. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  197. package/dest/test-wallet/worker_wallet.js +10 -4
  198. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
  199. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  200. package/dest/test-wallet/worker_wallet_schema.js +15 -2
  201. package/package.json +50 -47
  202. package/src/automine/README.md +60 -0
  203. package/src/automine/automine_test_context.ts +153 -0
  204. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  205. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  206. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +42 -61
  207. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +41 -56
  208. package/src/automine/token/token_test_helpers.ts +138 -0
  209. package/src/bench/client_flows/benchmark.ts +21 -0
  210. package/src/bench/client_flows/client_flows_benchmark.ts +105 -70
  211. package/src/bench/client_flows/data_extractor.ts +1 -0
  212. package/src/bench/utils.ts +116 -7
  213. package/src/composed/ha/ha_full_setup.ts +466 -0
  214. package/src/fixtures/authwit_proxy.ts +4 -0
  215. package/src/fixtures/e2e_prover_test.ts +80 -64
  216. package/src/fixtures/fixtures.ts +100 -0
  217. package/src/fixtures/get_acvm_config.ts +2 -8
  218. package/src/fixtures/get_bb_config.ts +8 -8
  219. package/src/fixtures/ha_setup.ts +11 -5
  220. package/src/fixtures/index.ts +1 -0
  221. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  222. package/src/fixtures/setup.ts +379 -264
  223. package/src/fixtures/setup_p2p_test.ts +15 -11
  224. package/src/fixtures/standard_contracts_genesis.ts +28 -0
  225. package/src/fixtures/timing.ts +97 -0
  226. package/src/fixtures/token_utils.ts +40 -6
  227. package/src/fixtures/utils.ts +2 -3
  228. package/src/fixtures/wait_helpers.ts +333 -0
  229. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  230. package/src/forward-compatibility/wallet_service.ts +106 -0
  231. package/src/guides/up_quick_start.sh +5 -2
  232. package/src/infra/README.md +12 -0
  233. package/src/install_legacy_contracts.cjs +75 -0
  234. package/src/legacy-jest-resolver.cjs +112 -0
  235. package/src/multi-node/README.md +96 -0
  236. package/src/multi-node/block-production/setup.ts +272 -0
  237. package/src/multi-node/governance/setup.ts +172 -0
  238. package/src/multi-node/multi_node_test_context.ts +447 -0
  239. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  240. package/src/multi-node/slashing/setup.ts +433 -0
  241. package/src/p2p/README.md +78 -0
  242. package/src/{e2e_p2p → p2p}/p2p_network.ts +115 -66
  243. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +56 -28
  244. package/src/p2p/shared.ts +329 -0
  245. package/src/shared/cross_chain_test_harness.ts +44 -21
  246. package/src/shared/gas_portal_test_harness.ts +35 -18
  247. package/src/shared/jest_setup.ts +36 -1
  248. package/src/shared/submit-transactions.ts +13 -8
  249. package/src/shared/timing_env.d.mts +39 -0
  250. package/src/shared/timing_env.mjs +363 -0
  251. package/src/shared/uniswap_l1_l2.ts +98 -54
  252. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  253. package/src/simulators/lending_simulator.ts +33 -15
  254. package/src/simulators/token_simulator.ts +6 -2
  255. package/src/single-node/README.md +66 -0
  256. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  257. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  258. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  259. package/src/single-node/fees/fees_test.ts +434 -0
  260. package/src/single-node/l1-reorgs/setup.ts +93 -0
  261. package/src/single-node/partial-proofs/setup.ts +8 -0
  262. package/src/single-node/proving/setup.ts +15 -0
  263. package/src/single-node/recovery/setup.ts +8 -0
  264. package/src/single-node/setup.ts +63 -0
  265. package/src/single-node/single_node_test_context.ts +1058 -0
  266. package/src/spartan/setup_test_wallets.ts +117 -45
  267. package/src/spartan/tx_metrics.ts +108 -24
  268. package/src/spartan/utils/config.ts +2 -0
  269. package/src/spartan/utils/index.ts +6 -0
  270. package/src/spartan/utils/nodes.ts +3 -3
  271. package/src/spartan/utils/pod_logs.ts +99 -0
  272. package/src/test-wallet/test_wallet.ts +227 -107
  273. package/src/test-wallet/utils.ts +104 -11
  274. package/src/test-wallet/wallet_worker_script.ts +11 -5
  275. package/src/test-wallet/worker_wallet.ts +19 -16
  276. package/src/test-wallet/worker_wallet_schema.ts +4 -3
  277. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
  278. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  279. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  280. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  281. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  282. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  283. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  284. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  285. package/dest/e2e_epochs/epochs_test.d.ts +0 -102
  286. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  287. package/dest/e2e_epochs/epochs_test.js +0 -386
  288. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  289. package/dest/e2e_fees/fees_test.d.ts +0 -88
  290. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  291. package/dest/e2e_fees/fees_test.js +0 -248
  292. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  293. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  294. package/dest/e2e_l1_publisher/write_json.js +0 -56
  295. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  296. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  297. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  298. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  299. package/dest/e2e_nested_contract/nested_contract_test.js +0 -56
  300. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  301. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  302. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  303. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  304. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  305. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  306. package/dest/e2e_p2p/shared.d.ts +0 -46
  307. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  308. package/dest/e2e_p2p/shared.js +0 -181
  309. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  310. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  311. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  312. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  313. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  314. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  315. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  316. package/src/e2e_epochs/epochs_test.ts +0 -487
  317. package/src/e2e_fees/fees_test.ts +0 -324
  318. package/src/e2e_l1_publisher/write_json.ts +0 -77
  319. package/src/e2e_nested_contract/nested_contract_test.ts +0 -73
  320. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  321. package/src/e2e_p2p/shared.ts +0 -290
  322. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  323. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  324. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  325. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  326. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  327. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  328. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -1,21 +1,18 @@
1
1
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
2
  import { computeSecretHash } from '@aztec/aztec.js/crypto';
3
3
  import { Fr } from '@aztec/aztec.js/fields';
4
- import { type Logger, createLogger } from '@aztec/aztec.js/log';
5
- import type { AztecNode } from '@aztec/aztec.js/node';
4
+ import { createLogger } from '@aztec/aztec.js/log';
6
5
  import type { TxHash } from '@aztec/aztec.js/tx';
7
- import type { CheatCodes } from '@aztec/aztec/testing';
8
6
  import type { TokenContract } from '@aztec/noir-contracts.js/Token';
9
7
  import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist';
10
8
  import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
11
9
  import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
12
- import type { SequencerClient } from '@aztec/sequencer-client';
13
10
 
14
11
  import { jest } from '@jest/globals';
15
12
 
16
- import { type EndToEndContext, deployAccounts, publicDeployAccounts, setup, teardown } from '../fixtures/setup.js';
17
- import { TokenSimulator } from '../simulators/token_simulator.js';
18
- import type { TestWallet } from '../test-wallet/test_wallet.js';
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';
19
16
 
20
17
  export class Role {
21
18
  private isAdmin = false;
@@ -44,35 +41,33 @@ export class Role {
44
41
  }
45
42
  }
46
43
 
47
- export class BlacklistTokenContractTest {
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 {
48
50
  // This value MUST match the same value that we have in the contract
49
51
  static CHANGE_ROLES_DELAY = 86400;
50
52
 
51
- context!: EndToEndContext;
52
- logger: Logger;
53
- wallet!: TestWallet;
54
53
  asset!: TokenBlacklistContract;
55
54
  tokenSim!: TokenSimulator;
56
55
  badAccount!: InvalidAccountContract;
57
56
  authwitProxy!: GenericProxyContract;
58
- cheatCodes!: CheatCodes;
59
- sequencer!: SequencerClient;
60
- aztecNode!: AztecNode;
61
57
 
62
58
  adminAddress!: AztecAddress;
63
59
  otherAddress!: AztecAddress;
64
60
  blacklistedAddress!: AztecAddress;
65
61
 
62
+ private testName: string;
63
+
66
64
  constructor(testName: string) {
67
- this.logger = createLogger(`e2e:e2e_blacklist_token_contract:${testName}`);
65
+ super();
66
+ this.testName = testName;
68
67
  }
69
68
 
70
69
  async crossTimestampOfChange() {
71
- await this.cheatCodes.warpL2TimeAtLeastBy(
72
- this.sequencer,
73
- this.aztecNode,
74
- BlacklistTokenContractTest.CHANGE_ROLES_DELAY,
75
- );
70
+ await this.markProvenAndWarp(BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
76
71
  }
77
72
 
78
73
  /**
@@ -81,46 +76,38 @@ export class BlacklistTokenContractTest {
81
76
  * 2. Publicly deploy accounts, deploy token contract and a "bad account".
82
77
  */
83
78
  async applyBaseSetup() {
84
- // Adding a timeout of 2 minutes in here such that it is propagated to the underlying tests
85
- jest.setTimeout(120_000);
86
-
87
- this.logger.info('Deploying 3 accounts');
88
- const { deployedAccounts } = await deployAccounts(
89
- 3,
90
- this.logger,
91
- )({
92
- wallet: this.context.wallet,
93
- initialFundedAccounts: this.context.initialFundedAccounts,
94
- });
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);
95
82
 
96
83
  this.cheatCodes = this.context.cheatCodes;
97
84
  this.aztecNode = this.context.aztecNodeService;
98
85
  this.sequencer = this.context.sequencer!;
99
86
  this.wallet = this.context.wallet;
100
- this.adminAddress = deployedAccounts[0].address;
101
- this.otherAddress = deployedAccounts[1].address;
102
- this.blacklistedAddress = deployedAccounts[2].address;
87
+ [this.adminAddress, this.otherAddress, this.blacklistedAddress] = this.context.accounts;
103
88
 
104
89
  this.logger.info('Setting up blacklist token contract');
105
- // Create the token contract state.
106
- this.logger.verbose(`Public deploy accounts...`);
107
- await publicDeployAccounts(this.wallet, [this.adminAddress, this.otherAddress, this.blacklistedAddress]);
90
+ await ensureAuthRegistryPublished(this.wallet, this.adminAddress);
108
91
 
109
92
  this.logger.verbose(`Deploying TokenContract...`);
110
- this.asset = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
93
+ ({ contract: this.asset } = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
111
94
  from: this.adminAddress,
112
- });
95
+ }));
113
96
  this.logger.verbose(`Token deployed to ${this.asset.address}`);
114
97
 
115
98
  this.logger.verbose(`Deploying bad account...`);
116
- this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({ from: this.adminAddress });
99
+ ({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
100
+ from: this.adminAddress,
101
+ }));
117
102
  this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
118
103
 
119
104
  // Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
120
105
  // (so their notes are in scope), but msg_sender in the target must differ from the note owner
121
106
  // to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
122
107
  this.logger.verbose(`Deploying generic proxy...`);
123
- this.authwitProxy = await GenericProxyContract.deploy(this.wallet).send({ from: this.adminAddress });
108
+ ({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
109
+ from: this.adminAddress,
110
+ }));
124
111
  this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
125
112
 
126
113
  await this.crossTimestampOfChange();
@@ -133,24 +120,18 @@ export class BlacklistTokenContractTest {
133
120
  [this.adminAddress, this.otherAddress, this.blacklistedAddress],
134
121
  );
135
122
 
136
- expect(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).toEqual(
137
- new Role().withAdmin().toNoirStruct(),
138
- );
123
+ expect(
124
+ (await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
125
+ ).toEqual(new Role().withAdmin().toNoirStruct());
139
126
  }
140
127
 
141
- async setup() {
142
- this.logger.info('Setting up fresh context');
143
- this.context = await setup(0, {
144
- fundSponsoredFPC: true,
145
- skipAccountDeployment: true,
146
- });
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}`);
147
132
  await this.applyBaseSetup();
148
133
  }
149
134
 
150
- async teardown() {
151
- await teardown(this.context);
152
- }
153
-
154
135
  async addPendingShieldNoteToPXE(
155
136
  contract: TokenBlacklistContract,
156
137
  recipient: AztecAddress,
@@ -189,9 +170,9 @@ export class BlacklistTokenContractTest {
189
170
 
190
171
  await this.crossTimestampOfChange();
191
172
 
192
- expect(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).toEqual(
193
- adminMinterRole.toNoirStruct(),
194
- );
173
+ expect(
174
+ (await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
175
+ ).toEqual(adminMinterRole.toNoirStruct());
195
176
 
196
177
  this.logger.verbose(`Minting ${amount} publicly...`);
197
178
  await asset.methods.mint_public(this.adminAddress, amount).send({ from: this.adminAddress });
@@ -199,7 +180,7 @@ export class BlacklistTokenContractTest {
199
180
  this.logger.verbose(`Minting ${amount} privately...`);
200
181
  const secret = Fr.random();
201
182
  const secretHash = await computeSecretHash(secret);
202
- const receipt = await asset.methods.mint_private(amount, secretHash).send({ from: this.adminAddress });
183
+ const { receipt } = await asset.methods.mint_private(amount, secretHash).send({ from: this.adminAddress });
203
184
 
204
185
  await this.addPendingShieldNoteToPXE(asset, this.adminAddress, amount, secretHash, receipt.txHash);
205
186
  await asset.methods.redeem_shield(this.adminAddress, amount, secret).send({ from: this.adminAddress });
@@ -207,20 +188,20 @@ export class BlacklistTokenContractTest {
207
188
 
208
189
  tokenSim.mintPublic(this.adminAddress, amount);
209
190
 
210
- const publicBalance = await asset.methods
191
+ const { result: publicBalance } = await asset.methods
211
192
  .balance_of_public(this.adminAddress)
212
193
  .simulate({ from: this.adminAddress });
213
194
  this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
214
195
  expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(this.adminAddress));
215
196
 
216
197
  tokenSim.mintPrivate(this.adminAddress, amount);
217
- const privateBalance = await asset.methods
198
+ const { result: privateBalance } = await asset.methods
218
199
  .balance_of_private(this.adminAddress)
219
200
  .simulate({ from: this.adminAddress });
220
201
  this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
221
202
  expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(this.adminAddress));
222
203
 
223
- const totalSupply = await asset.methods.total_supply().simulate({ from: this.adminAddress });
204
+ const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: this.adminAddress });
224
205
  this.logger.verbose(`Total supply: ${totalSupply}`);
225
206
  expect(totalSupply).toEqual(tokenSim.totalSupply);
226
207
  }
@@ -1,5 +1,5 @@
1
1
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
- import { type Logger, createLogger } from '@aztec/aztec.js/log';
2
+ import { createLogger } from '@aztec/aztec.js/log';
3
3
  import type { AztecNode } from '@aztec/aztec.js/node';
4
4
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
5
5
  import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
@@ -7,19 +7,23 @@ import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAcc
7
7
 
8
8
  import { jest } from '@jest/globals';
9
9
 
10
- import { type EndToEndContext, deployAccounts, publicDeployAccounts, setup, teardown } from '../fixtures/setup.js';
11
- import { mintTokensToPrivate } from '../fixtures/token_utils.js';
12
- import { TokenSimulator } from '../simulators/token_simulator.js';
13
- import type { TestWallet } from '../test-wallet/test_wallet.js';
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
14
 
15
15
  const { METRICS_PORT: metricsPort } = process.env;
16
16
 
17
- export class TokenContractTest {
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 {
18
24
  static TOKEN_NAME = 'USDC';
19
25
  static TOKEN_SYMBOL = 'USD';
20
26
  static TOKEN_DECIMALS = 18n;
21
- context!: EndToEndContext;
22
- logger: Logger;
23
27
  metricsPort?: number;
24
28
  asset!: TokenContract;
25
29
  tokenSim!: TokenSimulator;
@@ -27,16 +31,16 @@ export class TokenContractTest {
27
31
 
28
32
  badAccount!: InvalidAccountContract;
29
33
  authwitProxy!: GenericProxyContract;
30
- wallet!: TestWallet;
31
34
  adminAddress!: AztecAddress;
32
- account1Address!: AztecAddress;
35
+ otherAddress!: AztecAddress;
33
36
  account2Address!: AztecAddress;
34
37
 
35
38
  private shouldApplyBaseSetup = false;
36
- private shouldApplyMint = false;
39
+ private testName: string;
37
40
 
38
41
  constructor(testName: string) {
39
- this.logger = createLogger(`e2e:e2e_token_contract:${testName}`);
42
+ super();
43
+ this.testName = testName;
40
44
  this.metricsPort = metricsPort ? parseInt(metricsPort) : undefined;
41
45
  }
42
46
 
@@ -48,14 +52,6 @@ export class TokenContractTest {
48
52
  this.shouldApplyBaseSetup = true;
49
53
  }
50
54
 
51
- /**
52
- * Registers that mint should be applied during setup().
53
- * Call this before setup() to mint tokens to the admin account.
54
- */
55
- applyMintSnapshot() {
56
- this.shouldApplyMint = true;
57
- }
58
-
59
55
  /**
60
56
  * Applies base setup: deploys 3 accounts, publicly deploys accounts, token contract and a "bad account".
61
57
  */
@@ -63,75 +59,60 @@ export class TokenContractTest {
63
59
  // Adding a timeout of 2 minutes in here such that it is propagated to the underlying tests
64
60
  jest.setTimeout(120_000);
65
61
 
66
- this.logger.info('Applying base setup - deploying 3 accounts');
67
- const { deployedAccounts } = await deployAccounts(
68
- 3,
69
- this.logger,
70
- )({
71
- wallet: this.context.wallet,
72
- initialFundedAccounts: this.context.initialFundedAccounts,
73
- });
74
-
75
62
  this.node = this.context.aztecNodeService;
76
63
  this.wallet = this.context.wallet;
77
- [this.adminAddress, this.account1Address, this.account2Address] = deployedAccounts.map(acc => acc.address);
64
+ [this.adminAddress, this.otherAddress, this.account2Address] = this.context.accounts;
78
65
 
79
66
  this.logger.info('Applying base setup - deploying token contract');
80
- this.logger.verbose(`Public deploy accounts...`);
81
- await publicDeployAccounts(this.wallet, [this.adminAddress, this.account1Address]);
67
+ await ensureAuthRegistryPublished(this.wallet, this.adminAddress);
82
68
 
83
69
  this.logger.verbose(`Deploying TokenContract...`);
84
- this.asset = await TokenContract.deploy(
70
+ ({ contract: this.asset } = await TokenContract.deploy(
85
71
  this.wallet,
86
72
  this.adminAddress,
87
73
  TokenContractTest.TOKEN_NAME,
88
74
  TokenContractTest.TOKEN_SYMBOL,
89
75
  TokenContractTest.TOKEN_DECIMALS,
90
- ).send({ from: this.adminAddress });
76
+ ).send({ from: this.adminAddress }));
91
77
  this.logger.verbose(`Token deployed to ${this.asset.address}`);
92
78
 
93
79
  this.logger.verbose(`Deploying bad account...`);
94
- this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({ from: this.adminAddress });
80
+ ({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
81
+ from: this.adminAddress,
82
+ }));
95
83
  this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
96
84
 
97
85
  // Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
98
86
  // (so their notes are in scope), but msg_sender in the target must differ from the note owner
99
87
  // to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
100
88
  this.logger.verbose(`Deploying generic proxy...`);
101
- this.authwitProxy = await GenericProxyContract.deploy(this.wallet).send({ from: this.adminAddress });
89
+ ({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
90
+ from: this.adminAddress,
91
+ }));
102
92
  this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
103
93
 
104
94
  this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
105
95
  this.adminAddress,
106
- this.account1Address,
96
+ this.otherAddress,
107
97
  ]);
108
98
 
109
- expect(await this.asset.methods.get_admin().simulate({ from: this.adminAddress })).toBe(
99
+ expect((await this.asset.methods.get_admin().simulate({ from: this.adminAddress })).result).toBe(
110
100
  this.adminAddress.toBigInt(),
111
101
  );
112
102
  }
113
103
 
114
- async setup() {
115
- this.context = await setup(0, {
116
- metricsPort: this.metricsPort,
117
- fundSponsoredFPC: true,
118
- skipAccountDeployment: true,
119
- });
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}`);
120
108
 
121
109
  if (this.shouldApplyBaseSetup) {
122
110
  await this.applyBaseSetup();
123
111
  }
124
-
125
- if (this.shouldApplyMint) {
126
- await this.applyMint();
127
- }
128
- }
129
-
130
- async teardown() {
131
- await teardown(this.context);
132
112
  }
133
113
 
134
- private async applyMint() {
114
+ /** Mints an initial public and private balance to the admin account. Call after {@link setup}. */
115
+ async applyMint() {
135
116
  this.logger.info('Applying mint setup');
136
117
  const { asset, adminAddress, tokenSim } = this;
137
118
  const amount = 10000n;
@@ -140,7 +121,9 @@ export class TokenContractTest {
140
121
  await asset.methods.mint_to_public(adminAddress, amount).send({ from: adminAddress });
141
122
  tokenSim.mintPublic(adminAddress, amount);
142
123
 
143
- const publicBalance = await asset.methods.balance_of_public(adminAddress).simulate({ from: adminAddress });
124
+ const { result: publicBalance } = await asset.methods
125
+ .balance_of_public(adminAddress)
126
+ .simulate({ from: adminAddress });
144
127
  this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
145
128
  expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(adminAddress));
146
129
 
@@ -148,11 +131,13 @@ export class TokenContractTest {
148
131
  await mintTokensToPrivate(asset, adminAddress, adminAddress, amount);
149
132
  tokenSim.mintPrivate(adminAddress, amount);
150
133
 
151
- const privateBalance = await asset.methods.balance_of_private(adminAddress).simulate({ from: adminAddress });
134
+ const { result: privateBalance } = await asset.methods
135
+ .balance_of_private(adminAddress)
136
+ .simulate({ from: adminAddress });
152
137
  this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
153
138
  expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(adminAddress));
154
139
 
155
- const totalSupply = await asset.methods.total_supply().simulate({ from: adminAddress });
140
+ const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: adminAddress });
156
141
  this.logger.verbose(`Total supply: ${totalSupply}`);
157
142
  expect(totalSupply).toEqual(tokenSim.totalSupply);
158
143
 
@@ -0,0 +1,138 @@
1
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import type { ContractFunctionInteraction } from '@aztec/aztec.js/contracts';
3
+ import type { Logger } from '@aztec/aztec.js/log';
4
+ import type { Wallet } from '@aztec/aztec.js/wallet';
5
+ import { AMMContract } from '@aztec/noir-contracts.js/AMM';
6
+ import type { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
7
+
8
+ import { sendThroughAuthwitProxy } from '../../fixtures/authwit_proxy.js';
9
+ import { DUPLICATE_NULLIFIER_ERROR } from '../../fixtures/fixtures.js';
10
+ import { type AnyTokenContract, mintTokensToPrivate } from '../../fixtures/token_utils.js';
11
+ import type { TestWallet } from '../../test-wallet/test_wallet.js';
12
+
13
+ /** Whether an amount / balance is read from the private or public balance of the token. */
14
+ export type BalanceKind = 'private' | 'public';
15
+
16
+ /** The invalid-authwit-nonce assertion the contract raises when `from == msg_sender` but nonce != 0. */
17
+ export const INVALID_AUTHWIT_NONCE_ERROR =
18
+ "Assertion failed: Invalid authwit nonce. When 'from' and 'msg_sender' are the same, 'authwit_nonce' must be zero";
19
+
20
+ /** Minimal token shape needed to read balances — satisfied structurally by Token/TestToken/TokenBlacklist. */
21
+ export interface BalanceReadable {
22
+ methods: {
23
+ balance_of_private(owner: AztecAddress): { simulate(opts: { from: AztecAddress }): Promise<{ result: bigint }> };
24
+ balance_of_public(owner: AztecAddress): { simulate(opts: { from: AztecAddress }): Promise<{ result: bigint }> };
25
+ };
26
+ }
27
+
28
+ /** Reads the private or public balance of an account, simulating from that account's own scope. */
29
+ export async function balanceOf(asset: BalanceReadable, kind: BalanceKind, account: AztecAddress): Promise<bigint> {
30
+ const interaction =
31
+ kind === 'private' ? asset.methods.balance_of_private(account) : asset.methods.balance_of_public(account);
32
+ return (await interaction.simulate({ from: account })).result;
33
+ }
34
+
35
+ /** Returns half of an account's balance, asserting it is non-zero so the operation under test is meaningful. */
36
+ export async function halfBalanceOf(asset: BalanceReadable, kind: BalanceKind, owner: AztecAddress): Promise<bigint> {
37
+ const amount = (await balanceOf(asset, kind, owner)) / 2n;
38
+ expect(amount).toBeGreaterThan(0n);
39
+ return amount;
40
+ }
41
+
42
+ /** Returns an amount just above an account's balance (balance + delta), asserting it is non-zero. */
43
+ export async function amountAboveBalance(
44
+ asset: BalanceReadable,
45
+ kind: BalanceKind,
46
+ owner: AztecAddress,
47
+ delta = 1n,
48
+ ): Promise<bigint> {
49
+ const amount = (await balanceOf(asset, kind, owner)) + delta;
50
+ expect(amount).toBeGreaterThan(0n);
51
+ return amount;
52
+ }
53
+
54
+ /**
55
+ * Grants a public authwit for `caller` to run `action` on behalf of `owner`, executes it from `caller`,
56
+ * then asserts a replay of the same call reverts as unauthorized (the authwit is single-use).
57
+ *
58
+ * `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
59
+ * their {@link TokenSimulator} to match the state change the executed action produced.
60
+ */
61
+ export async function assertPublicAuthwitReplayRejected(
62
+ wallet: TestWallet,
63
+ owner: AztecAddress,
64
+ action: ContractFunctionInteraction,
65
+ caller: AztecAddress,
66
+ onExecuted?: () => void,
67
+ ): Promise<void> {
68
+ const grant = await wallet.setPublicAuthWit(owner, { caller, action }, true);
69
+ await grant.send();
70
+
71
+ await action.send({ from: caller });
72
+ onExecuted?.();
73
+
74
+ await expect(action.simulate({ from: caller })).rejects.toThrow(/unauthorized/);
75
+ }
76
+
77
+ /**
78
+ * Creates a private authwit for `owner`, executes `action` through the authwit proxy (so `msg_sender`
79
+ * differs from the note owner), then asserts a replay reverts with a duplicate-nullifier error.
80
+ *
81
+ * `onExecuted` runs after the successful execution (before the replay attempt) so callers can update
82
+ * their {@link TokenSimulator} to match the state change the executed action produced.
83
+ */
84
+ export async function assertAuthwitProxyReplayRejected(
85
+ proxy: GenericProxyContract,
86
+ wallet: TestWallet,
87
+ owner: AztecAddress,
88
+ action: ContractFunctionInteraction,
89
+ onExecuted?: () => void,
90
+ ): Promise<void> {
91
+ const witness = await wallet.createAuthWit(owner, { caller: proxy.address, action });
92
+
93
+ await sendThroughAuthwitProxy(proxy, action, { from: owner, authWitnesses: [witness] });
94
+ onExecuted?.();
95
+
96
+ await expect(sendThroughAuthwitProxy(proxy, action, { from: owner, authWitnesses: [witness] })).rejects.toThrow(
97
+ DUPLICATE_NULLIFIER_ERROR,
98
+ );
99
+ }
100
+
101
+ /**
102
+ * Deploys an {@link AMMContract} over three freshly deployed tokens (token0, token1, and the liquidity
103
+ * token), makes the AMM the liquidity token's minter, and mints `initialBalance` of token0 and token1 to
104
+ * each liquidity provider plus token0 to the swapper. `deploy` selects the token flavour (Token vs
105
+ * TestToken), so the concrete token type flows through to the caller.
106
+ */
107
+ export async function deployAmmWithTokens<T extends AnyTokenContract>(
108
+ wallet: Wallet,
109
+ admin: AztecAddress,
110
+ deploy: (wallet: Wallet, admin: AztecAddress, initialBalance: bigint, logger: Logger) => Promise<{ contract: T }>,
111
+ opts: { liquidityProviders: AztecAddress[]; swapper: AztecAddress; initialBalance: bigint; logger: Logger },
112
+ ): Promise<{ token0: T; token1: T; liquidityToken: T; amm: AMMContract }> {
113
+ const { liquidityProviders, swapper, initialBalance, logger } = opts;
114
+
115
+ const { contract: token0 } = await deploy(wallet, admin, 0n, logger);
116
+ const { contract: token1 } = await deploy(wallet, admin, 0n, logger);
117
+ const { contract: liquidityToken } = await deploy(wallet, admin, 0n, logger);
118
+
119
+ const { contract: amm } = await AMMContract.deploy(
120
+ wallet,
121
+ token0.address,
122
+ token1.address,
123
+ liquidityToken.address,
124
+ ).send({ from: admin });
125
+
126
+ // TODO(#9480): consider deploying the token by some factory when the AMM is deployed, and making the AMM be the
127
+ // minter there.
128
+ await liquidityToken.methods.set_minter(amm.address, true).send({ from: admin });
129
+
130
+ for (const lp of liquidityProviders) {
131
+ await mintTokensToPrivate(token0, admin, lp, initialBalance);
132
+ await mintTokensToPrivate(token1, admin, lp, initialBalance);
133
+ }
134
+ // Note that the swapper only holds token0, not token1.
135
+ await mintTokensToPrivate(token0, admin, swapper, initialBalance);
136
+
137
+ return { token0, token1, liquidityToken, amm };
138
+ }
@@ -5,6 +5,7 @@ import {
5
5
  type ProfileInteractionOptions,
6
6
  } from '@aztec/aztec.js/contracts';
7
7
  import type { Logger } from '@aztec/aztec.js/log';
8
+ import { MAX_APPS_PER_KERNEL } from '@aztec/constants';
8
9
  import { createLogger } from '@aztec/foundation/log';
9
10
  import { type PrivateExecutionStep, serializePrivateExecutionSteps } from '@aztec/stdlib/kernel';
10
11
  import type {
@@ -320,6 +321,26 @@ export function convertProfileToGHBenchmark(benchmark: ClientFlowBenchmark): Git
320
321
  return benches;
321
322
  }
322
323
 
324
+ /**
325
+ * Computes the expected number of `PrivateExecutionStep` entries the orchestrator will produce
326
+ * for a tx with `apps` private function calls.
327
+ *
328
+ * Step layout: `apps` app circuits + kernel iterations + 1 final reset + 1 tail + 1 hiding kernel.
329
+ * Each kernel iteration absorbs up to `MAX_APPS_PER_KERNEL` apps via the `init_K` / `inner_K`
330
+ * variants, so the kernel count is `ceil(apps / MAX_APPS_PER_KERNEL)`.
331
+ *
332
+ * Caveat: this assumes no mid-flow reset is triggered, which would split a batch into two kernels
333
+ * separated by a reset. For the flows currently exercised in this benchmark suite that holds, but
334
+ * a future flow that grows large enough to overflow per-tx limits before consuming all apps will
335
+ * not match this formula.
336
+ */
337
+ export function expectedExecutionSteps(apps: number): number {
338
+ const kernels = Math.ceil(apps / MAX_APPS_PER_KERNEL);
339
+ // The final reset and tail are proved as a single circuit (reset_tail or reset_tail_to_public),
340
+ // so they share one execution step.
341
+ return apps + kernels + 1 /* reset+tail */ + 1 /* hiding */;
342
+ }
343
+
323
344
  export async function captureProfile(
324
345
  label: string,
325
346
  interaction: ContractFunctionInteraction | DeployMethod,