@aztec/aztec 0.0.0-test.0 → 0.0.1-commit.001888fc

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 (194) hide show
  1. package/README.md +1 -1
  2. package/dest/bin/index.d.ts +1 -1
  3. package/dest/bin/index.js +28 -13
  4. package/dest/cli/admin_api_key_store.d.ts +45 -0
  5. package/dest/cli/admin_api_key_store.d.ts.map +1 -0
  6. package/dest/cli/admin_api_key_store.js +98 -0
  7. package/dest/cli/aztec_start_action.d.ts +1 -1
  8. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  9. package/dest/cli/aztec_start_action.js +89 -44
  10. package/dest/cli/aztec_start_options.d.ts +5 -3
  11. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  12. package/dest/cli/aztec_start_options.js +157 -220
  13. package/dest/cli/cli.d.ts +1 -1
  14. package/dest/cli/cli.d.ts.map +1 -1
  15. package/dest/cli/cli.js +11 -7
  16. package/dest/cli/cmds/compile.d.ts +4 -0
  17. package/dest/cli/cmds/compile.d.ts.map +1 -0
  18. package/dest/cli/cmds/compile.js +166 -0
  19. package/dest/cli/cmds/migrate_ha_db.d.ts +3 -0
  20. package/dest/cli/cmds/migrate_ha_db.d.ts.map +1 -0
  21. package/dest/cli/cmds/migrate_ha_db.js +27 -0
  22. package/dest/cli/cmds/profile.d.ts +4 -0
  23. package/dest/cli/cmds/profile.d.ts.map +1 -0
  24. package/dest/cli/cmds/profile.js +8 -0
  25. package/dest/cli/cmds/profile_flamegraph.d.ts +4 -0
  26. package/dest/cli/cmds/profile_flamegraph.d.ts.map +1 -0
  27. package/dest/cli/cmds/profile_flamegraph.js +52 -0
  28. package/dest/cli/cmds/profile_gates.d.ts +4 -0
  29. package/dest/cli/cmds/profile_gates.d.ts.map +1 -0
  30. package/dest/cli/cmds/profile_gates.js +58 -0
  31. package/dest/cli/cmds/profile_utils.d.ts +18 -0
  32. package/dest/cli/cmds/profile_utils.d.ts.map +1 -0
  33. package/dest/cli/cmds/profile_utils.js +50 -0
  34. package/dest/cli/cmds/standby.d.ts +32 -0
  35. package/dest/cli/cmds/standby.d.ts.map +1 -0
  36. package/dest/cli/cmds/standby.js +97 -0
  37. package/dest/cli/cmds/start_archiver.d.ts +2 -2
  38. package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
  39. package/dest/cli/cmds/start_archiver.js +25 -19
  40. package/dest/cli/cmds/start_bot.d.ts +4 -7
  41. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  42. package/dest/cli/cmds/start_bot.js +29 -14
  43. package/dest/cli/cmds/start_node.d.ts +3 -2
  44. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  45. package/dest/cli/cmds/start_node.js +128 -85
  46. package/dest/cli/cmds/start_p2p_bootstrap.d.ts +2 -2
  47. package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -1
  48. package/dest/cli/cmds/start_p2p_bootstrap.js +10 -6
  49. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  50. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  51. package/dest/cli/cmds/start_prover_agent.js +35 -6
  52. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  53. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  54. package/dest/cli/cmds/start_prover_broker.js +17 -5
  55. package/dest/cli/cmds/start_txe.d.ts +1 -1
  56. package/dest/cli/cmds/utils/artifacts.d.ts +21 -0
  57. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -0
  58. package/dest/cli/cmds/utils/artifacts.js +24 -0
  59. package/dest/cli/cmds/utils/needs_recompile.d.ts +10 -0
  60. package/dest/cli/cmds/utils/needs_recompile.d.ts.map +1 -0
  61. package/dest/cli/cmds/utils/needs_recompile.js +134 -0
  62. package/dest/cli/cmds/utils/spawn.d.ts +3 -0
  63. package/dest/cli/cmds/utils/spawn.d.ts.map +1 -0
  64. package/dest/cli/cmds/utils/spawn.js +16 -0
  65. package/dest/cli/index.d.ts +1 -1
  66. package/dest/cli/preload_crs.d.ts +3 -0
  67. package/dest/cli/preload_crs.d.ts.map +1 -0
  68. package/dest/cli/preload_crs.js +6 -0
  69. package/dest/cli/util.d.ts +37 -17
  70. package/dest/cli/util.d.ts.map +1 -1
  71. package/dest/cli/util.js +165 -31
  72. package/dest/cli/versioning.d.ts +1 -1
  73. package/dest/cli/versioning.js +3 -3
  74. package/dest/examples/token.d.ts +1 -1
  75. package/dest/examples/token.js +31 -18
  76. package/dest/examples/util.d.ts +5 -6
  77. package/dest/examples/util.d.ts.map +1 -1
  78. package/dest/examples/util.js +5 -6
  79. package/dest/index.d.ts +2 -2
  80. package/dest/index.d.ts.map +1 -1
  81. package/dest/index.js +1 -1
  82. package/dest/local-network/banana_fpc.d.ts +10 -0
  83. package/dest/local-network/banana_fpc.d.ts.map +1 -0
  84. package/dest/{sandbox → local-network}/banana_fpc.js +23 -25
  85. package/dest/local-network/index.d.ts +4 -0
  86. package/dest/local-network/index.d.ts.map +1 -0
  87. package/dest/local-network/index.js +3 -0
  88. package/dest/local-network/local-network.d.ts +73 -0
  89. package/dest/local-network/local-network.d.ts.map +1 -0
  90. package/dest/local-network/local-network.js +226 -0
  91. package/dest/local-network/sponsored_fpc.d.ts +5 -0
  92. package/dest/local-network/sponsored_fpc.d.ts.map +1 -0
  93. package/dest/local-network/sponsored_fpc.js +18 -0
  94. package/dest/mnemonic.d.ts +1 -1
  95. package/dest/splash.d.ts +1 -1
  96. package/dest/testing/anvil_test_watcher.d.ts +42 -0
  97. package/dest/testing/anvil_test_watcher.d.ts.map +1 -0
  98. package/dest/testing/anvil_test_watcher.js +181 -0
  99. package/dest/testing/cheat_codes.d.ts +43 -0
  100. package/dest/testing/cheat_codes.d.ts.map +1 -0
  101. package/dest/testing/cheat_codes.js +62 -0
  102. package/dest/testing/epoch_test_settler.d.ts +19 -0
  103. package/dest/testing/epoch_test_settler.d.ts.map +1 -0
  104. package/dest/testing/epoch_test_settler.js +61 -0
  105. package/dest/testing/index.d.ts +6 -0
  106. package/dest/testing/index.d.ts.map +1 -0
  107. package/dest/testing/index.js +5 -0
  108. package/dest/testing/token_allowed_setup.d.ts +7 -0
  109. package/dest/testing/token_allowed_setup.d.ts.map +1 -0
  110. package/dest/testing/token_allowed_setup.js +20 -0
  111. package/package.json +55 -45
  112. package/scripts/add_crate.sh +102 -0
  113. package/scripts/aztec.sh +69 -0
  114. package/scripts/init.sh +39 -0
  115. package/scripts/new.sh +83 -0
  116. package/scripts/setup_workspace.sh +68 -0
  117. package/src/bin/index.ts +33 -13
  118. package/src/cli/admin_api_key_store.ts +128 -0
  119. package/src/cli/aztec_start_action.ts +87 -41
  120. package/src/cli/aztec_start_options.ts +176 -218
  121. package/src/cli/cli.ts +19 -11
  122. package/src/cli/cmds/compile.ts +191 -0
  123. package/src/cli/cmds/migrate_ha_db.ts +43 -0
  124. package/src/cli/cmds/profile.ts +25 -0
  125. package/src/cli/cmds/profile_flamegraph.ts +64 -0
  126. package/src/cli/cmds/profile_gates.ts +68 -0
  127. package/src/cli/cmds/profile_utils.ts +58 -0
  128. package/src/cli/cmds/standby.ts +132 -0
  129. package/src/cli/cmds/start_archiver.ts +16 -21
  130. package/src/cli/cmds/start_bot.ts +40 -14
  131. package/src/cli/cmds/start_node.ts +146 -91
  132. package/src/cli/cmds/start_p2p_bootstrap.ts +14 -6
  133. package/src/cli/cmds/start_prover_agent.ts +26 -14
  134. package/src/cli/cmds/start_prover_broker.ts +28 -4
  135. package/src/cli/cmds/utils/artifacts.ts +44 -0
  136. package/src/cli/cmds/utils/needs_recompile.ts +151 -0
  137. package/src/cli/cmds/utils/spawn.ts +16 -0
  138. package/src/cli/preload_crs.ts +7 -0
  139. package/src/cli/util.ts +186 -50
  140. package/src/cli/versioning.ts +3 -3
  141. package/src/examples/token.ts +23 -19
  142. package/src/examples/util.ts +6 -8
  143. package/src/index.ts +5 -6
  144. package/src/{sandbox → local-network}/banana_fpc.ts +28 -29
  145. package/src/local-network/index.ts +7 -0
  146. package/src/local-network/local-network.ts +277 -0
  147. package/src/local-network/sponsored_fpc.ts +26 -0
  148. package/src/testing/anvil_test_watcher.ts +210 -0
  149. package/src/testing/cheat_codes.ts +79 -0
  150. package/src/testing/epoch_test_settler.ts +70 -0
  151. package/src/testing/index.ts +5 -0
  152. package/src/testing/token_allowed_setup.ts +19 -0
  153. package/dest/cli/chain_l2_config.d.ts +0 -19
  154. package/dest/cli/chain_l2_config.d.ts.map +0 -1
  155. package/dest/cli/chain_l2_config.js +0 -56
  156. package/dest/cli/cmds/start_blob_sink.d.ts +0 -3
  157. package/dest/cli/cmds/start_blob_sink.d.ts.map +0 -1
  158. package/dest/cli/cmds/start_blob_sink.js +0 -17
  159. package/dest/cli/cmds/start_faucet.d.ts +0 -4
  160. package/dest/cli/cmds/start_faucet.d.ts.map +0 -1
  161. package/dest/cli/cmds/start_faucet.js +0 -20
  162. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  163. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  164. package/dest/cli/cmds/start_prover_node.js +0 -110
  165. package/dest/cli/cmds/start_pxe.d.ts +0 -16
  166. package/dest/cli/cmds/start_pxe.d.ts.map +0 -1
  167. package/dest/cli/cmds/start_pxe.js +0 -95
  168. package/dest/cli/get_l1_config.d.ts +0 -7
  169. package/dest/cli/get_l1_config.d.ts.map +0 -1
  170. package/dest/cli/get_l1_config.js +0 -13
  171. package/dest/sandbox/banana_fpc.d.ts +0 -11
  172. package/dest/sandbox/banana_fpc.d.ts.map +0 -1
  173. package/dest/sandbox/index.d.ts +0 -5
  174. package/dest/sandbox/index.d.ts.map +0 -1
  175. package/dest/sandbox/index.js +0 -4
  176. package/dest/sandbox/sandbox.d.ts +0 -76
  177. package/dest/sandbox/sandbox.d.ts.map +0 -1
  178. package/dest/sandbox/sandbox.js +0 -181
  179. package/dest/sandbox/sponsored_fee_payment_method.d.ts +0 -23
  180. package/dest/sandbox/sponsored_fee_payment_method.d.ts.map +0 -1
  181. package/dest/sandbox/sponsored_fee_payment_method.js +0 -36
  182. package/dest/sandbox/sponsored_fpc.d.ts +0 -6
  183. package/dest/sandbox/sponsored_fpc.d.ts.map +0 -1
  184. package/dest/sandbox/sponsored_fpc.js +0 -26
  185. package/src/cli/chain_l2_config.ts +0 -74
  186. package/src/cli/cmds/start_blob_sink.ts +0 -31
  187. package/src/cli/cmds/start_faucet.ts +0 -34
  188. package/src/cli/cmds/start_prover_node.ts +0 -121
  189. package/src/cli/cmds/start_pxe.ts +0 -129
  190. package/src/cli/get_l1_config.ts +0 -18
  191. package/src/sandbox/index.ts +0 -5
  192. package/src/sandbox/sandbox.ts +0 -229
  193. package/src/sandbox/sponsored_fee_payment_method.ts +0 -46
  194. package/src/sandbox/sponsored_fpc.ts +0 -38
