@aztec/aztec 4.0.4 → 4.1.0-rc.2

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 (39) hide show
  1. package/dest/bin/index.js +2 -2
  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 +5 -3
  5. package/dest/cli/aztec_start_options.d.ts +1 -1
  6. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  7. package/dest/cli/aztec_start_options.js +1 -2
  8. package/dest/cli/cmds/standby.d.ts +27 -0
  9. package/dest/cli/cmds/standby.d.ts.map +1 -0
  10. package/dest/cli/cmds/standby.js +78 -0
  11. package/dest/cli/cmds/start_node.d.ts +3 -2
  12. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  13. package/dest/cli/cmds/start_node.js +13 -71
  14. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  15. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  16. package/dest/cli/cmds/start_prover_broker.js +6 -6
  17. package/dest/cli/util.d.ts +3 -5
  18. package/dest/cli/util.d.ts.map +1 -1
  19. package/dest/cli/util.js +37 -78
  20. package/dest/examples/token.js +4 -4
  21. package/dest/local-network/banana_fpc.js +1 -1
  22. package/dest/local-network/local-network.d.ts +1 -1
  23. package/dest/local-network/local-network.d.ts.map +1 -1
  24. package/dest/local-network/local-network.js +46 -5
  25. package/package.json +34 -34
  26. package/src/bin/index.ts +2 -2
  27. package/src/cli/aztec_start_action.ts +5 -3
  28. package/src/cli/aztec_start_options.ts +1 -2
  29. package/src/cli/cmds/standby.ts +111 -0
  30. package/src/cli/cmds/start_node.ts +21 -106
  31. package/src/cli/cmds/start_prover_broker.ts +7 -14
  32. package/src/cli/util.ts +41 -74
  33. package/src/examples/token.ts +6 -4
  34. package/src/local-network/banana_fpc.ts +1 -1
  35. package/src/local-network/local-network.ts +49 -4
  36. package/dest/cli/release_version.d.ts +0 -2
  37. package/dest/cli/release_version.d.ts.map +0 -1
  38. package/dest/cli/release_version.js +0 -14
  39. package/src/cli/release_version.ts +0 -21
package/src/cli/util.ts CHANGED
@@ -1,17 +1,18 @@
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';
3
5
  import type { ViemClient } from '@aztec/ethereum/types';
4
- import type { ConfigMappingsType } from '@aztec/foundation/config';
5
- import { EthAddress } from '@aztec/foundation/eth-address';
6
+ import type { ConfigMappingsType, NetworkNames } from '@aztec/foundation/config';
6
7
  import { jsonStringify } from '@aztec/foundation/json-rpc';
7
8
  import { type LogFn, createLogger } from '@aztec/foundation/log';
8
- import type { SharedNodeConfig } from '@aztec/node-lib/config';
9
9
  import type { ProverConfig } from '@aztec/stdlib/interfaces/server';
10
- import { getTelemetryClient } from '@aztec/telemetry-client/start';
10
+ import { type VersionCheck, getPackageVersion } from '@aztec/stdlib/update-checker';
11
11
  import type { EmbeddedWallet } from '@aztec/wallets/embedded';
12
12
 
13
13
  import chalk from 'chalk';
14
14
  import type { Command } from 'commander';
15
+ import type { Hex } from 'viem';
15
16
 
16
17
  import { type AztecStartOption, aztecStartOptions } from './aztec_start_options.js';
17
18
 
@@ -290,92 +291,58 @@ export async function preloadCrsDataForServerSideProving(
290
291
  }
291
292
  }
292
293
 
