@aztec/end-to-end 0.0.1-commit.6c91f13 → 0.0.1-commit.6d63667d

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 (183) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +3 -2
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/benchmark.js +21 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +12 -13
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +118 -133
  7. package/dest/bench/client_flows/data_extractor.js +3 -1
  8. package/dest/bench/utils.d.ts +9 -8
  9. package/dest/bench/utils.d.ts.map +1 -1
  10. package/dest/bench/utils.js +17 -12
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -7
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  13. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +96 -112
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +15 -10
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  16. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +90 -70
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -3
  18. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  19. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  20. package/dest/e2e_epochs/epochs_test.d.ts +7 -1
  21. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  22. package/dest/e2e_epochs/epochs_test.js +31 -9
  23. package/dest/e2e_fees/bridging_race.notest.js +3 -5
  24. package/dest/e2e_fees/fees_test.d.ts +13 -13
  25. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  26. package/dest/e2e_fees/fees_test.js +123 -141
  27. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  28. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  29. package/dest/e2e_l1_publisher/write_json.js +14 -16
  30. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  31. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  32. package/dest/e2e_nested_contract/nested_contract_test.js +31 -39
  33. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  34. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  35. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  36. package/dest/e2e_p2p/p2p_network.d.ts +7 -6
  37. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  38. package/dest/e2e_p2p/p2p_network.js +111 -104
  39. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  40. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  41. package/dest/e2e_p2p/reqresp/utils.js +153 -0
  42. package/dest/e2e_p2p/shared.d.ts +6 -6
  43. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  44. package/dest/e2e_p2p/shared.js +13 -20
  45. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  46. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  47. package/dest/e2e_token_contract/token_contract_test.js +89 -91
  48. package/dest/fixtures/e2e_prover_test.d.ts +8 -14
  49. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  50. package/dest/fixtures/e2e_prover_test.js +86 -95
  51. package/dest/fixtures/ha_setup.d.ts +71 -0
  52. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  53. package/dest/fixtures/ha_setup.js +114 -0
  54. package/dest/fixtures/index.d.ts +2 -1
  55. package/dest/fixtures/index.d.ts.map +1 -1
  56. package/dest/fixtures/index.js +1 -0
  57. package/dest/fixtures/setup.d.ts +218 -0
  58. package/dest/fixtures/setup.d.ts.map +1 -0
  59. package/dest/fixtures/setup.js +695 -0
  60. package/dest/fixtures/setup_p2p_test.d.ts +4 -5
  61. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  62. package/dest/fixtures/setup_p2p_test.js +24 -19
  63. package/dest/fixtures/token_utils.d.ts +1 -1
  64. package/dest/fixtures/token_utils.d.ts.map +1 -1
  65. package/dest/fixtures/token_utils.js +7 -4
  66. package/dest/fixtures/utils.d.ts +5 -194
  67. package/dest/fixtures/utils.d.ts.map +1 -1
  68. package/dest/fixtures/utils.js +4 -619
  69. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  70. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  71. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  72. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  73. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  74. package/dest/quality_of_service/prometheus_client.js +67 -0
  75. package/dest/shared/cross_chain_test_harness.d.ts +16 -6
  76. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  77. package/dest/shared/cross_chain_test_harness.js +13 -13
  78. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  79. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  80. package/dest/shared/gas_portal_test_harness.js +1 -1
  81. package/dest/shared/index.d.ts +2 -2
  82. package/dest/shared/index.d.ts.map +1 -1
  83. package/dest/shared/submit-transactions.d.ts +3 -3
  84. package/dest/shared/submit-transactions.d.ts.map +1 -1
  85. package/dest/shared/submit-transactions.js +9 -11
  86. package/dest/shared/uniswap_l1_l2.d.ts +3 -28
  87. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  88. package/dest/shared/uniswap_l1_l2.js +53 -33
  89. package/dest/simulators/lending_simulator.d.ts +5 -1
  90. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  91. package/dest/simulators/lending_simulator.js +2 -2
  92. package/dest/spartan/setup_test_wallets.d.ts +4 -3
  93. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  94. package/dest/spartan/setup_test_wallets.js +61 -34
  95. package/dest/spartan/tx_metrics.d.ts +51 -2
  96. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  97. package/dest/spartan/tx_metrics.js +333 -6
  98. package/dest/spartan/utils/bot.d.ts +27 -0
  99. package/dest/spartan/utils/bot.d.ts.map +1 -0
  100. package/dest/spartan/utils/bot.js +141 -0
  101. package/dest/spartan/utils/chaos.d.ts +79 -0
  102. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  103. package/dest/spartan/utils/chaos.js +142 -0
  104. package/dest/spartan/utils/clients.d.ts +39 -0
  105. package/dest/spartan/utils/clients.d.ts.map +1 -0
  106. package/dest/spartan/utils/clients.js +90 -0
  107. package/dest/spartan/utils/config.d.ts +39 -0
  108. package/dest/spartan/utils/config.d.ts.map +1 -0
  109. package/dest/spartan/utils/config.js +21 -0
  110. package/dest/spartan/utils/health.d.ts +63 -0
  111. package/dest/spartan/utils/health.d.ts.map +1 -0
  112. package/dest/spartan/utils/health.js +202 -0
  113. package/dest/spartan/utils/helm.d.ts +15 -0
  114. package/dest/spartan/utils/helm.d.ts.map +1 -0
  115. package/dest/spartan/utils/helm.js +47 -0
  116. package/dest/spartan/utils/index.d.ts +9 -0
  117. package/dest/spartan/utils/index.d.ts.map +1 -0
  118. package/dest/spartan/utils/index.js +18 -0
  119. package/dest/spartan/utils/k8s.d.ts +126 -0
  120. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  121. package/dest/spartan/utils/k8s.js +375 -0
  122. package/dest/spartan/utils/nodes.d.ts +41 -0
  123. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  124. package/dest/spartan/utils/nodes.js +461 -0
  125. package/dest/spartan/utils/scripts.d.ts +30 -0
  126. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  127. package/dest/spartan/utils/scripts.js +81 -0
  128. package/dest/spartan/utils.d.ts +2 -253
  129. package/dest/spartan/utils.d.ts.map +1 -1
  130. package/dest/spartan/utils.js +1 -892
  131. package/package.json +43 -39
  132. package/src/bench/client_flows/benchmark.ts +24 -2
  133. package/src/bench/client_flows/client_flows_benchmark.ts +138 -204
  134. package/src/bench/client_flows/data_extractor.ts +1 -1
  135. package/src/bench/utils.ts +20 -14
  136. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
  137. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +126 -116
  138. package/src/e2e_deploy_contract/deploy_test.ts +21 -14
  139. package/src/e2e_epochs/epochs_test.ts +60 -34
  140. package/src/e2e_fees/bridging_race.notest.ts +3 -9
  141. package/src/e2e_fees/fees_test.ts +172 -220
  142. package/src/e2e_l1_publisher/write_json.ts +16 -16
  143. package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
  144. package/src/e2e_p2p/inactivity_slash_test.ts +5 -5
  145. package/src/e2e_p2p/p2p_network.ts +172 -168
  146. package/src/e2e_p2p/reqresp/utils.ts +207 -0
  147. package/src/e2e_p2p/shared.ts +26 -27
  148. package/src/e2e_token_contract/token_contract_test.ts +103 -118
  149. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  150. package/src/fixtures/e2e_prover_test.ts +99 -134
  151. package/src/fixtures/ha_setup.ts +184 -0
  152. package/src/fixtures/index.ts +1 -0
  153. package/src/fixtures/setup.ts +1017 -0
  154. package/src/fixtures/setup_p2p_test.ts +15 -20
  155. package/src/fixtures/token_utils.ts +6 -5
  156. package/src/fixtures/utils.ts +27 -907
  157. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  158. package/src/quality_of_service/prometheus_client.ts +113 -0
  159. package/src/shared/cross_chain_test_harness.ts +16 -36
  160. package/src/shared/gas_portal_test_harness.ts +1 -1
  161. package/src/shared/index.ts +1 -1
  162. package/src/shared/submit-transactions.ts +9 -15
  163. package/src/shared/uniswap_l1_l2.ts +58 -79
  164. package/src/simulators/lending_simulator.ts +2 -2
  165. package/src/spartan/setup_test_wallets.ts +79 -25
  166. package/src/spartan/tx_metrics.ts +255 -9
  167. package/src/spartan/utils/bot.ts +185 -0
  168. package/src/spartan/utils/chaos.ts +253 -0
  169. package/src/spartan/utils/clients.ts +100 -0
  170. package/src/spartan/utils/config.ts +27 -0
  171. package/src/spartan/utils/health.ts +255 -0
  172. package/src/spartan/utils/helm.ts +84 -0
  173. package/src/spartan/utils/index.ts +64 -0
  174. package/src/spartan/utils/k8s.ts +527 -0
  175. package/src/spartan/utils/nodes.ts +538 -0
  176. package/src/spartan/utils/scripts.ts +99 -0
  177. package/src/spartan/utils.ts +1 -1158
  178. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  179. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  180. package/dest/fixtures/snapshot_manager.js +0 -493
  181. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  182. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  183. package/src/fixtures/snapshot_manager.ts +0 -651
