@aztec/aztec 0.0.0-test.0 → 0.0.1-commit.03f7ef2

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 (148) hide show
  1. package/README.md +1 -1
  2. package/dest/bin/index.d.ts +1 -1
  3. package/dest/bin/index.js +21 -12
  4. package/dest/cli/aztec_start_action.d.ts +1 -1
  5. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  6. package/dest/cli/aztec_start_action.js +35 -40
  7. package/dest/cli/aztec_start_options.d.ts +5 -3
  8. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  9. package/dest/cli/aztec_start_options.js +143 -224
  10. package/dest/cli/cli.d.ts +1 -1
  11. package/dest/cli/cli.d.ts.map +1 -1
  12. package/dest/cli/cli.js +39 -2
  13. package/dest/cli/cmds/start_archiver.d.ts +1 -1
  14. package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
  15. package/dest/cli/cmds/start_archiver.js +20 -12
  16. package/dest/cli/cmds/start_bot.d.ts +4 -7
  17. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  18. package/dest/cli/cmds/start_bot.js +25 -14
  19. package/dest/cli/cmds/start_node.d.ts +2 -2
  20. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  21. package/dest/cli/cmds/start_node.js +68 -81
  22. package/dest/cli/cmds/start_p2p_bootstrap.d.ts +1 -1
  23. package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -1
  24. package/dest/cli/cmds/start_p2p_bootstrap.js +9 -4
  25. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  26. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  27. package/dest/cli/cmds/start_prover_agent.js +32 -3
  28. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  29. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  30. package/dest/cli/cmds/start_prover_broker.js +10 -4
  31. package/dest/cli/cmds/start_prover_node.d.ts +1 -1
  32. package/dest/cli/cmds/start_prover_node.d.ts.map +1 -1
  33. package/dest/cli/cmds/start_prover_node.js +44 -46
  34. package/dest/cli/cmds/start_txe.d.ts +1 -1
  35. package/dest/cli/index.d.ts +1 -1
  36. package/dest/cli/preload_crs.d.ts +3 -0
  37. package/dest/cli/preload_crs.d.ts.map +1 -0
  38. package/dest/cli/preload_crs.js +6 -0
  39. package/dest/cli/release_version.d.ts +2 -0
  40. package/dest/cli/release_version.d.ts.map +1 -0
  41. package/dest/cli/release_version.js +14 -0
  42. package/dest/cli/util.d.ts +38 -7
  43. package/dest/cli/util.d.ts.map +1 -1
  44. package/dest/cli/util.js +198 -28
  45. package/dest/cli/versioning.d.ts +1 -1
  46. package/dest/cli/versioning.js +3 -3
  47. package/dest/examples/token.d.ts +1 -1
  48. package/dest/examples/token.js +31 -18
  49. package/dest/examples/util.d.ts +5 -6
  50. package/dest/examples/util.d.ts.map +1 -1
  51. package/dest/examples/util.js +5 -6
  52. package/dest/index.d.ts +2 -2
  53. package/dest/index.d.ts.map +1 -1
  54. package/dest/index.js +1 -1
  55. package/dest/local-network/banana_fpc.d.ts +10 -0
  56. package/dest/local-network/banana_fpc.d.ts.map +1 -0
  57. package/dest/{sandbox → local-network}/banana_fpc.js +20 -22
  58. package/dest/local-network/index.d.ts +4 -0
  59. package/dest/local-network/index.d.ts.map +1 -0
  60. package/dest/local-network/index.js +3 -0
  61. package/dest/local-network/local-network.d.ts +72 -0
  62. package/dest/local-network/local-network.d.ts.map +1 -0
  63. package/dest/local-network/local-network.js +182 -0
  64. package/dest/local-network/sponsored_fpc.d.ts +5 -0
  65. package/dest/local-network/sponsored_fpc.d.ts.map +1 -0
  66. package/dest/local-network/sponsored_fpc.js +18 -0
  67. package/dest/mnemonic.d.ts +1 -1
  68. package/dest/splash.d.ts +1 -1
  69. package/dest/testing/anvil_test_watcher.d.ts +34 -0
  70. package/dest/testing/anvil_test_watcher.d.ts.map +1 -0
  71. package/dest/testing/anvil_test_watcher.js +144 -0
  72. package/dest/testing/cheat_codes.d.ts +41 -0
  73. package/dest/testing/cheat_codes.d.ts.map +1 -0
  74. package/dest/testing/cheat_codes.js +62 -0
  75. package/dest/testing/index.d.ts +4 -0
  76. package/dest/testing/index.d.ts.map +1 -0
  77. package/dest/testing/index.js +3 -0
  78. package/package.json +54 -45
  79. package/scripts/aztec.sh +56 -0
  80. package/scripts/compile.sh +44 -0
  81. package/scripts/extract_function.js +47 -0
  82. package/scripts/flamegraph.sh +59 -0
  83. package/scripts/init.sh +35 -0
  84. package/scripts/new.sh +59 -0
  85. package/scripts/setup_project.sh +31 -0
  86. package/src/bin/index.ts +26 -12
  87. package/src/cli/aztec_start_action.ts +31 -38
  88. package/src/cli/aztec_start_options.ts +159 -222
  89. package/src/cli/cli.ts +46 -5
  90. package/src/cli/cmds/start_archiver.ts +21 -15
  91. package/src/cli/cmds/start_bot.ts +36 -13
  92. package/src/cli/cmds/start_node.ts +91 -86
  93. package/src/cli/cmds/start_p2p_bootstrap.ts +12 -4
  94. package/src/cli/cmds/start_prover_agent.ts +23 -3
  95. package/src/cli/cmds/start_prover_broker.ts +24 -4
  96. package/src/cli/cmds/start_prover_node.ts +54 -51
  97. package/src/cli/preload_crs.ts +7 -0
  98. package/src/cli/release_version.ts +21 -0
  99. package/src/cli/util.ts +208 -34
  100. package/src/cli/versioning.ts +3 -3
  101. package/src/examples/token.ts +23 -19
  102. package/src/examples/util.ts +6 -8
  103. package/src/index.ts +5 -6
  104. package/src/{sandbox → local-network}/banana_fpc.ts +21 -26
  105. package/src/local-network/index.ts +7 -0
  106. package/src/local-network/local-network.ts +222 -0
  107. package/src/local-network/sponsored_fpc.ts +26 -0
  108. package/src/testing/anvil_test_watcher.ts +166 -0
  109. package/src/testing/cheat_codes.ts +79 -0
  110. package/src/testing/index.ts +3 -0
  111. package/dest/cli/chain_l2_config.d.ts +0 -19
  112. package/dest/cli/chain_l2_config.d.ts.map +0 -1
  113. package/dest/cli/chain_l2_config.js +0 -56
  114. package/dest/cli/cmds/start_blob_sink.d.ts +0 -3
  115. package/dest/cli/cmds/start_blob_sink.d.ts.map +0 -1
  116. package/dest/cli/cmds/start_blob_sink.js +0 -17
  117. package/dest/cli/cmds/start_faucet.d.ts +0 -4
  118. package/dest/cli/cmds/start_faucet.d.ts.map +0 -1
  119. package/dest/cli/cmds/start_faucet.js +0 -20
  120. package/dest/cli/cmds/start_pxe.d.ts +0 -16
  121. package/dest/cli/cmds/start_pxe.d.ts.map +0 -1
  122. package/dest/cli/cmds/start_pxe.js +0 -95
  123. package/dest/cli/get_l1_config.d.ts +0 -7
  124. package/dest/cli/get_l1_config.d.ts.map +0 -1
  125. package/dest/cli/get_l1_config.js +0 -13
  126. package/dest/sandbox/banana_fpc.d.ts +0 -11
  127. package/dest/sandbox/banana_fpc.d.ts.map +0 -1
  128. package/dest/sandbox/index.d.ts +0 -5
  129. package/dest/sandbox/index.d.ts.map +0 -1
  130. package/dest/sandbox/index.js +0 -4
  131. package/dest/sandbox/sandbox.d.ts +0 -76
  132. package/dest/sandbox/sandbox.d.ts.map +0 -1
  133. package/dest/sandbox/sandbox.js +0 -181
  134. package/dest/sandbox/sponsored_fee_payment_method.d.ts +0 -23
  135. package/dest/sandbox/sponsored_fee_payment_method.d.ts.map +0 -1
  136. package/dest/sandbox/sponsored_fee_payment_method.js +0 -36
  137. package/dest/sandbox/sponsored_fpc.d.ts +0 -6
  138. package/dest/sandbox/sponsored_fpc.d.ts.map +0 -1
  139. package/dest/sandbox/sponsored_fpc.js +0 -26
  140. package/src/cli/chain_l2_config.ts +0 -74
  141. package/src/cli/cmds/start_blob_sink.ts +0 -31
  142. package/src/cli/cmds/start_faucet.ts +0 -34
  143. package/src/cli/cmds/start_pxe.ts +0 -129
  144. package/src/cli/get_l1_config.ts +0 -18
  145. package/src/sandbox/index.ts +0 -5
  146. package/src/sandbox/sandbox.ts +0 -229
  147. package/src/sandbox/sponsored_fee_payment_method.ts +0 -46
  148. package/src/sandbox/sponsored_fpc.ts +0 -38