293
- export async function setupUpdateMonitor(
294
- autoUpdateMode: SharedNodeConfig['autoUpdate'],
295
- updatesLocation: URL,
294
+ export async function setupVersionChecker(
295
+ network: NetworkNames,
296
296
  followsCanonicalRollup: boolean,
297
297
  publicClient: ViemClient,
298
- registryContractAddress: EthAddress,
299
298
  signalHandlers: Array<() => Promise<void>>,
300
- updateNodeConfig?: (config: object) => Promise<void>,
301
- ) {
302
- const logger = createLogger('update-check');
303
- const { UpdateChecker } = await import('@aztec/stdlib/update-checker');
304
- const checker = await UpdateChecker.new({
305
- baseURL: updatesLocation,
306
- publicClient,
307
- registryContractAddress,
308
- });
299
+ cacheDir?: string,
300
+ ): Promise<void> {
301
+ const networkConfig = await getNetworkConfig(network, cacheDir);
302
+ if (!networkConfig) {
303
+ return;
304
+ }
309
305
 
310
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
311
- checker.on('newRollupVersion', async ({ latestVersion, currentVersion }) => {
312
- if (isShuttingDown()) {
313
- return;
314
- }
306
+ const { VersionChecker } = await import('@aztec/stdlib/update-checker');
315
307
 
316
- // if node follows canonical rollup then this is equivalent to a config update
317
- if (!followsCanonicalRollup) {
318
- return;
319
- }
308
+ const logger = createLogger('version_check');
309
+ const registry = new RegistryContract(publicClient, networkConfig.registryAddress as Hex);
320
310
 
321
- if (autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') {
322
- logger.info(`New rollup version detected. Please restart the node`, { latestVersion, currentVersion });
323
- await shutdown(logger.info, ExitCode.ROLLUP_UPGRADE, signalHandlers);
324
- } else if (autoUpdateMode === 'notify') {
325
- logger.warn(`New rollup detected. Please restart the node`, { latestVersion, currentVersion });
326
- }
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
+ },
327
319
  });
328
320
 
329
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
330
- checker.on('newNodeVersion', async ({ latestVersion, currentVersion }) => {
331
- if (isShuttingDown()) {
332
- return;
333
- }
334
- if (autoUpdateMode === 'config-and-version') {
335
- logger.info(`New node version detected. Please update and restart the node`, { latestVersion, currentVersion });
336
- await shutdown(logger.info, ExitCode.VERSION_UPGRADE, signalHandlers);
337
- } else if (autoUpdateMode === 'notify') {
338
- logger.info(`New node version detected. Please update and restart the node`, { latestVersion, currentVersion });
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
+ });
339
333
  }
340
- });
334
+ }
341
335
 
