@aztec/node-lib 0.0.1-commit.0208eb9

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 +28 -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 +51 -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 +79 -0
  24. package/dest/factories/l1_tx_utils.d.ts.map +1 -0
  25. package/dest/factories/l1_tx_utils.js +90 -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 +272 -0
  38. package/package.json +102 -0
  39. package/src/actions/build-snapshot-metadata.ts +29 -0
  40. package/src/actions/create-backups.ts +41 -0
  41. package/src/actions/index.ts +4 -0
  42. package/src/actions/snapshot-sync.ts +279 -0
  43. package/src/actions/upload-snapshot.ts +50 -0
  44. package/src/config/index.ts +79 -0
  45. package/src/factories/index.ts +1 -0
  46. package/src/factories/l1_tx_utils.ts +212 -0
  47. package/src/metrics/index.ts +1 -0
  48. package/src/metrics/l1_tx_metrics.ts +138 -0
  49. package/src/stores/index.ts +1 -0
  50. package/src/stores/l1_tx_store.ts +396 -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/archiver';
2
+ import type { UploadSnapshotMetadata } from '@aztec/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc25hcHNob3QtbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL2J1aWxkLXNuYXBzaG90LW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEUsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRSx3QkFBc0IscUJBQXFCLENBQ3pDLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLE1BQU0sRUFBRSxvQkFBb0IsR0FDM0IsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBb0JqQyJ9
@@ -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,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,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/archiver';
2
+ import type { Logger } from '@aztec/foundation/log';
3
+ import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
4
+ import type { SnapshotDataUrls } from '@aztec/stdlib/snapshots';
5
+ export declare function createBackups(backupDir: string, archiver: Archiver, worldState: WorldStateSynchronizer, log: Logger): Promise<SnapshotDataUrls>;
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhY2t1cHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL2NyZWF0ZS1iYWNrdXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUtoRSx3QkFBc0IsYUFBYSxDQUNqQyxTQUFTLEVBQUUsTUFBTSxFQUNqQixRQUFRLEVBQUUsUUFBUSxFQUNsQixVQUFVLEVBQUUsc0JBQXNCLEVBQ2xDLEdBQUcsRUFBRSxNQUFNLDZCQTRCWiJ9
@@ -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,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,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,28 @@
1
+ import { type ArchiverConfig } from '@aztec/archiver';
2
+ import { type EthereumClientConfig } from '@aztec/ethereum/client';
3
+ import type { L1ContractsConfig } from '@aztec/ethereum/config';
4
+ import type { EthAddress } from '@aztec/foundation/eth-address';
5
+ import type { Logger } from '@aztec/foundation/log';
6
+ import type { DataStoreConfig } from '@aztec/kv-store/config';
7
+ import type { ChainConfig } from '@aztec/stdlib/config';
8
+ import { type SnapshotMetadata } from '@aztec/stdlib/snapshots';
9
+ import type { SharedNodeConfig } from '../config/index.js';
10
+ type SnapshotSyncConfig = Pick<SharedNodeConfig, 'syncMode'> & Pick<ChainConfig, 'l1ChainId' | 'rollupVersion'> & Pick<L1ContractsConfig, 'aztecEpochDuration'> & Pick<ArchiverConfig, 'archiverStoreMapSizeKb' | 'maxLogs'> & Required<DataStoreConfig> & EthereumClientConfig & {
11
+ snapshotsUrls?: string[];
12
+ minL1BlocksToTriggerReplace?: number;
13
+ };
14
+ /**
15
+ * Connects to a remote snapshot index and downloads the latest snapshot if the local archiver is behind.
16
+ * Behaviour depends on syncing mode.
17
+ */
18
+ export declare function trySnapshotSync(config: SnapshotSyncConfig, log: Logger): Promise<boolean>;
19
+ /**
20
+ * Downloads the given snapshot replacing any local data stores.
21
+ */
22
+ export declare function snapshotSync(snapshot: Pick<SnapshotMetadata, 'dataUrls'>, log: Logger, config: {
23
+ dataDirectory: string;
24
+ rollupAddress: EthAddress;
25
+ snapshotsUrl: string;
26
+ }): Promise<void>;
27
+ export {};
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3Qtc3luYy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvc25hcHNob3Qtc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRDLEtBQUssY0FBYyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBRXJILE9BQU8sRUFBRSxLQUFLLG9CQUFvQixFQUFtQixNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHeEQsT0FBTyxFQUNMLEtBQUssZ0JBQWdCLEVBS3RCLE1BQU0seUJBQXlCLENBQUM7QUFNakMsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUszRCxLQUFLLGtCQUFrQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsR0FDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsZUFBZSxDQUFDLEdBQ2hELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxHQUM3QyxJQUFJLENBQUMsY0FBYyxFQUFFLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxHQUMxRCxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQ3pCLG9CQUFvQixHQUFHO0lBQ3JCLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3pCLDJCQUEyQixDQUFDLEVBQUUsTUFBTSxDQUFDO0NBQ3RDLENBQUM7QUFFSjs7O0dBR0c7QUFDSCx3QkFBc0IsZUFBZSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxvQkFpSzVFO0FBRUQ7O0dBRUc7QUFDSCx3QkFBc0IsWUFBWSxDQUNoQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxFQUM1QyxHQUFHLEVBQUUsTUFBTSxFQUNYLE1BQU0sRUFBRTtJQUFFLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFBQyxhQUFhLEVBQUUsVUFBVSxDQUFDO0lBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQTtDQUFFLGlCQXFEbkYifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-sync.d.ts","sourceRoot":"","sources":["../../src/actions/snapshot-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,cAAc,EAAuB,MAAM,iBAAiB,CAAC;AAErH,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EACL,KAAK,gBAAgB,EAKtB,MAAM,yBAAyB,CAAC;AAMjC,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,GAAG,SAAS,CAAC,GAC1D,QAAQ,CAAC,eAAe,CAAC,GACzB,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,oBAiK5E;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,YAAY,EAAE,MAAM,CAAA;CAAE,iBAqDnF"}
@@ -0,0 +1,238 @@
1
+ import { ARCHIVER_DB_VERSION, ARCHIVER_STORE_NAME, createArchiverStore } from '@aztec/archiver';
2
+ import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
3
+ import { getPublicClient } from '@aztec/ethereum/client';
4
+ import { tryRmDir } from '@aztec/foundation/fs';
5
+ import { P2P_STORE_NAME } from '@aztec/p2p';
6
+ import { DatabaseVersionManager } from '@aztec/stdlib/database-version/manager';
7
+ import { createReadOnlyFileStore } from '@aztec/stdlib/file-store';
8
+ import { downloadSnapshot, getLatestSnapshotMetadata, makeSnapshotPaths } from '@aztec/stdlib/snapshots';
9
+ import { NATIVE_WORLD_STATE_DBS, WORLD_STATE_DB_VERSION, WORLD_STATE_DIR } from '@aztec/world-state';
10
+ import { mkdir, mkdtemp, rename } from 'fs/promises';
11
+ import { join } from 'path';
12
+ // Half day worth of L1 blocks
13
+ const MIN_L1_BLOCKS_TO_TRIGGER_REPLACE = 86400 / 2 / 12;
14
+ /**
15
+ * Connects to a remote snapshot index and downloads the latest snapshot if the local archiver is behind.
16
+ * Behaviour depends on syncing mode.
17
+ */ export async function trySnapshotSync(config, log) {
18
+ const { syncMode, snapshotsUrls, dataDirectory, l1ChainId, rollupVersion, l1Contracts } = config;
19
+ if (syncMode === 'full') {
20
+ log.debug('Snapshot sync is disabled. Running full sync.', {
21
+ syncMode: syncMode
22
+ });
23
+ return false;
24
+ }
25
+ if (!snapshotsUrls || snapshotsUrls.length === 0) {
26
+ log.verbose('Snapshot sync is disabled. No snapshots URLs provided.');
27
+ return false;
28
+ }
29
+ if (!dataDirectory) {
30
+ log.verbose('Snapshot sync is disabled. No local data directory defined.');
31
+ return false;
32
+ }
33
+ // Create an archiver store to check the current state (do this only once)
34
+ log.verbose(`Creating temporary archiver data store`);
35
+ const archiverStore = await createArchiverStore(config, {
36
+ epochDuration: config.aztecEpochDuration
37
+ });
38
+ let archiverL1BlockNumber;
39
+ let archiverL2BlockNumber;
40
+ try {
41
+ [archiverL1BlockNumber, archiverL2BlockNumber] = await Promise.all([
42
+ archiverStore.getSynchPoint().then((s)=>s.blocksSynchedTo),
43
+ archiverStore.getLatestBlockNumber()
44
+ ]);
45
+ } finally{
46
+ log.verbose(`Closing temporary archiver data store`, {
47
+ archiverL1BlockNumber,
48
+ archiverL2BlockNumber
49
+ });
50
+ await archiverStore.close();
51
+ }
52
+ const minL1BlocksToTriggerReplace = config.minL1BlocksToTriggerReplace ?? MIN_L1_BLOCKS_TO_TRIGGER_REPLACE;
53
+ if (syncMode === 'snapshot' && archiverL2BlockNumber !== undefined && archiverL2BlockNumber >= INITIAL_L2_BLOCK_NUM) {
54
+ log.verbose(`Skipping non-forced snapshot sync as archiver is already synced to L2 block ${archiverL2BlockNumber}.`);
55
+ return false;
56
+ }
57
+ const currentL1BlockNumber = await getPublicClient(config).getBlockNumber();
58
+ if (archiverL1BlockNumber && currentL1BlockNumber - archiverL1BlockNumber < minL1BlocksToTriggerReplace) {
59
+ log.verbose(`Skipping snapshot sync as archiver is less than ${currentL1BlockNumber - archiverL1BlockNumber} L1 blocks behind.`, {
60
+ archiverL1BlockNumber,
61
+ currentL1BlockNumber,
62
+ minL1BlocksToTriggerReplace
63
+ });
64
+ return false;
65
+ }
66
+ const indexMetadata = {
67
+ l1ChainId,
68
+ rollupVersion,
69
+ rollupAddress: l1Contracts.rollupAddress
70
+ };
71
+ const snapshotCandidates = [];
72
+ for (const snapshotsUrl of snapshotsUrls){
73
+ let fileStore;
74
+ try {
75
+ fileStore = await createReadOnlyFileStore(snapshotsUrl, log);
76
+ } catch (err) {
77
+ log.error(`Invalid config for downloading snapshots from ${snapshotsUrl}`, err);
78
+ continue;
79
+ }
80
+ let snapshot;
81
+ try {
82
+ snapshot = await getLatestSnapshotMetadata(indexMetadata, fileStore);
83
+ } catch (err) {
84
+ log.error(`Failed to get latest snapshot metadata from ${snapshotsUrl}. Skipping this URL.`, err, {
85
+ ...indexMetadata,
86
+ snapshotsUrl
87
+ });
88
+ continue;
89
+ }
90
+ if (!snapshot) {
91
+ log.verbose(`No snapshot found at ${snapshotsUrl}. Skipping this URL.`, {
92
+ ...indexMetadata,
93
+ snapshotsUrl
94
+ });
95
+ continue;
96
+ }
97
+ if (snapshot.schemaVersions.archiver !== ARCHIVER_DB_VERSION) {
98
+ log.warn(`Skipping snapshot from ${snapshotsUrl} as it has schema version ${snapshot.schemaVersions.archiver} but expected ${ARCHIVER_DB_VERSION}.`, snapshot);
99
+ continue;
100
+ }
101
+ if (snapshot.schemaVersions.worldState !== WORLD_STATE_DB_VERSION) {
102
+ log.warn(`Skipping snapshot from ${snapshotsUrl} as it has world state schema version ${snapshot.schemaVersions.worldState} but we expected ${WORLD_STATE_DB_VERSION}.`, snapshot);
103
+ continue;
104
+ }
105
+ if (archiverL1BlockNumber && snapshot.l1BlockNumber < archiverL1BlockNumber) {
106
+ log.verbose(`Skipping snapshot from ${snapshotsUrl} since local archiver is at L1 block ${archiverL1BlockNumber} which is further than snapshot at ${snapshot.l1BlockNumber}`, {
107
+ snapshot,
108
+ archiverL1BlockNumber,
109
+ snapshotsUrl
110
+ });
111
+ continue;
112
+ }
113
+ if (archiverL1BlockNumber && snapshot.l1BlockNumber - Number(archiverL1BlockNumber) < minL1BlocksToTriggerReplace) {
114
+ log.verbose(`Skipping snapshot from ${snapshotsUrl} as archiver is less than ${snapshot.l1BlockNumber - Number(archiverL1BlockNumber)} L1 blocks behind this snapshot.`, {
115
+ snapshot,
116
+ archiverL1BlockNumber,
117
+ snapshotsUrl
118
+ });
119
+ continue;
120
+ }
121
+ snapshotCandidates.push({
122
+ snapshot,
123
+ url: snapshotsUrl,
124
+ fileStore
125
+ });
126
+ }
127
+ if (snapshotCandidates.length === 0) {
128
+ log.verbose(`No valid snapshots found from any URL, skipping snapshot sync`, {
129
+ ...indexMetadata,
130
+ snapshotsUrls
131
+ });
132
+ return false;
133
+ }
134
+ // Sort candidates by L1 block number (highest first)
135
+ snapshotCandidates.sort((a, b)=>b.snapshot.l1BlockNumber - a.snapshot.l1BlockNumber);
136
+ // Try each candidate in order until one succeeds
137
+ for (const { snapshot, url } of snapshotCandidates){
138
+ const { l1BlockNumber, l2BlockNumber } = snapshot;
139
+ log.info(`Attempting to sync from snapshot at L1 block ${l1BlockNumber} L2 block ${l2BlockNumber}`, {
140
+ snapshot,
141
+ snapshotsUrl: url
142
+ });
143
+ try {
144
+ await snapshotSync(snapshot, log, {
145
+ dataDirectory: config.dataDirectory,
146
+ rollupAddress: config.l1Contracts.rollupAddress,
147
+ snapshotsUrl: url
148
+ });
149
+ log.info(`Snapshot synced to L1 block ${l1BlockNumber} L2 block ${l2BlockNumber}`, {
150
+ snapshot,
151
+ snapshotsUrl: url
152
+ });
153
+ return true;
154
+ } catch (err) {
155
+ log.error(`Failed to download snapshot from ${url}, trying next candidate`, err, {
156
+ snapshot,
157
+ snapshotsUrl: url
158
+ });
159
+ continue;
160
+ }
161
+ }
162
+ log.error(`Failed to download snapshot from all URLs`, {
163
+ snapshotsUrls
164
+ });
165
+ return false;
166
+ }
167
+ /**
168
+ * Downloads the given snapshot replacing any local data stores.
169
+ */ export async function snapshotSync(snapshot, log, config) {
170
+ const { dataDirectory, rollupAddress } = config;
171
+ if (!dataDirectory) {
172
+ throw new Error(`No local data directory defined. Cannot sync snapshot.`);
173
+ }
174
+ const fileStore = await createReadOnlyFileStore(config.snapshotsUrl, log);
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/archiver';
2
+ import type { Logger } from '@aztec/foundation/log';
3
+ import type { DataStoreConfig } from '@aztec/kv-store/config';
4
+ import type { ChainConfig } from '@aztec/stdlib/config';
5
+ import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXNuYXBzaG90LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWN0aW9ucy91cGxvYWQtc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixLQUFLLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXhELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFXOUUsTUFBTSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLGVBQWUsQ0FBQyxHQUNqRixJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBRXpDOzs7R0FHRztBQUNILHdCQUFzQixjQUFjLENBQ2xDLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLFVBQVUsRUFBRSxzQkFBc0IsRUFDbEMsTUFBTSxFQUFFLG9CQUFvQixFQUM1QixHQUFHLEVBQUUsTUFBTSxpQkFvQloifQ==
@@ -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,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAW9E,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/archiver';
2
+ import { tryRmDir } from '@aztec/foundation/fs';
3
+ import { createFileStore } from '@aztec/stdlib/file-store';
4
+ import { uploadSnapshotToIndex } from '@aztec/stdlib/snapshots';
5
+ import { WORLD_STATE_DB_VERSION } from '@aztec/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/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
+ /** 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. */
8
+ syncMode: 'full' | 'snapshot' | 'force-snapshot';
9
+ /** Base URLs for snapshots index. Index file will be searched at `SNAPSHOTS_BASE_URL/aztec-L1_CHAIN_ID-VERSION-ROLLUP_ADDRESS/index.json` */
10
+ snapshotsUrls?: string[];
11
+ /** Auto update mode: disabled - to completely ignore remote signals to update the node. enabled - to respect the signals (potentially shutting this node down). log - check for updates but log a warning instead of applying them*/
12
+ autoUpdate?: 'disabled' | 'notify' | 'config' | 'config-and-version';
13
+ /** The base URL against which to check for updates */
14
+ autoUpdateUrl?: string;
15
+ /** URL of the Web3Signer instance */
16
+ web3SignerUrl?: string;
17
+ /** Whether to run in fisherman mode */
18
+ fishermanMode?: boolean;
19
+ /** Force verification of tx Chonk proofs. Only used for testnet */
20
+ debugForceTxProofVerification: boolean;
21
+ };
22
+ export declare const sharedNodeConfigMappings: ConfigMappingsType<SharedNodeConfig>;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXVCLE1BQU0sMEJBQTBCLENBQUM7QUFFeEYsTUFBTSxNQUFNLGdCQUFnQixHQUFHO0lBQzdCLHlGQUF5RjtJQUN6RixZQUFZLEVBQUUsT0FBTyxDQUFDO0lBQ3RCLHlGQUF5RjtJQUN6RixZQUFZLEVBQUUsT0FBTyxDQUFDO0lBQ3RCLGdLQUFnSztJQUNoSyxRQUFRLEVBQUUsTUFBTSxHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztJQUNqRCw2SUFBNkk7SUFDN0ksYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFFekIscU9BQXFPO0lBQ3JPLFVBQVUsQ0FBQyxFQUFFLFVBQVUsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLG9CQUFvQixDQUFDO0lBQ3JFLHNEQUFzRDtJQUN0RCxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFdkIscUNBQXFDO0lBQ3JDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUN2Qix1Q0FBdUM7SUFDdkMsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBRXhCLG1FQUFtRTtJQUNuRSw2QkFBNkIsRUFBRSxPQUFPLENBQUM7Q0FDeEMsQ0FBQztBQUVGLGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FvRHpFLENBQUMifQ==
@@ -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,0BAA0B,CAAC;AAExF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;IACtB,gKAAgK;IAChK,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACjD,6IAA6I;IAC7I,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,qOAAqO;IACrO,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,oBAAoB,CAAC;IACrE,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,mEAAmE;IACnE,6BAA6B,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAoDzE,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { booleanConfigHelper } from '@aztec/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
+ syncMode: {
14
+ env: 'SYNC_MODE',
15
+ 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.',
16
+ defaultValue: 'snapshot'
17
+ },
18
+ snapshotsUrls: {
19
+ env: 'SYNC_SNAPSHOTS_URLS',
20
+ description: 'Base URLs for snapshots index, comma-separated.',
21
+ parseEnv: (val)=>val.split(',').map((url)=>url.trim()).filter((url)=>url.length > 0),
22
+ fallback: [
23
+ 'SYNC_SNAPSHOTS_URL'
24
+ ],
25
+ defaultValue: []
26
+ },
27
+ autoUpdate: {
28
+ env: 'AUTO_UPDATE',
29
+ description: 'The auto update mode for this node',
30
+ defaultValue: 'disabled'
31
+ },
32
+ autoUpdateUrl: {
33
+ env: 'AUTO_UPDATE_URL',
34
+ description: 'Base URL to check for updates'
35
+ },
36
+ web3SignerUrl: {
37
+ env: 'WEB3_SIGNER_URL',
38
+ description: 'URL of the Web3Signer instance',
39
+ parseEnv: (val)=>val.trim()
40
+ },
41
+ fishermanMode: {
42
+ env: 'FISHERMAN_MODE',
43
+ description: 'Whether to run in fisherman mode.',
44
+ ...booleanConfigHelper(false)
45
+ },
46
+ debugForceTxProofVerification: {
47
+ env: 'DEBUG_FORCE_TX_PROOF_VERIFICATION',
48
+ description: 'Whether to force tx proof verification. Only has an effect if real proving is turned off',
49
+ ...booleanConfigHelper(false)
50
+ }
51
+ };
@@ -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,79 @@
1
+ import type { EthSigner } from '@aztec/ethereum/eth-signer';
2
+ import type { L1TxUtilsConfig } from '@aztec/ethereum/l1-tx-utils';
3
+ import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
4
+ import { createLogger } from '@aztec/foundation/log';
5
+ import type { DateProvider } from '@aztec/foundation/timer';
6
+ import type { DataStoreConfig } from '@aztec/kv-store/config';
7
+ import type { TelemetryClient } from '@aztec/telemetry-client';
8
+ import type { L1TxScope } from '../metrics/l1_tx_metrics.js';
9
+ /**
10
+ * Creates L1TxUtils with blobs from multiple Viem wallets, sharing store and metrics.
11
+ */
12
+ export declare function createL1TxUtilsWithBlobsFromViemWallet(clients: ExtendedViemWalletClient[], config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
13
+ debugMaxGasLimit?: boolean;
14
+ scope?: L1TxScope;
15
+ }, deps: {
16
+ telemetry: TelemetryClient;
17
+ logger?: ReturnType<typeof createLogger>;
18
+ dateProvider?: DateProvider;
19
+ }): Promise<import("@aztec/ethereum/l1-tx-utils-with-blobs").L1TxUtilsWithBlobs[]>;
20
+ /**
21
+ * Creates L1TxUtils with blobs from multiple EthSigners, sharing store and metrics. Removes duplicates
22
+ */
23
+ export declare function createL1TxUtilsWithBlobsFromEthSigner(client: ViemClient, signers: EthSigner[], config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
24
+ debugMaxGasLimit?: boolean;
25
+ scope?: L1TxScope;
26
+ }, deps: {
27
+ telemetry: TelemetryClient;
28
+ logger?: ReturnType<typeof createLogger>;
29
+ dateProvider?: DateProvider;
30
+ }): Promise<import("@aztec/ethereum/l1-tx-utils-with-blobs").L1TxUtilsWithBlobs[]>;
31
+ /**
32
+ * Creates L1TxUtils (without blobs) from multiple Viem wallets, sharing store and metrics.
33
+ */
34
+ export declare function createL1TxUtilsFromViemWalletWithStore(clients: ExtendedViemWalletClient[], config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
35
+ debugMaxGasLimit?: boolean;
36
+ scope?: L1TxScope;
37
+ }, deps: {
38
+ telemetry: TelemetryClient;
39
+ logger?: ReturnType<typeof createLogger>;
40
+ dateProvider?: DateProvider;
41
+ scope?: L1TxScope;
42
+ }): Promise<import("@aztec/ethereum/l1-tx-utils").L1TxUtils[]>;
43
+ /**
44
+ * Creates L1TxUtils (without blobs) from multiple EthSigners, sharing store and metrics. Removes duplicates.
45
+ */
46
+ export declare function createL1TxUtilsFromEthSignerWithStore(client: ViemClient, signers: EthSigner[], config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
47
+ debugMaxGasLimit?: boolean;
48
+ scope?: L1TxScope;
49
+ }, deps: {
50
+ telemetry: TelemetryClient;
51
+ logger?: ReturnType<typeof createLogger>;
52
+ dateProvider?: DateProvider;
53
+ scope?: L1TxScope;
54
+ }): Promise<import("@aztec/ethereum/l1-tx-utils").L1TxUtils[]>;
55
+ /**
56
+ * Creates ForwarderL1TxUtils from multiple Viem wallets, sharing store and metrics.
57
+ * This wraps all transactions through a forwarder contract for testing purposes.
58
+ */
59
+ export declare function createForwarderL1TxUtilsFromViemWallet(clients: ExtendedViemWalletClient[], forwarderAddress: import('@aztec/foundation/eth-address').EthAddress, config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
60
+ debugMaxGasLimit?: boolean;
61
+ scope?: L1TxScope;
62
+ }, deps: {
63
+ telemetry: TelemetryClient;
64
+ logger?: ReturnType<typeof createLogger>;
65
+ dateProvider?: DateProvider;
66
+ }): Promise<import("@aztec/ethereum/l1-tx-utils-with-blobs").ForwarderL1TxUtils[]>;
67
+ /**
68
+ * Creates ForwarderL1TxUtils from multiple EthSigners, sharing store and metrics.
69
+ * This wraps all transactions through a forwarder contract for testing purposes.
70
+ */
71
+ export declare function createForwarderL1TxUtilsFromEthSigner(client: ViemClient, signers: EthSigner[], forwarderAddress: import('@aztec/foundation/eth-address').EthAddress, config: DataStoreConfig & Partial<L1TxUtilsConfig> & {
72
+ debugMaxGasLimit?: boolean;
73
+ scope?: L1TxScope;
74
+ }, deps: {
75
+ telemetry: TelemetryClient;
76
+ logger?: ReturnType<typeof createLogger>;
77
+ dateProvider?: DateProvider;
78
+ }): Promise<import("@aztec/ethereum/l1-tx-utils-with-blobs").ForwarderL1TxUtils[]>;
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYWN0b3JpZXMvbDFfdHhfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFLNUQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFPbkUsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBK0I3RDs7R0FFRztBQUNILHdCQUFzQixzQ0FBc0MsQ0FDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLEVBQ25DLE1BQU0sRUFBRSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHO0lBQUUsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLENBQUM7SUFBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUE7Q0FBRSxFQUN0RyxJQUFJLEVBQUU7SUFDSixTQUFTLEVBQUUsZUFBZSxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQztDQUM3QixrRkFPRjtBQUVEOztHQUVHO0FBQ0gsd0JBQXNCLHFDQUFxQyxDQUN6RCxNQUFNLEVBQUUsVUFBVSxFQUNsQixPQUFPLEVBQUUsU0FB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/factories/l1_tx_utils.ts"],"names":[],"mappings":"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"}