@aztec/archiver 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5a9928
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 +19 -13
- package/dest/archiver.d.ts +76 -18
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +329 -162
- package/dest/config.d.ts +7 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +43 -14
- package/dest/errors.d.ts +55 -9
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +81 -14
- package/dest/factory.d.ts +20 -9
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +87 -39
- package/dest/index.d.ts +12 -3
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +11 -2
- package/dest/l1/bin/retrieve-calldata.js +32 -28
- package/dest/l1/calldata_retriever.d.ts +81 -50
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +202 -260
- package/dest/l1/data_retrieval.d.ts +32 -18
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +42 -47
- package/dest/l1/spire_proposer.d.ts +5 -5
- package/dest/l1/spire_proposer.d.ts.map +1 -1
- package/dest/l1/spire_proposer.js +9 -17
- package/dest/l1/trace_tx.d.ts +12 -66
- package/dest/l1/trace_tx.d.ts.map +1 -1
- 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/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 +32 -0
- package/dest/modules/data_source_base.d.ts +74 -46
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +252 -190
- package/dest/modules/data_store_updater.d.ts +49 -17
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +218 -122
- package/dest/modules/instrumentation.d.ts +29 -3
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +67 -11
- package/dest/modules/l1_synchronizer.d.ts +16 -14
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +488 -219
- package/dest/modules/outbox_trees_resolver.d.ts +64 -0
- package/dest/modules/outbox_trees_resolver.d.ts.map +1 -0
- package/dest/modules/outbox_trees_resolver.js +184 -0
- package/dest/modules/validation.d.ts +30 -7
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +35 -17
- package/dest/store/block_store.d.ts +186 -74
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +810 -285
- package/dest/store/contract_class_store.d.ts +17 -4
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +42 -68
- package/dest/store/contract_instance_store.d.ts +28 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +58 -6
- 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 +42 -37
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +262 -408
- package/dest/store/log_store_codec.d.ts +78 -0
- package/dest/store/log_store_codec.d.ts.map +1 -0
- package/dest/store/log_store_codec.js +110 -0
- package/dest/store/message_store.d.ts +11 -1
- package/dest/store/message_store.d.ts.map +1 -1
- package/dest/store/message_store.js +51 -9
- package/dest/test/fake_l1_state.d.ts +25 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +166 -32
- package/dest/test/mock_archiver.d.ts +1 -1
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +3 -2
- package/dest/test/mock_l2_block_source.d.ts +61 -47
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +306 -211
- package/dest/test/mock_structs.d.ts +4 -1
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +15 -3
- package/dest/test/noop_l1_archiver.d.ts +17 -6
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +31 -11
- package/package.json +15 -14
- package/src/archiver.ts +427 -185
- package/src/config.ts +51 -13
- package/src/errors.ts +122 -21
- package/src/factory.ts +104 -29
- package/src/index.ts +19 -2
- package/src/l1/README.md +25 -68
- package/src/l1/bin/retrieve-calldata.ts +40 -27
- package/src/l1/calldata_retriever.ts +267 -379
- package/src/l1/data_retrieval.ts +66 -70
- package/src/l1/spire_proposer.ts +7 -15
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/modules/contract_data_source_adapter.ts +46 -0
- package/src/modules/data_source_base.ts +337 -238
- package/src/modules/data_store_updater.ts +259 -154
- package/src/modules/instrumentation.ts +71 -11
- package/src/modules/l1_synchronizer.ts +659 -269
- package/src/modules/outbox_trees_resolver.ts +220 -0
- package/src/modules/validation.ts +80 -23
- package/src/store/block_store.ts +989 -358
- package/src/store/contract_class_store.ts +49 -103
- package/src/store/contract_instance_store.ts +74 -11
- 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 +302 -559
- package/src/store/log_store_codec.ts +143 -0
- package/src/store/message_store.ts +60 -10
- package/src/structs/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +213 -42
- package/src/test/mock_archiver.ts +3 -2
- package/src/test/mock_l2_block_source.ts +378 -233
- package/src/test/mock_structs.ts +25 -8
- package/src/test/noop_l1_archiver.ts +61 -12
- package/dest/store/kv_archiver_store.d.ts +0 -340
- package/dest/store/kv_archiver_store.d.ts.map +0 -1
- package/dest/store/kv_archiver_store.js +0 -446
- package/src/store/kv_archiver_store.ts +0 -639
package/dest/factory.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
2
2
|
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
3
|
-
import {
|
|
3
|
+
import { makeL1HttpTransport } from '@aztec/ethereum/client';
|
|
4
|
+
import { InboxContract, OutboxContract, RollupContract } from '@aztec/ethereum/contracts';
|
|
5
|
+
import { pickL1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
|
|
4
6
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
5
7
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
6
8
|
import { merge } from '@aztec/foundation/collection';
|
|
@@ -9,67 +11,78 @@ import { DateProvider } from '@aztec/foundation/timer';
|
|
|
9
11
|
import { createStore } from '@aztec/kv-store/lmdb-v2';
|
|
10
12
|
import { protocolContractNames } from '@aztec/protocol-contracts';
|
|
11
13
|
import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
|
|
14
|
+
import { getPublishableStandardContracts } from '@aztec/standard-contracts';
|
|
12
15
|
import { FunctionType, decodeFunctionSignature } from '@aztec/stdlib/abi';
|
|
16
|
+
import { DEFAULT_BLOCK_DURATION_MS } from '@aztec/stdlib/config';
|
|
13
17
|
import { computePublicBytecodeCommitment } from '@aztec/stdlib/contract';
|
|
18
|
+
import { DEFAULT_ORPHAN_PRUNE_NO_PROPOSAL_TOLERANCE, getDefaultCheckpointProposalSyncGrace } from '@aztec/stdlib/timetable';
|
|
14
19
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
15
20
|
import { EventEmitter } from 'events';
|
|
16
|
-
import { createPublicClient
|
|
21
|
+
import { createPublicClient } from 'viem';
|
|
17
22
|
import { Archiver } from './archiver.js';
|
|
18
23
|
import { mapArchiverConfig } from './config.js';
|
|
19
24
|
import { ArchiverInstrumentation } from './modules/instrumentation.js';
|
|
20
25
|
import { ArchiverL1Synchronizer } from './modules/l1_synchronizer.js';
|
|
21
|
-
import { ARCHIVER_DB_VERSION,
|
|
26
|
+
import { ARCHIVER_DB_VERSION, createArchiverDataStores } from './store/data_stores.js';
|
|
27
|
+
import { L2TipsCache } from './store/l2_tips_cache.js';
|
|
22
28
|
export const ARCHIVER_STORE_NAME = 'archiver';
|
|
23
|
-
/** Creates an archiver store. */ export async function createArchiverStore(userConfig,
|
|
29
|
+
/** Creates an archiver store. */ export async function createArchiverStore(userConfig, genesisBlockHash) {
|
|
24
30
|
const config = {
|
|
25
31
|
...userConfig,
|
|
26
32
|
dataStoreMapSizeKb: userConfig.archiverStoreMapSizeKb ?? userConfig.dataStoreMapSizeKb
|
|
27
33
|
};
|
|
28
34
|
const store = await createStore(ARCHIVER_STORE_NAME, ARCHIVER_DB_VERSION, config);
|
|
29
|
-
return
|
|
35
|
+
return createArchiverDataStores(store, genesisBlockHash);
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
32
38
|
* Creates a local archiver.
|
|
33
39
|
* @param config - The archiver configuration.
|
|
34
40
|
* @param deps - The archiver dependencies (blobClient, epochCache, dateProvider, telemetry).
|
|
35
41
|
* @param opts - The options.
|
|
42
|
+
* @param initialHeader - The genesis block header from world-state, used to answer block-0 queries.
|
|
43
|
+
* @param initialBlockHash - Precomputed hash of `initialHeader`. Hoisted to the caller so the archiver
|
|
44
|
+
* can expose `getGenesisBlockHash()` synchronously.
|
|
36
45
|
* @returns The local archiver.
|
|
37
46
|
*/ export async function createArchiver(config, deps, opts = {
|
|
38
47
|
blockUntilSync: true
|
|
39
|
-
}) {
|
|
40
|
-
const archiverStore = await createArchiverStore(config,
|
|
41
|
-
epochDuration: config.aztecEpochDuration
|
|
42
|
-
});
|
|
48
|
+
}, initialHeader, initialBlockHash) {
|
|
49
|
+
const archiverStore = await createArchiverStore(config, initialBlockHash);
|
|
43
50
|
await registerProtocolContracts(archiverStore);
|
|
51
|
+
if (config.testPreloadStandardContracts) {
|
|
52
|
+
await registerStandardContracts(archiverStore);
|
|
53
|
+
}
|
|
44
54
|
// Create Ethereum clients
|
|
45
55
|
const chain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
|
|
56
|
+
const httpTimeout = config.l1HttpTimeoutMS;
|
|
46
57
|
const publicClient = createPublicClient({
|
|
47
58
|
chain: chain.chainInfo,
|
|
48
|
-
transport:
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
transport: makeL1HttpTransport(config.l1RpcUrls, {
|
|
60
|
+
timeout: httpTimeout
|
|
61
|
+
}),
|
|
51
62
|
pollingInterval: config.viemPollingIntervalMS
|
|
52
63
|
});
|
|
53
64
|
// Create debug client using debug RPC URLs if available, otherwise fall back to regular RPC URLs
|
|
54
65
|
const debugRpcUrls = config.l1DebugRpcUrls.length > 0 ? config.l1DebugRpcUrls : config.l1RpcUrls;
|
|
55
66
|
const debugClient = createPublicClient({
|
|
56
67
|
chain: chain.chainInfo,
|
|
57
|
-
transport:
|
|
58
|
-
|
|
59
|
-
|
|
68
|
+
transport: makeL1HttpTransport(debugRpcUrls, {
|
|
69
|
+
timeout: httpTimeout
|
|
70
|
+
}),
|
|
60
71
|
pollingInterval: config.viemPollingIntervalMS
|
|
61
72
|
});
|
|
62
73
|
// Create L1 contract instances
|
|
63
|
-
const rollup = new RollupContract(publicClient, config.
|
|
64
|
-
const inbox = new InboxContract(publicClient, config.
|
|
74
|
+
const rollup = new RollupContract(publicClient, config.rollupAddress);
|
|
75
|
+
const inbox = new InboxContract(publicClient, config.inboxAddress);
|
|
76
|
+
const outbox = new OutboxContract(publicClient, config.outboxAddress);
|
|
65
77
|
// Fetch L1 constants from rollup contract
|
|
66
|
-
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, genesisArchiveRoot, slashingProposerAddress, targetCommitteeSize] = await Promise.all([
|
|
78
|
+
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, genesisArchiveRoot, slashingProposerAddress, targetCommitteeSize, rollupManaLimit] = await Promise.all([
|
|
67
79
|
rollup.getL1StartBlock(),
|
|
68
80
|
rollup.getL1GenesisTime(),
|
|
69
81
|
rollup.getProofSubmissionEpochs(),
|
|
70
82
|
rollup.getGenesisArchiveTreeRoot(),
|
|
71
83
|
rollup.getSlashingProposerAddress(),
|
|
72
|
-
rollup.getTargetCommitteeSize()
|
|
84
|
+
rollup.getTargetCommitteeSize(),
|
|
85
|
+
rollup.getManaLimit()
|
|
73
86
|
]);
|
|
74
87
|
const l1StartBlockHash = await publicClient.getBlock({
|
|
75
88
|
blockNumber: l1StartBlock,
|
|
@@ -85,50 +98,85 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
85
98
|
ethereumSlotDuration,
|
|
86
99
|
proofSubmissionEpochs: Number(proofSubmissionEpochs),
|
|
87
100
|
targetCommitteeSize,
|
|
88
|
-
genesisArchiveRoot: Fr.fromString(genesisArchiveRoot.toString())
|
|
101
|
+
genesisArchiveRoot: Fr.fromString(genesisArchiveRoot.toString()),
|
|
102
|
+
rollupManaLimit: Number(rollupManaLimit)
|
|
89
103
|
};
|
|
90
104
|
const archiverConfig = merge({
|
|
91
105
|
pollingIntervalMs: 10_000,
|
|
92
106
|
batchSize: 100,
|
|
93
107
|
maxAllowedEthClientDriftSeconds: 300,
|
|
94
|
-
ethereumAllowNoDebugHosts: false
|
|
108
|
+
ethereumAllowNoDebugHosts: false,
|
|
109
|
+
skipHistoricalLogsCheck: false,
|
|
110
|
+
checkpointProposalSyncGrace: config.checkpointProposalSyncGraceSeconds ?? getDefaultCheckpointProposalSyncGrace((config.blockDurationMs ?? DEFAULT_BLOCK_DURATION_MS) / 1000),
|
|
111
|
+
orphanPruneNoProposalTolerance: DEFAULT_ORPHAN_PRUNE_NO_PROPOSAL_TOLERANCE,
|
|
112
|
+
skipOrphanProposedBlockPruning: false,
|
|
113
|
+
blockDuration: (config.blockDurationMs ?? DEFAULT_BLOCK_DURATION_MS) / 1000
|
|
95
114
|
}, mapArchiverConfig(config));
|
|
96
|
-
const epochCache = deps.epochCache ?? await EpochCache.create(config.
|
|
115
|
+
const epochCache = deps.epochCache ?? await EpochCache.create(config.rollupAddress, config, deps);
|
|
97
116
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
98
|
-
const instrumentation = await ArchiverInstrumentation.new(telemetry, ()=>archiverStore.estimateSize());
|
|
117
|
+
const instrumentation = await ArchiverInstrumentation.new(telemetry, ()=>archiverStore.db.estimateSize());
|
|
99
118
|
// Create the event emitter that will be shared by archiver and synchronizer
|
|
100
119
|
const events = new EventEmitter();
|
|
120
|
+
// Create L2 tips cache shared by archiver and synchronizer. The genesis block hash is dynamic —
|
|
121
|
+
// it depends on the injected initial header (genesisTimestamp + prefilled state). Hoisted to the
|
|
122
|
+
// caller so we can pass the same value to the archiver and expose it via `getGenesisBlockHash()`.
|
|
123
|
+
const l2TipsCache = new L2TipsCache(archiverStore.blocks, initialBlockHash);
|
|
101
124
|
// Create the L1 synchronizer
|
|
102
|
-
const synchronizer = new ArchiverL1Synchronizer(publicClient, debugClient, rollup, inbox,
|
|
103
|
-
|
|
125
|
+
const synchronizer = new ArchiverL1Synchronizer(publicClient, debugClient, rollup, inbox, archiverStore, archiverConfig, deps.blobClient, epochCache, deps.dateProvider ?? new DateProvider(), instrumentation, l1Constants, events, instrumentation.tracer, l2TipsCache, undefined);
|
|
126
|
+
const archiver = new Archiver(publicClient, debugClient, rollup, outbox, {
|
|
127
|
+
...pickL1ContractAddresses(config),
|
|
104
128
|
slashingProposerAddress
|
|
105
|
-
}, archiverStore, archiverConfig, deps.blobClient,
|
|
106
|
-
const archiver = new Archiver(publicClient, debugClient, rollup, {
|
|
107
|
-
...config.l1Contracts,
|
|
108
|
-
slashingProposerAddress
|
|
109
|
-
}, archiverStore, archiverConfig, deps.blobClient, instrumentation, l1Constants, synchronizer, events);
|
|
129
|
+
}, archiverStore, archiverConfig, deps.blobClient, instrumentation, l1Constants, synchronizer, events, initialHeader, initialBlockHash, l2TipsCache, deps.dateProvider ?? new DateProvider());
|
|
110
130
|
await archiver.start(opts.blockUntilSync);
|
|
111
131
|
return archiver;
|
|
112
132
|
}
|
|
113
|
-
/** Registers protocol contracts in the archiver store. */ export async function registerProtocolContracts(
|
|
133
|
+
/** Registers protocol contracts in the archiver store. Idempotent — skips contracts that already exist (e.g. on node restart). */ export async function registerProtocolContracts(stores) {
|
|
114
134
|
const blockNumber = 0;
|
|
115
135
|
for (const name of protocolContractNames){
|
|
116
136
|
const provider = new BundledProtocolContractsProvider();
|
|
117
137
|
const contract = await provider.getProtocolContractArtifact(name);
|
|
138
|
+
// Skip if already registered (happens on node restart with a persisted store).
|
|
139
|
+
if (await stores.contractClasses.getContractClass(contract.contractClass.id)) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const publicBytecodeCommitment = await computePublicBytecodeCommitment(contract.contractClass.packedBytecode);
|
|
143
|
+
const contractClassPublic = {
|
|
144
|
+
...contract.contractClass,
|
|
145
|
+
publicBytecodeCommitment
|
|
146
|
+
};
|
|
147
|
+
const publicFunctionSignatures = contract.artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
148
|
+
await stores.functionNames.register(publicFunctionSignatures);
|
|
149
|
+
await stores.contractClasses.addContractClasses([
|
|
150
|
+
contractClassPublic
|
|
151
|
+
], BlockNumber(blockNumber));
|
|
152
|
+
await stores.contractInstances.addContractInstances([
|
|
153
|
+
contract.instance
|
|
154
|
+
], BlockNumber(blockNumber));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Preloads the standard contracts (AuthRegistry, PublicChecks, HandshakeRegistry) into the archiver store at block 0,
|
|
159
|
+
* mirroring {@link registerProtocolContracts}. Only invoked for test environments (via `testPreloadStandardContracts`),
|
|
160
|
+
* which also seed the matching registration/deployment nullifiers into the genesis nullifier tree so the store and tree
|
|
161
|
+
* stay consistent. Idempotent — skips contracts that already exist (e.g. on node restart).
|
|
162
|
+
*/ export async function registerStandardContracts(stores) {
|
|
163
|
+
const blockNumber = 0;
|
|
164
|
+
for (const contract of (await getPublishableStandardContracts())){
|
|
165
|
+
// Skip if already registered (happens on node restart with a persisted store).
|
|
166
|
+
if (await stores.contractClasses.getContractClass(contract.contractClass.id)) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const publicBytecodeCommitment = await computePublicBytecodeCommitment(contract.contractClass.packedBytecode);
|
|
118
170
|
const contractClassPublic = {
|
|
119
171
|
...contract.contractClass,
|
|
120
|
-
|
|
121
|
-
utilityFunctions: []
|
|
172
|
+
publicBytecodeCommitment
|
|
122
173
|
};
|
|
123
174
|
const publicFunctionSignatures = contract.artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
124
|
-
await
|
|
125
|
-
|
|
126
|
-
await store.addContractClasses([
|
|
175
|
+
await stores.functionNames.register(publicFunctionSignatures);
|
|
176
|
+
await stores.contractClasses.addContractClasses([
|
|
127
177
|
contractClassPublic
|
|
128
|
-
], [
|
|
129
|
-
bytecodeCommitment
|
|
130
178
|
], BlockNumber(blockNumber));
|
|
131
|
-
await
|
|
179
|
+
await stores.contractInstances.addContractInstances([
|
|
132
180
|
contract.instance
|
|
133
181
|
], BlockNumber(blockNumber));
|
|
134
182
|
}
|
package/dest/index.d.ts
CHANGED
|
@@ -4,8 +4,17 @@ export * from './archiver.js';
|
|
|
4
4
|
export * from './modules/data_source_base.js';
|
|
5
5
|
export * from './modules/data_store_updater.js';
|
|
6
6
|
export * from './config.js';
|
|
7
|
+
export * from './errors.js';
|
|
7
8
|
export { type L1PublishedData } from './structs/published.js';
|
|
8
|
-
export {
|
|
9
|
+
export { ARCHIVER_DB_VERSION, type ArchiverDataStores, type ArchiverL1SynchPoint, backupArchiverDataStores, createArchiverDataStores, createContractDataSource, getArchiverSynchPoint, } from './store/data_stores.js';
|
|
10
|
+
export { FunctionNamesCache } from './store/function_names_cache.js';
|
|
11
|
+
export { ArchiverContractDataSourceAdapter } from './modules/contract_data_source_adapter.js';
|
|
12
|
+
export { BlockStore } from './store/block_store.js';
|
|
13
|
+
export { LogStore } from './store/log_store.js';
|
|
14
|
+
export { MessageStore } from './store/message_store.js';
|
|
15
|
+
export { ContractClassStore } from './store/contract_class_store.js';
|
|
9
16
|
export { ContractInstanceStore } from './store/contract_instance_store.js';
|
|
10
|
-
export {
|
|
11
|
-
|
|
17
|
+
export { L2TipsCache } from './store/l2_tips_cache.js';
|
|
18
|
+
export { retrieveL2ProofVerifiedEvents } from './l1/data_retrieval.js';
|
|
19
|
+
export { CalldataRetriever } from './l1/calldata_retriever.js';
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUU1QixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssb0JBQW9CLEVBQ3pCLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQyJ9
|
package/dest/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,iCAAiC,EAAE,MAAM,2CAA2C,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dest/index.js
CHANGED
|
@@ -4,6 +4,15 @@ export * from './archiver.js';
|
|
|
4
4
|
export * from './modules/data_source_base.js';
|
|
5
5
|
export * from './modules/data_store_updater.js';
|
|
6
6
|
export * from './config.js';
|
|
7
|
-
export
|
|
7
|
+
export * from './errors.js';
|
|
8
|
+
export { ARCHIVER_DB_VERSION, backupArchiverDataStores, createArchiverDataStores, createContractDataSource, getArchiverSynchPoint } from './store/data_stores.js';
|
|
9
|
+
export { FunctionNamesCache } from './store/function_names_cache.js';
|
|
10
|
+
export { ArchiverContractDataSourceAdapter } from './modules/contract_data_source_adapter.js';
|
|
11
|
+
export { BlockStore } from './store/block_store.js';
|
|
12
|
+
export { LogStore } from './store/log_store.js';
|
|
13
|
+
export { MessageStore } from './store/message_store.js';
|
|
14
|
+
export { ContractClassStore } from './store/contract_class_store.js';
|
|
8
15
|
export { ContractInstanceStore } from './store/contract_instance_store.js';
|
|
9
|
-
export {
|
|
16
|
+
export { L2TipsCache } from './store/l2_tips_cache.js';
|
|
17
|
+
export { retrieveL2ProofVerifiedEvents } from './l1/data_retrieval.js';
|
|
18
|
+
export { CalldataRetriever } from './l1/calldata_retriever.js';
|
|
@@ -3,7 +3,7 @@ import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
6
|
-
import { createPublicClient, getAbiItem, http, toEventSelector } from 'viem';
|
|
6
|
+
import { createPublicClient, decodeEventLog, getAbiItem, http, toEventSelector } from 'viem';
|
|
7
7
|
import { mainnet } from 'viem/chains';
|
|
8
8
|
import { CalldataRetriever } from '../calldata_retriever.js';
|
|
9
9
|
const logger = createLogger('archiver:calldata-test');
|
|
@@ -74,47 +74,51 @@ async function main() {
|
|
|
74
74
|
throw new Error(`Transaction ${txHash} not found`);
|
|
75
75
|
}
|
|
76
76
|
logger.info(`Transaction found in block ${tx.blockNumber}`);
|
|
77
|
-
// For simplicity, use zero addresses for optional contract addresses
|
|
78
|
-
// In production, these would be fetched from the rollup contract or configuration
|
|
79
|
-
const slashingProposerAddress = EthAddress.ZERO;
|
|
80
|
-
const governanceProposerAddress = EthAddress.ZERO;
|
|
81
|
-
const slashFactoryAddress = undefined;
|
|
82
|
-
logger.info('Using zero addresses for governance/slashing (can be configured if needed)');
|
|
83
77
|
// Create CalldataRetriever
|
|
84
|
-
const retriever = new CalldataRetriever(publicClient, publicClient, targetCommitteeSize, undefined, logger,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
slashingProposerAddress,
|
|
88
|
-
slashFactoryAddress
|
|
89
|
-
});
|
|
90
|
-
// Extract checkpoint number from transaction logs
|
|
91
|
-
logger.info('Decoding transaction to extract checkpoint number...');
|
|
78
|
+
const retriever = new CalldataRetriever(publicClient, publicClient, targetCommitteeSize, undefined, logger, rollupAddress);
|
|
79
|
+
// Extract checkpoint number and hashes from transaction logs
|
|
80
|
+
logger.info('Decoding transaction to extract checkpoint number and hashes...');
|
|
92
81
|
const receipt = await publicClient.getTransactionReceipt({
|
|
93
82
|
hash: txHash
|
|
94
83
|
});
|
|
95
|
-
// Look for CheckpointProposed event
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
84
|
+
// Look for CheckpointProposed event
|
|
85
|
+
const checkpointProposedEventAbi = getAbiItem({
|
|
86
|
+
abi: RollupAbi,
|
|
87
|
+
name: 'CheckpointProposed'
|
|
88
|
+
});
|
|
89
|
+
const checkpointProposedLog = receipt.logs.find((log)=>{
|
|
99
90
|
try {
|
|
100
|
-
return log.address.toLowerCase() === rollupAddress.toString().toLowerCase() && log.topics[0] === toEventSelector(
|
|
101
|
-
abi: RollupAbi,
|
|
102
|
-
name: 'CheckpointProposed'
|
|
103
|
-
}));
|
|
91
|
+
return log.address.toLowerCase() === rollupAddress.toString().toLowerCase() && log.topics[0] === toEventSelector(checkpointProposedEventAbi);
|
|
104
92
|
} catch {
|
|
105
93
|
return false;
|
|
106
94
|
}
|
|
107
95
|
});
|
|
108
|
-
if (!
|
|
96
|
+
if (!checkpointProposedLog || checkpointProposedLog.topics[1] === undefined) {
|
|
109
97
|
throw new Error(`Checkpoint proposed event not found`);
|
|
110
98
|
}
|
|
111
|
-
const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(
|
|
99
|
+
const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(checkpointProposedLog.topics[1]));
|
|
100
|
+
// Decode the full event to extract attestationsHash and payloadDigest
|
|
101
|
+
const decodedEvent = decodeEventLog({
|
|
102
|
+
abi: RollupAbi,
|
|
103
|
+
data: checkpointProposedLog.data,
|
|
104
|
+
topics: checkpointProposedLog.topics
|
|
105
|
+
});
|
|
106
|
+
const eventArgs = decodedEvent.args;
|
|
107
|
+
if (!eventArgs.attestationsHash || !eventArgs.payloadDigest) {
|
|
108
|
+
throw new Error(`CheckpointProposed event missing attestationsHash or payloadDigest`);
|
|
109
|
+
}
|
|
110
|
+
const expectedHashes = {
|
|
111
|
+
attestationsHash: eventArgs.attestationsHash,
|
|
112
|
+
payloadDigest: eventArgs.payloadDigest
|
|
113
|
+
};
|
|
114
|
+
logger.info(`Checkpoint Number: ${checkpointNumber}`);
|
|
115
|
+
logger.info(`Attestations Hash: ${expectedHashes.attestationsHash}`);
|
|
116
|
+
logger.info(`Payload Digest: ${expectedHashes.payloadDigest}`);
|
|
112
117
|
logger.info('');
|
|
113
118
|
logger.info('Retrieving checkpoint from rollup transaction...');
|
|
114
119
|
logger.info('');
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
logger.info(' Successfully retrieved block header!');
|
|
120
|
+
const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, expectedHashes);
|
|
121
|
+
logger.info(' Successfully retrieved block header!');
|
|
118
122
|
logger.info('');
|
|
119
123
|
logger.info('Block Header Details:');
|
|
120
124
|
logger.info('====================');
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ViemCommitteeAttestations } from '@aztec/ethereum/contracts';
|
|
1
2
|
import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
|
|
2
3
|
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
3
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
@@ -7,9 +8,25 @@ import { CommitteeAttestation } from '@aztec/stdlib/block';
|
|
|
7
8
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
8
9
|
import { type Hex, type Transaction } from 'viem';
|
|
9
10
|
import type { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
11
|
+
/** Decoded checkpoint data from a propose calldata. */
|
|
12
|
+
type CheckpointData = {
|
|
13
|
+
checkpointNumber: CheckpointNumber;
|
|
14
|
+
archiveRoot: Fr;
|
|
15
|
+
header: CheckpointHeader;
|
|
16
|
+
attestations: CommitteeAttestation[];
|
|
17
|
+
/**
|
|
18
|
+
* The exact packed `CommitteeAttestations` tuple as it appears in the propose calldata, preserved
|
|
19
|
+
* verbatim (never re-derived from {@link attestations}) so invalidation evidence stays byte-faithful to
|
|
20
|
+
* the on-chain `attestationsHash`.
|
|
21
|
+
*/
|
|
22
|
+
verbatimAttestations: ViemCommitteeAttestations;
|
|
23
|
+
blockHash: string;
|
|
24
|
+
feeAssetPriceModifier: bigint;
|
|
25
|
+
};
|
|
10
26
|
/**
|
|
11
27
|
* Extracts calldata to the `propose` method of the rollup contract from an L1 transaction
|
|
12
|
-
* in order to reconstruct an L2 block header.
|
|
28
|
+
* in order to reconstruct an L2 block header. Uses hash matching against expected hashes
|
|
29
|
+
* from the CheckpointProposed event to verify the correct propose calldata.
|
|
13
30
|
*/
|
|
14
31
|
export declare class CalldataRetriever {
|
|
15
32
|
private readonly publicClient;
|
|
@@ -17,65 +34,80 @@ export declare class CalldataRetriever {
|
|
|
17
34
|
private readonly targetCommitteeSize;
|
|
18
35
|
private readonly instrumentation;
|
|
19
36
|
private readonly logger;
|
|
20
|
-
/** Pre-computed valid contract calls for validation */
|
|
21
|
-
private readonly validContractCalls;
|
|
22
37
|
private readonly rollupAddress;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
/** Tx hashes we've already logged for trace+debug failure (log once per tx per process). */
|
|
39
|
+
private static readonly traceFailureWarnedTxHashes;
|
|
40
|
+
/** Clears the trace-failure warned set. For testing only. */
|
|
41
|
+
static resetTraceFailureWarnedForTesting(): void;
|
|
42
|
+
constructor(publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, targetCommitteeSize: number, instrumentation: ArchiverInstrumentation | undefined, logger: Logger, rollupAddress: EthAddress);
|
|
43
|
+
private getSignatureContext;
|
|
29
44
|
/**
|
|
30
45
|
* Gets checkpoint header and metadata from the calldata of an L1 transaction.
|
|
31
46
|
* Tries multicall3 decoding, falls back to trace-based extraction.
|
|
32
47
|
* @param txHash - Hash of the tx that published it.
|
|
33
48
|
* @param blobHashes - Blob hashes for the checkpoint.
|
|
34
49
|
* @param checkpointNumber - Checkpoint number.
|
|
35
|
-
* @param expectedHashes -
|
|
50
|
+
* @param expectedHashes - Expected hashes from the CheckpointProposed event for validation
|
|
36
51
|
* @returns Checkpoint header and metadata from the calldata, deserialized
|
|
37
52
|
*/
|
|
38
53
|
getCheckpointFromRollupTx(txHash: `0x${string}`, _blobHashes: Buffer[], checkpointNumber: CheckpointNumber, expectedHashes: {
|
|
39
|
-
attestationsHash
|
|
40
|
-
payloadDigest
|
|
41
|
-
}): Promise<
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}>;
|
|
48
|
-
/** Gets rollup propose calldata from a transaction */
|
|
49
|
-
protected getProposeCallData(tx: Transaction, checkpointNumber: CheckpointNumber): Promise<Hex>;
|
|
54
|
+
attestationsHash: Hex;
|
|
55
|
+
payloadDigest: Hex;
|
|
56
|
+
}): Promise<CheckpointData>;
|
|
57
|
+
/** Gets checkpoint data from a transaction by trying decode strategies then falling back to trace. */
|
|
58
|
+
protected getCheckpointFromTx(tx: Transaction, checkpointNumber: CheckpointNumber, expectedHashes: {
|
|
59
|
+
attestationsHash: Hex;
|
|
60
|
+
payloadDigest: Hex;
|
|
61
|
+
}): Promise<CheckpointData>;
|
|
50
62
|
/**
|
|
51
63
|
* Attempts to decode a transaction as a Spire Proposer multicall wrapper.
|
|
52
|
-
* If successful,
|
|
64
|
+
* If successful, iterates all wrapped calls and validates each as either multicall3
|
|
65
|
+
* or direct propose, verifying against expected hashes.
|
|
53
66
|
* @param tx - The transaction to decode
|
|
54
|
-
* @
|
|
67
|
+
* @param expectedHashes - Expected hashes for hash-verified matching
|
|
68
|
+
* @param checkpointNumber - The checkpoint number
|
|
69
|
+
* @param blockHash - The L1 block hash
|
|
70
|
+
* @returns The checkpoint data if successfully decoded and validated, undefined otherwise
|
|
55
71
|
*/
|
|
56
|
-
protected tryDecodeSpireProposer(tx: Transaction
|
|
72
|
+
protected tryDecodeSpireProposer(tx: Transaction, expectedHashes: {
|
|
73
|
+
attestationsHash: Hex;
|
|
74
|
+
payloadDigest: Hex;
|
|
75
|
+
}, checkpointNumber: CheckpointNumber, blockHash: Hex): Promise<CheckpointData | undefined>;
|
|
57
76
|
/**
|
|
58
77
|
* Attempts to decode transaction input as multicall3 and extract propose calldata.
|
|
59
|
-
*
|
|
78
|
+
* Finds all calls matching the rollup address and propose selector, then decodes
|
|
79
|
+
* and verifies each candidate against expected hashes from the CheckpointProposed event.
|
|
60
80
|
* @param tx - The transaction-like object with to, input, and hash
|
|
61
|
-
* @
|
|
81
|
+
* @param expectedHashes - Expected hashes from CheckpointProposed event
|
|
82
|
+
* @param checkpointNumber - The checkpoint number
|
|
83
|
+
* @param blockHash - The L1 block hash
|
|
84
|
+
* @returns The checkpoint data if successfully validated, undefined otherwise
|
|
62
85
|
*/
|
|
63
86
|
protected tryDecodeMulticall3(tx: {
|
|
64
87
|
to: Hex | null | undefined;
|
|
65
88
|
input: Hex;
|
|
66
89
|
hash: Hex;
|
|
67
|
-
}
|
|
90
|
+
}, expectedHashes: {
|
|
91
|
+
attestationsHash: Hex;
|
|
92
|
+
payloadDigest: Hex;
|
|
93
|
+
}, checkpointNumber: CheckpointNumber, blockHash: Hex): CheckpointData | undefined;
|
|
68
94
|
/**
|
|
69
95
|
* Attempts to decode transaction as a direct propose call to the rollup contract.
|
|
70
|
-
*
|
|
96
|
+
* Decodes, verifies hashes, and builds checkpoint data in a single pass.
|
|
71
97
|
* @param tx - The transaction-like object with to, input, and hash
|
|
72
|
-
* @
|
|
98
|
+
* @param expectedHashes - Expected hashes from CheckpointProposed event
|
|
99
|
+
* @param checkpointNumber - The checkpoint number
|
|
100
|
+
* @param blockHash - The L1 block hash
|
|
101
|
+
* @returns The checkpoint data if successfully validated, undefined otherwise
|
|
73
102
|
*/
|
|
74
103
|
protected tryDecodeDirectPropose(tx: {
|
|
75
104
|
to: Hex | null | undefined;
|
|
76
105
|
input: Hex;
|
|
77
106
|
hash: Hex;
|
|
78
|
-
}
|
|
107
|
+
}, expectedHashes: {
|
|
108
|
+
attestationsHash: Hex;
|
|
109
|
+
payloadDigest: Hex;
|
|
110
|
+
}, checkpointNumber: CheckpointNumber, blockHash: Hex): CheckpointData | undefined;
|
|
79
111
|
/**
|
|
80
112
|
* Uses debug/trace RPC to extract the actual calldata from the successful propose call.
|
|
81
113
|
* This is the definitive fallback that works for any transaction pattern.
|
|
@@ -84,29 +116,28 @@ export declare class CalldataRetriever {
|
|
|
84
116
|
* @returns The propose calldata from the successful call
|
|
85
117
|
*/
|
|
86
118
|
protected extractCalldataViaTrace(txHash: Hex): Promise<Hex>;
|
|
119
|
+
/**
|
|
120
|
+
* Decodes propose calldata, verifies against expected hashes, and builds checkpoint data.
|
|
121
|
+
* Returns undefined on decode errors or hash mismatches (soft failure for try-based callers).
|
|
122
|
+
* @param proposeCalldata - The propose function calldata
|
|
123
|
+
* @param expectedHashes - Expected hashes from the CheckpointProposed event
|
|
124
|
+
* @param checkpointNumber - The checkpoint number
|
|
125
|
+
* @param blockHash - The L1 block hash
|
|
126
|
+
* @returns The decoded checkpoint data, or undefined on failure
|
|
127
|
+
*/
|
|
128
|
+
protected tryDecodeAndVerifyPropose(proposeCalldata: Hex, expectedHashes: {
|
|
129
|
+
attestationsHash: Hex;
|
|
130
|
+
payloadDigest: Hex;
|
|
131
|
+
}, checkpointNumber: CheckpointNumber, blockHash: Hex): CheckpointData | undefined;
|
|
132
|
+
/** Computes the keccak256 hash of ABI-encoded CommitteeAttestations. */
|
|
133
|
+
private computeAttestationsHash;
|
|
134
|
+
/** Computes the keccak256 payload digest from the checkpoint header, archive root, and fee asset price modifier. */
|
|
135
|
+
private computePayloadDigest;
|
|
87
136
|
/**
|
|
88
137
|
* Extracts the CommitteeAttestations struct definition from RollupAbi.
|
|
89
138
|
* Finds the _attestations parameter by name in the propose function.
|
|
90
|
-
* Lazy-loaded to avoid issues during module initialization.
|
|
91
139
|
*/
|
|
92
140
|
private getCommitteeAttestationsStructDef;
|
|
93
|
-
/**
|
|
94
|
-
* Decodes propose calldata and builds the checkpoint header structure.
|
|
95
|
-
* @param proposeCalldata - The propose function calldata
|
|
96
|
-
* @param blockHash - The L1 block hash containing this transaction
|
|
97
|
-
* @param checkpointNumber - The checkpoint number
|
|
98
|
-
* @param expectedHashes - Optional expected hashes from the CheckpointProposed event for validation
|
|
99
|
-
* @returns The decoded checkpoint header and metadata
|
|
100
|
-
*/
|
|
101
|
-
protected decodeAndBuildCheckpoint(proposeCalldata: Hex, blockHash: Hex, checkpointNumber: CheckpointNumber, expectedHashes: {
|
|
102
|
-
attestationsHash?: Hex;
|
|
103
|
-
payloadDigest?: Hex;
|
|
104
|
-
}): {
|
|
105
|
-
checkpointNumber: CheckpointNumber;
|
|
106
|
-
archiveRoot: Fr;
|
|
107
|
-
header: CheckpointHeader;
|
|
108
|
-
attestations: CommitteeAttestation[];
|
|
109
|
-
blockHash: string;
|
|
110
|
-
};
|
|
111
141
|
}
|
|
112
|
-
|
|
142
|
+
export {};
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbGRhdGFfcmV0cmlldmVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbDEvY2FsbGRhdGFfcmV0cmlldmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBd0IsS0FBSyx5QkFBeUIsRUFBbUIsTUFBTSwyQkFBMkIsQ0FBQztBQUNsSCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUVMLEtBQUssR0FBRyxFQUNSLEtBQUssV0FBVyxFQU9qQixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFNN0UsdURBQXVEO0FBQ3ZELEtBQUssY0FBYyxHQUFHO0lBQ3BCLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0lBQ25DLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDaEIsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0lBQ3pCLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxDQUFDO0lBQ3JDOzs7O09BSUc7SUFDSCxvQkFBb0IsRUFBRSx5QkFBeUIsQ0FBQztJQUNoRCxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztDQUMvQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILHFCQUFhLGlCQUFpQjtJQVUxQixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVk7SUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXO0lBQzVCLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CO0lBQ3BDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZTtJQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhO0lBZGhDLDRGQUE0RjtJQUM1RixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBNEI7SUFFOUUsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxpQ0FBaUMsSUFBSSxJQUFJLENBRS9DO0lBRUQsWUFDbUIsWUFBWSxFQUFFLGdCQUFnQixFQUM5QixXQUFXLEVBQUUscUJBQXFCLEVBQ2xDLG1CQUFtQixFQUFFLE1BQU0sRUFDM0IsZUFBZSxFQUFFLHVCQUF1QixHQUFHLFNBQVMsRUFDcEQsTUFBTSxFQUFFLE1BQU0sRUFDZCxhQUFhLEVBQUUsVUFBVSxFQUN4QztJQUVKLE9BQU8sQ0FBQyxtQkFBbUI7SUFPM0I7Ozs7Ozs7O09BUUc7SUFDRyx5QkFBeUIsQ0FDN0IsTUFBTSxFQUFFLEtBQUssTUFBTSxFQUFFLEVBQ3JCLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFDckIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ2xDLGNBQWMsRUFBRTtRQUNkLGdCQUFnQixFQUFFLEdBQUcsQ0FBQztRQUN0QixhQUFhLEVBQUUsR0FBRyxDQUFDO0tBQ3BCLEdBQ0EsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUl6QjtJQUVELHNHQUFzRztJQUN0RyxVQUFnQixtQkFBbUIsQ0FDakMsRUFBRSxFQUFFLFdBQVcsRUFDZixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsY0FBYyxFQUFFO1FBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDO1FBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQTtLQUFFLEdBQzVELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0F5Q3pCO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsVUFBZ0Isc0JBQXNCLENBQ3BDLEVBQUUsRUFBRSxXQUFXLEVBQ2YsY0FBYyxFQUFFO1FBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDO1FBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQTtLQUFFLEVBQzdELGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxTQUFTLEVBQUUsR0FBRyxHQUNiLE9BQU8sQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLENBOEJyQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILFNBQVMsQ0FBQyxtQkFBbUIsQ0FDM0IsRUFBRSxFQUFFO1FBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUFDLElBQUksRUFBRSxHQUFHLENBQUE7S0FBRSxFQUN6RCxjQUFjLEVBQUU7UUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUM7UUFBQyxhQUFhLEVBQUUsR0FBRyxDQUFBO0tBQUUsRUFDN0QsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ2xDLFNBQVMsRUFBRSxHQUFHLEdBQ2IsY0FBYyxHQUFHLFNBQVMsQ0FrRjVCO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxTQUFTLENBQUMsc0JBQXNCLENBQzlCLEVBQUUsRUFBRTtRQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7UUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFBO0tBQUUsRUFDekQsY0FBYyxFQUFFO1FBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDO1FBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQTtLQUFFLEVBQzdELGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxTQUFTLEVBQUUsR0FBRyxHQUNiLGNBQWMsR0FBRyxTQUFTLENBd0I1QjtJQUVEOzs7Ozs7T0FNRztJQUNILFVBQWdCLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQW1EakU7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFNBQVMsQ0FBQyx5QkFBeUIsQ0FDakMsZUFBZSxFQUFFLEdBQUcsRUFDcEIsY0FBYyxFQUFFO1FBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDO1FBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQTtLQUFFLEVBQzdELGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxTQUFTLEVBQUUsR0FBRyxHQUNiLGNBQWMsR0FBRyxTQUFTLENBa0U1QjtJQUVELHdFQUF3RTtJQUN4RSxPQUFPLENBQUMsdUJBQXVCO0lBSS9CLG9IQUFvSDtJQUNwSCxPQUFPLENBQUMsb0JBQW9CO0lBUzVCOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxpQ0FBaUM7Q0ErQjFDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calldata_retriever.d.ts","sourceRoot":"","sources":["../../src/l1/calldata_retriever.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"calldata_retriever.d.ts","sourceRoot":"","sources":["../../src/l1/calldata_retriever.ts"],"names":[],"mappings":"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"}
|