@aztec/aztec 0.0.1-commit.9ef841308 → 0.0.1-commit.a5db02d

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 (117) hide show
  1. package/dest/bin/index.js +3 -1
  2. package/dest/cli/aztec_start_action.d.ts +1 -1
  3. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  4. package/dest/cli/aztec_start_action.js +16 -24
  5. package/dest/cli/aztec_start_options.d.ts +2 -2
  6. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  7. package/dest/cli/aztec_start_options.js +15 -15
  8. package/dest/cli/cmds/compile.d.ts +1 -1
  9. package/dest/cli/cmds/compile.d.ts.map +1 -1
  10. package/dest/cli/cmds/compile.js +30 -24
  11. package/dest/cli/cmds/profile.d.ts +1 -1
  12. package/dest/cli/cmds/profile.d.ts.map +1 -1
  13. package/dest/cli/cmds/profile.js +1 -1
  14. package/dest/cli/cmds/profile_gates.d.ts +2 -2
  15. package/dest/cli/cmds/profile_gates.d.ts.map +1 -1
  16. package/dest/cli/cmds/profile_gates.js +21 -3
  17. package/dest/cli/cmds/prover.d.ts +4 -0
  18. package/dest/cli/cmds/prover.d.ts.map +1 -0
  19. package/dest/cli/cmds/prover.js +24 -0
  20. package/dest/cli/cmds/standby.d.ts +30 -6
  21. package/dest/cli/cmds/standby.d.ts.map +1 -1
  22. package/dest/cli/cmds/standby.js +48 -5
  23. package/dest/cli/cmds/start_bot.d.ts +1 -1
  24. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  25. package/dest/cli/cmds/start_bot.js +8 -4
  26. package/dest/cli/cmds/start_node.d.ts +1 -1
  27. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  28. package/dest/cli/cmds/start_node.js +22 -47
  29. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  30. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  31. package/dest/cli/cmds/start_prover_agent.js +5 -17
  32. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  33. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  34. package/dest/cli/cmds/start_prover_broker.js +11 -8
  35. package/dest/cli/cmds/start_txe.d.ts +2 -2
  36. package/dest/cli/cmds/start_txe.d.ts.map +1 -1
  37. package/dest/cli/cmds/start_txe.js +6 -5
  38. package/dest/cli/cmds/utils/artifacts.d.ts +6 -1
  39. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -1
  40. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts +2 -2
  41. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts.map +1 -1
  42. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.js +35 -15
  43. package/dest/cli/util.d.ts +10 -5
  44. package/dest/cli/util.d.ts.map +1 -1
  45. package/dest/cli/util.js +26 -53
  46. package/dest/examples/token.js +3 -3
  47. package/dest/local-network/auth_registry.d.ts +5 -0
  48. package/dest/local-network/auth_registry.d.ts.map +1 -0
  49. package/dest/local-network/auth_registry.js +17 -0
  50. package/dest/local-network/banana_fpc.d.ts +3 -2
  51. package/dest/local-network/banana_fpc.d.ts.map +1 -1
  52. package/dest/local-network/banana_fpc.js +11 -7
  53. package/dest/local-network/local-network.d.ts +10 -32
  54. package/dest/local-network/local-network.d.ts.map +1 -1
  55. package/dest/local-network/local-network.js +52 -73
  56. package/dest/testing/cheat_codes.d.ts +17 -23
  57. package/dest/testing/cheat_codes.d.ts.map +1 -1
  58. package/dest/testing/cheat_codes.js +17 -43
  59. package/dest/testing/epoch_test_settler.d.ts +2 -2
  60. package/dest/testing/epoch_test_settler.d.ts.map +1 -1
  61. package/dest/testing/epoch_test_settler.js +6 -25
  62. package/dest/testing/index.d.ts +2 -2
  63. package/dest/testing/index.d.ts.map +1 -1
  64. package/dest/testing/index.js +1 -1
  65. package/dest/testing/local-network.d.ts +51 -0
  66. package/dest/testing/local-network.d.ts.map +1 -0
  67. package/dest/testing/local-network.js +60 -0
  68. package/dest/testing/token_allowed_setup.d.ts +9 -4
  69. package/dest/testing/token_allowed_setup.d.ts.map +1 -1
  70. package/dest/testing/token_allowed_setup.js +12 -8
  71. package/package.json +34 -33
  72. package/scripts/add_crate.sh +11 -60
  73. package/scripts/aztec.sh +6 -2
  74. package/scripts/init.sh +5 -5
  75. package/scripts/new.sh +2 -2
  76. package/scripts/setup_workspace.sh +3 -2
  77. package/scripts/templates/blank/contract/Nargo.toml +6 -0
  78. package/scripts/templates/blank/contract/src/main.nr +10 -0
  79. package/scripts/templates/blank/test/Nargo.toml +7 -0
  80. package/scripts/templates/blank/test/src/lib.nr +11 -0
  81. package/scripts/templates/counter/contract/Nargo.toml +7 -0
  82. package/scripts/templates/counter/contract/src/main.nr +48 -0
  83. package/scripts/templates/counter/test/Nargo.toml +7 -0
  84. package/scripts/templates/counter/test/src/lib.nr +32 -0
  85. package/src/bin/index.ts +3 -1
  86. package/src/cli/aztec_start_action.ts +14 -17
  87. package/src/cli/aztec_start_options.ts +22 -23
  88. package/src/cli/cmds/compile.ts +35 -24
  89. package/src/cli/cmds/profile.ts +2 -1
  90. package/src/cli/cmds/profile_gates.ts +20 -4
  91. package/src/cli/cmds/prover.ts +42 -0
  92. package/src/cli/cmds/standby.ts +59 -7
  93. package/src/cli/cmds/start_bot.ts +9 -6
  94. package/src/cli/cmds/start_node.ts +29 -39
  95. package/src/cli/cmds/start_prover_agent.ts +5 -8
  96. package/src/cli/cmds/start_prover_broker.ts +10 -11
  97. package/src/cli/cmds/start_txe.ts +7 -5
  98. package/src/cli/cmds/utils/artifacts.ts +5 -0
  99. package/src/cli/cmds/utils/warn_if_aztec_version_mismatch.ts +37 -15
  100. package/src/cli/util.ts +27 -68
  101. package/src/examples/token.ts +11 -3
  102. package/src/local-network/auth_registry.ts +19 -0
  103. package/src/local-network/banana_fpc.ts +12 -8
  104. package/src/local-network/local-network.ts +61 -83
  105. package/src/testing/cheat_codes.ts +18 -49
  106. package/src/testing/epoch_test_settler.ts +8 -31
  107. package/src/testing/index.ts +1 -1
  108. package/src/testing/local-network.ts +97 -0
  109. package/src/testing/token_allowed_setup.ts +15 -8
  110. package/dest/cli/cmds/start_archiver.d.ts +0 -9
  111. package/dest/cli/cmds/start_archiver.d.ts.map +0 -1
  112. package/dest/cli/cmds/start_archiver.js +0 -48
  113. package/dest/testing/anvil_test_watcher.d.ts +0 -42
  114. package/dest/testing/anvil_test_watcher.d.ts.map +0 -1
  115. package/dest/testing/anvil_test_watcher.js +0 -181
  116. package/src/cli/cmds/start_archiver.ts +0 -50
  117. package/src/testing/anvil_test_watcher.ts +0 -210
