@aztec/end-to-end 0.0.0-test.1 → 0.0.1-fake-ceab37513c

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 (156) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +60 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +261 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +69 -0
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -0
  6. package/dest/bench/client_flows/client_flows_benchmark.js +315 -0
  7. package/dest/bench/client_flows/config.d.ts +14 -0
  8. package/dest/bench/client_flows/config.d.ts.map +1 -0
  9. package/dest/bench/client_flows/config.js +106 -0
  10. package/dest/bench/client_flows/data_extractor.d.ts +2 -0
  11. package/dest/bench/client_flows/data_extractor.d.ts.map +1 -0
  12. package/dest/bench/client_flows/data_extractor.js +99 -0
  13. package/dest/bench/utils.d.ts +10 -27
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +27 -43
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +15 -7
  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 +66 -38
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +10 -18
  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 +34 -53
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -2
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +9 -6
  25. package/dest/e2e_epochs/epochs_test.d.ts +56 -17
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +222 -42
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +2 -0
  29. package/dest/e2e_fees/bridging_race.notest.d.ts.map +1 -0
  30. package/dest/e2e_fees/bridging_race.notest.js +60 -0
  31. package/dest/e2e_fees/fees_test.d.ts +16 -5
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +87 -88
  34. package/dest/e2e_l1_publisher/write_json.d.ts +8 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +57 -0
  37. package/dest/e2e_multi_validator/utils.d.ts +12 -0
  38. package/dest/e2e_multi_validator/utils.d.ts.map +1 -0
  39. package/dest/e2e_multi_validator/utils.js +214 -0
  40. package/dest/e2e_nested_contract/nested_contract_test.d.ts +5 -5
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +19 -14
  43. package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
  44. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
  45. package/dest/e2e_p2p/inactivity_slash_test.js +132 -0
  46. package/dest/e2e_p2p/p2p_network.d.ts +56 -21
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +154 -125
  49. package/dest/e2e_p2p/shared.d.ts +41 -3
  50. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  51. package/dest/e2e_p2p/shared.js +146 -6
  52. package/dest/e2e_token_contract/token_contract_test.d.ts +10 -5
  53. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  54. package/dest/e2e_token_contract/token_contract_test.js +51 -24
  55. package/dest/{e2e_prover → fixtures}/e2e_prover_test.d.ts +7 -4
  56. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  57. package/dest/{e2e_prover → fixtures}/e2e_prover_test.js +67 -62
  58. package/dest/fixtures/fixtures.d.ts +5 -6
  59. package/dest/fixtures/fixtures.d.ts.map +1 -1
  60. package/dest/fixtures/fixtures.js +4 -3
  61. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  62. package/dest/fixtures/get_acvm_config.js +2 -14
  63. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  64. package/dest/fixtures/get_bb_config.js +8 -15
  65. package/dest/fixtures/l1_to_l2_messaging.d.ts +8 -5
  66. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  67. package/dest/fixtures/l1_to_l2_messaging.js +44 -18
  68. package/dest/fixtures/setup_l1_contracts.d.ts +3 -3
  69. package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
  70. package/dest/fixtures/setup_l1_contracts.js +3 -3
  71. package/dest/fixtures/setup_p2p_test.d.ts +14 -6
  72. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  73. package/dest/fixtures/setup_p2p_test.js +73 -21
  74. package/dest/fixtures/snapshot_manager.d.ts +8 -3
  75. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  76. package/dest/fixtures/snapshot_manager.js +120 -104
  77. package/dest/fixtures/token_utils.d.ts +4 -3
  78. package/dest/fixtures/token_utils.d.ts.map +1 -1
  79. package/dest/fixtures/token_utils.js +24 -7
  80. package/dest/fixtures/utils.d.ts +65 -22
  81. package/dest/fixtures/utils.d.ts.map +1 -1
  82. package/dest/fixtures/utils.js +439 -318
  83. package/dest/fixtures/web3signer.d.ts +5 -0
  84. package/dest/fixtures/web3signer.d.ts.map +1 -0
  85. package/dest/fixtures/web3signer.js +42 -0
  86. package/dest/shared/cross_chain_test_harness.d.ts +28 -18
  87. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  88. package/dest/shared/cross_chain_test_harness.js +97 -41
  89. package/dest/shared/gas_portal_test_harness.d.ts +23 -18
  90. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  91. package/dest/shared/gas_portal_test_harness.js +43 -25
  92. package/dest/shared/submit-transactions.d.ts.map +1 -1
  93. package/dest/shared/uniswap_l1_l2.d.ts +5 -6
  94. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  95. package/dest/shared/uniswap_l1_l2.js +136 -90
  96. package/dest/simulators/lending_simulator.d.ts +5 -6
  97. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  98. package/dest/simulators/lending_simulator.js +11 -15
  99. package/dest/simulators/token_simulator.d.ts +2 -1
  100. package/dest/simulators/token_simulator.d.ts.map +1 -1
  101. package/dest/simulators/token_simulator.js +16 -13
  102. package/dest/spartan/setup_test_wallets.d.ts +8 -1
  103. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  104. package/dest/spartan/setup_test_wallets.js +108 -22
  105. package/dest/spartan/utils.d.ts +60 -307
  106. package/dest/spartan/utils.d.ts.map +1 -1
  107. package/dest/spartan/utils.js +200 -115
  108. package/package.json +60 -56
  109. package/src/bench/client_flows/benchmark.ts +341 -0
  110. package/src/bench/client_flows/client_flows_benchmark.ts +422 -0
  111. package/src/bench/client_flows/config.ts +61 -0
  112. package/src/bench/client_flows/data_extractor.ts +111 -0
  113. package/src/bench/utils.ts +26 -52
  114. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +60 -40
  115. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +47 -75
  116. package/src/e2e_deploy_contract/deploy_test.ts +11 -8
  117. package/src/e2e_epochs/epochs_test.ts +276 -54
  118. package/src/e2e_fees/bridging_race.notest.ts +75 -0
  119. package/src/e2e_fees/fees_test.ts +121 -108
  120. package/src/e2e_l1_publisher/write_json.ts +74 -0
  121. package/src/e2e_multi_validator/utils.ts +258 -0
  122. package/src/e2e_nested_contract/nested_contract_test.ts +22 -14
  123. package/src/e2e_p2p/inactivity_slash_test.ts +174 -0
  124. package/src/e2e_p2p/p2p_network.ts +212 -144
  125. package/src/e2e_p2p/shared.ts +234 -14
  126. package/src/e2e_token_contract/token_contract_test.ts +42 -38
  127. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  128. package/src/{e2e_prover → fixtures}/e2e_prover_test.ts +62 -69
  129. package/src/fixtures/fixtures.ts +4 -3
  130. package/src/fixtures/get_acvm_config.ts +2 -10
  131. package/src/fixtures/get_bb_config.ts +15 -11
  132. package/src/fixtures/l1_to_l2_messaging.ts +53 -23
  133. package/src/fixtures/setup_l1_contracts.ts +5 -6
  134. package/src/fixtures/setup_p2p_test.ts +112 -30
  135. package/src/fixtures/snapshot_manager.ts +150 -102
  136. package/src/fixtures/token_utils.ts +33 -8
  137. package/src/fixtures/utils.ts +530 -352
  138. package/src/fixtures/web3signer.ts +46 -0
  139. package/src/guides/up_quick_start.sh +4 -4
  140. package/src/shared/cross_chain_test_harness.ts +92 -52
  141. package/src/shared/gas_portal_test_harness.ts +47 -31
  142. package/src/shared/uniswap_l1_l2.ts +127 -124
  143. package/src/simulators/lending_simulator.ts +11 -15
  144. package/src/simulators/token_simulator.ts +17 -12
  145. package/src/spartan/DEVELOP.md +116 -0
  146. package/src/spartan/setup_test_wallets.ts +144 -29
  147. package/src/spartan/utils.ts +194 -116
  148. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  149. package/dest/sample-dapp/connect.js +0 -12
  150. package/dest/sample-dapp/contracts.js +0 -10
  151. package/dest/sample-dapp/deploy.js +0 -35
  152. package/dest/sample-dapp/index.js +0 -98
  153. package/src/sample-dapp/connect.mjs +0 -16
  154. package/src/sample-dapp/contracts.mjs +0 -14
  155. package/src/sample-dapp/deploy.mjs +0 -40
  156. package/src/sample-dapp/index.mjs +0 -128
