@aztec/end-to-end 0.0.1-commit.24de95ac → 0.0.1-commit.2606882

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 (299) hide show
  1. package/README.md +27 -0
  2. package/dest/bench/client_flows/benchmark.d.ts +17 -2
  3. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  4. package/dest/bench/client_flows/benchmark.js +38 -1
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts +23 -17
  6. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  7. package/dest/bench/client_flows/client_flows_benchmark.js +143 -136
  8. package/dest/bench/client_flows/config.d.ts +2 -2
  9. package/dest/bench/client_flows/config.d.ts.map +1 -1
  10. package/dest/bench/client_flows/config.js +18 -0
  11. package/dest/bench/client_flows/data_extractor.d.ts +1 -1
  12. package/dest/bench/client_flows/data_extractor.js +7 -27
  13. package/dest/bench/utils.d.ts +8 -7
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +33 -19
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +12 -10
  17. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  18. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +120 -117
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +33 -16
  20. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  21. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +124 -70
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +7 -6
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +20 -14
  25. package/dest/e2e_epochs/epochs_test.d.ts +49 -16
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +188 -64
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
  29. package/dest/e2e_fees/bridging_race.notest.js +5 -7
  30. package/dest/e2e_fees/fees_test.d.ts +25 -18
  31. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  32. package/dest/e2e_fees/fees_test.js +162 -141
  33. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  34. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  35. package/dest/e2e_l1_publisher/write_json.js +18 -19
  36. package/dest/e2e_multi_validator/utils.d.ts +1 -1
  37. package/dest/e2e_multi_validator/utils.js +1 -1
  38. package/dest/e2e_nested_contract/nested_contract_test.d.ts +7 -10
  39. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  40. package/dest/e2e_nested_contract/nested_contract_test.js +32 -40
  41. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  42. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  43. package/dest/e2e_p2p/inactivity_slash_test.js +11 -9
  44. package/dest/e2e_p2p/p2p_network.d.ts +237 -28
  45. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  46. package/dest/e2e_p2p/p2p_network.js +176 -129
  47. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  48. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  49. package/dest/e2e_p2p/reqresp/utils.js +206 -0
  50. package/dest/e2e_p2p/shared.d.ts +44 -15
  51. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  52. package/dest/e2e_p2p/shared.js +102 -68
  53. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  54. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  55. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  56. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  57. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  58. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  59. package/dest/e2e_token_contract/token_contract_test.d.ts +20 -11
  60. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  61. package/dest/e2e_token_contract/token_contract_test.js +103 -93
  62. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  63. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  64. package/dest/fixtures/authwit_proxy.js +34 -0
  65. package/dest/fixtures/e2e_prover_test.d.ts +19 -24
  66. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  67. package/dest/fixtures/e2e_prover_test.js +126 -145
  68. package/dest/fixtures/elu_monitor.d.ts +21 -0
  69. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  70. package/dest/fixtures/elu_monitor.js +102 -0
  71. package/dest/fixtures/fixtures.d.ts +75 -3
  72. package/dest/fixtures/fixtures.d.ts.map +1 -1
  73. package/dest/fixtures/fixtures.js +73 -3
  74. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  75. package/dest/fixtures/get_acvm_config.js +1 -1
  76. package/dest/fixtures/get_bb_config.d.ts +1 -1
  77. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  78. package/dest/fixtures/get_bb_config.js +5 -5
  79. package/dest/fixtures/ha_setup.d.ts +71 -0
  80. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  81. package/dest/fixtures/ha_setup.js +116 -0
  82. package/dest/fixtures/index.d.ts +2 -1
  83. package/dest/fixtures/index.d.ts.map +1 -1
  84. package/dest/fixtures/index.js +1 -0
  85. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  86. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  87. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  88. package/dest/fixtures/logging.d.ts +1 -1
  89. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  90. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  91. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  92. package/dest/fixtures/setup.d.ts +272 -0
  93. package/dest/fixtures/setup.d.ts.map +1 -0
  94. package/dest/fixtures/setup.js +735 -0
  95. package/dest/fixtures/setup_p2p_test.d.ts +22 -11
  96. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  97. package/dest/fixtures/setup_p2p_test.js +57 -38
  98. package/dest/fixtures/token_utils.d.ts +6 -3
  99. package/dest/fixtures/token_utils.d.ts.map +1 -1
  100. package/dest/fixtures/token_utils.js +13 -9
  101. package/dest/fixtures/utils.d.ts +5 -192
  102. package/dest/fixtures/utils.d.ts.map +1 -1
  103. package/dest/fixtures/utils.js +4 -648
  104. package/dest/fixtures/web3signer.d.ts +1 -1
  105. package/dest/fixtures/web3signer.js +1 -1
  106. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  107. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  108. package/dest/fixtures/with_telemetry_utils.js +2 -2
  109. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  110. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  111. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  112. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  113. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  114. package/dest/forward-compatibility/wallet_service.js +109 -0
  115. package/dest/index.d.ts +1 -1
  116. package/dest/install_legacy_contracts.d.cts +10 -0
  117. package/dest/install_legacy_contracts.d.cts.map +1 -0
  118. package/dest/legacy-jest-resolver.d.cts +3 -0
  119. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  120. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  121. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  122. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  123. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  124. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  125. package/dest/quality_of_service/prometheus_client.js +67 -0
  126. package/dest/shared/cross_chain_test_harness.d.ts +9 -6
  127. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  128. package/dest/shared/cross_chain_test_harness.js +34 -30
  129. package/dest/shared/gas_portal_test_harness.d.ts +9 -6
  130. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  131. package/dest/shared/gas_portal_test_harness.js +21 -12
  132. package/dest/shared/index.d.ts +3 -2
  133. package/dest/shared/index.d.ts.map +1 -1
  134. package/dest/shared/index.js +1 -0
  135. package/dest/shared/jest_setup.d.ts +1 -1
  136. package/dest/shared/jest_setup.js +41 -1
  137. package/dest/shared/mock_state_view.d.ts +86 -0
  138. package/dest/shared/mock_state_view.d.ts.map +1 -0
  139. package/dest/shared/mock_state_view.js +186 -0
  140. package/dest/shared/submit-transactions.d.ts +4 -4
  141. package/dest/shared/submit-transactions.d.ts.map +1 -1
  142. package/dest/shared/submit-transactions.js +9 -11
  143. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  144. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  145. package/dest/shared/uniswap_l1_l2.js +87 -50
  146. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  147. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  148. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  149. package/dest/simulators/index.d.ts +1 -1
  150. package/dest/simulators/lending_simulator.d.ts +11 -4
  151. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  152. package/dest/simulators/lending_simulator.js +32 -18
  153. package/dest/simulators/token_simulator.d.ts +1 -1
  154. package/dest/simulators/token_simulator.d.ts.map +1 -1
  155. package/dest/simulators/token_simulator.js +3 -24
  156. package/dest/spartan/setup_test_wallets.d.ts +18 -6
  157. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  158. package/dest/spartan/setup_test_wallets.js +159 -30
  159. package/dest/spartan/tx_metrics.d.ts +102 -0
  160. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  161. package/dest/spartan/tx_metrics.js +475 -0
  162. package/dest/spartan/utils/bot.d.ts +28 -0
  163. package/dest/spartan/utils/bot.d.ts.map +1 -0
  164. package/dest/spartan/utils/bot.js +142 -0
  165. package/dest/spartan/utils/chaos.d.ts +79 -0
  166. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  167. package/dest/spartan/utils/chaos.js +142 -0
  168. package/dest/spartan/utils/clients.d.ts +39 -0
  169. package/dest/spartan/utils/clients.d.ts.map +1 -0
  170. package/dest/spartan/utils/clients.js +90 -0
  171. package/dest/spartan/utils/config.d.ts +19 -0
  172. package/dest/spartan/utils/config.d.ts.map +1 -0
  173. package/dest/spartan/utils/config.js +23 -0
  174. package/dest/spartan/utils/health.d.ts +63 -0
  175. package/dest/spartan/utils/health.d.ts.map +1 -0
  176. package/dest/spartan/utils/health.js +202 -0
  177. package/dest/spartan/utils/helm.d.ts +15 -0
  178. package/dest/spartan/utils/helm.d.ts.map +1 -0
  179. package/dest/spartan/utils/helm.js +47 -0
  180. package/dest/spartan/utils/index.d.ts +11 -0
  181. package/dest/spartan/utils/index.d.ts.map +1 -0
  182. package/dest/spartan/utils/index.js +22 -0
  183. package/dest/spartan/utils/k8s.d.ts +128 -0
  184. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  185. package/dest/spartan/utils/k8s.js +381 -0
  186. package/dest/spartan/utils/nodes.d.ts +40 -0
  187. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  188. package/dest/spartan/utils/nodes.js +461 -0
  189. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  190. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  191. package/dest/spartan/utils/pod_logs.js +74 -0
  192. package/dest/spartan/utils/scripts.d.ts +30 -0
  193. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  194. package/dest/spartan/utils/scripts.js +81 -0
  195. package/dest/spartan/utils.d.ts +2 -218
  196. package/dest/spartan/utils.d.ts.map +1 -1
  197. package/dest/spartan/utils.js +1 -749
  198. package/dest/test-wallet/test_wallet.d.ts +85 -0
  199. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  200. package/dest/test-wallet/test_wallet.js +273 -0
  201. package/dest/test-wallet/utils.d.ts +41 -0
  202. package/dest/test-wallet/utils.d.ts.map +1 -0
  203. package/dest/test-wallet/utils.js +66 -0
  204. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  205. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  206. package/dest/test-wallet/wallet_worker_script.js +53 -0
  207. package/dest/test-wallet/worker_wallet.d.ts +53 -0
  208. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  209. package/dest/test-wallet/worker_wallet.js +155 -0
  210. package/dest/test-wallet/worker_wallet_schema.d.ts +160 -0
  211. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  212. package/dest/test-wallet/worker_wallet_schema.js +22 -0
  213. package/package.json +56 -46
  214. package/src/bench/client_flows/benchmark.ts +43 -2
  215. package/src/bench/client_flows/client_flows_benchmark.ts +203 -206
  216. package/src/bench/client_flows/config.ts +9 -1
  217. package/src/bench/client_flows/data_extractor.ts +6 -28
  218. package/src/bench/utils.ts +38 -22
  219. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +141 -152
  220. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +180 -127
  221. package/src/e2e_deploy_contract/deploy_test.ts +25 -17
  222. package/src/e2e_epochs/epochs_test.ts +254 -116
  223. package/src/e2e_fees/bridging_race.notest.ts +6 -12
  224. package/src/e2e_fees/fees_test.ts +215 -229
  225. package/src/e2e_l1_publisher/write_json.ts +20 -19
  226. package/src/e2e_multi_validator/utils.ts +1 -1
  227. package/src/e2e_nested_contract/nested_contract_test.ts +38 -56
  228. package/src/e2e_p2p/inactivity_slash_test.ts +12 -10
  229. package/src/e2e_p2p/p2p_network.ts +246 -201
  230. package/src/e2e_p2p/reqresp/utils.ts +274 -0
  231. package/src/e2e_p2p/shared.ts +132 -82
  232. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  233. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  234. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  235. package/src/e2e_token_contract/token_contract_test.ts +129 -117
  236. package/src/fixtures/authwit_proxy.ts +54 -0
  237. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  238. package/src/fixtures/e2e_prover_test.ts +154 -199
  239. package/src/fixtures/elu_monitor.ts +126 -0
  240. package/src/fixtures/fixtures.ts +95 -5
  241. package/src/fixtures/get_acvm_config.ts +1 -1
  242. package/src/fixtures/get_bb_config.ts +7 -6
  243. package/src/fixtures/ha_setup.ts +188 -0
  244. package/src/fixtures/index.ts +1 -0
  245. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  246. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  247. package/src/fixtures/setup.ts +1056 -0
  248. package/src/fixtures/setup_p2p_test.ts +70 -56
  249. package/src/fixtures/token_utils.ts +9 -8
  250. package/src/fixtures/utils.ts +29 -947
  251. package/src/fixtures/web3signer.ts +1 -1
  252. package/src/fixtures/with_telemetry_utils.ts +2 -2
  253. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  254. package/src/forward-compatibility/wallet_service.ts +104 -0
  255. package/src/guides/up_quick_start.sh +4 -6
  256. package/src/install_legacy_contracts.cjs +75 -0
  257. package/src/legacy-jest-resolver.cjs +112 -0
  258. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  259. package/src/quality_of_service/prometheus_client.ts +113 -0
  260. package/src/shared/cross_chain_test_harness.ts +37 -40
  261. package/src/shared/gas_portal_test_harness.ts +24 -14
  262. package/src/shared/index.ts +2 -1
  263. package/src/shared/jest_setup.ts +51 -1
  264. package/src/shared/mock_state_view.ts +188 -0
  265. package/src/shared/submit-transactions.ts +11 -16
  266. package/src/shared/uniswap_l1_l2.ts +142 -114
  267. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  268. package/src/simulators/lending_simulator.ts +39 -19
  269. package/src/simulators/token_simulator.ts +6 -30
  270. package/src/spartan/DEVELOP.md +7 -0
  271. package/src/spartan/setup_test_wallets.ts +234 -32
  272. package/src/spartan/tx_metrics.ts +434 -0
  273. package/src/spartan/utils/bot.ts +188 -0
  274. package/src/spartan/utils/chaos.ts +253 -0
  275. package/src/spartan/utils/clients.ts +100 -0
  276. package/src/spartan/utils/config.ts +29 -0
  277. package/src/spartan/utils/health.ts +255 -0
  278. package/src/spartan/utils/helm.ts +84 -0
  279. package/src/spartan/utils/index.ts +71 -0
  280. package/src/spartan/utils/k8s.ts +535 -0
  281. package/src/spartan/utils/nodes.ts +543 -0
  282. package/src/spartan/utils/pod_logs.ts +99 -0
  283. package/src/spartan/utils/scripts.ts +99 -0
  284. package/src/spartan/utils.ts +1 -942
  285. package/src/test-wallet/test_wallet.ts +376 -0
  286. package/src/test-wallet/utils.ts +108 -0
  287. package/src/test-wallet/wallet_worker_script.ts +63 -0
  288. package/src/test-wallet/worker_wallet.ts +218 -0
  289. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  290. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  291. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  292. package/dest/fixtures/setup_l1_contracts.js +0 -17
  293. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  294. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  295. package/dest/fixtures/snapshot_manager.js +0 -505
  296. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  297. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  298. package/src/fixtures/setup_l1_contracts.ts +0 -26
  299. package/src/fixtures/snapshot_manager.ts +0 -665
