@aztec-labs/node-lib 6.0.0-nightly.20260829

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 (50) hide show
  1. package/README.md +3 -0
  2. package/dest/actions/build-snapshot-metadata.d.ts +5 -0
  3. package/dest/actions/build-snapshot-metadata.d.ts.map +1 -0
  4. package/dest/actions/build-snapshot-metadata.js +19 -0
  5. package/dest/actions/create-backups.d.ts +6 -0
  6. package/dest/actions/create-backups.d.ts.map +1 -0
  7. package/dest/actions/create-backups.js +32 -0
  8. package/dest/actions/index.d.ts +5 -0
  9. package/dest/actions/index.d.ts.map +1 -0
  10. package/dest/actions/index.js +4 -0
  11. package/dest/actions/snapshot-sync.d.ts +29 -0
  12. package/dest/actions/snapshot-sync.d.ts.map +1 -0
  13. package/dest/actions/snapshot-sync.js +238 -0
  14. package/dest/actions/upload-snapshot.d.ts +12 -0
  15. package/dest/actions/upload-snapshot.d.ts.map +1 -0
  16. package/dest/actions/upload-snapshot.js +38 -0
  17. package/dest/config/index.d.ts +23 -0
  18. package/dest/config/index.d.ts.map +1 -0
  19. package/dest/config/index.js +53 -0
  20. package/dest/factories/index.d.ts +2 -0
  21. package/dest/factories/index.d.ts.map +1 -0
  22. package/dest/factories/index.js +1 -0
  23. package/dest/factories/l1_tx_utils.d.ts +66 -0
  24. package/dest/factories/l1_tx_utils.d.ts.map +1 -0
  25. package/dest/factories/l1_tx_utils.js +94 -0
  26. package/dest/metrics/index.d.ts +2 -0
  27. package/dest/metrics/index.d.ts.map +1 -0
  28. package/dest/metrics/index.js +1 -0
  29. package/dest/metrics/l1_tx_metrics.d.ts +29 -0
  30. package/dest/metrics/l1_tx_metrics.d.ts.map +1 -0
  31. package/dest/metrics/l1_tx_metrics.js +111 -0
  32. package/dest/stores/index.d.ts +2 -0
  33. package/dest/stores/index.d.ts.map +1 -0
  34. package/dest/stores/index.js +1 -0
  35. package/dest/stores/l1_tx_store.d.ts +89 -0
  36. package/dest/stores/l1_tx_store.d.ts.map +1 -0
  37. package/dest/stores/l1_tx_store.js +276 -0
  38. package/package.json +102 -0
  39. package/src/actions/build-snapshot-metadata.ts +29 -0
  40. package/src/actions/create-backups.ts +40 -0
  41. package/src/actions/index.ts +4 -0
  42. package/src/actions/snapshot-sync.ts +290 -0
  43. package/src/actions/upload-snapshot.ts +49 -0
  44. package/src/config/index.ts +86 -0
  45. package/src/factories/index.ts +1 -0
  46. package/src/factories/l1_tx_utils.ts +156 -0
  47. package/src/metrics/index.ts +1 -0
  48. package/src/metrics/l1_tx_metrics.ts +140 -0
  49. package/src/stores/index.ts +1 -0
  50. package/src/stores/l1_tx_store.ts +410 -0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Node Lib