@@ -1,89 +1,82 @@
1
- import { createAztecNodeClient, createLogger, sleep } from '@aztec/aztec.js';
2
- import type { RollupCheatCodes } from '@aztec/aztec.js/ethereum';
1
+ import { createLogger, sleep } from '@aztec/aztec.js';
2
+ import type { RollupCheatCodes } from '@aztec/aztec/testing';
3
+ import type { L1ContractAddresses, ViemPublicClient } from '@aztec/ethereum';
3
4
  import type { Logger } from '@aztec/foundation/log';
4
- import type { SequencerConfig } from '@aztec/sequencer-client';
5
+ import { makeBackoff, retry } from '@aztec/foundation/retry';
6
+ import { schemas } from '@aztec/foundation/schemas';
7
+ import {
8
+ type AztecNodeAdmin,
9
+ type AztecNodeAdminConfig,
10
+ createAztecNodeAdminClient,
11
+ createAztecNodeClient,
12
+ } from '@aztec/stdlib/interfaces/client';
5
13
 
6
14
  import { ChildProcess, exec, execSync, spawn } from 'child_process';
7
15
  import path from 'path';
8
16
  import { promisify } from 'util';
17
+ import { createPublicClient, fallback, http } from 'viem';
9
18
  import { z } from 'zod';
10
19
 
11
- import { AlertChecker, type AlertConfig } from '../quality_of_service/alert_checker.js';
12
-
13
20
  const execAsync = promisify(exec);
14
21
 
15
22
  const logger = createLogger('e2e:k8s-utils');
16
23
 