@@ -13,9 +13,11 @@ import type { AztecNode } from '@aztec/aztec.js/node';
13
13
  import type { SiblingPath } from '@aztec/aztec.js/trees';
14
14
  import type { TxReceipt } from '@aztec/aztec.js/tx';
15
15
  import type { Wallet } from '@aztec/aztec.js/wallet';
16
- import { type ExtendedViemWalletClient, type L1ContractAddresses, deployL1Contract } from '@aztec/ethereum';
17
- import { retryUntil } from '@aztec/foundation/retry';
18
- import type { FieldsOf } from '@aztec/foundation/types';
16
+ import { OutboxContract } from '@aztec/ethereum/contracts';
17
+ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
18
+ import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
19
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
20
+ import { EpochNumber } from '@aztec/foundation/branded-types';
19
21
  import { TestERC20Abi, TokenPortalAbi, TokenPortalBytecode } from '@aztec/l1-artifacts';
20
22
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
21
23
  import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
@@ -23,6 +25,7 @@ import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
23
25
  import { type Hex, getContract } from 'viem';
24
26
 
25
27
  import { mintTokensToPrivate } from '../fixtures/token_utils.js';
28
+ import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
26
29
 
27
30
  /**
28
31
  * Deploy L1 token and portal, initialize portal, deploy a non native l2 token contract, its L2 bridge contract and attach is to the portal.
@@ -71,26 +74,26 @@ export async function deployAndInitializeTokenAndBridgeContracts(
71
74
  });
72
75
 
73
76
  // deploy l2 token
74
- const token = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18)
75
- .send({ from: owner })
76
- .deployed();
77
+ const { contract: token } = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18).send({
78
+ from: owner,
79
+ });
77
80
 
78
81
  // deploy l2 token bridge and attach to the portal
79
- const bridge = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress)
80
- .send({ from: owner })
81
- .deployed();
82
+ const { contract: bridge } = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress).send({
83
+ from: owner,
84
+ });
82
85
 
83
- if ((await token.methods.get_admin().simulate({ from: owner })) !== owner.toBigInt()) {
86
+ if ((await token.methods.get_admin().simulate({ from: owner })).result !== owner.toBigInt()) {
84
87
  throw new Error(`Token admin is not ${owner}`);
85
88
  }
86
89
 
87
- if (!(await bridge.methods.get_config().simulate({ from: owner })).token.equals(token.address)) {
90
+ if (!(await bridge.methods.get_config().simulate({ from: owner })).result.token.equals(token.address)) {
88
91
  throw new Error(`Bridge token is not ${token.address}`);
89
92
  }
90
93
 
91
94
  // make the bridge a minter on the token:
92
- await token.methods.set_minter(bridge.address, true).send({ from: owner }).wait();
93
- if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })) === 1n) {
95
+ await token.methods.set_minter(bridge.address, true).send({ from: owner });
96
+ if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })).result === 1n) {
94
97
  throw new Error(`Bridge is not a minter`);
95
98
  }
96
99
 
@@ -164,6 +167,7 @@ export class CrossChainTestHarness {
164
167
 
165
168
  private readonly l1TokenManager: L1TokenManager;
166
169
  private readonly l1TokenPortalManager: L1TokenPortalManager;
170
+ public readonly outboxContract: OutboxContract;
167
171
 
168
172
  constructor(
169
173
  /** Aztec node instance. */
