@aztec/archiver 0.0.1-commit.96bb3f7 → 0.0.1-commit.993d240
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/README.md +164 -22
- package/dest/archiver.d.ts +158 -0
- package/dest/archiver.d.ts.map +1 -0
- package/dest/archiver.js +881 -0
- package/dest/config.d.ts +33 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/{archiver/config.js → config.js} +31 -14
- package/dest/errors.d.ts +87 -0
- package/dest/errors.d.ts.map +1 -0
- package/dest/errors.js +129 -0
- package/dest/factory.d.ts +16 -10
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +112 -20
- package/dest/index.d.ts +19 -4
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +17 -3
- package/dest/interfaces.d.ts +9 -0
- package/dest/interfaces.d.ts.map +1 -0
- package/dest/interfaces.js +3 -0
- package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.d.ts +1 -1
- package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.js +35 -32
- package/dest/l1/calldata_retriever.d.ts +136 -0
- package/dest/l1/calldata_retriever.d.ts.map +1 -0
- package/dest/l1/calldata_retriever.js +412 -0
- package/dest/l1/data_retrieval.d.ts +97 -0
- package/dest/l1/data_retrieval.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/data_retrieval.js +65 -89
- package/dest/{archiver/l1 → l1}/debug_tx.d.ts +1 -1
- package/dest/l1/debug_tx.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/spire_proposer.d.ts +5 -5
- package/dest/l1/spire_proposer.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/spire_proposer.js +9 -17
- package/dest/l1/trace_tx.d.ts +43 -0
- package/dest/l1/trace_tx.d.ts.map +1 -0
- package/dest/l1/types.d.ts +12 -0
- package/dest/l1/types.d.ts.map +1 -0
- package/dest/l1/validate_historical_logs.d.ts +23 -0
- package/dest/l1/validate_historical_logs.d.ts.map +1 -0
- package/dest/l1/validate_historical_logs.js +108 -0
- package/dest/{archiver/l1 → l1}/validate_trace.d.ts +6 -3
- package/dest/l1/validate_trace.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/validate_trace.js +13 -9
- package/dest/modules/contract_data_source_adapter.d.ts +25 -0
- package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
- package/dest/modules/contract_data_source_adapter.js +40 -0
- package/dest/modules/data_source_base.d.ts +113 -0
- package/dest/modules/data_source_base.d.ts.map +1 -0
- package/dest/modules/data_source_base.js +351 -0
- package/dest/modules/data_store_updater.d.ts +105 -0
- package/dest/modules/data_store_updater.d.ts.map +1 -0
- package/dest/modules/data_store_updater.js +392 -0
- package/dest/modules/instrumentation.d.ts +55 -0
- package/dest/modules/instrumentation.d.ts.map +1 -0
- package/dest/{archiver → modules}/instrumentation.js +61 -19
- package/dest/modules/l1_synchronizer.d.ts +77 -0
- package/dest/modules/l1_synchronizer.d.ts.map +1 -0
- package/dest/modules/l1_synchronizer.js +1344 -0
- package/dest/modules/validation.d.ts +18 -0
- package/dest/modules/validation.d.ts.map +1 -0
- package/dest/{archiver → modules}/validation.js +12 -6
- package/dest/store/block_store.d.ts +300 -0
- package/dest/store/block_store.d.ts.map +1 -0
- package/dest/store/block_store.js +1219 -0
- package/dest/store/contract_class_store.d.ts +31 -0
- package/dest/store/contract_class_store.d.ts.map +1 -0
- package/dest/store/contract_class_store.js +80 -0
- package/dest/store/contract_instance_store.d.ts +51 -0
- package/dest/store/contract_instance_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +38 -3
- package/dest/store/data_stores.d.ts +68 -0
- package/dest/store/data_stores.d.ts.map +1 -0
- package/dest/store/data_stores.js +54 -0
- package/dest/store/function_names_cache.d.ts +17 -0
- package/dest/store/function_names_cache.d.ts.map +1 -0
- package/dest/store/function_names_cache.js +30 -0
- package/dest/store/l2_tips_cache.d.ts +25 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +26 -0
- package/dest/store/log_store.d.ts +59 -0
- package/dest/store/log_store.d.ts.map +1 -0
- package/dest/store/log_store.js +310 -0
- package/dest/store/log_store_codec.d.ts +70 -0
- package/dest/store/log_store_codec.d.ts.map +1 -0
- package/dest/store/log_store_codec.js +101 -0
- package/dest/store/message_store.d.ts +50 -0
- package/dest/store/message_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/message_store.js +51 -9
- package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
- package/dest/structs/data_retrieval.d.ts.map +1 -0
- package/dest/structs/inbox_message.d.ts +15 -0
- package/dest/structs/inbox_message.d.ts.map +1 -0
- package/dest/{archiver/structs → structs}/published.d.ts +1 -1
- package/dest/structs/published.d.ts.map +1 -0
- package/dest/test/fake_l1_state.d.ts +214 -0
- package/dest/test/fake_l1_state.d.ts.map +1 -0
- package/dest/test/fake_l1_state.js +517 -0
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +4 -1
- package/dest/test/mock_archiver.d.ts +2 -2
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +3 -3
- package/dest/test/mock_l1_to_l2_message_source.d.ts +1 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +2 -1
- package/dest/test/mock_l2_block_source.d.ts +65 -41
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +330 -151
- package/dest/test/mock_structs.d.ts +81 -3
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +152 -7
- package/dest/test/noop_l1_archiver.d.ts +29 -0
- package/dest/test/noop_l1_archiver.d.ts.map +1 -0
- package/dest/test/noop_l1_archiver.js +85 -0
- package/package.json +17 -18
- package/src/archiver.ts +681 -0
- package/src/{archiver/config.ts → config.ts} +43 -12
- package/src/errors.ts +203 -0
- package/src/factory.ts +175 -22
- package/src/index.ts +27 -3
- package/src/interfaces.ts +9 -0
- package/src/l1/README.md +55 -0
- package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +45 -33
- package/src/l1/calldata_retriever.ts +522 -0
- package/src/{archiver/l1 → l1}/data_retrieval.ts +106 -134
- package/src/{archiver/l1 → l1}/spire_proposer.ts +7 -15
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/{archiver/l1 → l1}/validate_trace.ts +24 -6
- package/src/modules/contract_data_source_adapter.ts +55 -0
- package/src/modules/data_source_base.ts +493 -0
- package/src/modules/data_store_updater.ts +518 -0
- package/src/{archiver → modules}/instrumentation.ts +72 -20
- package/src/modules/l1_synchronizer.ts +1257 -0
- package/src/{archiver → modules}/validation.ts +15 -9
- package/src/store/block_store.ts +1590 -0
- package/src/store/contract_class_store.ts +108 -0
- package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +52 -6
- package/src/store/data_stores.ts +104 -0
- package/src/store/function_names_cache.ts +37 -0
- package/src/store/l2_tips_cache.ts +35 -0
- package/src/store/log_store.ts +379 -0
- package/src/store/log_store_codec.ts +132 -0
- package/src/{archiver/kv_archiver_store → store}/message_store.ts +60 -10
- package/src/{archiver/structs → structs}/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +770 -0
- package/src/test/index.ts +4 -0
- package/src/test/mock_archiver.ts +4 -3
- package/src/test/mock_l1_to_l2_message_source.ts +1 -0
- package/src/test/mock_l2_block_source.ts +403 -171
- package/src/test/mock_structs.ts +283 -8
- package/src/test/noop_l1_archiver.ts +139 -0
- package/dest/archiver/archiver.d.ts +0 -307
- package/dest/archiver/archiver.d.ts.map +0 -1
- package/dest/archiver/archiver.js +0 -2102
- package/dest/archiver/archiver_store.d.ts +0 -315
- package/dest/archiver/archiver_store.d.ts.map +0 -1
- package/dest/archiver/archiver_store.js +0 -4
- package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
- package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
- package/dest/archiver/archiver_store_test_suite.js +0 -2770
- package/dest/archiver/config.d.ts +0 -22
- package/dest/archiver/config.d.ts.map +0 -1
- package/dest/archiver/errors.d.ts +0 -36
- package/dest/archiver/errors.d.ts.map +0 -1
- package/dest/archiver/errors.js +0 -54
- package/dest/archiver/index.d.ts +0 -7
- package/dest/archiver/index.d.ts.map +0 -1
- package/dest/archiver/index.js +0 -4
- package/dest/archiver/instrumentation.d.ts +0 -37
- package/dest/archiver/instrumentation.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -164
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_store.js +0 -626
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_class_store.js +0 -120
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -159
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -316
- package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -45
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/log_store.js +0 -401
- package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -40
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
- package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +0 -1
- package/dest/archiver/l1/calldata_retriever.d.ts +0 -112
- package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
- package/dest/archiver/l1/calldata_retriever.js +0 -471
- package/dest/archiver/l1/data_retrieval.d.ts +0 -90
- package/dest/archiver/l1/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/l1/debug_tx.d.ts.map +0 -1
- package/dest/archiver/l1/spire_proposer.d.ts.map +0 -1
- package/dest/archiver/l1/trace_tx.d.ts +0 -97
- package/dest/archiver/l1/trace_tx.d.ts.map +0 -1
- package/dest/archiver/l1/types.d.ts +0 -12
- package/dest/archiver/l1/types.d.ts.map +0 -1
- package/dest/archiver/l1/validate_trace.d.ts.map +0 -1
- package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/structs/inbox_message.d.ts +0 -15
- package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
- package/dest/archiver/structs/published.d.ts.map +0 -1
- package/dest/archiver/validation.d.ts +0 -17
- package/dest/archiver/validation.d.ts.map +0 -1
- package/dest/rpc/index.d.ts +0 -9
- package/dest/rpc/index.d.ts.map +0 -1
- package/dest/rpc/index.js +0 -15
- package/src/archiver/archiver.ts +0 -2265
- package/src/archiver/archiver_store.ts +0 -380
- package/src/archiver/archiver_store_test_suite.ts +0 -2842
- package/src/archiver/errors.ts +0 -90
- package/src/archiver/index.ts +0 -6
- package/src/archiver/kv_archiver_store/block_store.ts +0 -850
- package/src/archiver/kv_archiver_store/contract_class_store.ts +0 -176
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -442
- package/src/archiver/kv_archiver_store/log_store.ts +0 -516
- package/src/archiver/l1/README.md +0 -98
- package/src/archiver/l1/calldata_retriever.ts +0 -641
- package/src/rpc/index.ts +0 -16
- /package/dest/{archiver/l1 → l1}/debug_tx.js +0 -0
- /package/dest/{archiver/l1 → l1}/trace_tx.js +0 -0
- /package/dest/{archiver/l1 → l1}/types.js +0 -0
- /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
- /package/dest/{archiver/structs → structs}/inbox_message.js +0 -0
- /package/dest/{archiver/structs → structs}/published.js +0 -0
- /package/src/{archiver/l1 → l1}/debug_tx.ts +0 -0
- /package/src/{archiver/l1 → l1}/trace_tx.ts +0 -0
- /package/src/{archiver/l1 → l1}/types.ts +0 -0
- /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
- /package/src/{archiver/structs → structs}/published.ts +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { callTraceSchema } from './debug_tx.js';
|
|
3
3
|
import { traceTransactionResponseSchema } from './trace_tx.js';
|
|
4
|
-
const logger = createLogger('aztec:archiver:validate_trace');
|
|
5
4
|
/**
|
|
6
5
|
* Helper function to test a trace method with validation
|
|
7
6
|
*
|
|
@@ -10,8 +9,9 @@ const logger = createLogger('aztec:archiver:validate_trace');
|
|
|
10
9
|
* @param schema - Zod schema to validate the response
|
|
11
10
|
* @param method - Name of the RPC method ('debug_traceTransaction' or 'trace_transaction')
|
|
12
11
|
* @param blockType - Type of block being tested ('recent' or 'old')
|
|
12
|
+
* @param logger - Logger instance
|
|
13
13
|
* @returns true if the method works and validation passes, false otherwise
|
|
14
|
-
*/ async function testTraceMethod(client, txHash, schema, method, blockType) {
|
|
14
|
+
*/ async function testTraceMethod(client, txHash, schema, method, blockType, logger) {
|
|
15
15
|
try {
|
|
16
16
|
// Make request with appropriate params based on method name
|
|
17
17
|
const result = await client.request(method === 'debug_traceTransaction' ? {
|
|
@@ -40,8 +40,10 @@ const logger = createLogger('aztec:archiver:validate_trace');
|
|
|
40
40
|
* Validates the availability of debug/trace methods on the Ethereum client.
|
|
41
41
|
*
|
|
42
42
|
* @param client - The Viem public debug client
|
|
43
|
+
* @param bindings - Optional logger bindings for context
|
|
43
44
|
* @returns Object indicating which trace methods are available for recent and old blocks
|
|
44
|
-
*/ export async function validateTraceAvailability(client) {
|
|
45
|
+
*/ export async function validateTraceAvailability(client, bindings) {
|
|
46
|
+
const logger = createLogger('archiver:validate_trace', bindings);
|
|
45
47
|
const result = {
|
|
46
48
|
debugTraceRecent: false,
|
|
47
49
|
traceTransactionRecent: false,
|
|
@@ -68,9 +70,9 @@ const logger = createLogger('aztec:archiver:validate_trace');
|
|
|
68
70
|
// Get a transaction from the found block
|
|
69
71
|
const recentTxHash = latestBlock.transactions[0];
|
|
70
72
|
// Test debug_traceTransaction with recent block
|
|
71
|
-
result.debugTraceRecent = await testTraceMethod(client, recentTxHash, callTraceSchema, 'debug_traceTransaction', 'recent');
|
|
73
|
+
result.debugTraceRecent = await testTraceMethod(client, recentTxHash, callTraceSchema, 'debug_traceTransaction', 'recent', logger);
|
|
72
74
|
// Test trace_transaction with recent block
|
|
73
|
-
result.traceTransactionRecent = await testTraceMethod(client, recentTxHash, traceTransactionResponseSchema, 'trace_transaction', 'recent');
|
|
75
|
+
result.traceTransactionRecent = await testTraceMethod(client, recentTxHash, traceTransactionResponseSchema, 'trace_transaction', 'recent', logger);
|
|
74
76
|
// Get a block from 512 blocks ago
|
|
75
77
|
const oldBlockNumber = latestBlock.number ? latestBlock.number - 512n : null;
|
|
76
78
|
if (!oldBlockNumber || oldBlockNumber < 0n) {
|
|
@@ -94,9 +96,9 @@ const logger = createLogger('aztec:archiver:validate_trace');
|
|
|
94
96
|
}
|
|
95
97
|
const oldTxHash = oldBlock.transactions[0];
|
|
96
98
|
// Test debug_traceTransaction with old block
|
|
97
|
-
result.debugTraceOld = await testTraceMethod(client, oldTxHash, callTraceSchema, 'debug_traceTransaction', 'old');
|
|
99
|
+
result.debugTraceOld = await testTraceMethod(client, oldTxHash, callTraceSchema, 'debug_traceTransaction', 'old', logger);
|
|
98
100
|
// Test trace_transaction with old block
|
|
99
|
-
result.traceTransactionOld = await testTraceMethod(client, oldTxHash, traceTransactionResponseSchema, 'trace_transaction', 'old');
|
|
101
|
+
result.traceTransactionOld = await testTraceMethod(client, oldTxHash, traceTransactionResponseSchema, 'trace_transaction', 'old', logger);
|
|
100
102
|
} catch (error) {
|
|
101
103
|
logger.warn(`Error validating debug_traceTransaction and trace_transaction availability: ${error}`);
|
|
102
104
|
}
|
|
@@ -111,10 +113,12 @@ function hasTxs(block) {
|
|
|
111
113
|
*
|
|
112
114
|
* @param client - The Viem public debug client
|
|
113
115
|
* @param ethereumAllowNoDebugHosts - If false, throws an error when no trace methods are available
|
|
116
|
+
* @param bindings - Optional logger bindings for context
|
|
114
117
|
* @throws Error if ethereumAllowNoDebugHosts is false and no trace methods are available
|
|
115
|
-
*/ export async function validateAndLogTraceAvailability(client, ethereumAllowNoDebugHosts) {
|
|
118
|
+
*/ export async function validateAndLogTraceAvailability(client, ethereumAllowNoDebugHosts, bindings) {
|
|
119
|
+
const logger = createLogger('archiver:validate_trace', bindings);
|
|
116
120
|
logger.debug('Validating trace/debug method availability...');
|
|
117
|
-
const availability = await validateTraceAvailability(client);
|
|
121
|
+
const availability = await validateTraceAvailability(client, bindings);
|
|
118
122
|
// Check if we have support for old blocks (either debug or trace)
|
|
119
123
|
const hasOldBlockSupport = availability.debugTraceOld || availability.traceTransactionOld;
|
|
120
124
|
if (hasOldBlockSupport) {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
4
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
6
|
+
import type { UInt64 } from '@aztec/stdlib/types';
|
|
7
|
+
import type { ArchiverDataStores } from '../store/data_stores.js';
|
|
8
|
+
/**
|
|
9
|
+
* Thin {@link ContractDataSource} adapter over {@link ArchiverDataStores}.
|
|
10
|
+
*
|
|
11
|
+
* Used by contexts (e.g. offline epoch re-prover tools) that need a ContractDataSource
|
|
12
|
+
* but do not need a full archiver instance.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ArchiverContractDataSourceAdapter implements ContractDataSource {
|
|
15
|
+
private readonly stores;
|
|
16
|
+
constructor(stores: ArchiverDataStores);
|
|
17
|
+
getBlockNumber(): Promise<BlockNumber>;
|
|
18
|
+
getContractClass(id: Fr): Promise<ContractClassPublic | undefined>;
|
|
19
|
+
getBytecodeCommitment(id: Fr): Promise<Fr | undefined>;
|
|
20
|
+
getContract(address: AztecAddress, maybeTimestamp?: UInt64): Promise<ContractInstanceWithAddress | undefined>;
|
|
21
|
+
getContractClassIds(): Promise<Fr[]>;
|
|
22
|
+
getDebugFunctionName(_address: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
|
|
23
|
+
registerContractFunctionSignatures(signatures: string[]): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfZGF0YV9zb3VyY2VfYWRhcHRlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZXMvY29udHJhY3RfZGF0YV9zb3VyY2VfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkgsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRTs7Ozs7R0FLRztBQUNILHFCQUFhLGlDQUFrQyxZQUFXLGtCQUFrQjtJQUM5RCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFBbkMsWUFBNkIsTUFBTSxFQUFFLGtCQUFrQixFQUFJO0lBRXBELGNBQWMsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLENBRTVDO0lBRU0sZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBRXhFO0lBRU0scUJBQXFCLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUU1RDtJQUVZLFdBQVcsQ0FDdEIsT0FBTyxFQUFFLFlBQVksRUFDckIsY0FBYyxDQUFDLEVBQUUsTUFBTSxHQUN0QixPQUFPLENBQUMsMkJBQTJCLEdBQUcsU0FBUyxDQUFDLENBUWxEO0lBRU0sbUJBQW1CLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBRTFDO0lBRU0sb0JBQW9CLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FFM0c7SUFFTSxrQ0FBa0MsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUU3RTtDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract_data_source_adapter.d.ts","sourceRoot":"","sources":["../../src/modules/contract_data_source_adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACnH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,iCAAkC,YAAW,kBAAkB;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,kBAAkB,EAAI;IAEpD,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAE5C;IAEM,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAExE;IAEM,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAE5D;IAEY,WAAW,CACtB,OAAO,EAAE,YAAY,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAQlD;IAEM,mBAAmB,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAE1C;IAEM,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE3G;IAEM,kCAAkC,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin {@link ContractDataSource} adapter over {@link ArchiverDataStores}.
|
|
3
|
+
*
|
|
4
|
+
* Used by contexts (e.g. offline epoch re-prover tools) that need a ContractDataSource
|
|
5
|
+
* but do not need a full archiver instance.
|
|
6
|
+
*/ export class ArchiverContractDataSourceAdapter {
|
|
7
|
+
stores;
|
|
8
|
+
constructor(stores){
|
|
9
|
+
this.stores = stores;
|
|
10
|
+
}
|
|
11
|
+
getBlockNumber() {
|
|
12
|
+
return this.stores.blocks.getLatestL2BlockNumber();
|
|
13
|
+
}
|
|
14
|
+
getContractClass(id) {
|
|
15
|
+
return this.stores.contractClasses.getContractClass(id);
|
|
16
|
+
}
|
|
17
|
+
getBytecodeCommitment(id) {
|
|
18
|
+
return this.stores.contractClasses.getBytecodeCommitment(id);
|
|
19
|
+
}
|
|
20
|
+
async getContract(address, maybeTimestamp) {
|
|
21
|
+
let timestamp = maybeTimestamp;
|
|
22
|
+
if (timestamp === undefined) {
|
|
23
|
+
const latest = await this.stores.blocks.getLatestL2BlockNumber();
|
|
24
|
+
const blockData = latest > 0 ? await this.stores.blocks.getBlockData({
|
|
25
|
+
number: latest
|
|
26
|
+
}) : undefined;
|
|
27
|
+
timestamp = blockData ? blockData.header.globalVariables.timestamp : 0n;
|
|
28
|
+
}
|
|
29
|
+
return this.stores.contractInstances.getContractInstance(address, timestamp);
|
|
30
|
+
}
|
|
31
|
+
getContractClassIds() {
|
|
32
|
+
return this.stores.contractClasses.getContractClassIds();
|
|
33
|
+
}
|
|
34
|
+
getDebugFunctionName(_address, selector) {
|
|
35
|
+
return Promise.resolve(this.stores.functionNames.get(selector));
|
|
36
|
+
}
|
|
37
|
+
registerContractFunctionSignatures(signatures) {
|
|
38
|
+
return this.stores.functionNames.register(signatures);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { BlockNumber, CheckpointNumber, type EpochNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
+
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
5
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
|
+
import { type BlockData, type BlockHash, type BlockQuery, type BlocksQuery, type CheckpointQuery, type CheckpointsQuery, L2Block, type L2Tips, type ProposedCheckpointQuery } from '@aztec/stdlib/block';
|
|
7
|
+
import { type CheckpointData, type ProposedCheckpointData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
8
|
+
import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
9
|
+
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
10
|
+
import type { L2LogsSource } from '@aztec/stdlib/interfaces/server';
|
|
11
|
+
import type { LogResult, PrivateLogsQuery, PublicLogsQuery } from '@aztec/stdlib/logs';
|
|
12
|
+
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
13
|
+
import type { BlockHeader, IndexedTxEffect, TxHash, TxReceipt } from '@aztec/stdlib/tx';
|
|
14
|
+
import type { UInt64 } from '@aztec/stdlib/types';
|
|
15
|
+
import type { ArchiverDataSource } from '../interfaces.js';
|
|
16
|
+
import type { ArchiverDataStores } from '../store/data_stores.js';
|
|
17
|
+
import type { ValidateCheckpointResult } from './validation.js';
|
|
18
|
+
/**
|
|
19
|
+
* Abstract base class implementing ArchiverDataSource using a bundle of archiver substores.
|
|
20
|
+
* Provides implementations for all read-side methods and declares abstract methods for
|
|
21
|
+
* L1-dependent functionality that subclasses must implement.
|
|
22
|
+
*/
|
|
23
|
+
export declare abstract class ArchiverDataSourceBase implements ArchiverDataSource, L2LogsSource, ContractDataSource, L1ToL2MessageSource {
|
|
24
|
+
protected readonly stores: ArchiverDataStores;
|
|
25
|
+
protected readonly l1Constants: L1RollupConstants | undefined;
|
|
26
|
+
/** The injected genesis block header. */
|
|
27
|
+
protected readonly initialHeader: BlockHeader;
|
|
28
|
+
/** Precomputed hash of the initial header, exposed via {@link getGenesisBlockHash}. */
|
|
29
|
+
protected readonly initialBlockHash: BlockHash;
|
|
30
|
+
/** Archive root after block 0 was appended — read from L1 (`Rollup.getGenesisArchiveTreeRoot`). */
|
|
31
|
+
protected readonly genesisArchiveRoot: Fr;
|
|
32
|
+
/** Memoized synthetic genesis block — callers rely on referential identity for caching. */
|
|
33
|
+
private readonly genesisBlock;
|
|
34
|
+
/** Memoized synthetic genesis block data — kept consistent with {@link genesisBlock}. */
|
|
35
|
+
private readonly genesisBlockData;
|
|
36
|
+
constructor(stores: ArchiverDataStores, l1Constants: L1RollupConstants | undefined, initialHeader: BlockHeader, initialBlockHash: BlockHash, genesisArchiveRoot: Fr);
|
|
37
|
+
/** Returns the precomputed hash of the genesis block header. */
|
|
38
|
+
getGenesisBlockHash(): BlockHash;
|
|
39
|
+
/** Returns the synthetic genesis L2Block (memoized — same instance across calls). */
|
|
40
|
+
private getGenesisBlock;
|
|
41
|
+
/** Returns genesis block data (memoized — same instance across calls). */
|
|
42
|
+
private getGenesisBlockData;
|
|
43
|
+
/**
|
|
44
|
+
* Type guard distinguishing the genesis sentinel from a {@link ResolvedBlockQuery}.
|
|
45
|
+
* `resolveBlockQuery` already rewrites every genesis-matching shape to the sentinel,
|
|
46
|
+
* so callers only need this single sync check.
|
|
47
|
+
*/
|
|
48
|
+
private isGenesisBlockQuery;
|
|
49
|
+
abstract getRollupAddress(): Promise<EthAddress>;
|
|
50
|
+
abstract getRegistryAddress(): Promise<EthAddress>;
|
|
51
|
+
abstract getL1Constants(): Promise<L1RollupConstants>;
|
|
52
|
+
abstract getGenesisValues(): Promise<{
|
|
53
|
+
genesisArchiveRoot: Fr;
|
|
54
|
+
}>;
|
|
55
|
+
abstract getL1Timestamp(): Promise<bigint | undefined>;
|
|
56
|
+
abstract getL2Tips(): Promise<L2Tips>;
|
|
57
|
+
abstract getSyncedL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
58
|
+
abstract getSyncedL2EpochNumber(): Promise<EpochNumber | undefined>;
|
|
59
|
+
abstract isEpochComplete(epochNumber: EpochNumber): Promise<boolean>;
|
|
60
|
+
abstract syncImmediate(): Promise<void>;
|
|
61
|
+
isPruneDueAtSlot(slot: SlotNumber): Promise<boolean>;
|
|
62
|
+
getCheckpointNumber(): Promise<CheckpointNumber>;
|
|
63
|
+
getProvenCheckpointNumber(): Promise<CheckpointNumber>;
|
|
64
|
+
getBlockNumber(): Promise<BlockNumber>;
|
|
65
|
+
getBlockNumber(query: BlockQuery): Promise<BlockNumber | undefined>;
|
|
66
|
+
/**
|
|
67
|
+
* Resolves a {@link CheckpointQuery} to a concrete `CheckpointNumber`, or undefined when the
|
|
68
|
+
* query refers to a position that has no checkpoint yet (e.g. `{ slot }` not found).
|
|
69
|
+
*/
|
|
70
|
+
private resolveCheckpointQuery;
|
|
71
|
+
private resolveCheckpointsQuery;
|
|
72
|
+
getCheckpoint(query: CheckpointQuery): Promise<PublishedCheckpoint | undefined>;
|
|
73
|
+
getCheckpoints(query: CheckpointsQuery): Promise<PublishedCheckpoint[]>;
|
|
74
|
+
getCheckpointData(query: CheckpointQuery): Promise<CheckpointData | undefined>;
|
|
75
|
+
getCheckpointsData(query: CheckpointsQuery): Promise<CheckpointData[]>;
|
|
76
|
+
getProposedCheckpointData(query?: ProposedCheckpointQuery): Promise<ProposedCheckpointData | undefined>;
|
|
77
|
+
getTxEffect(txHash: TxHash): Promise<IndexedTxEffect | undefined>;
|
|
78
|
+
getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
|
|
79
|
+
isPendingChainInvalid(): Promise<boolean>;
|
|
80
|
+
getPendingChainValidationStatus(): Promise<ValidateCheckpointResult>;
|
|
81
|
+
getPrivateLogsByTags(query: PrivateLogsQuery): Promise<LogResult[][]>;
|
|
82
|
+
getPublicLogsByTags(query: PublicLogsQuery): Promise<LogResult[][]>;
|
|
83
|
+
getContractClass(id: Fr): Promise<ContractClassPublic | undefined>;
|
|
84
|
+
getBytecodeCommitment(id: Fr): Promise<Fr | undefined>;
|
|
85
|
+
getContract(address: AztecAddress, maybeTimestamp?: UInt64): Promise<ContractInstanceWithAddress | undefined>;
|
|
86
|
+
getContractClassIds(): Promise<Fr[]>;
|
|
87
|
+
/** Looks up a public function name given a selector. */
|
|
88
|
+
getDebugFunctionName(_address: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
|
|
89
|
+
/** Register public function signatures so they can be looked up by selector. */
|
|
90
|
+
registerContractFunctionSignatures(signatures: string[]): Promise<void>;
|
|
91
|
+
getL1ToL2Messages(checkpointNumber: CheckpointNumber): Promise<Fr[]>;
|
|
92
|
+
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined>;
|
|
93
|
+
private getPublishedCheckpointFromCheckpointData;
|
|
94
|
+
getBlocksForSlot(slotNumber: SlotNumber): Promise<L2Block[]>;
|
|
95
|
+
/** Returns just the checkpoint numbers for all checkpoints whose slot falls within the given epoch. */
|
|
96
|
+
private getCheckpointNumbersForEpoch;
|
|
97
|
+
getBlock(query: BlockQuery): Promise<L2Block | undefined>;
|
|
98
|
+
/**
|
|
99
|
+
* Range queries iterate physical blocks only; the genesis block is NOT prepended.
|
|
100
|
+
* `L2BlockStream` consumers (`world-state.handleL2Blocks`, etc.) emit `blocks-added` events for
|
|
101
|
+
* real blocks and would be surprised by a synthetic block 0. Use {@link getBlock} or
|
|
102
|
+
* {@link getBlockData} for genesis-aware single-block lookups.
|
|
103
|
+
*/
|
|
104
|
+
getBlocks(query: BlocksQuery): Promise<L2Block[]>;
|
|
105
|
+
getBlockData(query: BlockQuery): Promise<BlockData | undefined>;
|
|
106
|
+
/** See {@link getBlocks} — range queries do not prepend the genesis block. */
|
|
107
|
+
getBlocksData(query: BlocksQuery): Promise<BlockData[]>;
|
|
108
|
+
private resolveBlockQuery;
|
|
109
|
+
/** Maps a {@link BlockTag} to the matching block number for the current chain state. */
|
|
110
|
+
private resolveBlockTag;
|
|
111
|
+
private resolveBlocksQuery;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9zb3VyY2VfYmFzZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZXMvZGF0YV9zb3VyY2VfYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixLQUFLLFdBQVcsRUFFaEIsS0FBSyxVQUFVLEVBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxTQUFTLEVBQ2QsS0FBSyxTQUFTLEVBQ2QsS0FBSyxVQUFVLEVBRWYsS0FBSyxXQUFXLEVBRWhCLEtBQUssZUFBZSxFQUNwQixLQUFLLGdCQUFnQixFQUNyQixPQUFPLEVBQ1AsS0FBSyxNQUFNLEVBQ1gsS0FBSyx1QkFBdUIsRUFDN0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBRUwsS0FBSyxjQUFjLEVBQ25CLEtBQUssc0JBQXNCLEVBQzNCLG1CQUFtQixFQUNwQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkgsT0FBTyxFQUNMLEtBQUssaUJBQWlCLEVBTXZCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9C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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data_source_base.d.ts","sourceRoot":"","sources":["../../src/modules/data_source_base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
|
+
import { BlockNumber, CheckpointNumber, IndexWithinCheckpoint } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { Body, L2Block } from '@aztec/stdlib/block';
|
|
4
|
+
import { Checkpoint, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
5
|
+
import { getEpochAtSlot, getEpochNumberAtTimestamp, getLastL1SlotTimestampForL2Slot, getProofSubmissionDeadlineEpoch, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
6
|
+
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
7
|
+
/**
|
|
8
|
+
* Abstract base class implementing ArchiverDataSource using a bundle of archiver substores.
|
|
9
|
+
* Provides implementations for all read-side methods and declares abstract methods for
|
|
10
|
+
* L1-dependent functionality that subclasses must implement.
|
|
11
|
+
*/ export class ArchiverDataSourceBase {
|
|
12
|
+
stores;
|
|
13
|
+
l1Constants;
|
|
14
|
+
/** The injected genesis block header. */ initialHeader;
|
|
15
|
+
/** Precomputed hash of the initial header, exposed via {@link getGenesisBlockHash}. */ initialBlockHash;
|
|
16
|
+
/** Archive root after block 0 was appended — read from L1 (`Rollup.getGenesisArchiveTreeRoot`). */ genesisArchiveRoot;
|
|
17
|
+
/** Memoized synthetic genesis block — callers rely on referential identity for caching. */ genesisBlock;
|
|
18
|
+
/** Memoized synthetic genesis block data — kept consistent with {@link genesisBlock}. */ genesisBlockData;
|
|
19
|
+
constructor(stores, l1Constants, initialHeader, initialBlockHash, genesisArchiveRoot){
|
|
20
|
+
this.stores = stores;
|
|
21
|
+
this.l1Constants = l1Constants;
|
|
22
|
+
this.initialHeader = initialHeader;
|
|
23
|
+
this.initialBlockHash = initialBlockHash;
|
|
24
|
+
this.genesisArchiveRoot = genesisArchiveRoot;
|
|
25
|
+
const genesisArchive = new AppendOnlyTreeSnapshot(genesisArchiveRoot, 1);
|
|
26
|
+
this.genesisBlock = new L2Block(genesisArchive, initialHeader, Body.empty(), CheckpointNumber.ZERO, IndexWithinCheckpoint(0));
|
|
27
|
+
this.genesisBlockData = {
|
|
28
|
+
header: initialHeader,
|
|
29
|
+
archive: genesisArchive,
|
|
30
|
+
blockHash: initialBlockHash,
|
|
31
|
+
checkpointNumber: CheckpointNumber.ZERO,
|
|
32
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(0)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Returns the precomputed hash of the genesis block header. */ getGenesisBlockHash() {
|
|
36
|
+
return this.initialBlockHash;
|
|
37
|
+
}
|
|
38
|
+
/** Returns the synthetic genesis L2Block (memoized — same instance across calls). */ getGenesisBlock() {
|
|
39
|
+
return this.genesisBlock;
|
|
40
|
+
}
|
|
41
|
+
/** Returns genesis block data (memoized — same instance across calls). */ getGenesisBlockData() {
|
|
42
|
+
return this.genesisBlockData;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Type guard distinguishing the genesis sentinel from a {@link ResolvedBlockQuery}.
|
|
46
|
+
* `resolveBlockQuery` already rewrites every genesis-matching shape to the sentinel,
|
|
47
|
+
* so callers only need this single sync check.
|
|
48
|
+
*/ isGenesisBlockQuery(query) {
|
|
49
|
+
return 'genesis' in query;
|
|
50
|
+
}
|
|
51
|
+
async isPruneDueAtSlot(slot) {
|
|
52
|
+
if (!this.l1Constants) {
|
|
53
|
+
throw new Error('isPruneDueAtSlot requires l1Constants');
|
|
54
|
+
}
|
|
55
|
+
const tips = await this.getL2Tips();
|
|
56
|
+
const proven = tips.proven.checkpoint.number;
|
|
57
|
+
const pending = tips.checkpointed.checkpoint.number;
|
|
58
|
+
if (pending === proven) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const oldestUnproven = await this.getCheckpointData({
|
|
62
|
+
number: CheckpointNumber(Number(proven) + 1)
|
|
63
|
+
});
|
|
64
|
+
if (!oldestUnproven) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
const slotTs = getLastL1SlotTimestampForL2Slot(slot, this.l1Constants);
|
|
68
|
+
const slotEpoch = getEpochNumberAtTimestamp(slotTs, this.l1Constants);
|
|
69
|
+
const oldestUnprovenEpoch = getEpochAtSlot(oldestUnproven.header.slotNumber, this.l1Constants);
|
|
70
|
+
const deadlineEpoch = getProofSubmissionDeadlineEpoch(oldestUnprovenEpoch, this.l1Constants);
|
|
71
|
+
return slotEpoch >= deadlineEpoch;
|
|
72
|
+
}
|
|
73
|
+
getCheckpointNumber() {
|
|
74
|
+
return this.stores.blocks.getLatestCheckpointNumber();
|
|
75
|
+
}
|
|
76
|
+
getProvenCheckpointNumber() {
|
|
77
|
+
return this.stores.blocks.getProvenCheckpointNumber();
|
|
78
|
+
}
|
|
79
|
+
async getBlockNumber(query) {
|
|
80
|
+
if (!query) {
|
|
81
|
+
return this.stores.blocks.getLatestL2BlockNumber();
|
|
82
|
+
}
|
|
83
|
+
const resolved = await this.resolveBlockQuery(query);
|
|
84
|
+
if (resolved === undefined) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
if (this.isGenesisBlockQuery(resolved)) {
|
|
88
|
+
return BlockNumber.ZERO;
|
|
89
|
+
}
|
|
90
|
+
return this.stores.blocks.getBlockNumber(resolved);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolves a {@link CheckpointQuery} to a concrete `CheckpointNumber`, or undefined when the
|
|
94
|
+
* query refers to a position that has no checkpoint yet (e.g. `{ slot }` not found).
|
|
95
|
+
*/ resolveCheckpointQuery(query) {
|
|
96
|
+
if ('number' in query) {
|
|
97
|
+
return Promise.resolve(query.number);
|
|
98
|
+
}
|
|
99
|
+
if ('slot' in query) {
|
|
100
|
+
return this.stores.blocks.getCheckpointNumberBySlot(query.slot);
|
|
101
|
+
}
|
|
102
|
+
// tag variant
|
|
103
|
+
switch(query.tag){
|
|
104
|
+
case 'checkpointed':
|
|
105
|
+
return this.stores.blocks.getLatestCheckpointNumber();
|
|
106
|
+
case 'proven':
|
|
107
|
+
return this.stores.blocks.getProvenCheckpointNumber();
|
|
108
|
+
case 'finalized':
|
|
109
|
+
return this.stores.blocks.getFinalizedCheckpointNumber();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Resolves a {@link CheckpointsQuery} to a concrete `{from, limit}` pair used by BlockStore,
|
|
114
|
+
* or undefined when the epoch has no checkpoints.
|
|
115
|
+
*/ async resolveCheckpointsQuery(query) {
|
|
116
|
+
if ('from' in query) {
|
|
117
|
+
return query;
|
|
118
|
+
}
|
|
119
|
+
const numbers = await this.getCheckpointNumbersForEpoch(query.epoch);
|
|
120
|
+
if (numbers.length === 0) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
from: numbers[0],
|
|
125
|
+
limit: numbers.length
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async getCheckpoint(query) {
|
|
129
|
+
const number = await this.resolveCheckpointQuery(query);
|
|
130
|
+
if (number === undefined || number === 0) {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
const data = await this.stores.blocks.getCheckpointData(number);
|
|
134
|
+
if (!data) {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
return this.getPublishedCheckpointFromCheckpointData(data);
|
|
138
|
+
}
|
|
139
|
+
async getCheckpoints(query) {
|
|
140
|
+
const resolved = await this.resolveCheckpointsQuery(query);
|
|
141
|
+
if (!resolved) {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
const checkpoints = await this.stores.blocks.getRangeOfCheckpoints(resolved.from, resolved.limit);
|
|
145
|
+
return Promise.all(checkpoints.map((ch)=>this.getPublishedCheckpointFromCheckpointData(ch)));
|
|
146
|
+
}
|
|
147
|
+
async getCheckpointData(query) {
|
|
148
|
+
const number = await this.resolveCheckpointQuery(query);
|
|
149
|
+
if (number === undefined || number === 0) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
return this.stores.blocks.getCheckpointData(number);
|
|
153
|
+
}
|
|
154
|
+
async getCheckpointsData(query) {
|
|
155
|
+
const resolved = await this.resolveCheckpointsQuery(query);
|
|
156
|
+
if (!resolved) {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
return this.stores.blocks.getRangeOfCheckpoints(resolved.from, resolved.limit);
|
|
160
|
+
}
|
|
161
|
+
getProposedCheckpointData(query) {
|
|
162
|
+
if (!query || 'tag' in query) {
|
|
163
|
+
return this.stores.blocks.getLastProposedCheckpoint();
|
|
164
|
+
}
|
|
165
|
+
if ('number' in query) {
|
|
166
|
+
return this.stores.blocks.getProposedCheckpointByNumber(query.number);
|
|
167
|
+
}
|
|
168
|
+
return this.stores.blocks.getProposedCheckpointBySlot(query.slot);
|
|
169
|
+
}
|
|
170
|
+
getTxEffect(txHash) {
|
|
171
|
+
return this.stores.blocks.getTxEffect(txHash);
|
|
172
|
+
}
|
|
173
|
+
getSettledTxReceipt(txHash) {
|
|
174
|
+
return this.stores.blocks.getSettledTxReceipt(txHash, this.l1Constants);
|
|
175
|
+
}
|
|
176
|
+
isPendingChainInvalid() {
|
|
177
|
+
return this.getPendingChainValidationStatus().then((status)=>!status.valid);
|
|
178
|
+
}
|
|
179
|
+
async getPendingChainValidationStatus() {
|
|
180
|
+
return await this.stores.blocks.getPendingChainValidationStatus() ?? {
|
|
181
|
+
valid: true
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
getPrivateLogsByTags(query) {
|
|
185
|
+
return this.stores.logs.getPrivateLogsByTags(query);
|
|
186
|
+
}
|
|
187
|
+
getPublicLogsByTags(query) {
|
|
188
|
+
return this.stores.logs.getPublicLogsByTags(query);
|
|
189
|
+
}
|
|
190
|
+
getContractClass(id) {
|
|
191
|
+
return this.stores.contractClasses.getContractClass(id);
|
|
192
|
+
}
|
|
193
|
+
getBytecodeCommitment(id) {
|
|
194
|
+
return this.stores.contractClasses.getBytecodeCommitment(id);
|
|
195
|
+
}
|
|
196
|
+
async getContract(address, maybeTimestamp) {
|
|
197
|
+
let timestamp;
|
|
198
|
+
if (maybeTimestamp === undefined) {
|
|
199
|
+
const latestBlockData = await this.getBlockData({
|
|
200
|
+
tag: 'proposed'
|
|
201
|
+
});
|
|
202
|
+
timestamp = latestBlockData ? latestBlockData.header.globalVariables.timestamp : 0n;
|
|
203
|
+
} else {
|
|
204
|
+
timestamp = maybeTimestamp;
|
|
205
|
+
}
|
|
206
|
+
return this.stores.contractInstances.getContractInstance(address, timestamp);
|
|
207
|
+
}
|
|
208
|
+
getContractClassIds() {
|
|
209
|
+
return this.stores.contractClasses.getContractClassIds();
|
|
210
|
+
}
|
|
211
|
+
/** Looks up a public function name given a selector. */ getDebugFunctionName(_address, selector) {
|
|
212
|
+
return Promise.resolve(this.stores.functionNames.get(selector));
|
|
213
|
+
}
|
|
214
|
+
/** Register public function signatures so they can be looked up by selector. */ registerContractFunctionSignatures(signatures) {
|
|
215
|
+
return this.stores.functionNames.register(signatures);
|
|
216
|
+
}
|
|
217
|
+
getL1ToL2Messages(checkpointNumber) {
|
|
218
|
+
return this.stores.messages.getL1ToL2Messages(checkpointNumber);
|
|
219
|
+
}
|
|
220
|
+
getL1ToL2MessageIndex(l1ToL2Message) {
|
|
221
|
+
return this.stores.messages.getL1ToL2MessageIndex(l1ToL2Message);
|
|
222
|
+
}
|
|
223
|
+
async getPublishedCheckpointFromCheckpointData(checkpoint) {
|
|
224
|
+
const blocksForCheckpoint = await this.stores.blocks.getBlocksForCheckpoint(checkpoint.checkpointNumber);
|
|
225
|
+
if (!blocksForCheckpoint) {
|
|
226
|
+
throw new Error(`Blocks for checkpoint ${checkpoint.checkpointNumber} not found`);
|
|
227
|
+
}
|
|
228
|
+
const fullCheckpoint = new Checkpoint(checkpoint.archive, checkpoint.header, blocksForCheckpoint, checkpoint.checkpointNumber, checkpoint.feeAssetPriceModifier);
|
|
229
|
+
return new PublishedCheckpoint(fullCheckpoint, checkpoint.l1, checkpoint.attestations);
|
|
230
|
+
}
|
|
231
|
+
getBlocksForSlot(slotNumber) {
|
|
232
|
+
return this.stores.blocks.getBlocksForSlot(slotNumber);
|
|
233
|
+
}
|
|
234
|
+
/** Returns just the checkpoint numbers for all checkpoints whose slot falls within the given epoch. */ getCheckpointNumbersForEpoch(epochNumber) {
|
|
235
|
+
if (!this.l1Constants) {
|
|
236
|
+
throw new Error('L1 constants not set');
|
|
237
|
+
}
|
|
238
|
+
const [start, end] = getSlotRangeForEpoch(epochNumber, this.l1Constants);
|
|
239
|
+
return this.stores.blocks.getCheckpointNumbersForSlotRange(start, end);
|
|
240
|
+
}
|
|
241
|
+
async getBlock(query) {
|
|
242
|
+
const resolved = await this.resolveBlockQuery(query);
|
|
243
|
+
if (resolved === undefined) {
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
if (this.isGenesisBlockQuery(resolved)) {
|
|
247
|
+
return this.getGenesisBlock();
|
|
248
|
+
}
|
|
249
|
+
return this.stores.blocks.getBlock(resolved);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Range queries iterate physical blocks only; the genesis block is NOT prepended.
|
|
253
|
+
* `L2BlockStream` consumers (`world-state.handleL2Blocks`, etc.) emit `blocks-added` events for
|
|
254
|
+
* real blocks and would be surprised by a synthetic block 0. Use {@link getBlock} or
|
|
255
|
+
* {@link getBlockData} for genesis-aware single-block lookups.
|
|
256
|
+
*/ async getBlocks(query) {
|
|
257
|
+
const resolved = await this.resolveBlocksQuery(query);
|
|
258
|
+
return resolved ? this.stores.blocks.getBlocks(resolved) : [];
|
|
259
|
+
}
|
|
260
|
+
async getBlockData(query) {
|
|
261
|
+
const resolved = await this.resolveBlockQuery(query);
|
|
262
|
+
if (resolved === undefined) {
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
265
|
+
if (this.isGenesisBlockQuery(resolved)) {
|
|
266
|
+
return this.getGenesisBlockData();
|
|
267
|
+
}
|
|
268
|
+
return this.stores.blocks.getBlockData(resolved);
|
|
269
|
+
}
|
|
270
|
+
/** See {@link getBlocks} — range queries do not prepend the genesis block. */ async getBlocksData(query) {
|
|
271
|
+
const resolved = await this.resolveBlocksQuery(query);
|
|
272
|
+
return resolved ? this.stores.blocks.getBlocksData(resolved) : [];
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Resolves a {@link BlockQuery} to either the genesis sentinel or a {@link ResolvedBlockQuery}
|
|
276
|
+
* understood by BlockStore. Detects every shape that points at block 0 — `{number:0}`,
|
|
277
|
+
* `{hash}` matching the initial header, `{archive}` matching the post-genesis archive root,
|
|
278
|
+
* and `{tag}` resolving to 0 — and rewrites them to the sentinel so callers branch once.
|
|
279
|
+
*/ async resolveBlockQuery(query) {
|
|
280
|
+
if ('number' in query) {
|
|
281
|
+
return query.number === BlockNumber.ZERO ? {
|
|
282
|
+
genesis: true
|
|
283
|
+
} : query;
|
|
284
|
+
}
|
|
285
|
+
if ('hash' in query) {
|
|
286
|
+
return query.hash.equals(this.initialBlockHash) ? {
|
|
287
|
+
genesis: true
|
|
288
|
+
} : query;
|
|
289
|
+
}
|
|
290
|
+
if ('archive' in query) {
|
|
291
|
+
return query.archive.equals(this.genesisArchiveRoot) ? {
|
|
292
|
+
genesis: true
|
|
293
|
+
} : query;
|
|
294
|
+
}
|
|
295
|
+
const number = await this.resolveBlockTag(query.tag);
|
|
296
|
+
if (number === BlockNumber.ZERO) {
|
|
297
|
+
return {
|
|
298
|
+
genesis: true
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
number
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/** Maps a {@link BlockTag} to the matching block number for the current chain state. */ resolveBlockTag(tag) {
|
|
306
|
+
switch(tag){
|
|
307
|
+
case 'latest':
|
|
308
|
+
case 'proposed':
|
|
309
|
+
return this.stores.blocks.getLatestL2BlockNumber();
|
|
310
|
+
case 'checkpointed':
|
|
311
|
+
return this.stores.blocks.getCheckpointedL2BlockNumber();
|
|
312
|
+
case 'proven':
|
|
313
|
+
return this.stores.blocks.getProvenBlockNumber();
|
|
314
|
+
case 'finalized':
|
|
315
|
+
return this.stores.blocks.getFinalizedL2BlockNumber();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Converts an epoch-based BlocksQuery to a from/limit query using l1Constants.
|
|
320
|
+
* Returns undefined when the epoch has no checkpoints, so callers can return [] without
|
|
321
|
+
* entering BlockStore. Reads only the two endpoint checkpoints rather than the whole epoch.
|
|
322
|
+
*/ async resolveBlocksQuery(query) {
|
|
323
|
+
if (!('epoch' in query)) {
|
|
324
|
+
if (query.from < INITIAL_L2_BLOCK_NUM) {
|
|
325
|
+
throw new Error(`getBlocks/getBlocksData: 'from' must be >= ${INITIAL_L2_BLOCK_NUM}, got ${query.from}. ` + `Use getBlock({number:0})/getBlockData({number:0}) for genesis-aware single-block lookups.`);
|
|
326
|
+
}
|
|
327
|
+
return query;
|
|
328
|
+
}
|
|
329
|
+
const checkpointNumbers = await this.getCheckpointNumbersForEpoch(query.epoch);
|
|
330
|
+
if (checkpointNumbers.length === 0) {
|
|
331
|
+
return undefined;
|
|
332
|
+
}
|
|
333
|
+
const firstNumber = checkpointNumbers[0];
|
|
334
|
+
const lastNumber = checkpointNumbers[checkpointNumbers.length - 1];
|
|
335
|
+
const first = await this.stores.blocks.getCheckpointData(firstNumber);
|
|
336
|
+
if (!first) {
|
|
337
|
+
return undefined;
|
|
338
|
+
}
|
|
339
|
+
const last = firstNumber === lastNumber ? first : await this.stores.blocks.getCheckpointData(lastNumber);
|
|
340
|
+
if (!last) {
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
const from = BlockNumber(first.startBlock);
|
|
344
|
+
const limit = last.startBlock + last.blockCount - first.startBlock;
|
|
345
|
+
return {
|
|
346
|
+
from,
|
|
347
|
+
limit,
|
|
348
|
+
onlyCheckpointed: true
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|