@aztec/aztec 0.0.1-commit.e3c1de76 → 0.0.1-commit.e588bc7e5

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 (130) hide show
  1. package/dest/bin/index.js +7 -3
  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 +61 -16
  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 +25 -9
  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 +3 -4
  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 +168 -0
  17. package/dest/cli/cmds/profile.d.ts +4 -0
  18. package/dest/cli/cmds/profile.d.ts.map +1 -0
  19. package/dest/cli/cmds/profile.js +8 -0
  20. package/dest/cli/cmds/profile_flamegraph.d.ts +4 -0
  21. package/dest/cli/cmds/profile_flamegraph.d.ts.map +1 -0
  22. package/dest/cli/cmds/profile_flamegraph.js +52 -0
  23. package/dest/cli/cmds/profile_gates.d.ts +4 -0
  24. package/dest/cli/cmds/profile_gates.d.ts.map +1 -0
  25. package/dest/cli/cmds/profile_gates.js +58 -0
  26. package/dest/cli/cmds/profile_utils.d.ts +18 -0
  27. package/dest/cli/cmds/profile_utils.d.ts.map +1 -0
  28. package/dest/cli/cmds/profile_utils.js +50 -0
  29. package/dest/cli/cmds/standby.d.ts +32 -0
  30. package/dest/cli/cmds/standby.d.ts.map +1 -0
  31. package/dest/cli/cmds/standby.js +97 -0
  32. package/dest/cli/cmds/start_archiver.d.ts +2 -2
  33. package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
  34. package/dest/cli/cmds/start_archiver.js +1 -1
  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 +3 -2
  39. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  40. package/dest/cli/cmds/start_node.js +71 -27
  41. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  42. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  43. package/dest/cli/cmds/start_prover_agent.js +4 -16
  44. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  45. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  46. package/dest/cli/cmds/start_prover_broker.js +14 -8
  47. package/dest/cli/cmds/utils/artifacts.d.ts +21 -0
  48. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -0
  49. package/dest/cli/cmds/utils/artifacts.js +24 -0
  50. package/dest/cli/cmds/utils/collect_crate_dirs.d.ts +21 -0
  51. package/dest/cli/cmds/utils/collect_crate_dirs.d.ts.map +1 -0
  52. package/dest/cli/cmds/utils/collect_crate_dirs.js +114 -0
  53. package/dest/cli/cmds/utils/needs_recompile.d.ts +10 -0
  54. package/dest/cli/cmds/utils/needs_recompile.d.ts.map +1 -0
  55. package/dest/cli/cmds/utils/needs_recompile.js +90 -0
  56. package/dest/cli/cmds/utils/spawn.d.ts +3 -0
  57. package/dest/cli/cmds/utils/spawn.d.ts.map +1 -0
  58. package/dest/cli/cmds/utils/spawn.js +16 -0
  59. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts +4 -0
  60. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts.map +1 -0
  61. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.js +41 -0
  62. package/dest/cli/util.d.ts +7 -18
  63. package/dest/cli/util.d.ts.map +1 -1
  64. package/dest/cli/util.js +50 -86
  65. package/dest/examples/token.js +6 -6
  66. package/dest/local-network/banana_fpc.js +1 -1
  67. package/dest/local-network/local-network.d.ts +4 -2
  68. package/dest/local-network/local-network.d.ts.map +1 -1
  69. package/dest/local-network/local-network.js +50 -18
  70. package/dest/testing/anvil_test_watcher.d.ts +9 -1
  71. package/dest/testing/anvil_test_watcher.d.ts.map +1 -1
  72. package/dest/testing/anvil_test_watcher.js +53 -16
  73. package/dest/testing/cheat_codes.js +1 -1
  74. package/dest/testing/epoch_test_settler.d.ts +1 -1
  75. package/dest/testing/epoch_test_settler.d.ts.map +1 -1
  76. package/dest/testing/epoch_test_settler.js +3 -4
  77. package/dest/testing/index.d.ts +2 -1
  78. package/dest/testing/index.d.ts.map +1 -1
  79. package/dest/testing/index.js +1 -0
  80. package/dest/testing/token_allowed_setup.d.ts +7 -0
  81. package/dest/testing/token_allowed_setup.d.ts.map +1 -0
  82. package/dest/testing/token_allowed_setup.js +20 -0
  83. package/package.json +34 -34
  84. package/scripts/add_crate.sh +102 -0
  85. package/scripts/aztec.sh +11 -5
  86. package/scripts/init.sh +23 -19
  87. package/scripts/new.sh +48 -24
  88. package/scripts/setup_workspace.sh +68 -0
  89. package/src/bin/index.ts +7 -3
  90. package/src/cli/admin_api_key_store.ts +128 -0
  91. package/src/cli/aztec_start_action.ts +60 -12
  92. package/src/cli/aztec_start_options.ts +27 -8
  93. package/src/cli/cli.ts +3 -4
  94. package/src/cli/cmds/compile.ts +194 -0
  95. package/src/cli/cmds/profile.ts +25 -0
  96. package/src/cli/cmds/profile_flamegraph.ts +64 -0
  97. package/src/cli/cmds/profile_gates.ts +68 -0
  98. package/src/cli/cmds/profile_utils.ts +58 -0
  99. package/src/cli/cmds/standby.ts +132 -0
  100. package/src/cli/cmds/start_archiver.ts +1 -1
  101. package/src/cli/cmds/start_bot.ts +8 -5
  102. package/src/cli/cmds/start_node.ts +83 -33
  103. package/src/cli/cmds/start_prover_agent.ts +5 -8
  104. package/src/cli/cmds/start_prover_broker.ts +19 -15
  105. package/src/cli/cmds/utils/artifacts.ts +44 -0
  106. package/src/cli/cmds/utils/collect_crate_dirs.ts +118 -0
  107. package/src/cli/cmds/utils/needs_recompile.ts +98 -0
  108. package/src/cli/cmds/utils/spawn.ts +16 -0
  109. package/src/cli/cmds/utils/warn_if_aztec_version_mismatch.ts +54 -0
  110. package/src/cli/util.ts +57 -95
  111. package/src/examples/token.ts +8 -6
  112. package/src/local-network/banana_fpc.ts +1 -1
  113. package/src/local-network/local-network.ts +54 -17
  114. package/src/testing/anvil_test_watcher.ts +60 -16
  115. package/src/testing/cheat_codes.ts +1 -1
  116. package/src/testing/epoch_test_settler.ts +3 -4
  117. package/src/testing/index.ts +1 -0
  118. package/src/testing/token_allowed_setup.ts +19 -0
  119. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  120. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  121. package/dest/cli/cmds/start_prover_node.js +0 -108
  122. package/dest/cli/release_version.d.ts +0 -2
  123. package/dest/cli/release_version.d.ts.map +0 -1
  124. package/dest/cli/release_version.js +0 -14
  125. package/scripts/compile.sh +0 -44
  126. package/scripts/extract_function.js +0 -47
  127. package/scripts/flamegraph.sh +0 -59
  128. package/scripts/setup_project.sh +0 -31
  129. package/src/cli/cmds/start_prover_node.ts +0 -124
  130. package/src/cli/release_version.ts +0 -21