@@ -204,6 +208,7 @@ export class CrossChainTestHarness {
204
208
  this.logger,
205
209
  );
206
210
  this.l1TokenManager = this.l1TokenPortalManager.getTokenManager();
211
+ this.outboxContract = new OutboxContract(this.l1Client, this.l1ContractAddresses.outboxAddress);
207
212
  }
208
213
 
209
214
  async mintTokensOnL1(amount: bigint) {
@@ -232,7 +237,7 @@ export class CrossChainTestHarness {
232
237
 
233
238
  async mintTokensPublicOnL2(amount: bigint) {
234
239
  this.logger.info('Minting tokens on L2 publicly');
235
- await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress }).wait();
240
+ await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress });
236
241
  }
237
242
 
238
243
  async mintTokensPrivateOnL2(amount: bigint) {
@@ -243,8 +248,7 @@ export class CrossChainTestHarness {
243
248
  // send a transfer tx to force through rollup with the message included
244
249
  await this.l2Token.methods
245
250
  .transfer_in_public(this.ownerAddress, receiverAddress, transferAmount, 0)
246
- .send({ from: this.ownerAddress })
247
- .wait();
251
+ .send({ from: this.ownerAddress });
248
252
  }
249
253
 
250
254
  async consumeMessageOnAztecAndMintPrivately(
@@ -254,8 +258,7 @@ export class CrossChainTestHarness {
254
258
  const { recipient, claimAmount, claimSecret: secretForL2MessageConsumption, messageLeafIndex } = claim;
255
259
  await this.l2Bridge.methods
256
260
  .claim_private(recipient, claimAmount, secretForL2MessageConsumption, messageLeafIndex)
257
- .send({ from: this.ownerAddress })
258
- .wait();
261
+ .send({ from: this.ownerAddress });
259
262
  }
260
263
 
261
264
  async consumeMessageOnAztecAndMintPublicly(
@@ -265,34 +268,31 @@ export class CrossChainTestHarness {
265
268
  const { claimAmount, claimSecret, messageLeafIndex } = claim;
266
269
  await this.l2Bridge.methods
267
270
  .claim_public(this.ownerAddress, claimAmount, claimSecret, messageLeafIndex)
268
- .send({ from: this.ownerAddress })
269
- .wait();
271
+ .send({ from: this.ownerAddress });
270
272
  }
271
273
 
272
274
  async withdrawPrivateFromAztecToL1(
273
275
  withdrawAmount: bigint,
274
276
  authwitNonce: Fr = Fr.ZERO,
275
277
  authWitness: AuthWitness,
276
- ): Promise<FieldsOf<TxReceipt>> {
277
- const withdrawReceipt = await this.l2Bridge.methods
278
+ ): Promise<TxReceipt> {
279
+ const { receipt: withdrawReceipt } = await this.l2Bridge.methods
278
280
  .exit_to_l1_private(this.l2Token.address, this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
279
- .send({ authWitnesses: [authWitness], from: this.ownerAddress })
280
- .wait();
281
+ .send({ authWitnesses: [authWitness], from: this.ownerAddress });
281
282
 
282
283
  return withdrawReceipt;
283
284
  }
284
285
 
285
- async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<FieldsOf<TxReceipt>> {
286
- const withdrawReceipt = await this.l2Bridge.methods
286
+ async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<TxReceipt> {
287
+ const { receipt: withdrawReceipt } = await this.l2Bridge.methods
287
288
  .exit_to_l1_public(this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
288
- .send({ from: this.ownerAddress })
289
- .wait();
289
+ .send({ from: this.ownerAddress });
290
290
 
291
291
  return withdrawReceipt;
292
292
  }
293
293
 
294
294
  async getL2PrivateBalanceOf(owner: AztecAddress) {
295
- return await this.l2Token.methods.balance_of_private(owner).simulate({ from: owner });
295
+ return (await this.l2Token.methods.balance_of_private(owner).simulate({ from: owner })).result;
296
296
  }
297
297
 
298
298
  async expectPrivateBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
@@ -302,7 +302,7 @@ export class CrossChainTestHarness {
302
302
  }
303
303
 
304
304
  async getL2PublicBalanceOf(owner: AztecAddress) {
305
- return await this.l2Token.methods.balance_of_public(owner).simulate({ from: this.ownerAddress });
305
+ return (await this.l2Token.methods.balance_of_public(owner).simulate({ from: this.ownerAddress })).result;
306
306
  }
307
307
 
308
308
  async expectPublicBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
@@ -321,14 +321,16 @@ export class CrossChainTestHarness {
321
321
 
322
322
  withdrawFundsFromBridgeOnL1(
323
323
  amount: bigint,
324
- blockNumber: number | bigint,
324
+ epochNumber: EpochNumber,
325
+ numCheckpointsInEpoch: number,
325
326
  messageIndex: bigint,
326
327
  siblingPath: SiblingPath<number>,
327
328
  ) {
328
329
  return this.l1TokenPortalManager.withdrawFunds(
329
330
  amount,
330
331
  this.ethAccount,
331
- BigInt(blockNumber),
332
+ epochNumber,
333
+ numCheckpointsInEpoch,
332
334
  messageIndex,
333
335
  siblingPath,
334
336
  );
@@ -336,18 +338,14 @@ export class CrossChainTestHarness {
336
338
 
337
339
  async transferToPrivateOnL2(shieldAmount: bigint) {
338
340
  this.logger.info('Transferring to private on L2');
339
- await this.l2Token.methods
340
- .transfer_to_private(this.ownerAddress, shieldAmount)
341
- .send({ from: this.ownerAddress })
342
- .wait();
341
+ await this.l2Token.methods.transfer_to_private(this.ownerAddress, shieldAmount).send({ from: this.ownerAddress });
343
342
  }
344
343
 
345
344
  async transferToPublicOnL2(amount: bigint, authwitNonce = Fr.ZERO) {
346
345
  this.logger.info('Transferring tokens to public');
347
346
  await this.l2Token.methods
348
347
  .transfer_to_public(this.ownerAddress, this.ownerAddress, amount, authwitNonce)
349
- .send({ from: this.ownerAddress })
350
- .wait();
348
+ .send({ from: this.ownerAddress });
351
349
  }
352
350
 
353
351
  /**
@@ -359,8 +357,7 @@ export class CrossChainTestHarness {
359
357
  */
360
358
  async makeMessageConsumable(msgHash: Fr | Hex) {
361
359
  const frMsgHash = typeof msgHash === 'string' ? Fr.fromHexString(msgHash) : msgHash;
362
- // We poll isL1ToL2MessageSynced endpoint until the message is available
363
- await retryUntil(async () => await this.aztecNode.isL1ToL2MessageSynced(frMsgHash), 'message sync', 10);
360
+ await waitForL1ToL2MessageSeen(this.aztecNode, frMsgHash, { timeoutSeconds: 10 });
364
361
 
365
362
  await this.mintTokensPublicOnL2(0n);
366
363
  await this.mintTokensPublicOnL2(0n);
@@ -4,11 +4,16 @@ import { Fr } from '@aztec/aztec.js/fields';
4
4
  import type { Logger } from '@aztec/aztec.js/log';
5
5
  import type { AztecNode } from '@aztec/aztec.js/node';
6
6
  import type { Wallet } from '@aztec/aztec.js/wallet';
7
- import type { ExtendedViemWalletClient } from '@aztec/ethereum';
7
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
8
8
  import { retryUntil } from '@aztec/foundation/retry';
9
9
  import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice';
10
10
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
11
- import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
11
+ import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
12
+
13
+ import { waitForL1ToL2MessageSeen } from './wait_for_l1_to_l2_message.js';
14
+
15
+ /** Aztec node that may expose the debug mining API in local e2e setups. */
16
+ type MiningAztecNode = AztecNode & Partial<AztecNodeDebug>;
12
17
 
13
18
  export interface IGasBridgingTestHarness {
14
19
  getL1FeeJuiceBalance(address: EthAddress): Promise<bigint>;
@@ -19,7 +24,7 @@ export interface IGasBridgingTestHarness {
19
24
  }
20
25
 
21
26
  export interface FeeJuicePortalTestingHarnessFactoryConfig {
22
- aztecNode: AztecNode;
27
+ aztecNode: MiningAztecNode;
23
28
  aztecNodeAdmin?: AztecNodeAdmin;
24
29
  l1Client: ExtendedViemWalletClient;
25
30
  wallet: Wallet;
@@ -43,7 +48,7 @@ export class FeeJuicePortalTestingHarnessFactory {
43
48
  throw new Error('Fee Juice portal not deployed on L1');
44
49
  }
45
50
 
46
- const gasL2 = await FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, wallet);
51
+ const gasL2 = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, wallet);
47
52
 
48
53
  return new GasBridgingTestHarness(
49
54
  aztecNode,
@@ -75,7 +80,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
75
80
 
76
81
  constructor(
77
82
  /** Aztec node */
78
- public aztecNode: AztecNode,
83
+ public aztecNode: MiningAztecNode,
79
84
  /** Aztec node admin interface */
80
85
  public aztecNodeAdmin: AztecNodeAdmin | undefined,
81
86
  /** Wallet. */
@@ -127,11 +132,11 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
127
132
  async consumeMessageOnAztecAndClaimPrivately(owner: AztecAddress, claimer: AztecAddress, claim: L2AmountClaim) {
128
133
  this.logger.info('Consuming messages on L2 Privately');
129
134
  const { claimAmount, claimSecret, messageLeafIndex } = claim;
130
- await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer }).wait();
135
+ await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer });
131
136
  }
132
137
 
133
138
  async getL2PublicBalanceOf(owner: AztecAddress) {
134
- return await this.feeJuice.methods.balance_of_public(owner).simulate({ from: owner });
139
+ return (await this.feeJuice.methods.balance_of_public(owner).simulate({ from: owner })).result;
135
140
  }
136
141
 
137
142
  async expectPublicBalanceOnL2(owner: AztecAddress, expectedBalance: bigint) {
@@ -144,8 +149,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
144
149
  await this.mintTokensOnL1();
145
150
  const claim = await this.sendTokensToPortalPublic(bridgeAmount, owner);
146
151
 
147
- const isSynced = async () => await this.aztecNode.isL1ToL2MessageSynced(Fr.fromHexString(claim.messageHash));
148
- await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 1);
152
+ await waitForL1ToL2MessageSeen(this.aztecNode, Fr.fromHexString(claim.messageHash), { timeoutSeconds: 24 });
149
153
 
150
154
  // Progress by 2 L2 blocks so that the l1ToL2Message added above will be available to use on L2.
151
155
  await this.advanceL2Block();
@@ -163,6 +167,11 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
163
167
  }
164
168
 
165
169
  private async advanceL2Block() {
170
+ if (this.aztecNode.mineBlock) {
171
+ await this.aztecNode.mineBlock();
172
+ return;
173
+ }
174
+
166
175
  const initialBlockNumber = await this.aztecNode.getBlockNumber();
167
176
 
168
177
  let minTxsPerBlock = undefined;
@@ -171,11 +180,12 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
171
180
  await this.aztecNodeAdmin.setConfig({ minTxsPerBlock: 0 }); // Set to 0 to ensure we can advance the block
172
181
  }
173
182
 
174
- await retryUntil(async () => (await this.aztecNode.getBlockNumber()) >= initialBlockNumber + 1);
175
-
176
- if (this.aztecNodeAdmin && minTxsPerBlock !== undefined) {
177
- await this.aztecNodeAdmin.setConfig({ minTxsPerBlock });
183
+ try {
184
+ await retryUntil(async () => (await this.aztecNode.getBlockNumber()) >= initialBlockNumber + 1);
185
+ } finally {
186
+ if (this.aztecNodeAdmin && minTxsPerBlock !== undefined) {
187
+ await this.aztecNodeAdmin.setConfig({ minTxsPerBlock });
188
+ }
178
189
  }
179
190
  }
180
191
  }
181
- // docs:end:cross_chain_test_harness
@@ -1 +1,2 @@
1
- export { uniswapL1L2TestSuite, type UniswapSetupContext } from './uniswap_l1_l2.js';
1
+ export { uniswapL1L2TestSuite } from './uniswap_l1_l2.js';
2
+ export { MockStateView, diffInBps } from './mock_state_view.js';
@@ -1,8 +1,19 @@
1
1
  import { createLogger } from '@aztec/aztec.js/log';
2
2
 
3
- import { beforeEach, expect } from '@jest/globals';
3
+ import { afterAll, afterEach, beforeEach, expect } from '@jest/globals';
4
+ import { readlinkSync } from 'fs';
4
5
  import { basename } from 'path';
5
6
 
7
+ import { EluMonitor } from '../fixtures/elu_monitor.js';
8
+
9
+ const eluMonitor = process.env.ELU_MONITOR_FILE
10
+ ? new EluMonitor(process.env.ELU_MONITOR_FILE, Number(process.env.ELU_MONITOR_INTERVAL_MS) || undefined)
11
+ : undefined;
12
+
13
+ if (eluMonitor) {
14
+ process.on('exit', () => eluMonitor.stop());
15
+ }
16
+
6
17
  beforeEach(() => {
7
18
  const { testPath, currentTestName } = expect.getState();
8
19
  if (!testPath || !currentTestName) {
@@ -10,4 +21,43 @@ beforeEach(() => {
10
21
  }
11
22
  const logger = createLogger(`e2e:${basename(testPath).replace('.test.ts', '')}`);
12
23
  logger.info(`Running test: ${currentTestName}`);
24
+ eluMonitor?.startTest(currentTestName);
25
+ });
26
+
27
+ afterEach(() => {
28
+ eluMonitor?.stopTest();
29
+ });
30
+
31
+ // Log leaked handles after all tests complete. This runs after test-level afterAll hooks,
32
+ // so any handles still alive at this point were not properly cleaned up during teardown.
33
+ // This diagnostic helps identify the source of exit hangs without masking them.
34
+ afterAll(() => {
35
+ const handles = (process as any)._getActiveHandles();
36
+ if (handles.length > 0) {
37
+ const details = handles.map((h: any) => {
38
+ const type = h?.constructor?.name ?? typeof h;
39
+ const fd = h?.fd ?? h?._handle?.fd ?? '?';
40
+ const destroyed = h?.destroyed ?? '?';
41
+ const hasRef = typeof h?.hasRef === 'function' ? h.hasRef() : '?';
42
+ const localAddr = h?.localAddress ?? '';
43
+ const remoteAddr = h?.remoteAddress ?? '';
44
+ const localPort = h?.localPort ?? '';
45
+ const remotePort = h?.remotePort ?? '';
46
+ const proto = Object.getPrototypeOf(h)?.constructor?.name ?? '?';
47
+ const keys = Object.keys(h).slice(0, 10).join(',');
48
+ let fdTarget = '';
49
+ if (typeof fd === 'number') {
50
+ try {
51
+ fdTarget = ` -> ${readlinkSync(`/proc/self/fd/${fd}`)}`;
52
+ } catch {
53
+ // ignore
54
+ }
55
+ }
56
+ return ` ${type}(fd=${fd}, destroyed=${destroyed}, hasRef=${hasRef}${fdTarget}) proto=${proto} addr=${localAddr}:${localPort}->${remoteAddr}:${remotePort} keys=[${keys}]`;
57
+ });
58
+ process.stderr.write(
59
+ `\n[jest_setup] WARNING: ${handles.length} handle(s) still active after teardown:\n${details.join('\n')}\n` +
60
+ `These may prevent Jest from exiting. Investigate and fix the leak.\n\n`,
61
+ );
62
+ }
13
63
  });
@@ -0,0 +1,188 @@
1
+ import { EthAddress } from '@aztec/aztec.js/addresses';
2
+ import { type Logger, createLogger } from '@aztec/aztec.js/log';
3
+ import type { EthCheatCodes } from '@aztec/aztec/testing';
4
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
5
+
6
+ import { getContract } from 'viem';
7
+
8
+ /**
9
+ * Mock StateView contract for testing the Uniswap price oracle.
10
+ *
11
+ * Wraps a compiled Solidity contract that mimics the Uniswap V4 StateView's getSlot0 function.
12
+ * The mock allows setting return values dynamically for testing different price scenarios.
13
+ *
14
+ * Solidity source:
15
+ * ```solidity
16
+ * // SPDX-License-Identifier: Apache-2.0
17
+ * pragma solidity >=0.8.27;
18
+ *
19
+ * contract MockStateView {
20
+ * uint160 public sqrtPriceX96;
21
+ * int24 public tick;
22
+ * uint24 public protocolFee;
23
+ * uint24 public lpFee;
24
+ *
25
+ * function setReturnValues(
26
+ * uint160 _sqrtPriceX96,
27
+ * int24 _tick,
28
+ * uint24 _protocolFee,
29
+ * uint24 _lpFee
30
+ * ) external {
31
+ * sqrtPriceX96 = _sqrtPriceX96;
32
+ * tick = _tick;
33
+ * protocolFee = _protocolFee;
34
+ * lpFee = _lpFee;
35
+ * }
36
+ *
37
+ * function getSlot0(bytes32 poolId) external view returns (uint160, int24, uint24, uint24) {
38
+ * return (sqrtPriceX96, tick, protocolFee, lpFee);
39
+ * }
40
+ * }
41
+ * ```
42
+ */
43
+ export class MockStateView {
44
+ private static readonly BYTECODE: `0x${string}` =
45
+ '0x608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633eaf5d9f14610064578063704ce43e146100825780638db791d2146100a0578063b0e21e8a146100be578063b52e4bdd146100dc578063c815641c146100f8575b5f5ffd5b61006c61012b565b60405161007991906102ab565b60405180910390f35b61008a61013d565b60405161009791906102e1565b60405180910390f35b6100a8610151565b6040516100b59190610328565b60405180910390f35b6100c6610175565b6040516100d391906102e1565b60405180910390f35b6100f660048036038101906100f191906103c3565b610189565b005b610112600480360381019061010d919061045a565b61022b565b6040516101229493929190610485565b60405180910390f35b5f60149054906101000a900460020b81565b5f601a9054906101000a900462ffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60179054906101000a900462ffffff1681565b835f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825f60146101000a81548162ffffff021916908360020b62ffffff160217905550815f60176101000a81548162ffffff021916908362ffffff160217905550805f601a6101000a81548162ffffff021916908362ffffff16021790555050505050565b5f5f5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f60149054906101000a900460020b5f60179054906101000a900462ffffff165f601a9054906101000a900462ffffff1693509350935093509193509193565b5f8160020b9050919050565b6102a581610290565b82525050565b5f6020820190506102be5f83018461029c565b92915050565b5f62ffffff82169050919050565b6102db816102c4565b82525050565b5f6020820190506102f45f8301846102d2565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b610322816102fa565b82525050565b5f60208201905061033b5f830184610319565b92915050565b5f5ffd5b61034e816102fa565b8114610358575f5ffd5b50565b5f8135905061036981610345565b92915050565b61037881610290565b8114610382575f5ffd5b50565b5f813590506103938161036f565b92915050565b6103a2816102c4565b81146103ac575f5ffd5b50565b5f813590506103bd81610399565b92915050565b5f5f5f5f608085870312156103db576103da610341565b5b5f6103e88782880161035b565b94505060206103f987828801610385565b935050604061040a878288016103af565b925050606061041b878288016103af565b91505092959194509250565b5f819050919050565b61043981610427565b8114610443575f5ffd5b50565b5f8135905061045481610430565b92915050565b5f6020828403121561046f5761046e610341565b5b5f61047c84828501610446565b91505092915050565b5f6080820190506104985f830187610319565b6104a5602083018661029c565b6104b260408301856102d2565b6104bf60608301846102d2565b9594505050505056fea2646970667358221220f8b1bfff284535bc078368ed34bd5e78981644845f3c9c1f5a4b8448c976805464736f6c634300081f0033';
46
+ private static readonly ABI = [
47
+ {
48
+ type: 'function',
49
+ name: 'setReturnValues',
50
+ inputs: [
51
+ { name: '_sqrtPriceX96', type: 'uint160' },
52
+ { name: '_tick', type: 'int24' },
53
+ { name: '_protocolFee', type: 'uint24' },
54
+ { name: '_lpFee', type: 'uint24' },
55
+ ],
56
+ outputs: [],
57
+ stateMutability: 'nonpayable',
58
+ },
59
+ {
60
+ inputs: [
61
+ {
62
+ internalType: 'bytes32',
63
+ name: 'poolId',
64
+ type: 'bytes32',
65
+ },
66
+ ],
67
+ name: 'getSlot0',
68
+ outputs: [
69
+ {
70
+ internalType: 'uint160',
71
+ name: '',
72
+ type: 'uint160',
73
+ },
74
+ {
75
+ internalType: 'int24',
76
+ name: '',
77
+ type: 'int24',
78
+ },
79
+ {
80
+ internalType: 'uint24',
81
+ name: '',
82
+ type: 'uint24',
83
+ },
84
+ {
85
+ internalType: 'uint24',
86
+ name: '',
87
+ type: 'uint24',
88
+ },
89
+ ],
90
+ stateMutability: 'view',
91
+ type: 'function',
92
+ },
93
+ ] as const;
94
+
95
+ private constructor(
96
+ private readonly address: EthAddress,
97
+ private readonly walletClient: ExtendedViemWalletClient,
98
+ private readonly log: Logger = createLogger('mock-state-view'),
99
+ ) {}
100
+
101
+ /**
102
+ * Deploys the mock StateView contract at the specified address using etch.
103
+ * @param ethCheatCodes - Cheat codes for etching bytecode
104
+ * @param walletClient - Wallet client for sending transactions
105
+ * @param address - Address to deploy the mock at (typically the real StateView address)
106
+ */
107
+ static async deploy(
108
+ ethCheatCodes: EthCheatCodes,
109
+ walletClient: ExtendedViemWalletClient,
110
+ address: EthAddress,
111
+ ): Promise<MockStateView> {
112
+ await ethCheatCodes.etch(address, MockStateView.BYTECODE);
113
+ return new MockStateView(address, walletClient);
114
+ }
115
+
116
+ /**
117
+ * Sets the price using the ethPerFeeAssetE12 format (same as rollup contract).
118
+ * Computes the corresponding sqrtPriceX96 internally.
119
+ *
120
+ * Math (from fee_asset_price_oracle.ts):
121
+ * ethPerFeeAssetE12 = 1e12 * 2^192 / sqrtPriceX96^2
122
+ *
123
+ * Inverted:
124
+ * sqrtPriceX96^2 = 1e12 * 2^192 / ethPerFeeAssetE12
125
+ * sqrtPriceX96 = sqrt(1e12 * 2^192 / ethPerFeeAssetE12)
126
+ *
127
+ * @param ethPerFeeAssetE12 - The price in ETH per fee asset, scaled by 1e12
128
+ */
129
+ async setEthPerFeeAsset(ethPerFeeAssetE12: bigint) {
130
+ const sqrtPriceX96 = this.ethPerFeeAssetE12ToSqrtPriceX96(ethPerFeeAssetE12);
131
+ return await this.setSqrtPriceX96(sqrtPriceX96);
132
+ }
133
+
134
+ /**
135
+ * Sets the sqrtPriceX96 value directly (Uniswap's price encoding).
136
+ * @param sqrtPriceX96 - The sqrtPriceX96 value
137
+ * @param tick - The tick value (default 10)
138
+ * @param protocolFee - The protocol fee (default 0)
139
+ * @param lpFee - The LP fee (default 500)
140
+ */
141
+ async setSqrtPriceX96(sqrtPriceX96: bigint, tick: number = 10, protocolFee: number = 0, lpFee: number = 500) {
142
+ const contract = getContract({
143
+ address: this.address.toString() as `0x${string}`,
144
+ abi: MockStateView.ABI,
145
+ client: this.walletClient,
146
+ });
147
+
148
+ const hash = await contract.write.setReturnValues([sqrtPriceX96, tick, protocolFee, lpFee]);
149
+ this.log.info(`Set sqrtPriceX96 to ${sqrtPriceX96}`);
150
+ return await this.walletClient.waitForTransactionReceipt({ hash });
151
+ }
152
+
153
+ /**
154
+ * Converts ethPerFeeAssetE12 to sqrtPriceX96 (inverse of sqrtPriceX96ToEthPerFeeAssetE12).
155
+ *
156
+ * Math:
157
+ * sqrtPriceX96 = sqrt(1e12 * 2^192 / ethPerFeeAssetE12)
158
+ */
159
+ ethPerFeeAssetE12ToSqrtPriceX96(ethPerFeeAssetE12: bigint): bigint {
160
+ if (ethPerFeeAssetE12 === 0n) {
161
+ throw new Error('Cannot convert zero ethPerFeeAssetE12');
162
+ }
163
+ const Q192 = 2n ** 192n;
164
+ const sqrtPriceSquared = (10n ** 12n * Q192) / ethPerFeeAssetE12;
165
+ return this.bigintSqrt(sqrtPriceSquared);
166
+ }
167
+
168
+ /** Integer square root using Newton's method */
169
+ bigintSqrt(n: bigint): bigint {
170
+ if (n < 0n) {
171
+ throw new Error('Cannot compute sqrt of negative number');
172
+ }
173
+ if (n === 0n) {
174
+ return 0n;
175
+ }
176
+ let x = n;
177
+ let y = (x + 1n) / 2n;
178
+ while (y < x) {
179
+ x = y;
180
+ y = (x + n / x) / 2n;
181
+ }
182
+ return x;
183
+ }
184
+ }
185
+
186
+ export function diffInBps(a: bigint, b: bigint): bigint {
187
+ return ((a - b) * 10000n) / b;
188
+ }
@@ -1,10 +1,11 @@
1
1
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
- import type { SentTx } from '@aztec/aztec.js/contracts';
2
+ import { NO_WAIT } from '@aztec/aztec.js/contracts';
3
3
  import { Fr, GrumpkinScalar } from '@aztec/aztec.js/fields';
4
4
  import type { Logger } from '@aztec/aztec.js/log';
5
- import { TxStatus } from '@aztec/aztec.js/tx';
5
+ import { TxHash, type TxReceipt, TxStatus } from '@aztec/aztec.js/tx';
6
6
  import { times } from '@aztec/foundation/collection';
7
- import type { TestWallet } from '@aztec/test-wallet/server';
7
+
8
+ import type { TestWallet } from '../test-wallet/test_wallet.js';
8
9
 
9
10
  // submits a set of transactions to the provided Wallet
10
11
  export const submitTxsTo = async (
@@ -12,26 +13,20 @@ export const submitTxsTo = async (
12
13
  submitter: AztecAddress,
13
14
  numTxs: number,
14
15
  logger: Logger,
15
- ): Promise<SentTx[]> => {
16
- const txs: SentTx[] = [];
16
+ ): Promise<TxHash[]> => {
17
+ const txHashes: TxHash[] = [];
17
18
  await Promise.all(
18
19
  times(numTxs, async () => {
19
20
  const accountManager = await wallet.createSchnorrAccount(Fr.random(), Fr.random(), GrumpkinScalar.random());
20
21
  const deployMethod = await accountManager.getDeployMethod();
21
- const tx = deployMethod.send({ from: submitter });
22
- const txHash = await tx.getTxHash();
22
+ const { txHash } = await deployMethod.send({ from: submitter, wait: NO_WAIT });
23
23
 
24
24
  logger.info(`Tx sent with hash ${txHash}`);
25
- const receipt = await tx.getReceipt();
26
- expect(receipt).toEqual(
27
- expect.objectContaining({
28
- status: TxStatus.PENDING,
29
- error: '',
30
- }),
31
- );
25
+ const receipt: TxReceipt = await wallet.getTxReceipt(txHash);
26
+ expect(receipt.status).toBe(TxStatus.PENDING);
32
27
  logger.info(`Receipt received for ${txHash}`);
33
- txs.push(tx);
28
+ txHashes.push(txHash);
34
29
  }),
35
30
  );
36
- return txs;
31
+ return txHashes;
37
32
  };