@@ -0,0 +1,151 @@
1
+ import TOML from '@iarna/toml';
2
+ import { readFile, readdir, stat } from 'fs/promises';
3
+ import { join, resolve } from 'path';
4
+
5
+ /**
6
+ * Returns true if recompilation is needed: either no artifacts exist in target/ or any .nr or Nargo.toml source file
7
+ * (including path-based dependencies) is newer than the oldest artifact. We compare against the oldest artifact so
8
+ * that a source change between the oldest and newest compilation (e.g. in a multi-contract workspace) still triggers
9
+ * a recompile.
10
+ *
11
+ * Note: The above implies that if there is a random json file in the target dir we would be always recompiling.
12
+ */
13
+ export async function needsRecompile(): Promise<boolean> {
14
+ const oldestArtifactMs = await getOldestArtifactModificationTime('target');
15
+ if (oldestArtifactMs === undefined) {
16
+ return true;
17
+ }
18
+
19
+ const crateDirs = await collectCrateDirs('.');
20
+ return hasNewerSourceFile(crateDirs, oldestArtifactMs);
21
+ }
22
+
23
+ /**
24
+ * Returns the last modification time (timestamp in ms) of the oldest .json artifact in targetDir, or undefined if
25
+ * none exist.
26
+ */
27
+ async function getOldestArtifactModificationTime(targetDir: string): Promise<number | undefined> {
28
+ let entries: string[];
29
+ try {
30
+ entries = (await readdir(targetDir)).filter(f => f.endsWith('.json'));
31
+ } catch (err: any) {
32
+ if (err?.code === 'ENOENT') {
33
+ return undefined;
34
+ }
35
+ throw err;
36
+ }
37
+
38
+ if (entries.length === 0) {
39
+ return undefined;
40
+ }
41
+
42
+ let oldest = Infinity;
43
+ for (const entry of entries) {
44
+ const s = await stat(join(targetDir, entry));
45
+ if (s.mtimeMs < oldest) {
46
+ oldest = s.mtimeMs;
47
+ }
48
+ }
49
+ return oldest;
50
+ }
51
+
52
+ /**
53
+ * Recursively collects crate directories starting from startCrateDir by following path-based dependencies declared in
54
+ * Nargo.toml files. Git-based deps are ignored (they only change when Nargo.toml itself is modified since the deps are
55
+ * tagged).
56
+ */
57
+ async function collectCrateDirs(startCrateDir: string): Promise<string[]> {
58
+ // We have a set of visited dirs we check against when entering a new dir because we could stumble upon a directory
59
+ // multiple times in case multiple deps shared a dep (e.g. dep A and dep B both sharing dep C).
60
+ const visited = new Set<string>();
61
+
62
+ async function visit(crateDir: string): Promise<void> {
63
+ const absDir = resolve(crateDir);
64
+ if (visited.has(absDir)) {
65
+ return;
66
+ }
67
+ visited.add(absDir);
68
+
69
+ // Every dep is its own crate and every crate needs to have Nargo.toml defined in the root so we try to load it and
70
+ // error out if it's not the case.
71
+ const tomlPath = join(absDir, 'Nargo.toml');
72
+ const content = await readFile(tomlPath, 'utf-8').catch(() => {
73
+ throw new Error(`Incorrectly defined dependency. Nargo.toml not found in ${absDir}`);
74
+ });
75
+
76
+ const parsed = TOML.parse(content) as Record<string, any>;
77
+
78
+ const members = (parsed.workspace as Record<string, any>)?.members as string[] | undefined;
79
+
80
+ // A Nargo.toml is either a workspace root (has workspace.members) or a single crate (has dependencies).
81
+ if (Array.isArray(members)) {
82
+ // The crate is a workspace root and has members defined so we visit the members
83
+ for (const member of members) {
84
+ const memberPath = resolve(absDir, member);
85
+ await visit(memberPath);
86
+ }
87
+ } else {
88
+ // The crate is not a workspace root so we check for dependencies
89
+ const deps = (parsed.dependencies as Record<string, any>) ?? {};
90
+ for (const dep of Object.values(deps)) {
91
+ if (dep && typeof dep === 'object' && typeof dep.path === 'string') {
92
+ const depPath = resolve(absDir, dep.path);
93
+ const s = await stat(depPath);
94
+ if (!s.isDirectory()) {
95
+ throw new Error(
96
+ `Dependency path "${dep.path}" in ${tomlPath} resolves to ${depPath} which is not a directory`,
97
+ );
98
+ }
99
+ await visit(depPath);
100
+ }
101
+ }
102
+ }
103
+ }
104
+
105
+ await visit(startCrateDir);
106
+ return [...visited];
107
+ }
108
+
109
+ /**
110
+ * Walks crate dirs looking for .nr and Nargo.toml files newer than thresholdMs. Short-circuits on the first match.
111
+ */
112
+ async function hasNewerSourceFile(crateDirs: string[], thresholdMs: number): Promise<boolean> {
113
+ // Returns true if it find a new file than thresholdMs, false otherwise
114
+ async function walkForNewer(dir: string): Promise<boolean> {
115
+ let entries;
116
+ try {
117
+ entries = await readdir(dir, { withFileTypes: true });
118
+ } catch {
119
+ return false;
120
+ }
121
+
122
+ // We iterate over the entries in the dir
123
+ for (const entry of entries) {
124
+ const fullPath = join(dir, entry.name);
125
+ if (entry.isDirectory()) {
126
+ // If the entry is a dir and it's not called `target` we recursively enter it
127
+ if (entry.name === 'target') {
128
+ continue;
129
+ }
130
+ if (await walkForNewer(fullPath)) {
131
+ return true;
132
+ }
133
+ } else if (entry.name === 'Nargo.toml' || entry.name.endsWith('.nr')) {
134
+ // The entry is a Nargo.toml file or *.nr file so we check the timestamp
135
+ const s = await stat(fullPath);
136
+ if (s.mtimeMs > thresholdMs) {
137
+ return true;
138
+ }
139
+ }
140
+ }
141
+ return false;
142
+ }
143
+
144
+ // We search through the crate dirs
145
+ for (const dir of crateDirs) {
146
+ if (await walkForNewer(dir)) {
147
+ return true;
148
+ }
149
+ }
150
+ return false;
151
+ }
@@ -0,0 +1,16 @@
1
+ import { spawn } from 'child_process';
2
+
3
+ /** Spawns a command with inherited stdio and rejects on non-zero exit. */
4
+ export function run(cmd: string, args: string[]): Promise<void> {
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn(cmd, args, { stdio: 'inherit' });
7
+ child.on('error', reject);
8
+ child.on('close', code => {
9
+ if (code !== 0) {
10
+ reject(new Error(`${cmd} exited with code ${code}`));
11
+ } else {
12
+ resolve();
13
+ }
14
+ });
15
+ });
16
+ }
@@ -0,0 +1,7 @@
1
+ import type { LogFn, Logger } from '@aztec/foundation/log';
2
+
3
+ import { preloadCrsDataForServerSideProving } from './util.js';
4
+
5
+ export async function preloadCrs(_options: any, userLog: LogFn, _debugLogger: Logger) {
6
+ await preloadCrsDataForServerSideProving({ realProofs: true }, userLog);
7
+ }
package/src/cli/util.ts CHANGED
@@ -1,56 +1,87 @@
1
- import type { AccountManager, Fr } from '@aztec/aztec.js';
2
- import type { ConfigMappingsType } from '@aztec/foundation/config';
3
- import type { LogFn } from '@aztec/foundation/log';
4
- import type { PXEService } from '@aztec/pxe/server';
1
+ import type { AztecNodeConfig } from '@aztec/aztec-node';
2
+ import type { AccountManager } from '@aztec/aztec.js/wallet';
3
+ import { getNetworkConfig } from '@aztec/cli/config';
4
+ import { RegistryContract } from '@aztec/ethereum/contracts';
5
+ import type { ViemClient } from '@aztec/ethereum/types';
6
+ import type { ConfigMappingsType, NetworkNames } from '@aztec/foundation/config';
7
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
8
+ import { type LogFn, createLogger } from '@aztec/foundation/log';
9
+ import type { ProverConfig } from '@aztec/stdlib/interfaces/server';
10
+ import { type VersionCheck, getPackageVersion } from '@aztec/stdlib/update-checker';
11
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
5
12
 
