@aztec/archiver 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.76.0
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.
- package/dest/archiver/archiver.d.ts +186 -0
- package/dest/archiver/archiver.d.ts.map +1 -0
- package/dest/archiver/archiver.js +711 -729
- package/dest/archiver/archiver_store.d.ts +217 -0
- package/dest/archiver/archiver_store.d.ts.map +1 -0
- package/dest/archiver/archiver_store.js +2 -4
- package/dest/archiver/archiver_store_test_suite.d.ts +8 -0
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -0
- package/dest/archiver/archiver_store_test_suite.js +224 -385
- package/dest/archiver/config.d.ts +37 -0
- package/dest/archiver/config.d.ts.map +1 -0
- package/dest/archiver/config.js +15 -9
- package/dest/archiver/data_retrieval.d.ts +71 -0
- package/dest/archiver/data_retrieval.d.ts.map +1 -0
- package/dest/archiver/data_retrieval.js +67 -77
- package/dest/archiver/errors.d.ts +4 -0
- package/dest/archiver/errors.d.ts.map +1 -0
- package/dest/archiver/errors.js +2 -1
- package/dest/archiver/index.d.ts +8 -0
- package/dest/archiver/index.d.ts.map +1 -0
- package/dest/archiver/index.js +1 -0
- package/dest/archiver/instrumentation.d.ts +27 -0
- package/dest/archiver/instrumentation.d.ts.map +1 -0
- package/dest/archiver/instrumentation.js +17 -29
- package/dest/archiver/kv_archiver_store/block_store.d.ts +87 -0
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -0
- package/dest/archiver/kv_archiver_store/block_store.js +127 -118
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +17 -0
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +1 -0
- package/dest/archiver/kv_archiver_store/contract_class_store.js +37 -43
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +13 -0
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +1 -0
- package/dest/archiver/kv_archiver_store/contract_instance_store.js +12 -7
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +147 -0
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -0
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +158 -135
- package/dest/archiver/kv_archiver_store/log_store.d.ts +47 -0
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +1 -0
- package/dest/archiver/kv_archiver_store/log_store.js +256 -271
- package/dest/archiver/kv_archiver_store/message_store.d.ts +33 -0
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -0
- package/dest/archiver/kv_archiver_store/message_store.js +48 -42
- package/dest/archiver/kv_archiver_store/nullifier_store.d.ts +12 -0
- package/dest/archiver/kv_archiver_store/nullifier_store.d.ts.map +1 -0
- package/dest/archiver/kv_archiver_store/nullifier_store.js +42 -35
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +23 -0
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -0
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +24 -15
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +168 -0
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -0
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +231 -227
- package/dest/archiver/structs/data_retrieval.d.ts +27 -0
- package/dest/archiver/structs/data_retrieval.d.ts.map +1 -0
- package/dest/archiver/structs/data_retrieval.js +2 -5
- package/dest/archiver/structs/published.d.ts +11 -0
- package/dest/archiver/structs/published.d.ts.map +1 -0
- package/dest/archiver/structs/published.js +2 -1
- package/dest/factory.d.ts +10 -0
- package/dest/factory.d.ts.map +1 -0
- package/dest/factory.js +24 -32
- package/dest/index.d.ts +5 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +1 -0
- package/dest/rpc/index.d.ts +9 -0
- package/dest/rpc/index.d.ts.map +1 -0
- package/dest/rpc/index.js +8 -7
- package/dest/test/index.d.ts +4 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +1 -0
- package/dest/test/mock_archiver.d.ts +22 -0
- package/dest/test/mock_archiver.d.ts.map +1 -0
- package/dest/test/mock_archiver.js +13 -8
- package/dest/test/mock_l1_to_l2_message_source.d.ts +16 -0
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -0
- package/dest/test/mock_l1_to_l2_message_source.js +4 -4
- package/dest/test/mock_l2_block_source.d.ts +80 -0
- package/dest/test/mock_l2_block_source.d.ts.map +1 -0
- package/dest/test/mock_l2_block_source.js +67 -68
- package/package.json +15 -14
- package/src/archiver/config.ts +7 -1
- package/src/archiver/index.ts +1 -1
- package/src/factory.ts +7 -3
- package/src/rpc/index.ts +16 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type BlobSinkConfig } from '@aztec/blob-sink/client';
|
|
2
|
+
import { type ChainConfig } from '@aztec/circuit-types/config';
|
|
3
|
+
import { type L1ContractAddresses, type L1ContractsConfig, type L1ReaderConfig } from '@aztec/ethereum';
|
|
4
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
5
|
+
/**
|
|
6
|
+
* There are 2 polling intervals used in this configuration. The first is the archiver polling interval, archiverPollingIntervalMS.
|
|
7
|
+
* This is the interval between successive calls to eth_blockNumber via viem.
|
|
8
|
+
* Results of calls to eth_blockNumber are cached by viem with this cache being updated periodically at the interval specified by viemPollingIntervalMS.
|
|
9
|
+
* As a result the maximum observed polling time for new blocks will be viemPollingIntervalMS + archiverPollingIntervalMS.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The archiver configuration.
|
|
13
|
+
*/
|
|
14
|
+
export type ArchiverConfig = {
|
|
15
|
+
/** URL for an archiver service. If set, will return an archiver client as opposed to starting a new one. */
|
|
16
|
+
archiverUrl?: string;
|
|
17
|
+
/** URL for an L1 consensus client */
|
|
18
|
+
l1ConsensusHostUrl?: string;
|
|
19
|
+
/** The polling interval in ms for retrieving new L2 blocks and encrypted logs. */
|
|
20
|
+
archiverPollingIntervalMS?: number;
|
|
21
|
+
/** The number of L2 blocks the archiver will attempt to download at a time. */
|
|
22
|
+
archiverBatchSize?: number;
|
|
23
|
+
/** The polling interval viem uses in ms */
|
|
24
|
+
viemPollingIntervalMS?: number;
|
|
25
|
+
/** The deployed L1 contract addresses */
|
|
26
|
+
l1Contracts: L1ContractAddresses;
|
|
27
|
+
/** The max number of logs that can be obtained in 1 "getPublicLogs" call. */
|
|
28
|
+
maxLogs?: number;
|
|
29
|
+
} & L1ReaderConfig & L1ContractsConfig & BlobSinkConfig & ChainConfig;
|
|
30
|
+
export declare const archiverConfigMappings: ConfigMappingsType<ArchiverConfig>;
|
|
31
|
+
/**
|
|
32
|
+
* Returns the archiver configuration from the environment variables.
|
|
33
|
+
* Note: If an environment variable is not set, the default value is used.
|
|
34
|
+
* @returns The archiver configuration.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getArchiverConfigFromEnv(): ArchiverConfig;
|
|
37
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/archiver/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,6BAA6B,CAAC;AACpF,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAGpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,kBAAkB,EAA6C,MAAM,0BAA0B,CAAC;AAE9G;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,4GAA4G;IAC5G,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,qCAAqC;IACrC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,kFAAkF;IAClF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,yCAAyC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IAEjC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,cAAc,GAChB,iBAAiB,GACjB,cAAc,GACd,WAAW,CAAC;AAEd,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CAAC,cAAc,CAmCrE,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,CAEzD"}
|
package/dest/archiver/config.js
CHANGED
|
@@ -1,42 +1,48 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { blobSinkConfigMapping } from '@aztec/blob-sink/client';
|
|
2
|
+
import { chainConfigMappings } from '@aztec/circuit-types/config';
|
|
3
|
+
import { l1ContractsConfigMappings, l1ReaderConfigMappings, } from '@aztec/ethereum';
|
|
2
4
|
import { getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
|
|
3
5
|
export const archiverConfigMappings = {
|
|
6
|
+
...blobSinkConfigMapping,
|
|
4
7
|
archiverUrl: {
|
|
5
8
|
env: 'ARCHIVER_URL',
|
|
6
|
-
description: 'URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.'
|
|
9
|
+
description: 'URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.',
|
|
7
10
|
},
|
|
8
11
|
l1ConsensusHostUrl: {
|
|
9
12
|
env: 'L1_CONSENSUS_HOST_URL',
|
|
10
13
|
description: 'URL for an L1 consensus client.',
|
|
11
|
-
parseEnv: (val)=>val
|
|
14
|
+
parseEnv: (val) => val,
|
|
12
15
|
},
|
|
13
16
|
archiverPollingIntervalMS: {
|
|
14
17
|
env: 'ARCHIVER_POLLING_INTERVAL_MS',
|
|
15
18
|
description: 'The polling interval in ms for retrieving new L2 blocks and encrypted logs.',
|
|
16
|
-
...numberConfigHelper(500)
|
|
19
|
+
...numberConfigHelper(500),
|
|
17
20
|
},
|
|
18
21
|
archiverBatchSize: {
|
|
19
22
|
env: 'ARCHIVER_BATCH_SIZE',
|
|
20
23
|
description: 'The number of L2 blocks the archiver will attempt to download at a time.',
|
|
21
|
-
...numberConfigHelper(100)
|
|
24
|
+
...numberConfigHelper(100),
|
|
22
25
|
},
|
|
23
26
|
maxLogs: {
|
|
24
27
|
env: 'ARCHIVER_MAX_LOGS',
|
|
25
28
|
description: 'The max number of logs that can be obtained in 1 "getPublicLogs" call.',
|
|
26
|
-
...numberConfigHelper(
|
|
29
|
+
...numberConfigHelper(1000),
|
|
27
30
|
},
|
|
31
|
+
...chainConfigMappings,
|
|
28
32
|
...l1ReaderConfigMappings,
|
|
29
33
|
viemPollingIntervalMS: {
|
|
30
34
|
env: 'ARCHIVER_VIEM_POLLING_INTERVAL_MS',
|
|
31
35
|
description: 'The polling interval viem uses in ms',
|
|
32
|
-
...numberConfigHelper(1000)
|
|
36
|
+
...numberConfigHelper(1000),
|
|
33
37
|
},
|
|
34
|
-
...l1ContractsConfigMappings
|
|
38
|
+
...l1ContractsConfigMappings,
|
|
35
39
|
};
|
|
36
40
|
/**
|
|
37
41
|
* Returns the archiver configuration from the environment variables.
|
|
38
42
|
* Note: If an environment variable is not set, the default value is used.
|
|
39
43
|
* @returns The archiver configuration.
|
|
40
|
-
*/
|
|
44
|
+
*/
|
|
45
|
+
export function getArchiverConfigFromEnv() {
|
|
41
46
|
return getConfigFromMappings(archiverConfigMappings);
|
|
42
47
|
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckYsT0FBTyxFQUFvQixtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BGLE9BQU8sRUFJTCx5QkFBeUIsRUFDekIsc0JBQXNCLEdBQ3ZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUEyQixxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBc0M5RyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBdUM7SUFDeEUsR0FBRyxxQkFBcUI7SUFDeEIsV0FBVyxFQUFFO1FBQ1gsR0FBRyxFQUFFLGNBQWM7UUFDbkIsV0FBVyxFQUNULHVHQUF1RztLQUMxRztJQUNELGtCQUFrQixFQUFFO1FBQ2xCLEdBQUcsRUFBRSx1QkFBdUI7UUFDNUIsV0FBVyxFQUFFLGlDQUFpQztRQUM5QyxRQUFRLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUc7S0FDL0I7SUFDRCx5QkFBeUIsRUFBRTtRQUN6QixHQUFHLEVBQUUsOEJBQThCO1FBQ25DLFdBQVcsRUFBRSw2RUFBNkU7UUFDMUYsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7S0FDM0I7SUFDRCxpQkFBaUIsRUFBRTtRQUNqQixHQUFHLEVBQUUscUJBQXFCO1FBQzFCLFdBQVcsRUFBRSwwRUFBMEU7UUFDdkYsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7S0FDM0I7SUFDRCxPQUFPLEVBQUU7UUFDUCxHQUFHLEVBQUUsbUJBQW1CO1FBQ3hCLFdBQVcsRUFBRSx3RUFBd0U7UUFDckYsR0FBRyxrQkFBa0IsQ0FBQyxJQUFLLENBQUM7S0FDN0I7SUFDRCxHQUFHLG1CQUFtQjtJQUN0QixHQUFHLHNCQUFzQjtJQUN6QixxQkFBcUIsRUFBRTtRQUNyQixHQUFHLEVBQUUsbUNBQW1DO1FBQ3hDLFdBQVcsRUFBRSxzQ0FBc0M7UUFDbkQsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7S0FDNUI7SUFDRCxHQUFHLHlCQUF5QjtDQUM3QixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsT0FBTyxxQkFBcUIsQ0FBaUIsc0JBQXNCLENBQUMsQ0FBQztBQUN2RSxDQUFDIn0=
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { type BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
4
|
+
import { InboxLeaf, L2Block } from '@aztec/circuit-types';
|
|
5
|
+
import { Fr, Proof } from '@aztec/circuits.js';
|
|
6
|
+
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
7
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
8
|
+
import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
9
|
+
import { type Chain, type GetContractEventsReturnType, type GetContractReturnType, type Hex, type HttpTransport, type PublicClient } from 'viem';
|
|
10
|
+
import { type DataRetrieval } from './structs/data_retrieval.js';
|
|
11
|
+
import { type L1Published } from './structs/published.js';
|
|
12
|
+
/**
|
|
13
|
+
* Fetches new L2 blocks.
|
|
14
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
15
|
+
* @param rollupAddress - The address of the rollup contract.
|
|
16
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
17
|
+
* @param searchEndBlock - The highest block number that we should search up to.
|
|
18
|
+
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
19
|
+
* @returns An array of block; as well as the next eth block to search from.
|
|
20
|
+
*/
|
|
21
|
+
export declare function retrieveBlocksFromRollup(rollup: GetContractReturnType<typeof RollupAbi, PublicClient<HttpTransport, Chain>>, publicClient: PublicClient, blobSinkClient: BlobSinkClientInterface, searchStartBlock: bigint, searchEndBlock: bigint, logger?: Logger): Promise<L1Published<L2Block>[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Processes newly received L2BlockProposed logs.
|
|
24
|
+
* @param rollup - The rollup contract
|
|
25
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
26
|
+
* @param logs - L2BlockProposed logs.
|
|
27
|
+
* @returns - An array blocks.
|
|
28
|
+
*/
|
|
29
|
+
export declare function processL2BlockProposedLogs(rollup: GetContractReturnType<typeof RollupAbi, PublicClient<HttpTransport, Chain>>, publicClient: PublicClient, blobSinkClient: BlobSinkClientInterface, logs: GetContractEventsReturnType<typeof RollupAbi, 'L2BlockProposed'>, logger: Logger): Promise<L1Published<L2Block>[]>;
|
|
30
|
+
export declare function getL1BlockTime(publicClient: PublicClient, blockNumber: bigint): Promise<bigint>;
|
|
31
|
+
/**
|
|
32
|
+
* Fetch L1 to L2 messages.
|
|
33
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
34
|
+
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
35
|
+
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
36
|
+
* @param searchStartBlock - The block number to use for starting the search.
|
|
37
|
+
* @param searchEndBlock - The highest block number that we should search up to.
|
|
38
|
+
* @returns An array of InboxLeaf and next eth block to search from.
|
|
39
|
+
*/
|
|
40
|
+
export declare function retrieveL1ToL2Messages(inbox: GetContractReturnType<typeof InboxAbi, PublicClient<HttpTransport, Chain>>, searchStartBlock: bigint, searchEndBlock: bigint): Promise<DataRetrieval<InboxLeaf>>;
|
|
41
|
+
/** Retrieves L2ProofVerified events from the rollup contract. */
|
|
42
|
+
export declare function retrieveL2ProofVerifiedEvents(publicClient: PublicClient, rollupAddress: EthAddress, searchStartBlock: bigint, searchEndBlock?: bigint): Promise<{
|
|
43
|
+
l1BlockNumber: bigint;
|
|
44
|
+
l2BlockNumber: bigint;
|
|
45
|
+
proverId: Fr;
|
|
46
|
+
txHash: Hex;
|
|
47
|
+
}[]>;
|
|
48
|
+
/** Retrieve submitted proofs from the rollup contract */
|
|
49
|
+
export declare function retrieveL2ProofsFromRollup(publicClient: PublicClient, rollupAddress: EthAddress, searchStartBlock: bigint, searchEndBlock?: bigint): Promise<DataRetrieval<{
|
|
50
|
+
proof: Proof;
|
|
51
|
+
proverId: Fr;
|
|
52
|
+
l2BlockNumber: bigint;
|
|
53
|
+
txHash: `0x${string}`;
|
|
54
|
+
}>>;
|
|
55
|
+
export type SubmitBlockProof = {
|
|
56
|
+
archiveRoot: Fr;
|
|
57
|
+
proverId: Fr;
|
|
58
|
+
aggregationObject: Buffer;
|
|
59
|
+
proof: Proof;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Gets block metadata (header and archive snapshot) from the calldata of an L1 transaction.
|
|
63
|
+
* Assumes that the block was published from an EOA.
|
|
64
|
+
* TODO: Add retries and error management.
|
|
65
|
+
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
66
|
+
* @param txHash - Hash of the tx that published it.
|
|
67
|
+
* @param l2BlockNum - L2 block number.
|
|
68
|
+
* @returns L2 block metadata (header and archive) from the calldata, deserialized
|
|
69
|
+
*/
|
|
70
|
+
export declare function getProofFromSubmitProofTx(publicClient: PublicClient, txHash: `0x${string}`, expectedProverId: Fr): Promise<SubmitBlockProof>;
|
|
71
|
+
//# sourceMappingURL=data_retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../src/archiver/data_retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { asyncPool } from '@aztec/foundation/async-pool';
|
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { numToUInt32BE } from '@aztec/foundation/serialize';
|
|
7
7
|
import { ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
8
|
-
import { decodeFunctionData, getAbiItem, hexToBytes } from 'viem';
|
|
8
|
+
import { decodeFunctionData, getAbiItem, hexToBytes, } from 'viem';
|
|
9
9
|
import { NoBlobBodiesFoundError } from './errors.js';
|
|
10
10
|
/**
|
|
11
11
|
* Fetches new L2 blocks.
|
|
@@ -15,7 +15,8 @@ import { NoBlobBodiesFoundError } from './errors.js';
|
|
|
15
15
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
16
16
|
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
17
17
|
* @returns An array of block; as well as the next eth block to search from.
|
|
18
|
-
*/
|
|
18
|
+
*/
|
|
19
|
+
export async function retrieveBlocksFromRollup(rollup, publicClient, blobSinkClient, searchStartBlock, searchEndBlock, logger = createLogger('archiver')) {
|
|
19
20
|
const retrievedBlocks = [];
|
|
20
21
|
do {
|
|
21
22
|
if (searchStartBlock > searchEndBlock) {
|
|
@@ -23,8 +24,8 @@ import { NoBlobBodiesFoundError } from './errors.js';
|
|
|
23
24
|
}
|
|
24
25
|
const l2BlockProposedLogs = (await rollup.getEvents.L2BlockProposed({}, {
|
|
25
26
|
fromBlock: searchStartBlock,
|
|
26
|
-
toBlock: searchEndBlock
|
|
27
|
-
})).filter(
|
|
27
|
+
toBlock: searchEndBlock,
|
|
28
|
+
})).filter(log => log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
|
|
28
29
|
if (l2BlockProposedLogs.length === 0) {
|
|
29
30
|
break;
|
|
30
31
|
}
|
|
@@ -33,7 +34,7 @@ import { NoBlobBodiesFoundError } from './errors.js';
|
|
|
33
34
|
const newBlocks = await processL2BlockProposedLogs(rollup, publicClient, blobSinkClient, l2BlockProposedLogs, logger);
|
|
34
35
|
retrievedBlocks.push(...newBlocks);
|
|
35
36
|
searchStartBlock = lastLog.blockNumber + 1n;
|
|
36
|
-
}while (searchStartBlock <= searchEndBlock)
|
|
37
|
+
} while (searchStartBlock <= searchEndBlock);
|
|
37
38
|
return retrievedBlocks;
|
|
38
39
|
}
|
|
39
40
|
/**
|
|
@@ -42,41 +43,35 @@ import { NoBlobBodiesFoundError } from './errors.js';
|
|
|
42
43
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
43
44
|
* @param logs - L2BlockProposed logs.
|
|
44
45
|
* @returns - An array blocks.
|
|
45
|
-
*/
|
|
46
|
+
*/
|
|
47
|
+
export async function processL2BlockProposedLogs(rollup, publicClient, blobSinkClient, logs, logger) {
|
|
46
48
|
const retrievedBlocks = [];
|
|
47
|
-
await asyncPool(10, logs, async (log)=>{
|
|
49
|
+
await asyncPool(10, logs, async (log) => {
|
|
48
50
|
const l2BlockNumber = log.args.blockNumber;
|
|
49
51
|
const archive = log.args.archive;
|
|
50
|
-
const archiveFromChain = await rollup.read.archiveAt([
|
|
51
|
-
|
|
52
|
-
]);
|
|
53
|
-
const blobHashes = log.args.versionedBlobHashes.map((blobHash)=>Buffer.from(blobHash.slice(2), 'hex'));
|
|
52
|
+
const archiveFromChain = await rollup.read.archiveAt([l2BlockNumber]);
|
|
53
|
+
const blobHashes = log.args.versionedBlobHashes.map(blobHash => Buffer.from(blobHash.slice(2), 'hex'));
|
|
54
54
|
// The value from the event and contract will match only if the block is in the chain.
|
|
55
55
|
if (archive === archiveFromChain) {
|
|
56
56
|
const block = await getBlockFromRollupTx(publicClient, blobSinkClient, log.transactionHash, blobHashes, l2BlockNumber, rollup.address, logger);
|
|
57
57
|
const l1 = {
|
|
58
58
|
blockNumber: log.blockNumber,
|
|
59
59
|
blockHash: log.blockHash,
|
|
60
|
-
timestamp: await getL1BlockTime(publicClient, log.blockNumber)
|
|
60
|
+
timestamp: await getL1BlockTime(publicClient, log.blockNumber),
|
|
61
61
|
};
|
|
62
|
-
retrievedBlocks.push({
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
66
|
-
} else {
|
|
62
|
+
retrievedBlocks.push({ data: block, l1 });
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
67
65
|
logger.warn(`Ignoring L2 block ${l2BlockNumber} due to archive root mismatch`, {
|
|
68
66
|
actual: archive,
|
|
69
|
-
expected: archiveFromChain
|
|
67
|
+
expected: archiveFromChain,
|
|
70
68
|
});
|
|
71
69
|
}
|
|
72
70
|
});
|
|
73
71
|
return retrievedBlocks;
|
|
74
72
|
}
|
|
75
73
|
export async function getL1BlockTime(publicClient, blockNumber) {
|
|
76
|
-
const block = await publicClient.getBlock({
|
|
77
|
-
blockNumber,
|
|
78
|
-
includeTransactions: false
|
|
79
|
-
});
|
|
74
|
+
const block = await publicClient.getBlock({ blockNumber, includeTransactions: false });
|
|
80
75
|
return block.timestamp;
|
|
81
76
|
}
|
|
82
77
|
/**
|
|
@@ -84,11 +79,12 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
84
79
|
* @param forwarderData - The forwarder transaction input data
|
|
85
80
|
* @param rollupAddress - The address of the rollup contract
|
|
86
81
|
* @returns The calldata for the first 'propose' method call to the rollup contract
|
|
87
|
-
*/
|
|
82
|
+
*/
|
|
83
|
+
function extractRollupProposeCalldata(forwarderData, rollupAddress) {
|
|
88
84
|
// TODO(#11451): custom forwarders
|
|
89
85
|
const { functionName: forwarderFunctionName, args: forwarderArgs } = decodeFunctionData({
|
|
90
86
|
abi: ForwarderAbi,
|
|
91
|
-
data: forwarderData
|
|
87
|
+
data: forwarderData,
|
|
92
88
|
});
|
|
93
89
|
if (forwarderFunctionName !== 'forward') {
|
|
94
90
|
throw new Error(`Unexpected forwarder method called ${forwarderFunctionName}`);
|
|
@@ -99,7 +95,7 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
99
95
|
const [to, data] = forwarderArgs;
|
|
100
96
|
// Find all rollup calls
|
|
101
97
|
const rollupAddressLower = rollupAddress.toLowerCase();
|
|
102
|
-
for(let i = 0; i < to.length; i++){
|
|
98
|
+
for (let i = 0; i < to.length; i++) {
|
|
103
99
|
const addr = to[i];
|
|
104
100
|
if (addr.toLowerCase() !== rollupAddressLower) {
|
|
105
101
|
continue;
|
|
@@ -108,12 +104,14 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
108
104
|
try {
|
|
109
105
|
const { functionName: rollupFunctionName } = decodeFunctionData({
|
|
110
106
|
abi: RollupAbi,
|
|
111
|
-
data: callData
|
|
107
|
+
data: callData,
|
|
112
108
|
});
|
|
113
109
|
if (rollupFunctionName === 'propose') {
|
|
114
110
|
return callData;
|
|
115
111
|
}
|
|
116
|
-
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// Skip invalid function data
|
|
117
115
|
continue;
|
|
118
116
|
}
|
|
119
117
|
}
|
|
@@ -127,14 +125,14 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
127
125
|
* @param txHash - Hash of the tx that published it.
|
|
128
126
|
* @param l2BlockNum - L2 block number.
|
|
129
127
|
* @returns L2 block from the calldata, deserialized
|
|
130
|
-
*/
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
});
|
|
128
|
+
*/
|
|
129
|
+
async function getBlockFromRollupTx(publicClient, blobSinkClient, txHash, blobHashes, // WORKTODO(md): buffer32?
|
|
130
|
+
l2BlockNum, rollupAddress, logger) {
|
|
131
|
+
const { input: forwarderData, blockHash } = await publicClient.getTransaction({ hash: txHash });
|
|
134
132
|
const rollupData = extractRollupProposeCalldata(forwarderData, rollupAddress);
|
|
135
133
|
const { functionName: rollupFunctionName, args: rollupArgs } = decodeFunctionData({
|
|
136
134
|
abi: RollupAbi,
|
|
137
|
-
data: rollupData
|
|
135
|
+
data: rollupData,
|
|
138
136
|
});
|
|
139
137
|
if (rollupFunctionName !== 'propose') {
|
|
140
138
|
throw new Error(`Unexpected rollup method called ${rollupFunctionName}`);
|
|
@@ -150,11 +148,13 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
150
148
|
// Body.fromBlobFields to accept blob buffers directly
|
|
151
149
|
let blockFields;
|
|
152
150
|
try {
|
|
153
|
-
blockFields = blobBodies.flatMap(
|
|
154
|
-
}
|
|
151
|
+
blockFields = blobBodies.flatMap(b => b.toEncodedFields());
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
155
154
|
if (err instanceof BlobDeserializationError) {
|
|
156
155
|
logger.fatal(err.message);
|
|
157
|
-
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
158
|
logger.fatal('Unable to sync: failed to decode fetched blob, this blob was likely not created by us');
|
|
159
159
|
}
|
|
160
160
|
throw err;
|
|
@@ -183,8 +183,8 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
183
183
|
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
|
|
184
184
|
}
|
|
185
185
|
const archive = AppendOnlyTreeSnapshot.fromBuffer(Buffer.concat([
|
|
186
|
-
Buffer.from(hexToBytes(decodedArgs.archive)),
|
|
187
|
-
numToUInt32BE(Number(l2BlockNum + 1n))
|
|
186
|
+
Buffer.from(hexToBytes(decodedArgs.archive)), // L2Block.archive.root
|
|
187
|
+
numToUInt32BE(Number(l2BlockNum + 1n)), // L2Block.archive.nextAvailableLeafIndex
|
|
188
188
|
]));
|
|
189
189
|
return new L2Block(archive, header, blockBody);
|
|
190
190
|
}
|
|
@@ -196,7 +196,8 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
196
196
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
197
197
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
198
198
|
* @returns An array of InboxLeaf and next eth block to search from.
|
|
199
|
-
*/
|
|
199
|
+
*/
|
|
200
|
+
export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndBlock) {
|
|
200
201
|
const retrievedL1ToL2Messages = [];
|
|
201
202
|
do {
|
|
202
203
|
if (searchStartBlock > searchEndBlock) {
|
|
@@ -204,57 +205,48 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
204
205
|
}
|
|
205
206
|
const messageSentLogs = (await inbox.getEvents.MessageSent({}, {
|
|
206
207
|
fromBlock: searchStartBlock,
|
|
207
|
-
toBlock: searchEndBlock
|
|
208
|
-
})).filter(
|
|
208
|
+
toBlock: searchEndBlock,
|
|
209
|
+
})).filter(log => log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
|
|
209
210
|
if (messageSentLogs.length === 0) {
|
|
210
211
|
break;
|
|
211
212
|
}
|
|
212
|
-
for (const log of messageSentLogs){
|
|
213
|
+
for (const log of messageSentLogs) {
|
|
213
214
|
const { index, hash } = log.args;
|
|
214
215
|
retrievedL1ToL2Messages.push(new InboxLeaf(index, Fr.fromHexString(hash)));
|
|
215
216
|
}
|
|
216
217
|
// handles the case when there are no new messages:
|
|
217
|
-
searchStartBlock = (messageSentLogs.findLast(
|
|
218
|
-
}while (searchStartBlock <= searchEndBlock)
|
|
219
|
-
return {
|
|
220
|
-
lastProcessedL1BlockNumber: searchStartBlock - 1n,
|
|
221
|
-
retrievedData: retrievedL1ToL2Messages
|
|
222
|
-
};
|
|
218
|
+
searchStartBlock = (messageSentLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
|
|
219
|
+
} while (searchStartBlock <= searchEndBlock);
|
|
220
|
+
return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedL1ToL2Messages };
|
|
223
221
|
}
|
|
224
|
-
/** Retrieves L2ProofVerified events from the rollup contract. */
|
|
222
|
+
/** Retrieves L2ProofVerified events from the rollup contract. */
|
|
223
|
+
export async function retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
|
|
225
224
|
const logs = await publicClient.getLogs({
|
|
226
225
|
address: rollupAddress.toString(),
|
|
227
226
|
fromBlock: searchStartBlock,
|
|
228
227
|
toBlock: searchEndBlock ? searchEndBlock : undefined,
|
|
229
228
|
strict: true,
|
|
230
|
-
event: getAbiItem({
|
|
231
|
-
abi: RollupAbi,
|
|
232
|
-
name: 'L2ProofVerified'
|
|
233
|
-
})
|
|
229
|
+
event: getAbiItem({ abi: RollupAbi, name: 'L2ProofVerified' }),
|
|
234
230
|
});
|
|
235
|
-
return logs.map(
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
231
|
+
return logs.map(log => ({
|
|
232
|
+
l1BlockNumber: log.blockNumber,
|
|
233
|
+
l2BlockNumber: log.args.blockNumber,
|
|
234
|
+
proverId: Fr.fromHexString(log.args.proverId),
|
|
235
|
+
txHash: log.transactionHash,
|
|
236
|
+
}));
|
|
241
237
|
}
|
|
242
|
-
/** Retrieve submitted proofs from the rollup contract */
|
|
238
|
+
/** Retrieve submitted proofs from the rollup contract */
|
|
239
|
+
export async function retrieveL2ProofsFromRollup(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
|
|
243
240
|
const logs = await retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock);
|
|
244
241
|
const retrievedData = [];
|
|
245
242
|
const lastProcessedL1BlockNumber = logs.length > 0 ? logs.at(-1).l1BlockNumber : searchStartBlock - 1n;
|
|
246
|
-
for (const { txHash, proverId, l2BlockNumber } of logs){
|
|
243
|
+
for (const { txHash, proverId, l2BlockNumber } of logs) {
|
|
247
244
|
const proofData = await getProofFromSubmitProofTx(publicClient, txHash, proverId);
|
|
248
|
-
retrievedData.push({
|
|
249
|
-
proof: proofData.proof,
|
|
250
|
-
proverId: proofData.proverId,
|
|
251
|
-
l2BlockNumber,
|
|
252
|
-
txHash
|
|
253
|
-
});
|
|
245
|
+
retrievedData.push({ proof: proofData.proof, proverId: proofData.proverId, l2BlockNumber, txHash });
|
|
254
246
|
}
|
|
255
247
|
return {
|
|
256
248
|
retrievedData,
|
|
257
|
-
lastProcessedL1BlockNumber
|
|
249
|
+
lastProcessedL1BlockNumber,
|
|
258
250
|
};
|
|
259
251
|
}
|
|
260
252
|
/**
|
|
@@ -265,14 +257,10 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
265
257
|
* @param txHash - Hash of the tx that published it.
|
|
266
258
|
* @param l2BlockNum - L2 block number.
|
|
267
259
|
* @returns L2 block metadata (header and archive) from the calldata, deserialized
|
|
268
|
-
*/
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
});
|
|
272
|
-
const { functionName, args } = decodeFunctionData({
|
|
273
|
-
abi: RollupAbi,
|
|
274
|
-
data
|
|
275
|
-
});
|
|
260
|
+
*/
|
|
261
|
+
export async function getProofFromSubmitProofTx(publicClient, txHash, expectedProverId) {
|
|
262
|
+
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
263
|
+
const { functionName, args } = decodeFunctionData({ abi: RollupAbi, data });
|
|
276
264
|
let proverId;
|
|
277
265
|
let archiveRoot;
|
|
278
266
|
let aggregationObject;
|
|
@@ -283,7 +271,8 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
283
271
|
proverId = Fr.fromHexString(decodedArgs.args[6]);
|
|
284
272
|
archiveRoot = Fr.fromHexString(decodedArgs.args[1]);
|
|
285
273
|
proof = Proof.fromBuffer(Buffer.from(hexToBytes(decodedArgs.proof)));
|
|
286
|
-
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
287
276
|
throw new Error(`Unexpected proof method called ${functionName}`);
|
|
288
277
|
}
|
|
289
278
|
if (!proverId.equals(expectedProverId)) {
|
|
@@ -293,6 +282,7 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
293
282
|
proverId,
|
|
294
283
|
aggregationObject,
|
|
295
284
|
archiveRoot,
|
|
296
|
-
proof
|
|
285
|
+
proof,
|
|
297
286
|
};
|
|
298
287
|
}
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvZGF0YV9yZXRyaWV2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUd6RCxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQWlCLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdFLE9BQU8sRUFPTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUlyRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCLENBQzVDLE1BQW1GLEVBQ25GLFlBQTBCLEVBQzFCLGNBQXVDLEVBQ3ZDLGdCQUF3QixFQUN4QixjQUFzQixFQUN0QixTQUFpQixZQUFZLENBQUMsVUFBVSxDQUFDO0lBRXpDLE1BQU0sZUFBZSxHQUEyQixFQUFFLENBQUM7SUFDbkQsR0FBRyxDQUFDO1FBQ0YsSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxNQUFNO1FBQ1IsQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FDcEMsRUFBRSxFQUNGO1lBQ0UsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixPQUFPLEVBQUUsY0FBYztTQUN4QixDQUNGLENBQ0YsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBWSxJQUFJLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxXQUFZLElBQUksY0FBYyxDQUFDLENBQUM7UUFFNUYsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTTtRQUNSLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLEtBQUssQ0FDVixPQUFPLG1CQUFtQixDQUFDLE1BQU0sMENBQTBDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLHNCQUFzQixnQkFBZ0IsSUFBSSxjQUFjLEVBQUUsQ0FDek0sQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sMEJBQTBCLENBQ2hELE1BQU0sRUFDTixZQUFZLEVBQ1osY0FBYyxFQUNkLG1CQUFtQixFQUNuQixNQUFNLENBQ1AsQ0FBQztRQUNGLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNuQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsV0FBWSxHQUFHLEVBQUUsQ0FBQztJQUMvQyxDQUFDLFFBQVEsZ0JBQWdCLElBQUksY0FBYyxFQUFFO0lBQzdDLE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDBCQUEwQixDQUM5QyxNQUFtRixFQUNuRixZQUEwQixFQUMxQixjQUF1QyxFQUN2QyxJQUFzRSxFQUN0RSxNQUFjO0lBRWQsTUFBTSxlQUFlLEdBQTJCLEVBQUUsQ0FBQztJQUNuRCxNQUFNLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxHQUFHLEVBQUMsRUFBRTtRQUNwQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVksQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQVEsQ0FBQztRQUNsQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFeEcsc0ZBQXNGO1FBQ3RGLElBQUksT0FBTyxLQUFLLGdCQUFnQixFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxvQkFBb0IsQ0FDdEMsWUFBWSxFQUNaLGNBQWMsRUFDZCxHQUFHLENBQUMsZUFBZ0IsRUFDcEIsVUFBVSxFQUNWLGFBQWEsRUFDYixNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FDUCxDQUFDO1lBRUYsTUFBTSxFQUFFLEdBQW9CO2dCQUMxQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7Z0JBQzVCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztnQkFDeEIsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDO2FBQy9ELENBQUM7WUFFRixlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsYUFBYSwrQkFBK0IsRUFBRTtnQkFDN0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsUUFBUSxFQUFFLGdCQUFnQjthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsWUFBMEIsRUFBRSxXQUFtQjtJQUNsRixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RixPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FBQyxhQUFrQixFQUFFLGFBQWtCO0lBQzFFLGtDQUFrQztJQUNsQyxNQUFNLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQztRQUN0RixHQUFHLEVBQUUsWUFBWTtRQUNqQixJQUFJLEVBQUUsYUFBYTtLQUNwQixDQUFDLENBQUM7SUFFSCxJQUFJLHFCQUFxQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7SUFFakMsd0JBQXdCO0lBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRXZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDOUMsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxHQUFHLGtCQUFrQixDQUFDO2dCQUM5RCxHQUFHLEVBQUUsU0FBUztnQkFDZCxJQUFJLEVBQUUsUUFBUTthQUNmLENBQUMsQ0FBQztZQUVILElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDZCQUE2QjtZQUM3QixTQUFTO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxZQUEwQixFQUMxQixjQUF1QyxFQUN2QyxNQUFxQixFQUNyQixVQUFvQixFQUFFLDBCQUEwQjtBQUNoRCxVQUFrQixFQUNsQixhQUFrQixFQUNsQixNQUFjO0lBRWQsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFaEcsTUFBTSxVQUFVLEdBQUcsNEJBQTRCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLGtCQUFrQixDQUFDO1FBQ2hGLEdBQUcsRUFBRSxTQUFTO1FBQ2QsSUFBSSxFQUFFLFVBQVU7S0FDakIsQ0FBQyxDQUFDO0lBRUgsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxNQUFNLENBQUMsV0FBVyxFQUFFLEFBQUQsRUFBRyxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsVUFjNUMsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRixNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksc0JBQXNCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHNGQUFzRjtJQUN0RixzREFBc0Q7SUFDdEQsSUFBSSxXQUFpQixDQUFDO0lBQ3RCLElBQUksQ0FBQztRQUNILFdBQVcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsSUFBSSxHQUFHLFlBQVksd0JBQXdCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUZBQXVGLENBQUMsQ0FBQztRQUN4RyxDQUFDO1FBQ0QsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO0lBRUQsMEZBQTBGO0lBQzFGLHNGQUFzRjtJQUN0Riw4Q0FBOEM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEUsK0hBQStIO0lBQy9ILHNGQUFzRjtJQUN0Rix3RkFBd0Y7SUFDeEYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV6RixJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDaEUsNEZBQTRGO1FBQzVGLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsb0tBQW9LO0lBQ3BLLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUM5RCxxRkFBcUY7UUFDckYsaUhBQWlIO1FBQ2pILE1BQU0sSUFBSSxLQUFLLENBQ2Isb0RBQW9ELFVBQVUsaUJBQWlCLElBQUksQ0FBQywwQkFBMEIsQ0FDNUcsU0FBUyxDQUNWLFdBQVcsVUFBVSxFQUFFLENBQ3pCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUU1RSxJQUFJLHFCQUFxQixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLFVBQVUsWUFBWSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLHVCQUF1QjtRQUNyRSxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLHlDQUF5QztLQUNsRixDQUFDLENBQ0gsQ0FBQztJQUVGLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxLQUFpRixFQUNqRixnQkFBd0IsRUFDeEIsY0FBc0I7SUFFdEIsTUFBTSx1QkFBdUIsR0FBZ0IsRUFBRSxDQUFDO0lBQ2hELEdBQUcsQ0FBQztRQUNGLElBQUksZ0JBQWdCLEdBQUcsY0FBYyxFQUFFLENBQUM7WUFDdEMsTUFBTTtRQUNSLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxDQUN0QixNQUFNLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUMvQixFQUFFLEVBQ0Y7WUFDRSxTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLE9BQU8sRUFBRSxjQUFjO1NBQ3hCLENBQ0YsQ0FDRixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFZLElBQUksZ0JBQWdCLElBQUksR0FBRyxDQUFDLFdBQVksSUFBSSxjQUFjLENBQUMsQ0FBQztRQUU1RixJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTTtRQUNSLENBQUM7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNqQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsS0FBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsZ0JBQWdCLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFdBQVcsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMxRyxDQUFDLFFBQVEsZ0JBQWdCLElBQUksY0FBYyxFQUFFO0lBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxnQkFBZ0IsR0FBRyxFQUFFLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixFQUFFLENBQUM7QUFDdkcsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsS0FBSyxVQUFVLDZCQUE2QixDQUNqRCxZQUEwQixFQUMxQixhQUF5QixFQUN6QixnQkFBd0IsRUFDeEIsY0FBdUI7SUFFdkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFO1FBQ2pDLFNBQVMsRUFBRSxnQkFBZ0I7UUFDM0IsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3BELE1BQU0sRUFBRSxJQUFJO1FBQ1osS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7S0FDL0QsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVztRQUNuQyxRQUFRLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxDQUFDLGVBQWU7S0FDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLFlBQTBCLEVBQzFCLGFBQXlCLEVBQ3pCLGdCQUF3QixFQUN4QixjQUF1QjtJQUV2QixNQUFNLElBQUksR0FBRyxNQUFNLDZCQUE2QixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDaEgsTUFBTSxhQUFhLEdBQW1GLEVBQUUsQ0FBQztJQUN6RyxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFFeEcsS0FBSyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxNQUFNLHlCQUF5QixDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEYsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFDRCxPQUFPO1FBQ0wsYUFBYTtRQUNiLDBCQUEwQjtLQUMzQixDQUFDO0FBQ0osQ0FBQztBQVNEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsWUFBMEIsRUFDMUIsTUFBcUIsRUFDckIsZ0JBQW9CO0lBRXBCLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU1RSxJQUFJLFFBQVksQ0FBQztJQUNqQixJQUFJLFdBQWUsQ0FBQztJQUNwQixJQUFJLGlCQUF5QixDQUFDO0lBQzlCLElBQUksS0FBWSxDQUFDO0lBRWpCLElBQUksWUFBWSxLQUFLLHNCQUFzQixFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBUXJCLENBQUM7UUFFRixpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQzNFLFFBQVEsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxXQUFXLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxnQkFBZ0IsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCxPQUFPO1FBQ0wsUUFBUTtRQUNSLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsS0FBSztLQUNOLENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/archiver/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,UAAU,EAAE,MAAM;CAG/B"}
|
package/dest/archiver/errors.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export class NoBlobBodiesFoundError extends Error {
|
|
2
|
-
constructor(l2BlockNum){
|
|
2
|
+
constructor(l2BlockNum) {
|
|
3
3
|
super(`No blob bodies found for block ${l2BlockNum}`);
|
|
4
4
|
}
|
|
5
5
|
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsS0FBSztJQUMvQyxZQUFZLFVBQWtCO1FBQzVCLEtBQUssQ0FBQyxrQ0FBa0MsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './archiver.js';
|
|
2
|
+
export * from './config.js';
|
|
3
|
+
export { type L1Published, type L1PublishedData } from './structs/published.js';
|
|
4
|
+
export { MemoryArchiverStore } from './memory_archiver_store/memory_archiver_store.js';
|
|
5
|
+
export { ArchiverDataStore } from './archiver_store.js';
|
|
6
|
+
export { KVArchiverDataStore } from './kv_archiver_store/kv_archiver_store.js';
|
|
7
|
+
export { ContractInstanceStore } from './kv_archiver_store/contract_instance_store.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/archiver/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC"}
|
package/dest/archiver/index.js
CHANGED
|
@@ -3,3 +3,4 @@ export * from './config.js';
|
|
|
3
3
|
export { MemoryArchiverStore } from './memory_archiver_store/memory_archiver_store.js';
|
|
4
4
|
export { KVArchiverDataStore } from './kv_archiver_store/kv_archiver_store.js';
|
|
5
5
|
export { ContractInstanceStore } from './kv_archiver_store/contract_instance_store.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxhQUFhLENBQUM7QUFFNUIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFdkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUMifQ==
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type L2Block } from '@aztec/circuit-types';
|
|
2
|
+
import { type LmdbStatsCallback, type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
3
|
+
export declare class ArchiverInstrumentation {
|
|
4
|
+
private telemetry;
|
|
5
|
+
readonly tracer: Tracer;
|
|
6
|
+
private blockHeight;
|
|
7
|
+
private txCount;
|
|
8
|
+
private syncDuration;
|
|
9
|
+
private l1BlocksSynced;
|
|
10
|
+
private proofsSubmittedDelay;
|
|
11
|
+
private proofsSubmittedCount;
|
|
12
|
+
private dbMetrics;
|
|
13
|
+
private pruneCount;
|
|
14
|
+
private log;
|
|
15
|
+
private constructor();
|
|
16
|
+
static new(telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback): Promise<ArchiverInstrumentation>;
|
|
17
|
+
isEnabled(): boolean;
|
|
18
|
+
processNewBlocks(syncTimePerBlock: number, blocks: L2Block[]): void;
|
|
19
|
+
processPrune(): void;
|
|
20
|
+
updateLastProvenBlock(blockNumber: number): void;
|
|
21
|
+
processProofsVerified(logs: {
|
|
22
|
+
proverId: string;
|
|
23
|
+
l2BlockNumber: bigint;
|
|
24
|
+
delay: bigint;
|
|
25
|
+
}[]): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/archiver/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IAcd,OAAO,CAAC,SAAS;IAbrC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO;WAiDa,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,iBAAiB;IAU1E,SAAS,IAAI,OAAO;IAIpB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAS5D,YAAY;IAIZ,qBAAqB,CAAC,WAAW,EAAE,MAAM;IAIzC,qBAAqB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;CAYhG"}
|