@@ -1,19 +1,24 @@
1
- import { getInitialTestAccountsData } from '@aztec/accounts/testing';
2
1
  import { aztecNodeConfigMappings, getConfigEnvVars } from '@aztec/aztec-node';
3
2
  import { Fr } from '@aztec/aztec.js/fields';
4
- import { getSponsoredFPCAddress } from '@aztec/cli/cli-utils';
5
3
  import { getL1Config } from '@aztec/cli/config';
6
4
  import { getPublicClient } from '@aztec/ethereum/client';
5
+ import { getGenesisStateConfigEnvVars } from '@aztec/ethereum/config';
7
6
  import { SecretValue } from '@aztec/foundation/config';
7
+ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
8
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
9
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
10
+ import { ProvingJobConsumerSchema, createProvingJobBrokerClient, proverBrokerBackoff } from '@aztec/prover-client/broker';
8
11
  import { allPxeConfigMappings } from '@aztec/pxe/config';
9
12
  import { AztecNodeAdminApiSchema, AztecNodeApiSchema } from '@aztec/stdlib/interfaces/client';
10
- import { P2PApiSchema } from '@aztec/stdlib/interfaces/server';
11
- import { initTelemetryClient, telemetryClientConfigMappings } from '@aztec/telemetry-client';
12
- import { TestWallet } from '@aztec/test-wallet/server';
13
- import { getGenesisValues } from '@aztec/world-state/testing';
13
+ import { P2PApiSchema, ProverNodeApiSchema } from '@aztec/stdlib/interfaces/server';
14
+ import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
15
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
14
16
  import { createAztecNode } from '../../local-network/index.js';
