@aztec/end-to-end 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928

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 (322) hide show
  1. package/README.md +229 -14
  2. package/dest/automine/automine_test_context.d.ts +85 -0
  3. package/dest/automine/automine_test_context.d.ts.map +1 -0
  4. package/dest/automine/automine_test_context.js +98 -0
  5. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
  6. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  7. package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
  8. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
  9. package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
  10. package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
  11. package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
  12. package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
  13. package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
  14. package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
  15. package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
  16. package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
  17. package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +23 -36
  18. package/dest/automine/token/token_contract_test.d.ts +40 -0
  19. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  20. package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +24 -39
  21. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  22. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  23. package/dest/automine/token/token_test_helpers.js +97 -0
  24. package/dest/bench/client_flows/benchmark.d.ts +15 -1
  25. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  26. package/dest/bench/client_flows/benchmark.js +19 -0
  27. package/dest/bench/client_flows/client_flows_benchmark.d.ts +5 -5
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +62 -54
  30. package/dest/bench/utils.d.ts +3 -3
  31. package/dest/bench/utils.d.ts.map +1 -1
  32. package/dest/bench/utils.js +97 -6
  33. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  34. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  35. package/dest/composed/ha/ha_full_setup.js +383 -0
  36. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  37. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  38. package/dest/fixtures/authwit_proxy.d.ts +1 -1
  39. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  40. package/dest/fixtures/authwit_proxy.js +4 -0
  41. package/dest/fixtures/e2e_prover_test.d.ts +15 -11
  42. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  43. package/dest/fixtures/e2e_prover_test.js +56 -40
  44. package/dest/fixtures/fixtures.d.ts +79 -1
  45. package/dest/fixtures/fixtures.d.ts.map +1 -1
  46. package/dest/fixtures/fixtures.js +80 -0
  47. package/dest/fixtures/get_bb_config.d.ts +1 -1
  48. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  49. package/dest/fixtures/get_bb_config.js +5 -5
  50. package/dest/fixtures/ha_setup.d.ts +4 -4
  51. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  52. package/dest/fixtures/ha_setup.js +5 -2
  53. package/dest/fixtures/index.d.ts +2 -1
  54. package/dest/fixtures/index.d.ts.map +1 -1
  55. package/dest/fixtures/index.js +1 -0
  56. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  57. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  58. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  59. package/dest/fixtures/setup.d.ts +86 -42
  60. package/dest/fixtures/setup.d.ts.map +1 -1
  61. package/dest/fixtures/setup.js +295 -200
  62. package/dest/fixtures/setup_p2p_test.d.ts +10 -6
  63. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  64. package/dest/fixtures/setup_p2p_test.js +11 -11
  65. package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
  66. package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
  67. package/dest/fixtures/standard_contracts_genesis.js +25 -0
  68. package/dest/fixtures/timing.d.ts +42 -0
  69. package/dest/fixtures/timing.d.ts.map +1 -0
  70. package/dest/fixtures/timing.js +72 -0
  71. package/dest/fixtures/token_utils.d.ts +22 -4
  72. package/dest/fixtures/token_utils.d.ts.map +1 -1
  73. package/dest/fixtures/token_utils.js +23 -6
  74. package/dest/fixtures/utils.d.ts +2 -2
  75. package/dest/fixtures/utils.d.ts.map +1 -1
  76. package/dest/fixtures/utils.js +1 -1
  77. package/dest/fixtures/wait_helpers.d.ts +135 -0
  78. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  79. package/dest/fixtures/wait_helpers.js +154 -0
  80. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  81. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  82. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  83. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  84. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  85. package/dest/forward-compatibility/wallet_service.js +109 -0
  86. package/dest/install_legacy_contracts.d.cts +13 -0
  87. package/dest/install_legacy_contracts.d.cts.map +1 -0
  88. package/dest/legacy-jest-resolver.d.cts +3 -0
  89. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  90. package/dest/multi-node/block-production/setup.d.ts +97 -0
  91. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  92. package/dest/multi-node/block-production/setup.js +158 -0
  93. package/dest/multi-node/governance/setup.d.ts +67 -0
  94. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  95. package/dest/multi-node/governance/setup.js +126 -0
  96. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  97. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  98. package/dest/multi-node/multi_node_test_context.js +347 -0
  99. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  100. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  101. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  102. package/dest/multi-node/slashing/setup.d.ts +167 -0
  103. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  104. package/dest/multi-node/slashing/setup.js +275 -0
  105. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +20 -11
  106. package/dest/p2p/p2p_network.d.ts.map +1 -0
  107. package/dest/{e2e_p2p → p2p}/p2p_network.js +83 -39
  108. package/dest/p2p/reqresp/utils.d.ts +19 -0
  109. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  110. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +45 -29
  111. package/dest/p2p/shared.d.ts +72 -0
  112. package/dest/p2p/shared.d.ts.map +1 -0
  113. package/dest/p2p/shared.js +212 -0
  114. package/dest/shared/cross_chain_test_harness.d.ts +6 -4
  115. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  116. package/dest/shared/cross_chain_test_harness.js +33 -21
  117. package/dest/shared/gas_portal_test_harness.d.ts +8 -5
  118. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  119. package/dest/shared/gas_portal_test_harness.js +24 -12
  120. package/dest/shared/submit-transactions.d.ts +1 -1
  121. package/dest/shared/submit-transactions.d.ts.map +1 -1
  122. package/dest/shared/submit-transactions.js +12 -5
  123. package/dest/shared/timing_env.d.js +5 -0
  124. package/dest/shared/timing_env.js +365 -0
  125. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  126. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  127. package/dest/shared/uniswap_l1_l2.js +50 -40
  128. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  129. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  130. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  131. package/dest/simulators/lending_simulator.d.ts +10 -3
  132. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  133. package/dest/simulators/lending_simulator.js +25 -13
  134. package/dest/simulators/token_simulator.js +1 -1
  135. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  136. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  137. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  138. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  139. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  140. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  141. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  142. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  143. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  144. package/dest/single-node/fees/fees_test.d.ts +95 -0
  145. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  146. package/dest/single-node/fees/fees_test.js +347 -0
  147. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  148. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  149. package/dest/single-node/l1-reorgs/setup.js +57 -0
  150. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  151. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  152. package/dest/single-node/partial-proofs/setup.js +5 -0
  153. package/dest/single-node/proving/setup.d.ts +5 -0
  154. package/dest/single-node/proving/setup.d.ts.map +1 -0
  155. package/dest/single-node/proving/setup.js +5 -0
  156. package/dest/single-node/recovery/setup.d.ts +5 -0
  157. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  158. package/dest/single-node/recovery/setup.js +5 -0
  159. package/dest/single-node/setup.d.ts +49 -0
  160. package/dest/single-node/setup.d.ts.map +1 -0
  161. package/dest/single-node/setup.js +56 -0
  162. package/dest/single-node/single_node_test_context.d.ts +374 -0
  163. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  164. package/dest/single-node/single_node_test_context.js +847 -0
  165. package/dest/spartan/setup_test_wallets.d.ts +4 -2
  166. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  167. package/dest/spartan/setup_test_wallets.js +94 -48
  168. package/dest/spartan/tx_metrics.d.ts +27 -4
  169. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  170. package/dest/spartan/tx_metrics.js +105 -20
  171. package/dest/spartan/utils/config.d.ts +9 -32
  172. package/dest/spartan/utils/config.d.ts.map +1 -1
  173. package/dest/spartan/utils/config.js +1 -0
  174. package/dest/spartan/utils/gossip_metrics.d.ts +9 -0
  175. package/dest/spartan/utils/gossip_metrics.d.ts.map +1 -0
  176. package/dest/spartan/utils/gossip_metrics.js +77 -0
  177. package/dest/spartan/utils/index.d.ts +3 -1
  178. package/dest/spartan/utils/index.d.ts.map +1 -1
  179. package/dest/spartan/utils/index.js +4 -0
  180. package/dest/spartan/utils/nodes.js +2 -2
  181. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  182. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  183. package/dest/spartan/utils/pod_logs.js +74 -0
  184. package/dest/test-wallet/test_wallet.d.ts +47 -25
  185. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  186. package/dest/test-wallet/test_wallet.js +197 -91
  187. package/dest/test-wallet/utils.d.ts +38 -3
  188. package/dest/test-wallet/utils.d.ts.map +1 -1
  189. package/dest/test-wallet/utils.js +65 -10
  190. package/dest/test-wallet/wallet_worker_script.js +12 -4
  191. package/dest/test-wallet/worker_wallet.d.ts +9 -8
  192. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  193. package/dest/test-wallet/worker_wallet.js +10 -4
  194. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
  195. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  196. package/dest/test-wallet/worker_wallet_schema.js +15 -2
  197. package/package.json +48 -44
  198. package/src/automine/README.md +60 -0
  199. package/src/automine/automine_test_context.ts +153 -0
  200. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  201. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  202. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +24 -47
  203. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +25 -48
  204. package/src/automine/token/token_test_helpers.ts +138 -0
  205. package/src/bench/client_flows/benchmark.ts +21 -0
  206. package/src/bench/client_flows/client_flows_benchmark.ts +108 -75
  207. package/src/bench/utils.ts +110 -6
  208. package/src/composed/ha/ha_full_setup.ts +466 -0
  209. package/src/fixtures/authwit_proxy.ts +4 -0
  210. package/src/fixtures/e2e_prover_test.ts +73 -63
  211. package/src/fixtures/fixtures.ts +100 -0
  212. package/src/fixtures/get_bb_config.ts +7 -6
  213. package/src/fixtures/ha_setup.ts +11 -5
  214. package/src/fixtures/index.ts +1 -0
  215. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  216. package/src/fixtures/setup.ts +372 -258
  217. package/src/fixtures/setup_p2p_test.ts +15 -11
  218. package/src/fixtures/standard_contracts_genesis.ts +28 -0
  219. package/src/fixtures/timing.ts +97 -0
  220. package/src/fixtures/token_utils.ts +40 -8
  221. package/src/fixtures/utils.ts +2 -3
  222. package/src/fixtures/wait_helpers.ts +333 -0
  223. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  224. package/src/forward-compatibility/wallet_service.ts +106 -0
  225. package/src/guides/up_quick_start.sh +5 -2
  226. package/src/infra/README.md +12 -0
  227. package/src/install_legacy_contracts.cjs +81 -0
  228. package/src/legacy-jest-resolver.cjs +98 -0
  229. package/src/multi-node/README.md +96 -0
  230. package/src/multi-node/block-production/setup.ts +272 -0
  231. package/src/multi-node/governance/setup.ts +172 -0
  232. package/src/multi-node/multi_node_test_context.ts +447 -0
  233. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  234. package/src/multi-node/slashing/setup.ts +433 -0
  235. package/src/p2p/README.md +78 -0
  236. package/src/{e2e_p2p → p2p}/p2p_network.ts +96 -51
  237. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +56 -28
  238. package/src/p2p/shared.ts +329 -0
  239. package/src/shared/cross_chain_test_harness.ts +36 -17
  240. package/src/shared/gas_portal_test_harness.ts +32 -14
  241. package/src/shared/submit-transactions.ts +13 -5
  242. package/src/shared/timing_env.d.mts +39 -0
  243. package/src/shared/timing_env.mjs +363 -0
  244. package/src/shared/uniswap_l1_l2.ts +92 -50
  245. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  246. package/src/simulators/lending_simulator.ts +29 -13
  247. package/src/simulators/token_simulator.ts +1 -1
  248. package/src/single-node/README.md +66 -0
  249. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  250. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  251. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  252. package/src/single-node/fees/fees_test.ts +437 -0
  253. package/src/single-node/l1-reorgs/setup.ts +93 -0
  254. package/src/single-node/partial-proofs/setup.ts +8 -0
  255. package/src/single-node/proving/setup.ts +15 -0
  256. package/src/single-node/recovery/setup.ts +8 -0
  257. package/src/single-node/setup.ts +63 -0
  258. package/src/single-node/single_node_test_context.ts +1058 -0
  259. package/src/spartan/setup_test_wallets.ts +124 -45
  260. package/src/spartan/tx_metrics.ts +107 -23
  261. package/src/spartan/utils/config.ts +1 -0
  262. package/src/spartan/utils/gossip_metrics.ts +108 -0
  263. package/src/spartan/utils/index.ts +6 -0
  264. package/src/spartan/utils/nodes.ts +2 -2
  265. package/src/spartan/utils/pod_logs.ts +99 -0
  266. package/src/test-wallet/test_wallet.ts +227 -107
  267. package/src/test-wallet/utils.ts +104 -11
  268. package/src/test-wallet/wallet_worker_script.ts +11 -5
  269. package/src/test-wallet/worker_wallet.ts +19 -16
  270. package/src/test-wallet/worker_wallet_schema.ts +4 -3
  271. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -55
  272. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  273. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  274. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  275. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  276. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  277. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  278. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  279. package/dest/e2e_epochs/epochs_test.d.ts +0 -102
  280. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  281. package/dest/e2e_epochs/epochs_test.js +0 -386
  282. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  283. package/dest/e2e_fees/fees_test.d.ts +0 -88
  284. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  285. package/dest/e2e_fees/fees_test.js +0 -248
  286. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  287. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  288. package/dest/e2e_l1_publisher/write_json.js +0 -56
  289. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  290. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  291. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  292. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  293. package/dest/e2e_nested_contract/nested_contract_test.js +0 -54
  294. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  295. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  296. package/dest/e2e_p2p/inactivity_slash_test.js +0 -136
  297. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  298. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  299. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  300. package/dest/e2e_p2p/shared.d.ts +0 -60
  301. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  302. package/dest/e2e_p2p/shared.js +0 -204
  303. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  304. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  305. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  306. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  307. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  308. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  309. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  310. package/src/e2e_epochs/epochs_test.ts +0 -487
  311. package/src/e2e_fees/fees_test.ts +0 -328
  312. package/src/e2e_l1_publisher/write_json.ts +0 -77
  313. package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
  314. package/src/e2e_p2p/inactivity_slash_test.ts +0 -179
  315. package/src/e2e_p2p/shared.ts +0 -333
  316. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  317. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  318. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  319. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  320. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  321. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  322. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -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,22 +59,12 @@ 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