@@ -1,5 +1,8 @@
1
- import { getInitialTestAccounts } from '@aztec/accounts/testing';
2
- import { NULL_KEY } from '@aztec/ethereum';
1
+ import { getInitialTestAccountsData } from '@aztec/accounts/testing';
2
+ import { Fr } from '@aztec/aztec.js/fields';
3
+ import { getSponsoredFPCAddress } from '@aztec/cli/cli-utils';
4
+ import { getL1Config } from '@aztec/cli/config';
5
+ import { getPublicClient } from '@aztec/ethereum/client';
3
6
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
4
7
  import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
5
8
  import type { LogFn } from '@aztec/foundation/log';
@@ -10,15 +13,11 @@ import {
10
13
  getProverNodeConfigFromEnv,
11
14
  proverNodeConfigMappings,
12
15
  } from '@aztec/prover-node';
13
- import { createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
14
16
  import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
15
17
  import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
16
18
  import { getGenesisValues } from '@aztec/world-state/testing';
17
19
 
18
- import { mnemonicToAccount } from 'viem/accounts';
19
-
20
- import { getL1Config } from '../get_l1_config.js';
21
- import { extractRelevantOptions } from '../util.js';
20
+ import { extractRelevantOptions, preloadCrsDataForVerifying, setupUpdateMonitor } from '../util.js';
22
21
  import { getVersions } from '../versioning.js';
23
22
  import { startProverBroker } from './start_prover_broker.js';
24
23
 
@@ -38,53 +37,48 @@ export async function startProverNode(
38
37
  ...extractRelevantOptions<ProverNodeConfig>(options, proverNodeConfigMappings, 'proverNode'), // override with command line options
39
38
  };
40
39
 
41
- if (!options.archiver && !proverConfig.archiverUrl) {
42
- userLog('--archiver.archiverUrl is required to start a Prover Node without --archiver option');
43
- process.exit(1);
44
- }
45
-
46
- if (!proverConfig.publisherPrivateKey || proverConfig.publisherPrivateKey === NULL_KEY) {
47
- if (!options.l1Mnemonic) {
48
- userLog(`--l1-mnemonic is required to start a Prover Node without --node.publisherPrivateKey`);
49
- process.exit(1);
50
- }
51
- const hdAccount = mnemonicToAccount(options.l1Mnemonic);
52
- const privKey = hdAccount.getHdKey().privateKey;
53
- proverConfig.publisherPrivateKey = `0x${Buffer.from(privKey!).toString('hex')}`;
54
- }
55
-
56
- // TODO(palla/prover-node) L1 contract addresses should not silently default to zero,
57
- // they should be undefined if not set and fail loudly.
58
- // Load l1 contract addresses from aztec node if not set.
59
- const isRollupAddressSet =
60
- proverConfig.l1Contracts?.rollupAddress && !proverConfig.l1Contracts.rollupAddress.isZero();
61
- const nodeUrl = proverConfig.nodeUrl ?? proverConfig.proverCoordinationNodeUrl;
62
- if (nodeUrl && !isRollupAddressSet) {
63
- userLog(`Loading L1 contract addresses from aztec node at ${nodeUrl}`);
64
- proverConfig.l1Contracts = await createAztecNodeClient(nodeUrl).getL1ContractAddresses();
40
+ if (!proverConfig.l1Contracts.registryAddress || proverConfig.l1Contracts.registryAddress.isZero()) {
41
+ throw new Error('L1 registry address is required to start a Prover Node');
65
42
  }
66
43
 
67
- // If we create an archiver here, validate the L1 config
68
- if (options.archiver) {
69
- if (!proverConfig.l1Contracts.registryAddress || proverConfig.l1Contracts.registryAddress.isZero()) {
70
- throw new Error('L1 registry address is required to start a Prover Node with --archiver option');
71
- }
72
- const { addresses, config } = await getL1Config(
73
- proverConfig.l1Contracts.registryAddress,
74
- proverConfig.l1RpcUrls,
75
- proverConfig.l1ChainId,
44
+ const followsCanonicalRollup = typeof proverConfig.rollupVersion !== 'number';
45
+ const { addresses, config } = await getL1Config(
46
+ proverConfig.l1Contracts.registryAddress,
47
+ proverConfig.l1RpcUrls,
48
+ proverConfig.l1ChainId,
49
+ proverConfig.rollupVersion,
50
+ );
51
+ process.env.ROLLUP_CONTRACT_ADDRESS ??= addresses.rollupAddress.toString();
52
+ proverConfig.l1Contracts = addresses;
53
+ proverConfig = { ...proverConfig, ...config };
54
+
55
+ const testAccounts = proverConfig.testAccounts ? (await getInitialTestAccountsData()).map(a => a.address) : [];
56
+ const sponsoredFPCAccounts = proverConfig.sponsoredFPC ? [await getSponsoredFPCAddress()] : [];
57
+ const initialFundedAccounts = testAccounts.concat(sponsoredFPCAccounts);
58
+
59
+ userLog(`Initial funded accounts: ${initialFundedAccounts.map(a => a.toString()).join(', ')}`);
60
+ const { genesisArchiveRoot, prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
61
+
62
+ userLog(`Genesis archive root: ${genesisArchiveRoot.toString()}`);
63
+
64
+ if (!Fr.fromHexString(config.genesisArchiveTreeRoot).equals(genesisArchiveRoot)) {
65
+ throw new Error(
66
+ `The computed genesis archive tree root ${genesisArchiveRoot} does not match the expected genesis archive tree root ${config.genesisArchiveTreeRoot} for the rollup deployed at ${addresses.rollupAddress}`,
76
67
  );
77
- proverConfig.l1Contracts = addresses;
78
- proverConfig = { ...proverConfig, ...config };
79
68
  }
80
69
 
81
- const telemetry = initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
70
+ const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
82
71
 
83
72
  let broker: ProvingJobBroker;
84
73
  if (proverConfig.proverBrokerUrl) {
85
- // at 1TPS we'd enqueue ~1k tube proofs and ~1k AVM proofs immediately
86
- // set a lower connectio limit such that we don't overload the server
87
- const fetch = makeTracedFetch([1, 2, 3], false, makeUndiciFetch(new Agent({ connections: 100 })));
74
+ // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
75
+ // set a lower connection limit such that we don't overload the server
76
+ // Keep retrying up to 30s
77
+ const fetch = makeTracedFetch(
78
+ [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
79
+ false,
80
+ makeUndiciFetch(new Agent({ connections: 100 })),
81
+ );
88
82
  broker = createProvingJobBrokerClient(proverConfig.proverBrokerUrl, getVersions(proverConfig), fetch);
89
83
  } else if (options.proverBroker) {
90
84
  ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
@@ -99,14 +93,12 @@ export async function startProverNode(
99
93
  );
100
94
  }
101
95
 
102
- const initialFundedAccounts = proverConfig.testAccounts ? await getInitialTestAccounts() : [];
103
- const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts.map(a => a.address));
96
+ await preloadCrsDataForVerifying(proverConfig, userLog);
104
97
 
105
98
  const proverNode = await createProverNode(proverConfig, { telemetry, broker }, { prefilledPublicData });
106
99
  services.proverNode = [proverNode, ProverNodeApiSchema];
107
100
 
108
- const p2p = proverNode.getP2P();
109
- if (p2p) {
101
+ if (proverNode.getP2P()) {
110
102
  services.p2p = [proverNode.getP2P(), P2PApiSchema];
111
103
  }
112
104
 
@@ -116,6 +108,17 @@ export async function startProverNode(
116
108
 
117
109
  signalHandlers.push(proverNode.stop.bind(proverNode));
118
110
 
119
- proverNode.start();
111
+ await proverNode.start();
112
+
113
+ if (proverConfig.autoUpdate !== 'disabled' && proverConfig.autoUpdateUrl) {
114
+ await setupUpdateMonitor(
115
+ proverConfig.autoUpdate,
116
+ new URL(proverConfig.autoUpdateUrl),
117
+ followsCanonicalRollup,
118
+ getPublicClient(proverConfig),
119
+ proverConfig.l1Contracts.registryAddress,
120
+ signalHandlers,
121
+ );
122
+ }
120
123
  return { config: proverConfig };
121
124
  }
@@ -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
+ }
@@ -0,0 +1,21 @@
1
+ import { fileURLToPath } from '@aztec/foundation/url';
2
+
3
+ import { readFileSync } from 'fs';
4
+ import { dirname, resolve } from 'path';
5
+
6
+ export const getCliVersion = () => {
7
+ const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json');
8
+ const cliVersion: string = JSON.parse(readFileSync(packageJsonPath).toString()).version;
9
+
10
+ // If the version is 0.1.0, this is a placeholder version and we are in a docker container; query release please for the latest version
11
+ if (cliVersion === '0.1.0') {
12
+ const releasePleasePath = resolve(
13
+ dirname(fileURLToPath(import.meta.url)),
14
+ '../../../../.release-please-manifest.json',
15
+ );
16
+ const releaseVersion = JSON.parse(readFileSync(releasePleasePath).toString())['.'];
17
+ return releaseVersion;
18
+ }
19
+
20
+ return cliVersion;
21
+ };
package/src/cli/util.ts CHANGED
@@ -1,33 +1,74 @@
1
- import type { AccountManager, Fr } from '@aztec/aztec.js';
1
+ import type { AztecNodeConfig } from '@aztec/aztec-node';
2
+ import type { AccountManager } from '@aztec/aztec.js/wallet';
3
+ import type { ViemClient } from '@aztec/ethereum/types';
2
4
  import type { ConfigMappingsType } from '@aztec/foundation/config';
3
- import type { LogFn } from '@aztec/foundation/log';
4
- import type { PXEService } from '@aztec/pxe/server';
5
+ import { Fr } from '@aztec/foundation/curves/bn254';
6
+ import { EthAddress } from '@aztec/foundation/eth-address';
7
+ import { type LogFn, createLogger } from '@aztec/foundation/log';
8
+ import type { SharedNodeConfig } from '@aztec/node-lib/config';
9
+ import type { ProverConfig } from '@aztec/stdlib/interfaces/server';
10
+ import { getTelemetryClient } from '@aztec/telemetry-client/start';
11
+ import type { TestWallet } from '@aztec/test-wallet/server';
5
12
 
6
13
  import chalk from 'chalk';
7
14
  import type { Command } from 'commander';
8
15
 
9
16
  import { type AztecStartOption, aztecStartOptions } from './aztec_start_options.js';
10
17
 
18
+ export const enum ExitCode {
19
+ SUCCESS = 0,
20
+ ERROR = 1,
21
+ ROLLUP_UPGRADE = 78, // EX_CONFIG from FreeBSD (https://man.freebsd.org/cgi/man.cgi?query=sysexits)
22
+ VERSION_UPGRADE = 79, // prev + 1 because there's nothing better
23
+ // 128 + int(SIGNAL)
24
+ SIGHUP = 129,
25
+ SIGINT = 130,
26
+ SIGQUIT = 131,
27
+ SIGTERM = 143,
28
+ }
29
+
30
+ let shutdownPromise: Promise<never> | undefined;
31
+ export function shutdown(logFn: LogFn, exitCode: ExitCode, cb?: Array<() => Promise<void>>): Promise<never> {
32
+ if (shutdownPromise) {
33
+ logFn('Already shutting down.');
34
+ return shutdownPromise;
35
+ }
36
+
37
+ logFn('Shutting down...', { exitCode });
38
+ if (cb) {
39
+ shutdownPromise = Promise.allSettled(cb).then(() => process.exit(exitCode));
40
+ } else {
41
+ // synchronously shuts down the process
42
+ // no need to set shutdownPromise on this branch of the if statement because no more code will be executed
43
+ process.exit(exitCode);
44
+ }
45
+
46
+ return shutdownPromise;
47
+ }
48
+
49
+ export function isShuttingDown(): boolean {
50
+ return shutdownPromise !== undefined;
51
+ }
52
+
11
53
  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);
54
+ const signals = [
55
+ ['SIGINT', ExitCode.SIGINT],
56
+ ['SIGTERM', ExitCode.SIGTERM],
57
+ ['SIGHUP', ExitCode.SIGHUP],
58
+ ['SIQUIT', ExitCode.SIGQUIT],
59
+ ] as const;
60
+
61
+ for (const [signal, exitCode] of signals) {
62
+ process.removeAllListeners(signal);
63
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
64
+ process.once(signal, () => shutdown(logFn, exitCode, cb));
65
+ }
25
66
  };
26
67
 
27
68
  /**
28
69
  * Creates logs for the initial accounts
29
70
  * @param accounts - The initial accounts
30
- * @param pxe - A PXE instance to get the registered accounts
71
+ * @param wallet - A TestWallet instance to get the registered accounts
31
72
  * @returns A string array containing the initial accounts details
32
73
  */
33
74
  export async function createAccountLogs(
@@ -41,13 +82,13 @@ export async function createAccountLogs(
41
82
  */
42
83
  secretKey: Fr;
43
84
  }[],
44
- pxe: PXEService,
85
+ wallet: TestWallet,
45
86
  ) {
46
- const registeredAccounts = await pxe.getRegisteredAccounts();
87
+ const registeredAccounts = await wallet.getAccounts();
47
88
  const accountLogStrings = [`Initial Accounts:\n\n`];
48
89
  for (const accountWithSecretKey of accountsWithSecretKeys) {
49
90
  const completeAddress = await accountWithSecretKey.account.getCompleteAddress();
50
- if (registeredAccounts.find(a => a.equals(completeAddress))) {
91
+ if (registeredAccounts.find(a => a.item.equals(completeAddress.address))) {
51
92
  accountLogStrings.push(` Address: ${completeAddress.address.toString()}\n`);
52
93
  accountLogStrings.push(` Partial Address: ${completeAddress.partialAddress.toString()}\n`);
53
94
  accountLogStrings.push(` Secret Key: ${accountWithSecretKey.secretKey.toString()}\n`);
@@ -102,18 +143,32 @@ export function formatHelpLine(
102
143
 
103
144
  const getDefaultOrEnvValue = (opt: AztecStartOption) => {
104
145
  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);
146
+
147
+ // if the option is set in the environment, use that
148
+ if (opt.env) {
149
+ val = process.env[opt.env];
150
+ }
151
+
152
+ // if we have fallback env vars, check those
153
+ if (!val && opt.fallback && opt.fallback.length > 0) {
154
+ for (const fallback of opt.fallback) {
155
+ val = process.env[fallback];
156
+ if (val) {
157
+ break;
158
+ }
110
159
  }
111
- // if no env variable, use the default value
112
- } else if (opt.defaultValue) {
113
- val = opt.defaultValue;
114
160
  }
115
161
 
116
- return val;
162
+ // if we have a value, optionally parse it and return
163
+ if (val) {
164
+ if (opt.parseVal) {
165
+ return opt.parseVal(val);
166
+ }
167
+ return val;
168
+ } else if (opt.defaultValue !== undefined) {
169
+ return opt.defaultValue;
170
+ }
171
+ return undefined;
117
172
  };
118
173
 
119
174
  // Function to add options dynamically
@@ -121,7 +176,7 @@ export const addOptions = (cmd: Command, options: AztecStartOption[]) => {
121
176
  options.forEach(opt => {
122
177
  cmd.option(
123
178
  opt.flag,
124
- `${opt.description} (default: ${opt.defaultValue}) ($${opt.envVar})`,
179
+ `${opt.description} (default: ${opt.defaultValue}) ($${opt.env})`,
125
180
  opt.parseVal ? opt.parseVal : val => val,
126
181
  getDefaultOrEnvValue(opt),
127
182
  );
@@ -137,10 +192,11 @@ export const printAztecStartHelpText = () => {
137
192
  helpTextLines.push('');
138
193
 
139
194
  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})` : '';
195
+ const defaultValueText =
196
+ opt.defaultValue || (Array.isArray(opt.defaultValue) && opt.defaultValue.length > 0)
197
+ ? `(default: ${opt.printDefault ? opt.printDefault(opt.defaultValue) : opt.defaultValue})`
198
+ : '';
199
+ const envVarText = opt.env ? `($${opt.env})` : '';
144
200
  const flagText = `${opt.flag}`;
145
201
 
146
202
  const paddedText = formatHelpLine(flagText, defaultValueText, envVarText, maxFlagLength, maxDefaultLength);
@@ -214,3 +270,121 @@ export const extractRelevantOptions = <T>(
214
270
 
215
271
  return relevantOptions;
216
272
  };
273
+
274
+ /**
275
+ * Downloads just enough points to be able to verify Chonk proofs.
276
+ * @param opts - Whether proof are to be verifier
277
+ * @param log - Logging function
278
+ */
279
+ export async function preloadCrsDataForVerifying(
280
+ { realProofs }: Pick<AztecNodeConfig, 'realProofs'>,
281
+ log: LogFn,
282
+ ): Promise<void> {
283
+ if (realProofs) {
284
+ const { Crs, GrumpkinCrs } = await import('@aztec/bb.js');
285
+ await Promise.all([Crs.new(2 ** 1, undefined, log), GrumpkinCrs.new(2 ** 16 + 1, undefined, log)]);
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Downloads enough points to be able to prove every server-side circuit
291
+ * @param opts - Whether real proof are to be generated
292
+ * @param log - Logging function
293
+ */
294
+ export async function preloadCrsDataForServerSideProving(
295
+ { realProofs }: Pick<ProverConfig, 'realProofs'>,
296
+ log: LogFn,
297
+ ): Promise<void> {
298
+ if (realProofs) {
299
+ const { Crs, GrumpkinCrs } = await import('@aztec/bb.js');
300
+ await Promise.all([Crs.new(2 ** 25 + 1, undefined, log), GrumpkinCrs.new(2 ** 18 + 1, undefined, log)]);
301
+ }
302
+ }
303
+
304
+ export async function setupUpdateMonitor(
305
+ autoUpdateMode: SharedNodeConfig['autoUpdate'],
306
+ updatesLocation: URL,
307
+ followsCanonicalRollup: boolean,
308
+ publicClient: ViemClient,
309
+ registryContractAddress: EthAddress,
310
+ signalHandlers: Array<() => Promise<void>>,
311
+ updateNodeConfig?: (config: object) => Promise<void>,
312
+ ) {
313
+ const logger = createLogger('update-check');
314
+ const { UpdateChecker } = await import('@aztec/stdlib/update-checker');
315
+ const checker = await UpdateChecker.new({
316
+ baseURL: updatesLocation,
317
+ publicClient,
318
+ registryContractAddress,
319
+ });
320
+
321
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
322
+ checker.on('newRollupVersion', async ({ latestVersion, currentVersion }) => {
323
+ if (isShuttingDown()) {
324
+ return;
325
+ }
326
+
327
+ // if node follows canonical rollup then this is equivalent to a config update
328
+ if (!followsCanonicalRollup) {
329
+ return;
330
+ }
331
+
332
+ if (autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') {
333
+ logger.info(`New rollup version detected. Please restart the node`, { latestVersion, currentVersion });
334
+ await shutdown(logger.info, ExitCode.ROLLUP_UPGRADE, signalHandlers);
335
+ } else if (autoUpdateMode === 'notify') {
336
+ logger.warn(`New rollup detected. Please restart the node`, { latestVersion, currentVersion });
337
+ }
338
+ });
339
+
340
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
341
+ checker.on('newNodeVersion', async ({ latestVersion, currentVersion }) => {
342
+ if (isShuttingDown()) {
343
+ return;
344
+ }
345
+ if (autoUpdateMode === 'config-and-version') {
346
+ logger.info(`New node version detected. Please update and restart the node`, { latestVersion, currentVersion });
347
+ await shutdown(logger.info, ExitCode.VERSION_UPGRADE, signalHandlers);
348
+ } else if (autoUpdateMode === 'notify') {
349
+ logger.info(`New node version detected. Please update and restart the node`, { latestVersion, currentVersion });
350
+ }
351
+ });
352
+
353
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
354
+ checker.on('updateNodeConfig', async config => {
355
+ if (isShuttingDown()) {
356
+ return;
357
+ }
358
+
359
+ if ((autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') && updateNodeConfig) {
360
+ logger.warn(`Config change detected. Updating node`, config);
361
+ try {
362
+ await updateNodeConfig(config);
363
+ } catch (err) {
364
+ logger.warn('Failed to update config', { err });
365
+ }
366
+ }
367
+ // don't notify on these config changes
368
+ });
369
+
370
+ checker.on('updatePublicTelemetryConfig', config => {
371
+ if (autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') {
372
+ logger.warn(`Public telemetry config change detected. Updating telemetry client`, config);
373
+ try {
374
+ const publicIncludeMetrics: unknown = (config as any).publicIncludeMetrics;
375
+ if (Array.isArray(publicIncludeMetrics) && publicIncludeMetrics.every(m => typeof m === 'string')) {
376
+ getTelemetryClient().setExportedPublicTelemetry(publicIncludeMetrics);
377
+ }
378
+ const publicMetricsCollectFrom: unknown = (config as any).publicMetricsCollectFrom;
379
+ if (Array.isArray(publicMetricsCollectFrom) && publicMetricsCollectFrom.every(m => typeof m === 'string')) {
380
+ getTelemetryClient().setPublicTelemetryCollectFrom(publicMetricsCollectFrom);
381
+ }
382
+ } catch (err) {
383
+ logger.warn('Failed to update config', { err });
384
+ }
385
+ }
386
+ // don't notify on these config changes
387
+ });
388
+
389
+ checker.start();
390
+ }
@@ -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 { TestWallet } from '@aztec/test-wallet/server';
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 TestWallet.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 token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18)
36
+ .send({ from: alice })
37
+ .deployed();
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 }).wait();
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 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 }).wait();
48
52
 
49
53
  // Check the new balances
50
- const aliceBalance = await tokenAlice.methods.balance_of_private(alice).simulate();
54
+ const 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 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';