342
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
343
- checker.on('updateNodeConfig', async config => {
336
+ const checker = new VersionChecker(checks, 600_000, logger);
337
+ checker.on('newVersion', ({ name, latestVersion, currentVersion }) => {
344
338
  if (isShuttingDown()) {
345
339
  return;
346
340
  }
347
341
 
348
- if ((autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') && updateNodeConfig) {
349
- logger.warn(`Config change detected. Updating node`, config);
350
- try {
351
- await updateNodeConfig(config);
352
- } catch (err) {
353
- logger.warn('Failed to update config', { err });
354
- }
355
- }
356
- // don't notify on these config changes
357
- });
358
-
359
- checker.on('updatePublicTelemetryConfig', config => {
360
- if (autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') {
361
- logger.warn(`Public telemetry config change detected. Updating telemetry client`, config);
362
- try {
363
- const publicIncludeMetrics: unknown = (config as any).publicIncludeMetrics;
364
- if (Array.isArray(publicIncludeMetrics) && publicIncludeMetrics.every(m => typeof m === 'string')) {
365
- getTelemetryClient().setExportedPublicTelemetry(publicIncludeMetrics);
366
- }
367
- const publicMetricsCollectFrom: unknown = (config as any).publicMetricsCollectFrom;
368
- if (Array.isArray(publicMetricsCollectFrom) && publicMetricsCollectFrom.every(m => typeof m === 'string')) {
369
- getTelemetryClient().setPublicTelemetryCollectFrom(publicMetricsCollectFrom);
370
- }
371
- } catch (err) {
372
- logger.warn('Failed to update config', { err });
373
- }
374
- }
375
- // don't notify on these config changes
342
+ logger.warn(`New ${name} version available`, { latestVersion, currentVersion });
376
343
  });
377
-
378
344
  checker.start();
345
+ signalHandlers.push(() => checker.stop());
379
346
  }
380
347
 
381
348
  export function stringifyConfig(config: object): string {
@@ -32,7 +32,9 @@ async function main() {
32
32
  logger.info(`Fetched Alice and Bob accounts: ${alice.toString()}, ${bob.toString()}`);
33
33
 
34
34
  logger.info('Deploying Token...');
35
- const token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({ from: alice });
35
+ const { contract: token } = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({
36
+ from: alice,
37
+ });
36
38
  logger.info('Token deployed');
37
39
 
38
40
  // Mint tokens to Alice
@@ -41,7 +43,7 @@ async function main() {
41
43
 
42
44
  logger.info(`${ALICE_MINT_BALANCE} tokens were successfully minted by Alice and transferred to private`);
43
45
 
44
- const balanceAfterMint = await token.methods.balance_of_private(alice).simulate({ from: alice });
46
+ const { result: balanceAfterMint } = await token.methods.balance_of_private(alice).simulate({ from: alice });
45
47
  logger.info(`Tokens successfully minted. New Alice's balance: ${balanceAfterMint}`);
46
48
 
47
49
  // We will now transfer tokens from Alice to Bob
@@ -49,10 +51,10 @@ async function main() {
49
51
  await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice });
50
52
 
51
53
  // Check the new balances
52
- const aliceBalance = await token.methods.balance_of_private(alice).simulate({ from: alice });
54
+ const { result: aliceBalance } = await token.methods.balance_of_private(alice).simulate({ from: alice });
53
55
  logger.info(`Alice's balance ${aliceBalance}`);
54
56
 
55
- const bobBalance = await token.methods.balance_of_private(bob).simulate({ from: bob });
57
+ const { result: bobBalance } = await token.methods.balance_of_private(bob).simulate({ from: bob });
56
58
  logger.info(`Bob's balance ${bobBalance}`);
57
59
  }
58
60
 
@@ -48,7 +48,7 @@ export async function getBananaFPCAddress(initialAccounts: InitialAccountData[])
48
48
  export async function setupBananaFPC(initialAccounts: InitialAccountData[], wallet: Wallet, log: LogFn) {
49
49
  const bananaCoinAddress = await getBananaCoinAddress(initialAccounts);
50
50
  const admin = getBananaAdmin(initialAccounts);
51
- const [bananaCoin, fpc] = await Promise.all([
51
+ const [{ contract: bananaCoin }, { contract: fpc }] = await Promise.all([
52
52
  TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal).send({
53
53
  from: admin,
54
54
  contractAddressSalt: BANANA_COIN_SALT,
@@ -16,10 +16,15 @@ import { SecretValue } from '@aztec/foundation/config';
16
16
  import { EthAddress } from '@aztec/foundation/eth-address';
17
17
  import type { LogFn } from '@aztec/foundation/log';
18
18
  import { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
19
+ import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
19
20
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
20
21
  import { protocolContractsHash } from '@aztec/protocol-contracts';
21
22
  import { SequencerState } from '@aztec/sequencer-client';
22
- import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
23
+ import { FunctionSelector, countArgumentsSize } from '@aztec/stdlib/abi';
24
+ import type { FunctionAbi } from '@aztec/stdlib/abi';
25
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
26
+ import { getContractClassFromArtifact } from '@aztec/stdlib/contract';
27
+ import type { AllowedElement, ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
23
28
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
24
29
  import {
25
30
  type TelemetryClient,
@@ -43,6 +48,38 @@ import { getSponsoredFPCAddress } from './sponsored_fpc.js';
43
48
 
44
49
  const logger = createLogger('local-network');
45
50
 
51
+ /**
52
+ * Returns Token-specific allowlist entries for FPC-based fee payments.
53
+ * The local network deploys a banana FPC and Token contracts, so the node must allow Token setup functions.
54
+ */
55
+ async function getTokenAllowedSetupFunctions(): Promise<AllowedElement[]> {
56
+ const tokenClassId = (await getContractClassFromArtifact(TokenContractArtifact)).id;
57
+ const allFunctions: FunctionAbi[] = (TokenContractArtifact.functions as FunctionAbi[]).concat(
58
+ TokenContractArtifact.nonDispatchPublicFunctions || [],
59
+ );
60
+ const getCalldataLength = (name: string) => {
61
+ const fn = allFunctions.find(f => f.name === name)!;
62
+ return 1 + countArgumentsSize(fn);
63
+ };
64
+ const increaseBalanceSelector = await FunctionSelector.fromSignature('_increase_public_balance((Field),u128)');
65
+ const transferInPublicSelector = await FunctionSelector.fromSignature(
66
+ 'transfer_in_public((Field),(Field),u128,Field)',
67
+ );
68
+ return [
69
+ {
70
+ classId: tokenClassId,
71
+ selector: increaseBalanceSelector,
72
+ calldataLength: getCalldataLength('_increase_public_balance'),
73
+ onlySelf: true,
74
+ },
75
+ {
76
+ classId: tokenClassId,
77
+ selector: transferInPublicSelector,
78
+ calldataLength: getCalldataLength('transfer_in_public'),
79
+ },
80
+ ];
81
+ }
82
+
46
83
  const localAnvil = foundry;
47
84
 
48
85
  /**
@@ -101,9 +138,14 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
101
138
  logger.warn(`Multiple L1 RPC URLs provided. Local networks will only use the first one: ${l1RpcUrl}`);
102
139
  }
103
140
 
141
+ // The local network deploys a banana FPC with Token contracts, so include Token entries
142
+ // in the setup allowlist so FPC-based fee payments work out of the box.
143
+ const tokenAllowList = await getTokenAllowedSetupFunctions();
144
+
104
145
  const aztecNodeConfig: AztecNodeConfig = {
105
146
  ...getConfigEnvVars(),
106
147
  ...config,
148
+ txPublicSetupAllowListExtend: [...tokenAllowList, ...(config.txPublicSetupAllowListExtend ?? [])],
107
149
  };
108
150
  const hdAccount = mnemonicToAccount(config.l1Mnemonic || DefaultMnemonic);
109
151
  if (
@@ -138,9 +180,12 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
138
180
 
139
181
  const bananaFPC = await getBananaFPCAddress(initialAccounts);
140
182
  const sponsoredFPC = await getSponsoredFPCAddress();
141
- const fundedAddresses = initialAccounts.length
142
- ? [...initialAccounts.map(a => a.address), bananaFPC, sponsoredFPC]
143
- : [];
183
+ const prefundAddresses = (aztecNodeConfig.prefundAddresses ?? []).map(a => AztecAddress.fromString(a));
184
+ const fundedAddresses = [
185
+ ...initialAccounts.map(a => a.address),
186
+ ...(initialAccounts.length ? [bananaFPC, sponsoredFPC] : []),
187
+ ...prefundAddresses,
188
+ ];
144
189
  const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(fundedAddresses);
145
190
 
146
191
  const dateProvider = new TestDateProvider();
@@ -1,2 +0,0 @@
1
- export declare const getCliVersion: () => any;
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsZWFzZV92ZXJzaW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL3JlbGVhc2VfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxlQUFPLE1BQU0sYUFBYSxXQWV6QixDQUFDIn0=
@@ -1 +0,0 @@
1
- {"version":3,"file":"release_version.d.ts","sourceRoot":"","sources":["../../src/cli/release_version.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa,WAezB,CAAC"}
@@ -1,14 +0,0 @@
1
- import { fileURLToPath } from '@aztec/foundation/url';
2
- import { readFileSync } from 'fs';
3
- import { dirname, resolve } from 'path';
4
- export const getCliVersion = ()=>{
5
- const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json');
6
- const cliVersion = JSON.parse(readFileSync(packageJsonPath).toString()).version;
7
- // 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
8
- if (cliVersion === '0.1.0') {
9
- const releasePleasePath = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../.release-please-manifest.json');
10
- const releaseVersion = JSON.parse(readFileSync(releasePleasePath).toString())['.'];
11
- return releaseVersion;
12
- }
13
- return cliVersion;
14
- };
@@ -1,21 +0,0 @@
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
- };