17
- const ethereumHostsSchema = z.string().refine(
18
- str =>
19
- str.split(',').every(url => {
20
- try {
21
- new URL(url.trim());
22
- return true;
23
- } catch {
24
- return false;
25
- }
26
- }),
27
- 'ETHEREUM_HOSTS must be a comma-separated list of valid URLs',
28
- );
29
-
30
- const k8sLocalConfigSchema = z.object({
31
- ETHEREUM_SLOT_DURATION: z.coerce.number().min(1, 'ETHEREUM_SLOT_DURATION env variable must be set'),
32
- AZTEC_SLOT_DURATION: z.coerce.number().min(1, 'AZTEC_SLOT_DURATION env variable must be set'),
33
- AZTEC_EPOCH_DURATION: z.coerce.number().min(1, 'AZTEC_EPOCH_DURATION env variable must be set'),
34
- AZTEC_PROOF_SUBMISSION_WINDOW: z.coerce.number().min(1, 'AZTEC_PROOF_SUBMISSION_WINDOW env variable must be set'),
35
- INSTANCE_NAME: z.string().min(1, 'INSTANCE_NAME env variable must be set'),
36
- NAMESPACE: z.string().min(1, 'NAMESPACE env variable must be set'),
37
- CONTAINER_NODE_PORT: z.coerce.number().default(8080),
38
- CONTAINER_SEQUENCER_PORT: z.coerce.number().default(8080),
39
- CONTAINER_PROVER_NODE_PORT: z.coerce.number().default(8080),
40
- CONTAINER_PXE_PORT: z.coerce.number().default(8080),
41
- CONTAINER_ETHEREUM_PORT: z.coerce.number().default(8545),
42
- CONTAINER_METRICS_PORT: z.coerce.number().default(80),
43
- GRAFANA_PASSWORD: z.string().optional(),
44
- METRICS_API_PATH: z.string().default('/api/datasources/proxy/uid/spartan-metrics-prometheus/api/v1'),
45
- SPARTAN_DIR: z.string().min(1, 'SPARTAN_DIR env variable must be set'),
46
- ETHEREUM_HOSTS: ethereumHostsSchema.optional(),
47
- L1_ACCOUNT_MNEMONIC: z.string().default('test test test test test test test test test test test junk'),
48
- SEPOLIA_RUN: z.string().default('false'),
49
- K8S: z.literal('local'),
24
+ const testConfigSchema = z.object({
25
+ NAMESPACE: z.string().default('scenario'),
26
+ REAL_VERIFIER: schemas.Boolean.optional().default(true),
27
+ CREATE_ETH_DEVNET: schemas.Boolean.optional().default(false),
28
+ L1_RPC_URLS_JSON: z.string().optional(),
50
29
  });
51
30
 
52
- const k8sGCloudConfigSchema = k8sLocalConfigSchema.extend({
53
- K8S: z.literal('gcloud'),
54
- CLUSTER_NAME: z.string().min(1, 'CLUSTER_NAME env variable must be set'),
55
- REGION: z.string().min(1, 'REGION env variable must be set'),
56
- });
57
-
58
- const directConfigSchema = z.object({
59
- PXE_URL: z.string().url('PXE_URL must be a valid URL'),
60
- NODE_URL: z.string().url('NODE_URL must be a valid URL'),
61
- ETHEREUM_HOSTS: ethereumHostsSchema,
62
- K8S: z.literal('false'),
63
- });
31
+ export type TestConfig = z.infer<typeof testConfigSchema>;
64
32
 
65
- const envSchema = z.discriminatedUnion('K8S', [k8sLocalConfigSchema, k8sGCloudConfigSchema, directConfigSchema]);
33
+ export function setupEnvironment(env: unknown): TestConfig {
34
+ const config = testConfigSchema.parse(env);
35
+ logger.warn(`Loaded env config`, config);
36
+ return config;
37
+ }
66
38
 
67
- export type K8sLocalConfig = z.infer<typeof k8sLocalConfigSchema>;
68
- export type K8sGCloudConfig = z.infer<typeof k8sGCloudConfigSchema>;
69
- export type DirectConfig = z.infer<typeof directConfigSchema>;
70
- export type EnvConfig = z.infer<typeof envSchema>;
39
+ /**
40
+ * @param path - The path to the script, relative to the project root
41
+ * @param args - The arguments to pass to the script
42
+ * @param logger - The logger to use
43
+ * @returns The exit code of the script
44
+ */
45
+ function runScript(path: string, args: string[], logger: Logger, env?: Record<string, string>) {
46
+ const childProcess = spawn(path, args, {
47
+ stdio: ['ignore', 'pipe', 'pipe'],
48
+ env: env ? { ...process.env, ...env } : process.env,
49
+ });
50
+ return new Promise<number>((resolve, reject) => {
51
+ childProcess.on('close', (code: number | null) => resolve(code ?? 0));
52
+ childProcess.on('error', reject);
53
+ childProcess.stdout?.on('data', (data: Buffer) => {
54
+ logger.info(data.toString());
55
+ });
56
+ childProcess.stderr?.on('data', (data: Buffer) => {
57
+ logger.error(data.toString());
58
+ });
59
+ });
60
+ }
71
61
 
72
- export function isK8sConfig(config: EnvConfig): config is K8sLocalConfig | K8sGCloudConfig {
73
- return config.K8S === 'local' || config.K8S === 'gcloud';
62
+ export function getAztecBin() {
63
+ return path.join(getGitProjectRoot(), 'yarn-project/aztec/dest/bin/index.js');
74
64
  }
75
65
 
76
- export function isGCloudConfig(config: EnvConfig): config is K8sGCloudConfig {
77
- return config.K8S === 'gcloud';
66
+ /**
67
+ * Runs the Aztec binary
68
+ * @param args - The arguments to pass to the Aztec binary
69
+ * @param logger - The logger to use
70
+ * @param env - Optional environment variables to set for the process
71
+ * @returns The exit code of the Aztec binary
72
+ */
73
+ export function runAztecBin(args: string[], logger: Logger, env?: Record<string, string>) {
74
+ return runScript('node', [getAztecBin(), ...args], logger, env);
78
75
  }
79
76
 
80
- export function setupEnvironment(env: unknown): EnvConfig {
81
- const config = envSchema.parse(env);
82
- if (isGCloudConfig(config)) {
83
- const command = `gcloud container clusters get-credentials ${config.CLUSTER_NAME} --region=${config.REGION}`;
84
- execSync(command);
85
- }
86
- return config;
77
+ export function runProjectScript(script: string, args: string[], logger: Logger, env?: Record<string, string>) {
78
+ const scriptPath = script.startsWith('/') ? script : path.join(getGitProjectRoot(), script);
79
+ return runScript(scriptPath, args, logger, env);
87
80
  }
88
81
 
89
82
  export async function startPortForward({
@@ -103,7 +96,7 @@ export async function startPortForward({
103
96
  }> {
104
97
  const hostPortAsString = hostPort ? hostPort.toString() : '';
105
98
 
106
- logger.info(`kubectl port-forward -n ${namespace} ${resource} ${hostPortAsString}:${containerPort}`);
99
+ logger.debug(`kubectl port-forward -n ${namespace} ${resource} ${hostPortAsString}:${containerPort}`);
107
100
 
108
101
  const process = spawn(
109
102
  'kubectl',
@@ -121,21 +114,20 @@ export async function startPortForward({
121
114
  const str = data.toString() as string;
122
115
  if (!isResolved && str.includes('Forwarding from')) {
123
116
  isResolved = true;
124
- logger.info(str);
117
+ logger.debug(`Port forward for ${resource}: ${str}`);
125
118
  const port = str.search(/:\d+/);
126
119
  if (port === -1) {
127
120
  throw new Error('Port not found in port forward output');
128
121
  }
129
122
  const portNumber = parseInt(str.slice(port + 1));
130
- logger.info(`Port forward connected: ${portNumber}`);
131
- logger.info(`Port forward connected: ${portNumber}`);
123
+ logger.verbose(`Port forwarded for ${resource} at ${portNumber}:${containerPort}`);
132
124
  resolve(portNumber);
133
125
  } else {
134
126
  logger.silent(str);
135
127
  }
136
128
  });
137
129
  process.stderr?.on('data', data => {
138
- logger.info(data.toString());
130
+ logger.verbose(`Port forward for ${resource}: ${data.toString()}`);
139
131
  // It's a strange thing:
140
132
  // If we don't pipe stderr, then the port forwarding does not work.
141
133
  // Log to silent because this doesn't actually report errors,
@@ -145,16 +137,16 @@ export async function startPortForward({
145
137
  process.on('close', () => {
146
138
  if (!isResolved) {
147
139
  isResolved = true;
148
- logger.warn('Port forward closed before connection established');
140
+ logger.warn(`Port forward for ${resource} closed before connection established`);
149
141
  resolve(0);
150
142
  }
151
143
  });
152
144
  process.on('error', error => {
153
- logger.error(`Port forward error: ${error}`);
145
+ logger.error(`Port forward for ${resource} error: ${error}`);
154
146
  resolve(0);
155
147
  });
156
148
  process.on('exit', code => {
157
- logger.info(`Port forward exited with code ${code}`);
149
+ logger.verbose(`Port forward for ${resource} exited with code ${code}`);
158
150
  resolve(0);
159
151
  });
160
152
  });
@@ -164,6 +156,22 @@ export async function startPortForward({
164
156
  return { process, port };
165
157
  }
166
158
 
159
+ export function startPortForwardForRPC(namespace: string) {
160
+ return startPortForward({
161
+ resource: `services/${namespace}-rpc-aztec-node`,
162
+ namespace,
163
+ containerPort: 8080,
164
+ });
165
+ }
166
+
167
+ export function startPortForwardForEthereum(namespace: string) {
168
+ return startPortForward({
169
+ resource: `services/${namespace}-eth-execution`,
170
+ namespace,
171
+ containerPort: 8545,
172
+ });
173
+ }
174
+
167
175
  export async function deleteResourceByName({
168
176
  resource,
169
177
  namespace,
@@ -187,12 +195,18 @@ export async function deleteResourceByLabel({
187
195
  resource,
188
196
  namespace,
189
197
  label,
198
+ timeout = '5m',
199
+ force = false,
190
200
  }: {
191
201
  resource: string;
192
202
  namespace: string;
193
203
  label: string;
204
+ timeout?: string;
205
+ force?: boolean;
194
206
  }) {
195
- const command = `kubectl delete ${resource} -l ${label} -n ${namespace} --ignore-not-found=true --wait=true`;
207
+ const command = `kubectl delete ${resource} -l ${label} -n ${namespace} --ignore-not-found=true --wait=true --timeout=${timeout} ${
208
+ force ? '--force' : ''
209
+ }`;
196
210
  logger.info(`command: ${command}`);
197
211
  const { stdout } = await execAsync(command);
198
212
  return stdout;
@@ -304,13 +318,13 @@ export async function installChaosMeshChart({
304
318
  const deleteArgs = {
305
319
  resource: 'podchaos',
306
320
  namespace: chaosMeshNamespace,
307
- name: `${targetNamespace}-${instanceName}`,
321
+ label: `app.kubernetes.io/instance=${instanceName}`,
308
322
  };
309
323
  logger.info(`Deleting podchaos resource`);
310
- await deleteResourceByName(deleteArgs).catch(e => {
324
+ await deleteResourceByLabel(deleteArgs).catch(e => {
311
325
  logger.error(`Error deleting podchaos resource: ${e}`);
312
326
  logger.info(`Force deleting podchaos resource`);
313
- return deleteResourceByName({ ...deleteArgs, force: true });
327
+ return deleteResourceByLabel({ ...deleteArgs, force: true });
314
328
  });
315
329
  }
316
330
 
@@ -412,10 +426,12 @@ export function applyValidatorKill({
412
426
  namespace,
413
427
  spartanDir,
414
428
  logger,
429
+ values,
415
430
  }: {
416
431
  namespace: string;
417
432
  spartanDir: string;
418
433
  logger: Logger;
434
+ values?: Record<string, string | number>;
419
435
  }) {
420
436
  return installChaosMeshChart({
421
437
  instanceName: 'validator-kill',
@@ -423,6 +439,7 @@ export function applyValidatorKill({
423
439
  valuesFile: 'validator-kill.yaml',
424
440
  helmChartDir: getChartDir(spartanDir, 'aztec-chaos-scenarios'),
425
441
  logger,
442
+ values,
426
443
  });
427
444
  }
428
445
 
@@ -497,64 +514,109 @@ export async function enableValidatorDynamicBootNode(
497
514
  logger.info(`Validator dynamic boot node enabled`);
498
515
  }
499
516
 
500
- export async function runAlertCheck(config: EnvConfig, alerts: AlertConfig[], logger: Logger) {
501
- if (isK8sConfig(config)) {
502
- const { process, port } = await startPortForward({
503
- resource: `svc/metrics-grafana`,
504
- namespace: 'metrics',
505
- containerPort: config.CONTAINER_METRICS_PORT,
506
- });
507
- const alertChecker = new AlertChecker(logger, {
508
- grafanaEndpoint: `http://localhost:${port}${config.METRICS_API_PATH}`,
509
- grafanaCredentials: `admin:${config.GRAFANA_PASSWORD}`,
510
- });
511
- await alertChecker.runAlertCheck(alerts);
512
- process.kill();
513
- } else {
514
- logger.info('Not running alert check in non-k8s environment');
515
- }
517
+ export async function getSequencers(namespace: string) {
518
+ const command = `kubectl get pods -l app.kubernetes.io/component=validator -n ${namespace} -o jsonpath='{.items[*].metadata.name}'`;
519
+ const { stdout } = await execAsync(command);
520
+ const sequencers = stdout.split(' ');
521
+ logger.verbose(`Found sequencer pods ${sequencers.join(', ')}`);
522
+ return sequencers;
516
523
  }
517
524
 
518
- export async function updateSequencerConfig(url: string, config: Partial<SequencerConfig>) {
519
- const node = createAztecNodeClient(url);
520
- await node.setConfig(config);
525
+ export function updateSequencersConfig(env: TestConfig, config: Partial<AztecNodeAdminConfig>) {
526
+ return withSequencersAdmin(env, async client => {
527
+ await client.setConfig(config);
528
+ return client.getConfig();
529
+ });
521
530
  }
522
531
 
523
- export async function getSequencers(namespace: string) {
524
- const command = `kubectl get pods -l app=validator -n ${namespace} -o jsonpath='{.items[*].metadata.name}'`;
525
- const { stdout } = await execAsync(command);
526
- return stdout.split(' ');
532
+ export function getSequencersConfig(env: TestConfig) {
533
+ return withSequencersAdmin(env, client => client.getConfig());
527
534
  }
528
535
 
529
- export async function updateK8sSequencersConfig(args: {
530
- containerPort: number;
531
- namespace: string;
532
- config: Partial<SequencerConfig>;
533
- }) {
534
- const { containerPort, namespace, config } = args;
536
+ export async function withSequencersAdmin<T>(env: TestConfig, fn: (node: AztecNodeAdmin) => Promise<T>): Promise<T[]> {
537
+ const adminContainerPort = 8880;
538
+ const namespace = env.NAMESPACE;
535
539
  const sequencers = await getSequencers(namespace);
540
+ const results = [];
541
+
536
542
  for (const sequencer of sequencers) {
537
543
  const { process, port } = await startPortForward({
538
544
  resource: `pod/${sequencer}`,
539
545
  namespace,
540
- containerPort,
546
+ containerPort: adminContainerPort,
541
547
  });
542
548
 
543
549
  const url = `http://localhost:${port}`;
544
- await updateSequencerConfig(url, config);
550
+ await retry(
551
+ () => fetch(`${url}/status`).then(res => res.status === 200),
552
+ 'forward node admin port',
553
+ makeBackoff([1, 1, 2, 6]),
554
+ logger,
555
+ true,
556
+ );
557
+ const client = createAztecNodeAdminClient(url);
558
+ results.push(await fn(client));
545
559
  process.kill();
546
560
  }
561
+
562
+ return results;
547
563
  }
548
564
 
549
- export async function updateSequencersConfig(env: EnvConfig, config: Partial<SequencerConfig>) {
550
- if (isK8sConfig(env)) {
551
- await updateK8sSequencersConfig({
552
- containerPort: env.CONTAINER_NODE_PORT,
553
- namespace: env.NAMESPACE,
554
- config,
565
+ /**
566
+ * Returns a public viem client to the eth execution node. If it was part of a local eth devnet,
567
+ * it first port-forwards the service and points to it. Otherwise, just uses the external RPC url.
568
+ */
569
+ export async function getPublicViemClient(
570
+ env: TestConfig,
571
+ /** If set, will push the new process into it */
572
+ processes?: ChildProcess[],
573
+ ): Promise<{ url: string; client: ViemPublicClient; process?: ChildProcess }> {
574
+ const { NAMESPACE, CREATE_ETH_DEVNET, L1_RPC_URLS_JSON } = env;
575
+ if (CREATE_ETH_DEVNET) {
576
+ logger.info(`Creating port forward to eth execution node`);
577
+ const { process, port } = await startPortForward({
578
+ resource: `svc/${NAMESPACE}-eth-execution`,
579
+ namespace: NAMESPACE,
580
+ containerPort: 8545,
555
581
  });
582
+ const url = `http://127.0.0.1:${port}`;
583
+ const client: ViemPublicClient = createPublicClient({ transport: fallback([http(url)]) });
584
+ if (processes) {
585
+ processes.push(process);
586
+ }
587
+ return { url, client, process };
556
588
  } else {
557
- await updateSequencerConfig(env.NODE_URL, config);
589
+ logger.info(`Connecting to the eth execution node at ${L1_RPC_URLS_JSON}`);
590
+ if (!L1_RPC_URLS_JSON) {
591
+ throw new Error(`L1_RPC_URLS_JSON is not defined`);
592
+ }
593
+ const client: ViemPublicClient = createPublicClient({ transport: fallback([http(L1_RPC_URLS_JSON)]) });
594
+ return { url: L1_RPC_URLS_JSON, client };
595
+ }
596
+ }
597
+
598
+ /** Queries an Aztec node for the L1 deployment addresses */
599
+ export async function getL1DeploymentAddresses(env: TestConfig): Promise<L1ContractAddresses> {
600
+ let forwardProcess: ChildProcess | undefined;
601
+ try {
602
+ const [sequencer] = await getSequencers(env.NAMESPACE);
603
+ const { process, port } = await startPortForward({
604
+ resource: `pod/${sequencer}`,
605
+ namespace: env.NAMESPACE,
606
+ containerPort: 8080,
607
+ });
608
+
609
+ forwardProcess = process;
610
+ const url = `http://127.0.0.1:${port}`;
611
+ const node = createAztecNodeClient(url);
612
+ return await retry(
613
+ () => node.getNodeInfo().then(i => i.l1ContractAddresses),
614
+ 'get node info',
615
+ makeBackoff([1, 3, 6]),
616
+ logger,
617
+ );
618
+ } finally {
619
+ forwardProcess?.kill();
558
620
  }
559
621
  }
560
622
 
@@ -580,3 +642,19 @@ export async function rollAztecPods(namespace: string) {
580
642
  await waitForResourceByLabel({ resource: 'pods', namespace: namespace, label: 'app=validator' });
581
643
  await waitForResourceByLabel({ resource: 'pods', namespace: namespace, label: 'app=pxe' });
582
644
  }
645
+
646
+ /**
647
+ * Returns the absolute path to the git repository root
648
+ */
649
+ export function getGitProjectRoot(): string {
650
+ try {
651
+ const rootDir = execSync('git rev-parse --show-toplevel', {
652
+ encoding: 'utf-8',
653
+ stdio: ['ignore', 'pipe', 'ignore'],
654
+ }).trim();
655
+
656
+ return rootDir;
657
+ } catch (error) {
658
+ throw new Error(`Failed to determine git project root: ${error}`);
659
+ }
660
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e_prover_test.d.ts","sourceRoot":"","sources":["../../src/e2e_prover/e2e_prover_test.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,2BAA2B,EAChC,UAAU,EACV,KAAK,MAAM,EAIZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAqB,KAAK,6BAA6B,EAAuB,MAAM,kBAAkB,CAAC;AAE9G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQpD,OAAO,EAEL,KAAK,iBAAiB,EAIvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AASlE;;;;;GAKG;AAEH,qBAAa,cAAc;IA4BvB,OAAO,CAAC,sBAAsB;IAE9B,OAAO,CAAC,UAAU;IA7BpB,MAAM,CAAC,UAAU,SAAU;IAC3B,MAAM,CAAC,YAAY,SAAS;IAC5B,MAAM,CAAC,cAAc,SAAO;IAC5B,OAAO,CAAC,eAAe,CAAmB;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,kBAAkB,EAAE,CAAM;IAC5C,OAAO,EAAE,0BAA0B,EAAE,CAAM;IAC3C,QAAQ,EAAE,eAAe,EAAE,CAAM;IACjC,eAAe,EAAG,aAAa,CAAC;IAChC,QAAQ,EAAG,cAAc,CAAC;IAC1B,SAAS,EAAG,SAAS,CAAC;IACtB,GAAG,EAAG,UAAU,CAAC;IACjB,UAAU,EAAG,UAAU,CAAC;IACxB,QAAQ,EAAG,cAAc,CAAC;IAC1B,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,eAAe,CAAC,CAAsB;IAC9C,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAChD,oBAAoB,CAAC,EAAE,6BAA6B,CAAC;IACrD,YAAY,EAAE,aAAa,EAAE,CAAM;IACnC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,mBAAmB,CAAc;IAClC,WAAW,EAAG,2BAA2B,CAAC;IAC1C,aAAa,EAAG,UAAU,CAAC;gBAGhC,QAAQ,EAAE,MAAM,EACR,sBAAsB,EAAE,MAAM,EACtC,QAAQ,EAAE,UAAU,EACZ,UAAU,UAAO;IAW3B;;;;OAIG;IACG,kBAAkB;IAqDlB,KAAK;YA0JG,WAAW;IAQzB,QAAQ,YACA,MAAM,SACL,CAAC,OAAO,EAAE,iBAAiB,KAAK,QAAQ,CAAC,CAAC,YACxC,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,KAAK,QAAQ,IAAI,CAAC,KACtE,QAAQ,IAAI,CAAC,CAAwD;IAElE,QAAQ;IAeR,iBAAiB;IAiDjB,cAAc;CA4BrB"}
@@ -1,12 +0,0 @@
1
- // docs:start:all
2
- import { createPXEClient } from '@aztec/aztec.js';
3
- const { PXE_URL = 'http://localhost:8080' } = process.env;
4
- async function main() {
5
- const pxe = await createPXEClient(PXE_URL);
6
- const { l1ChainId } = await pxe.getNodeInfo();
7
- console.log(`Connected to chain ${l1ChainId}`);
8
- }
9
- main().catch((err)=>{
10
- console.error(`Error in app: ${err}`);
11
- process.exit(1);
12
- }); // docs:end:all
@@ -1,10 +0,0 @@
1
- // docs:start:imports
2
- import { AztecAddress } from '@aztec/aztec.js';
3
- import { TokenContract } from '@aztec/noir-contracts.js/Token';
4
- import { readFileSync } from 'fs';
5
- // docs:end:imports
6
- // docs:start:get-tokens
7
- export async function getToken(wallet) {
8
- const addresses = JSON.parse(readFileSync('addresses.json'));
9
- return TokenContract.at(AztecAddress.fromString(addresses.token), wallet);
10
- } // docs:end:get-tokens
@@ -1,35 +0,0 @@
1
- // docs:start:deploy-imports
2
- import { getInitialTestAccountsWallets } from '@aztec/accounts/testing';
3
- import { Contract, createPXEClient, waitForPXE } from '@aztec/aztec.js';
4
- // docs:end:deploy-imports
5
- import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
6
- import { writeFileSync } from 'fs';
7
- import { fileURLToPath } from 'url';
8
- // docs:start:dapp-deploy
9
- const { PXE_URL = 'http://localhost:8080' } = process.env;
10
- async function main() {
11
- const pxe = createPXEClient(PXE_URL);
12
- await waitForPXE(pxe);
13
- const [ownerWallet] = await getInitialTestAccountsWallets(pxe);
14
- const ownerAddress = ownerWallet.getAddress();
15
- const token = await Contract.deploy(ownerWallet, TokenContractArtifact, [
16
- ownerAddress,
17
- 'TokenName',
18
- 'TKN',
19
- 18
20
- ]).send().deployed();
21
- console.log(`Token deployed at ${token.address.toString()}`);
22
- const addresses = {
23
- token: token.address.toString()
24
- };
25
- writeFileSync('addresses.json', JSON.stringify(addresses, null, 2));
26
- }
27
- // docs:end:dapp-deploy
28
- // Execute main only if run directly
29
- if (process.argv[1].replace(/\/index\.m?js$/, '') === fileURLToPath(import.meta.url).replace(/\/index\.m?js$/, '')) {
30
- main().catch((err)=>{
31
- console.error(`Error in deployment script: ${err}`);
32
- process.exit(1);
33
- });
34
- }
35
- export { main as deploy };
@@ -1,98 +0,0 @@
1
- // docs:start:imports
2
- import { getInitialTestAccountsWallets } from '@aztec/accounts/testing';
3
- import { createPXEClient, waitForPXE } from '@aztec/aztec.js';
4
- import { fileURLToPath } from '@aztec/foundation/url';
5
- import { getToken } from './contracts.mjs';
6
- // docs:end:imports
7
- const { PXE_URL = 'http://localhost:8080' } = process.env;
8
- // docs:start:showAccounts
9
- async function showAccounts(pxe) {
10
- const accounts = await pxe.getRegisteredAccounts();
11
- console.log(`User accounts:\n${accounts.map((a)=>a.address).join('\n')}`);
12
- }
13
- // docs:end:showAccounts
14
- // docs:start:showPrivateBalances
15
- async function showPrivateBalances(pxe) {
16
- const [owner] = await getInitialTestAccountsWallets(pxe);
17
- const token = await getToken(owner);
18
- const accounts = await pxe.getRegisteredAccounts();
19
- for (const account of accounts){
20
- // highlight-next-line:showPrivateBalances
21
- const balance = await token.methods.balance_of_private(account.address).simulate();
22
- console.log(`Balance of ${account.address}: ${balance}`);
23
- }
24
- }
25
- // docs:end:showPrivateBalances
26
- // docs:start:mintPrivateFunds
27
- async function mintPrivateFunds(pxe) {
28
- const [ownerWallet] = await getInitialTestAccountsWallets(pxe);
29
- const token = await getToken(ownerWallet);
30
- await showPrivateBalances(pxe);
31
- // We mint tokens to the owner
32
- const mintAmount = 20n;
33
- const from = ownerWallet.getAddress(); // we are setting from to owner here because we need a sender to calculate the tag
34
- await token.methods.mint_to_private(from, ownerWallet.getAddress(), mintAmount).send().wait();
35
- await showPrivateBalances(pxe);
36
- }
37
- // docs:end:mintPrivateFunds
38
- // docs:start:transferPrivateFunds
39
- async function transferPrivateFunds(pxe) {
40
- const [owner, recipient] = await getInitialTestAccountsWallets(pxe);
41
- const token = await getToken(owner);
42
- await showPrivateBalances(pxe);
43
- console.log(`Sending transaction, awaiting transaction to be mined`);
44
- const receipt = await token.methods.transfer(recipient.getAddress(), 1).send().wait();
45
- console.log(`Transaction ${receipt.txHash} has been mined on block ${receipt.blockNumber}`);
46
- await showPrivateBalances(pxe);
47
- }
48
- // docs:end:transferPrivateFunds
49
- // docs:start:showPublicBalances
50
- async function showPublicBalances(pxe) {
51
- const [owner] = await getInitialTestAccountsWallets(pxe);
52
- const token = await getToken(owner);
53
- const accounts = await pxe.getRegisteredAccounts();
54
- for (const account of accounts){
55
- // highlight-next-line:showPublicBalances
56
- const balance = await token.methods.balance_of_public(account.address).simulate();
57
- console.log(`Balance of ${account.address}: ${balance}`);
58
- }
59
- }
60
- // docs:end:showPublicBalances
61
- // docs:start:mintPublicFunds
62
- async function mintPublicFunds(pxe) {
63
- const [owner] = await getInitialTestAccountsWallets(pxe);
64
- const token = await getToken(owner);
65
- await showPublicBalances(pxe);
66
- console.log(`Sending transaction, awaiting transaction to be mined`);
67
- const receipt = await token.methods.mint_to_public(owner.getAddress(), 100).send().wait();
68
- console.log(`Transaction ${receipt.txHash} has been mined on block ${receipt.blockNumber}`);
69
- await showPublicBalances(pxe);
70
- // docs:start:showLogs
71
- const blockNumber = await pxe.getBlockNumber();
72
- const logs = (await pxe.getPublicLogs({
73
- fromBlock: blockNumber - 1
74
- })).logs;
75
- const textLogs = logs.map((extendedLog)=>extendedLog.toHumanReadable().slice(0, 200));
76
- for (const log of textLogs)console.log(`Log emitted: ${log}`);
77
- // docs:end:showLogs
78
- }
79
- // docs:end:mintPublicFunds
80
- async function main() {
81
- const pxe = createPXEClient(PXE_URL);
82
- await waitForPXE(pxe);
83
- const { l1ChainId } = await pxe.getNodeInfo();
84
- console.log(`Connected to chain ${l1ChainId}`);
85
- await showAccounts(pxe);
86
- await mintPrivateFunds(pxe);
87
- await transferPrivateFunds(pxe);
88
- await mintPublicFunds(pxe);
89
- }
90
- // Execute main only if run directly
91
- if (process.argv[1].replace(/\/index\.m?js$/, '') === fileURLToPath(import.meta.url).replace(/\/index\.m?js$/, '')) {
92
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
93
- main().then(()=>process.exit(0)).catch((err)=>{
94
- console.error(`Error in app: ${err}`);
95
- process.exit(1);
96
- });
97
- }
98
- export { main };
@@ -1,16 +0,0 @@
1
- // docs:start:all
2
- import { createPXEClient } from '@aztec/aztec.js';
3
-
4
- const { PXE_URL = 'http://localhost:8080' } = process.env;
5
-
6
- async function main() {
7
- const pxe = await createPXEClient(PXE_URL);
8
- const { l1ChainId } = await pxe.getNodeInfo();
9
- console.log(`Connected to chain ${l1ChainId}`);
10
- }
11
-
12
- main().catch(err => {
13
- console.error(`Error in app: ${err}`);
14
- process.exit(1);
15
- });
16
- // docs:end:all
@@ -1,14 +0,0 @@
1
- // docs:start:imports
2
- import { AztecAddress } from '@aztec/aztec.js';
3
- import { TokenContract } from '@aztec/noir-contracts.js/Token';
4
-
5
- import { readFileSync } from 'fs';
6
-
7
- // docs:end:imports
8
-
9
- // docs:start:get-tokens
10
- export async function getToken(wallet) {
11
- const addresses = JSON.parse(readFileSync('addresses.json'));
12
- return TokenContract.at(AztecAddress.fromString(addresses.token), wallet);
13
- }
14
- // docs:end:get-tokens