@@ -25,7 +25,7 @@ const DEFAULT_CONFIG: AlertCheckerConfig = {
25
25
  grafanaCredentials: 'admin:admin',
26
26
  };
27
27
 
28
- export class AlertChecker {
28
+ export class GrafanaClient {
29
29
  private config: AlertCheckerConfig;
30
30
  private logger: Logger;
31
31
 
@@ -0,0 +1,113 @@
1
+ export type PromteheusClientOptions = {
2
+ server: URL;
3
+ };
4
+
5
+ export class PrometheusClient {
6
+ constructor(
7
+ private config: PromteheusClientOptions,
8
+ private httpClient: typeof fetch = fetch,
9
+ ) {}
10
+
11
+ public async querySingleValue(query: string, time = new Date()): Promise<number> {
12
+ const resp = await this.queryRaw(query, time);
13
+ if (resp.status === 'success') {
14
+ if (resp.data.resultType === 'vector') {
15
+ if (resp.data.result.length === 0) {
16
+ return 0;
17
+ }
18
+ const [_, value] = resp.data.result[0].value;
19
+ return parseFloat(value);
20
+ }
21
+ }
22
+
23
+ throw new TypeError('Unsupported response body', { cause: JSON.stringify(resp) });
24
+ }
25
+
26
+ public queryRaw(query: string, time = new Date()): Promise<PrometheusResponse> {
27
+ const searchParams = new URLSearchParams();
28
+ searchParams.set('query', query);
29
+ searchParams.set('time', String(Math.trunc(time.getTime() / 1000)));
30
+ searchParams.set('limit', '10');
31
+
32
+ return this.callPrometheus('query', searchParams);
33
+ }
34
+
35
+ public queryRangeRaw(
36
+ query: string,
37
+ step: PrometheusDuration,
38
+ start: Date,
39
+ end = new Date(),
40
+ ): Promise<PrometheusResponse> {
41
+ const searchParams = new URLSearchParams();
42
+ searchParams.set('query', query);
43
+ searchParams.set('step', step);
44
+ searchParams.set('start', String(Math.trunc(start.getTime() / 1000)));
45
+ searchParams.set('end', String(Math.trunc(end.getTime() / 1000)));
46
+ searchParams.set('limit', '10');
47
+
48
+ return this.callPrometheus('query_range', searchParams);
49
+ }
50
+
51
+ private async callPrometheus(api: string, searchParams: URLSearchParams): Promise<PrometheusResponse> {
52
+ const url = new URL('api/v1/' + api, this.config.server);
53
+ for (const [name, value] of searchParams) {
54
+ url.searchParams.append(name, value);
55
+ }
56
+
57
+ const resp = await this.httpClient(url, { method: 'GET' });
58
+ if (!resp.ok || resp.status !== 200) {
59
+ throw new Error('Invalid HTTP response from Prometheus', {
60
+ cause: {
61
+ url,
62
+ status: resp.status,
63
+ statusText: resp.statusText,
64
+ },
65
+ });
66
+ }
67
+
68
+ const body = await resp.json();
69
+ if ('status' in body && (body.status === 'error' || body.status === 'success')) {
70
+ return body;
71
+ }
72
+
73
+ throw new Error('Invalid response from Prometheus', {
74
+ cause: {
75
+ url,
76
+ body,
77
+ },
78
+ });
79
+ }
80
+ }
81
+
82
+ export type PrometheusDuration = `${number}s` | `${number}m` | `${number}h`;
83
+
84
+ export type PrometheusData =
85
+ | {
86
+ resultType: 'vector';
87
+ result: Array<{
88
+ metric: unknown;
89
+ value: [unixTimestamp: number, value: string];
90
+ }>;
91
+ }
92
+ | {
93
+ resultType: 'matrix';
94
+ result: Array<{
95
+ metric: unknown;
96
+ values: [unixTimestamp: number, value: string];
97
+ }>;
98
+ }
99
+ | {
100
+ resultType: 'scalar' | 'string';
101
+ result: unknown;
102
+ };
103
+
104
+ export type PrometheusResponse =
105
+ | {
106
+ status: 'error';
107
+ errorType: string;
108
+ error: string;
109
+ }
110
+ | {
111
+ status: 'success';
112
+ data: PrometheusData;
113
+ };
@@ -16,9 +16,8 @@ import type { Wallet } from '@aztec/aztec.js/wallet';
16
16
  import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
17
17
  import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
18
18
  import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
19
- import { BlockNumber } from '@aztec/foundation/branded-types';
19
+ import { EpochNumber } from '@aztec/foundation/branded-types';
20
20
  import { retryUntil } from '@aztec/foundation/retry';
21
- import type { FieldsOf } from '@aztec/foundation/types';
22
21
  import { TestERC20Abi, TokenPortalAbi, TokenPortalBytecode } from '@aztec/l1-artifacts';
23
22
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
24
23
  import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
@@ -74,14 +73,10 @@ export async function deployAndInitializeTokenAndBridgeContracts(
74
73
  });
75
74
 
76
75
  // deploy l2 token
77
- const token = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18)
78
- .send({ from: owner })
79
- .deployed();
76
+ const token = await TokenContract.deploy(wallet, owner, 'TokenName', 'TokenSymbol', 18).send({ from: owner });
80
77
 