6
13
  import chalk from 'chalk';
7
14
  import type { Command } from 'commander';
15
+ import type { Hex } from 'viem';
8
16
 
9
17
  import { type AztecStartOption, aztecStartOptions } from './aztec_start_options.js';
10
18
 
19
+ export const enum ExitCode {
20
+ SUCCESS = 0,
21
+ ERROR = 1,
22
+ ROLLUP_UPGRADE = 78, // EX_CONFIG from FreeBSD (https://man.freebsd.org/cgi/man.cgi?query=sysexits)
23
+ VERSION_UPGRADE = 79, // prev + 1 because there's nothing better
24
+ // 128 + int(SIGNAL)
25
+ SIGHUP = 129,
26
+ SIGINT = 130,
27
+ SIGQUIT = 131,
28
+ SIGTERM = 143,
29
+ }
30
+
31
+ let shutdownPromise: Promise<never> | undefined;
32
+ export function shutdown(logFn: LogFn, exitCode: ExitCode, cb?: Array<() => Promise<void>>): Promise<never> {
33
+ if (shutdownPromise) {
34
+ logFn('Already shutting down.');
35
+ return shutdownPromise;
36
+ }
37
+
38
+ logFn('Shutting down...', { exitCode });
39
+ if (cb) {
40
+ shutdownPromise = Promise.allSettled(cb.map(fn => fn())).then(() => process.exit(exitCode));
41
+ } else {
42
+ // synchronously shuts down the process
43
+ // no need to set shutdownPromise on this branch of the if statement because no more code will be executed
44
+ process.exit(exitCode);
45
+ }
46
+
47
+ return shutdownPromise;
48
+ }
49
+
50
+ export function isShuttingDown(): boolean {
51
+ return shutdownPromise !== undefined;
52
+ }
53
+
11
54
  export const installSignalHandlers = (logFn: LogFn, cb?: Array<() => Promise<void>>) => {
12
- const shutdown = async () => {
13
- logFn('Shutting down...');
14
- if (cb) {
15
- await Promise.all(cb);
16
- }
17
- process.exit(0);
18
- };
19
- process.removeAllListeners('SIGINT');
20
- process.removeAllListeners('SIGTERM');
21
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
22
- process.once('SIGINT', shutdown);
23
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
24
- process.once('SIGTERM', shutdown);
55
+ const signals = [
56
+ ['SIGINT', ExitCode.SIGINT],
57
+ ['SIGTERM', ExitCode.SIGTERM],
58
+ ['SIGHUP', ExitCode.SIGHUP],
59
+ ['SIQUIT', ExitCode.SIGQUIT],
60
+ ] as const;
61
+
62
+ for (const [signal, exitCode] of signals) {
63
+ process.removeAllListeners(signal);
64
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
65
+ process.once(signal, () => shutdown(logFn, exitCode, cb));
66
+ }
25
67
  };
