@aztec/end-to-end 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c

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 (166) 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 +89 -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 +1 -1
  21. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  22. package/dest/e2e_epochs/epochs_test.js +5 -2
  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 +2 -2
  28. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  29. package/dest/e2e_l1_publisher/write_json.js +19 -15
  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/shared.d.ts +6 -6
  40. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  41. package/dest/e2e_p2p/shared.js +11 -18
  42. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  43. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  44. package/dest/e2e_token_contract/token_contract_test.js +89 -91
  45. package/dest/fixtures/e2e_prover_test.d.ts +8 -14
  46. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  47. package/dest/fixtures/e2e_prover_test.js +85 -94
  48. package/dest/fixtures/setup.d.ts +218 -0
  49. package/dest/fixtures/setup.d.ts.map +1 -0
  50. package/dest/fixtures/setup.js +690 -0
  51. package/dest/fixtures/token_utils.d.ts +1 -1
  52. package/dest/fixtures/token_utils.d.ts.map +1 -1
  53. package/dest/fixtures/token_utils.js +7 -4
  54. package/dest/fixtures/utils.d.ts +5 -194
  55. package/dest/fixtures/utils.d.ts.map +1 -1
  56. package/dest/fixtures/utils.js +4 -619
  57. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  58. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  59. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  60. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  61. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  62. package/dest/quality_of_service/prometheus_client.js +67 -0
  63. package/dest/shared/cross_chain_test_harness.d.ts +16 -6
  64. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  65. package/dest/shared/cross_chain_test_harness.js +13 -13
  66. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  67. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  68. package/dest/shared/gas_portal_test_harness.js +1 -1
  69. package/dest/shared/index.d.ts +2 -2
  70. package/dest/shared/index.d.ts.map +1 -1
  71. package/dest/shared/submit-transactions.d.ts +3 -3
  72. package/dest/shared/submit-transactions.d.ts.map +1 -1
  73. package/dest/shared/submit-transactions.js +9 -11
  74. package/dest/shared/uniswap_l1_l2.d.ts +3 -28
  75. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  76. package/dest/shared/uniswap_l1_l2.js +51 -33
  77. package/dest/simulators/lending_simulator.d.ts +5 -1
  78. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  79. package/dest/simulators/lending_simulator.js +2 -2
  80. package/dest/spartan/setup_test_wallets.d.ts +4 -3
  81. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  82. package/dest/spartan/setup_test_wallets.js +61 -34
  83. package/dest/spartan/tx_metrics.d.ts +17 -2
  84. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  85. package/dest/spartan/tx_metrics.js +183 -6
  86. package/dest/spartan/utils/bot.d.ts +27 -0
  87. package/dest/spartan/utils/bot.d.ts.map +1 -0
  88. package/dest/spartan/utils/bot.js +141 -0
  89. package/dest/spartan/utils/chaos.d.ts +79 -0
  90. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  91. package/dest/spartan/utils/chaos.js +142 -0
  92. package/dest/spartan/utils/clients.d.ts +39 -0
  93. package/dest/spartan/utils/clients.d.ts.map +1 -0
  94. package/dest/spartan/utils/clients.js +90 -0
  95. package/dest/spartan/utils/config.d.ts +36 -0
  96. package/dest/spartan/utils/config.d.ts.map +1 -0
  97. package/dest/spartan/utils/config.js +20 -0
  98. package/dest/spartan/utils/health.d.ts +63 -0
  99. package/dest/spartan/utils/health.d.ts.map +1 -0
  100. package/dest/spartan/utils/health.js +202 -0
  101. package/dest/spartan/utils/helm.d.ts +15 -0
  102. package/dest/spartan/utils/helm.d.ts.map +1 -0
  103. package/dest/spartan/utils/helm.js +47 -0
  104. package/dest/spartan/utils/index.d.ts +9 -0
  105. package/dest/spartan/utils/index.d.ts.map +1 -0
  106. package/dest/spartan/utils/index.js +18 -0
  107. package/dest/spartan/utils/k8s.d.ts +98 -0
  108. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  109. package/dest/spartan/utils/k8s.js +257 -0
  110. package/dest/spartan/utils/nodes.d.ts +31 -0
  111. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  112. package/dest/spartan/utils/nodes.js +290 -0
  113. package/dest/spartan/utils/scripts.d.ts +16 -0
  114. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  115. package/dest/spartan/utils/scripts.js +66 -0
  116. package/dest/spartan/utils.d.ts +2 -253
  117. package/dest/spartan/utils.d.ts.map +1 -1
  118. package/dest/spartan/utils.js +1 -892
  119. package/package.json +40 -39
  120. package/src/bench/client_flows/benchmark.ts +24 -2
  121. package/src/bench/client_flows/client_flows_benchmark.ts +138 -204
  122. package/src/bench/client_flows/data_extractor.ts +1 -1
  123. package/src/bench/utils.ts +20 -14
  124. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
  125. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +127 -116
  126. package/src/e2e_deploy_contract/deploy_test.ts +21 -14
  127. package/src/e2e_epochs/epochs_test.ts +31 -26
  128. package/src/e2e_fees/bridging_race.notest.ts +3 -9
  129. package/src/e2e_fees/fees_test.ts +172 -220
  130. package/src/e2e_l1_publisher/write_json.ts +21 -16
  131. package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
  132. package/src/e2e_p2p/inactivity_slash_test.ts +5 -5
  133. package/src/e2e_p2p/p2p_network.ts +172 -168
  134. package/src/e2e_p2p/shared.ts +16 -25
  135. package/src/e2e_token_contract/token_contract_test.ts +103 -118
  136. package/src/fixtures/e2e_prover_test.ts +98 -133
  137. package/src/fixtures/setup.ts +1017 -0
  138. package/src/fixtures/token_utils.ts +6 -5
  139. package/src/fixtures/utils.ts +27 -907
  140. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  141. package/src/quality_of_service/prometheus_client.ts +113 -0
  142. package/src/shared/cross_chain_test_harness.ts +16 -36
  143. package/src/shared/gas_portal_test_harness.ts +1 -1
  144. package/src/shared/index.ts +1 -1
  145. package/src/shared/submit-transactions.ts +9 -15
  146. package/src/shared/uniswap_l1_l2.ts +58 -77
  147. package/src/simulators/lending_simulator.ts +2 -2
  148. package/src/spartan/setup_test_wallets.ts +79 -25
  149. package/src/spartan/tx_metrics.ts +129 -9
  150. package/src/spartan/utils/bot.ts +185 -0
  151. package/src/spartan/utils/chaos.ts +253 -0
  152. package/src/spartan/utils/clients.ts +100 -0
  153. package/src/spartan/utils/config.ts +26 -0
  154. package/src/spartan/utils/health.ts +255 -0
  155. package/src/spartan/utils/helm.ts +84 -0
  156. package/src/spartan/utils/index.ts +62 -0
  157. package/src/spartan/utils/k8s.ts +375 -0
  158. package/src/spartan/utils/nodes.ts +323 -0
  159. package/src/spartan/utils/scripts.ts +63 -0
  160. package/src/spartan/utils.ts +1 -1158
  161. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  162. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  163. package/dest/fixtures/snapshot_manager.js +0 -493
  164. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  165. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  166. 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 { CheckpointNumber, 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 checkpointNumber = CheckpointNumber.fromBlockNumber(l2UniswapInteractionReceipt.blockNumber!);
254
+ const epoch = await rollup.getEpochNumberForCheckpoint(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,11 @@ 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,
841
+ const epoch = await rollup.getEpochNumberForCheckpoint(
842
+ CheckpointNumber.fromBlockNumber(withdrawReceipt.blockNumber!),
864
843
  );
844
+ const swapResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, swapPrivateLeaf);
845
+ const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, withdrawLeaf);
865
846
 
