@aztec/aztec 0.0.1-commit.03f7ef2 → 0.0.1-commit.0658669b3

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 (115) hide show
  1. package/dest/bin/index.js +7 -1
  2. package/dest/cli/admin_api_key_store.d.ts +45 -0
  3. package/dest/cli/admin_api_key_store.d.ts.map +1 -0
  4. package/dest/cli/admin_api_key_store.js +98 -0
  5. package/dest/cli/aztec_start_action.d.ts +1 -1
  6. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  7. package/dest/cli/aztec_start_action.js +50 -9
  8. package/dest/cli/aztec_start_options.d.ts +1 -1
  9. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  10. package/dest/cli/aztec_start_options.js +27 -8
  11. package/dest/cli/cli.d.ts +1 -1
  12. package/dest/cli/cli.d.ts.map +1 -1
  13. package/dest/cli/cli.js +4 -37
  14. package/dest/cli/cmds/compile.d.ts +4 -0
  15. package/dest/cli/cmds/compile.d.ts.map +1 -0
  16. package/dest/cli/cmds/compile.js +68 -0
  17. package/dest/cli/cmds/migrate_ha_db.d.ts +3 -0
  18. package/dest/cli/cmds/migrate_ha_db.d.ts.map +1 -0
  19. package/dest/cli/cmds/migrate_ha_db.js +27 -0
  20. package/dest/cli/cmds/profile.d.ts +4 -0
  21. package/dest/cli/cmds/profile.d.ts.map +1 -0
  22. package/dest/cli/cmds/profile.js +8 -0
  23. package/dest/cli/cmds/profile_flamegraph.d.ts +4 -0
  24. package/dest/cli/cmds/profile_flamegraph.d.ts.map +1 -0
  25. package/dest/cli/cmds/profile_flamegraph.js +51 -0
  26. package/dest/cli/cmds/profile_gates.d.ts +4 -0
  27. package/dest/cli/cmds/profile_gates.d.ts.map +1 -0
  28. package/dest/cli/cmds/profile_gates.js +57 -0
  29. package/dest/cli/cmds/profile_utils.d.ts +18 -0
  30. package/dest/cli/cmds/profile_utils.d.ts.map +1 -0
  31. package/dest/cli/cmds/profile_utils.js +50 -0
  32. package/dest/cli/cmds/start_archiver.d.ts +1 -1
  33. package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
  34. package/dest/cli/cmds/start_archiver.js +5 -7
  35. package/dest/cli/cmds/start_bot.d.ts +3 -3
  36. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  37. package/dest/cli/cmds/start_bot.js +9 -5
  38. package/dest/cli/cmds/start_node.d.ts +1 -1
  39. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  40. package/dest/cli/cmds/start_node.js +62 -10
  41. package/dest/cli/cmds/start_p2p_bootstrap.d.ts +2 -2
  42. package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -1
  43. package/dest/cli/cmds/start_p2p_bootstrap.js +1 -2
  44. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  45. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  46. package/dest/cli/cmds/start_prover_agent.js +3 -3
  47. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  48. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  49. package/dest/cli/cmds/start_prover_broker.js +2 -2
  50. package/dest/cli/cmds/utils/artifacts.d.ts +21 -0
  51. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -0
  52. package/dest/cli/cmds/utils/artifacts.js +24 -0
  53. package/dest/cli/cmds/utils/spawn.d.ts +3 -0
  54. package/dest/cli/cmds/utils/spawn.d.ts.map +1 -0
  55. package/dest/cli/cmds/utils/spawn.js +16 -0
  56. package/dest/cli/util.d.ts +5 -14
  57. package/dest/cli/util.d.ts.map +1 -1
  58. package/dest/cli/util.js +11 -6
  59. package/dest/examples/token.js +5 -5
  60. package/dest/local-network/banana_fpc.d.ts +1 -1
  61. package/dest/local-network/banana_fpc.d.ts.map +1 -1
  62. package/dest/local-network/banana_fpc.js +2 -2
  63. package/dest/local-network/local-network.d.ts +4 -3
  64. package/dest/local-network/local-network.d.ts.map +1 -1
  65. package/dest/local-network/local-network.js +51 -20
  66. package/dest/testing/anvil_test_watcher.d.ts +9 -1
  67. package/dest/testing/anvil_test_watcher.d.ts.map +1 -1
  68. package/dest/testing/anvil_test_watcher.js +52 -15
  69. package/dest/testing/cheat_codes.d.ts +3 -1
  70. package/dest/testing/cheat_codes.d.ts.map +1 -1
  71. package/dest/testing/epoch_test_settler.d.ts +19 -0
  72. package/dest/testing/epoch_test_settler.d.ts.map +1 -0
  73. package/dest/testing/epoch_test_settler.js +62 -0
  74. package/dest/testing/index.d.ts +2 -1
  75. package/dest/testing/index.d.ts.map +1 -1
  76. package/dest/testing/index.js +1 -0
  77. package/package.json +35 -34
  78. package/scripts/aztec.sh +18 -8
  79. package/scripts/init.sh +23 -13
  80. package/scripts/new.sh +17 -16
  81. package/scripts/setup_workspace.sh +124 -0
  82. package/src/bin/index.ts +7 -1
  83. package/src/cli/admin_api_key_store.ts +128 -0
  84. package/src/cli/aztec_start_action.ts +53 -4
  85. package/src/cli/aztec_start_options.ts +28 -6
  86. package/src/cli/cli.ts +4 -37
  87. package/src/cli/cmds/compile.ts +80 -0
  88. package/src/cli/cmds/migrate_ha_db.ts +43 -0
  89. package/src/cli/cmds/profile.ts +25 -0
  90. package/src/cli/cmds/profile_flamegraph.ts +63 -0
  91. package/src/cli/cmds/profile_gates.ts +67 -0
  92. package/src/cli/cmds/profile_utils.ts +58 -0
  93. package/src/cli/cmds/start_archiver.ts +2 -13
  94. package/src/cli/cmds/start_bot.ts +8 -5
  95. package/src/cli/cmds/start_node.ts +51 -9
  96. package/src/cli/cmds/start_p2p_bootstrap.ts +2 -2
  97. package/src/cli/cmds/start_prover_agent.ts +3 -11
  98. package/src/cli/cmds/start_prover_broker.ts +5 -1
  99. package/src/cli/cmds/utils/artifacts.ts +44 -0
  100. package/src/cli/cmds/utils/spawn.ts +16 -0
  101. package/src/cli/util.ts +15 -20
  102. package/src/examples/token.ts +5 -7
  103. package/src/local-network/banana_fpc.ts +10 -6
  104. package/src/local-network/local-network.ts +72 -27
  105. package/src/testing/anvil_test_watcher.ts +59 -15
  106. package/src/testing/epoch_test_settler.ts +71 -0
  107. package/src/testing/index.ts +1 -0
  108. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  109. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  110. package/dest/cli/cmds/start_prover_node.js +0 -108
  111. package/scripts/compile.sh +0 -44
  112. package/scripts/extract_function.js +0 -47
  113. package/scripts/flamegraph.sh +0 -59
  114. package/scripts/setup_project.sh +0 -31
  115. package/src/cli/cmds/start_prover_node.ts +0 -124