81
78
  // deploy l2 token bridge and attach to the portal
82
- const bridge = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress)
83
- .send({ from: owner })
84
- .deployed();
79
+ const bridge = await TokenBridgeContract.deploy(wallet, token.address, tokenPortalAddress).send({ from: owner });
85
80
 
86
81
  if ((await token.methods.get_admin().simulate({ from: owner })) !== owner.toBigInt()) {
87
82
  throw new Error(`Token admin is not ${owner}`);
@@ -92,7 +87,7 @@ export async function deployAndInitializeTokenAndBridgeContracts(
92
87
  }
93
88
 
94
89
  // make the bridge a minter on the token:
95
- await token.methods.set_minter(bridge.address, true).send({ from: owner }).wait();
90
+ await token.methods.set_minter(bridge.address, true).send({ from: owner });
96
91
  if ((await token.methods.is_minter(bridge.address).simulate({ from: owner })) === 1n) {
97
92
  throw new Error(`Bridge is not a minter`);
98
93
  }
@@ -235,7 +230,7 @@ export class CrossChainTestHarness {
235
230
 
236
231
  async mintTokensPublicOnL2(amount: bigint) {
237
232
  this.logger.info('Minting tokens on L2 publicly');
238
- await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress }).wait();
233
+ await this.l2Token.methods.mint_to_public(this.ownerAddress, amount).send({ from: this.ownerAddress });
239
234
  }
