@aztec/aztec 0.0.0-test.1 → 0.0.1-commit.017a351

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 (217) hide show
  1. package/README.md +1 -1
  2. package/dest/bin/index.d.ts +1 -1
  3. package/dest/bin/index.js +28 -13
  4. package/dest/cli/admin_api_key_store.d.ts +45 -0
  5. package/dest/cli/admin_api_key_store.d.ts.map +1 -0
  6. package/dest/cli/admin_api_key_store.js +98 -0
  7. package/dest/cli/aztec_start_action.d.ts +1 -1
  8. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  9. package/dest/cli/aztec_start_action.js +107 -49
  10. package/dest/cli/aztec_start_options.d.ts +6 -4
  11. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  12. package/dest/cli/aztec_start_options.js +160 -223
  13. package/dest/cli/cli.d.ts +1 -1
  14. package/dest/cli/cli.d.ts.map +1 -1
  15. package/dest/cli/cli.js +11 -7
  16. package/dest/cli/cmds/compile.d.ts +4 -0
  17. package/dest/cli/cmds/compile.d.ts.map +1 -0
  18. package/dest/cli/cmds/compile.js +166 -0
  19. package/dest/cli/cmds/migrate_ha_db.d.ts +3 -0
  20. package/dest/cli/cmds/migrate_ha_db.d.ts.map +1 -0
  21. package/dest/cli/cmds/migrate_ha_db.js +27 -0
  22. package/dest/cli/cmds/profile.d.ts +4 -0
  23. package/dest/cli/cmds/profile.d.ts.map +1 -0
  24. package/dest/cli/cmds/profile.js +8 -0
  25. package/dest/cli/cmds/profile_flamegraph.d.ts +4 -0
  26. package/dest/cli/cmds/profile_flamegraph.d.ts.map +1 -0
  27. package/dest/cli/cmds/profile_flamegraph.js +52 -0
  28. package/dest/cli/cmds/profile_gates.d.ts +4 -0
  29. package/dest/cli/cmds/profile_gates.d.ts.map +1 -0
  30. package/dest/cli/cmds/profile_gates.js +76 -0
  31. package/dest/cli/cmds/profile_utils.d.ts +18 -0
  32. package/dest/cli/cmds/profile_utils.d.ts.map +1 -0
  33. package/dest/cli/cmds/profile_utils.js +50 -0
  34. package/dest/cli/cmds/standby.d.ts +30 -0
  35. package/dest/cli/cmds/standby.d.ts.map +1 -0
  36. package/dest/cli/cmds/standby.js +97 -0
  37. package/dest/cli/cmds/start_bot.d.ts +4 -7
  38. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  39. package/dest/cli/cmds/start_bot.js +32 -17
  40. package/dest/cli/cmds/start_node.d.ts +3 -2
  41. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  42. package/dest/cli/cmds/start_node.js +113 -86
  43. package/dest/cli/cmds/start_p2p_bootstrap.d.ts +2 -2
  44. package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -1
  45. package/dest/cli/cmds/start_p2p_bootstrap.js +10 -6
  46. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  47. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  48. package/dest/cli/cmds/start_prover_agent.js +29 -12
  49. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  50. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  51. package/dest/cli/cmds/start_prover_broker.js +25 -10
  52. package/dest/cli/cmds/start_txe.d.ts +2 -2
  53. package/dest/cli/cmds/start_txe.d.ts.map +1 -1
  54. package/dest/cli/cmds/start_txe.js +6 -5
  55. package/dest/cli/cmds/utils/artifacts.d.ts +21 -0
  56. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -0
  57. package/dest/cli/cmds/utils/artifacts.js +24 -0
  58. package/dest/cli/cmds/utils/collect_crate_dirs.d.ts +21 -0
  59. package/dest/cli/cmds/utils/collect_crate_dirs.d.ts.map +1 -0
  60. package/dest/cli/cmds/utils/collect_crate_dirs.js +114 -0
  61. package/dest/cli/cmds/utils/needs_recompile.d.ts +10 -0
  62. package/dest/cli/cmds/utils/needs_recompile.d.ts.map +1 -0
  63. package/dest/cli/cmds/utils/needs_recompile.js +90 -0
  64. package/dest/cli/cmds/utils/spawn.d.ts +3 -0
  65. package/dest/cli/cmds/utils/spawn.d.ts.map +1 -0
  66. package/dest/cli/cmds/utils/spawn.js +16 -0
  67. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts +4 -0
  68. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts.map +1 -0
  69. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.js +61 -0
  70. package/dest/cli/index.d.ts +1 -1
  71. package/dest/cli/preload_crs.d.ts +3 -0
  72. package/dest/cli/preload_crs.d.ts.map +1 -0
  73. package/dest/cli/preload_crs.js +6 -0
  74. package/dest/cli/util.d.ts +37 -17
  75. package/dest/cli/util.d.ts.map +1 -1
  76. package/dest/cli/util.js +171 -35
  77. package/dest/cli/versioning.d.ts +1 -1
  78. package/dest/cli/versioning.js +3 -3
  79. package/dest/examples/token.d.ts +1 -1
  80. package/dest/examples/token.js +31 -18
  81. package/dest/examples/util.d.ts +5 -6
  82. package/dest/examples/util.d.ts.map +1 -1
  83. package/dest/examples/util.js +5 -6
  84. package/dest/index.d.ts +2 -2
  85. package/dest/index.d.ts.map +1 -1
  86. package/dest/index.js +1 -1
  87. package/dest/local-network/auth_registry.d.ts +5 -0
  88. package/dest/local-network/auth_registry.d.ts.map +1 -0
  89. package/dest/local-network/auth_registry.js +17 -0
  90. package/dest/local-network/banana_fpc.d.ts +11 -0
  91. package/dest/local-network/banana_fpc.d.ts.map +1 -0
  92. package/dest/{sandbox → local-network}/banana_fpc.js +29 -27
  93. package/dest/local-network/index.d.ts +4 -0
  94. package/dest/local-network/index.d.ts.map +1 -0
  95. package/dest/local-network/index.js +3 -0
  96. package/dest/local-network/local-network.d.ts +50 -0
  97. package/dest/local-network/local-network.d.ts.map +1 -0
  98. package/dest/local-network/local-network.js +248 -0
  99. package/dest/local-network/sponsored_fpc.d.ts +5 -0
  100. package/dest/local-network/sponsored_fpc.d.ts.map +1 -0
  101. package/dest/local-network/sponsored_fpc.js +18 -0
  102. package/dest/mnemonic.d.ts +1 -1
  103. package/dest/splash.d.ts +1 -1
  104. package/dest/testing/anvil_test_watcher.d.ts +54 -0
  105. package/dest/testing/anvil_test_watcher.d.ts.map +1 -0
  106. package/dest/testing/anvil_test_watcher.js +235 -0
  107. package/dest/testing/cheat_codes.d.ts +44 -0
  108. package/dest/testing/cheat_codes.d.ts.map +1 -0
  109. package/dest/testing/cheat_codes.js +98 -0
  110. package/dest/testing/epoch_test_settler.d.ts +19 -0
  111. package/dest/testing/epoch_test_settler.d.ts.map +1 -0
  112. package/dest/testing/epoch_test_settler.js +63 -0
  113. package/dest/testing/index.d.ts +6 -0
  114. package/dest/testing/index.d.ts.map +1 -0
  115. package/dest/testing/index.js +5 -0
  116. package/dest/testing/token_allowed_setup.d.ts +7 -0
  117. package/dest/testing/token_allowed_setup.d.ts.map +1 -0
  118. package/dest/testing/token_allowed_setup.js +20 -0
  119. package/package.json +56 -45
  120. package/scripts/add_crate.sh +53 -0
  121. package/scripts/aztec.sh +73 -0
  122. package/scripts/init.sh +39 -0
  123. package/scripts/new.sh +83 -0
  124. package/scripts/setup_workspace.sh +69 -0
  125. package/scripts/templates/blank/contract/Nargo.toml +6 -0
  126. package/scripts/templates/blank/contract/src/main.nr +10 -0
  127. package/scripts/templates/blank/test/Nargo.toml +7 -0
  128. package/scripts/templates/blank/test/src/lib.nr +11 -0
  129. package/scripts/templates/counter/contract/Nargo.toml +7 -0
  130. package/scripts/templates/counter/contract/src/main.nr +48 -0
  131. package/scripts/templates/counter/test/Nargo.toml +7 -0
  132. package/scripts/templates/counter/test/src/lib.nr +32 -0
  133. package/src/bin/index.ts +33 -13
  134. package/src/cli/admin_api_key_store.ts +128 -0
  135. package/src/cli/aztec_start_action.ts +100 -46
  136. package/src/cli/aztec_start_options.ts +183 -226
  137. package/src/cli/cli.ts +19 -11
  138. package/src/cli/cmds/compile.ts +192 -0
  139. package/src/cli/cmds/migrate_ha_db.ts +43 -0
  140. package/src/cli/cmds/profile.ts +26 -0
  141. package/src/cli/cmds/profile_flamegraph.ts +64 -0
  142. package/src/cli/cmds/profile_gates.ts +84 -0
  143. package/src/cli/cmds/profile_utils.ts +58 -0
  144. package/src/cli/cmds/standby.ts +132 -0
  145. package/src/cli/cmds/start_bot.ts +43 -19
  146. package/src/cli/cmds/start_node.ts +142 -91
  147. package/src/cli/cmds/start_p2p_bootstrap.ts +14 -6
  148. package/src/cli/cmds/start_prover_agent.ts +25 -16
  149. package/src/cli/cmds/start_prover_broker.ts +32 -9
  150. package/src/cli/cmds/start_txe.ts +7 -5
  151. package/src/cli/cmds/utils/artifacts.ts +44 -0
  152. package/src/cli/cmds/utils/collect_crate_dirs.ts +118 -0
  153. package/src/cli/cmds/utils/needs_recompile.ts +98 -0
  154. package/src/cli/cmds/utils/spawn.ts +16 -0
  155. package/src/cli/cmds/utils/warn_if_aztec_version_mismatch.ts +76 -0
  156. package/src/cli/preload_crs.ts +7 -0
  157. package/src/cli/util.ts +192 -56
  158. package/src/cli/versioning.ts +3 -3
  159. package/src/examples/token.ts +23 -19
  160. package/src/examples/util.ts +6 -8
  161. package/src/index.ts +5 -6
  162. package/src/local-network/auth_registry.ts +19 -0
  163. package/src/{sandbox → local-network}/banana_fpc.ts +32 -29
  164. package/src/local-network/index.ts +7 -0
  165. package/src/local-network/local-network.ts +303 -0
  166. package/src/local-network/sponsored_fpc.ts +26 -0
  167. package/src/testing/anvil_test_watcher.ts +273 -0
  168. package/src/testing/cheat_codes.ts +132 -0
  169. package/src/testing/epoch_test_settler.ts +69 -0
  170. package/src/testing/index.ts +5 -0
  171. package/src/testing/token_allowed_setup.ts +19 -0
  172. package/dest/cli/chain_l2_config.d.ts +0 -19
  173. package/dest/cli/chain_l2_config.d.ts.map +0 -1
  174. package/dest/cli/chain_l2_config.js +0 -56
  175. package/dest/cli/cmds/start_archiver.d.ts +0 -9
  176. package/dest/cli/cmds/start_archiver.d.ts.map +0 -1
  177. package/dest/cli/cmds/start_archiver.js +0 -42
  178. package/dest/cli/cmds/start_blob_sink.d.ts +0 -3
  179. package/dest/cli/cmds/start_blob_sink.d.ts.map +0 -1
  180. package/dest/cli/cmds/start_blob_sink.js +0 -17
  181. package/dest/cli/cmds/start_faucet.d.ts +0 -4
  182. package/dest/cli/cmds/start_faucet.d.ts.map +0 -1
  183. package/dest/cli/cmds/start_faucet.js +0 -20
  184. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  185. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  186. package/dest/cli/cmds/start_prover_node.js +0 -110
  187. package/dest/cli/cmds/start_pxe.d.ts +0 -16
  188. package/dest/cli/cmds/start_pxe.d.ts.map +0 -1
  189. package/dest/cli/cmds/start_pxe.js +0 -95
  190. package/dest/cli/get_l1_config.d.ts +0 -7
  191. package/dest/cli/get_l1_config.d.ts.map +0 -1
  192. package/dest/cli/get_l1_config.js +0 -13
  193. package/dest/sandbox/banana_fpc.d.ts +0 -11
  194. package/dest/sandbox/banana_fpc.d.ts.map +0 -1
  195. package/dest/sandbox/index.d.ts +0 -5
  196. package/dest/sandbox/index.d.ts.map +0 -1
  197. package/dest/sandbox/index.js +0 -4
  198. package/dest/sandbox/sandbox.d.ts +0 -76
  199. package/dest/sandbox/sandbox.d.ts.map +0 -1
  200. package/dest/sandbox/sandbox.js +0 -181
  201. package/dest/sandbox/sponsored_fee_payment_method.d.ts +0 -23
  202. package/dest/sandbox/sponsored_fee_payment_method.d.ts.map +0 -1
  203. package/dest/sandbox/sponsored_fee_payment_method.js +0 -36
  204. package/dest/sandbox/sponsored_fpc.d.ts +0 -6
  205. package/dest/sandbox/sponsored_fpc.d.ts.map +0 -1
  206. package/dest/sandbox/sponsored_fpc.js +0 -26
  207. package/src/cli/chain_l2_config.ts +0 -74
  208. package/src/cli/cmds/start_archiver.ts +0 -55
  209. package/src/cli/cmds/start_blob_sink.ts +0 -31
  210. package/src/cli/cmds/start_faucet.ts +0 -34
  211. package/src/cli/cmds/start_prover_node.ts +0 -121
  212. package/src/cli/cmds/start_pxe.ts +0 -129
  213. package/src/cli/get_l1_config.ts +0 -18
  214. package/src/sandbox/index.ts +0 -5
  215. package/src/sandbox/sandbox.ts +0 -229
  216. package/src/sandbox/sponsored_fee_payment_method.ts +0 -46
  217. package/src/sandbox/sponsored_fpc.ts +0 -38
