@aztec/aztec 0.0.1-commit.21ecf947b → 0.0.1-commit.2448fdb

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 (124) 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 +72 -18
  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 +37 -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 +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_node.d.ts +3 -2
  33. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  34. package/dest/cli/cmds/start_node.js +67 -25
  35. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  36. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  37. package/dest/cli/cmds/start_prover_agent.js +3 -15
  38. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  39. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  40. package/dest/cli/cmds/start_prover_broker.js +12 -6
  41. package/dest/cli/cmds/utils/artifacts.d.ts +21 -0
  42. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -0
  43. package/dest/cli/cmds/utils/artifacts.js +24 -0
  44. package/dest/cli/cmds/utils/collect_crate_dirs.d.ts +21 -0
  45. package/dest/cli/cmds/utils/collect_crate_dirs.d.ts.map +1 -0
  46. package/dest/cli/cmds/utils/collect_crate_dirs.js +114 -0
  47. package/dest/cli/cmds/utils/needs_recompile.d.ts +10 -0
  48. package/dest/cli/cmds/utils/needs_recompile.d.ts.map +1 -0
  49. package/dest/cli/cmds/utils/needs_recompile.js +90 -0
  50. package/dest/cli/cmds/utils/spawn.d.ts +3 -0
  51. package/dest/cli/cmds/utils/spawn.d.ts.map +1 -0
  52. package/dest/cli/cmds/utils/spawn.js +16 -0
  53. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts +4 -0
  54. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.d.ts.map +1 -0
  55. package/dest/cli/cmds/utils/warn_if_aztec_version_mismatch.js +62 -0
  56. package/dest/cli/util.d.ts +3 -5
  57. package/dest/cli/util.d.ts.map +1 -1
  58. package/dest/cli/util.js +37 -78
  59. package/dest/examples/token.js +4 -4
  60. package/dest/local-network/banana_fpc.js +1 -1
  61. package/dest/local-network/local-network.d.ts +3 -1
  62. package/dest/local-network/local-network.d.ts.map +1 -1
  63. package/dest/local-network/local-network.js +43 -9
  64. package/dest/testing/anvil_test_watcher.d.ts +9 -1
  65. package/dest/testing/anvil_test_watcher.d.ts.map +1 -1
  66. package/dest/testing/anvil_test_watcher.js +81 -18
  67. package/dest/testing/cheat_codes.d.ts +11 -15
  68. package/dest/testing/cheat_codes.d.ts.map +1 -1
  69. package/dest/testing/cheat_codes.js +34 -32
  70. package/dest/testing/epoch_test_settler.d.ts +1 -1
  71. package/dest/testing/epoch_test_settler.d.ts.map +1 -1
  72. package/dest/testing/epoch_test_settler.js +3 -4
  73. package/dest/testing/index.d.ts +2 -1
  74. package/dest/testing/index.d.ts.map +1 -1
  75. package/dest/testing/index.js +1 -0
  76. package/dest/testing/token_allowed_setup.d.ts +7 -0
  77. package/dest/testing/token_allowed_setup.d.ts.map +1 -0
  78. package/dest/testing/token_allowed_setup.js +20 -0
  79. package/package.json +35 -34
  80. package/scripts/add_crate.sh +102 -0
  81. package/scripts/aztec.sh +10 -3
  82. package/scripts/init.sh +23 -19
  83. package/scripts/new.sh +48 -24
  84. package/scripts/setup_workspace.sh +68 -0
  85. package/src/bin/index.ts +7 -3
  86. package/src/cli/admin_api_key_store.ts +128 -0
  87. package/src/cli/aztec_start_action.ts +65 -14
  88. package/src/cli/aztec_start_options.ts +39 -7
  89. package/src/cli/cli.ts +3 -4
  90. package/src/cli/cmds/compile.ts +194 -0
  91. package/src/cli/cmds/profile.ts +25 -0
  92. package/src/cli/cmds/profile_flamegraph.ts +64 -0
  93. package/src/cli/cmds/profile_gates.ts +68 -0
  94. package/src/cli/cmds/profile_utils.ts +58 -0
  95. package/src/cli/cmds/standby.ts +132 -0
  96. package/src/cli/cmds/start_node.ts +81 -31
  97. package/src/cli/cmds/start_prover_agent.ts +3 -6
  98. package/src/cli/cmds/start_prover_broker.ts +14 -14
  99. package/src/cli/cmds/utils/artifacts.ts +44 -0
  100. package/src/cli/cmds/utils/collect_crate_dirs.ts +118 -0
  101. package/src/cli/cmds/utils/needs_recompile.ts +98 -0
  102. package/src/cli/cmds/utils/spawn.ts +16 -0
  103. package/src/cli/cmds/utils/warn_if_aztec_version_mismatch.ts +77 -0
  104. package/src/cli/util.ts +41 -74
  105. package/src/examples/token.ts +6 -4
  106. package/src/local-network/banana_fpc.ts +1 -1
  107. package/src/local-network/local-network.ts +51 -10
  108. package/src/testing/anvil_test_watcher.ts +85 -18
  109. package/src/testing/cheat_codes.ts +42 -36
  110. package/src/testing/epoch_test_settler.ts +3 -4
  111. package/src/testing/index.ts +1 -0
  112. package/src/testing/token_allowed_setup.ts +19 -0
  113. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  114. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  115. package/dest/cli/cmds/start_prover_node.js +0 -108
  116. package/dest/cli/release_version.d.ts +0 -2
  117. package/dest/cli/release_version.d.ts.map +0 -1
  118. package/dest/cli/release_version.js +0 -14
  119. package/scripts/compile.sh +0 -44
  120. package/scripts/extract_function.js +0 -47
  121. package/scripts/flamegraph.sh +0 -59
  122. package/scripts/setup_project.sh +0 -31
  123. package/src/cli/cmds/start_prover_node.ts +0 -124
  124. package/src/cli/release_version.ts +0 -21