240
235
 
241
236
  async mintTokensPrivateOnL2(amount: bigint) {
@@ -246,8 +241,7 @@ export class CrossChainTestHarness {
246
241
  // send a transfer tx to force through rollup with the message included
247
242
  await this.l2Token.methods
248
243
  .transfer_in_public(this.ownerAddress, receiverAddress, transferAmount, 0)
249
- .send({ from: this.ownerAddress })
250
- .wait();
244
+ .send({ from: this.ownerAddress });
251
245
  }
252
246
 
253
247
  async consumeMessageOnAztecAndMintPrivately(
@@ -257,8 +251,7 @@ export class CrossChainTestHarness {
257
251
  const { recipient, claimAmount, claimSecret: secretForL2MessageConsumption, messageLeafIndex } = claim;
258
252
  await this.l2Bridge.methods
259
253
  .claim_private(recipient, claimAmount, secretForL2MessageConsumption, messageLeafIndex)
260
- .send({ from: this.ownerAddress })
261
- .wait();
254
+ .send({ from: this.ownerAddress });
262
255
  }
263
256
 
264
257
  async consumeMessageOnAztecAndMintPublicly(
@@ -268,28 +261,25 @@ export class CrossChainTestHarness {
268
261
  const { claimAmount, claimSecret, messageLeafIndex } = claim;
269
262
  await this.l2Bridge.methods
270
263
  .claim_public(this.ownerAddress, claimAmount, claimSecret, messageLeafIndex)
271
- .send({ from: this.ownerAddress })
272
- .wait();
264
+ .send({ from: this.ownerAddress });
273
265
  }
274
266
 
275
267
  async withdrawPrivateFromAztecToL1(
276
268
  withdrawAmount: bigint,
277
269
  authwitNonce: Fr = Fr.ZERO,
278
270
  authWitness: AuthWitness,
279
- ): Promise<FieldsOf<TxReceipt>> {
271
+ ): Promise<TxReceipt> {
280
272
  const withdrawReceipt = await this.l2Bridge.methods
281
273
  .exit_to_l1_private(this.l2Token.address, this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
282
- .send({ authWitnesses: [authWitness], from: this.ownerAddress })
283
- .wait();
274
+ .send({ authWitnesses: [authWitness], from: this.ownerAddress });
284
275
 
285
276
  return withdrawReceipt;
286
277
  }
287
278
 
288
- async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<FieldsOf<TxReceipt>> {
279
+ async withdrawPublicFromAztecToL1(withdrawAmount: bigint, authwitNonce: Fr = Fr.ZERO): Promise<TxReceipt> {
289
280
  const withdrawReceipt = await this.l2Bridge.methods
290
281
  .exit_to_l1_public(this.ethAccount, withdrawAmount, EthAddress.ZERO, authwitNonce)
291
- .send({ from: this.ownerAddress })
292
- .wait();
282
+ .send({ from: this.ownerAddress });
293
283
 
294
284
  return withdrawReceipt;
295
285
  }
@@ -324,33 +314,23 @@ export class CrossChainTestHarness {
324
314
 
325
315
  withdrawFundsFromBridgeOnL1(
326
316
  amount: bigint,
327
- blockNumber: BlockNumber,
317
+ epochNumber: EpochNumber,
328
318
  messageIndex: bigint,
329
319
  siblingPath: SiblingPath<number>,
330
320
  ) {
331
- return this.l1TokenPortalManager.withdrawFunds(
332
- amount,
333
- this.ethAccount,
334
- BigInt(blockNumber),
335
- messageIndex,
336
- siblingPath,
337
- );
321
+ return this.l1TokenPortalManager.withdrawFunds(amount, this.ethAccount, epochNumber, messageIndex, siblingPath);
338
322
  }
339
323
 
340
324
  async transferToPrivateOnL2(shieldAmount: bigint) {
341
325
  this.logger.info('Transferring to private on L2');
342
- await this.l2Token.methods
343
- .transfer_to_private(this.ownerAddress, shieldAmount)
344
- .send({ from: this.ownerAddress })
345
- .wait();
326
+ await this.l2Token.methods.transfer_to_private(this.ownerAddress, shieldAmount).send({ from: this.ownerAddress });
346
327
  }
347
328
 
348
329
  async transferToPublicOnL2(amount: bigint, authwitNonce = Fr.ZERO) {
349
330
  this.logger.info('Transferring tokens to public');
350
331
  await this.l2Token.methods
351
332
  .transfer_to_public(this.ownerAddress, this.ownerAddress, amount, authwitNonce)
352
- .send({ from: this.ownerAddress })
353
- .wait();
333
+ .send({ from: this.ownerAddress });
354
334
  }
355
335
 
356
336
  /**
@@ -127,7 +127,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness {
127
127
  async consumeMessageOnAztecAndClaimPrivately(owner: AztecAddress, claimer: AztecAddress, claim: L2AmountClaim) {
128
128
  this.logger.info('Consuming messages on L2 Privately');
129
129
  const { claimAmount, claimSecret, messageLeafIndex } = claim;
130
- await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer }).wait();
130
+ await this.feeJuice.methods.claim(owner, claimAmount, claimSecret, messageLeafIndex).send({ from: claimer });
131
131
  }
132
132
 
133
133
  async getL2PublicBalanceOf(owner: AztecAddress) {
@@ -1 +1 @@
1
- export { uniswapL1L2TestSuite, type UniswapSetupContext } from './uniswap_l1_l2.js';
1
+ export { uniswapL1L2TestSuite } from './uniswap_l1_l2.js';
@@ -1,8 +1,8 @@
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
7
  import type { TestWallet } from '@aztec/test-wallet/server';
8
8
 
@@ -12,26 +12,20 @@ export const submitTxsTo = async (
12
12
  submitter: AztecAddress,
13
13
  numTxs: number,
14
14
  logger: Logger,
15
- ): Promise<SentTx[]> => {
16
- const txs: SentTx[] = [];
15
+ ): Promise<TxHash[]> => {
16
+ const txHashes: TxHash[] = [];
17
17
  await Promise.all(
18
18
  times(numTxs, async () => {
19
19
  const accountManager = await wallet.createSchnorrAccount(Fr.random(), Fr.random(), GrumpkinScalar.random());
20
20
  const deployMethod = await accountManager.getDeployMethod();
21
- const tx = deployMethod.send({ from: submitter });
22
- const txHash = await tx.getTxHash();
21
+ const txHash = await deployMethod.send({ from: submitter, wait: NO_WAIT });
23
22
 
24
23
  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
- );
24
+ const receipt: TxReceipt = await wallet.getTxReceipt(txHash);
25
+ expect(receipt.status).toBe(TxStatus.PENDING);
32
26
  logger.info(`Receipt received for ${txHash}`);
33
- txs.push(tx);
27
+ txHashes.push(txHash);
34
28
  }),
35
29
  );
36
- return txs;
30
+ return txHashes;
37
31
  };
@@ -1,5 +1,6 @@
1
1
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
2
2
  import { computeAuthWitMessageHash } from '@aztec/aztec.js/authorization';
3
+ import { waitForProven } from '@aztec/aztec.js/contracts';
3
4
  import { generateClaimSecret } from '@aztec/aztec.js/ethereum';
4
5
  import { Fr } from '@aztec/aztec.js/fields';
5
6
  import type { Logger } from '@aztec/aztec.js/log';
@@ -10,6 +11,7 @@ import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-az
10
11
  import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
11
12
  import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
12
13
  import { extractEvent } from '@aztec/ethereum/utils';
14
+ import { EpochNumber } from '@aztec/foundation/branded-types';
13
15
  import { sha256ToField } from '@aztec/foundation/crypto/sha256';
14
16
  import { InboxAbi, UniswapPortalAbi, UniswapPortalBytecode } from '@aztec/l1-artifacts';
15
17
  import { UniswapContract } from '@aztec/noir-contracts.js/Uniswap';
@@ -20,7 +22,7 @@ import type { TestWallet } from '@aztec/test-wallet/server';
20
22
  import { jest } from '@jest/globals';
21
23
  import { type GetContractReturnType, getContract, parseEther, toFunctionSelector } from 'viem';
22
24
 
23
- import { ensureAccountContractsPublished } from '../fixtures/utils.js';
25
+ import { type EndToEndContext, ensureAccountContractsPublished } from '../fixtures/utils.js';
24
26
  import { CrossChainTestHarness } from './cross_chain_test_harness.js';
25
27
 
26
28
  // PSA: This tests works on forked mainnet. There is a dump of the data in `dumpedState` such that we
@@ -32,28 +34,8 @@ import { CrossChainTestHarness } from './cross_chain_test_harness.js';
32
34
 
33
35
  const TIMEOUT = 360_000;
34
36
 
35
- /** Objects to be returned by the uniswap setup function */
36
- export type UniswapSetupContext = {
37
- /** Aztec Node instance */
38
- aztecNode: AztecNode;
39
- /** Logger instance named as the current test. */
40
- logger: Logger;
41
- /** The L1 wallet client, extended with public actions. */
42
- l1Client: ExtendedViemWalletClient;
43
- /** The wallet. */
44
- wallet: TestWallet;
45
- /** The owner address. */
46
- ownerAddress: AztecAddress;
47
- /** The sponsor wallet. */
48
- sponsorAddress: AztecAddress;
49
- /** */
50
- deployL1ContractsValues: DeployAztecL1ContractsReturnType;
51
- /** Cheat codes instance. */
52
- cheatCodes: CheatCodes;
53
- };
54
-
55
37
  export const uniswapL1L2TestSuite = (
56
- setup: () => Promise<UniswapSetupContext>,
38
+ setup: () => Promise<EndToEndContext>,
57
39
  cleanup: () => Promise<void>,
58
40
  expectedForkBlockNumber = 17514288,
59
41
  ) => {
@@ -90,8 +72,19 @@ export const uniswapL1L2TestSuite = (
90
72
  let cheatCodes: CheatCodes;
91
73
  let version: number;
92
74
  beforeAll(async () => {
93
- ({ aztecNode, logger, l1Client, wallet, ownerAddress, sponsorAddress, deployL1ContractsValues, cheatCodes } =
94
- await setup());
75
+ const t = await setup();
76
+ ({
77
+ aztecNode,
78
+ logger,
79
+ deployL1ContractsValues,
80
+ cheatCodes,
81
+ wallet,
82
+ accounts: [ownerAddress, sponsorAddress],
83
+ } = t);
84
+
85
+ l1Client = deployL1ContractsValues.l1Client;
86
+
87
+ t.watcher?.setIsMarkingAsProven(false);
95
88
 
96
89
  if (Number(await l1Client.getBlockNumber()) < expectedForkBlockNumber) {
97
90
  throw new Error('This test must be run on a fork of mainnet with the expected fork block');
@@ -137,9 +130,7 @@ export const uniswapL1L2TestSuite = (
137
130
  client: l1Client,
138
131
  });
139
132
  // deploy l2 uniswap contract and attach to portal
140
- uniswapL2Contract = await UniswapContract.deploy(wallet, uniswapPortalAddress)
141
- .send({ from: ownerAddress })
142
- .deployed();
133
+ uniswapL2Contract = await UniswapContract.deploy(wallet, uniswapPortalAddress).send({ from: ownerAddress });
143
134
 
144
135
  const registryAddress = (await aztecNode.getNodeInfo()).l1ContractAddresses.registryAddress;
145
136
 
@@ -216,8 +207,7 @@ export const uniswapL1L2TestSuite = (
216
207
  secretHashForDepositingSwappedDai,
217
208
  ownerEthAddress,
218
209
  )
219
- .send({ from: ownerAddress, authWitnesses: [transferToPublicAuhtwit] })
220
- .wait();
210
+ .send({ from: ownerAddress, authWitnesses: [transferToPublicAuhtwit] });
221
211
 
222
212
  const swapPrivateFunction = 'swap_private(address,uint256,uint24,address,uint256,bytes32,address)';
223
213
  const swapPrivateContent = sha256ToField([
@@ -259,24 +249,19 @@ export const uniswapL1L2TestSuite = (
259
249
  // ensure that uniswap contract didn't eat the funds.
260
250
  await wethCrossChainHarness.expectPublicBalanceOnL2(uniswapL2Contract.address, 0n);
261
251
 
262
- // Since the outbox is only consumable when the block is proven, we need to set the block to be proven
263
- await cheatCodes.rollup.markAsProven(await rollup.getCheckpointNumber());
252
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
253
+ const block = await aztecNode.getBlock(l2UniswapInteractionReceipt.blockNumber!);
254
+ const epoch = await rollup.getEpochNumberForCheckpoint(block!.checkpointNumber);
255
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
256
+ await waitForProven(aztecNode, l2UniswapInteractionReceipt, { provenTimeout: 300 });
264
257
 
265
258
  // 5. Consume L2 to L1 message by calling uniswapPortal.swap_private()
266
259
  logger.info('Execute withdraw and swap on the uniswapPortal!');
267
260
  const daiL1BalanceOfPortalBeforeSwap = await daiCrossChainHarness.getL1BalanceOf(
268
261
  daiCrossChainHarness.tokenPortalAddress,
269
262
  );
270
- const swapResult = await computeL2ToL1MembershipWitness(
271
- aztecNode,
272
- l2UniswapInteractionReceipt.blockNumber!,
273
- swapPrivateLeaf,
274
- );
275
- const withdrawResult = await computeL2ToL1MembershipWitness(
276
- aztecNode,
277
- l2UniswapInteractionReceipt.blockNumber!,
278
- withdrawLeaf,
279
- );
263
+ const swapResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, swapPrivateLeaf);
264
+ const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, withdrawLeaf);
280
265
 
281
266
  const swapPrivateL2MessageIndex = swapResult!.leafIndex;
282
267
  const swapPrivateSiblingPath = swapResult!.siblingPath;
@@ -285,7 +270,7 @@ export const uniswapL1L2TestSuite = (
285
270
  const withdrawSiblingPath = withdrawResult!.siblingPath;
286
271
 
287
272
  const withdrawMessageMetadata = {
288
- _checkpointNumber: BigInt(l2UniswapInteractionReceipt.blockNumber!),
273
+ _epoch: BigInt(epoch),
289
274
  _leafIndex: BigInt(withdrawL2MessageIndex),
290
275
  _path: withdrawSiblingPath
291
276
  .toBufferArray()
@@ -293,7 +278,7 @@ export const uniswapL1L2TestSuite = (
293
278
  };
294
279
 
295
280
  const swapPrivateMessageMetadata = {
296
- _checkpointNumber: BigInt(l2UniswapInteractionReceipt.blockNumber!),
281
+ _epoch: BigInt(epoch),
297
282
  _leafIndex: BigInt(swapPrivateL2MessageIndex),
298
283
  _path: swapPrivateSiblingPath
299
284
  .toBufferArray()
@@ -440,10 +425,10 @@ export const uniswapL1L2TestSuite = (
440
425
  // ownerEthAddress,
441
426
  // nonceForSwap,
442
427
  // );
443
- // await ownerWallet.setPublicAuthWit({ caller: sponsorAddress, action }, true).send().wait();
428
+ // await ownerWallet.setPublicAuthWit({ caller: sponsorAddress, action }, true).send();
444
429
 
445
430
  // // 4.2 Call swap_public from user2 on behalf of owner
446
- // const uniswapL2Interaction = await action.send().wait();
431
+ // const uniswapL2Interaction = await action.send();
447
432
 
448
433
  // const swapPublicContent = sha256ToField([
449
434
  // Buffer.from(
@@ -504,7 +489,7 @@ export const uniswapL1L2TestSuite = (
504
489
  // );
505
490
 
506
491
  // const withdrawMessageMetadata = {
507
- // _checkpointNumber: BigInt(uniswapL2Interaction.blockNumber!),
492
+ // _epoch: epoch,
508
493
  // _leafIndex: BigInt(withdrawL2MessageIndex),
509
494
  // _path: withdrawSiblingPath
510
495
  // .toBufferArray()
@@ -512,7 +497,7 @@ export const uniswapL1L2TestSuite = (
512
497
  // };
513
498
 
514
499
  // const swapPrivateMessageMetadata = {
515
- // _checkpointNumber: BigInt(uniswapL2Interaction.blockNumber!),
500
+ // _epoch: epoch,
516
501
  // _leafIndex: BigInt(swapPrivateL2MessageIndex),
517
502
  // _path: swapPrivateSiblingPath
518
503
  // .toBufferArray()
@@ -661,8 +646,7 @@ export const uniswapL1L2TestSuite = (
661
646
  Fr.random(),
662
647
  ownerEthAddress,
663
648
  )
664
- .send({ from: ownerAddress, authWitnesses: [transferToPublicAuthwith] })
665
- .wait(),
649
+ .send({ from: ownerAddress, authWitnesses: [transferToPublicAuthwith] }),
666
650
  ).rejects.toThrow('Assertion failed: input_asset address is not the same as seen in the bridge contract');
667
651
  });
668
652
 
@@ -687,7 +671,7 @@ export const uniswapL1L2TestSuite = (
687
671
  },
688
672
  true,
689
673
  );
690
- await validateActionInteraction.send().wait();
674
+ await validateActionInteraction.send();
691
675
 
692
676
  // No approval to call `swap` but should work even without it:
693
677
  const [_, secretHashForDepositingSwappedDai] = await generateClaimSecret();
@@ -706,8 +690,7 @@ export const uniswapL1L2TestSuite = (
706
690
  ownerEthAddress,
707
691
  Fr.ZERO, // nonce for swap -> doesn't matter
708
692
  )
709
- .send({ from: ownerAddress })
710
- .wait();
693
+ .send({ from: ownerAddress });
711
694
  // check weth balance of owner on L2 (we first bridged `wethAmountToBridge` into L2 and now withdrew it!)
712
695
  await wethCrossChainHarness.expectPublicBalanceOnL2(ownerAddress, 0n);
713
696
  });
@@ -737,7 +720,7 @@ export const uniswapL1L2TestSuite = (
737
720
  { caller: approvedUser, action },
738
721
  true,
739
722
  );
740
- await validateActionInteraction.send().wait();
723
+ await validateActionInteraction.send();
741
724
 
742
725
  await expect(action.simulate({ from: sponsorAddress })).rejects.toThrow(/unauthorized/);
743
726
  });
@@ -759,7 +742,7 @@ export const uniswapL1L2TestSuite = (
759
742
  },
760
743
  true,
761
744
  );
762
- await validateActionInteraction.send().wait();
745
+ await validateActionInteraction.send();
763
746
 
764
747
  await expect(
765
748
  uniswapL2Contract.methods
@@ -816,8 +799,7 @@ export const uniswapL1L2TestSuite = (
816
799
  secretHashForDepositingSwappedDai,
817
800
  ownerEthAddress,
818
801
  )
819
- .send({ from: ownerAddress, authWitnesses: [transferToPublicAuhtwit] })
820
- .wait();
802
+ .send({ from: ownerAddress, authWitnesses: [transferToPublicAuhtwit] });
821
803
 
822
804
  const swapPrivateContent = sha256ToField([
823
805
  Buffer.from(
@@ -856,12 +838,10 @@ export const uniswapL1L2TestSuite = (
856
838
  chainId: new Fr(l1Client.chain.id),
857
839
  });
858
840
 
859
- const swapResult = await computeL2ToL1MembershipWitness(aztecNode, withdrawReceipt.blockNumber!, swapPrivateLeaf);
860
- const withdrawResult = await computeL2ToL1MembershipWitness(
861
- aztecNode,
862
- withdrawReceipt.blockNumber!,
863
- withdrawLeaf,
864
- );
841
+ const block = await aztecNode.getBlock(withdrawReceipt.blockNumber!);
842
+ const epoch = await rollup.getEpochNumberForCheckpoint(block!.checkpointNumber);
843
+ const swapResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, swapPrivateLeaf);
844
+ const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, withdrawLeaf);
865
845
 
866
846
  const swapPrivateL2MessageIndex = swapResult!.leafIndex;
867
847
  const swapPrivateSiblingPath = swapResult!.siblingPath;
@@ -870,7 +850,7 @@ export const uniswapL1L2TestSuite = (
870
850
  const withdrawSiblingPath = withdrawResult!.siblingPath;
871
851
 
872
852
  const withdrawMessageMetadata = {
873
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
853
+ _epoch: BigInt(epoch),
874
854
  _leafIndex: BigInt(withdrawL2MessageIndex),
875
855
  _path: withdrawSiblingPath
876
856
  .toBufferArray()
@@ -878,7 +858,7 @@ export const uniswapL1L2TestSuite = (
878
858
  };
879
859
 
880
860
  const swapPrivateMessageMetadata = {
881
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
861
+ _epoch: BigInt(epoch),
882
862
  _leafIndex: BigInt(swapPrivateL2MessageIndex),
883
863
  _path: swapPrivateSiblingPath
884
864
  .toBufferArray()
@@ -888,8 +868,9 @@ export const uniswapL1L2TestSuite = (
888
868
  // ensure that user's funds were burnt
889
869
  await wethCrossChainHarness.expectPrivateBalanceOnL2(ownerAddress, wethL2BalanceBeforeSwap - wethAmountToBridge);
890
870
 
891
- // Since the outbox is only consumable when the block is proven, we need to set the block to be proven
892
- await cheatCodes.rollup.markAsProven(await rollup.getCheckpointNumber());
871
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
872
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
873
+ await waitForProven(aztecNode, withdrawReceipt, { provenTimeout: 300 });
893
874
 
894
875
  // On L1 call swap_public!
895
876
  logger.info('call swap_public on L1');
@@ -930,7 +911,7 @@ export const uniswapL1L2TestSuite = (
930
911
  },
931
912
  true,
932
913
  );
933
- await validateActionInteraction.send().wait();
914
+ await validateActionInteraction.send();
934
915
 
935
916
  // Call swap_public on L2
936
917
  const secretHashForDepositingSwappedDai = Fr.random();
@@ -948,8 +929,7 @@ export const uniswapL1L2TestSuite = (
948
929
  ownerEthAddress,
949
930
  Fr.ZERO,
950
931
  )
951
- .send({ from: ownerAddress })
952
- .wait();
932
+ .send({ from: ownerAddress });
953
933
 
954
934
  const swapPublicContent = sha256ToField([
955
935
  Buffer.from(
@@ -991,12 +971,10 @@ export const uniswapL1L2TestSuite = (
991
971
  chainId: new Fr(l1Client.chain.id),
992
972
  });
993
973
 
994
- const swapResult = await computeL2ToL1MembershipWitness(aztecNode, withdrawReceipt.blockNumber!, swapPublicLeaf);
995
- const withdrawResult = await computeL2ToL1MembershipWitness(
996
- aztecNode,
997
- withdrawReceipt.blockNumber!,
998
- withdrawLeaf,
999
- );
974
+ const block = await aztecNode.getBlock(withdrawReceipt.blockNumber!);
975
+ const epoch = await rollup.getEpochNumberForCheckpoint(block!.checkpointNumber);
976
+ const swapResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, swapPublicLeaf);
977
+ const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, withdrawLeaf);
1000
978
 
1001
979
  const swapPublicL2MessageIndex = swapResult!.leafIndex;
1002
980
  const swapPublicSiblingPath = swapResult!.siblingPath;
@@ -1005,7 +983,7 @@ export const uniswapL1L2TestSuite = (
1005
983
  const withdrawSiblingPath = withdrawResult!.siblingPath;
1006
984
 
1007
985
  const withdrawMessageMetadata = {
1008
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
986
+ _epoch: BigInt(epoch),
1009
987
  _leafIndex: BigInt(withdrawL2MessageIndex),
1010
988
  _path: withdrawSiblingPath
1011
989
  .toBufferArray()
@@ -1013,7 +991,7 @@ export const uniswapL1L2TestSuite = (
1013
991
  };
1014
992
 
1015
993
  const swapPublicMessageMetadata = {
1016
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
994
+ _epoch: BigInt(epoch),
1017
995
  _leafIndex: BigInt(swapPublicL2MessageIndex),
1018
996
  _path: swapPublicSiblingPath
1019
997
  .toBufferArray()
@@ -1023,8 +1001,9 @@ export const uniswapL1L2TestSuite = (
1023
1001
  // check weth balance of owner on L2 (we first bridged `wethAmountToBridge` into L2 and now withdrew it!)
1024
1002
  await wethCrossChainHarness.expectPublicBalanceOnL2(ownerAddress, 0n);
1025
1003
 
1026
- // Since the outbox is only consumable when the block is proven, we need to set the block to be proven
1027
- await cheatCodes.rollup.markAsProven(await rollup.getCheckpointNumber());
1004
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
1005
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
1006
+ await waitForProven(aztecNode, withdrawReceipt, { provenTimeout: 300 });
1028
1007
 
1029
1008
  // Call swap_private on L1
1030
1009
  logger.info('Execute withdraw and swap on the uniswapPortal!');
@@ -4,7 +4,7 @@ import { Fr } from '@aztec/aztec.js/fields';
4
4
  import { CheatCodes } from '@aztec/aztec/testing';
5
5
  import type { RollupContract } from '@aztec/ethereum/contracts';
6
6
  import { SlotNumber } from '@aztec/foundation/branded-types';
7
- import { pedersenHash } from '@aztec/foundation/crypto/pedersen';
7
+ import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
8
8
  import type { TestDateProvider } from '@aztec/foundation/timer';
9
9
  import type { LendingContract } from '@aztec/noir-contracts.js/Lending';
10
10
 
@@ -29,7 +29,7 @@ export class LendingAccount {
29
29
  * @returns Key in public space
30
30
  */
31
31
  public key() {
32
- return pedersenHash([this.address, this.secret]);
32
+ return poseidon2Hash([this.address, this.secret]);
33
33
  }
34
34
  }
35
35