@@ -1,7 +1,11 @@
1
- import { type AztecNodeConfig, aztecNodeConfigMappings, getConfigEnvVars } from '@aztec/aztec-node';
1
+ import {
2
+ type AztecNodeConfig,
3
+ aztecNodeConfigMappings,
4
+ getConfigEnvVars,
5
+ registerAztecNodeRpcHandlers,
6
+ } from '@aztec/aztec-node';
2
7
  import { Fr } from '@aztec/aztec.js/fields';
3
8
  import { getL1Config } from '@aztec/cli/config';
4
- import { getPublicClient } from '@aztec/ethereum/client';
5
9
  import { getGenesisStateConfigEnvVars } from '@aztec/ethereum/config';
6
10
  import { type NetworkNames, SecretValue } from '@aztec/foundation/config';
7
11
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
@@ -9,10 +13,13 @@ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
9
13
  import type { LogFn } from '@aztec/foundation/log';
10
14
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
11
15
  import { protocolContractsHash } from '@aztec/protocol-contracts';
12
- import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker';
16
+ import {
17
+ ProvingJobConsumerSchema,
18
+ createProvingJobBrokerClient,
19
+ proverBrokerBackoff,
20
+ } from '@aztec/prover-client/broker';
13
21
  import { type CliPXEOptions, type PXEConfig, allPxeConfigMappings } from '@aztec/pxe/config';
