@aztec/archiver 4.0.0-nightly.20260112 → 4.0.0-nightly.20260114
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 +139 -22
- package/dest/archiver/archive_source_base.d.ts +75 -0
- package/dest/archiver/archive_source_base.d.ts.map +1 -0
- package/dest/archiver/archive_source_base.js +202 -0
- package/dest/archiver/archiver.d.ts +32 -168
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +123 -613
- package/dest/archiver/archiver_store_updates.d.ts +38 -0
- package/dest/archiver/archiver_store_updates.d.ts.map +1 -0
- package/dest/archiver/archiver_store_updates.js +212 -0
- package/dest/archiver/config.js +2 -2
- package/dest/archiver/index.d.ts +3 -2
- package/dest/archiver/index.d.ts.map +1 -1
- package/dest/archiver/index.js +2 -0
- package/dest/archiver/kv_archiver_store/block_store.d.ts +12 -5
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +23 -4
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +1 -1
- package/dest/archiver/kv_archiver_store/contract_class_store.js +1 -1
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +1 -1
- package/dest/archiver/kv_archiver_store/contract_instance_store.js +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +173 -12
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +159 -48
- package/dest/archiver/l1/calldata_retriever.d.ts +2 -2
- package/dest/archiver/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/archiver/l1/calldata_retriever.js +2 -2
- package/dest/archiver/l1/data_retrieval.d.ts +9 -11
- package/dest/archiver/l1/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/l1/data_retrieval.js +32 -51
- package/dest/archiver/l1/validate_trace.js +1 -1
- package/dest/archiver/test/fake_l1_state.d.ts +173 -0
- package/dest/archiver/test/fake_l1_state.d.ts.map +1 -0
- package/dest/archiver/test/fake_l1_state.js +364 -0
- package/dest/archiver/validation.d.ts +4 -4
- package/dest/archiver/validation.d.ts.map +1 -1
- package/dest/archiver/validation.js +1 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts +2 -2
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +12 -3
- package/dest/test/mock_l2_block_source.d.ts +8 -4
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +65 -19
- package/package.json +13 -13
- package/src/archiver/archive_source_base.ts +339 -0
- package/src/archiver/archiver.ts +166 -815
- package/src/archiver/archiver_store_updates.ts +321 -0
- package/src/archiver/config.ts +2 -2
- package/src/archiver/index.ts +2 -1
- package/src/archiver/kv_archiver_store/block_store.ts +36 -8
- package/src/archiver/kv_archiver_store/contract_class_store.ts +1 -1
- package/src/archiver/kv_archiver_store/contract_instance_store.ts +1 -1
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +177 -11
- package/src/archiver/l1/calldata_retriever.ts +2 -2
- package/src/archiver/l1/data_retrieval.ts +51 -68
- package/src/archiver/l1/validate_trace.ts +1 -1
- package/src/archiver/test/fake_l1_state.ts +561 -0
- package/src/archiver/validation.ts +6 -6
- package/src/test/mock_l1_to_l2_message_source.ts +10 -4
- package/src/test/mock_l2_block_source.ts +76 -18
- package/dest/archiver/archiver_store.d.ts +0 -308
- 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/src/archiver/archiver_store.ts +0 -372
- package/src/archiver/archiver_store_test_suite.ts +0 -2843
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { BlobDeserializationError, SpongeBlob, decodeCheckpointBlobDataFromBlobs, encodeBlockBlobData } from '@aztec/blob-lib';
|
|
2
2
|
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
3
3
|
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
4
|
-
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
5
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
7
6
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -78,7 +77,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
78
77
|
}
|
|
79
78
|
/**
|
|
80
79
|
* Fetches new checkpoints.
|
|
81
|
-
* @param rollup - The rollup contract
|
|
80
|
+
* @param rollup - The rollup contract wrapper.
|
|
82
81
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
83
82
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
84
83
|
* @param blobClient - The blob client client for fetching blob data.
|
|
@@ -96,37 +95,34 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
96
95
|
if (searchStartBlock > searchEndBlock) {
|
|
97
96
|
break;
|
|
98
97
|
}
|
|
99
|
-
const checkpointProposedLogs =
|
|
100
|
-
fromBlock: searchStartBlock,
|
|
101
|
-
toBlock: searchEndBlock
|
|
102
|
-
})).filter((log)=>log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
|
|
98
|
+
const checkpointProposedLogs = await rollup.getCheckpointProposedEvents(searchStartBlock, searchEndBlock);
|
|
103
99
|
if (checkpointProposedLogs.length === 0) {
|
|
104
100
|
break;
|
|
105
101
|
}
|
|
106
102
|
const lastLog = checkpointProposedLogs.at(-1);
|
|
107
|
-
logger.debug(`Got ${checkpointProposedLogs.length} processed logs for checkpoints
|
|
103
|
+
logger.debug(`Got ${checkpointProposedLogs.length} processed logs for checkpoints ${checkpointProposedLogs[0].args.checkpointNumber}-${lastLog.args.checkpointNumber} between L1 blocks ${searchStartBlock}-${searchEndBlock}`);
|
|
108
104
|
if (rollupConstants === undefined) {
|
|
109
105
|
const [chainId, version, targetCommitteeSize] = await Promise.all([
|
|
110
106
|
publicClient.getChainId(),
|
|
111
|
-
rollup.
|
|
112
|
-
rollup.
|
|
107
|
+
rollup.getVersion(),
|
|
108
|
+
rollup.getTargetCommitteeSize()
|
|
113
109
|
]);
|
|
114
110
|
rollupConstants = {
|
|
115
111
|
chainId: new Fr(chainId),
|
|
116
112
|
version: new Fr(version),
|
|
117
|
-
targetCommitteeSize
|
|
113
|
+
targetCommitteeSize
|
|
118
114
|
};
|
|
119
115
|
}
|
|
120
116
|
const newCheckpoints = await processCheckpointProposedLogs(rollup, publicClient, debugClient, blobClient, checkpointProposedLogs, rollupConstants, contractAddresses, instrumentation, logger, isHistoricalSync);
|
|
121
117
|
retrievedCheckpoints.push(...newCheckpoints);
|
|
122
|
-
searchStartBlock = lastLog.
|
|
118
|
+
searchStartBlock = lastLog.l1BlockNumber + 1n;
|
|
123
119
|
}while (searchStartBlock <= searchEndBlock)
|
|
124
120
|
// The asyncPool from processCheckpointProposedLogs will not necessarily return the checkpoints in order, so we sort them before returning.
|
|
125
121
|
return retrievedCheckpoints.sort((a, b)=>Number(a.l1.blockNumber - b.l1.blockNumber));
|
|
126
122
|
}
|
|
127
123
|
/**
|
|
128
124
|
* Processes newly received CheckpointProposed logs.
|
|
129
|
-
* @param rollup - The rollup contract
|
|
125
|
+
* @param rollup - The rollup contract wrapper.
|
|
130
126
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
131
127
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
132
128
|
* @param blobClient - The blob client client for fetching blob data.
|
|
@@ -144,22 +140,20 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
144
140
|
rollupAddress: EthAddress.fromString(rollup.address)
|
|
145
141
|
});
|
|
146
142
|
await asyncPool(10, logs, async (log)=>{
|
|
147
|
-
const checkpointNumber =
|
|
143
|
+
const checkpointNumber = log.args.checkpointNumber;
|
|
148
144
|
const archive = log.args.archive;
|
|
149
|
-
const archiveFromChain = await rollup.
|
|
150
|
-
|
|
151
|
-
]);
|
|
152
|
-
const blobHashes = log.args.versionedBlobHashes.map((blobHash)=>Buffer.from(blobHash.slice(2), 'hex'));
|
|
145
|
+
const archiveFromChain = await rollup.archiveAt(checkpointNumber);
|
|
146
|
+
const blobHashes = log.args.versionedBlobHashes;
|
|
153
147
|
// The value from the event and contract will match only if the checkpoint is in the chain.
|
|
154
|
-
if (archive
|
|
148
|
+
if (archive.equals(archiveFromChain)) {
|
|
155
149
|
// Build expected hashes object (fields may be undefined for backwards compatibility with older events)
|
|
156
150
|
const expectedHashes = {
|
|
157
|
-
attestationsHash: log.args.attestationsHash,
|
|
158
|
-
payloadDigest: log.args.payloadDigest
|
|
151
|
+
attestationsHash: log.args.attestationsHash?.toString(),
|
|
152
|
+
payloadDigest: log.args.payloadDigest?.toString()
|
|
159
153
|
};
|
|
160
|
-
const checkpoint = await calldataRetriever.getCheckpointFromRollupTx(log.
|
|
154
|
+
const checkpoint = await calldataRetriever.getCheckpointFromRollupTx(log.l1TransactionHash, blobHashes, checkpointNumber, expectedHashes);
|
|
161
155
|
const checkpointBlobData = await getCheckpointBlobDataFromBlobs(blobClient, checkpoint.blockHash, blobHashes, checkpointNumber, logger, isHistoricalSync);
|
|
162
|
-
const l1 = new L1PublishedData(log.
|
|
156
|
+
const l1 = new L1PublishedData(log.l1BlockNumber, await getL1BlockTime(publicClient, log.l1BlockNumber), log.l1BlockHash.toString());
|
|
163
157
|
retrievedCheckpoints.push({
|
|
164
158
|
...checkpoint,
|
|
165
159
|
checkpointBlobData,
|
|
@@ -167,16 +161,16 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
167
161
|
chainId,
|
|
168
162
|
version
|
|
169
163
|
});
|
|
170
|
-
logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.
|
|
171
|
-
l1BlockNumber: log.
|
|
164
|
+
logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.l1TransactionHash}`, {
|
|
165
|
+
l1BlockNumber: log.l1BlockNumber,
|
|
172
166
|
checkpointNumber,
|
|
173
167
|
archive: archive.toString(),
|
|
174
168
|
attestations: checkpoint.attestations
|
|
175
169
|
});
|
|
176
170
|
} else {
|
|
177
171
|
logger.warn(`Ignoring checkpoint ${checkpointNumber} due to archive root mismatch`, {
|
|
178
|
-
actual: archive,
|
|
179
|
-
expected: archiveFromChain
|
|
172
|
+
actual: archive.toString(),
|
|
173
|
+
expected: archiveFromChain.toString()
|
|
180
174
|
});
|
|
181
175
|
}
|
|
182
176
|
});
|
|
@@ -212,50 +206,37 @@ export async function getCheckpointBlobDataFromBlobs(blobClient, blockHash, blob
|
|
|
212
206
|
return checkpointBlobData;
|
|
213
207
|
}
|
|
214
208
|
/** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */ export async function retrieveL1ToL2Message(inbox, leaf, fromBlock, toBlock) {
|
|
215
|
-
const logs = await inbox.
|
|
216
|
-
hash: leaf.toString()
|
|
217
|
-
}, {
|
|
218
|
-
fromBlock,
|
|
219
|
-
toBlock
|
|
220
|
-
});
|
|
209
|
+
const logs = await inbox.getMessageSentEventByHash(leaf.toString(), fromBlock, toBlock);
|
|
221
210
|
const messages = mapLogsInboxMessage(logs);
|
|
222
211
|
return messages.length > 0 ? messages[0] : undefined;
|
|
223
212
|
}
|
|
224
213
|
/**
|
|
225
214
|
* Fetch L1 to L2 messages.
|
|
226
|
-
* @param
|
|
227
|
-
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
228
|
-
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
215
|
+
* @param inbox - The inbox contract wrapper.
|
|
229
216
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
230
217
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
231
218
|
* @returns An array of InboxLeaf and next eth block to search from.
|
|
232
219
|
*/ export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndBlock) {
|
|
233
220
|
const retrievedL1ToL2Messages = [];
|
|
234
221
|
while(searchStartBlock <= searchEndBlock){
|
|
235
|
-
const messageSentLogs =
|
|
236
|
-
fromBlock: searchStartBlock,
|
|
237
|
-
toBlock: searchEndBlock
|
|
238
|
-
})).filter((log)=>log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
|
|
222
|
+
const messageSentLogs = await inbox.getMessageSentEvents(searchStartBlock, searchEndBlock);
|
|
239
223
|
if (messageSentLogs.length === 0) {
|
|
240
224
|
break;
|
|
241
225
|
}
|
|
242
226
|
retrievedL1ToL2Messages.push(...mapLogsInboxMessage(messageSentLogs));
|
|
243
|
-
searchStartBlock = messageSentLogs.at(-1).
|
|
227
|
+
searchStartBlock = messageSentLogs.at(-1).l1BlockNumber + 1n;
|
|
244
228
|
}
|
|
245
229
|
return retrievedL1ToL2Messages;
|
|
246
230
|
}
|
|
247
231
|
function mapLogsInboxMessage(logs) {
|
|
248
|
-
return logs.map((log)=>{
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
rollingHash: Buffer16.fromString(rollingHash)
|
|
257
|
-
};
|
|
258
|
-
});
|
|
232
|
+
return logs.map((log)=>({
|
|
233
|
+
index: log.args.index,
|
|
234
|
+
leaf: log.args.leaf,
|
|
235
|
+
l1BlockNumber: log.l1BlockNumber,
|
|
236
|
+
l1BlockHash: log.l1BlockHash,
|
|
237
|
+
checkpointNumber: log.args.checkpointNumber,
|
|
238
|
+
rollingHash: log.args.rollingHash
|
|
239
|
+
}));
|
|
259
240
|
}
|
|
260
241
|
/** Retrieves L2ProofVerified events from the rollup contract. */ export async function retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
|
|
261
242
|
const logs = await publicClient.getLogs({
|
|
@@ -113,7 +113,7 @@ function hasTxs(block) {
|
|
|
113
113
|
* @param ethereumAllowNoDebugHosts - If false, throws an error when no trace methods are available
|
|
114
114
|
* @throws Error if ethereumAllowNoDebugHosts is false and no trace methods are available
|
|
115
115
|
*/ export async function validateAndLogTraceAvailability(client, ethereumAllowNoDebugHosts) {
|
|
116
|
-
logger.
|
|
116
|
+
logger.debug('Validating trace/debug method availability...');
|
|
117
117
|
const availability = await validateTraceAvailability(client);
|
|
118
118
|
// Check if we have support for old blocks (either debug or trace)
|
|
119
119
|
const hasOldBlockSupport = availability.debugTraceOld || availability.traceTransactionOld;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import type { BlobClientInterface } from '@aztec/blob-client/client';
|
|
2
|
+
import { type Blob } from '@aztec/blob-lib';
|
|
3
|
+
import type { InboxContract, RollupContract } from '@aztec/ethereum/contracts';
|
|
4
|
+
import type { ViemPublicClient } from '@aztec/ethereum/types';
|
|
5
|
+
import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
6
|
+
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
7
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
8
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
9
|
+
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
10
|
+
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
11
|
+
import { type MockProxy } from 'jest-mock-extended';
|
|
12
|
+
/** Configuration for the fake L1 state. */
|
|
13
|
+
export type FakeL1StateConfig = {
|
|
14
|
+
/** Genesis archive root. */
|
|
15
|
+
genesisArchiveRoot: Fr;
|
|
16
|
+
/** L1 start block number. */
|
|
17
|
+
l1StartBlock: bigint;
|
|
18
|
+
/** L1 genesis time in seconds. */
|
|
19
|
+
l1GenesisTime: bigint;
|
|
20
|
+
/** Ethereum slot duration in seconds. */
|
|
21
|
+
ethereumSlotDuration: number;
|
|
22
|
+
/** Rollup address for mock contracts. */
|
|
23
|
+
rollupAddress: EthAddress;
|
|
24
|
+
/** Inbox address for mock contracts. */
|
|
25
|
+
inboxAddress: EthAddress;
|
|
26
|
+
};
|
|
27
|
+
/** Options for adding a checkpoint. */
|
|
28
|
+
type AddCheckpointOptions = {
|
|
29
|
+
/** L1 block number where checkpoint was proposed. */
|
|
30
|
+
l1BlockNumber: bigint;
|
|
31
|
+
/** Number of L2 blocks in the checkpoint. Default: 1 */
|
|
32
|
+
numBlocks?: number;
|
|
33
|
+
/** Number of transactions per block. Default: 4 */
|
|
34
|
+
txsPerBlock?: number;
|
|
35
|
+
/** Max number of effects per tx (for generating large blobs). Default: undefined */
|
|
36
|
+
maxEffects?: number;
|
|
37
|
+
/** Signers for attestations. Default: none */
|
|
38
|
+
signers?: Secp256k1Signer[];
|
|
39
|
+
/** Override slot number. */
|
|
40
|
+
slotNumber?: SlotNumber;
|
|
41
|
+
/** Override previous archive. */
|
|
42
|
+
previousArchive?: AppendOnlyTreeSnapshot;
|
|
43
|
+
/** Timestamp for the checkpoint. */
|
|
44
|
+
timestamp?: bigint;
|
|
45
|
+
/** Number of L1-to-L2 messages. Default: 3 */
|
|
46
|
+
numL1ToL2Messages?: number;
|
|
47
|
+
/** L1 block number where messages were sent. Default: l1BlockNumber - 3 */
|
|
48
|
+
messagesL1BlockNumber?: bigint;
|
|
49
|
+
};
|
|
50
|
+
/** Result from adding a checkpoint. */
|
|
51
|
+
type AddCheckpointResult = {
|
|
52
|
+
/** The checkpoint that was created. */
|
|
53
|
+
checkpoint: Checkpoint;
|
|
54
|
+
/** The L1-to-L2 messages for this checkpoint. */
|
|
55
|
+
messages: Fr[];
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Stateful fake for L1 data used by the archiver.
|
|
59
|
+
*
|
|
60
|
+
* This class simulates the L1 blockchain state that the archiver reads from:
|
|
61
|
+
* - RollupContract: status(), archiveAt(), getVersion(), getTargetCommitteeSize(), CheckpointProposed events
|
|
62
|
+
* - InboxContract: getState(), MessageSent events
|
|
63
|
+
* - PublicClient: getBlockNumber(), getBlock(), getTransaction()
|
|
64
|
+
* - BlobClient: getBlobSidecar()
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const fake = new FakeL1State(config);
|
|
69
|
+
*
|
|
70
|
+
* // Add checkpoint (creates messages automatically)
|
|
71
|
+
* const { checkpoint, messages } = await fake.addCheckpoint(CheckpointNumber(1), { l1BlockNumber: 101n });
|
|
72
|
+
* fake.setL1BlockNumber(105n);
|
|
73
|
+
*
|
|
74
|
+
* // Status auto-updated
|
|
75
|
+
* expect(fake.getRollupStatus().pendingCheckpointNumber).toEqual(CheckpointNumber(1));
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare class FakeL1State {
|
|
79
|
+
private readonly config;
|
|
80
|
+
private readonly log;
|
|
81
|
+
private l1BlockNumber;
|
|
82
|
+
private checkpoints;
|
|
83
|
+
private messages;
|
|
84
|
+
private messagesRollingHash;
|
|
85
|
+
private lastArchive;
|
|
86
|
+
private provenCheckpointNumber;
|
|
87
|
+
private targetCommitteeSize;
|
|
88
|
+
private version;
|
|
89
|
+
private pendingCheckpointNumber;
|
|
90
|
+
constructor(config: FakeL1StateConfig);
|
|
91
|
+
/**
|
|
92
|
+
* Adds messages for a checkpoint. Returns the message leaves.
|
|
93
|
+
* Auto-updates rolling hash.
|
|
94
|
+
*
|
|
95
|
+
* Note: For most use cases, use `addCheckpoint` which creates both checkpoint and messages.
|
|
96
|
+
* Use this method only when you need to add messages without creating a checkpoint (e.g., for reorg tests).
|
|
97
|
+
*/
|
|
98
|
+
addMessages(checkpointNumber: CheckpointNumber, l1BlockNumber: bigint, messageLeaves: Fr[]): void;
|
|
99
|
+
/**
|
|
100
|
+
* Creates and adds a checkpoint with its L1-to-L2 messages.
|
|
101
|
+
* Returns both the checkpoint and the message leaves.
|
|
102
|
+
* Auto-chains from lastArchive, auto-updates pending status if L1 block >= checkpoint's L1 block.
|
|
103
|
+
*/
|
|
104
|
+
addCheckpoint(checkpointNumber: CheckpointNumber, options: AddCheckpointOptions): Promise<AddCheckpointResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Sets the current L1 block number.
|
|
107
|
+
* Auto-updates pending checkpoint number based on visible checkpoints.
|
|
108
|
+
*/
|
|
109
|
+
setL1BlockNumber(blockNumber: bigint): void;
|
|
110
|
+
/** Marks a checkpoint as proven. Updates provenCheckpointNumber. */
|
|
111
|
+
markCheckpointAsProven(checkpointNumber: CheckpointNumber): void;
|
|
112
|
+
/** Sets the target committee size for attestation validation. */
|
|
113
|
+
setTargetCommitteeSize(size: number): void;
|
|
114
|
+
/**
|
|
115
|
+
* Removes all entries for a checkpoint number (simulates L1 reorg or prune).
|
|
116
|
+
* Note: Does NOT remove messages for this checkpoint (use numL1ToL2Messages: 0 when re-adding).
|
|
117
|
+
* Auto-updates pending status.
|
|
118
|
+
*/
|
|
119
|
+
removeCheckpoint(checkpointNumber: CheckpointNumber): void;
|
|
120
|
+
/**
|
|
121
|
+
* Removes messages after a given total index (simulates L1 reorg).
|
|
122
|
+
* Auto-updates rolling hash.
|
|
123
|
+
*/
|
|
124
|
+
removeMessagesAfter(totalIndex: number): void;
|
|
125
|
+
/**
|
|
126
|
+
* Simulates a pruned checkpoint by marking all entries with this number as pruned.
|
|
127
|
+
* The event will still be returned, but archiveAt() will return the previous checkpoint's archive
|
|
128
|
+
* (or genesis if no previous checkpoint), causing a mismatch that the archiver will detect.
|
|
129
|
+
*/
|
|
130
|
+
markCheckpointAsPruned(checkpointNumber: CheckpointNumber): void;
|
|
131
|
+
/**
|
|
132
|
+
* Moves messages at a given L1 block to a new L1 block.
|
|
133
|
+
* Useful for simulating partial message visibility (messages at higher L1 blocks won't be fetched).
|
|
134
|
+
*/
|
|
135
|
+
moveMessagesToL1Block(fromL1Block: bigint, toL1Block: bigint): void;
|
|
136
|
+
/**
|
|
137
|
+
* Moves a specific message (by index in the messages array) to a new L1 block.
|
|
138
|
+
*/
|
|
139
|
+
moveMessageAtIndexToL1Block(index: number, toL1Block: bigint): void;
|
|
140
|
+
/** Gets current rollup status. */
|
|
141
|
+
getRollupStatus(): {
|
|
142
|
+
provenCheckpointNumber: CheckpointNumber;
|
|
143
|
+
pendingCheckpointNumber: CheckpointNumber;
|
|
144
|
+
provenArchive: Fr;
|
|
145
|
+
pendingArchive: Fr;
|
|
146
|
+
};
|
|
147
|
+
/** Gets the last archive (for manual chaining if needed). */
|
|
148
|
+
getLastArchive(): AppendOnlyTreeSnapshot;
|
|
149
|
+
/** Gets the latest checkpoint entry by number (returns the last added one). */
|
|
150
|
+
getCheckpoint(checkpointNumber: CheckpointNumber): Checkpoint | undefined;
|
|
151
|
+
/** Gets messages for a checkpoint. */
|
|
152
|
+
getMessages(checkpointNumber: CheckpointNumber): Fr[];
|
|
153
|
+
/** Gets the blobs for a checkpoint. */
|
|
154
|
+
getCheckpointBlobs(checkpointNumber: CheckpointNumber): Blob[];
|
|
155
|
+
/** Creates mock RollupContract that reads from this fake state. */
|
|
156
|
+
createMockRollupContract(_publicClient: MockProxy<ViemPublicClient>): MockProxy<RollupContract>;
|
|
157
|
+
/** Creates mock InboxContract that reads from this fake state. */
|
|
158
|
+
createMockInboxContract(_publicClient: MockProxy<ViemPublicClient>): MockProxy<InboxContract>;
|
|
159
|
+
/** Creates mock PublicClient that reads from this fake state. */
|
|
160
|
+
createMockPublicClient(): MockProxy<ViemPublicClient>;
|
|
161
|
+
/** Creates mock BlobClient that reads from this fake state. */
|
|
162
|
+
createMockBlobClient(): MockProxy<BlobClientInterface>;
|
|
163
|
+
private updatePendingCheckpointNumber;
|
|
164
|
+
private getArchiveAt;
|
|
165
|
+
private getNextBlockNumber;
|
|
166
|
+
private getCheckpointProposedLogs;
|
|
167
|
+
private getMessageSentLogs;
|
|
168
|
+
private makeRollupTx;
|
|
169
|
+
private makeVersionedBlobHashes;
|
|
170
|
+
private makeBlobsFromCheckpoint;
|
|
171
|
+
}
|
|
172
|
+
export {};
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFrZV9sMV9zdGF0ZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdmVyL3Rlc3QvZmFrZV9sMV9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBcUQsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRixPQUFPLEtBQUssRUFBeUIsYUFBYSxFQUFrQixjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV0SCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBb0IsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdELE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBSzFELDJDQUEyQztBQUMzQyxNQUFNLE1BQU0saUJBQWlCLEdBQUc7SUFDOUIsNEJBQTRCO0lBQzVCLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztJQUN2Qiw2QkFBNkI7SUFDN0IsWUFBWSxFQUFFLE1BQU0sQ0FBQztJQUNyQixrQ0FBa0M7SUFDbEMsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUN0Qix5Q0FBeUM7SUFDekMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDO0lBQzdCLHlDQUF5QztJQUN6QyxhQUFhLEVBQUUsVUFB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake_l1_state.d.ts","sourceRoot":"","sources":["../../../src/archiver/test/fake_l1_state.ts"],"names":[],"mappings":"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"}
|