@@ -0,0 +1,62 @@
1
+ import { getPackageVersion } from '@aztec/stdlib/update-checker';
2
+ import TOML from '@iarna/toml';
3
+ import { readFile } from 'fs/promises';
4
+ import { join } from 'path';
5
+ import { collectCrateDirs } from './collect_crate_dirs.js';
6
+ /** Returns true if the given git URL points to the AztecProtocol/aztec-nr repository. */ function isAztecNrGitUrl(gitUrl) {
7
+ let url;
8
+ try {
9
+ url = new URL(gitUrl);
10
+ } catch {
11
+ return false;
12
+ }
13
+ if (url.hostname !== 'github.com') {
14
+ return false;
15
+ }
16
+ const repoPath = url.pathname.replace(/^\//, '').replace(/\.git$/, '').replace(/\/$/, '');
17
+ return repoPath === 'AztecProtocol/aztec-nr';
18
+ }
19
+ /** Warns if any aztec-nr git dependency in a crate's Nargo.toml has a tag that doesn't match the CLI version. */ export async function warnIfAztecVersionMismatch(log, cliVersion) {
20
+ const version = cliVersion ?? getPackageVersion();
21
+ if (!version) {
22
+ log(`WARNING: aztec CLI version not found. Skipping dependency compatibility check.`);
23
+ return;
24
+ }
25
+ const expectedTag = `v${version}`;
26
+ const mismatches = [];
27
+ const crateDirs = await collectCrateDirs('.', {
28
+ skipGitDeps: true
29
+ });
30
+ for (const dir of crateDirs){
31
+ const tomlPath = join(dir, 'Nargo.toml');
32
+ let content;
33
+ try {
34
+ content = await readFile(tomlPath, 'utf-8');
35
+ } catch {
36
+ continue;
37
+ }
38
+ const parsed = TOML.parse(content);
39
+ const deps = parsed.dependencies ?? {};
40
+ for (const [depName, dep] of Object.entries(deps)){
41
+ // Skip non-object deps (e.g. malformed entries) and anything that isn't a tagged git dep.
42
+ if (!dep || typeof dep !== 'object' || typeof dep.git !== 'string' || typeof dep.tag !== 'string') {
43
+ continue;
44
+ }
45
+ // Only flag deps that are sourced from the aztec-nr repo.
46
+ if (!isAztecNrGitUrl(dep.git)) {
47
+ continue;
48
+ }
49
+ if (dep.tag !== expectedTag) {
50
+ mismatches.push({
51
+ file: tomlPath,
52
+ depName,
53
+ tag: dep.tag
54
+ });
55
+ }
56
+ }
57
+ }
58
+ if (mismatches.length > 0) {
59
+ const details = mismatches.map((m)=>` ${m.file} — ${m.depName} (${m.tag})`).join('\n');
60
+ log(`WARNING: Aztec dependency version mismatch detected.\n` + `The following aztec-nr dependencies do not match the CLI version (${expectedTag}):\n` + `${details}\n\n` + `See https://docs.aztec.network/errors/9 for how to update your dependencies.`);
61
+ }
62
+ }
@@ -1,10 +1,8 @@
1
1
  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
- import type { ConfigMappingsType } from '@aztec/foundation/config';
5
- import { EthAddress } from '@aztec/foundation/eth-address';
4
+ import type { ConfigMappingsType, NetworkNames } from '@aztec/foundation/config';
6
5
  import { type LogFn } from '@aztec/foundation/log';
7
- import type { SharedNodeConfig } from '@aztec/node-lib/config';
8
6
  import type { ProverConfig } from '@aztec/stdlib/interfaces/server';
9
7
  import type { EmbeddedWallet } from '@aztec/wallets/embedded';
10
8
  import type { Command } from 'commander';
@@ -63,6 +61,6 @@ export declare function preloadCrsDataForVerifying({ realProofs }: Pick<AztecNod
63
61
  * @param log - Logging function
64
62
  */
65
63
  export declare function preloadCrsDataForServerSideProving({ realProofs }: Pick<ProverConfig, 'realProofs'>, log: LogFn): Promise<void>;
66
- export declare function setupUpdateMonitor(autoUpdateMode: SharedNodeConfig['autoUpdate'], updatesLocation: URL, followsCanonicalRollup: boolean, publicClient: ViemClient, registryContractAddress: EthAddress, signalHandlers: Array<() => Promise<void>>, updateNodeConfig?: (config: object) => Promise<void>): Promise<void>;
64
+ export declare function setupVersionChecker(network: NetworkNames, followsCanonicalRollup: boolean, publicClient: ViemClient, signalHandlers: Array<() => Promise<void>>, cacheDir?: string): Promise<void>;
67
65
  export declare function stringifyConfig(config: object): string;
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFBRSxLQUFLLEtBQUssRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXBFLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzlELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6QyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRiwwQkFBa0IsUUFBUTtJQUN4QixPQUFPLElBQUk7SUFDWCxLQUFLLElBQUk7SUFDVCxjQUFjLEtBQUs7SUFDbkIsZUFBZSxLQUFLO0lBRXBCLE1BQU0sTUFBTTtJQUNaLE1BQU0sTUFBTTtJQUNaLE9BQU8sTUFBTTtJQUNiLE9BQU8sTUFBTTtDQUNkO0FBR0Qsd0JBQWdCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQWdCMUc7QUFFRCx3QkFBZ0IsY0FBYyxJQUFJLE9BQU8sQ0FFeEM7QUFFRCxlQUFPLE1BQU0scUJBQXFCLGtFQWFqQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCx3QkFBc0IsaUJBQWlCLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxjQUFjLHFCQXlCaEc7QUFFRCx3QkFBZ0IsYUFBYSxDQUFDLFFBQVEsRUFBRTtJQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxDQUFBO0NBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FpQi9GO0FBRUQsd0JBQWdCLGNBQWMsQ0FDNUIsTUFBTSxFQUFFLE1BQU0sRUFDZCxZQUFZLEVBQUUsTUFBTSxFQUNwQixNQUFNLEVBQUUsTUFBTSxFQUNkLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLGdCQUFnQixFQUFFLE1BQU0sR0FDdkIsTUFBTSxDQUtSO0FBaUNELGVBQU8sTUFBTSxVQUFVLHFEQVN0QixDQUFDO0FBRUYsZUFBTyxNQUFNLHVCQUF1QixjQXlCbkMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsZUFBTyxNQUFNLHdCQUF3QiwwRUFTcEMsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSCxlQUFPLE1BQU0sc0JBQXNCLEdBQUksQ0FBQyx3RkFrQ3ZDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsd0JBQXNCLDBCQUEwQixDQUM5QyxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLEVBQ25ELEdBQUcsRUFBRSxLQUFLLEdBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUtmO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFzQixrQ0FBa0MsQ0FDdEQsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxFQUNoRCxHQUFHLEVBQUUsS0FBSyxHQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FLZjtBQUVELHdCQUFzQixrQkFBa0IsQ0FDdEMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxFQUM5QyxlQUFlLEVBQUUsR0FBRyxFQUNwQixzQkFBc0IsRUFBRSxPQUFPLEVBQy9CLFlBQVksRUFBRSxVQUFVLEVBQ3hCLHVCQUF1QixFQUFFLFVBQVUsRUFDbkMsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUMxQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQStFckQ7QUFFRCx3QkFBZ0IsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUl0RCJ9
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxLQUFLLEtBQUssRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVwRSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc5RCxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHekMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFFcEYsMEJBQWtCLFFBQVE7SUFDeEIsT0FBTyxJQUFJO0lBQ1gsS0FBSyxJQUFJO0lBQ1QsY0FBYyxLQUFLO0lBQ25CLGVBQWUsS0FBSztJQUVwQixNQUFNLE1BQU07SUFDWixNQUFNLE1BQU07SUFDWixPQUFPLE1BQU07SUFDYixPQUFPLE1BQU07Q0FDZDtBQUdELHdCQUFnQixRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FnQjFHO0FBRUQsd0JBQWdCLGNBQWMsSUFBSSxPQUFPLENBRXhDO0FBRUQsZUFBTyxNQUFNLHFCQUFxQixrRUFhakMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsd0JBQXNCLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsY0FBYyxxQkF5QmhHO0FBRUQsd0JBQWdCLGFBQWEsQ0FBQyxRQUFRLEVBQUU7SUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQTtDQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBaUIvRjtBQUVELHdCQUFnQixjQUFjLENBQzVCLE1BQU0sRUFBRSxNQUFNLEVBQ2QsWUFBWSxFQUFFLE1BQU0sRUFDcEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxlQUFlLEVBQUUsTUFBTSxFQUN2QixnQkFBZ0IsRUFBRSxNQUFNLEdBQ3ZCLE1BQU0sQ0FLUjtBQWlDRCxlQUFPLE1BQU0sVUFBVSxxREFTdEIsQ0FBQztBQUVGLGVBQU8sTUFBTSx1QkFBdUIsY0F5Qm5DLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILGVBQU8sTUFBTSx3QkFBd0IsMEVBU3BDLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsZUFBTyxNQUFNLHNCQUFzQixHQUFJLENBQUMsd0ZBa0N2QyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILHdCQUFzQiwwQkFBMEIsQ0FDOUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxFQUNuRCxHQUFHLEVBQUUsS0FBSyxHQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FLZjtBQUVEOzs7O0dBSUc7QUFDSCx3QkFBc0Isa0NBQWtDLENBQ3RELEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsRUFDaEQsR0FBRyxFQUFFLEtBQUssR0FDVCxPQUFPLENBQUMsSUFBSSxDQUFDLENBS2Y7QUFFRCx3QkFBc0IsbUJBQW1CLENBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQ3JCLHNCQUFzQixFQUFFLE9BQU8sRUFDL0IsWUFBWSxFQUFFLFVBQVUsRUFDeEIsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUMxQyxRQUFRLENBQUMsRUFBRSxNQUFNLEdBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0E4Q2Y7QUFFRCx3QkFBZ0IsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUl0RCJ9
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/cli/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,KAAK,KAAK,EAAgB,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,0BAA0B,CAAC;AAEpF,0BAAkB,QAAQ;IACxB,OAAO,IAAI;IACX,KAAK,IAAI;IACT,cAAc,KAAK;IACnB,eAAe,KAAK;IAEpB,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,OAAO,MAAM;IACb,OAAO,MAAM;CACd;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAgB1G;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,eAAO,MAAM,qBAAqB,kEAajC,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,eAAe,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,cAAc,qBAyBhG;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAA;CAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB/F;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAiCD,eAAO,MAAM,UAAU,qDAStB,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAyBnC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,0EASpC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,wFAkCvC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EACnD,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;GAIG;AACH,wBAAsB,kCAAkC,CACtD,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAChD,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,kBAAkB,CACtC,cAAc,EAAE,gBAAgB,CAAC,YAAY,CAAC,EAC9C,eAAe,EAAE,GAAG,EACpB,sBAAsB,EAAE,OAAO,EAC/B,YAAY,EAAE,UAAU,EACxB,uBAAuB,EAAE,UAAU,EACnC,cAAc,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAC1C,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,iBA+ErD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/cli/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEjF,OAAO,EAAE,KAAK,KAAK,EAAgB,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,0BAA0B,CAAC;AAEpF,0BAAkB,QAAQ;IACxB,OAAO,IAAI;IACX,KAAK,IAAI;IACT,cAAc,KAAK;IACnB,eAAe,KAAK;IAEpB,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,OAAO,MAAM;IACb,OAAO,MAAM;CACd;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAgB1G;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,eAAO,MAAM,qBAAqB,kEAajC,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,eAAe,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,cAAc,qBAyBhG;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAA;CAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB/F;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAiCD,eAAO,MAAM,UAAU,qDAStB,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAyBnC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,0EASpC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,wFAkCvC,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EACnD,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;GAIG;AACH,wBAAsB,kCAAkC,CACtD,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAChD,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,YAAY,EACrB,sBAAsB,EAAE,OAAO,EAC/B,YAAY,EAAE,UAAU,EACxB,cAAc,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAC1C,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD"}
package/dest/cli/util.js CHANGED
@@ -1,6 +1,8 @@
1
+ import { getNetworkConfig } from '@aztec/cli/config';
2
+ import { RegistryContract } from '@aztec/ethereum/contracts';
1
3
  import { jsonStringify } from '@aztec/foundation/json-rpc';
2
4
  import { createLogger } from '@aztec/foundation/log';
3
- import { getTelemetryClient } from '@aztec/telemetry-client/start';
5
+ import { getPackageVersion } from '@aztec/stdlib/update-checker';
4
6
  import chalk from 'chalk';
5
7
  import { aztecStartOptions } from './aztec_start_options.js';
6
8
  export var ExitCode = /*#__PURE__*/ function(ExitCode) {
@@ -237,92 +239,49 @@ export const printAztecStartHelpText = ()=>{
237
239
  ]);
238
240
  }
239
241
  }