15
- import { extractNamespacedOptions, extractRelevantOptions, preloadCrsDataForVerifying, setupUpdateMonitor } from '../util.js';
16
- export async function startNode(options, signalHandlers, services, adminServices, userLog) {
17
+ import { extractNamespacedOptions, extractRelevantOptions, preloadCrsDataForVerifying, setupVersionChecker } from '../util.js';
18
+ import { getVersions } from '../versioning.js';
19
+ import { computeExpectedGenesisRoot, waitForCompatibleRollup } from './standby.js';
20
+ import { startProverBroker } from './start_prover_broker.js';
21
+ export async function startNode(options, signalHandlers, services, adminServices, userLog, networkName) {
17
22
  // All options set from environment variables
18
23
  const configFromEnvVars = getConfigEnvVars();
19
24
  // Extract relevant options from command line arguments
@@ -23,23 +28,43 @@ export async function startNode(options, signalHandlers, services, adminServices
23
28
  ...configFromEnvVars,
24
29
  ...relevantOptions
25
30
  };
31
+ // Prover node configuration and broker setup
32
+ // REFACTOR: Move the broker setup out of here and into the prover-node factory
33
+ let broker = undefined;
26
34
  if (options.proverNode) {
27
- userLog(`Running a Prover Node within a Node is not yet supported`);
28
- process.exit(1);
35
+ nodeConfig.enableProverNode = true;
36
+ if (nodeConfig.proverAgentCount === 0) {
37
+ userLog(`Running prover node without local prover agent. Connect prover agents or pass --proverAgent.proverAgentCount`);
38
+ }
39
+ if (nodeConfig.proverBrokerUrl) {
40
+ // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
41
+ // set a lower connection limit such that we don't overload the server
42
+ // Retry indefinitely until the epoch proving times out and the chain reorgs
43
+ const fetch = makeTracedFetch(proverBrokerBackoff, false, makeUndiciFetch(new Agent({
44
+ connections: 100
45
+ })));
46
+ broker = createProvingJobBrokerClient(nodeConfig.proverBrokerUrl, getVersions(nodeConfig), fetch);
47
+ } else if (options.proverBroker) {
48
+ ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
49
+ } else {
50
+ userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
51
+ process.exit(1);
52
+ }
29
53
  }
30
54
  await preloadCrsDataForVerifying(nodeConfig, userLog);
31
- const testAccounts = nodeConfig.testAccounts ? (await getInitialTestAccountsData()).map((a)=>a.address) : [];
32
- const sponsoredFPCAccounts = nodeConfig.sponsoredFPC ? [
33
- await getSponsoredFPCAddress()
34
- ] : [];
35
- const initialFundedAccounts = testAccounts.concat(sponsoredFPCAccounts);
36
- userLog(`Initial funded accounts: ${initialFundedAccounts.map((a)=>a.toString()).join(', ')}`);
37
- const { genesisArchiveRoot, prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
38
- userLog(`Genesis archive root: ${genesisArchiveRoot.toString()}`);
55
+ const genesisConfig = getGenesisStateConfigEnvVars();
56
+ const { genesisArchiveRoot, prefilledPublicData } = await computeExpectedGenesisRoot(genesisConfig, userLog);
39
57
  const followsCanonicalRollup = typeof nodeConfig.rollupVersion !== 'number' || nodeConfig.rollupVersion === 'canonical';
40
58
  if (!nodeConfig.l1Contracts.registryAddress || nodeConfig.l1Contracts.registryAddress.isZero()) {
41
59
  throw new Error('L1 registry address is required to start Aztec Node');
42
60
  }
61
+ // Wait for a compatible rollup before proceeding with full L1 config fetch.
62
+ // This prevents crashes when the canonical rollup hasn't been upgraded yet.
63
+ await waitForCompatibleRollup(nodeConfig, {
64
+ genesisArchiveRoot,
65
+ vkTreeRoot: getVKTreeRoot(),
66
+ protocolContractsHash
67
+ }, options.port, userLog);
43
68
  const { addresses, config } = await getL1Config(nodeConfig.l1Contracts.registryAddress, nodeConfig.l1RpcUrls, nodeConfig.l1ChainId, nodeConfig.rollupVersion);
44
69
  process.env.ROLLUP_CONTRACT_ADDRESS ??= addresses.rollupAddress.toString();
45
70
  if (!Fr.fromHexString(config.genesisArchiveTreeRoot).equals(genesisArchiveRoot)) {
@@ -62,14 +87,14 @@ export async function startNode(options, signalHandlers, services, adminServices
62
87
  ...extractNamespacedOptions(options, 'sequencer')
63
88
  };
64
89
  // If no publisher private keys have been given, use the first validator key
65
- if (sequencerConfig.publisherPrivateKeys === undefined || !sequencerConfig.publisherPrivateKeys.length) {
90
+ if (sequencerConfig.sequencerPublisherPrivateKeys === undefined || !sequencerConfig.sequencerPublisherPrivateKeys.length) {
66
91
  if (sequencerConfig.validatorPrivateKeys?.getValue().length) {
67
- sequencerConfig.publisherPrivateKeys = [
92
+ sequencerConfig.sequencerPublisherPrivateKeys = [
68
93
  new SecretValue(sequencerConfig.validatorPrivateKeys.getValue()[0])
69
94
  ];
70
95
  }
71
96
  }
72
- nodeConfig.publisherPrivateKeys = sequencerConfig.publisherPrivateKeys;
97
+ nodeConfig.sequencerPublisherPrivateKeys = sequencerConfig.sequencerPublisherPrivateKeys;
73
98
  }
74
99
  if (nodeConfig.p2pEnabled) {
75
100
  // ensure bootstrapNodes is an array
@@ -81,7 +106,8 @@ export async function startNode(options, signalHandlers, services, adminServices
81
106
  const telemetry = await initTelemetryClient(telemetryConfig);
82
107
  // Create and start Aztec Node
83
108
  const node = await createAztecNode(nodeConfig, {
84
- telemetry
109
+ telemetry,
110
+ proverBroker: broker
85
111
  }, {
86
112
  prefilledPublicData
87
113
  });
@@ -98,19 +124,37 @@ export async function startNode(options, signalHandlers, services, adminServices
98
124
  node,
99
125
  AztecNodeAdminApiSchema
100
126
  ];
127
+ // Register prover-node services if the prover node subsystem is running
128
+ const proverNode = node.getProverNode();
129
+ if (proverNode) {
130
+ services.prover = [
131
+ proverNode,
132
+ ProverNodeApiSchema
133
+ ];
134
+ if (!nodeConfig.proverBrokerUrl) {
135
+ services.provingJobSource = [
136
+ proverNode.getProver().getProvingJobSource(),
137
+ ProvingJobConsumerSchema
138
+ ];
139
+ }
140
+ }
101
141
  // Add node stop function to signal handlers
102
142
  signalHandlers.push(node.stop.bind(node));
103
143
  // Add a txs bot if requested
104
144
  if (options.bot) {
105
145
  const { addBot } = await import('./start_bot.js');
106
146
  const pxeConfig = extractRelevantOptions(options, allPxeConfigMappings, 'pxe');
107
- const wallet = await TestWallet.create(node, pxeConfig);
147
+ const wallet = await EmbeddedWallet.create(node, {
148
+ pxeConfig
149
+ });
108
150
  await addBot(options, signalHandlers, services, wallet, node, telemetry, undefined);
109
151
  }
110
- if (nodeConfig.autoUpdate !== 'disabled' && nodeConfig.autoUpdateUrl) {
111
- await setupUpdateMonitor(nodeConfig.autoUpdate, new URL(nodeConfig.autoUpdateUrl), followsCanonicalRollup, getPublicClient(nodeConfig), nodeConfig.l1Contracts.registryAddress, signalHandlers, async (config)=>node.setConfig((await AztecNodeAdminApiSchema.setConfig.parameters().parseAsync([
112
- config
113
- ]))[0]));
152
+ if (nodeConfig.enableVersionCheck && networkName !== 'local') {
153
+ const cacheDir = process.env.DATA_DIRECTORY ? `${process.env.DATA_DIRECTORY}/cache` : undefined;
154
+ try {
155
+ await setupVersionChecker(networkName, followsCanonicalRollup, getPublicClient(nodeConfig), signalHandlers, cacheDir);
156
+ } catch {
157
+ /* no-op */ }
114
158
  }
115
159
  return {
116
160
  config: nodeConfig
@@ -1,4 +1,4 @@
1
1
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
2
2
  import type { LogFn } from '@aztec/foundation/log';
3
3
  export declare function startProverAgent(options: any, signalHandlers: (() => Promise<void>)[], services: NamespacedApiHandlers, userLog: LogFn): Promise<void>;
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfcHJvdmVyX2FnZW50LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NtZHMvc3RhcnRfcHJvdmVyX2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0UsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFnQm5ELHdCQUFzQixnQkFBZ0IsQ0FDcEMsT0FBTyxFQUFFLEdBQUcsRUFDWixjQUFjLEVBQUUsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQ3ZDLFFBQVEsRUFBRSxxQkFBcUIsRUFDL0IsT0FBTyxFQUFFLEtBQUssaUJBd0RmIn0=
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfcHJvdmVyX2FnZW50LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NtZHMvc3RhcnRfcHJvdmVyX2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0UsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFpQm5ELHdCQUFzQixnQkFBZ0IsQ0FDcEMsT0FBTyxFQUFFLEdBQUcsRUFDWixjQUFjLEVBQUUsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQ3ZDLFFBQVEsRUFBRSxxQkFBcUIsRUFDL0IsT0FBTyxFQUFFLEtBQUssaUJBb0RmIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"start_prover_agent.d.ts","sourceRoot":"","sources":["../../../src/cli/cmds/start_prover_agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAgBnD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,GAAG,EACZ,cAAc,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EACvC,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,KAAK,iBAwDf"}
1
+ {"version":3,"file":"start_prover_agent.d.ts","sourceRoot":"","sources":["../../../src/cli/cmds/start_prover_agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAiBnD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,GAAG,EACZ,cAAc,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EACvC,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,KAAK,iBAoDf"}
@@ -1,7 +1,7 @@
1
1
  import { times } from '@aztec/foundation/collection';
2
2
  import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
3
3
  import { buildServerCircuitProver } from '@aztec/prover-client';
4
- import { InlineProofStore, ProvingAgent, createProvingJobBrokerClient, proverAgentConfigMappings } from '@aztec/prover-client/broker';
4
+ import { ProvingAgent, createProofStore, createProvingJobBrokerClient, proverAgentConfigMappings, proverBrokerBackoff } from '@aztec/prover-client/broker';
5
5
  import { getProverNodeAgentConfigFromEnv } from '@aztec/prover-node';
6
6
  import { ProverAgentApiSchema } from '@aztec/stdlib/interfaces/server';
7
7
  import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
@@ -25,26 +25,14 @@ export async function startProverAgent(options, signalHandlers, services, userLo
25
25
  process.exit(1);
26
26
  }
27
27
  await preloadCrsDataForServerSideProving(config, userLog);
28
- const fetch = makeTracedFetch(// retry connections every 3s, up to 30s before giving up
29
- [
30
- 1,
31
- 2,
32
- 3,
33
- 3,
34
- 3,
35
- 3,
36
- 3,
37
- 3,
38
- 3,
39
- 3,
40
- 3
41
- ], false, makeUndiciFetch(new Agent({
28
+ // Retry indefinitely until the epoch proving times out and the chain reorgs
29
+ const fetch = makeTracedFetch(proverBrokerBackoff, false, makeUndiciFetch(new Agent({
42
30
  connections: 10
43
31
  })));
44
32
  const broker = createProvingJobBrokerClient(config.proverBrokerUrl, getVersions(), fetch);
45
33
  const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
46
34
  const prover = await buildServerCircuitProver(config, telemetry);
47
- const proofStore = new InlineProofStore();
35
+ const proofStore = await createProofStore(config.proofStore);
48
36
  const agents = times(config.proverAgentCount, ()=>new ProvingAgent(broker, proofStore, prover, config.proverAgentProofTypes, config.proverAgentPollIntervalMs));
49
37
  // expose all agents as individual services
50
38
  for(let i = 0; i < agents.length; i++){
@@ -6,4 +6,4 @@ export declare function startProverBroker(options: any, signalHandlers: (() => P
6
6
  broker: ProvingJobBroker;
7
7
  config: ProverBrokerConfig;
8
8
  }>;
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfcHJvdmVyX2Jyb2tlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jbWRzL3N0YXJ0X3Byb3Zlcl9icm9rZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFJeEIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBS3hFLHdCQUFzQixpQkFBaUIsQ0FDckMsT0FBTyxFQUFFLEdBQUcsRUFDWixjQUFjLEVBQUUsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQ3ZDLFFBQVEsRUFBRSxxQkFBcUIsRUFDL0IsT0FBTyxFQUFFLEtBQUssR0FDYixPQUFPLENBQUM7SUFBRSxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7SUFBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUE7Q0FBRSxDQUFDLENBNENuRSJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfcHJvdmVyX2Jyb2tlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jbWRzL3N0YXJ0X3Byb3Zlcl9icm9rZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFLeEIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTXhFLHdCQUFzQixpQkFBaUIsQ0FDckMsT0FBTyxFQUFFLEdBQUcsRUFDWixjQUFjLEVBQUUsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQ3ZDLFFBQVEsRUFBRSxxQkFBcUIsRUFDL0IsT0FBTyxFQUFFLEtBQUssR0FDYixPQUFPLENBQUM7SUFBRSxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7SUFBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUE7Q0FBRSxDQUFDLENBNENuRSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"start_prover_broker.d.ts","sourceRoot":"","sources":["../../../src/cli/cmds/start_prover_broker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKxE,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,EACZ,cAAc,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EACvC,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,KAAK,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC,CA4CnE"}
1
+ {"version":3,"file":"start_prover_broker.d.ts","sourceRoot":"","sources":["../../../src/cli/cmds/start_prover_broker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMxE,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,EACZ,cAAc,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EACvC,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,KAAK,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC,CA4CnE"}
@@ -1,9 +1,12 @@
1
1
  import { getL1Config } from '@aztec/cli/config';
2
- import { getPublicClient } from '@aztec/ethereum/client';
3
- import { ProvingJobBrokerSchema, createAndStartProvingBroker, proverBrokerConfigMappings } from '@aztec/prover-client/broker';
2
+ import { getGenesisStateConfigEnvVars } from '@aztec/ethereum/config';
3
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
4
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
5
+ import { ProvingJobBrokerSchema, ProvingJobBrokerSchemaWithDebug, createAndStartProvingBroker, proverBrokerConfigMappings } from '@aztec/prover-client/broker';
4
6
  import { getProverNodeBrokerConfigFromEnv } from '@aztec/prover-node';
5
7
  import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
6
- import { extractRelevantOptions, setupUpdateMonitor } from '../util.js';
8
+ import { extractRelevantOptions } from '../util.js';
9
+ import { computeExpectedGenesisRoot, waitForCompatibleRollup } from './standby.js';
7
10
  export async function startProverBroker(options, signalHandlers, services, userLog) {
8
11
  if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
9
12
  userLog(`Starting a prover broker with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
@@ -16,18 +19,21 @@ export async function startProverBroker(options, signalHandlers, services, userL
16
19
  if (!config.l1Contracts.registryAddress || config.l1Contracts.registryAddress.isZero()) {
17
20
  throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
18
21
  }
19
- const followsCanonicalRollup = typeof config.rollupVersion !== 'number';
22
+ const genesisConfig = getGenesisStateConfigEnvVars();
23
+ const { genesisArchiveRoot } = await computeExpectedGenesisRoot(genesisConfig, userLog);
24
+ await waitForCompatibleRollup(config, {
25
+ genesisArchiveRoot,
26
+ vkTreeRoot: getVKTreeRoot(),
27
+ protocolContractsHash
28
+ }, options.port, userLog);
20
29
  const { addresses, config: rollupConfig } = await getL1Config(config.l1Contracts.registryAddress, config.l1RpcUrls, config.l1ChainId, config.rollupVersion);
21
30
  config.l1Contracts = addresses;
22
31
  config.rollupVersion = rollupConfig.rollupVersion;
23
32
  const client = await initTelemetryClient(getTelemetryClientConfig());
24
33
  const broker = await createAndStartProvingBroker(config, client);
25
- if (options.autoUpdate !== 'disabled' && options.autoUpdateUrl) {
26
- await setupUpdateMonitor(options.autoUpdate, new URL(options.autoUpdateUrl), followsCanonicalRollup, getPublicClient(config), config.l1Contracts.registryAddress, signalHandlers);
27
- }
28
34
  services.proverBroker = [
29
35
  broker,
30
- ProvingJobBrokerSchema
36
+ config.proverBrokerDebugReplayEnabled ? ProvingJobBrokerSchemaWithDebug : ProvingJobBrokerSchema
31
37
  ];
32
38
  signalHandlers.push(()=>broker.stop());
33
39
  return {
@@ -0,0 +1,21 @@
1
+ export interface CompiledArtifact {
2
+ noir_version: string;
3
+ file_map: unknown;
4
+ functions: ContractFunction[];
5
+ bytecode?: string;
6
+ }
7
+ export interface ContractFunction {
8
+ name: string;
9
+ abi: unknown;
10
+ bytecode: string;
11
+ debug_symbols: unknown;
12
+ is_unconstrained?: boolean;
13
+ }
14
+ export interface ArtifactFile {
15
+ name: string;
16
+ filePath: string;
17
+ content: CompiledArtifact;
18
+ }
19
+ /** Reads all JSON artifact files from a target directory and returns their parsed contents. */
20
+ export declare function readArtifactFiles(targetDir: string): Promise<ArtifactFile[]>;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NtZHMvdXRpbHMvYXJ0aWZhY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQztJQUNyQixRQUFRLEVBQUUsT0FBTyxDQUFDO0lBQ2xCLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzlCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNuQjtBQUVELE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLEdBQUcsRUFBRSxPQUFPLENBQUM7SUFDYixRQUFRLEVBQUUsTUFBTSxDQUFDO0lBQ2pCLGFBQWEsRUFBRSxPQUFPLENBQUM7SUFDdkIsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDNUI7QUFFRCxNQUFNLFdBQVcsWUFBWTtJQUMzQixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUNqQixPQUFPLEVBQUUsZ0JBQWdCLENBQUM7Q0FDM0I7QUFFRCwrRkFBK0Y7QUFDL0Ysd0JBQXNCLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBa0JsRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../../src/cli/cmds/utils/artifacts.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,+FAA+F;AAC/F,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBlF"}
@@ -0,0 +1,24 @@
1
+ import { readFile, readdir } from 'fs/promises';
2
+ import { join } from 'path';
3
+ /** Reads all JSON artifact files from a target directory and returns their parsed contents. */ export async function readArtifactFiles(targetDir) {
4
+ let entries;
5
+ try {
6
+ entries = (await readdir(targetDir)).filter((f)=>f.endsWith('.json'));
7
+ } catch (err) {
8
+ if (err?.code === 'ENOENT') {
9
+ throw new Error(`Target directory '${targetDir}' does not exist. Compile first with 'aztec compile'.`);
10
+ }
11
+ throw err;
12
+ }
13
+ const artifacts = [];
14
+ for (const file of entries){
15
+ const filePath = join(targetDir, file);
16
+ const content = JSON.parse(await readFile(filePath, 'utf-8'));
17
+ artifacts.push({
18
+ name: file.replace('.json', ''),
19
+ filePath,
20
+ content
21
+ });
22
+ }
23
+ return artifacts;
24
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Recursively collects crate directories starting from startCrateDir by following dependencies declared in Nargo.toml
3
+ * files.
4
+ *
5
+ * When `skipGitDeps` is false (default), git-based deps are followed and fetched into the nargo cache
6
+ * (`$HOME/nargo/<domain>/<repo-path>/<tag>`) if not already present.
7
+ *
8
+ * When `skipGitDeps` is true, git-based deps are ignored entirely.
9
+ */
10
+ export declare function collectCrateDirs(startCrateDir: string, opts?: {
11
+ skipGitDeps?: boolean;
12
+ }): Promise<string[]>;
13
+ /**
14
+ * Computes the local nargo cache path for a git dependency, mirroring nargo's own `git_dep_location` function.
15
+ * Path format: `$HOME/nargo/<domain>/<repo-path>/<tag>`
16
+ * e.g. `~/nargo/github.com/AztecProtocol/aztec-packages/v0.82.0`
17
+ *
18
+ * Source: noir/noir-repo/tooling/nargo_toml/src/git.rs
19
+ */
20
+ export declare function nargoGitDepPath(gitUrl: string, tag: string): string;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdF9jcmF0ZV9kaXJzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NtZHMvdXRpbHMvY29sbGVjdF9jcmF0ZV9kaXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBOzs7Ozs7OztHQVFHO0FBQ0gsd0JBQXNCLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7SUFBRSxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUE7Q0FBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQWlFakg7QUFFRDs7Ozs7O0dBTUc7QUFDSCx3QkFBZ0IsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBS25FIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect_crate_dirs.d.ts","sourceRoot":"","sources":["../../../../src/cli/cmds/utils/collect_crate_dirs.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiEjH;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnE"}
@@ -0,0 +1,114 @@
1
+ import TOML from '@iarna/toml';
2
+ import { existsSync } from 'fs';
3
+ import { mkdir, readFile, stat } from 'fs/promises';
4
+ import { homedir } from 'os';
5
+ import { dirname, join, resolve } from 'path';
6
+ import { run } from './spawn.js';
7
+ /**
8
+ * Recursively collects crate directories starting from startCrateDir by following dependencies declared in Nargo.toml
9
+ * files.
10
+ *
11
+ * When `skipGitDeps` is false (default), git-based deps are followed and fetched into the nargo cache
12
+ * (`$HOME/nargo/<domain>/<repo-path>/<tag>`) if not already present.
13
+ *
14
+ * When `skipGitDeps` is true, git-based deps are ignored entirely.
15
+ */ export async function collectCrateDirs(startCrateDir, opts) {
16
+ const { skipGitDeps = false } = opts ?? {};
17
+ const visited = new Set();
18
+ async function visit(crateDir) {
19
+ const absDir = resolve(crateDir);
20
+ if (visited.has(absDir)) {
21
+ return;
22
+ }
23
+ visited.add(absDir);
24
+ const tomlPath = join(absDir, 'Nargo.toml');
25
+ const content = await readFile(tomlPath, 'utf-8').catch(()=>{
26
+ throw new Error(`Incorrectly defined dependency. Nargo.toml not found in ${absDir}`);
27
+ });
28
+ const parsed = TOML.parse(content);
29
+ const members = parsed.workspace?.members;
30
+ // A Nargo.toml is either a workspace root (has workspace.members) or a single crate (has dependencies).
31
+ if (Array.isArray(members)) {
32
+ // The crate is a workspace root and has members defined so we visit the members
33
+ for (const member of members){
34
+ await visit(resolve(absDir, member));
35
+ }
36
+ } else {
37
+ // Single crate — follow its deps
38
+ const deps = parsed.dependencies ?? {};
39
+ for (const dep of Object.values(deps)){
40
+ if (!dep || typeof dep !== 'object') {
41
+ continue;
42
+ }
43
+ if (typeof dep.path === 'string') {
44
+ // Dependency contains "path" hence it's a local dependency. We just check it's a real directory and then we
45
+ // recursively search through it
46
+ const depPath = resolve(absDir, dep.path);
47
+ const s = await stat(depPath);
48
+ if (!s.isDirectory()) {
49
+ throw new Error(`Dependency path "${dep.path}" in ${tomlPath} resolves to ${depPath} which is not a directory`);
50
+ }
51
+ await visit(depPath);
52
+ } else if (!skipGitDeps && typeof dep.git === 'string' && typeof dep.tag === 'string') {
53
+ // Dependency contains "git" hence it's a git dependency. We ensure it has been fetched and fetch it if
54
+ // it's not the case and then we recursively search through it.
55
+ await fetchAndVisit(dep.git, dep.tag, dep.directory);
56
+ }
57
+ }
58
+ }
59
+ }
60
+ async function fetchAndVisit(gitUrl, tag, directory) {
61
+ // `directory` is set when the dep lives in a subdirectory of a repository, e.g.:
62
+ // aztec = { git = "https://github.com/AztecProtocol/aztec-packages", tag = "v0.82.0",
63
+ // directory = "noir-projects/aztec-nr/aztec" }
64
+ // In that case nargo clones the whole repo and the crate root is <cachePath>/<directory>.
65
+ const cachePath = nargoGitDepPath(gitUrl, tag);
66
+ const crateDir = directory ? join(cachePath, directory) : cachePath;
67
+ await ensureGitDepCached(gitUrl, tag, cachePath);
68
+ await visit(crateDir);
69
+ }
70
+ await visit(startCrateDir);
71
+ return [
72
+ ...visited
73
+ ];
74
+ }
75
+ /**
76
+ * Computes the local nargo cache path for a git dependency, mirroring nargo's own `git_dep_location` function.
77
+ * Path format: `$HOME/nargo/<domain>/<repo-path>/<tag>`
78
+ * e.g. `~/nargo/github.com/AztecProtocol/aztec-packages/v0.82.0`
79
+ *
80
+ * Source: noir/noir-repo/tooling/nargo_toml/src/git.rs
81
+ */ export function nargoGitDepPath(gitUrl, tag) {
82
+ const url = new URL(gitUrl);
83
+ const domain = url.hostname;
84
+ const repoPath = url.pathname.replace(/^\//, '');
85
+ return join(process.env.HOME ?? homedir(), 'nargo', domain, repoPath, tag);
86
+ }
87
+ /**
88
+ * Ensures a git dep is present in the nargo cache, cloning it if it isn't. Mirrors nargo's `clone_git_repo`.
89
+ * If cloning fails (e.g. no network), throws with a message suggesting `nargo check` to prime the cache.
90
+ *
91
+ * Source: noir/noir-repo/tooling/nargo_toml/src/git.rs
92
+ */ async function ensureGitDepCached(gitUrl, tag, cachePath) {
93
+ if (existsSync(cachePath)) {
94
+ return;
95
+ }
96
+ await mkdir(dirname(cachePath), {
97
+ recursive: true
98
+ });
99
+ try {
100
+ await run('git', [
101
+ '-c',
102
+ 'advice.detachedHead=false',
103
+ 'clone',
104
+ '--depth',
105
+ '1',
106
+ '--branch',
107
+ tag,
108
+ gitUrl,
109
+ cachePath
110
+ ]);
111
+ } catch (err) {
112
+ throw new Error(`Failed to fetch git dependency ${gitUrl}@${tag}: ${err?.message ?? err}.\n` + `Try running \`nargo check\` first to prime the dependency cache.`);
113
+ }
114
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Returns true if recompilation is needed: either no artifacts exist in target/ or any .nr or Nargo.toml source file
3
+ * (including path-based dependencies) is newer than the oldest artifact. We compare against the oldest artifact so
4
+ * that a source change between the oldest and newest compilation (e.g. in a multi-contract workspace) still triggers
5
+ * a recompile.
6
+ *
7
+ * Note: The above implies that if there is a random json file in the target dir we would be always recompiling.
8
+ */
9
+ export declare function needsRecompile(): Promise<boolean>;
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZHNfcmVjb21waWxlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NtZHMvdXRpbHMvbmVlZHNfcmVjb21waWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBOzs7Ozs7O0dBT0c7QUFDSCx3QkFBc0IsY0FBYyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FXdkQifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"needs_recompile.d.ts","sourceRoot":"","sources":["../../../../src/cli/cmds/utils/needs_recompile.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAWvD"}
@@ -0,0 +1,90 @@
1
+ import { readdir, stat } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { collectCrateDirs } from './collect_crate_dirs.js';
4
+ /**
5
+ * Returns true if recompilation is needed: either no artifacts exist in target/ or any .nr or Nargo.toml source file
6
+ * (including path-based dependencies) is newer than the oldest artifact. We compare against the oldest artifact so
7
+ * that a source change between the oldest and newest compilation (e.g. in a multi-contract workspace) still triggers
8
+ * a recompile.
9
+ *
10
+ * Note: The above implies that if there is a random json file in the target dir we would be always recompiling.
11
+ */ export async function needsRecompile() {
12
+ const oldestArtifactMs = await getOldestArtifactModificationTime('target');
13
+ if (oldestArtifactMs === undefined) {
14
+ return true;
15
+ }
16
+ // Git deps are pinned to a specific tag in Nargo.toml and nargo always fetches an exact tag, so their contents never
17
+ // change without Nargo.toml itself changing — and Nargo.toml is already tracked as a source file. Hence we can
18
+ // safely ignore checking source files of git deps.
19
+ const crateDirs = await collectCrateDirs('.', {
20
+ skipGitDeps: true
21
+ });
22
+ return hasNewerSourceFile(crateDirs, oldestArtifactMs);
23
+ }
24
+ /**
25
+ * Returns the last modification time (timestamp in ms) of the oldest .json artifact in targetDir, or undefined if
26
+ * none exist.
27
+ */ async function getOldestArtifactModificationTime(targetDir) {
28
+ let entries;
29
+ try {
30
+ entries = (await readdir(targetDir)).filter((f)=>f.endsWith('.json'));
31
+ } catch (err) {
32
+ if (err?.code === 'ENOENT') {
33
+ return undefined;
34
+ }
35
+ throw err;
36
+ }
37
+ if (entries.length === 0) {
38
+ return undefined;
39
+ }
40
+ let oldest = Infinity;
41
+ for (const entry of entries){
42
+ const s = await stat(join(targetDir, entry));
43
+ if (s.mtimeMs < oldest) {
44
+ oldest = s.mtimeMs;
45
+ }
46
+ }
47
+ return oldest;
48
+ }
49
+ /**
50
+ * Walks crate dirs looking for .nr and Nargo.toml files newer than thresholdMs. Short-circuits on the first match.
51
+ */ async function hasNewerSourceFile(crateDirs, thresholdMs) {
52
+ // Returns true if it find a new file than thresholdMs, false otherwise
53
+ async function walkForNewer(dir) {
54
+ let entries;
55
+ try {
56
+ entries = await readdir(dir, {
57
+ withFileTypes: true
58
+ });
59
+ } catch {
60
+ return false;
61
+ }
62
+ // We iterate over the entries in the dir
63
+ for (const entry of entries){
64
+ const fullPath = join(dir, entry.name);
65
+ if (entry.isDirectory()) {
66
+ // If the entry is a dir and it's not called `target` we recursively enter it
67
+ if (entry.name === 'target') {
68
+ continue;
69
+ }
70
+ if (await walkForNewer(fullPath)) {
71
+ return true;
72
+ }
73
+ } else if (entry.name === 'Nargo.toml' || entry.name.endsWith('.nr')) {
74
+ // The entry is a Nargo.toml file or *.nr file so we check the timestamp
75
+ const s = await stat(fullPath);
76
+ if (s.mtimeMs > thresholdMs) {
77
+ return true;
78
+ }
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+ // We search through the crate dirs
84
+ for (const dir of crateDirs){
85
+ if (await walkForNewer(dir)) {
86
+ return true;
87
+ }
88
+ }
89
+ return false;
90
+ }
@@ -0,0 +1,3 @@
1
+ /** Spawns a command with inherited stdio and rejects on non-zero exit. */
2
+ export declare function run(cmd: string, args: string[]): Promise<void>;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhd24uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGkvY21kcy91dGlscy9zcGF3bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSwwRUFBMEU7QUFDMUUsd0JBQWdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBWTlEIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../../src/cli/cmds/utils/spawn.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9D"}
@@ -0,0 +1,16 @@
1
+ import { spawn } from 'child_process';
2
+ /** Spawns a command with inherited stdio and rejects on non-zero exit. */ export function run(cmd, args) {
3
+ return new Promise((resolve, reject)=>{
4
+ const child = spawn(cmd, args, {
5
+ stdio: 'inherit'
6
+ });
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
+ }
@@ -0,0 +1,4 @@
1
+ import type { LogFn } from '@aztec/foundation/log';
2
+ /** Warns if the `aztec` dependency tag in any crate's Nargo.toml doesn't match the CLI version. */
3
+ export declare function warnIfAztecVersionMismatch(log: LogFn, cliVersion?: string): Promise<void>;
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Fybl9pZl9henRlY192ZXJzaW9uX21pc21hdGNoLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NtZHMvdXRpbHMvd2Fybl9pZl9henRlY192ZXJzaW9uX21pc21hdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBU25ELG1HQUFtRztBQUNuRyx3QkFBc0IsMEJBQTBCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQTJDL0YifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warn_if_aztec_version_mismatch.d.ts","sourceRoot":"","sources":["../../../../src/cli/cmds/utils/warn_if_aztec_version_mismatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AASnD,mGAAmG;AACnG,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C/F"}