@@ -1,11 +1,19 @@
1
- import { type BotConfig, BotRunner, botConfigMappings, getBotRunnerApiHandler } from '@aztec/bot';
1
+ import { type BotConfig, BotRunner, BotStore, botConfigMappings, getBotRunnerApiHandler } from '@aztec/bot';
2
2
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
3
3
  import type { LogFn } from '@aztec/foundation/log';
4
- import type { AztecNode, PXE } from '@aztec/stdlib/interfaces/client';
4
+ import { createStore, openTmpStore } from '@aztec/kv-store/lmdb-v2';
5
+ import { type CliPXEOptions, type PXEConfig, allPxeConfigMappings } from '@aztec/pxe/config';
6
+ import { type AztecNode, type AztecNodeAdmin, createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
5
7
  import type { TelemetryClient } from '@aztec/telemetry-client';
6
- import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
8
+ import {
9
+ getConfigEnvVars as getTelemetryClientConfig,
10
+ initTelemetryClient,
11
+ makeTracedFetch,
12
+ } from '@aztec/telemetry-client';
13
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
7
14
 
8
- import { extractRelevantOptions } from '../util.js';
15
+ import { extractRelevantOptions, stringifyConfig } from '../util.js';
16
+ import { getVersions } from '../versioning.js';
9
17
 
10
18
  export async function startBot(
11
19
  options: any,
@@ -13,33 +21,49 @@ export async function startBot(
13
21
  services: NamespacedApiHandlers,
14
22
  userLog: LogFn,
15
23
  ) {
16
- const { proverNode, archiver, sequencer, p2pBootstrap, txe, prover } = options;
17
- if (proverNode || archiver || sequencer || p2pBootstrap || txe || prover) {
18
- userLog(
19
- `Starting a bot with --prover-node, --prover, --archiver, --sequencer, --p2p-bootstrap, or --txe is not supported.`,
20
- );
24
+ const { proverNode, sequencer, p2pBootstrap, txe, prover } = options;
25
+ if (proverNode || sequencer || p2pBootstrap || txe || prover) {
26
+ userLog(`Starting a bot with --prover-node, --prover, --sequencer, --p2p-bootstrap, or --txe is not supported.`);
21
27
  process.exit(1);
22
28
  }
23
- // Start a PXE client that is used by the bot if required
24
- let pxe: PXE | undefined;
25
- if (options.pxe) {
26
- const { addPXE } = await import('./start_pxe.js');
27
- ({ pxe } = await addPXE(options, signalHandlers, services, userLog));
29
+
30
+ const fetch = makeTracedFetch([1, 2, 3], true);
31
+ const config = extractRelevantOptions<BotConfig>(options, botConfigMappings, 'bot');
32
+ if (!config.nodeUrl) {
33
+ throw new Error('The bot requires access to a Node');
28
34
  }
29
35
 
30
- const telemetry = initTelemetryClient(getTelemetryClientConfig());
31
- await addBot(options, signalHandlers, services, { pxe, telemetry });
36
+ const aztecNode = createAztecNodeClient(config.nodeUrl, getVersions(), fetch);
37
+
38
+ const pxeConfig = extractRelevantOptions<PXEConfig & CliPXEOptions>(options, allPxeConfigMappings, 'pxe');
39
+ userLog(`Creating bot wallet with config ${stringifyConfig(pxeConfig)}`);
40
+ const wallet = await EmbeddedWallet.create(aztecNode, { pxeConfig });
41
+
42
+ const telemetry = await initTelemetryClient(getTelemetryClientConfig());
43
+ await addBot(options, signalHandlers, services, wallet, aztecNode, telemetry, undefined, userLog);
32
44
  }
33
45
 
34
- export function addBot(
46
+ export async function addBot(
35
47
  options: any,
36
48
  signalHandlers: (() => Promise<void>)[],
37
49
  services: NamespacedApiHandlers,
38
- deps: { pxe?: PXE; node?: AztecNode; telemetry: TelemetryClient },
50
+ wallet: EmbeddedWallet,
51
+ aztecNode: AztecNode,
52
+ telemetry: TelemetryClient,
53
+ aztecNodeAdmin?: AztecNodeAdmin,
54
+ userLog?: LogFn,
39
55
  ) {
40
56
  const config = extractRelevantOptions<BotConfig>(options, botConfigMappings, 'bot');
57
+ userLog?.(`Starting bot with config ${stringifyConfig(config)}`);
58
+
59
+ const db = await (config.dataDirectory
60
+ ? createStore('bot', BotStore.SCHEMA_VERSION, config)
61
+ : openTmpStore('bot', true, config.dataStoreMapSizeKb));
62
+
63
+ const store = new BotStore(db);
64
+ await store.cleanupOldClaims();
41
65
 
42
- const botRunner = new BotRunner(config, deps);
66
+ const botRunner = new BotRunner(config, wallet, aztecNode, telemetry, aztecNodeAdmin, store);
43
67
  if (!config.noStart) {
44
68
  void botRunner.start(); // Do not block since bot setup takes time
45
69
  }
@@ -1,117 +1,146 @@
1
- import { getInitialTestAccounts } from '@aztec/accounts/testing';
2
1
  import { type AztecNodeConfig, aztecNodeConfigMappings, getConfigEnvVars } from '@aztec/aztec-node';
3
- import { NULL_KEY } from '@aztec/ethereum';
2
+ import { Fr } from '@aztec/aztec.js/fields';
3
+ import { getL1Config } from '@aztec/cli/config';
4
+ import { getPublicClient } from '@aztec/ethereum/client';
5
+ import { getGenesisStateConfigEnvVars } from '@aztec/ethereum/config';
6
+ import { type NetworkNames, SecretValue } from '@aztec/foundation/config';
4
7
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
8
+ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
5
9
  import type { LogFn } from '@aztec/foundation/log';
6
- import { AztecNodeApiSchema, type PXE } from '@aztec/stdlib/interfaces/client';
7
- import { P2PApiSchema } from '@aztec/stdlib/interfaces/server';
10
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
11
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
12
+ import {
13
+ ProvingJobConsumerSchema,
14
+ createProvingJobBrokerClient,
15
+ proverBrokerBackoff,
16
+ } from '@aztec/prover-client/broker';
17
+ import { type CliPXEOptions, type PXEConfig, allPxeConfigMappings } from '@aztec/pxe/config';
18
+ import { AztecNodeAdminApiSchema, AztecNodeApiSchema } from '@aztec/stdlib/interfaces/client';
19
+ import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
8
20
  import {
9
21
  type TelemetryClientConfig,
10
22
  initTelemetryClient,
23
+ makeTracedFetch,
11
24
  telemetryClientConfigMappings,
12
25
  } from '@aztec/telemetry-client';
13
- import { getGenesisValues } from '@aztec/world-state/testing';
14
-
15
- import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
26
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
16
27
 
17
- import { createAztecNode, deployContractsToL1 } from '../../sandbox/index.js';
18
- import { getL1Config } from '../get_l1_config.js';
19
- import { extractNamespacedOptions, extractRelevantOptions } from '../util.js';
28
+ import { createAztecNode } from '../../local-network/index.js';
29
+ import {
30
+ extractNamespacedOptions,
31
+ extractRelevantOptions,
32
+ preloadCrsDataForVerifying,
33
+ setupVersionChecker,
34
+ } from '../util.js';
35
+ import { getVersions } from '../versioning.js';
36
+ import { computeExpectedGenesisRoot, waitForCompatibleRollup } from './standby.js';
37
+ import { startProverBroker } from './start_prover_broker.js';
20
38
 
21
39
  export async function startNode(
22
40
  options: any,
23
41
  signalHandlers: (() => Promise<void>)[],
24
42
  services: NamespacedApiHandlers,
43
+ adminServices: NamespacedApiHandlers,
25
44
  userLog: LogFn,
45
+ networkName: NetworkNames,
26
46
  ): Promise<{ config: AztecNodeConfig }> {
27
- // options specifically namespaced with --node.<option>
28
- const nodeSpecificOptions = extractNamespacedOptions(options, 'node');
47
+ // All options set from environment variables
48
+ const configFromEnvVars = getConfigEnvVars();
49
+
50
+ // Extract relevant options from command line arguments
51
+ const relevantOptions = extractRelevantOptions(options, aztecNodeConfigMappings, 'node');
52
+
29
53
  // All options that are relevant to the Aztec Node
30
54
  let nodeConfig: AztecNodeConfig = {
31
- ...getConfigEnvVars(),
32
- ...extractRelevantOptions(options, aztecNodeConfigMappings, 'node'),
55
+ ...configFromEnvVars,
56
+ ...relevantOptions,
33
57
  };
34
58
 
59
+ // Prover node configuration and broker setup
60
+ // REFACTOR: Move the broker setup out of here and into the prover-node factory
61
+ let broker: ProvingJobBroker | undefined = undefined;
35
62
  if (options.proverNode) {
36
- userLog(`Running a Prover Node within a Node is not yet supported`);
37
- process.exit(1);
38
- }
39
-
40
- const initialFundedAccounts = nodeConfig.testAccounts ? await getInitialTestAccounts() : [];
41
- const { genesisBlockHash, genesisArchiveRoot, prefilledPublicData } = await getGenesisValues(
42
- initialFundedAccounts.map(a => a.address),
43
- );
44
-
45
- // Deploy contracts if needed
46
- if (nodeSpecificOptions.deployAztecContracts || nodeSpecificOptions.deployAztecContractsSalt) {
47
- let account;
48
- if (nodeSpecificOptions.publisherPrivateKey) {
49
- account = privateKeyToAccount(nodeSpecificOptions.publisherPrivateKey);
50
- } else if (options.l1Mnemonic) {
51
- account = mnemonicToAccount(options.l1Mnemonic);
63
+ nodeConfig.enableProverNode = true;
64
+ if (nodeConfig.proverAgentCount === 0) {
65
+ userLog(
66
+ `Running prover node without local prover agent. Connect prover agents or pass --proverAgent.proverAgentCount`,
67
+ );
68
+ }
69
+ if (nodeConfig.proverBrokerUrl) {
70
+ // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
71
+ // set a lower connection limit such that we don't overload the server
72
+ // Retry indefinitely until the epoch proving times out and the chain reorgs
73
+ const fetch = makeTracedFetch(proverBrokerBackoff, false, makeUndiciFetch(new Agent({ connections: 100 })));
74
+ broker = createProvingJobBrokerClient(nodeConfig.proverBrokerUrl, getVersions(nodeConfig), fetch);
75
+ } else if (options.proverBroker) {
76
+ ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
52
77
  } else {
53
- throw new Error('--node.publisherPrivateKey or --l1-mnemonic is required to deploy L1 contracts');
78
+ userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
79
+ process.exit(1);
54
80
  }
55
- // REFACTOR: We should not be calling a method from sandbox on the prod start flow
56
- await deployContractsToL1(nodeConfig, account!, undefined, {
57
- assumeProvenThroughBlockNumber: nodeSpecificOptions.assumeProvenThroughBlockNumber,
58
- salt: nodeSpecificOptions.deployAztecContractsSalt,
59
- genesisBlockHash,
60
- genesisArchiveRoot,
61
- });
62
81
  }
63
- // If not deploying, validate that any addresses and config provided are correct.
64
- else {
65
- if (!nodeConfig.l1Contracts.registryAddress || nodeConfig.l1Contracts.registryAddress.isZero()) {
66
- throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
67
- }
68
- const { addresses, config } = await getL1Config(
69
- nodeConfig.l1Contracts.registryAddress,
70
- nodeConfig.l1RpcUrls,
71
- nodeConfig.l1ChainId,
72
- );
73
82
 
74
- // TODO(#12272): will clean this up.
75
- nodeConfig = {
76
- ...nodeConfig,
77
- l1Contracts: {
78
- ...addresses,
79
- slashFactoryAddress: nodeConfig.l1Contracts.slashFactoryAddress,
80
- },
81
- ...config,
82
- };
83
+ await preloadCrsDataForVerifying(nodeConfig, userLog);
84
+
85
+ const genesisConfig = getGenesisStateConfigEnvVars();
86
+ const { genesisArchiveRoot, genesis } = await computeExpectedGenesisRoot(genesisConfig, userLog);
87
+
88
+ const followsCanonicalRollup =
89
+ typeof nodeConfig.rollupVersion !== 'number' || (nodeConfig.rollupVersion as unknown as string) === 'canonical';
90
+
91
+ if (!nodeConfig.registryAddress || nodeConfig.registryAddress.isZero()) {
92
+ throw new Error('L1 registry address is required to start Aztec Node');
83
93
  }
84
94
 
85
- // if no publisher private key, then use l1Mnemonic
86
- if (!options.archiver) {
87
- // expect archiver url in node config
88
- const archiverUrl = nodeConfig.archiverUrl;
89
- if (!archiverUrl) {
90
- userLog('Archiver Service URL is required to start Aztec Node without --archiver option');
91
- throw new Error('Archiver Service URL is required to start Aztec Node without --archiver option');
92
- }
93
- nodeConfig.archiverUrl = archiverUrl;
95
+ // Wait for a compatible rollup before proceeding with full L1 config fetch.
96
+ // This prevents crashes when the canonical rollup hasn't been upgraded yet.
97
+ await waitForCompatibleRollup(
98
+ nodeConfig,
99
+ { genesisArchiveRoot, vkTreeRoot: getVKTreeRoot(), protocolContractsHash },
100
+ options.port,
101
+ userLog,
102
+ );
103
+
104
+ const { addresses, config } = await getL1Config(
105
+ nodeConfig.registryAddress,
106
+ nodeConfig.l1RpcUrls,
107
+ nodeConfig.l1ChainId,
108
+ nodeConfig.rollupVersion,
109
+ );
110
+
111
+ process.env.ROLLUP_CONTRACT_ADDRESS ??= addresses.rollupAddress.toString();
112
+
113
+ if (!Fr.fromHexString(config.genesisArchiveTreeRoot).equals(genesisArchiveRoot)) {
114
+ throw new Error(
115
+ `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}`,
116
+ );
94
117
  }
95
118
 
96
- if (!options.sequencer) {
119
+ nodeConfig = {
120
+ ...nodeConfig,
121
+ ...addresses,
122
+ ...config,
123
+ };
124
+
125
+ if (!options.sequencer && !nodeConfig.fishermanMode) {
97
126
  nodeConfig.disableValidator = true;
98
127
  } else {
99
- const sequencerConfig = extractNamespacedOptions(options, 'sequencer');
100
- let account;
101
- if (!sequencerConfig.publisherPrivateKey || sequencerConfig.publisherPrivateKey === NULL_KEY) {
102
- if (!options.l1Mnemonic) {
103
- userLog(
104
- '--sequencer.publisherPrivateKey or --l1-mnemonic is required to start Aztec Node with --sequencer option',
105
- );
106
- throw new Error('Private key or Mnemonic is required to start Aztec Node with --sequencer option');
107
- } else {
108
- account = mnemonicToAccount(options.l1Mnemonic);
109
- const privKey = account.getHdKey().privateKey;
110
- nodeConfig.publisherPrivateKey = `0x${Buffer.from(privKey!).toString('hex')}`;
128
+ const sequencerConfig = {
129
+ ...configFromEnvVars,
130
+ ...extractNamespacedOptions(options, 'sequencer'),
131
+ };
132
+ // If no publisher private keys have been given, use the first validator key
133
+ if (
134
+ sequencerConfig.sequencerPublisherPrivateKeys === undefined ||
135
+ !sequencerConfig.sequencerPublisherPrivateKeys.length
136
+ ) {
137
+ if (sequencerConfig.validatorPrivateKeys?.getValue().length) {
138
+ sequencerConfig.sequencerPublisherPrivateKeys = [
139
+ new SecretValue(sequencerConfig.validatorPrivateKeys.getValue()[0]),
140
+ ];
111
141
  }
112
- } else {
113
- nodeConfig.publisherPrivateKey = sequencerConfig.publisherPrivateKey;
114
142
  }
143
+ nodeConfig.sequencerPublisherPrivateKeys = sequencerConfig.sequencerPublisherPrivateKeys;
115
144
  }
116
145
 
117
146
  if (nodeConfig.p2pEnabled) {
@@ -122,29 +151,51 @@ export async function startNode(
122
151
  }
123
152
 
124
153
  const telemetryConfig = extractRelevantOptions<TelemetryClientConfig>(options, telemetryClientConfigMappings, 'tel');
125
- const telemetry = initTelemetryClient(telemetryConfig);
154
+ const telemetry = await initTelemetryClient(telemetryConfig);
126
155
 
127
156
  // Create and start Aztec Node
128
- const node = await createAztecNode(nodeConfig, { telemetry }, { prefilledPublicData });
157
+ const node = await createAztecNode(nodeConfig, { telemetry, proverBroker: broker }, { genesis });
129
158
 
130
159
  // Add node and p2p to services list
131
160
  services.node = [node, AztecNodeApiSchema];
132
161
  services.p2p = [node.getP2P(), P2PApiSchema];
162
+ adminServices.nodeAdmin = [node, AztecNodeAdminApiSchema];
163
+
164
+ // Register prover-node services if the prover node subsystem is running
165
+ const proverNode = node.getProverNode();
166
+ if (proverNode) {
167
+ services.prover = [proverNode, ProverNodeApiSchema];
168
+ if (!nodeConfig.proverBrokerUrl) {
169
+ services.provingJobSource = [proverNode.getProver().getProvingJobSource(), ProvingJobConsumerSchema];
170
+ }
171
+ }
133
172
 
134
173
  // Add node stop function to signal handlers
135
174
  signalHandlers.push(node.stop.bind(node));
136
175
 
137
- // Add a PXE client that connects to this node if requested
138
- let pxe: PXE | undefined;
139
- if (options.pxe) {
140
- const { addPXE } = await import('./start_pxe.js');
141
- ({ pxe } = await addPXE(options, signalHandlers, services, userLog, { node }));
142
- }
143
-
144
176
  // Add a txs bot if requested
145
177
  if (options.bot) {
146
178
  const { addBot } = await import('./start_bot.js');
147
- await addBot(options, signalHandlers, services, { pxe, node, telemetry });
179
+
180
+ const pxeConfig = extractRelevantOptions<PXEConfig & CliPXEOptions>(options, allPxeConfigMappings, 'pxe');
181
+ const wallet = await EmbeddedWallet.create(node, { pxeConfig });
182
+
183
+ await addBot(options, signalHandlers, services, wallet, node, telemetry, undefined);
184
+ }
185
+
186
+ if (nodeConfig.enableVersionCheck && networkName !== 'local') {
187
+ const cacheDir = process.env.DATA_DIRECTORY ? `${process.env.DATA_DIRECTORY}/cache` : undefined;
188
+ try {
189
+ await setupVersionChecker(
190
+ networkName,
191
+ followsCanonicalRollup,
192
+ getPublicClient(nodeConfig!),
193
+ signalHandlers,
194
+ cacheDir,
195
+ );
196
+ } catch {
197
+ /* no-op */
198
+ }
148
199
  }
149
200
 
150
201
  return { config: nodeConfig };
@@ -1,11 +1,15 @@
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';
7
7
  import { P2PBootstrapApiSchema } from '@aztec/stdlib/interfaces/server';
8
- import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
8
+ import {
9
+ type TelemetryClientConfig,
10
+ initTelemetryClient,
11
+ telemetryClientConfigMappings,
12
+ } from '@aztec/telemetry-client';
9
13
 
10
14
  import { extractRelevantOptions } from '../util.js';
11
15
 
@@ -17,13 +21,17 @@ export async function startP2PBootstrap(
17
21
  ) {
18
22
  // Start a P2P bootstrap node.
19
23
  const config = extractRelevantOptions<BootnodeConfig>(options, bootnodeConfigMappings, 'p2p');
20
- userLog(`Starting P2P bootstrap node with config: ${jsonStringify(config)}`);
21
- const telemetryClient = initTelemetryClient(getTelemetryClientConfig());
22
- const store = await createStore('p2p-bootstrap', 1, config, createLogger('p2p:bootstrap:store'));
24
+ const safeConfig = { ...config, peerIdPrivateKey: '<redacted>' };
25
+ userLog(`Starting P2P bootstrap node with config: ${jsonStringify(safeConfig)}`);
26
+
27
+ const telemetryConfig = extractRelevantOptions<TelemetryClientConfig>(options, telemetryClientConfigMappings, 'tel');
28
+ const telemetryClient = await initTelemetryClient(telemetryConfig);
29
+
30
+ const store = await createStore('p2p-bootstrap', 1, config);
23
31
  const node = new BootstrapNode(store, telemetryClient);
24
32
  await node.start(config);
25
33
  signalHandlers.push(() => node.stop());
26
34
  services.bootstrap = [node, P2PBootstrapApiSchema];
27
- userLog(`P2P bootstrap node started on ${config.udpListenAddress}`);
35
+ userLog(`P2P bootstrap node started on ${config.p2pIp}:${config.p2pPort}`);
28
36
  return { config: emptyChainConfig };
29
37
  }
@@ -4,16 +4,18 @@ 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
+ proverBrokerBackoff,
12
13
  } from '@aztec/prover-client/broker';
13
14
  import { getProverNodeAgentConfigFromEnv } from '@aztec/prover-node';
15
+ import { ProverAgentApiSchema } from '@aztec/stdlib/interfaces/server';
14
16
  import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
15
17
 
16
- import { extractRelevantOptions } from '../util.js';
18
+ import { extractRelevantOptions, preloadCrsDataForServerSideProving } from '../util.js';
17
19
  import { getVersions } from '../versioning.js';
18
20
 
19
21
  export async function startProverAgent(
@@ -22,8 +24,8 @@ export async function startProverAgent(
22
24
  services: NamespacedApiHandlers,
23
25
  userLog: LogFn,
24
26
  ) {
25
- if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
26
- 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.`);
27
29
  process.exit(1);
28
30
  }
29
31
 
@@ -33,32 +35,39 @@ export async function startProverAgent(
33
35
  };
34
36
 
35
37
  if (config.realProofs && (!config.bbBinaryPath || !config.acvmBinaryPath)) {
38
+ userLog(`Requested real proving but no path to bb or acvm binaries provided`);
36
39
  process.exit(1);
37
40
  }
38
41
 
39
42
  if (!config.proverBrokerUrl) {
43
+ userLog(`Missing prover broker URL. Pass --proverAgent.proverBrokerUrl <value>`);
40
44
  process.exit(1);
41
45
  }
42
46
 
43
- const fetch = makeTracedFetch([1, 2, 3], false, makeUndiciFetch(new Agent({ connections: 10 })));
47
+ await preloadCrsDataForServerSideProving(config, userLog);
48
+
49
+ // Retry indefinitely until the epoch proving times out and the chain reorgs
50
+ const fetch = makeTracedFetch(proverBrokerBackoff, false, makeUndiciFetch(new Agent({ connections: 10 })));
44
51
  const broker = createProvingJobBrokerClient(config.proverBrokerUrl, getVersions(), fetch);
45
52
 
46
- const telemetry = initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
53
+ const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
47
54
  const prover = await buildServerCircuitProver(config, telemetry);
48
- const proofStore = new InlineProofStore();
55
+ const proofStore = await createProofStore(config.proofStore);
49
56
  const agents = times(
50
57
  config.proverAgentCount,
51
- () =>
52
- new ProvingAgent(
53
- broker,
54
- proofStore,
55
- prover,
56
- config.proverAgentProofTypes,
57
- config.proverAgentPollIntervalMs,
58
- telemetry,
59
- ),
58
+ () => new ProvingAgent(broker, proofStore, prover, config.proverAgentProofTypes, config.proverAgentPollIntervalMs),
60
59
  );
61
60
 
61
+ // expose all agents as individual services
62
+ for (let i = 0; i < agents.length; i++) {
63
+ services[`agent${i}`] = [agents[i], ProverAgentApiSchema, () => agents[i].getStatus().status !== 'stopped'];
64
+ }
65
+
66
+ // shortcut in the most common case of having a single running agent
67
+ if (agents.length === 1) {
68
+ services[`agent`] = [agents[0], ProverAgentApiSchema, () => agents[0].getStatus().status !== 'stopped'];
69
+ }
70
+
62
71
  await Promise.all(agents.map(agent => agent.start()));
63
72
 
64
73
  signalHandlers.push(async () => {
@@ -1,8 +1,13 @@
1
+ import { getL1Config } from '@aztec/cli/config';
2
+ import { getGenesisStateConfigEnvVars } from '@aztec/ethereum/config';
1
3
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
2
4
  import type { LogFn } from '@aztec/foundation/log';
5
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
6
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
3
7
  import {
4
8
  type ProverBrokerConfig,
5
9
  ProvingJobBrokerSchema,
10
+ ProvingJobBrokerSchemaWithDebug,
6
11
  createAndStartProvingBroker,
7
12
  proverBrokerConfigMappings,
8
13
  } from '@aztec/prover-client/broker';
@@ -10,8 +15,8 @@ import { getProverNodeBrokerConfigFromEnv } from '@aztec/prover-node';
10
15
  import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
11
16
  import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
12
17
 
13
- import { getL1Config } from '../get_l1_config.js';
14
18
  import { extractRelevantOptions } from '../util.js';
19
+ import { computeExpectedGenesisRoot, waitForCompatibleRollup } from './standby.js';
15
20
 
16
21
  export async function startProverBroker(
17
22
  options: any,
@@ -19,27 +24,45 @@ export async function startProverBroker(
19
24
  services: NamespacedApiHandlers,
20
25
  userLog: LogFn,
21
26
  ): Promise<{ broker: ProvingJobBroker; config: ProverBrokerConfig }> {
22
- if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
23
- 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.`);
24
29
  process.exit(1);
25
30
  }
26
31
 
27
- const config: ProverBrokerConfig = {
32
+ const baseConfig: ProverBrokerConfig = {
28
33
  ...getProverNodeBrokerConfigFromEnv(), // get default config from env
29
34
  ...extractRelevantOptions<ProverBrokerConfig>(options, proverBrokerConfigMappings, 'proverBroker'), // override with command line options
30
35
  };
31
36
 
32
- if (!config.l1Contracts.registryAddress || config.l1Contracts.registryAddress.isZero()) {
37
+ if (!baseConfig.registryAddress || baseConfig.registryAddress.isZero()) {
33
38
  throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
34
39
  }
35
40
 
36
- const { addresses } = await getL1Config(config.l1Contracts.registryAddress, config.l1RpcUrls, config.l1ChainId);
41
+ const genesisConfig = getGenesisStateConfigEnvVars();
42
+ const { genesisArchiveRoot } = await computeExpectedGenesisRoot(genesisConfig, userLog);
43
+ await waitForCompatibleRollup(
44
+ baseConfig,
45
+ { genesisArchiveRoot, vkTreeRoot: getVKTreeRoot(), protocolContractsHash },
46
+ options.port,
47
+ userLog,
48
+ );
37
49
 
38
- config.l1Contracts = addresses;
50
+ const { addresses, config: rollupConfig } = await getL1Config(
51
+ baseConfig.registryAddress,
52
+ baseConfig.l1RpcUrls,
53
+ baseConfig.l1ChainId,
54
+ baseConfig.rollupVersion,
55
+ );
39
56
 
40
- const client = initTelemetryClient(getTelemetryClientConfig());
57
+ const config: ProverBrokerConfig = { ...baseConfig, ...addresses, rollupVersion: rollupConfig.rollupVersion };
58
+
59
+ const client = await initTelemetryClient(getTelemetryClientConfig());
41
60
  const broker = await createAndStartProvingBroker(config, client);
42
- services.proverBroker = [broker, ProvingJobBrokerSchema];
61
+
62
+ services.proverBroker = [
63
+ broker,
64
+ config.proverBrokerDebugReplayEnabled ? ProvingJobBrokerSchemaWithDebug : ProvingJobBrokerSchema,
65
+ ];
43
66
  signalHandlers.push(() => broker.stop());
44
67
 
45
68
  return { broker, config };
@@ -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
  }
@@ -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
+ }