14
- import { AztecNodeAdminApiSchema, AztecNodeApiSchema } from '@aztec/stdlib/interfaces/client';
15
- import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
22
+ import { ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
16
23
  import {
17
24
  type TelemetryClientConfig,
18
25
  initTelemetryClient,
@@ -22,14 +29,9 @@ import {
22
29
  import { EmbeddedWallet } from '@aztec/wallets/embedded';
23
30
 
24
31
  import { createAztecNode } from '../../local-network/index.js';
25
- import {
26
- extractNamespacedOptions,
27
- extractRelevantOptions,
28
- preloadCrsDataForVerifying,
29
- setupVersionChecker,
30
- } from '../util.js';
32
+ import { extractNamespacedOptions, extractRelevantOptions, preloadCrsDataForVerifying } from '../util.js';
31
33
  import { getVersions } from '../versioning.js';
32
- import { computeExpectedGenesisRoot, waitForCompatibleRollup } from './standby.js';
34
+ import { computeExpectedGenesisRoot, setupAutoShutdown, waitForCompatibleRollup } from './standby.js';
33
35
  import { startProverBroker } from './start_prover_broker.js';
34
36
 
35
37
  export async function startNode(
@@ -65,12 +67,8 @@ export async function startNode(
65
67
  if (nodeConfig.proverBrokerUrl) {
66
68
  // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
67
69
  // set a lower connection limit such that we don't overload the server
68
- // Keep retrying up to 30s
69
- const fetch = makeTracedFetch(
70
- [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
71
- false,
72
- makeUndiciFetch(new Agent({ connections: 100 })),
73
- );
70
+ // Retry indefinitely until the epoch proving times out and the chain reorgs
71
+ const fetch = makeTracedFetch(proverBrokerBackoff, false, makeUndiciFetch(new Agent({ connections: 100 })));
74
72
  broker = createProvingJobBrokerClient(nodeConfig.proverBrokerUrl, getVersions(nodeConfig), fetch);
75
73
  } else if (options.proverBroker) {
76
74
  ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
@@ -83,12 +81,12 @@ export async function startNode(
83
81
  await preloadCrsDataForVerifying(nodeConfig, userLog);
84
82
 
85
83
  const genesisConfig = getGenesisStateConfigEnvVars();
86
- const { genesisArchiveRoot, prefilledPublicData } = await computeExpectedGenesisRoot(genesisConfig, userLog);
84
+ const { genesisArchiveRoot, genesis } = await computeExpectedGenesisRoot(genesisConfig, userLog);
87
85
 
88
86
  const followsCanonicalRollup =
89
87
  typeof nodeConfig.rollupVersion !== 'number' || (nodeConfig.rollupVersion as unknown as string) === 'canonical';
90
88
 
91
- if (!nodeConfig.l1Contracts.registryAddress || nodeConfig.l1Contracts.registryAddress.isZero()) {
89
+ if (!nodeConfig.registryAddress || nodeConfig.registryAddress.isZero()) {
92
90
  throw new Error('L1 registry address is required to start Aztec Node');
93
91
  }
94
92
 
@@ -102,7 +100,7 @@ export async function startNode(
102
100
  );
103
101
 
104
102
  const { addresses, config } = await getL1Config(
105
- nodeConfig.l1Contracts.registryAddress,
103
+ nodeConfig.registryAddress,
106
104
  nodeConfig.l1RpcUrls,
107
105
  nodeConfig.l1ChainId,
108
106
  nodeConfig.rollupVersion,
@@ -116,13 +114,9 @@ export async function startNode(
116
114
  );
117
115
  }
118
116
 
119
- // TODO(#12272): will clean this up.
120
117
  nodeConfig = {
121
118
  ...nodeConfig,
122
- l1Contracts: {
123
- ...addresses,
124
- slashFactoryAddress: nodeConfig.l1Contracts.slashFactoryAddress,
125
- },
119
+ ...addresses,
126
120
  ...config,
127
121
  };
128
122
 
@@ -158,17 +152,14 @@ export async function startNode(
158
152
  const telemetry = await initTelemetryClient(telemetryConfig);
159
153
 
160
154
  // Create and start Aztec Node
161
- const node = await createAztecNode(nodeConfig, { telemetry, proverBroker: broker }, { prefilledPublicData });
155
+ const node = await createAztecNode(nodeConfig, { telemetry, proverBroker: broker }, { genesis });
162
156
 
163
- // Add node and p2p to services list
164
- services.node = [node, AztecNodeApiSchema];
165
- services.p2p = [node.getP2P(), P2PApiSchema];
166
- adminServices.nodeAdmin = [node, AztecNodeAdminApiSchema];
157
+ registerAztecNodeRpcHandlers(node, services, adminServices, { debug: options.nodeDebug });
167
158
 
168
159
  // Register prover-node services if the prover node subsystem is running
169
160
  const proverNode = node.getProverNode();
170
161
  if (proverNode) {
171
- services.prover = [proverNode, ProverNodeApiSchema];
162
+ adminServices.prover = [proverNode, ProverNodeApiSchema];
172
163
  if (!nodeConfig.proverBrokerUrl) {
173
164
  services.provingJobSource = [proverNode.getProver().getProvingJobSource(), ProvingJobConsumerSchema];
174
165
  }
@@ -187,15 +178,14 @@ export async function startNode(
187
178
  await addBot(options, signalHandlers, services, wallet, node, telemetry, undefined);
188
179
  }
189
180
 
190
- if (nodeConfig.enableVersionCheck && networkName !== 'local') {
191
- const cacheDir = process.env.DATA_DIRECTORY ? `${process.env.DATA_DIRECTORY}/cache` : undefined;
181
+ if (nodeConfig.enableAutoShutdown && networkName !== 'local' && followsCanonicalRollup) {
192
182
  try {
193
- await setupVersionChecker(
194
- networkName,
195
- followsCanonicalRollup,
196
- getPublicClient(nodeConfig!),
183
+ await setupAutoShutdown(
184
+ nodeConfig,
185
+ nodeConfig.registryAddress,
186
+ (nodeConfig.rollupVersion as number | 'canonical') ?? 'canonical',
187
+ { genesisArchiveRoot, vkTreeRoot: getVKTreeRoot(), protocolContractsHash },
197
188
  signalHandlers,
198
- cacheDir,
199
189
  );
200
190
  } catch {
201
191
  /* no-op */
@@ -9,6 +9,7 @@ import {
9
9
  createProofStore,
10
10
  createProvingJobBrokerClient,
11
11
  proverAgentConfigMappings,
12
+ proverBrokerBackoff,
12
13
  } from '@aztec/prover-client/broker';
13
14
  import { getProverNodeAgentConfigFromEnv } from '@aztec/prover-node';
14
15
  import { ProverAgentApiSchema } from '@aztec/stdlib/interfaces/server';
@@ -23,8 +24,8 @@ export async function startProverAgent(
23
24
  services: NamespacedApiHandlers,
24
25
  userLog: LogFn,
25
26
  ) {
26
- if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
27
- userLog(`Starting a prover agent with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
27
+ if (options.node || options.sequencer || options.p2pBootstrap || options.txe) {
28
+ userLog(`Starting a prover agent with --node, --sequencer, --p2p-bootstrap, or --txe is not supported.`);
28
29
  process.exit(1);
29
30
  }
30
31
 
@@ -45,12 +46,8 @@ export async function startProverAgent(
45
46
 
46
47
  await preloadCrsDataForServerSideProving(config, userLog);
47
48
 
48
- const fetch = makeTracedFetch(
49
- // retry connections every 3s, up to 30s before giving up
50
- [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
51
- false,
52
- makeUndiciFetch(new Agent({ connections: 10 })),
53
- );
49
+ // Retry indefinitely until the epoch proving times out and the chain reorgs
50
+ const fetch = makeTracedFetch(proverBrokerBackoff, false, makeUndiciFetch(new Agent({ connections: 10 })));
54
51
  const broker = createProvingJobBrokerClient(config.proverBrokerUrl, getVersions(), fetch);
55
52
 
56
53
  const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
@@ -24,38 +24,37 @@ export async function startProverBroker(
24
24
  services: NamespacedApiHandlers,
25
25
  userLog: LogFn,
26
26
  ): Promise<{ broker: ProvingJobBroker; config: ProverBrokerConfig }> {
27
- if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
28
- userLog(`Starting a prover broker with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
27
+ if (options.node || options.sequencer || options.p2pBootstrap || options.txe) {
28
+ userLog(`Starting a prover broker with --node, --sequencer, --p2p-bootstrap, or --txe is not supported.`);
29
29
  process.exit(1);
30
30
  }
31
31
 
32
- const config: ProverBrokerConfig = {
32
+ const baseConfig: ProverBrokerConfig = {
33
33
  ...getProverNodeBrokerConfigFromEnv(), // get default config from env
34
34
  ...extractRelevantOptions<ProverBrokerConfig>(options, proverBrokerConfigMappings, 'proverBroker'), // override with command line options
35
35
  };
36
36
 
37
- if (!config.l1Contracts.registryAddress || config.l1Contracts.registryAddress.isZero()) {
37
+ if (!baseConfig.registryAddress || baseConfig.registryAddress.isZero()) {
38
38
  throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
39
39
  }
40
40
 
41
41
  const genesisConfig = getGenesisStateConfigEnvVars();
42
42
  const { genesisArchiveRoot } = await computeExpectedGenesisRoot(genesisConfig, userLog);
43
43
  await waitForCompatibleRollup(
44
- config,
44
+ baseConfig,
45
45
  { genesisArchiveRoot, vkTreeRoot: getVKTreeRoot(), protocolContractsHash },
46
46
  options.port,
47
47
  userLog,
48
48
  );
49
49
 
50
50
  const { addresses, config: rollupConfig } = await getL1Config(
51
- config.l1Contracts.registryAddress,
52
- config.l1RpcUrls,
53
- config.l1ChainId,
54
- config.rollupVersion,
51
+ baseConfig.registryAddress,
52
+ baseConfig.l1RpcUrls,
53
+ baseConfig.l1ChainId,
54
+ baseConfig.rollupVersion,
55
55
  );
56
56
 
57
- config.l1Contracts = addresses;
58
- config.rollupVersion = rollupConfig.rollupVersion;
57
+ const config: ProverBrokerConfig = { ...baseConfig, ...addresses, rollupVersion: rollupConfig.rollupVersion };
59
58
 
60
59
  const client = await initTelemetryClient(getTelemetryClientConfig());
61
60
  const broker = await createAndStartProvingBroker(config, client);
@@ -1,15 +1,17 @@
1
1
  import { startHttpRpcServer } from '@aztec/foundation/json-rpc/server';
2
2
  import type { Logger } from '@aztec/foundation/log';
3
- import { createTXERpcServer } from '@aztec/txe';
3
+ import { createTXERpcServer } from '@aztec/txe/server';
4
4
 
5
- export async function startTXE(options: any, debugLogger: Logger) {
5
+ export async function startTXE(options: any, signalHandlers: Array<() => Promise<void>>, debugLogger: Logger) {
6
6
  debugLogger.info(`Setting up TXE...`);
7
7
 
8
- const txeServer = createTXERpcServer(debugLogger);
9
- const { port } = await startHttpRpcServer(txeServer, {
8
+ const txeServer = await createTXERpcServer(debugLogger);
9
+ const httpServer = await startHttpRpcServer(txeServer, {
10
10
  port: options.port,
11
11
  timeoutMs: 1e3 * 60 * 5,
12
12
  });
13
13
 
14
- debugLogger.info(`TXE listening on port ${port}`);
14
+ signalHandlers.push(() => new Promise<void>(resolve => httpServer.close(() => resolve())));
15
+
16
+ debugLogger.info(`TXE listening on port ${httpServer.port}`);
15
17
  }
@@ -6,6 +6,11 @@ export interface CompiledArtifact {
6
6
  file_map: unknown;
7
7
  functions: ContractFunction[];
8
8
  bytecode?: string;
9
+ /**
10
+ * Set to true by the AVM transpiler (invoked via `bb aztec_process`) once the contract has been transpiled and its
11
+ * verification keys generated. Absent on raw `nargo compile` output, hence optional.
12
+ */
13
+ transpiled?: boolean;
9
14
  }
10
15
 
11
16
  export interface ContractFunction {
@@ -1,5 +1,5 @@
1
1
  import type { LogFn } from '@aztec/foundation/log';
2
- import { getPackageVersion } from '@aztec/stdlib/update-checker';
2
+ import { DEV_VERSION, getPackageVersion } from '@aztec/stdlib/update-checker';
3
3
 
4
4
  import TOML from '@iarna/toml';
5
5
  import { readFile } from 'fs/promises';
@@ -7,16 +7,33 @@ import { join } from 'path';
7
7
 
8
8
  import { collectCrateDirs } from './collect_crate_dirs.js';
9
9
 
10
- /** Warns if the `aztec` dependency tag in any crate's Nargo.toml doesn't match the CLI version. */
10
+ /** Returns true if the given git URL points to the AztecProtocol/aztec-nr repository. */
11
+ function isAztecNrGitUrl(gitUrl: string): boolean {
12
+ let url: URL;
13
+ try {
14
+ url = new URL(gitUrl);
15
+ } catch {
16
+ return false;
17
+ }
18
+ if (url.hostname !== 'github.com') {
19
+ return false;
20
+ }
21
+ const repoPath = url.pathname
22
+ .replace(/^\//, '')
23
+ .replace(/\.git$/, '')
24
+ .replace(/\/$/, '');
25
+ return repoPath === 'AztecProtocol/aztec-nr';
26
+ }
27
+
28
+ /** Warns if any aztec-nr git dependency in a crate's Nargo.toml has a tag that doesn't match the CLI version. */
11
29
  export async function warnIfAztecVersionMismatch(log: LogFn, cliVersion?: string): Promise<void> {
12
30
  const version = cliVersion ?? getPackageVersion();
13
- if (!version) {
14
- log(`WARNING: aztec CLI version not found. Skipping dependency compatibility check.`);
31
+ if (version === DEV_VERSION) {
15
32
  return;
16
33
  }
17
34
 
18
35
  const expectedTag = `v${version}`;
19
- const mismatches: { file: string; tag: string }[] = [];
36
+ const mismatches: { file: string; depName: string; tag: string }[] = [];
20
37
 
21
38
  const crateDirs = await collectCrateDirs('.', { skipGitDeps: true });
22
39
 
@@ -30,23 +47,28 @@ export async function warnIfAztecVersionMismatch(log: LogFn, cliVersion?: string
30
47
  }
31
48
 
32
49
  const parsed = TOML.parse(content) as Record<string, any>;
33
- const aztecDep = (parsed.dependencies as Record<string, any>)?.aztec;
34
- if (!aztecDep || typeof aztecDep !== 'object' || typeof aztecDep.tag !== 'string') {
35
- // If a dep called "aztec" doesn't exist or it does not get parsed to an object or it doesn't have a tag defined
36
- // we skip the check.
37
- continue;
38
- }
50
+ const deps = (parsed.dependencies as Record<string, any>) ?? {};
39
51
 
40
- if (aztecDep.tag !== expectedTag) {
41
- mismatches.push({ file: tomlPath, tag: aztecDep.tag });
52
+ for (const [depName, dep] of Object.entries(deps)) {
53
+ // Skip non-object deps (e.g. malformed entries) and anything that isn't a tagged git dep.
54
+ if (!dep || typeof dep !== 'object' || typeof dep.git !== 'string' || typeof dep.tag !== 'string') {
55
+ continue;
56
+ }
57
+ // Only flag deps that are sourced from the aztec-nr repo.
58
+ if (!isAztecNrGitUrl(dep.git)) {
59
+ continue;
60
+ }
61
+ if (dep.tag !== expectedTag) {
62
+ mismatches.push({ file: tomlPath, depName, tag: dep.tag });
63
+ }
42
64
  }
43
65
  }
44
66
 
45
67
  if (mismatches.length > 0) {
46
- const details = mismatches.map(m => ` ${m.file} (${m.tag})`).join('\n');
68
+ const details = mismatches.map(m => ` ${m.file} — ${m.depName} (${m.tag})`).join('\n');
47
69
  log(
48
70
  `WARNING: Aztec dependency version mismatch detected.\n` +
49
- `The following crates have an aztec dependency that does not match the CLI version (${expectedTag}):\n` +
71
+ `The following aztec-nr dependencies do not match the CLI version (${expectedTag}):\n` +
50
72
  `${details}\n\n` +
51
73
  `See https://docs.aztec.network/errors/9 for how to update your dependencies.`,
52
74
  );
package/src/cli/util.ts CHANGED
@@ -1,18 +1,13 @@
1
1
  import type { AztecNodeConfig } from '@aztec/aztec-node';
2
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';
3
+ import type { ConfigMappingsType } from '@aztec/foundation/config';
7
4
  import { jsonStringify } from '@aztec/foundation/json-rpc';
8
- import { type LogFn, createLogger } from '@aztec/foundation/log';
5
+ import type { LogFn } from '@aztec/foundation/log';
9
6
  import type { ProverConfig } from '@aztec/stdlib/interfaces/server';
10
- import { type VersionCheck, getPackageVersion } from '@aztec/stdlib/update-checker';
11
7
  import type { EmbeddedWallet } from '@aztec/wallets/embedded';
12
8
 
13
9
  import chalk from 'chalk';
14
10
  import type { Command } from 'commander';
15
- import type { Hex } from 'viem';
16
11
 
17
12
  import { type AztecStartOption, aztecStartOptions } from './aztec_start_options.js';
18
13
 
@@ -51,6 +46,24 @@ export function isShuttingDown(): boolean {
51
46
  return shutdownPromise !== undefined;
52
47
  }
53
48
 
49
+ /**
50
+ * Stops the node's subsystems (via the registered signal handlers) without exiting the process, leaving
51
+ * the HTTP health server listening so K8s liveness/readiness probes keep passing. Unlike {@link shutdown}
52
+ * this deliberately does not latch `shutdownPromise` or call `process.exit`; instead it re-arms
53
+ * SIGTERM/SIGINT so a later K8s pod deletion still terminates the wound-down pod with a clean exit.
54
+ */
55
+ export async function softShutdown(logFn: LogFn, signalHandlers: Array<() => Promise<void>>): Promise<void> {
56
+ logFn('Canonical rollup upgrade detected: stopping subsystems, health server stays up.', {
57
+ exitCode: ExitCode.ROLLUP_UPGRADE,
58
+ });
59
+ await Promise.allSettled(signalHandlers.map(fn => fn()));
60
+ for (const sig of ['SIGTERM', 'SIGINT'] as const) {
61
+ process.removeAllListeners(sig);
62
+ process.once(sig, () => process.exit(ExitCode.ROLLUP_UPGRADE));
63
+ }
64
+ logFn('Subsystems stopped due to rollup upgrade. Health server remains active.');
65
+ }
66
+
54
67
  export const installSignalHandlers = (logFn: LogFn, cb?: Array<() => Promise<void>>) => {
55
68
  const signals = [
56
69
  ['SIGINT', ExitCode.SIGINT],
@@ -81,18 +94,18 @@ export async function createAccountLogs(accountManagers: AccountManager[], walle
81
94
  if (registeredAccounts.find(a => a.item.equals(completeAddress.address))) {
82
95
  accountLogStrings.push(` Address: ${completeAddress.address.toString()}\n`);
83
96
  accountLogStrings.push(` Partial Address: ${completeAddress.partialAddress.toString()}\n`);
84
- accountLogStrings.push(` Secret Key: ${account.getSecretKey().toString()}\n`);
97
+ accountLogStrings.push(` Secret Key: ${accountManager.getSecretKey().toString()}\n`);
98
+ accountLogStrings.push(` Master nullifier public key hash: ${completeAddress.publicKeys.npkMHash.toString()}\n`);
99
+ accountLogStrings.push(` Master incoming viewing public key: ${completeAddress.publicKeys.ivpkM.toString()}\n\n`);
85
100
  accountLogStrings.push(
86
- ` Master nullifier public key: ${completeAddress.publicKeys.masterNullifierPublicKey.toString()}\n`,
101
+ ` Master outgoing viewing public key hash: ${completeAddress.publicKeys.ovpkMHash.toString()}\n\n`,
87
102
  );
103
+ accountLogStrings.push(` Master tagging public key hash: ${completeAddress.publicKeys.tpkMHash.toString()}\n\n`);
88
104
  accountLogStrings.push(
89
- ` Master incoming viewing public key: ${completeAddress.publicKeys.masterIncomingViewingPublicKey.toString()}\n\n`,
105
+ ` Master message-signing public key hash: ${completeAddress.publicKeys.mspkMHash.toString()}\n\n`,
90
106
  );
91
107
  accountLogStrings.push(
92
- ` Master outgoing viewing public key: ${completeAddress.publicKeys.masterOutgoingViewingPublicKey.toString()}\n\n`,
93
- );
94
- accountLogStrings.push(
95
- ` Master tagging public key: ${completeAddress.publicKeys.masterTaggingPublicKey.toString()}\n\n`,
108
+ ` Master fallback public key hash: ${completeAddress.publicKeys.fbpkMHash.toString()}\n\n`,
96
109
  );
97
110
  }
98
111
  }
@@ -291,60 +304,6 @@ export async function preloadCrsDataForServerSideProving(
291
304
  }
292
305
  }
293
306
 
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
307
  export function stringifyConfig(config: object): string {
349
308
  return Object.entries(config)
350
309
  .map(([key, value]) => `${key}=${jsonStringify(value)}`)
@@ -21,10 +21,18 @@ async function main() {
21
21
 
22
22
  const wallet = await EmbeddedWallet.create(node);
23
23
 
24
- // During local network setup we deploy a few accounts. Below we add them to our wallet.
24
+ // During local network setup we create a few initializerless accounts. Below we add them to our wallet.
25
25
  const [aliceInitialAccountData, bobInitialAccountData] = await getInitialTestAccountsData();
26
- await wallet.createSchnorrAccount(aliceInitialAccountData.secret, aliceInitialAccountData.salt);
27
- await wallet.createSchnorrAccount(bobInitialAccountData.secret, bobInitialAccountData.salt);
26
+ await wallet.createSchnorrInitializerlessAccount(
27
+ aliceInitialAccountData.secret,
28
+ aliceInitialAccountData.salt,
29
+ aliceInitialAccountData.signingKey,
30
+ );
31
+ await wallet.createSchnorrInitializerlessAccount(
32
+ bobInitialAccountData.secret,
33
+ bobInitialAccountData.salt,
34
+ bobInitialAccountData.signingKey,
35
+ );
28
36
 
29
37
  const alice = aliceInitialAccountData.address;
30
38
  const bob = bobInitialAccountData.address;
@@ -0,0 +1,19 @@
1
+ import type { WaitOpts } from '@aztec/aztec.js/contracts';
2
+ import { publishContractClass, publishInstance } from '@aztec/aztec.js/deployment';
3
+ import type { Wallet } from '@aztec/aztec.js/wallet';
4
+ import { AuthRegistryArtifact, getStandardAuthRegistry } from '@aztec/standard-contracts/auth-registry';
5
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
6
+
7
+ export async function publishStandardAuthRegistry(
8
+ wallet: Wallet,
9
+ from: AztecAddress,
10
+ waitOpts?: WaitOpts,
11
+ ): Promise<void> {
12
+ const { instance, contractClass } = await getStandardAuthRegistry();
13
+ if (!(await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered) {
14
+ await (await publishContractClass(wallet, AuthRegistryArtifact)).send({ from, wait: waitOpts });
15
+ }
16
+ if (!(await wallet.getContractMetadata(instance.address)).isContractPublished) {
17
+ await publishInstance(wallet, instance).send({ from, wait: waitOpts });
18
+ }
19
+ }
@@ -1,4 +1,5 @@
1
1
  import { type InitialAccountData, getInitialTestAccountsData } from '@aztec/accounts/testing';
2
+ import type { WaitOpts } from '@aztec/aztec.js/contracts';
2
3
  import type { Wallet } from '@aztec/aztec.js/wallet';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import type { LogFn } from '@aztec/foundation/log';
@@ -45,19 +46,22 @@ export async function getBananaFPCAddress(initialAccounts: InitialAccountData[])
45
46
  return (await getBananaFPCInstance(initialAccounts)).address;
46
47
  }
47
48
 
48
- export async function setupBananaFPC(initialAccounts: InitialAccountData[], wallet: Wallet, log: LogFn) {
49
+ export async function setupBananaFPC(
50
+ initialAccounts: InitialAccountData[],
51
+ wallet: Wallet,
52
+ log: LogFn,
53
+ waitOpts?: WaitOpts,
54
+ ) {
49
55
  const bananaCoinAddress = await getBananaCoinAddress(initialAccounts);
50
56
  const admin = getBananaAdmin(initialAccounts);
51
57
  const [{ contract: bananaCoin }, { contract: fpc }] = await Promise.all([
52
- TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal).send({
53
- from: admin,
54
- contractAddressSalt: BANANA_COIN_SALT,
58
+ TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal, {
59
+ salt: BANANA_COIN_SALT,
55
60
  universalDeploy: true,
56
- }),
57
- FPCContract.deploy(wallet, bananaCoinAddress, admin).send({
61
+ }).send({ from: admin, wait: waitOpts }),
62
+ FPCContract.deploy(wallet, bananaCoinAddress, admin, { salt: BANANA_FPC_SALT, universalDeploy: true }).send({
58
63
  from: admin,
59
- contractAddressSalt: BANANA_FPC_SALT,
60
- universalDeploy: true,
64
+ wait: waitOpts,
61
65
  }),
62
66
  ]);
63
67