866
847
  const swapPrivateL2MessageIndex = swapResult!.leafIndex;
867
848
  const swapPrivateSiblingPath = swapResult!.siblingPath;
@@ -870,7 +851,7 @@ export const uniswapL1L2TestSuite = (
870
851
  const withdrawSiblingPath = withdrawResult!.siblingPath;
871
852
 
872
853
  const withdrawMessageMetadata = {
873
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
854
+ _epoch: BigInt(epoch),
874
855
  _leafIndex: BigInt(withdrawL2MessageIndex),
875
856
  _path: withdrawSiblingPath
876
857
  .toBufferArray()
@@ -878,7 +859,7 @@ export const uniswapL1L2TestSuite = (
878
859
  };
879
860
 
880
861
  const swapPrivateMessageMetadata = {
881
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
862
+ _epoch: BigInt(epoch),
882
863
  _leafIndex: BigInt(swapPrivateL2MessageIndex),
883
864
  _path: swapPrivateSiblingPath
884
865
  .toBufferArray()
@@ -888,8 +869,9 @@ export const uniswapL1L2TestSuite = (
888
869
  // ensure that user's funds were burnt
889
870
  await wethCrossChainHarness.expectPrivateBalanceOnL2(ownerAddress, wethL2BalanceBeforeSwap - wethAmountToBridge);
890
871
 
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());
872
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
873
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
874
+ await waitForProven(aztecNode, withdrawReceipt, { provenTimeout: 300 });
893
875
 
894
876
  // On L1 call swap_public!
895
877
  logger.info('call swap_public on L1');
@@ -930,7 +912,7 @@ export const uniswapL1L2TestSuite = (
930
912
  },
931
913
  true,
932
914
  );
933
- await validateActionInteraction.send().wait();
915
+ await validateActionInteraction.send();
934
916
 
935
917
  // Call swap_public on L2
936
918
  const secretHashForDepositingSwappedDai = Fr.random();
@@ -948,8 +930,7 @@ export const uniswapL1L2TestSuite = (
948
930
  ownerEthAddress,
949
931
  Fr.ZERO,
950
932
  )
951
- .send({ from: ownerAddress })
952
- .wait();
933
+ .send({ from: ownerAddress });
953
934
 
954
935
  const swapPublicContent = sha256ToField([
955
936
  Buffer.from(
@@ -991,12 +972,11 @@ export const uniswapL1L2TestSuite = (
991
972
  chainId: new Fr(l1Client.chain.id),
992
973
  });
993
974
 
994
- const swapResult = await computeL2ToL1MembershipWitness(aztecNode, withdrawReceipt.blockNumber!, swapPublicLeaf);
995
- const withdrawResult = await computeL2ToL1MembershipWitness(
996
- aztecNode,
997
- withdrawReceipt.blockNumber!,
998
- withdrawLeaf,
975
+ const epoch = await rollup.getEpochNumberForCheckpoint(
976
+ CheckpointNumber.fromBlockNumber(withdrawReceipt.blockNumber!),
999
977
  );
978
+ const swapResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, swapPublicLeaf);
979
+ const withdrawResult = await computeL2ToL1MembershipWitness(aztecNode, epoch, withdrawLeaf);
1000
980
 
1001
981
  const swapPublicL2MessageIndex = swapResult!.leafIndex;
1002
982
  const swapPublicSiblingPath = swapResult!.siblingPath;
@@ -1005,7 +985,7 @@ export const uniswapL1L2TestSuite = (
1005
985
  const withdrawSiblingPath = withdrawResult!.siblingPath;
1006
986
 
1007
987
  const withdrawMessageMetadata = {
1008
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
988
+ _epoch: BigInt(epoch),
1009
989
  _leafIndex: BigInt(withdrawL2MessageIndex),
1010
990
  _path: withdrawSiblingPath
1011
991
  .toBufferArray()
@@ -1013,7 +993,7 @@ export const uniswapL1L2TestSuite = (
1013
993
  };
1014
994
 
1015
995
  const swapPublicMessageMetadata = {
1016
- _checkpointNumber: BigInt(withdrawReceipt.blockNumber!),
996
+ _epoch: BigInt(epoch),
1017
997
  _leafIndex: BigInt(swapPublicL2MessageIndex),
1018
998
  _path: swapPublicSiblingPath
1019
999
  .toBufferArray()
@@ -1023,8 +1003,9 @@ export const uniswapL1L2TestSuite = (
1023
1003
  // check weth balance of owner on L2 (we first bridged `wethAmountToBridge` into L2 and now withdrew it!)
1024
1004
  await wethCrossChainHarness.expectPublicBalanceOnL2(ownerAddress, 0n);
1025
1005
 
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());
1006
+ // Since the outbox is only consumable when the epoch is proven, we need to advance to the next epoch.
1007
+ await cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
1008
+ await waitForProven(aztecNode, withdrawReceipt, { provenTimeout: 300 });
1028
1009
 
1029
1010
  // Call swap_private on L1
1030
1011
  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