@@ -6,16 +6,19 @@ import { getL1Config } from '@aztec/cli/config';
6
6
  import { getPublicClient } from '@aztec/ethereum/client';
7
7
  import { SecretValue } from '@aztec/foundation/config';
8
8
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
9
+ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
9
10
  import type { LogFn } from '@aztec/foundation/log';
11
+ import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker';
10
12
  import { type CliPXEOptions, type PXEConfig, allPxeConfigMappings } from '@aztec/pxe/config';
11
13
  import { AztecNodeAdminApiSchema, AztecNodeApiSchema } from '@aztec/stdlib/interfaces/client';
12
- import { P2PApiSchema } from '@aztec/stdlib/interfaces/server';
14
+ import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
13
15
  import {
14
16
  type TelemetryClientConfig,
15
17
  initTelemetryClient,
18
+ makeTracedFetch,
16
19
  telemetryClientConfigMappings,
17
20
  } from '@aztec/telemetry-client';
18
- import { TestWallet } from '@aztec/test-wallet/server';
21
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
19
22
  import { getGenesisValues } from '@aztec/world-state/testing';
20
23
 
21
24
  import { createAztecNode } from '../../local-network/index.js';
@@ -25,6 +28,8 @@ import {
25
28
  preloadCrsDataForVerifying,
26
29
  setupUpdateMonitor,
27
30
  } from '../util.js';
31
+ import { getVersions } from '../versioning.js';
32
+ import { startProverBroker } from './start_prover_broker.js';
28
33
 