2
+
3
+ Shared code for Aztec Nodes and Prover Nodes.
@@ -0,0 +1,5 @@
1
+ import type { Archiver } from '@aztec-labs/archiver';
2
+ import type { UploadSnapshotMetadata } from '@aztec-labs/stdlib/snapshots';
3
+ import type { UploadSnapshotConfig } from './upload-snapshot.js';
4
+ export declare function buildSnapshotMetadata(archiver: Archiver, config: UploadSnapshotConfig): Promise<UploadSnapshotMetadata>;
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc25hcHNob3QtbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL2J1aWxkLXNuYXBzaG90LW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0UsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRSx3QkFBc0IscUJBQXFCLENBQ3pDLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLE1BQU0sRUFBRSxvQkFBb0IsR0FDM0IsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBb0JqQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-snapshot-metadata.d.ts","sourceRoot":"","sources":["../../src/actions/build-snapshot-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CAoBjC"}
@@ -0,0 +1,19 @@
1
+ export async function buildSnapshotMetadata(archiver, config) {
2
+ const [rollupAddress, l1BlockNumber, tips] = await Promise.all([
3
+ archiver.getRollupAddress(),
4
+ archiver.getL1BlockNumber(),
5
+ archiver.getL2Tips()
6
+ ]);
7
+ const { number: l2BlockNumber, hash: l2BlockHash } = tips.proposed;
8
+ if (!l2BlockHash) {
9
+ throw new Error(`Failed to get L2 block hash from archiver.`);
10
+ }
11
+ return {
12
+ l1ChainId: config.l1ChainId,
13
+ rollupVersion: config.rollupVersion,
14
+ rollupAddress,
15
+ l2BlockNumber,
16
+ l2BlockHash,
17
+ l1BlockNumber: Number(l1BlockNumber)
18
+ };
19
+ }
@@ -0,0 +1,6 @@
1
+ import type { Archiver } from '@aztec-labs/archiver';
2
+ import type { Logger } from '@aztec-labs/foundation/log';
3
+ import type { WorldStateSynchronizer } from '@aztec-labs/stdlib/interfaces/server';
4
+ import type { SnapshotDataUrls } from '@aztec-labs/stdlib/snapshots';
5
+ export declare function createBackups(backupDir: string, archiver: Archiver, worldState: WorldStateSynchronizer, log: Logger): Promise<SnapshotDataUrls>;
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhY2t1cHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL2NyZWF0ZS1iYWNrdXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkYsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUlyRSx3QkFBc0IsYUFBYSxDQUNqQyxTQUFTLEVBQUUsTUFBTSxFQUNqQixRQUFRLEVBQUUsUUFBUSxFQUNsQixVQUFVLEVBQUUsc0JBQXNCLEVBQ2xDLEdBQUcsRUFBRSxNQUFNLDZCQTRCWiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-backups.d.ts","sourceRoot":"","sources":["../../src/actions/create-backups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIrE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,sBAAsB,EAClC,GAAG,EAAE,MAAM,6BA4BZ"}
@@ -0,0 +1,32 @@
1
+ import { existsSync } from 'fs';
2
+ import { join } from 'path/posix';
3
+ export async function createBackups(backupDir, archiver, worldState, log) {
4
+ try {
5
+ log.info(`Pausing archiver and world state sync to start snapshot upload`);
6
+ await archiver.stop();
7
+ await worldState.stopSync();
8
+ log.info(`Creating backups of lmdb environments to ${backupDir}`);
9
+ const [archiverPath, worldStatePaths] = await Promise.all([
10
+ archiver.backupTo(join(backupDir, 'archiver')),
11
+ worldState.backupTo(join(backupDir, 'world-state'))
12
+ ]);
13
+ const paths = {
14
+ ...worldStatePaths,
15
+ archiver: archiverPath
16
+ };
17
+ const missing = Object.entries(paths).filter(([_key, path])=>!path || !existsSync(path));
18
+ if (missing.length > 0) {
19
+ throw new Error(`Missing backup files: ${missing.map(([key, path])=>`${path} (${key})`).join(', ')}`);
20
+ }
21
+ log.info(`Data stores backed up to ${backupDir}`, {
22
+ paths
23
+ });
24
+ return paths;
25
+ } catch (err) {
26
+ throw new Error(`Error creating backups for snapshot upload: ${err}`);
27
+ } finally{
28
+ log.info(`Resuming archiver and world state sync`);
29
+ worldState.resumeSync();
30
+ archiver.resume();
31
+ }
32
+ }
@@ -0,0 +1,5 @@
1
+ export * from './snapshot-sync.js';
2
+ export * from './upload-snapshot.js';
3
+ export * from './create-backups.js';
4
+ export * from './build-snapshot-metadata.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsOEJBQThCLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './snapshot-sync.js';
2
+ export * from './upload-snapshot.js';
3
+ export * from './create-backups.js';
4
+ export * from './build-snapshot-metadata.js';
@@ -0,0 +1,29 @@
1
+ import { type ArchiverConfig } from '@aztec-labs/archiver';
2
+ import { type EthereumClientConfig } from '@aztec-labs/ethereum/client';
3
+ import type { L1ContractsConfig } from '@aztec-labs/ethereum/config';
4
+ import type { EthAddress } from '@aztec-labs/foundation/eth-address';
5
+ import type { Logger } from '@aztec-labs/foundation/log';
6
+ import type { ChainConfig } from '@aztec-labs/stdlib/config';
7
+ import { type ReadOnlyFileStore } from '@aztec-labs/stdlib/file-store';
8
+ import type { DataStoreConfig } from '@aztec-labs/stdlib/kv-store';
9
+ import { type SnapshotMetadata } from '@aztec-labs/stdlib/snapshots';
10
+ import type { SharedNodeConfig } from '../config/index.js';
11
+ type SnapshotSyncConfig = Pick<SharedNodeConfig, 'syncMode'> & Pick<ChainConfig, 'l1ChainId' | 'rollupVersion'> & Pick<L1ContractsConfig, 'aztecEpochDuration'> & Pick<ArchiverConfig, 'archiverStoreMapSizeKb'> & DataStoreConfig & Required<Pick<DataStoreConfig, 'rollupAddress'>> & EthereumClientConfig & {
12
+ snapshotsUrls?: string[];
13
+ minL1BlocksToTriggerReplace?: number;
14
+ };
15
+ /**
16
+ * Connects to a remote snapshot index and downloads the latest snapshot if the local archiver is behind.
17
+ * Behaviour depends on syncing mode.
18
+ */
19
+ export declare function trySnapshotSync(config: SnapshotSyncConfig, log: Logger): Promise<boolean>;
20
+ /**
21
+ * Downloads the given snapshot replacing any local data stores.
22
+ */
23
+ export declare function snapshotSync(snapshot: Pick<SnapshotMetadata, 'dataUrls'>, log: Logger, config: {
24
+ dataDirectory: string;
25
+ rollupAddress: EthAddress;
26
+ fileStore: ReadOnlyFileStore;
27
+ }): Promise<void>;
28
+ export {};
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3Qtc3luYy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvc25hcHNob3Qtc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsS0FBSyxjQUFjLEVBR3BCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLEtBQUssb0JBQW9CLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7QUFDekYsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBMkIsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRyxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsS0FBSyxnQkFBZ0IsRUFLdEIsTUFBTSw4QkFBOEIsQ0FBQztBQUt0QyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSzNELEtBQUssa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxHQUMxRCxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxlQUFlLENBQUMsR0FDaEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLEdBQzdDLElBQUksQ0FBQyxjQUFjLEVBQUUsd0JBQXdCLENBQUMsR0FDOUMsZUFBZSxHQUNmLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDLEdBQ2hELG9CQUFvQixHQUFHO0lBQ3JCLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3pCLDJCQUEyQixDQUFDLEVBQUUsTUFBTSxDQUFDO0NBQ3RDLENBQUM7QUFFSjs7O0dBR0c7QUFDSCx3QkFBc0IsZUFBZSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxvQkF1SzVFO0FBRUQ7O0dBRUc7QUFDSCx3QkFBc0IsWUFBWSxDQUNoQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxFQUM1QyxHQUFHLEVBQUUsTUFBTSxFQUNYLE1BQU0sRUFBRTtJQUFFLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFBQyxhQUFhLEVBQUUsVUFBVSxDQUFDO0lBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFBO0NBQUUsaUJBbUQzRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-sync.d.ts","sourceRoot":"","sources":["../../src/actions/snapshot-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EAGpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,6BAA6B,CAAC;AACzF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,KAAK,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,KAAK,gBAAgB,EAKtB,MAAM,8BAA8B,CAAC;AAKtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAK3D,KAAK,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAC1D,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC,GAChD,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAC7C,IAAI,CAAC,cAAc,EAAE,wBAAwB,CAAC,GAC9C,eAAe,GACf,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,GAChD,oBAAoB,GAAG;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC,CAAC;AAEJ;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,oBAuK5E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAC5C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,iBAmD3F"}
@@ -0,0 +1,238 @@
1
+ import { ARCHIVER_DB_VERSION, ARCHIVER_STORE_NAME, createArchiverStore, getArchiverSynchPoint } from '@aztec-labs/archiver';
2
+ import { INITIAL_L2_BLOCK_NUM } from '@aztec-labs/constants';
3
+ import { getPublicClient } from '@aztec-labs/ethereum/client';
4
+ import { tryRmDir } from '@aztec-labs/foundation/fs';
5
+ import { P2P_STORE_NAME } from '@aztec-labs/p2p';
6
+ import { GENESIS_BLOCK_HEADER_HASH } from '@aztec-labs/stdlib/block';
7
+ import { DatabaseVersionManager } from '@aztec-labs/stdlib/database-version/manager';
8
+ import { createReadOnlyFileStore } from '@aztec-labs/stdlib/file-store';
9
+ import { downloadSnapshot, getLatestSnapshotMetadata, makeSnapshotPaths } from '@aztec-labs/stdlib/snapshots';
10
+ import { NATIVE_WORLD_STATE_DBS, WORLD_STATE_DB_VERSION, WORLD_STATE_DIR } from '@aztec-labs/world-state';
11
+ import { mkdir, mkdtemp, rename } from 'fs/promises';
12
+ import { join } from 'path';
13
+ // Half day worth of L1 blocks
14
+ const MIN_L1_BLOCKS_TO_TRIGGER_REPLACE = 86400 / 2 / 12;
15
+ /**
16
+ * Connects to a remote snapshot index and downloads the latest snapshot if the local archiver is behind.
17
+ * Behaviour depends on syncing mode.
18
+ */ export async function trySnapshotSync(config, log) {
19
+ const { syncMode, snapshotsUrls, dataDirectory, l1ChainId, rollupVersion, rollupAddress } = config;
20
+ if (syncMode === 'full') {
21
+ log.debug('Snapshot sync is disabled. Running full sync.', {
22
+ syncMode: syncMode
23
+ });
24
+ return false;
25
+ }
26
+ if (!snapshotsUrls || snapshotsUrls.length === 0) {
27
+ log.verbose('Snapshot sync is disabled. No snapshots URLs provided.');
28
+ return false;
29
+ }
30
+ if (!dataDirectory) {
31
+ log.verbose('Snapshot sync is disabled. No local data directory defined.');
32
+ return false;
33
+ }
34
+ // Create an archiver store to check the current state (do this only once). This temporary store is only
35
+ // read for its sync point and never serves tagged-log queries, so the genesis block hash it carries is
36
+ // immaterial — pass the protocol constant.
37
+ log.verbose(`Creating temporary archiver data store`);
38
+ const archiverStore = await createArchiverStore(config, GENESIS_BLOCK_HEADER_HASH);
39
+ let archiverL1BlockNumber;
40
+ let archiverL2BlockNumber;
41
+ try {
42
+ [archiverL1BlockNumber, archiverL2BlockNumber] = await Promise.all([
43
+ getArchiverSynchPoint(archiverStore).then((s)=>s.blocksSynchedTo),
44
+ archiverStore.blocks.getLatestL2BlockNumber()
45
+ ]);
46
+ } finally{
47
+ log.verbose(`Closing temporary archiver data store`, {
48
+ archiverL1BlockNumber,
49
+ archiverL2BlockNumber
50
+ });
51
+ await archiverStore.db.close();
52
+ }
53
+ const minL1BlocksToTriggerReplace = config.minL1BlocksToTriggerReplace ?? MIN_L1_BLOCKS_TO_TRIGGER_REPLACE;
54
+ if (syncMode === 'snapshot' && archiverL2BlockNumber !== undefined && archiverL2BlockNumber >= INITIAL_L2_BLOCK_NUM) {
55
+ log.verbose(`Skipping non-forced snapshot sync as archiver is already synced to L2 block ${archiverL2BlockNumber}.`);
56
+ return false;
57
+ }
58
+ const currentL1BlockNumber = await getPublicClient(config).getBlockNumber();
59
+ if (archiverL1BlockNumber && currentL1BlockNumber >= archiverL1BlockNumber && currentL1BlockNumber - archiverL1BlockNumber < minL1BlocksToTriggerReplace) {
60
+ log.verbose(`Skipping snapshot sync as archiver is less than ${currentL1BlockNumber - archiverL1BlockNumber} L1 blocks behind.`, {
61
+ archiverL1BlockNumber,
62
+ currentL1BlockNumber,
63
+ minL1BlocksToTriggerReplace
64
+ });
65
+ return false;
66
+ }
67
+ const indexMetadata = {
68
+ l1ChainId,
69
+ rollupVersion,
70
+ rollupAddress
71
+ };
72
+ const snapshotCandidates = [];
73
+ for (const snapshotsUrl of snapshotsUrls){
74
+ let fileStore;
75
+ try {
76
+ fileStore = await createReadOnlyFileStore(snapshotsUrl, log);
77
+ } catch (err) {
78
+ log.error(`Invalid config for downloading snapshots from ${snapshotsUrl}`, err);
79
+ continue;
80
+ }
81
+ let snapshot;
82
+ try {
83
+ snapshot = await getLatestSnapshotMetadata(indexMetadata, fileStore);
84
+ } catch (err) {
85
+ log.error(`Failed to get latest snapshot metadata from ${snapshotsUrl}. Skipping this URL.`, err, {
86
+ ...indexMetadata,
87
+ snapshotsUrl
88
+ });
89
+ continue;
90
+ }
91
+ if (!snapshot) {
92
+ log.verbose(`No snapshot found at ${snapshotsUrl}. Skipping this URL.`, {
93
+ ...indexMetadata,
94
+ snapshotsUrl
95
+ });
96
+ continue;
97
+ }
98
+ if (snapshot.schemaVersions.archiver !== ARCHIVER_DB_VERSION) {
99
+ log.warn(`Skipping snapshot from ${snapshotsUrl} as it has schema version ${snapshot.schemaVersions.archiver} but expected ${ARCHIVER_DB_VERSION}.`, snapshot);
100
+ continue;
101
+ }
102
+ if (snapshot.schemaVersions.worldState !== WORLD_STATE_DB_VERSION) {
103
+ log.warn(`Skipping snapshot from ${snapshotsUrl} as it has world state schema version ${snapshot.schemaVersions.worldState} but we expected ${WORLD_STATE_DB_VERSION}.`, snapshot);
104
+ continue;
105
+ }
106
+ if (archiverL1BlockNumber && snapshot.l1BlockNumber < archiverL1BlockNumber) {
107
+ log.verbose(`Skipping snapshot from ${snapshotsUrl} since local archiver is at L1 block ${archiverL1BlockNumber} which is further than snapshot at ${snapshot.l1BlockNumber}`, {
108
+ snapshot,
109
+ archiverL1BlockNumber,
110
+ snapshotsUrl
111
+ });
112
+ continue;
113
+ }
114
+ if (archiverL1BlockNumber && snapshot.l1BlockNumber - Number(archiverL1BlockNumber) < minL1BlocksToTriggerReplace) {
115
+ log.verbose(`Skipping snapshot from ${snapshotsUrl} as archiver is less than ${snapshot.l1BlockNumber - Number(archiverL1BlockNumber)} L1 blocks behind this snapshot.`, {
116
+ snapshot,
117
+ archiverL1BlockNumber,
118
+ snapshotsUrl
119
+ });
120
+ continue;
121
+ }
122
+ snapshotCandidates.push({
123
+ snapshot,
124
+ url: snapshotsUrl,
125
+ fileStore
126
+ });
127
+ }
128
+ if (snapshotCandidates.length === 0) {
129
+ log.verbose(`No valid snapshots found from any URL, skipping snapshot sync`, {
130
+ ...indexMetadata,
131
+ snapshotsUrls
132
+ });
133
+ return false;
134
+ }
135
+ // Sort candidates by L1 block number (highest first)
136
+ snapshotCandidates.sort((a, b)=>b.snapshot.l1BlockNumber - a.snapshot.l1BlockNumber);
137
+ // Try each candidate in order until one succeeds
138
+ for (const { snapshot, url, fileStore } of snapshotCandidates){
139
+ const { l1BlockNumber, l2BlockNumber } = snapshot;
140
+ log.info(`Attempting to sync from snapshot at L1 block ${l1BlockNumber} L2 block ${l2BlockNumber}`, {
141
+ snapshot,
142
+ snapshotsUrl: url
143
+ });
144
+ try {
145
+ await snapshotSync(snapshot, log, {
146
+ dataDirectory: config.dataDirectory,
147
+ rollupAddress: config.rollupAddress,
148
+ fileStore
149
+ });
150
+ log.info(`Snapshot synced to L1 block ${l1BlockNumber} L2 block ${l2BlockNumber}`, {
151
+ snapshot,
152
+ snapshotsUrl: url
153
+ });
154
+ return true;
155
+ } catch (err) {
156
+ log.error(`Failed to download snapshot from ${url}, trying next candidate`, err, {
157
+ snapshot,
158
+ snapshotsUrl: url
159
+ });
160
+ continue;
161
+ }
162
+ }
163
+ log.error(`Failed to download snapshot from all URLs`, {
164
+ snapshotsUrls
165
+ });
166
+ return false;
167
+ }
168
+ /**
169
+ * Downloads the given snapshot replacing any local data stores.
170
+ */ export async function snapshotSync(snapshot, log, config) {
171
+ const { dataDirectory, rollupAddress, fileStore } = config;
172
+ if (!dataDirectory) {
173
+ throw new Error(`No local data directory defined. Cannot sync snapshot.`);
174
+ }
175
+ let downloadDir;
176
+ try {
177
+ // Download the snapshot to a temp location.
178
+ await mkdir(dataDirectory, {
179
+ recursive: true
180
+ });
181
+ downloadDir = await mkdtemp(join(dataDirectory, 'download-'));
182
+ const downloadPaths = makeSnapshotPaths(downloadDir);
183
+ log.info(`Downloading snapshot to ${downloadDir}`, {
184
+ snapshot,
185
+ downloadPaths
186
+ });
187
+ await downloadSnapshot(snapshot, downloadPaths, fileStore);
188
+ log.info(`Snapshot downloaded at ${downloadDir}`, {
189
+ snapshot,
190
+ downloadPaths
191
+ });
192
+ // If download was successful, clear lock and version, and move download there
193
+ const archiverPath = join(dataDirectory, ARCHIVER_STORE_NAME);
194
+ await prepareTarget(archiverPath, ARCHIVER_DB_VERSION, rollupAddress);
195
+ await rename(downloadPaths.archiver, join(archiverPath, 'data.mdb'));
196
+ log.info(`Archiver database set up from snapshot`, {
197
+ path: archiverPath,
198
+ dbVersion: ARCHIVER_DB_VERSION,
199
+ rollupAddress
200
+ });
201
+ // Same for the world state dbs, only that we do not close them, since we assume they are not yet in use
202
+ const worldStateBasePath = join(dataDirectory, WORLD_STATE_DIR);
203
+ await prepareTarget(worldStateBasePath, WORLD_STATE_DB_VERSION, rollupAddress);
204
+ for (const [name, dir] of NATIVE_WORLD_STATE_DBS){
205
+ const path = join(worldStateBasePath, dir);
206
+ await mkdir(path, {
207
+ recursive: true
208
+ });
209
+ await rename(downloadPaths[name], join(path, 'data.mdb'));
210
+ log.info(`World state database ${name} set up from snapshot`, {
211
+ path,
212
+ dbVersion: WORLD_STATE_DB_VERSION,
213
+ rollupAddress
214
+ });
215
+ }
216
+ // And clear the p2p db altogether
217
+ const p2pPath = join(dataDirectory, P2P_STORE_NAME);
218
+ await tryRmDir(p2pPath, log);
219
+ log.info(`P2P database cleared`, {
220
+ path: p2pPath
221
+ });
222
+ } finally{
223
+ if (downloadDir) {
224
+ await tryRmDir(downloadDir, log);
225
+ }
226
+ }
227
+ }
228
+ /** Deletes target dir and writes the new version file. */ async function prepareTarget(target, schemaVersion, rollupAddress) {
229
+ const noOpen = ()=>Promise.resolve(undefined);
230
+ const versionManager = new DatabaseVersionManager({
231
+ schemaVersion,
232
+ rollupAddress,
233
+ dataDirectory: target,
234
+ onOpen: noOpen
235
+ });
236
+ await versionManager.resetDataDirectory();
237
+ await versionManager.writeVersion();
238
+ }
@@ -0,0 +1,12 @@
1
+ import { type Archiver } from '@aztec-labs/archiver';
2
+ import type { Logger } from '@aztec-labs/foundation/log';
3
+ import type { ChainConfig } from '@aztec-labs/stdlib/config';
4
+ import type { WorldStateSynchronizer } from '@aztec-labs/stdlib/interfaces/server';
5
+ import type { DataStoreConfig } from '@aztec-labs/stdlib/kv-store';
6
+ export type UploadSnapshotConfig = Pick<ChainConfig, 'l1ChainId' | 'rollupVersion'> & Pick<DataStoreConfig, 'dataDirectory'>;
7
+ /**
8
+ * Pauses the archiver and world state sync, creates backups of the archiver and world state lmdb environments,
9
+ * and uploads them to the specified location. Location must be a URL supported by our file store (eg `gs://bucketname/path`).
10
+ */
11
+ export declare function uploadSnapshot(location: string, archiver: Archiver, worldState: WorldStateSynchronizer, config: UploadSnapshotConfig, log: Logger): Promise<void>;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXNuYXBzaG90LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWN0aW9ucy91cGxvYWQtc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixLQUFLLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTFFLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFVbkUsTUFBTSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLGVBQWUsQ0FBQyxHQUNqRixJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBRXpDOzs7R0FHRztBQUNILHdCQUFzQixjQUFjLENBQ2xDLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLFVBQVUsRUFBRSxzQkFBc0IsRUFDbEMsTUFBTSxFQUFFLG9CQUFvQixFQUM1QixHQUFHLEVBQUUsTUFBTSxpQkFvQloifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-snapshot.d.ts","sourceRoot":"","sources":["../../src/actions/upload-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAUnE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC,GACjF,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAEzC;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,sBAAsB,EAClC,MAAM,EAAE,oBAAoB,EAC5B,GAAG,EAAE,MAAM,iBAoBZ"}
@@ -0,0 +1,38 @@
1
+ import { ARCHIVER_DB_VERSION } from '@aztec-labs/archiver';
2
+ import { tryRmDir } from '@aztec-labs/foundation/fs';
3
+ import { createFileStore } from '@aztec-labs/stdlib/file-store';
4
+ import { uploadSnapshotToIndex } from '@aztec-labs/stdlib/snapshots';
5
+ import { WORLD_STATE_DB_VERSION } from '@aztec-labs/world-state';
6
+ import { mkdtemp } from 'fs/promises';
7
+ import { tmpdir } from 'os';
8
+ import { join } from 'path';
9
+ import { buildSnapshotMetadata } from './build-snapshot-metadata.js';
10
+ import { createBackups } from './create-backups.js';
11
+ /**
12
+ * Pauses the archiver and world state sync, creates backups of the archiver and world state lmdb environments,
13
+ * and uploads them to the specified location. Location must be a URL supported by our file store (eg `gs://bucketname/path`).
14
+ */ export async function uploadSnapshot(location, archiver, worldState, config, log) {
15
+ const store = await createFileStore(location);
16
+ if (!store) {
17
+ throw new Error(`Failed to create file store for snapshot upload for location ${location}.`);
18
+ }
19
+ const backupDir = await mkdtemp(join(config.dataDirectory ?? tmpdir(), 'snapshot-'));
20
+ try {
21
+ const paths = await createBackups(backupDir, archiver, worldState, log);
22
+ const versions = {
23
+ archiver: ARCHIVER_DB_VERSION,
24
+ worldState: WORLD_STATE_DB_VERSION
25
+ };
26
+ const metadata = await buildSnapshotMetadata(archiver, config);
27
+ log.info(`Uploading snapshot to ${location}`, {
28
+ snapshot: metadata
29
+ });
30
+ const snapshot = await uploadSnapshotToIndex(paths, versions, metadata, store);
31
+ log.info(`Snapshot uploaded successfully`, {
32
+ snapshot
33
+ });
34
+ } finally{
35
+ log.info(`Cleaning up backup dir ${backupDir}`);
36
+ await tryRmDir(backupDir, log);
37
+ }
38
+ }
@@ -0,0 +1,23 @@
1
+ import { type ConfigMappingsType } from '@aztec-labs/foundation/config';
2
+ export type SharedNodeConfig = {
3
+ /** Whether to populate the genesis state with initial fee juice for the test accounts */
4
+ testAccounts: boolean;
5
+ /** Whether to populate the genesis state with initial fee juice for the sponsored FPC */
6
+ sponsoredFPC: boolean;
7
+ /** Additional addresses to prefund with fee juice at genesis */
8
+ prefundAddresses: string[];
9
+ /** Sync mode: full to always sync via L1, snapshot to download a snapshot if there is no local data, force-snapshot to download even if there is local data. */
10
+ syncMode: 'full' | 'snapshot' | 'force-snapshot';
11
+ /** Base URLs for snapshots index. Index file will be searched at `SNAPSHOTS_BASE_URL/aztec-L1_CHAIN_ID-VERSION-ROLLUP_ADDRESS/index.json` */
12
+ snapshotsUrls?: string[];
13
+ /** URL of the Web3Signer instance */
14
+ web3SignerUrl?: string;
15
+ /** Whether to run in fisherman mode */
16
+ fishermanMode?: boolean;
17
+ /** Force verification of tx Chonk proofs. Only used for testnet */
18
+ debugForceTxProofVerification: boolean;
19
+ /** Soft-shutdown the node when the canonical rollup is no longer compatible, keeping the health server up for K8s probes */
20
+ enableAutoShutdown: boolean;
21
+ };
22
+ export declare const sharedNodeConfigMappings: ConfigMappingsType<SharedNodeConfig>;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXVCLE1BQU0sK0JBQStCLENBQUM7QUFFN0YsTUFBTSxNQUFNLGdCQUFnQixHQUFHO0lBQzdCLHlGQUF5RjtJQUN6RixZQUFZLEVBQUUsT0FBTyxDQUFDO0lBQ3RCLHlGQUF5RjtJQUN6RixZQUFZLEVBQUUsT0FBTyxDQUFDO0lBQ3RCLGdFQUFnRTtJQUNoRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMzQixnS0FBZ0s7SUFDaEssUUFBUSxFQUFFLE1BQU0sR0FBRyxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7SUFDakQsNklBQTZJO0lBQzdJLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3pCLHFDQUFxQztJQUNyQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDdkIsdUNBQXVDO0lBQ3ZDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUV4QixtRUFBbUU7SUFDbkUsNkJBQTZCLEVBQUUsT0FBTyxDQUFDO0lBRXZDLDRIQUE0SDtJQUM1SCxrQkFBa0IsRUFBRSxPQUFPLENBQUM7Q0FDN0IsQ0FBQztBQUVGLGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0E0RHpFLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAuB,MAAM,+BAA+B,CAAC;AAE7F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gKAAgK;IAChK,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACjD,6IAA6I;IAC7I,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,mEAAmE;IACnE,6BAA6B,EAAE,OAAO,CAAC;IAEvC,4HAA4H;IAC5H,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CA4DzE,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { booleanConfigHelper } from '@aztec-labs/foundation/config';
2
+ export const sharedNodeConfigMappings = {
3
+ testAccounts: {
4
+ env: 'TEST_ACCOUNTS',
5
+ description: 'Whether to populate the genesis state with initial fee juice for the test accounts.',
6
+ ...booleanConfigHelper()
7
+ },
8
+ sponsoredFPC: {
9
+ env: 'SPONSORED_FPC',
10
+ description: 'Whether to populate the genesis state with initial fee juice for the sponsored FPC.',
11
+ ...booleanConfigHelper(false)
12
+ },
13
+ prefundAddresses: {
14
+ env: 'PREFUND_ADDRESSES',
15
+ description: 'Comma-separated list of Aztec addresses to prefund with fee juice at genesis (local network only).',
16
+ parseEnv: (val)=>val.split(',').map((a)=>a.trim()).filter((a)=>a.length > 0),
17
+ defaultValue: []
18
+ },
19
+ syncMode: {
20
+ env: 'SYNC_MODE',
21
+ description: 'Set sync mode to `full` to always sync via L1, `snapshot` to download a snapshot if there is no local data, `force-snapshot` to download even if there is local data.',
22
+ defaultValue: 'snapshot'
23
+ },
24
+ snapshotsUrls: {
25
+ env: 'SYNC_SNAPSHOTS_URLS',
26
+ description: 'Base URLs for snapshots index, comma-separated.',
27
+ parseEnv: (val)=>val.split(',').map((url)=>url.trim()).filter((url)=>url.length > 0),
28
+ fallback: [
29
+ 'SYNC_SNAPSHOTS_URL'
30
+ ],
31
+ defaultValue: []
32
+ },
33
+ web3SignerUrl: {
34
+ env: 'WEB3_SIGNER_URL',
35
+ description: 'URL of the Web3Signer instance',
36
+ parseEnv: (val)=>val.trim()
37
+ },
38
+ fishermanMode: {
39
+ env: 'FISHERMAN_MODE',
40
+ description: 'Whether to run in fisherman mode.',
41
+ ...booleanConfigHelper(false)
42
+ },
43
+ debugForceTxProofVerification: {
44
+ env: 'DEBUG_FORCE_TX_PROOF_VERIFICATION',
45
+ description: 'Whether to force tx proof verification. Only has an effect if real proving is turned off',
46
+ ...booleanConfigHelper(false)
47
+ },
48
+ enableAutoShutdown: {
49
+ env: 'ENABLE_AUTO_SHUTDOWN',
50
+ description: 'Soft-shutdown the node when the canonical rollup is no longer compatible (protocol constants diverge), keeping the health server up so K8s probes keep passing. Only applies to nodes following the canonical rollup.',
51
+ ...booleanConfigHelper(false)
52
+ }
53
+ };
@@ -0,0 +1,2 @@
1
+ export * from './l1_tx_utils.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYWN0b3JpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factories/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './l1_tx_utils.js';
@@ -0,0 +1,66 @@
1
+ import type { BlobKzgInstance } from '@aztec-labs/blob-lib/types';
2
+ import type { EthSigner } from '@aztec-labs/ethereum/eth-signer';
3
+ import type { L1TxUtilsConfig } from '@aztec-labs/ethereum/l1-tx-utils';
4
+ import type { ExtendedViemWalletClient, ViemClient } from '@aztec-labs/ethereum/types';
5
+ import type { EthAddress } from '@aztec-labs/foundation/eth-address';
6
+ import { createLogger } from '@aztec-labs/foundation/log';
7
+ import type { DateProvider } from '@aztec-labs/foundation/timer';
8
+ import type { DataStoreConfig } from '@aztec-labs/stdlib/kv-store';
9
+ import type { TelemetryClient } from '@aztec-labs/telemetry-client';
10
+ import type { L1TxScope } from '../metrics/l1_tx_metrics.js';
11
+ /**
12
+ * Creates L1TxUtils from multiple Viem wallet clients, sharing store, metrics, and delayer.
13
+ * When kzg is provided in deps, blob support is enabled.
14
+ */
15
+ export declare function createL1TxUtilsFromWallets(clients: ExtendedViemWalletClient[], config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
16
+ debugMaxGasLimit?: boolean;
17
+ scope?: L1TxScope;
18
+ }, deps: {
19
+ telemetry: TelemetryClient;
20
+ logger?: ReturnType<typeof createLogger>;
21
+ dateProvider: DateProvider;
22
+ kzg?: BlobKzgInstance;
23
+ }): Promise<import("@aztec-labs/ethereum/l1-tx-utils").L1TxUtils[]>;
24
+ /**
25
+ * Creates L1TxUtils from multiple EthSigners, sharing store, metrics, and delayer.
26
+ * When kzg is provided in deps, blob support is enabled.
27
+ * Deduplicates signers by address to avoid creating multiple instances for the same publisher.
28
+ */
29
+ export declare function createL1TxUtilsFromSigners(client: ViemClient, signers: EthSigner[], config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
30
+ debugMaxGasLimit?: boolean;
31
+ scope?: L1TxScope;
32
+ }, deps: {
33
+ telemetry: TelemetryClient;
34
+ logger?: ReturnType<typeof createLogger>;
35
+ dateProvider: DateProvider;
36
+ kzg?: BlobKzgInstance;
37
+ }): Promise<import("@aztec-labs/ethereum/l1-tx-utils").L1TxUtils[]>;
38
+ /**
39
+ * Creates ForwarderL1TxUtils from multiple Viem wallet clients, sharing store, metrics, and delayer.
40
+ * Wraps all transactions through a forwarder contract for testing purposes.
41
+ * When kzg is provided in deps, blob support is enabled.
42
+ */
43
+ export declare function createForwarderL1TxUtilsFromWallets(clients: ExtendedViemWalletClient[], forwarderAddress: EthAddress, config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
44
+ debugMaxGasLimit?: boolean;
45
+ scope?: L1TxScope;
46
+ }, deps: {
47
+ telemetry: TelemetryClient;
48
+ logger?: ReturnType<typeof createLogger>;
49
+ dateProvider: DateProvider;
50
+ kzg?: BlobKzgInstance;
51
+ }): Promise<import("@aztec-labs/ethereum/l1-tx-utils-with-blobs").ForwarderL1TxUtils[]>;
52
+ /**
53
+ * Creates ForwarderL1TxUtils from multiple EthSigners, sharing store, metrics, and delayer.
54
+ * Wraps all transactions through a forwarder contract for testing purposes.
55
+ * When kzg is provided in deps, blob support is enabled.
56
+ */
57
+ export declare function createForwarderL1TxUtilsFromSigners(client: ViemClient, signers: EthSigner[], forwarderAddress: EthAddress, config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
58
+ debugMaxGasLimit?: boolean;
59
+ scope?: L1TxScope;
60
+ }, deps: {
61
+ telemetry: TelemetryClient;
62
+ logger?: ReturnType<typeof createLogger>;
63
+ dateProvider: DateProvider;
64
+ kzg?: BlobKzgInstance;
65
+ }): Promise<import("@aztec-labs/ethereum/l1-tx-utils-with-blobs").ForwarderL1TxUtils[]>;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYWN0b3JpZXMvbDFfdHhfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFeEUsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkYsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpFLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXBFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBc0M3RDs7O0dBR0c7QUFDSCx3QkFBc0IsMEJBQTBCLENBQzlDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxFQUNuQyxNQUFNLEVBQUUsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRztJQUFFLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFBO0NBQUUsRUFDdEcsSUFBSSxFQUFFO0lBQ0osU0FBUyxFQUFFLGVBQWUsQ0FBQztJQUMzQixNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQztJQUN6QyxZQUFZLEVBQUUsWUFBWSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxFQUFFLGVBQWUsQ0FBQztDQUN2QixtRUFLRjtBQUVEOzs7O0dBSUc7QUFDSCx3QkFBc0IsMEJBQTBCLENBQzlDLE1BQU0sRUFBRSxVQUFVLEVBQ2xCLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFDcEIsTUFBTSxFQUFFLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUc7SUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQTtDQUFFLEVBQ3RHLElBQUksRUFBRTtJQUNKLFNBQVMsRUFBRSxlQUFlLENBQUM7SUFDM0IsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sWUFBWSxDQUFDLENBQUM7SUFDekMsWUFBWSxFQUFFLFlBQVksQ0FBQztJQUMzQixHQUFHLENBQUMsRUFBRSxlQUFlLENBQUM7Q0FDdkIsbUVBdUJGO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFzQixtQ0FBbUMsQ0FDdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLEVBQ25DLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsTUFBTSxFQUFFLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUc7SUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQTtDQUFFLEVBQ3RHLElBQUksRUFBRTtJQUNKLFNBQVMsRUFBRSxlQUFlLENBQUM7SUFDM0IsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sWUFBWSxDQUFDLENBQUM7SUFDekMsWUFBWSxFQUFFLFlBQVksQ0FBQztJQUMzQixHQUFHLENBQUMsRUFBRSxlQUFlLENBQUM7Q0FDdkIsdUZBT0Y7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQXNCLG1DQUFtQyxDQUN2RCxNQUFNLEVBQUUsVUFBVSxFQUNsQixPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQ3BCLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsTUFBTSxFQUFFLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUc7SUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQTtDQUFFLEVBQ3RHLElBQUksRUFBRTtJQUNKLFNBQVMsRUFBRSxlQUFlLENBQUM7SUFDM0IsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sWUFBWSxDQUFDLENBQUM7SUFDekMsWUFBWSxFQUFFLFlBQVksQ0FBQztJQUMzQixHQUFHLENBQUMsRUFBRSxlQUFlLENBQUM7Q0FDdkIsdUZBT0YifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/factories/l1_tx_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,KAAK,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAsC7D;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,wBAAwB,EAAE,EACnC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,EACtG,IAAI,EAAE;IACJ,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,eAAe,CAAC;CACvB,mEAKF;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,SAAS,EAAE,EACpB,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,EACtG,IAAI,EAAE;IACJ,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,eAAe,CAAC;CACvB,mEAuBF;AAED;;;;GAIG;AACH,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,wBAAwB,EAAE,EACnC,gBAAgB,EAAE,UAAU,EAC5B,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,EACtG,IAAI,EAAE;IACJ,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,eAAe,CAAC;CACvB,uFAOF;AAED;;;;GAIG;AACH,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,SAAS,EAAE,EACpB,gBAAgB,EAAE,UAAU,EAC5B,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,EACtG,IAAI,EAAE;IACJ,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,eAAe,CAAC;CACvB,uFAOF"}