26
68
 
27
69
  /**
28
70
  * Creates logs for the initial accounts
29
71
  * @param accounts - The initial accounts
30
- * @param pxe - A PXE instance to get the registered accounts
72
+ * @param wallet - A EmbeddedWallet instance to get the registered accounts
31
73
  * @returns A string array containing the initial accounts details
32
74
  */
33
- export async function createAccountLogs(
34
- accountsWithSecretKeys: {
35
- /**
36
- * The account object
37
- */
38
- account: AccountManager;
39
- /**
40
- * The secret key of the account
41
- */
42
- secretKey: Fr;
43
- }[],
44
- pxe: PXEService,
45
- ) {
46
- const registeredAccounts = await pxe.getRegisteredAccounts();
75
+ export async function createAccountLogs(accountManagers: AccountManager[], wallet: EmbeddedWallet) {
76
+ const registeredAccounts = await wallet.getAccounts();
47
77
  const accountLogStrings = [`Initial Accounts:\n\n`];
48
- for (const accountWithSecretKey of accountsWithSecretKeys) {
49
- const completeAddress = await accountWithSecretKey.account.getCompleteAddress();
50
- if (registeredAccounts.find(a => a.equals(completeAddress))) {
78
+ for (const accountManager of accountManagers) {
79
+ const account = await accountManager.getAccount();
80
+ const completeAddress = account.getCompleteAddress();
81
+ if (registeredAccounts.find(a => a.item.equals(completeAddress.address))) {
51
82
  accountLogStrings.push(` Address: ${completeAddress.address.toString()}\n`);
52
83
  accountLogStrings.push(` Partial Address: ${completeAddress.partialAddress.toString()}\n`);
53
- accountLogStrings.push(` Secret Key: ${accountWithSecretKey.secretKey.toString()}\n`);
84
+ accountLogStrings.push(` Secret Key: ${account.getSecretKey().toString()}\n`);
54
85
  accountLogStrings.push(
55
86
  ` Master nullifier public key: ${completeAddress.publicKeys.masterNullifierPublicKey.toString()}\n`,
56
87
  );
@@ -102,18 +133,32 @@ export function formatHelpLine(
102
133
 
103
134
  const getDefaultOrEnvValue = (opt: AztecStartOption) => {
104
135
  let val;
105
- // if the option is set in the environment, use that & parse it
106
- if (opt.envVar && process.env[opt.envVar]) {
107
- val = process.env[opt.envVar];
108
- if (val && opt.parseVal) {
109
- return opt.parseVal(val);
136
+
137
+ // if the option is set in the environment, use that
138
+ if (opt.env) {
139
+ val = process.env[opt.env];
140
+ }
141
+
142
+ // if we have fallback env vars, check those
143
+ if (!val && opt.fallback && opt.fallback.length > 0) {
144
+ for (const fallback of opt.fallback) {
145
+ val = process.env[fallback];
146
+ if (val) {
147
+ break;
148
+ }
110
149
  }
111
- // if no env variable, use the default value
112
- } else if (opt.defaultValue) {
113
- val = opt.defaultValue;
114
150
  }
115
151
 
116
- return val;
152
+ // if we have a value, optionally parse it and return
153
+ if (val) {
154
+ if (opt.parseVal) {
155
+ return opt.parseVal(val);
156
+ }
157
+ return val;
158
+ } else if (opt.defaultValue !== undefined) {
159
+ return opt.defaultValue;
160
+ }
161
+ return undefined;
117
162
  };
118
163
 
119
164
  // Function to add options dynamically
@@ -121,7 +166,7 @@ export const addOptions = (cmd: Command, options: AztecStartOption[]) => {
121
166
  options.forEach(opt => {
122
167
  cmd.option(
123
168
  opt.flag,
124
- `${opt.description} (default: ${opt.defaultValue}) ($${opt.envVar})`,
169
+ `${opt.description} (default: ${opt.defaultValue}) ($${opt.env})`,
125
170
  opt.parseVal ? opt.parseVal : val => val,
126
171
  getDefaultOrEnvValue(opt),
127
172
  );
@@ -137,10 +182,11 @@ export const printAztecStartHelpText = () => {
137
182
  helpTextLines.push('');
138
183
 
139
184
  aztecStartOptions[category].forEach(opt => {
140
- const defaultValueText = opt.defaultValue
141
- ? `(default: ${opt.printDefault ? opt.printDefault(opt.defaultValue) : opt.defaultValue})`
142
- : '';
143
- const envVarText = opt.envVar ? `($${opt.envVar})` : '';
185
+ const defaultValueText =
186
+ opt.defaultValue || (Array.isArray(opt.defaultValue) && opt.defaultValue.length > 0)
187
+ ? `(default: ${opt.printDefault ? opt.printDefault(opt.defaultValue) : opt.defaultValue})`
188
+ : '';
189
+ const envVarText = opt.env ? `($${opt.env})` : '';
144
190
  const flagText = `${opt.flag}`;
145
191
 
146
192
  const paddedText = formatHelpLine(flagText, defaultValueText, envVarText, maxFlagLength, maxDefaultLength);
@@ -214,3 +260,93 @@ export const extractRelevantOptions = <T>(
214
260
 
215
261
  return relevantOptions;
216
262
  };
263
+
264
+ /**
265
+ * Downloads just enough points to be able to verify Chonk proofs.
266
+ * @param opts - Whether proof are to be verifier
267
+ * @param log - Logging function
268
+ */
269
+ export async function preloadCrsDataForVerifying(
270
+ { realProofs }: Pick<AztecNodeConfig, 'realProofs'>,
271
+ log: LogFn,
272
+ ): Promise<void> {
273
+ if (realProofs) {
274
+ const { Crs, GrumpkinCrs } = await import('@aztec/bb.js');
275
+ await Promise.all([Crs.new(2 ** 1, undefined, log), GrumpkinCrs.new(2 ** 16, undefined, log)]);
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Downloads enough points to be able to prove every server-side circuit
281
+ * @param opts - Whether real proof are to be generated
282
+ * @param log - Logging function
283
+ */
284
+ export async function preloadCrsDataForServerSideProving(
285
+ { realProofs }: Pick<ProverConfig, 'realProofs'>,
286
+ log: LogFn,
287
+ ): Promise<void> {
288
+ if (realProofs) {
289
+ const { Crs, GrumpkinCrs } = await import('@aztec/bb.js');
290
+ await Promise.all([Crs.new(2 ** 25, undefined, log), GrumpkinCrs.new(2 ** 18, undefined, log)]);
291
+ }
292
+ }
293
+
294
+ export async function setupVersionChecker(
295
+ network: NetworkNames,
296
+ followsCanonicalRollup: boolean,
297
+ publicClient: ViemClient,
298
+ signalHandlers: Array<() => Promise<void>>,
299
+ cacheDir?: string,
300
+ ): Promise<void> {
301
+ const networkConfig = await getNetworkConfig(network, cacheDir);
302
+ if (!networkConfig) {
303
+ return;
304
+ }
305
+
306
+ const { VersionChecker } = await import('@aztec/stdlib/update-checker');
307
+
308
+ const logger = createLogger('version_check');
309
+ const registry = new RegistryContract(publicClient, networkConfig.registryAddress as Hex);
310
+
311
+ const checks: Array<VersionCheck> = [];
312
+ checks.push({
313
+ name: 'node',
314
+ currentVersion: getPackageVersion() ?? 'unknown',
315
+ getLatestVersion: async () => {
316
+ const cfg = await getNetworkConfig(network, cacheDir);
317
+ return cfg?.nodeVersion;
318
+ },
319
+ });
320
+
321
+ if (followsCanonicalRollup) {
322
+ const getLatestVersion = async () => {
323
+ const version = (await registry.getRollupVersions()).at(-1);
324
+ return version !== undefined ? String(version) : undefined;
325
+ };
326
+ const currentVersion = await getLatestVersion();
327
+ if (currentVersion !== undefined) {
328
+ checks.push({
329
+ name: 'rollup',
330
+ currentVersion,
331
+ getLatestVersion,
332
+ });
333
+ }
334
+ }
335
+
336
+ const checker = new VersionChecker(checks, 600_000, logger);
337
+ checker.on('newVersion', ({ name, latestVersion, currentVersion }) => {
338
+ if (isShuttingDown()) {
339
+ return;
340
+ }
341
+
342
+ logger.warn(`New ${name} version available`, { latestVersion, currentVersion });
343
+ });
344
+ checker.start();
345
+ signalHandlers.push(() => checker.stop());
346
+ }
347
+
348
+ export function stringifyConfig(config: object): string {
349
+ return Object.entries(config)
350
+ .map(([key, value]) => `${key}=${jsonStringify(value)}`)
351
+ .join(' ');
352
+ }
@@ -1,13 +1,13 @@
1
1
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
2
- import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
2
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
3
3
  import type { ChainConfig } from '@aztec/stdlib/config';
4
4
  import { type ComponentsVersions, getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
5
5
 
6
6
  export function getVersions(config?: ChainConfig): Partial<ComponentsVersions> {
7
7
  return config
8
- ? getComponentsVersionsFromConfig(config, protocolContractTreeRoot, getVKTreeRoot())
8
+ ? getComponentsVersionsFromConfig(config, protocolContractsHash, getVKTreeRoot())
9
9
  : {
10
10
  l2CircuitsVkTreeRoot: getVKTreeRoot().toString(),
11
- l2ProtocolContractsTreeRoot: protocolContractTreeRoot.toString(),
11
+ l2ProtocolContractsHash: protocolContractsHash.toString(),
12
12
  };
13
13
  }
@@ -1,13 +1,14 @@
1
- import { getDeployedTestAccountsWallets } from '@aztec/accounts/testing';
2
- import { createPXEClient } from '@aztec/aztec.js';
1
+ import { getInitialTestAccountsData } from '@aztec/accounts/testing';
2
+ import { createAztecNodeClient } from '@aztec/aztec.js/node';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
5
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
5
6
 
6
7
  const logger = createLogger('example:token');
7
8
 
8
- const url = 'http://localhost:8080';
9
+ const nodeUrl = 'http://localhost:8080';
9
10
 
10
- const pxe = createPXEClient(url);
11
+ const node = createAztecNodeClient(nodeUrl);
11
12
 
12
13
  const ALICE_MINT_BALANCE = 333n;
13
14
  const TRANSFER_AMOUNT = 33n;
@@ -18,39 +19,42 @@ const TRANSFER_AMOUNT = 33n;
18
19
  async function main() {
19
20
  logger.info('Running token contract test on HTTP interface.');
20
21
 
21
- const [aliceWallet, bobWallet] = await getDeployedTestAccountsWallets(pxe);
22
- const alice = aliceWallet.getCompleteAddress();
23
- const bob = bobWallet.getCompleteAddress();
22
+ const wallet = await EmbeddedWallet.create(node);
24
23
 
25
- logger.info(`Fetched Alice and Bob accounts: ${alice.address.toString()}, ${bob.address.toString()}`);
24
+ // During local network setup we deploy a few accounts. Below we add them to our wallet.
25
+ const [aliceInitialAccountData, bobInitialAccountData] = await getInitialTestAccountsData();
26
+ await wallet.createSchnorrAccount(aliceInitialAccountData.secret, aliceInitialAccountData.salt);
27
+ await wallet.createSchnorrAccount(bobInitialAccountData.secret, bobInitialAccountData.salt);
28
+
29
+ const alice = aliceInitialAccountData.address;
30
+ const bob = bobInitialAccountData.address;
31
+
32
+ logger.info(`Fetched Alice and Bob accounts: ${alice.toString()}, ${bob.toString()}`);
26
33
 
27
34
  logger.info('Deploying Token...');
28
- const token = await TokenContract.deploy(aliceWallet, alice, 'TokenName', 'TokenSymbol', 18).send().deployed();
35
+ const { contract: token } = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({
36
+ from: alice,
37
+ });
29
38
  logger.info('Token deployed');
30
39
 
31
- // Create the contract abstraction and link it to Alice's and Bob's wallet for future signing
32
- const tokenAlice = await TokenContract.at(token.address, aliceWallet);
33
- const tokenBob = await TokenContract.at(token.address, bobWallet);
34
-
35
40
  // Mint tokens to Alice
36
41
  logger.info(`Minting ${ALICE_MINT_BALANCE} more coins to Alice...`);
37
- const from = aliceWallet.getAddress(); // we are setting from to Alice here because we need a sender to calculate the tag
38
- await tokenAlice.methods.mint_to_private(from, aliceWallet.getAddress(), ALICE_MINT_BALANCE).send().wait();
42
+ await token.methods.mint_to_private(alice, ALICE_MINT_BALANCE).send({ from: alice });
39
43
 
40
44
  logger.info(`${ALICE_MINT_BALANCE} tokens were successfully minted by Alice and transferred to private`);
41
45
 
42
- const balanceAfterMint = await tokenAlice.methods.balance_of_private(alice).simulate();
46
+ const { result: balanceAfterMint } = await token.methods.balance_of_private(alice).simulate({ from: alice });
43
47
  logger.info(`Tokens successfully minted. New Alice's balance: ${balanceAfterMint}`);
44
48
 
45
49
  // We will now transfer tokens from Alice to Bob
46
50
  logger.info(`Transferring ${TRANSFER_AMOUNT} tokens from Alice to Bob...`);
47
- await tokenAlice.methods.transfer(bob, TRANSFER_AMOUNT).send().wait();
51
+ await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice });
48
52
 
49
53
  // Check the new balances
50
- const aliceBalance = await tokenAlice.methods.balance_of_private(alice).simulate();
54
+ const { result: aliceBalance } = await token.methods.balance_of_private(alice).simulate({ from: alice });
51
55
  logger.info(`Alice's balance ${aliceBalance}`);
52
56
 
53
- const bobBalance = await tokenBob.methods.balance_of_private(bob).simulate();
57
+ const { result: bobBalance } = await token.methods.balance_of_private(bob).simulate({ from: bob });
54
58
  logger.info(`Bob's balance ${bobBalance}`);
55
59
  }
56
60
 
@@ -1,5 +1,5 @@
1
- import { EthAddress } from '@aztec/aztec.js';
2
- import type { ViemPublicClient, ViemWalletClient } from '@aztec/ethereum';
1
+ import { EthAddress } from '@aztec/aztec.js/addresses';
2
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
3
3
  import { jsonStringify } from '@aztec/foundation/json-rpc';
4
4
 
5
5
  import type { Abi, Narrow } from 'abitype';
@@ -7,27 +7,25 @@ import type { Hex } from 'viem';
7
7
 
8
8
  /**
9
9
  * Helper function to deploy ETH contracts.
10
- * @param walletClient - A viem WalletClient.
11
- * @param publicClient - A viem PublicClient.
10
+ * @param l1Client - A viem WalletClient extended with public actions.
12
11
  * @param abi - The ETH contract's ABI (as abitype's Abi).
13
12
  * @param bytecode - The ETH contract's bytecode.
14
13
  * @param args - Constructor arguments for the contract.
15
14
  * @returns The ETH address the contract was deployed to.
16
15
  */
17
16
  export async function deployL1Contract(
18
- walletClient: ViemWalletClient,
19
- publicClient: ViemPublicClient,
17
+ l1Client: ExtendedViemWalletClient,
20
18
  abi: Narrow<Abi | readonly unknown[]>,
21
19
  bytecode: Hex,
22
20
  args: readonly unknown[] = [],
23
21
  ): Promise<EthAddress> {
24
- const hash = await walletClient.deployContract({
22
+ const hash = await l1Client.deployContract({
25
23
  abi,
26
24
  bytecode,
27
25
  args,
28
26
  });
29
27
 
30
- const receipt = await publicClient.waitForTransactionReceipt({ hash });
28
+ const receipt = await l1Client.waitForTransactionReceipt({ hash });
31
29
  const contractAddress = receipt.contractAddress;
32
30
  if (!contractAddress) {
33
31
  throw new Error(`No contract address found in receipt: ${jsonStringify(receipt)}`);
package/src/index.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export {
2
- createSandbox,
3
- getDeployedBananaCoinAddress,
4
- getDeployedBananaFPCAddress,
5
- getDeployedSponsoredFPCAddress,
6
- SponsoredFeePaymentMethod,
7
- } from './sandbox/index.js';
2
+ createLocalNetwork,
3
+ registerDeployedBananaCoinInWalletAndGetAddress,
4
+ registerDeployedBananaFPCInWalletAndGetAddress,
5
+ registerDeployedSponsoredFPCInWalletAndGetAddress,
6
+ } from './local-network/index.js';