29
34
  export async function startNode(
30
35
  options: any,
@@ -45,9 +50,32 @@ export async function startNode(
45
50
  ...relevantOptions,
46
51
  };
47
52
 
53
+ // Prover node configuration and broker setup
54
+ // REFACTOR: Move the broker setup out of here and into the prover-node factory
55
+ let broker: ProvingJobBroker | undefined = undefined;
48
56
  if (options.proverNode) {
49
- userLog(`Running a Prover Node within a Node is not yet supported`);
50
- process.exit(1);
57
+ nodeConfig.enableProverNode = true;
58
+ if (nodeConfig.proverAgentCount === 0) {
59
+ userLog(
60
+ `Running prover node without local prover agent. Connect prover agents or pass --proverAgent.proverAgentCount`,
61
+ );
62
+ }
63
+ if (nodeConfig.proverBrokerUrl) {
64
+ // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
65
+ // set a lower connection limit such that we don't overload the server
66
+ // Keep retrying up to 30s
67
+ const fetch = makeTracedFetch(
68
+ [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
69
+ false,
70
+ makeUndiciFetch(new Agent({ connections: 100 })),
71
+ );
72
+ broker = createProvingJobBrokerClient(nodeConfig.proverBrokerUrl, getVersions(nodeConfig), fetch);
73
+ } else if (options.proverBroker) {
74
+ ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
75
+ } else {
76
+ userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
77
+ process.exit(1);
78
+ }
51
79
  }
52
80
 
53
81
  await preloadCrsDataForVerifying(nodeConfig, userLog);
@@ -101,12 +129,17 @@ export async function startNode(
101
129
  ...extractNamespacedOptions(options, 'sequencer'),
102
130
  };
103
131
  // If no publisher private keys have been given, use the first validator key
104
- if (sequencerConfig.publisherPrivateKeys === undefined || !sequencerConfig.publisherPrivateKeys.length) {
132
+ if (
133
+ sequencerConfig.sequencerPublisherPrivateKeys === undefined ||
134
+ !sequencerConfig.sequencerPublisherPrivateKeys.length
135
+ ) {
105
136
  if (sequencerConfig.validatorPrivateKeys?.getValue().length) {
106
- sequencerConfig.publisherPrivateKeys = [new SecretValue(sequencerConfig.validatorPrivateKeys.getValue()[0])];
137
+ sequencerConfig.sequencerPublisherPrivateKeys = [
138
+ new SecretValue(sequencerConfig.validatorPrivateKeys.getValue()[0]),
139
+ ];
107
140
  }
108
141
  }
109
- nodeConfig.publisherPrivateKeys = sequencerConfig.publisherPrivateKeys;
142
+ nodeConfig.sequencerPublisherPrivateKeys = sequencerConfig.sequencerPublisherPrivateKeys;
110
143
  }
111
144
 
112
145
  if (nodeConfig.p2pEnabled) {
@@ -120,13 +153,22 @@ export async function startNode(
120
153
  const telemetry = await initTelemetryClient(telemetryConfig);
121
154
 
122
155
  // Create and start Aztec Node
123
- const node = await createAztecNode(nodeConfig, { telemetry }, { prefilledPublicData });
156
+ const node = await createAztecNode(nodeConfig, { telemetry, proverBroker: broker }, { prefilledPublicData });
124
157
 
125
158
  // Add node and p2p to services list
126
159
  services.node = [node, AztecNodeApiSchema];
127
160
  services.p2p = [node.getP2P(), P2PApiSchema];
128
161
  adminServices.nodeAdmin = [node, AztecNodeAdminApiSchema];
129
162
 
163
+ // Register prover-node services if the prover node subsystem is running
164
+ const proverNode = node.getProverNode();
165
+ if (proverNode) {
166
+ services.prover = [proverNode, ProverNodeApiSchema];
167
+ if (!nodeConfig.proverBrokerUrl) {
168
+ services.provingJobSource = [proverNode.getProver().getProvingJobSource(), ProvingJobConsumerSchema];
169
+ }
170
+ }
171
+
130
172
  // Add node stop function to signal handlers
131
173
  signalHandlers.push(node.stop.bind(node));
132
174
 
@@ -135,7 +177,7 @@ export async function startNode(
135
177
  const { addBot } = await import('./start_bot.js');
136
178
 
137
179
  const pxeConfig = extractRelevantOptions<PXEConfig & CliPXEOptions>(options, allPxeConfigMappings, 'pxe');
138
- const wallet = await TestWallet.create(node, pxeConfig);
180
+ const wallet = await EmbeddedWallet.create(node, { pxeConfig });
139
181
 
140
182
  await addBot(options, signalHandlers, services, wallet, node, telemetry, undefined);
141
183
  }
@@ -1,6 +1,6 @@
1
1
  import { jsonStringify } from '@aztec/foundation/json-rpc';
2
2
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
3
- import { type LogFn, createLogger } from '@aztec/foundation/log';
3
+ import type { LogFn } from '@aztec/foundation/log';
4
4
  import { createStore } from '@aztec/kv-store/lmdb-v2';
5
5
  import { type BootnodeConfig, BootstrapNode, bootnodeConfigMappings } from '@aztec/p2p';
6
6
  import { emptyChainConfig } from '@aztec/stdlib/config';
@@ -27,7 +27,7 @@ export async function startP2PBootstrap(
27
27
  const telemetryConfig = extractRelevantOptions<TelemetryClientConfig>(options, telemetryClientConfigMappings, 'tel');
28
28
  const telemetryClient = await initTelemetryClient(telemetryConfig);
29
29
 
30
- const store = await createStore('p2p-bootstrap', 1, config, createLogger('p2p:bootstrap:store'));
30
+ const store = await createStore('p2p-bootstrap', 1, config);
31
31
  const node = new BootstrapNode(store, telemetryClient);
32
32
  await node.start(config);
33
33
  signalHandlers.push(() => node.stop());
@@ -4,9 +4,9 @@ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
4
4
  import type { LogFn } from '@aztec/foundation/log';
5
5
  import { buildServerCircuitProver } from '@aztec/prover-client';
6
6
  import {
7
- InlineProofStore,
8
7
  type ProverAgentConfig,
9
8
  ProvingAgent,
9
+ createProofStore,
10
10
  createProvingJobBrokerClient,
11
11
  proverAgentConfigMappings,
12
12
  } from '@aztec/prover-client/broker';
@@ -55,18 +55,10 @@ export async function startProverAgent(
55
55
 
56
56
  const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
57
57
  const prover = await buildServerCircuitProver(config, telemetry);
58
- const proofStore = new InlineProofStore();
58
+ const proofStore = await createProofStore(config.proofStore);
59
59
  const agents = times(
60
60
  config.proverAgentCount,
61
- () =>
62
- new ProvingAgent(
63
- broker,
64
- proofStore,
65
- prover,
66
- config.proverAgentProofTypes,
67
- config.proverAgentPollIntervalMs,
68
- telemetry,
69
- ),
61
+ () => new ProvingAgent(broker, proofStore, prover, config.proverAgentProofTypes, config.proverAgentPollIntervalMs),
70
62
  );
71
63
 
72
64
  // expose all agents as individual services
@@ -5,6 +5,7 @@ import type { LogFn } from '@aztec/foundation/log';
5
5
  import {
6
6
  type ProverBrokerConfig,
7
7
  ProvingJobBrokerSchema,
8
+ ProvingJobBrokerSchemaWithDebug,
8
9
  createAndStartProvingBroker,
9
10
  proverBrokerConfigMappings,
10
11
  } from '@aztec/prover-client/broker';
@@ -59,7 +60,10 @@ export async function startProverBroker(
59
60
  );
60
61
  }
61
62
 
62
- services.proverBroker = [broker, ProvingJobBrokerSchema];
63
+ services.proverBroker = [
64
+ broker,
65
+ config.proverBrokerDebugReplayEnabled ? ProvingJobBrokerSchemaWithDebug : ProvingJobBrokerSchema,
66
+ ];
63
67
  signalHandlers.push(() => broker.stop());
64
68
 
65
69
  return { broker, config };
@@ -0,0 +1,44 @@
1
+ import { readFile, readdir } from 'fs/promises';
2
+ import { join } from 'path';
3
+
4
+ export interface CompiledArtifact {
5
+ noir_version: string;
6
+ file_map: unknown;
7
+ functions: ContractFunction[];
8
+ bytecode?: string;
9
+ }
10
+
11
+ export interface ContractFunction {
12
+ name: string;
13
+ abi: unknown;
14
+ bytecode: string;
15
+ debug_symbols: unknown;
16
+ is_unconstrained?: boolean;
17
+ }
18
+
19
+ export interface ArtifactFile {
20
+ name: string;
21
+ filePath: string;
22
+ content: CompiledArtifact;
23
+ }
24
+
25
+ /** Reads all JSON artifact files from a target directory and returns their parsed contents. */
26
+ export async function readArtifactFiles(targetDir: string): Promise<ArtifactFile[]> {
27
+ let entries: string[];
28
+ try {
29
+ entries = (await readdir(targetDir)).filter(f => f.endsWith('.json'));
30
+ } catch (err: any) {
31
+ if (err?.code === 'ENOENT') {
32
+ throw new Error(`Target directory '${targetDir}' does not exist. Compile first with 'aztec compile'.`);
33
+ }
34
+ throw err;
35
+ }
36
+
37
+ const artifacts: ArtifactFile[] = [];
38
+ for (const file of entries) {
39
+ const filePath = join(targetDir, file);
40
+ const content = JSON.parse(await readFile(filePath, 'utf-8')) as CompiledArtifact;
41
+ artifacts.push({ name: file.replace('.json', ''), filePath, content });
42
+ }
43
+ return artifacts;
44
+ }
@@ -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
+ }
package/src/cli/util.ts CHANGED
@@ -2,13 +2,13 @@ import type { AztecNodeConfig } from '@aztec/aztec-node';
2
2
  import type { AccountManager } from '@aztec/aztec.js/wallet';
3
3
  import type { ViemClient } from '@aztec/ethereum/types';
4
4
  import type { ConfigMappingsType } from '@aztec/foundation/config';
5
- import { Fr } from '@aztec/foundation/curves/bn254';
6
5
  import { EthAddress } from '@aztec/foundation/eth-address';
6
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
7
7
  import { type LogFn, createLogger } from '@aztec/foundation/log';
8
8
  import type { SharedNodeConfig } from '@aztec/node-lib/config';
9
9
  import type { ProverConfig } from '@aztec/stdlib/interfaces/server';
10
10
  import { getTelemetryClient } from '@aztec/telemetry-client/start';
11
- import type { TestWallet } from '@aztec/test-wallet/server';
11
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
12
12
 
13
13
  import chalk from 'chalk';
14
14
  import type { Command } from 'commander';
@@ -36,7 +36,7 @@ export function shutdown(logFn: LogFn, exitCode: ExitCode, cb?: Array<() => Prom
36
36
 
37
37
  logFn('Shutting down...', { exitCode });
38
38
  if (cb) {
39
- shutdownPromise = Promise.allSettled(cb).then(() => process.exit(exitCode));
39
+ shutdownPromise = Promise.allSettled(cb.map(fn => fn())).then(() => process.exit(exitCode));
40
40
  } else {
41
41
  // synchronously shuts down the process
42
42
  // no need to set shutdownPromise on this branch of the if statement because no more code will be executed
@@ -68,30 +68,19 @@ export const installSignalHandlers = (logFn: LogFn, cb?: Array<() => Promise<voi
68
68
  /**
69
69
  * Creates logs for the initial accounts
70
70
  * @param accounts - The initial accounts
71
- * @param wallet - A TestWallet instance to get the registered accounts
71
+ * @param wallet - A EmbeddedWallet instance to get the registered accounts
72
72
  * @returns A string array containing the initial accounts details
73
73
  */
74
- export async function createAccountLogs(
75
- accountsWithSecretKeys: {
76
- /**
77
- * The account object
78
- */
79
- account: AccountManager;
80
- /**
81
- * The secret key of the account
82
- */
83
- secretKey: Fr;
84
- }[],
85
- wallet: TestWallet,
86
- ) {
74
+ export async function createAccountLogs(accountManagers: AccountManager[], wallet: EmbeddedWallet) {
87
75
  const registeredAccounts = await wallet.getAccounts();
88
76
  const accountLogStrings = [`Initial Accounts:\n\n`];
89
- for (const accountWithSecretKey of accountsWithSecretKeys) {
90
- const completeAddress = await accountWithSecretKey.account.getCompleteAddress();
77
+ for (const accountManager of accountManagers) {
78
+ const account = await accountManager.getAccount();
79
+ const completeAddress = account.getCompleteAddress();
91
80
  if (registeredAccounts.find(a => a.item.equals(completeAddress.address))) {
92
81
  accountLogStrings.push(` Address: ${completeAddress.address.toString()}\n`);
93
82
  accountLogStrings.push(` Partial Address: ${completeAddress.partialAddress.toString()}\n`);
94
- accountLogStrings.push(` Secret Key: ${accountWithSecretKey.secretKey.toString()}\n`);
83
+ accountLogStrings.push(` Secret Key: ${account.getSecretKey().toString()}\n`);
95
84
  accountLogStrings.push(
96
85
  ` Master nullifier public key: ${completeAddress.publicKeys.masterNullifierPublicKey.toString()}\n`,
97
86
  );
@@ -388,3 +377,9 @@ export async function setupUpdateMonitor(
388
377
 
389
378
  checker.start();
390
379
  }
380
+
381
+ export function stringifyConfig(config: object): string {
382
+ return Object.entries(config)
383
+ .map(([key, value]) => `${key}=${jsonStringify(value)}`)
384
+ .join(' ');
385
+ }
@@ -2,7 +2,7 @@ import { getInitialTestAccountsData } from '@aztec/accounts/testing';
2
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
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
6
6
 
7
7
  const logger = createLogger('example:token');
8
8
 
@@ -19,7 +19,7 @@ const TRANSFER_AMOUNT = 33n;
19
19
  async function main() {
20
20
  logger.info('Running token contract test on HTTP interface.');
21
21
 
22
- const wallet = await TestWallet.create(node);
22
+ const wallet = await EmbeddedWallet.create(node);
23
23
 
24
24
  // During local network setup we deploy a few accounts. Below we add them to our wallet.
25
25
  const [aliceInitialAccountData, bobInitialAccountData] = await getInitialTestAccountsData();
@@ -32,14 +32,12 @@ 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)
36
- .send({ from: alice })
37
- .deployed();
35
+ const token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({ from: alice });
38
36
  logger.info('Token deployed');
39
37
 
40
38
  // Mint tokens to Alice
41
39
  logger.info(`Minting ${ALICE_MINT_BALANCE} more coins to Alice...`);
42
- await token.methods.mint_to_private(alice, ALICE_MINT_BALANCE).send({ from: alice }).wait();
40
+ await token.methods.mint_to_private(alice, ALICE_MINT_BALANCE).send({ from: alice });
43
41
 
44
42
  logger.info(`${ALICE_MINT_BALANCE} tokens were successfully minted by Alice and transferred to private`);
45
43
 
@@ -48,7 +46,7 @@ async function main() {
48
46
 
49
47
  // We will now transfer tokens from Alice to Bob
50
48
  logger.info(`Transferring ${TRANSFER_AMOUNT} tokens from Alice to Bob...`);
51
- await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice }).wait();
49
+ await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice });
52
50
 
53
51
  // Check the new balances
54
52
  const aliceBalance = await token.methods.balance_of_private(alice).simulate({ from: alice });
@@ -49,12 +49,16 @@ export async function setupBananaFPC(initialAccounts: InitialAccountData[], wall
49
49
  const bananaCoinAddress = await getBananaCoinAddress(initialAccounts);
50
50
  const admin = getBananaAdmin(initialAccounts);
51
51
  const [bananaCoin, fpc] = await Promise.all([
52
- TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal)
53
- .send({ from: admin, contractAddressSalt: BANANA_COIN_SALT, universalDeploy: true })
54
- .deployed(),
55
- FPCContract.deploy(wallet, bananaCoinAddress, admin)
56
- .send({ from: admin, contractAddressSalt: BANANA_FPC_SALT, universalDeploy: true })
57
- .deployed(),
52
+ TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal).send({
53
+ from: admin,
54
+ contractAddressSalt: BANANA_COIN_SALT,
55
+ universalDeploy: true,
56
+ }),
57
+ FPCContract.deploy(wallet, bananaCoinAddress, admin).send({
58
+ from: admin,
59
+ contractAddressSalt: BANANA_FPC_SALT,
60
+ universalDeploy: true,
61
+ }),
58
62
  ]);
59
63
 
60
64
  log(`BananaCoin: ${bananaCoin.address}`);
@@ -18,13 +18,16 @@ import type { LogFn } from '@aztec/foundation/log';
18
18
  import { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
19
19
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
20
20
  import { protocolContractsHash } from '@aztec/protocol-contracts';
21
+ import { SequencerState } from '@aztec/sequencer-client';
22
+ import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
21
23
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
22
24
  import {
23
25
  type TelemetryClient,
24
26
  getConfigEnvVars as getTelemetryClientConfig,
25
27
  initTelemetryClient,
26
28
  } from '@aztec/telemetry-client';
27
- import { TestWallet, deployFundedSchnorrAccounts } from '@aztec/test-wallet/server';
29
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
30
+ import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
28
31
  import { getGenesisValues } from '@aztec/world-state/testing';
29
32
 
30
33
  import { type Hex, createPublicClient, fallback, http as httpViemTransport } from 'viem';
@@ -34,6 +37,7 @@ import { foundry } from 'viem/chains';
34
37
  import { createAccountLogs } from '../cli/util.js';
35
38
  import { DefaultMnemonic } from '../mnemonic.js';
36
39
  import { AnvilTestWatcher } from '../testing/anvil_test_watcher.js';
40
+ import { EpochTestSettler } from '../testing/epoch_test_settler.js';
37
41
  import { getBananaFPCAddress, setupBananaFPC } from './banana_fpc.js';
38
42
  import { getSponsoredFPCAddress } from './sponsored_fpc.js';
39
43
 
@@ -50,7 +54,6 @@ export async function deployContractsToL1(
50
54
  aztecNodeConfig: AztecNodeConfig,
51
55
  privateKey: Hex,
52
56
  opts: {
53
- assumeProvenThroughBlockNumber?: number;
54
57
  genesisArchiveRoot?: Fr;
55
58
  feeJuicePortalInitialBalance?: bigint;
56
59
  } = {},
@@ -97,15 +100,21 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
97
100
  if ((config.l1RpcUrls?.length || 0) > 1) {
98
101
  logger.warn(`Multiple L1 RPC URLs provided. Local networks will only use the first one: ${l1RpcUrl}`);
99
102
  }
100
- const aztecNodeConfig: AztecNodeConfig = { ...getConfigEnvVars(), ...config };
103
+
104
+ const aztecNodeConfig: AztecNodeConfig = {
105
+ ...getConfigEnvVars(),
106
+ ...config,
107
+ };
101
108
  const hdAccount = mnemonicToAccount(config.l1Mnemonic || DefaultMnemonic);
102
109
  if (
103
- aztecNodeConfig.publisherPrivateKeys == undefined ||
104
- !aztecNodeConfig.publisherPrivateKeys.length ||
105
- aztecNodeConfig.publisherPrivateKeys[0].getValue() === NULL_KEY
110
+ aztecNodeConfig.sequencerPublisherPrivateKeys == undefined ||
111
+ !aztecNodeConfig.sequencerPublisherPrivateKeys.length ||
112
+ aztecNodeConfig.sequencerPublisherPrivateKeys[0].getValue() === NULL_KEY
106
113
  ) {
107
114
  const privKey = hdAccount.getHdKey().privateKey;
108
- aztecNodeConfig.publisherPrivateKeys = [new SecretValue(`0x${Buffer.from(privKey!).toString('hex')}` as const)];
115
+ aztecNodeConfig.sequencerPublisherPrivateKeys = [
116
+ new SecretValue(`0x${Buffer.from(privKey!).toString('hex')}` as const),
117
+ ];
109
118
  }
110
119
  if (!aztecNodeConfig.validatorPrivateKeys?.getValue().length) {
111
120
  const privKey = hdAccount.getHdKey().privateKey;
@@ -134,18 +143,20 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
134
143
  : [];
135
144
  const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(fundedAddresses);
136
145
 
137
- let watcher: AnvilTestWatcher | undefined = undefined;
138
146
  const dateProvider = new TestDateProvider();
147
+
148
+ let cheatcodes: EthCheatCodes | undefined;
149
+ let rollupAddress: EthAddress | undefined;
150
+ let watcher: AnvilTestWatcher | undefined;
139
151
  if (!aztecNodeConfig.p2pEnabled) {
140
- const l1ContractAddresses = await deployContractsToL1(
152
+ ({ rollupAddress } = await deployContractsToL1(
141
153
  aztecNodeConfig,
142
154
  aztecNodeConfig.validatorPrivateKeys.getValue()[0],
143
155
  {
144
- assumeProvenThroughBlockNumber: Number.MAX_SAFE_INTEGER,
145
156
  genesisArchiveRoot,
146
157
  feeJuicePortalInitialBalance: fundingNeeded,
147
158
  },
148
- );
159
+ ));
149
160
 
150
161
  const chain =
151
162
  aztecNodeConfig.l1RpcUrls.length > 0
@@ -157,13 +168,12 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
157
168
  transport: fallback([httpViemTransport(l1RpcUrl)]) as any,
158
169
  });
159
170
 
160
- watcher = new AnvilTestWatcher(
161
- new EthCheatCodes([l1RpcUrl], dateProvider),
162
- l1ContractAddresses.rollupAddress,
163
- publicClient,
164
- dateProvider,
165
- );
171
+ cheatcodes = new EthCheatCodes([l1RpcUrl], dateProvider);
172
+
173
+ watcher = new AnvilTestWatcher(cheatcodes, rollupAddress, publicClient, dateProvider);
166
174
  watcher.setisLocalNetwork(true);
175
+ watcher.setIsMarkingAsProven(false); // Do not mark as proven in the watcher. It's marked in the epochTestSettler after the out hash is set.
176
+
167
177
  await watcher.start();
168
178
  }
169
179
 
@@ -172,17 +182,42 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
172
182
  const blobClient = createBlobClient();
173
183
  const node = await createAztecNode(aztecNodeConfig, { telemetry, blobClient, dateProvider }, { prefilledPublicData });
174
184
 
185
+ // Now that the node is up, let the watcher check for pending txs so it can skip unfilled slots faster when
186
+ // transactions are waiting in the mempool. Also let it check if the sequencer is actively building, to avoid
187
+ // warping time out from under an in-progress block.
188
+ watcher?.setGetPendingTxCount(() => node.getPendingTxCount());
189
+ const sequencer = node.getSequencer()?.getSequencer();
190
+ if (sequencer) {
191
+ const idleStates: Set<string> = new Set([
192
+ SequencerState.STOPPED,
193
+ SequencerState.STOPPING,
194
+ SequencerState.IDLE,
195
+ SequencerState.SYNCHRONIZING,
196
+ ]);
197
+ watcher?.setIsSequencerBuilding(() => !idleStates.has(sequencer.getState()));
198
+ }
199
+
200
+ let epochTestSettler: EpochTestSettler | undefined;
201
+ if (!aztecNodeConfig.p2pEnabled) {
202
+ epochTestSettler = new EpochTestSettler(
203
+ cheatcodes!,
204
+ rollupAddress!,
205
+ node.getBlockSource(),
206
+ logger.createChild('epoch-settler'),
207
+ { pollingIntervalMs: 200 },
208
+ );
209
+ await epochTestSettler.start();
210
+ }
211
+
175
212
  if (initialAccounts.length) {
176
- const PXEConfig = { proverEnabled: aztecNodeConfig.realProofs };
177
- const wallet = await TestWallet.create(node, PXEConfig);
213
+ const wallet = await EmbeddedWallet.create(node, {
214
+ pxeConfig: { proverEnabled: aztecNodeConfig.realProofs },
215
+ ephemeral: true,
216
+ });
178
217
 
179
218
  userLog('Setting up funded test accounts...');
180
- const accountManagers = await deployFundedSchnorrAccounts(wallet, node, initialAccounts);
181
- const accountsWithSecrets = accountManagers.map((manager, i) => ({
182
- account: manager,
183
- secretKey: initialAccounts[i].secret,
184
- }));
185
- const accLogs = await createAccountLogs(accountsWithSecrets, wallet);
219
+ const accountManagers = await deployFundedSchnorrAccounts(wallet, initialAccounts);
220
+ const accLogs = await createAccountLogs(accountManagers, wallet);
186
221
  userLog(accLogs.join(''));
187
222
 
188
223
  await setupBananaFPC(initialAccounts, wallet, userLog);
@@ -196,6 +231,7 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
196
231
  const stop = async () => {
197
232
  await node.stop();
198
233
  await watcher?.stop();
234
+ await epochTestSettler?.stop();
199
235
  };
200
236
 
201
237
  return { node, stop };
@@ -207,7 +243,12 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
207
243
  */
208
244
  export async function createAztecNode(
209
245
  config: Partial<AztecNodeConfig> = {},
210
- deps: { telemetry?: TelemetryClient; blobClient?: BlobClientInterface; dateProvider?: DateProvider } = {},
246
+ deps: {
247
+ telemetry?: TelemetryClient;
248
+ blobClient?: BlobClientInterface;
249
+ dateProvider?: DateProvider;
250
+ proverBroker?: ProvingJobBroker;
251
+ } = {},
211
252
  options: { prefilledPublicData?: PublicDataTreeLeaf[] } = {},
212
253
  ) {
213
254
  // TODO(#12272): will clean this up. This is criminal.
@@ -217,6 +258,10 @@ export async function createAztecNode(
217
258
  ...config,
218
259
  l1Contracts: { ...l1Contracts, ...config.l1Contracts },
219
260
  };
220
- const node = await AztecNodeService.createAndSync(aztecNodeConfig, deps, options);
261
+ const node = await AztecNodeService.createAndSync(
262
+ aztecNodeConfig,
263
+ { ...deps, proverNodeDeps: { broker: deps.proverBroker } },
264
+ options,
265
+ );
221
266
  return node;
222
267
  }