70
  ({ contract: this.asset } = await TokenContract.deploy(
@@ -107,7 +93,7 @@ export class TokenContractTest {
107
93
 
108
94
  this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
109
95
  this.adminAddress,
110
- this.account1Address,
96
+ this.otherAddress,
111
97
  ]);
112
98
 
113
99
  expect((await this.asset.methods.get_admin().simulate({ from: this.adminAddress })).result).toBe(
@@ -115,27 +101,18 @@ export class TokenContractTest {
115
101
  );
116
102
  }
117
103
 
118
- async setup() {
119
- this.context = await setup(0, {
120
- metricsPort: this.metricsPort,
121
- fundSponsoredFPC: true,
122
- skipAccountDeployment: true,
123
- });
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}`);
124
108
 
125
109
  if (this.shouldApplyBaseSetup) {
126
110
  await this.applyBaseSetup();
127
111
  }
128
-
129
- if (this.shouldApplyMint) {
130
- await this.applyMint();
131
- }
132
- }
133
-
134
- async teardown() {
135
- await teardown(this.context);
136
112
  }
137
113
 
138
- private async applyMint() {
114
+ /** Mints an initial public and private balance to the admin account. Call after {@link setup}. */
115
+ async applyMint() {
139
116
  this.logger.info('Applying mint setup');
140
117
  const { asset, adminAddress, tokenSim } = this;
141
118
  const amount = 10000n;
@@ -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,
@@ -1,10 +1,11 @@
1
+ import { NO_FROM } from '@aztec/aztec.js/account';
1
2
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
3
  import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
3
4
  import { type FeePaymentMethod, PrivateFeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
4
5
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
5
6
  import type { AztecNode } from '@aztec/aztec.js/node';
6
7
  import type { Wallet } from '@aztec/aztec.js/wallet';
7
- import { CheatCodes } from '@aztec/aztec/testing';
8
+ import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
8
9
  import { createExtendedL1Client } from '@aztec/ethereum/client';
9
10
  import { RollupContract } from '@aztec/ethereum/contracts';
10
11
  import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
@@ -12,6 +13,7 @@ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
12
13
  import { ChainMonitor } from '@aztec/ethereum/test';
13
14
  import { randomBytes } from '@aztec/foundation/crypto/random';
14
15
  import { Fr } from '@aztec/foundation/curves/bn254';
16
+ import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
15
17
  import { EthAddress } from '@aztec/foundation/eth-address';
16
18
  import { TestERC20Abi } from '@aztec/l1-artifacts/TestERC20Abi';
17
19
  import { TestERC20Bytecode } from '@aztec/l1-artifacts/TestERC20Bytecode';
@@ -19,16 +21,21 @@ import { AMMContract } from '@aztec/noir-contracts.js/AMM';
19
21
  import { FPCContract } from '@aztec/noir-contracts.js/FPC';
20
22
  import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
21
23
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
22
- import { TokenContract as BananaCoin, TokenContract } from '@aztec/noir-contracts.js/Token';
24
+ import { TestTokenContract as BananaCoin, TestTokenContract } from '@aztec/noir-test-contracts.js/TestToken';
23
25
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
24
26
  import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
25
27
  import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
26
28
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
27
- import { GasSettings } from '@aztec/stdlib/gas';
28
- import { deriveSigningKey } from '@aztec/stdlib/keys';
29
+ import { Gas, GasSettings } from '@aztec/stdlib/gas';
30
+ import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
29
31
 
30
- import { MNEMONIC } from '../../fixtures/fixtures.js';
31
- import { type EndToEndContext, type SetupOptions, deployAccounts, setup, teardown } from '../../fixtures/setup.js';
32
+ import {
33
+ AUTOMINE_E2E_OPTS,
34
+ L1_DIRECT_WRITE_ACCOUNT_INDEX,
35
+ MNEMONIC,
36
+ getPaddedMaxFeesPerGas,
37
+ } from '../../fixtures/fixtures.js';
38
+ import { type EndToEndContext, type SetupOptions, setup, teardown } from '../../fixtures/setup.js';
32
39
  import { mintTokensToPrivate } from '../../fixtures/token_utils.js';
33
40
  import { setupSponsoredFPC } from '../../fixtures/utils.js';
34
41
  import { CrossChainTestHarness } from '../../shared/cross_chain_test_harness.js';
@@ -70,13 +77,13 @@ export class ClientFlowsBenchmark {
70
77
  public bananaFPC!: FPCContract;
71
78
  public bananaFPCInstance!: ContractInstanceWithAddress;
72
79
  // Random asset we want to trade
73
- public candyBarCoin!: TokenContract;
80
+ public candyBarCoin!: TestTokenContract;
74
81
  public candyBarCoinInstance!: ContractInstanceWithAddress;
75
82
  // AMM contract
76
83
  public amm!: AMMContract;
77
84
  public ammInstance!: ContractInstanceWithAddress;
78
85
  // Liquidity token for AMM
79
- public liquidityToken!: TokenContract;
86
+ public liquidityToken!: TestTokenContract;
80
87
  public liquidityTokenInstance!: ContractInstanceWithAddress;
81
88
  // Sponsored FPC contract
82
89
  public sponsoredFPC!: SponsoredFPCContract;
@@ -87,33 +94,35 @@ export class ClientFlowsBenchmark {
87
94
 
88
95
  public realProofs = ['true', '1'].includes(process.env.REAL_PROOFS ?? '');
89
96
 
90
- public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; circuits: number }> =
91
- {
92
- // eslint-disable-next-line camelcase
93
- bridged_fee_juice: {
94
- forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
95
- circuits: 2, // FeeJuice claim + kernel inner
96
- },
97
- // eslint-disable-next-line camelcase
98
- private_fpc: {
99
- forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
100
- circuits:
101
- 2 + // FPC entrypoint + kernel inner
102
- 2 + // BananaCoin transfer_to_public + kernel inner
103
- 2 + // Account verify_private_authwit + kernel inner
104
- 2, // BananaCoin prepare_private_balance_increase + kernel inner
105
- },
106
- // eslint-disable-next-line camelcase
107
- sponsored_fpc: {
108
- forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
109
- circuits: 2, // Sponsored FPC sponsor_unconditionally + kernel inner
110
- },
111
- // eslint-disable-next-line camelcase
112
- fee_juice: {
113
- forWallet: () => Promise.resolve(undefined),
114
- circuits: 0,
115
- },
116
- };
97
+ // `apps` is the number of private function calls contributed by this payment method.
98
+ // Each app produces one execution step at proving time; the orchestrator additionally produces
99
+ // one kernel step per batch of N apps (see `expectedExecutionSteps` in `benchmark.ts`).
100
+ public paymentMethods: Record<BenchmarkingFeePaymentMethod, { forWallet: FeePaymentMethodGetter; apps: number }> = {
101
+ // eslint-disable-next-line camelcase
102
+ bridged_fee_juice: {
103
+ forWallet: this.getBridgedFeeJuicePaymentMethodForWallet.bind(this),
104
+ apps: 1, // FeeJuice claim
105
+ },
106
+ // eslint-disable-next-line camelcase
107
+ private_fpc: {
108
+ forWallet: this.getPrivateFPCPaymentMethodForWallet.bind(this),
109
+ apps:
110
+ 1 + // FPC entrypoint
111
+ 1 + // BananaCoin transfer_to_public
112
+ 1 + // Account verify_private_authwit
113
+ 1, // BananaCoin prepare_private_balance_increase
114
+ },
115
+ // eslint-disable-next-line camelcase
116
+ sponsored_fpc: {
117
+ forWallet: this.getSponsoredFPCPaymentMethodForWallet.bind(this),
118
+ apps: 1, // Sponsored FPC sponsor_unconditionally
119
+ },
120
+ // eslint-disable-next-line camelcase
121
+ fee_juice: {
122
+ forWallet: () => Promise.resolve(undefined),
123
+ apps: 0,
124
+ },
125
+ };
117
126
 
118
127
  public config: ClientFlowsConfig;
119
128
 
@@ -122,7 +131,7 @@ export class ClientFlowsBenchmark {
122
131
 
123
132
  constructor(testName?: string, setupOptions: Partial<SetupOptions & DeployAztecL1ContractsArgs> = {}) {
124
133
  this.logger = createLogger(`bench:client_flows${testName ? `:${testName}` : ''}`);
125
- this.setupOptions = { startProverNode: true, ...setupOptions };
134
+ this.setupOptions = { ...AUTOMINE_E2E_OPTS, startProverNode: true, ...setupOptions };
126
135
  this.config = BENCHMARK_CONFIG === 'key_flows' ? KEY_FLOWS_CONFIG : FULL_FLOWS_CONFIG;
127
136
  ProxyLogger.create();
128
137
  this.proxyLogger = ProxyLogger.getInstance();
@@ -130,11 +139,14 @@ export class ClientFlowsBenchmark {
130
139
 
131
140
  async setup() {
132
141
  this.logger.info('Setting up subsystems from fresh');
133
- this.context = await setup(0, {
142
+ // Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
143
+ // BananaCoin is the codegen'd TestToken here, so the allowlist must key on its class, not canonical Token's.
144
+ const tokenAllowList = await getTokenAllowedSetupFunctions(BananaCoin.artifact);
145
+ this.context = await setup(2, {
134
146
  ...this.setupOptions,
135
147
  fundSponsoredFPC: true,
136
- skipAccountDeployment: true,
137
148
  l1ContractsArgs: this.setupOptions,
149
+ txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
138
150
  });
139
151
  await this.applyBaseSetup();
140
152
 
@@ -180,7 +192,7 @@ export class ClientFlowsBenchmark {
180
192
 
181
193
  let benchysPrivateSigningKey;
182
194
  if (type === 'schnorr') {
183
- benchysPrivateSigningKey = deriveSigningKey(benchysSecret);
195
+ benchysPrivateSigningKey = GrumpkinScalar.random();
184
196
  return wallet.createSchnorrAccount(benchysSecret, salt, benchysPrivateSigningKey);
185
197
  } else if (type === 'ecdsar1') {
186
198
  benchysPrivateSigningKey = randomBytes(32);
@@ -197,15 +209,7 @@ export class ClientFlowsBenchmark {
197
209
 
198
210
  async applyInitialAccounts() {
199
211
  this.logger.info('Applying initial accounts setup');
200
- const { deployedAccounts } = await deployAccounts(
201
- 2,
202
- this.logger,
203
- )({
204
- wallet: this.context.wallet,
205
- initialFundedAccounts: this.context.initialFundedAccounts,
206
- });
207
-
208
- const [{ address: adminAddress }, { address: sequencerAddress }] = deployedAccounts;
212
+ const [adminAddress, sequencerAddress] = this.context.accounts;
209
213
 
210
214
  this.adminWallet = this.context.wallet;
211
215
  this.aztecNode = this.context.aztecNodeService;
@@ -228,6 +232,19 @@ export class ClientFlowsBenchmark {
228
232
  loggers: {
229
233
  prover: this.proxyLogger.createLogger('pxe:bb:wasm:bundle:proxied'),
230
234
  },
235
+ // The benchmark measures steady-state app cost, not first-send discovery cost. Reproduce the pre-handshake-default
236
+ // behavior of unconstrained delivery: derive the tagging secret from the (sender, recipient) key pair via ECDH
237
+ // instead of taking the current default (a non-interactive handshake, which injects two extra private app
238
+ // executions and a nullifier per cold chain). Constrained delivery is unaffected: the Noir circuit rejects
239
+ // address-derived for constrained, so the hook falls through to a handshake there.
240
+ hooks: {
241
+ resolveTaggingSecretStrategy: ({ deliveryMode }) =>
242
+ Promise.resolve(
243
+ deliveryMode === AppTaggingSecretKind.UNCONSTRAINED
244
+ ? { type: 'address-derived' }
245
+ : { type: 'non-interactive-handshake' },
246
+ ),
247
+ },
231
248
  });
232
249
  }
233
250
 
@@ -238,7 +255,15 @@ export class ClientFlowsBenchmark {
238
255
  this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
239
256
  aztecNode: this.context.aztecNodeService,
240
257
  aztecNodeAdmin: this.context.aztecNodeService,
241
- l1Client: this.context.deployL1ContractsValues.l1Client,
258
+ // Bridge from a dedicated L1 account so its direct writes don't race the sequencer publisher's
259
+ // txs on the deployer account (see L1_DIRECT_WRITE_ACCOUNT_INDEX).
260
+ l1Client: createExtendedL1Client(
261
+ this.context.config.l1RpcUrls,
262
+ MNEMONIC,
263
+ undefined,
264
+ undefined,
265
+ L1_DIRECT_WRITE_ACCOUNT_INDEX,
266
+ ),
242
267
  wallet: this.adminWallet,
243
268
  logger: this.logger,
244
269
  });
@@ -246,11 +271,14 @@ export class ClientFlowsBenchmark {
246
271
 
247
272
  async applyDeployBananaToken() {
248
273
  this.logger.info('Applying banana token deployment');
249
- const {
250
- receipt: { contract: bananaCoin, instance: bananaCoinInstance },
251
- } = await BananaCoin.deploy(this.adminWallet, this.adminAddress, 'BC', 'BC', 18n).send({
274
+ const { contract: bananaCoin, instance: bananaCoinInstance } = await BananaCoin.deploy(
275
+ this.adminWallet,
276
+ this.adminAddress,
277
+ 'BC',
278
+ 'BC',
279
+ 18n,
280
+ ).send({
252
281
  from: this.adminAddress,
253
- wait: { returnReceipt: true },
254
282
  });
255
283
  this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
256
284
  this.bananaCoin = bananaCoin;
@@ -259,11 +287,14 @@ export class ClientFlowsBenchmark {
259
287
 
260
288
  async applyDeployCandyBarToken() {
261
289
  this.logger.info('Applying candy bar token deployment');
262
- const {
263
- receipt: { contract: candyBarCoin, instance: candyBarCoinInstance },
264
- } = await TokenContract.deploy(this.adminWallet, this.adminAddress, 'CBC', 'CBC', 18n).send({
290
+ const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TestTokenContract.deploy(
291
+ this.adminWallet,
292
+ this.adminAddress,
293
+ 'CBC',
294
+ 'CBC',
295
+ 18n,
296
+ ).send({
265
297
  from: this.adminAddress,
266
- wait: { returnReceipt: true },
267
298
  });
268
299
  this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
269
300
  this.candyBarCoin = candyBarCoin;
@@ -276,11 +307,12 @@ export class ClientFlowsBenchmark {
276
307
  expect((await this.context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
277
308
 
278
309
  const bananaCoin = this.bananaCoin;
279
- const {
280
- receipt: { contract: bananaFPC, instance: bananaFPCInstance },
281
- } = await FPCContract.deploy(this.adminWallet, bananaCoin.address, this.adminAddress).send({
310
+ const { contract: bananaFPC, instance: bananaFPCInstance } = await FPCContract.deploy(
311
+ this.adminWallet,
312
+ bananaCoin.address,
313
+ this.adminAddress,
314
+ ).send({
282
315
  from: this.adminAddress,
283
- wait: { returnReceipt: true },
284
316
  });
285
317
 
286
318
  this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
@@ -325,18 +357,17 @@ export class ClientFlowsBenchmark {
325
357
 
326
358
  public async createAndFundBenchmarkingAccountOnUserWallet(accountType: AccountType) {
327
359
  const benchysAccountManager = await this.createBenchmarkingAccountManager(this.adminWallet, accountType);
328
- const benchysAccount = await benchysAccountManager.getAccount();
329
360
  const benchysAddress = benchysAccountManager.address;
330
361
  const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
331
362
  const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
332
363
  await behchysDeployMethod.send({
333
- from: AztecAddress.ZERO,
364
+ from: NO_FROM,
334
365
  fee: { paymentMethod: new FeeJuicePaymentMethodWithClaim(benchysAddress, claim) },
335
366
  });
336
367
  // Register benchy on the user's Wallet, where we're going to be interacting from
337
368
  const accountManager = await this.userWallet.createAccount({
338
- secret: benchysAccount.getSecretKey(),
339
- salt: new Fr(benchysAccount.salt),
369
+ secret: benchysAccountManager.getSecretKey(),
370
+ salt: new Fr(benchysAccountManager.getInstance().salt),
340
371
  contract: benchysAccountManager.getAccountContract(),
341
372
  });
342
373
  return accountManager.address;
@@ -344,20 +375,21 @@ export class ClientFlowsBenchmark {
344
375
 
345
376
  public async applyDeployAmm() {
346
377
  this.logger.info('Applying AMM deployment');
347
- const {
348
- receipt: { contract: liquidityToken, instance: liquidityTokenInstance },
349
- } = await TokenContract.deploy(this.adminWallet, this.adminAddress, 'LPT', 'LPT', 18n).send({
378
+ const { contract: liquidityToken, instance: liquidityTokenInstance } = await TestTokenContract.deploy(
379
+ this.adminWallet,
380
+ this.adminAddress,
381
+ 'LPT',
382
+ 'LPT',
383
+ 18n,
384
+ ).send({
350
385
  from: this.adminAddress,
351
- wait: { returnReceipt: true },
352
386
  });
353
- const {
354
- receipt: { contract: amm, instance: ammInstance },
355
- } = await AMMContract.deploy(
387
+ const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
356
388
  this.adminWallet,
357
389
  this.bananaCoin.address,
358
390
  this.candyBarCoin.address,
359
391
  liquidityToken.address,
360
- ).send({ from: this.adminAddress, wait: { returnReceipt: true } });
392
+ ).send({ from: this.adminAddress });
361
393
  this.logger.info(`AMM deployed at ${amm.address}`);
362
394
  await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
363
395
  this.liquidityToken = liquidityToken;
@@ -374,8 +406,9 @@ export class ClientFlowsBenchmark {
374
406
  public async getPrivateFPCPaymentMethodForWallet(wallet: Wallet, sender: AztecAddress) {
375
407
  // The private fee paying method assembled on the app side requires knowledge of the maximum
376
408
  // fee the user is willing to pay
377
- const maxFeesPerGas = (await this.aztecNode.getCurrentMinFees()).mul(1.5);
378
- const gasSettings = GasSettings.default({ maxFeesPerGas });
409
+ const maxFeesPerGas = await getPaddedMaxFeesPerGas(this.aztecNode);
410
+ const gasLimits = Gas.from((await this.aztecNode.getNodeInfo()).txsLimits.gas);
411
+ const gasSettings = GasSettings.fallback({ gasLimits, maxFeesPerGas });
379
412
  return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
380
413
  }
381
414