240
- export async function setupUpdateMonitor(autoUpdateMode, updatesLocation, followsCanonicalRollup, publicClient, registryContractAddress, signalHandlers, updateNodeConfig) {
241
- const logger = createLogger('update-check');
242
- const { UpdateChecker } = await import('@aztec/stdlib/update-checker');
243
- const checker = await UpdateChecker.new({
244
- baseURL: updatesLocation,
245
- publicClient,
246
- registryContractAddress
247
- });
248
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
249
- checker.on('newRollupVersion', async ({ latestVersion, currentVersion })=>{
250
- if (isShuttingDown()) {
251
- return;
252
- }
253
- // if node follows canonical rollup then this is equivalent to a config update
254
- if (!followsCanonicalRollup) {
255
- return;
256
- }
257
- if (autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') {
258
- logger.info(`New rollup version detected. Please restart the node`, {
259
- latestVersion,
260
- currentVersion
261
- });
262
- await shutdown(logger.info, 78, signalHandlers);
263
- } else if (autoUpdateMode === 'notify') {
264
- logger.warn(`New rollup detected. Please restart the node`, {
265
- latestVersion,
266
- currentVersion
267
- });
242
+ export async function setupVersionChecker(network, followsCanonicalRollup, publicClient, signalHandlers, cacheDir) {
243
+ const networkConfig = await getNetworkConfig(network, cacheDir);
244
+ if (!networkConfig) {
245
+ return;
246
+ }
247
+ const { VersionChecker } = await import('@aztec/stdlib/update-checker');
248
+ const logger = createLogger('version_check');
249
+ const registry = new RegistryContract(publicClient, networkConfig.registryAddress);
250
+ const checks = [];
251
+ checks.push({
252
+ name: 'node',
253
+ currentVersion: getPackageVersion() ?? 'unknown',
254
+ getLatestVersion: async ()=>{
255
+ const cfg = await getNetworkConfig(network, cacheDir);
256
+ return cfg?.nodeVersion;
268
257
  }
269
258
  });
270
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
271
- checker.on('newNodeVersion', async ({ latestVersion, currentVersion })=>{
272
- if (isShuttingDown()) {
273
- return;
274
- }
275
- if (autoUpdateMode === 'config-and-version') {
276
- logger.info(`New node version detected. Please update and restart the node`, {
277
- latestVersion,
278
- currentVersion
279
- });
280
- await shutdown(logger.info, 79, signalHandlers);
281
- } else if (autoUpdateMode === 'notify') {
282
- logger.info(`New node version detected. Please update and restart the node`, {
283
- latestVersion,
284
- currentVersion
259
+ if (followsCanonicalRollup) {
260
+ const getLatestVersion = async ()=>{
261
+ const version = (await registry.getRollupVersions()).at(-1);
262
+ return version !== undefined ? String(version) : undefined;
263
+ };
264
+ const currentVersion = await getLatestVersion();
265
+ if (currentVersion !== undefined) {
266
+ checks.push({
267
+ name: 'rollup',
268
+ currentVersion,
269
+ getLatestVersion
285
270
  });
286
271
  }
287
- });
288
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
289
- checker.on('updateNodeConfig', async (config)=>{
272
+ }
273
+ const checker = new VersionChecker(checks, 600_000, logger);
274
+ checker.on('newVersion', ({ name, latestVersion, currentVersion })=>{
290
275
  if (isShuttingDown()) {
291
276
  return;
292
277
  }
293
- if ((autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') && updateNodeConfig) {
294
- logger.warn(`Config change detected. Updating node`, config);
295
- try {
296
- await updateNodeConfig(config);
297
- } catch (err) {
298
- logger.warn('Failed to update config', {
299
- err
300
- });
301
- }
302
- }
303
- // don't notify on these config changes
304
- });
305
- checker.on('updatePublicTelemetryConfig', (config)=>{
306
- if (autoUpdateMode === 'config' || autoUpdateMode === 'config-and-version') {
307
- logger.warn(`Public telemetry config change detected. Updating telemetry client`, config);
308
- try {
309
- const publicIncludeMetrics = config.publicIncludeMetrics;
310
- if (Array.isArray(publicIncludeMetrics) && publicIncludeMetrics.every((m)=>typeof m === 'string')) {
311
- getTelemetryClient().setExportedPublicTelemetry(publicIncludeMetrics);
312
- }
313
- const publicMetricsCollectFrom = config.publicMetricsCollectFrom;
314
- if (Array.isArray(publicMetricsCollectFrom) && publicMetricsCollectFrom.every((m)=>typeof m === 'string')) {
315
- getTelemetryClient().setPublicTelemetryCollectFrom(publicMetricsCollectFrom);
316
- }
317
- } catch (err) {
318
- logger.warn('Failed to update config', {
319
- err
320
- });
321
- }
322
- }
323
- // don't notify on these config changes
278
+ logger.warn(`New ${name} version available`, {
279
+ latestVersion,
280
+ currentVersion
281
+ });
324
282
  });
325
283
  checker.start();
284
+ signalHandlers.push(()=>checker.stop());
326
285
  }
327
286
  export function stringifyConfig(config) {
328
287
  return Object.entries(config).map(([key, value])=>`${key}=${jsonStringify(value)}`).join(' ');
@@ -21,7 +21,7 @@ const TRANSFER_AMOUNT = 33n;
21
21
  const bob = bobInitialAccountData.address;
22
22
  logger.info(`Fetched Alice and Bob accounts: ${alice.toString()}, ${bob.toString()}`);
23
23
  logger.info('Deploying Token...');
24
- const token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({
24
+ const { contract: token } = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({
25
25
  from: alice
26
26
  });
27
27
  logger.info('Token deployed');
@@ -31,7 +31,7 @@ const TRANSFER_AMOUNT = 33n;
31
31
  from: alice
32
32
  });
33
33
  logger.info(`${ALICE_MINT_BALANCE} tokens were successfully minted by Alice and transferred to private`);
34
- const balanceAfterMint = await token.methods.balance_of_private(alice).simulate({
34
+ const { result: balanceAfterMint } = await token.methods.balance_of_private(alice).simulate({
35
35
  from: alice
36
36
  });
37
37
  logger.info(`Tokens successfully minted. New Alice's balance: ${balanceAfterMint}`);
@@ -41,11 +41,11 @@ const TRANSFER_AMOUNT = 33n;
41
41
  from: alice
42
42
  });
43
43
  // Check the new balances
44
- const aliceBalance = await token.methods.balance_of_private(alice).simulate({
44
+ const { result: aliceBalance } = await token.methods.balance_of_private(alice).simulate({
45
45
  from: alice
46
46
  });
47
47
  logger.info(`Alice's balance ${aliceBalance}`);
48
- const bobBalance = await token.methods.balance_of_private(bob).simulate({
48
+ const { result: bobBalance } = await token.methods.balance_of_private(bob).simulate({
49
49
  from: bob
50
50
  });
51
51
  logger.info(`Bob's balance ${bobBalance}`);
@@ -46,7 +46,7 @@ export async function getBananaFPCAddress(initialAccounts) {
46
46
  export async function setupBananaFPC(initialAccounts, wallet, log) {
47
47
  const bananaCoinAddress = await getBananaCoinAddress(initialAccounts);
48
48
  const admin = getBananaAdmin(initialAccounts);
49
- const [bananaCoin, fpc] = await Promise.all([
49
+ const [{ contract: bananaCoin }, { contract: fpc }] = await Promise.all([
50
50
  TokenContract.deploy(wallet, admin, bananaCoinArgs.name, bananaCoinArgs.symbol, bananaCoinArgs.decimal).send({
51
51
  from: admin,
52
52
  contractAddressSalt: BANANA_COIN_SALT,
@@ -6,6 +6,7 @@ import { type BlobClientInterface } from '@aztec/blob-client/client';
6
6
  import { EthAddress } from '@aztec/foundation/eth-address';
7
7
  import type { LogFn } from '@aztec/foundation/log';
8
8
  import { DateProvider } from '@aztec/foundation/timer';
9
+ import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
9
10
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
10
11
  import { type TelemetryClient } from '@aztec/telemetry-client';
11
12
  import { type Hex } from 'viem';
@@ -65,7 +66,8 @@ export declare function createAztecNode(config?: Partial<AztecNodeConfig>, deps?
65
66
  telemetry?: TelemetryClient;
66
67
  blobClient?: BlobClientInterface;
67
68
  dateProvider?: DateProvider;
69
+ proverBroker?: ProvingJobBroker;
68
70
  }, options?: {
69
71
  prefilledPublicData?: PublicDataTreeLeaf[];
70
72
  }): Promise<AztecNodeService>;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtbmV0d29yay5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvY2FsLW5ldHdvcmsvbG9jYWwtbmV0d29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBb0IsTUFBTSwyQkFBMkIsQ0FBQztBQVN2RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBb0IsTUFBTSx5QkFBeUIsQ0FBQztBQUd6RSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlELE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFHckIsTUFBTSx5QkFBeUIsQ0FBQztBQUtqQyxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQTJELE1BQU0sTUFBTSxDQUFDO0FBZXpGOzs7O0dBSUc7QUFDSCx3QkFBc0IsbUJBQW1CLENBQ3ZDLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLFVBQVUsRUFBRSxHQUFHLEVBQ2YsSUFBSSxHQUFFO0lBQ0osa0JBQWtCLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDeEIsNEJBQTRCLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JQO0FBRUQsOEJBQThCO0FBQzlCLE1BQU0sTUFBTSxrQkFBa0IsR0FBRyxlQUFlLEdBQUc7SUFDakQsMERBQTBEO0lBQzFELFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsNkRBQTZEO0lBQzdELFlBQVksRUFBRSxPQUFPLENBQUM7Q0FDdkIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCx3QkFBc0Isa0JBQWtCLENBQUMsTUFBTSx5Q0FBa0MsRUFBRSxPQUFPLEVBQUUsS0FBSzs7O0dBNEhoRztBQUVEOzs7R0FHRztBQUNILHdCQUFzQixlQUFlLENBQ25DLE1BQU0sR0FBRSxPQUFPLENBQUMsZUFBZSxDQUFNLEVBQ3JDLElBQUksR0FBRTtJQUFFLFNBQVMsQ0FBQyxFQUFFLGVBQWUsQ0FBQztJQUFDLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDO0lBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFBO0NBQU8sRUFDekcsT0FBTyxHQUFFO0lBQUUsbUJBQW1CLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFBO0NBQU8sNkJBVzdEIn0=
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtbmV0d29yay5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvY2FsLW5ldHdvcmsvbG9jYWwtbmV0d29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBb0IsTUFBTSwyQkFBMkIsQ0FBQztBQVN2RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBb0IsTUFBTSx5QkFBeUIsQ0FBQztBQUt6RSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxFQUNMLEtBQUssZUFBZSxFQUdyQixNQUFNLHlCQUF5QixDQUFDO0FBS2pDLE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBMkQsTUFBTSxNQUFNLENBQUM7QUFnQnpGOzs7O0dBSUc7QUFDSCx3QkFBc0IsbUJBQW1CLENBQ3ZDLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLFVBQVUsRUFBRSxHQUFHLEVBQ2YsSUFBSSxHQUFFO0lBQ0osa0JBQWtCLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDeEIsNEJBQTRCLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JQO0FBRUQsOEJBQThCO0FBQzlCLE1BQU0sTUFBTSxrQkFBa0IsR0FBRyxlQUFlLEdBQUc7SUFDakQsMERBQTBEO0lBQzFELFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsNkRBQTZEO0lBQzdELFlBQVksRUFBRSxPQUFPLENBQUM7Q0FDdkIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCx3QkFBc0Isa0JBQWtCLENBQUMsTUFBTSx5Q0FBa0MsRUFBRSxPQUFPLEVBQUUsS0FBSzs7O0dBd0poRztBQUVEOzs7R0FHRztBQUNILHdCQUFzQixlQUFlLENBQ25DLE1BQU0sR0FBRSxPQUFPLENBQUMsZUFBZSxDQUFNLEVBQ3JDLElBQUksR0FBRTtJQUNKLFNBQVMsQ0FBQyxFQUFFLGVBQWUsQ0FBQztJQUM1QixVQUFVLENBQUMsRUFBRSxtQkFBbUIsQ0FBQztJQUNqQyxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDNUIsWUFBWSxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7Q0FDNUIsRUFDTixPQUFPLEdBQUU7SUFBRSxtQkFBbUIsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUE7Q0FBTyw2QkFlN0QifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"local-network.d.ts","sourceRoot":"","sources":["../../src/local-network/local-network.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAE5C,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,2BAA2B,CAAC;AASvF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAoB,MAAM,yBAAyB,CAAC;AAGzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EAAE,KAAK,GAAG,EAA2D,MAAM,MAAM,CAAC;AAezF;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,GAAG,EACf,IAAI,GAAE;IACJ,kBAAkB,CAAC,EAAE,EAAE,CAAC;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAC;CAClC;;;;;;;;;;;;;;;;;;;;;;;GAoBP;AAED,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,yCAAkC,EAAE,OAAO,EAAE,KAAK;;;GA4HhG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,EACrC,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,eAAe,CAAC;IAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAO,EACzG,OAAO,GAAE;IAAE,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAAO,6BAW7D"}
1
+ {"version":3,"file":"local-network.d.ts","sourceRoot":"","sources":["../../src/local-network/local-network.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAE5C,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,2BAA2B,CAAC;AASvF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAoB,MAAM,yBAAyB,CAAC;AAKzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EAAE,KAAK,GAAG,EAA2D,MAAM,MAAM,CAAC;AAgBzF;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,GAAG,EACf,IAAI,GAAE;IACJ,kBAAkB,CAAC,EAAE,EAAE,CAAC;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAC;CAClC;;;;;;;;;;;;;;;;;;;;;;;GAoBP;AAED,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,yCAAkC,EAAE,OAAO,EAAE,KAAK;;;GAwJhG;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,EACrC,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAC5B,EACN,OAAO,GAAE;IAAE,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAAO,6BAe7D"}
@@ -17,6 +17,8 @@ import { EthAddress } from '@aztec/foundation/eth-address';
17
17
  import { TestDateProvider } from '@aztec/foundation/timer';
18
18
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
19
19
  import { protocolContractsHash } from '@aztec/protocol-contracts';
20
+ import { SequencerState } from '@aztec/sequencer-client';
21
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
20
22
  import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
21
23
  import { EmbeddedWallet } from '@aztec/wallets/embedded';
22
24
  import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
@@ -28,6 +30,7 @@ import { createAccountLogs } from '../cli/util.js';
28
30
  import { DefaultMnemonic } from '../mnemonic.js';
29
31
  import { AnvilTestWatcher } from '../testing/anvil_test_watcher.js';
30
32
  import { EpochTestSettler } from '../testing/epoch_test_settler.js';
33
+ import { getTokenAllowedSetupFunctions } from '../testing/token_allowed_setup.js';
31
34
  import { getBananaFPCAddress, setupBananaFPC } from './banana_fpc.js';
32
35
  import { getSponsoredFPCAddress } from './sponsored_fpc.js';
33
36
  const logger = createLogger('local-network');
@@ -66,14 +69,21 @@ const localAnvil = foundry;
66
69
  if ((config.l1RpcUrls?.length || 0) > 1) {
67
70
  logger.warn(`Multiple L1 RPC URLs provided. Local networks will only use the first one: ${l1RpcUrl}`);
68
71
  }
72
+ // The local network deploys a banana FPC with Token contracts, so include Token entries
73
+ // in the setup allowlist so FPC-based fee payments work out of the box.
74
+ const tokenAllowList = await getTokenAllowedSetupFunctions();
69
75
  const aztecNodeConfig = {
70
76
  ...getConfigEnvVars(),
71
- ...config
77
+ ...config,
78
+ txPublicSetupAllowListExtend: [
79
+ ...tokenAllowList,
80
+ ...config.txPublicSetupAllowListExtend ?? []
81
+ ]
72
82
  };
73
83
  const hdAccount = mnemonicToAccount(config.l1Mnemonic || DefaultMnemonic);
74
- if (aztecNodeConfig.publisherPrivateKeys == undefined || !aztecNodeConfig.publisherPrivateKeys.length || aztecNodeConfig.publisherPrivateKeys[0].getValue() === NULL_KEY) {
84
+ if (aztecNodeConfig.sequencerPublisherPrivateKeys == undefined || !aztecNodeConfig.sequencerPublisherPrivateKeys.length || aztecNodeConfig.sequencerPublisherPrivateKeys[0].getValue() === NULL_KEY) {
75
85
  const privKey = hdAccount.getHdKey().privateKey;
76
- aztecNodeConfig.publisherPrivateKeys = [
86
+ aztecNodeConfig.sequencerPublisherPrivateKeys = [
77
87
  new SecretValue(`0x${Buffer.from(privKey).toString('hex')}`)
78
88
  ];
79
89
  }
@@ -97,11 +107,15 @@ const localAnvil = foundry;
97
107
  })();
98
108
  const bananaFPC = await getBananaFPCAddress(initialAccounts);
99
109
  const sponsoredFPC = await getSponsoredFPCAddress();
100
- const fundedAddresses = initialAccounts.length ? [
110
+ const prefundAddresses = (aztecNodeConfig.prefundAddresses ?? []).map((a)=>AztecAddress.fromString(a));
111
+ const fundedAddresses = [
101
112
  ...initialAccounts.map((a)=>a.address),
102
- bananaFPC,
103
- sponsoredFPC
104
- ] : [];
113
+ ...initialAccounts.length ? [
114
+ bananaFPC,
115
+ sponsoredFPC
116
+ ] : [],
117
+ ...prefundAddresses
118
+ ];
105
119
  const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(fundedAddresses);
106
120
  const dateProvider = new TestDateProvider();
107
121
  let cheatcodes;
@@ -141,6 +155,20 @@ const localAnvil = foundry;
141
155
  }, {
142
156
  prefilledPublicData
143
157
  });
158
+ // Now that the node is up, let the watcher check for pending txs so it can skip unfilled slots faster when
159
+ // transactions are waiting in the mempool. Also let it check if the sequencer is actively building, to avoid
160
+ // warping time out from under an in-progress block.
161
+ watcher?.setGetPendingTxCount(()=>node.getPendingTxCount());
162
+ const sequencer = node.getSequencer()?.getSequencer();
163
+ if (sequencer) {
164
+ const idleStates = new Set([
165
+ SequencerState.STOPPED,
166
+ SequencerState.STOPPING,
167
+ SequencerState.IDLE,
168
+ SequencerState.SYNCHRONIZING
169
+ ]);
170
+ watcher?.setIsSequencerBuilding(()=>!idleStates.has(sequencer.getState()));
171
+ }
144
172
  let epochTestSettler;
145
173
  if (!aztecNodeConfig.p2pEnabled) {
146
174
  epochTestSettler = new EpochTestSettler(cheatcodes, rollupAddress, node.getBlockSource(), logger.createChild('epoch-settler'), {
@@ -152,7 +180,8 @@ const localAnvil = foundry;
152
180
  const wallet = await EmbeddedWallet.create(node, {
153
181
  pxeConfig: {
154
182
  proverEnabled: aztecNodeConfig.realProofs
155
- }
183
+ },
184
+ ephemeral: true
156
185
  });
157
186
  userLog('Setting up funded test accounts...');
158
187
  const accountManagers = await deployFundedSchnorrAccounts(wallet, initialAccounts);
@@ -187,6 +216,11 @@ const localAnvil = foundry;
187
216
  ...config.l1Contracts
188
217
  }
189
218
  };
190
- const node = await AztecNodeService.createAndSync(aztecNodeConfig, deps, options);
219
+ const node = await AztecNodeService.createAndSync(aztecNodeConfig, {
220
+ ...deps,
221
+ proverNodeDeps: {
222
+ broker: deps.proverBroker
223
+ }
224
+ }, options);
191
225
  return node;
192
226
  }
@@ -21,14 +21,22 @@ export declare class AnvilTestWatcher {
21
21
  private markingAsProvenRunningPromise?;
22
22
  private logger;
23
23
  private isMarkingAsProven;
24
+ private getPendingTxCount?;
25
+ private isSequencerBuilding?;
26
+ private unfilledSlotFirstSeen?;
24
27
  constructor(cheatcodes: EthCheatCodes, rollupAddress: EthAddress, l1Client: ViemClient, dateProvider?: TestDateProvider | undefined);
25
28
  setIsMarkingAsProven(isMarkingAsProven: boolean): void;
26
29
  setisLocalNetwork(isLocalNetwork: boolean): void;
30
+ /** Sets a callback to check for pending txs, used to skip unfilled slots faster when txs are waiting. */
31
+ setGetPendingTxCount(fn: () => Promise<number>): void;
32
+ /** Sets a callback to check if the sequencer is actively building, to avoid warping while it works. */
33
+ setIsSequencerBuilding(fn: () => boolean): void;
27
34
  start(): Promise<void>;
28
35
  stop(): Promise<void>;
29
36
  trigger(): Promise<void>;
30
37
  markAsProven(): Promise<void>;
31
38
  syncDateProviderToL1IfBehind(): Promise<void>;
32
39
  warpTimeIfNeeded(): Promise<void>;
40
+ private warpToTimestamp;
33
41
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW52aWxfdGVzdF93YXRjaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9hbnZpbF90ZXN0X3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdoRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBS2hFOzs7Ozs7R0FNRztBQUNILHFCQUFhLGdCQUFnQjtJQWdCekIsT0FBTyxDQUFDLFVBQVU7SUFHbEIsT0FBTyxDQUFDLFlBQVksQ0FBQztJQWxCdkIsT0FBTyxDQUFDLGNBQWMsQ0FBa0I7SUFFeEMsT0FBTyxDQUFDLE1BQU0sQ0FBc0Q7SUFDcEUsT0FBTyxDQUFDLGdCQUFnQixDQUFtQjtJQUMzQyxPQUFPLENBQUMsY0FBYyxDQUFVO0lBRWhDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFpQjtJQUM5QyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBaUI7SUFDakQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQWlCO0lBRXZELE9BQU8sQ0FBQyxNQUFNLENBQWlEO0lBRS9ELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBUTtJQUVqQyxZQUNVLFVBQVUsRUFBRSxhQUFhLEVBQ2pDLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLFFBQVEsRUFBRSxVQUFVLEVBQ1osWUFBWSxDQUFDLDhCQUFrQixFQWF4QztJQUVELG9CQUFvQixDQUFDLGlCQUFpQixFQUFFLE9BQU8sUUFHOUM7SUFFRCxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsT0FBTyxRQUV4QztJQUVLLEtBQUssa0JBeUJWO0lBRUssSUFBSSxrQkFJVDtJQUVLLE9BQU8sa0JBSVo7SUFFSyxZQUFZLGtCQUtqQjtJQUVLLDRCQUE0QixrQkFlakM7SUFFSyxnQkFBZ0Isa0JBd0NyQjtDQUNGIn0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW52aWxfdGVzdF93YXRjaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9hbnZpbF90ZXN0X3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdoRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBS2hFOzs7Ozs7R0FNRztBQUNILHFCQUFhLGdCQUFnQjtJQXlCekIsT0FBTyxDQUFDLFVBQVU7SUFHbEIsT0FBTyxDQUFDLFlBQVksQ0FBQztJQTNCdkIsT0FBTyxDQUFDLGNBQWMsQ0FBa0I7SUFFeEMsT0FBTyxDQUFDLE1BQU0sQ0FBc0Q7SUFDcEUsT0FBTyxDQUFDLGdCQUFnQixDQUFtQjtJQUMzQyxPQUFPLENBQUMsY0FBYyxDQUFVO0lBRWhDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFpQjtJQUM5QyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBaUI7SUFDakQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQWlCO0lBRXZELE9BQU8sQ0FBQyxNQUFNLENBQWlEO0lBRS9ELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBUTtJQUdqQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBd0I7SUFHbEQsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQWdCO0lBRzVDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFxQztJQUVuRSxZQUNVLFVBQVUsRUFBRSxhQUFhLEVBQ2pDLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLFFBQVEsRUFBRSxVQUFVLEVBQ1osWUFBWSxDQUFDLDhCQUFrQixFQWF4QztJQUVELG9CQUFvQixDQUFDLGlCQUFpQixFQUFFLE9BQU8sUUFHOUM7SUFFRCxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsT0FBTyxRQUV4QztJQUVELHlHQUF5RztJQUN6RyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBRTdDO0lBRUQsdUdBQXVHO0lBQ3ZHLHNCQUFzQixDQUFDLEVBQUUsRUFBRSxNQUFNLE9BQU8sUUFFdkM7SUFFSyxLQUFLLGtCQXlCVjtJQUVLLElBQUksa0JBSVQ7SUFFSyxPQUFPLGtCQUlaO0lBRUssWUFBWSxrQkFLakI7SUFFSyw0QkFBNEIsa0JBc0JqQztJQUVLLGdCQUFnQixrQkE0RHJCO1lBTWEsZUFBZTtDQWdCOUIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"anvil_test_watcher.d.ts","sourceRoot":"","sources":["../../src/testing/anvil_test_watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAgBzB,OAAO,CAAC,UAAU;IAGlB,OAAO,CAAC,YAAY,CAAC;IAlBvB,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO,CAAC,MAAM,CAAsD;IACpE,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAU;IAEhC,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAC9C,OAAO,CAAC,uBAAuB,CAAC,CAAiB;IACjD,OAAO,CAAC,6BAA6B,CAAC,CAAiB;IAEvD,OAAO,CAAC,MAAM,CAAiD;IAE/D,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,YACU,UAAU,EAAE,aAAa,EACjC,aAAa,EAAE,UAAU,EACzB,QAAQ,EAAE,UAAU,EACZ,YAAY,CAAC,8BAAkB,EAaxC;IAED,oBAAoB,CAAC,iBAAiB,EAAE,OAAO,QAG9C;IAED,iBAAiB,CAAC,cAAc,EAAE,OAAO,QAExC;IAEK,KAAK,kBAyBV;IAEK,IAAI,kBAIT;IAEK,OAAO,kBAIZ;IAEK,YAAY,kBAKjB;IAEK,4BAA4B,kBAejC;IAEK,gBAAgB,kBAwCrB;CACF"}
1
+ {"version":3,"file":"anvil_test_watcher.d.ts","sourceRoot":"","sources":["../../src/testing/anvil_test_watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAyBzB,OAAO,CAAC,UAAU;IAGlB,OAAO,CAAC,YAAY,CAAC;IA3BvB,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO,CAAC,MAAM,CAAsD;IACpE,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAU;IAEhC,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAC9C,OAAO,CAAC,uBAAuB,CAAC,CAAiB;IACjD,OAAO,CAAC,6BAA6B,CAAC,CAAiB;IAEvD,OAAO,CAAC,MAAM,CAAiD;IAE/D,OAAO,CAAC,iBAAiB,CAAQ;IAGjC,OAAO,CAAC,iBAAiB,CAAC,CAAwB;IAGlD,OAAO,CAAC,mBAAmB,CAAC,CAAgB;IAG5C,OAAO,CAAC,qBAAqB,CAAC,CAAqC;IAEnE,YACU,UAAU,EAAE,aAAa,EACjC,aAAa,EAAE,UAAU,EACzB,QAAQ,EAAE,UAAU,EACZ,YAAY,CAAC,8BAAkB,EAaxC;IAED,oBAAoB,CAAC,iBAAiB,EAAE,OAAO,QAG9C;IAED,iBAAiB,CAAC,cAAc,EAAE,OAAO,QAExC;IAED,yGAAyG;IACzG,oBAAoB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,QAE7C;IAED,uGAAuG;IACvG,sBAAsB,CAAC,EAAE,EAAE,MAAM,OAAO,QAEvC;IAEK,KAAK,kBAyBV;IAEK,IAAI,kBAIT;IAEK,OAAO,kBAIZ;IAEK,YAAY,kBAKjB;IAEK,4BAA4B,kBAsBjC;IAEK,gBAAgB,kBA4DrB;YAMa,eAAe;CAgB9B"}
@@ -22,6 +22,12 @@ import { getAddress, getContract } from 'viem';
22
22
  markingAsProvenRunningPromise;
23
23
  logger;
24
24
  isMarkingAsProven;
25
+ // Optional callback to check if there are pending txs in the mempool.
26
+ getPendingTxCount;
27
+ // Optional callback to check if the sequencer is actively building a block.
28
+ isSequencerBuilding;
29
+ // Tracks when we first observed the current unfilled slot with pending txs (real wall time).
30
+ unfilledSlotFirstSeen;
25
31
  constructor(cheatcodes, rollupAddress, l1Client, dateProvider){
26
32
  this.cheatcodes = cheatcodes;
27
33
  this.dateProvider = dateProvider;
@@ -45,6 +51,12 @@ import { getAddress, getContract } from 'viem';
45
51
  setisLocalNetwork(isLocalNetwork) {
46
52
  this.isLocalNetwork = isLocalNetwork;
47
53
  }
54
+ /** Sets a callback to check for pending txs, used to skip unfilled slots faster when txs are waiting. */ setGetPendingTxCount(fn) {
55
+ this.getPendingTxCount = fn;
56
+ }
57
+ /** Sets a callback to check if the sequencer is actively building, to avoid warping while it works. */ setIsSequencerBuilding(fn) {
58
+ this.isSequencerBuilding = fn;
59
+ }
48
60
  async start() {
49
61
  if (this.filledRunningPromise) {
50
62
  throw new Error('Watcher already watching for filled slot');
@@ -89,14 +101,25 @@ import { getAddress, getContract } from 'viem';
89
101
  if (!this.dateProvider) {
90
102
  return;
91
103
  }
92
- const l1Time = await this.cheatcodes.timestamp() * 1000;
104
+ const l1Time = await this.cheatcodes.lastBlockTimestamp() * 1000;
93
105
  const wallTime = this.dateProvider.now();
94
106
  if (l1Time > wallTime) {
95
107
  this.logger.warn(`L1 is ahead of wall time. Syncing wall time to L1 time`);
96
108
  this.dateProvider.setTime(l1Time);
97
109
  } else if (l1Time + Number(this.l2SlotDuration) * 1000 < wallTime) {
98
- this.logger.warn(`L1 is more than 1 L2 slot behind wall time. Warping to wall time`);
99
- await this.cheatcodes.warp(Math.ceil(wallTime / 1000));
110
+ // Warp L1 to the slot boundary at-or-before wall time. Rounding to a slot boundary (rather than
111
+ // `ceil(wallTime / 1000)`) keeps this loop's target aligned with `warpTimeIfNeeded`'s
112
+ // `nextSlotTimestamp` target, avoiding a race where the two loops pick timestamps a fraction of
113
+ // a second apart and one of them is then rejected by anvil as non-monotonic.
114
+ const wallSec = Math.floor(wallTime / 1000);
115
+ const targetSlot = await this.rollup.read.getSlotAt([
116
+ BigInt(wallSec)
117
+ ]);
118
+ const targetTimestamp = Number(await this.rollup.read.getTimestampForSlot([
119
+ targetSlot
120
+ ]));
121
+ this.logger.warn(`L1 is more than 1 L2 slot behind wall time. Warping to slot ${targetSlot} boundary`);
122
+ await this.warpToTimestamp(targetTimestamp);
100
123
  }
101
124
  }
102
125
  async warpTimeIfNeeded() {
@@ -111,34 +134,74 @@ import { getAddress, getContract } from 'viem';
111
134
  BigInt(nextSlot)
112
135
  ]));
113
136
  if (BigInt(currentSlot) === checkpointLog.slotNumber) {
114
- // We should jump to the next slot
115
- try {
116
- await this.cheatcodes.warp(nextSlotTimestamp, {
117
- resetBlockInterval: true
118
- });
119
- } catch (e) {
120
- this.logger.error(`Failed to warp to timestamp ${nextSlotTimestamp}: ${e}`);
137
+ // The current slot has been filled, we should jump to the next slot.
138
+ if (await this.warpToTimestamp(nextSlotTimestamp)) {
139
+ this.logger.info(`Slot ${currentSlot} was filled, jumped to next slot`);
121
140
  }
122
- this.logger.info(`Slot ${currentSlot} was filled, jumped to next slot`);
123
141
  return;
124
142
  }
125
143
  // If we are not in local network, we don't need to warp time
126
144
  if (!this.isLocalNetwork) {
127
145
  return;
128
146
  }
147
+ // If there are pending txs and the sequencer missed them, warp quickly (after a 2s real-time debounce) so the
148
+ // sequencer can retry in the next slot. Without this, we'd have to wait a full real-time slot duration (~36s) for
149
+ // the dateProvider to catch up to the next slot timestamp. We skip the warp if the sequencer is actively building
150
+ // to avoid invalidating its in-progress work.
151
+ if (this.getPendingTxCount) {
152
+ const pendingTxs = await this.getPendingTxCount();
153
+ if (pendingTxs > 0) {
154
+ if (this.isSequencerBuilding?.()) {
155
+ this.unfilledSlotFirstSeen = undefined;
156
+ return;
157
+ }
158
+ const realNow = Date.now();
159
+ if (!this.unfilledSlotFirstSeen || this.unfilledSlotFirstSeen.slot !== currentSlot) {
160
+ this.unfilledSlotFirstSeen = {
161
+ slot: currentSlot,
162
+ realTime: realNow
163
+ };
164
+ return;
165
+ }
166
+ if (realNow - this.unfilledSlotFirstSeen.realTime > 2000) {
167
+ if (await this.warpToTimestamp(nextSlotTimestamp)) {
168
+ this.logger.info(`Slot ${currentSlot} was missed with pending txs, jumped to next slot`);
169
+ }
170
+ this.unfilledSlotFirstSeen = undefined;
171
+ }
172
+ return;
173
+ }
174
+ }
175
+ // Fallback: warp when the dateProvider time has passed the next slot timestamp.
129
176
  const currentTimestamp = this.dateProvider?.now() ?? Date.now();
130
177
  if (currentTimestamp > nextSlotTimestamp * 1000) {
131
- try {
132
- await this.cheatcodes.warp(nextSlotTimestamp, {
133
- resetBlockInterval: true
134
- });
135
- } catch (e) {
136
- this.logger.error(`Failed to warp to timestamp ${nextSlotTimestamp}: ${e}`);
178
+ if (await this.warpToTimestamp(nextSlotTimestamp)) {
179
+ this.logger.info(`Slot ${currentSlot} was missed, jumped to next slot`);
137
180
  }
138
- this.logger.info(`Slot ${currentSlot} was missed, jumped to next slot`);
139
181
  }
140
182
  } catch {
141
183
  this.logger.error('mineIfSlotFilled failed');
142
184
  }
143
185
  }
186
+ /**
187
+ * Warps L1 to `timestamp`, unless L1 is already at or past it. Returns true when a warp actually
188
+ * happened, false when skipped or on error. Callers use the return value to gate success logs.
189
+ */ async warpToTimestamp(timestamp) {
190
+ try {
191
+ // Anvil rejects evm_setNextBlockTimestamp values <= the current block's timestamp. The two
192
+ // watcher loops can race and pick targets a fraction of a second apart; skip here rather than
193
+ // letting the second one error out noisily.
194
+ const lastTimestamp = await this.cheatcodes.lastBlockTimestamp();
195
+ if (timestamp <= lastTimestamp) {
196
+ return false;
197
+ }
198
+ await this.cheatcodes.warp(timestamp, {
199
+ resetBlockInterval: true
200
+ });
201
+ return true;
202
+ } catch (e) {
203
+ this.logger.error(`Failed to warp to timestamp ${timestamp}: ${e}`);
204
+ return false;
205
+ }
206
+ }
144
207
  }