@aztec/archiver 0.0.1-commit.934299a21 → 0.0.1-commit.949a33fd8
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 +12 -6
- package/dest/archiver.d.ts +18 -10
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +146 -57
- package/dest/config.d.ts +5 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +16 -4
- package/dest/errors.d.ts +61 -10
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +88 -14
- package/dest/factory.d.ts +4 -5
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +26 -22
- package/dest/index.d.ts +3 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/l1/calldata_retriever.d.ts +2 -1
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +11 -5
- package/dest/l1/data_retrieval.d.ts +24 -12
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +36 -37
- 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/data_source_base.d.ts +12 -6
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +24 -6
- package/dest/modules/data_store_updater.d.ts +28 -15
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +102 -80
- package/dest/modules/instrumentation.d.ts +7 -2
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +22 -6
- package/dest/modules/l1_synchronizer.d.ts +8 -2
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +292 -144
- package/dest/modules/validation.d.ts +4 -3
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +6 -6
- package/dest/store/block_store.d.ts +83 -17
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +399 -124
- package/dest/store/contract_class_store.d.ts +2 -3
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +7 -67
- package/dest/store/contract_instance_store.d.ts +1 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +6 -2
- package/dest/store/kv_archiver_store.d.ts +70 -23
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +88 -27
- package/dest/store/l2_tips_cache.d.ts +2 -1
- package/dest/store/l2_tips_cache.d.ts.map +1 -1
- package/dest/store/l2_tips_cache.js +27 -7
- package/dest/store/log_store.d.ts +6 -3
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +95 -20
- package/dest/store/message_store.d.ts +5 -1
- package/dest/store/message_store.d.ts.map +1 -1
- package/dest/store/message_store.js +21 -9
- package/dest/test/fake_l1_state.d.ts +20 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +114 -18
- 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 +19 -4
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +57 -7
- 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 +13 -1
- package/dest/test/noop_l1_archiver.d.ts +4 -1
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +9 -3
- package/package.json +13 -13
- package/src/archiver.ts +179 -56
- package/src/config.ts +23 -2
- package/src/errors.ts +133 -22
- package/src/factory.ts +24 -15
- package/src/index.ts +2 -1
- package/src/l1/calldata_retriever.ts +17 -5
- package/src/l1/data_retrieval.ts +52 -53
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/modules/data_source_base.ts +43 -7
- package/src/modules/data_store_updater.ts +126 -109
- package/src/modules/instrumentation.ts +27 -7
- package/src/modules/l1_synchronizer.ts +371 -178
- package/src/modules/validation.ts +10 -9
- package/src/store/block_store.ts +489 -143
- package/src/store/contract_class_store.ts +8 -106
- package/src/store/contract_instance_store.ts +8 -5
- package/src/store/kv_archiver_store.ts +133 -39
- package/src/store/l2_tips_cache.ts +58 -13
- package/src/store/log_store.ts +128 -32
- package/src/store/message_store.ts +27 -10
- package/src/structs/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +142 -29
- package/src/test/mock_l1_to_l2_message_source.ts +1 -0
- package/src/test/mock_l2_block_source.ts +73 -5
- package/src/test/mock_structs.ts +20 -6
- package/src/test/noop_l1_archiver.ts +10 -2
|
@@ -5,6 +5,7 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
5
5
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
6
6
|
import { mapRange } from '@aztec/kv-store';
|
|
7
7
|
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
8
|
+
import { L1ToL2MessagesNotReadyError } from '../errors.js';
|
|
8
9
|
import { deserializeInboxMessage, serializeInboxMessage, updateRollingHash } from '../structs/inbox_message.js';
|
|
9
10
|
export class MessageStoreError extends Error {
|
|
10
11
|
inboxMessage;
|
|
@@ -19,6 +20,7 @@ export class MessageStore {
|
|
|
19
20
|
/** Maps from hex-stringified message leaf to its index */ #l1ToL2MessageIndices;
|
|
20
21
|
/** Stores L1 block number and hash of the L1 synchpoint */ #lastSynchedL1Block;
|
|
21
22
|
/** Stores total messages stored */ #totalMessageCount;
|
|
23
|
+
/** Stores the checkpoint number whose message tree is currently being filled on L1. */ #inboxTreeInProgress;
|
|
22
24
|
#log;
|
|
23
25
|
constructor(db){
|
|
24
26
|
this.db = db;
|
|
@@ -27,6 +29,7 @@ export class MessageStore {
|
|
|
27
29
|
this.#l1ToL2MessageIndices = db.openMap('archiver_l1_to_l2_message_indices');
|
|
28
30
|
this.#lastSynchedL1Block = db.openSingleton('archiver_last_l1_block_id');
|
|
29
31
|
this.#totalMessageCount = db.openSingleton('archiver_l1_to_l2_message_count');
|
|
32
|
+
this.#inboxTreeInProgress = db.openSingleton('archiver_inbox_tree_in_progress');
|
|
30
33
|
}
|
|
31
34
|
async getTotalL1ToL2MessageCount() {
|
|
32
35
|
return await this.#totalMessageCount.getAsync() ?? 0n;
|
|
@@ -87,7 +90,7 @@ export class MessageStore {
|
|
|
87
90
|
if (lastMessage && message.checkpointNumber === lastMessage.checkpointNumber && message.index !== lastMessage.index + 1n) {
|
|
88
91
|
throw new MessageStoreError(`Missing prior message for incoming L1 to L2 message ${message.leaf.toString()} ` + `with index ${message.index}`, message);
|
|
89
92
|
}
|
|
90
|
-
// Check the first message in a
|
|
93
|
+
// Check the first message in a checkpoint has the correct index.
|
|
91
94
|
if ((!lastMessage || message.checkpointNumber > lastMessage.checkpointNumber) && message.index !== expectedStart) {
|
|
92
95
|
throw new MessageStoreError(`Message ${message.leaf.toString()} for checkpoint ${message.checkpointNumber} has wrong index ` + `${message.index} (expected ${expectedStart})`, message);
|
|
93
96
|
}
|
|
@@ -98,14 +101,6 @@ export class MessageStore {
|
|
|
98
101
|
this.#log.trace(`Inserted L1 to L2 message ${message.leaf} with index ${message.index} into the store`);
|
|
99
102
|
lastMessage = message;
|
|
100
103
|
}
|
|
101
|
-
// Update the L1 sync point to that of the last message added.
|
|
102
|
-
const currentSyncPoint = await this.getSynchedL1Block();
|
|
103
|
-
if (!currentSyncPoint || currentSyncPoint.l1BlockNumber < lastMessage.l1BlockNumber) {
|
|
104
|
-
await this.setSynchedL1Block({
|
|
105
|
-
l1BlockNumber: lastMessage.l1BlockNumber,
|
|
106
|
-
l1BlockHash: lastMessage.l1BlockHash
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
104
|
// Update total message count with the number of inserted messages.
|
|
110
105
|
await this.increaseTotalMessageCount(messageCount);
|
|
111
106
|
});
|
|
@@ -124,7 +119,24 @@ export class MessageStore {
|
|
|
124
119
|
}));
|
|
125
120
|
return msg ? deserializeInboxMessage(msg) : undefined;
|
|
126
121
|
}
|
|
122
|
+
/** Returns the inbox tree-in-progress checkpoint number from L1, or undefined if not yet set. */ getInboxTreeInProgress() {
|
|
123
|
+
return this.#inboxTreeInProgress.getAsync();
|
|
124
|
+
}
|
|
125
|
+
/** Atomically updates the message sync state: the L1 sync point and the inbox tree-in-progress marker. */ setMessageSyncState(l1Block, treeInProgress) {
|
|
126
|
+
return this.db.transactionAsync(async ()=>{
|
|
127
|
+
await this.setSynchedL1Block(l1Block);
|
|
128
|
+
if (treeInProgress !== undefined) {
|
|
129
|
+
await this.#inboxTreeInProgress.set(treeInProgress);
|
|
130
|
+
} else {
|
|
131
|
+
await this.#inboxTreeInProgress.delete();
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
127
135
|
async getL1ToL2Messages(checkpointNumber) {
|
|
136
|
+
const treeInProgress = await this.#inboxTreeInProgress.getAsync();
|
|
137
|
+
if (treeInProgress !== undefined && BigInt(checkpointNumber) >= treeInProgress) {
|
|
138
|
+
throw new L1ToL2MessagesNotReadyError(checkpointNumber, treeInProgress);
|
|
139
|
+
}
|
|
128
140
|
const messages = [];
|
|
129
141
|
const [startIndex, endIndex] = InboxLeaf.indexRangeForCheckpoint(checkpointNumber);
|
|
130
142
|
let lastIndex = startIndex - 1n;
|
|
@@ -93,6 +93,7 @@ export declare class FakeL1State {
|
|
|
93
93
|
private version;
|
|
94
94
|
private canPruneResult;
|
|
95
95
|
private pendingCheckpointNumber;
|
|
96
|
+
private finalizedL1BlockNumber;
|
|
96
97
|
constructor(config: FakeL1StateConfig);
|
|
97
98
|
/**
|
|
98
99
|
* Adds messages for a checkpoint. Returns the message leaves.
|
|
@@ -125,8 +126,17 @@ export declare class FakeL1State {
|
|
|
125
126
|
* Auto-updates pending checkpoint number based on visible checkpoints.
|
|
126
127
|
*/
|
|
127
128
|
setL1BlockNumber(blockNumber: bigint): void;
|
|
129
|
+
/**
|
|
130
|
+
* Sets the L1 block number that will be reported as "finalized". Pass `undefined` to
|
|
131
|
+
* simulate a chain that does not yet have a finalized block (devnet startup).
|
|
132
|
+
*/
|
|
133
|
+
setFinalizedL1BlockNumber(blockNumber: bigint | undefined): void;
|
|
128
134
|
/** Marks a checkpoint as proven. Updates provenCheckpointNumber. */
|
|
129
135
|
markCheckpointAsProven(checkpointNumber: CheckpointNumber): void;
|
|
136
|
+
/**
|
|
137
|
+
* Simulates what `rollup.getProvenCheckpointNumber({ blockNumber: atL1Block })` would return.
|
|
138
|
+
*/
|
|
139
|
+
getProvenCheckpointNumberAtL1Block(atL1Block: bigint): CheckpointNumber;
|
|
130
140
|
/** Sets the target committee size for attestation validation. */
|
|
131
141
|
setTargetCommitteeSize(size: number): void;
|
|
132
142
|
/** Sets whether the rollup contract would allow pruning at the next block. */
|
|
@@ -137,6 +147,13 @@ export declare class FakeL1State {
|
|
|
137
147
|
* Auto-updates pending status.
|
|
138
148
|
*/
|
|
139
149
|
removeCheckpoint(checkpointNumber: CheckpointNumber): void;
|
|
150
|
+
/**
|
|
151
|
+
* Moves a checkpoint to a different L1 block number (simulates L1 reorg that
|
|
152
|
+
* re-includes the same checkpoint transaction in a different block).
|
|
153
|
+
* The checkpoint content stays the same — only the L1 metadata changes.
|
|
154
|
+
* Auto-updates pending status.
|
|
155
|
+
*/
|
|
156
|
+
moveCheckpointToL1Block(checkpointNumber: CheckpointNumber, newL1BlockNumber: bigint): void;
|
|
140
157
|
/**
|
|
141
158
|
* Removes messages after a given total index (simulates L1 reorg).
|
|
142
159
|
* Auto-updates rolling hash.
|
|
@@ -185,11 +202,13 @@ export declare class FakeL1State {
|
|
|
185
202
|
private getNextBlockNumber;
|
|
186
203
|
private getCheckpointProposedLogs;
|
|
187
204
|
private getMessageSentLogs;
|
|
205
|
+
private getMessageSentLogByHash;
|
|
188
206
|
private makeRollupTx;
|
|
207
|
+
private getSignatureContext;
|
|
189
208
|
/** Extracts the CommitteeAttestations struct definition from RollupAbi for hash computation. */
|
|
190
209
|
private getCommitteeAttestationsStructDef;
|
|
191
210
|
private makeVersionedBlobHashes;
|
|
192
211
|
private makeBlobsFromCheckpoint;
|
|
193
212
|
}
|
|
194
213
|
export {};
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFrZV9sMV9zdGF0ZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvZmFrZV9sMV9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBcUQsTUFBTSxpQkFBaUIsQ0FBQztBQUUvRixPQUFPLEtBQUssRUFBeUIsYUFBYSxFQUFrQixjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV0SCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBb0IsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUF5RCxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFjMUQsMkNBQTJDO0FBQzNDLE1BQU0sTUFBTSxpQkFBaUIsR0FBRztJQUM5Qiw0QkFBNEI7SUFDNUIsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLDZCQUE2QjtJQUM3QixZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLGtDQUFrQztJQUNsQyxhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLHlDQUF5QztJQUN6QyxvQkFBb0IsRUFBRSxNQUFNLENBQUM7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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake_l1_state.d.ts","sourceRoot":"","sources":["../../src/test/fake_l1_state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,KAAK,IAAI,EAAqD,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"fake_l1_state.d.ts","sourceRoot":"","sources":["../../src/test/fake_l1_state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { getBlobsPerL1Block, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
|
|
2
|
+
import { INITIAL_CHECKPOINT_NUMBER } from '@aztec/constants';
|
|
2
3
|
import { MULTI_CALL_3_ADDRESS } from '@aztec/ethereum/contracts';
|
|
3
4
|
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
4
5
|
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
6
|
+
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
5
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
8
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
7
9
|
import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
8
10
|
import { getSlotAtTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
9
11
|
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
10
|
-
import { ConsensusPayload,
|
|
11
|
-
import {
|
|
12
|
+
import { ConsensusPayload, getHashedSignaturePayloadTypedData } from '@aztec/stdlib/p2p';
|
|
13
|
+
import { mockCheckpointAndMessages } from '@aztec/stdlib/testing';
|
|
12
14
|
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
13
15
|
import { mock } from 'jest-mock-extended';
|
|
14
16
|
import { encodeAbiParameters, encodeFunctionData, keccak256, multicall3Abi, toHex } from 'viem';
|
|
@@ -47,6 +49,10 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
47
49
|
canPruneResult;
|
|
48
50
|
// Computed from checkpoints based on L1 block visibility
|
|
49
51
|
pendingCheckpointNumber;
|
|
52
|
+
// The L1 block number reported as "finalized" (defaults to the start block).
|
|
53
|
+
// `undefined` simulates the startup window on a fresh devnet where
|
|
54
|
+
// `getBlock({ blockTag: 'finalized' })` fails with "finalized block not found".
|
|
55
|
+
finalizedL1BlockNumber;
|
|
50
56
|
constructor(config){
|
|
51
57
|
this.config = config;
|
|
52
58
|
this.log = createLogger('archiver:test:fake-l1');
|
|
@@ -59,6 +65,7 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
59
65
|
this.canPruneResult = false;
|
|
60
66
|
this.pendingCheckpointNumber = CheckpointNumber(0);
|
|
61
67
|
this.l1BlockNumber = config.l1StartBlock;
|
|
68
|
+
this.finalizedL1BlockNumber = config.l1StartBlock;
|
|
62
69
|
this.lastArchive = new AppendOnlyTreeSnapshot(config.genesisArchiveRoot, 1);
|
|
63
70
|
}
|
|
64
71
|
/**
|
|
@@ -157,9 +164,27 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
157
164
|
this.l1BlockNumber = blockNumber;
|
|
158
165
|
this.updatePendingCheckpointNumber();
|
|
159
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Sets the L1 block number that will be reported as "finalized". Pass `undefined` to
|
|
169
|
+
* simulate a chain that does not yet have a finalized block (devnet startup).
|
|
170
|
+
*/ setFinalizedL1BlockNumber(blockNumber) {
|
|
171
|
+
this.finalizedL1BlockNumber = blockNumber;
|
|
172
|
+
}
|
|
160
173
|
/** Marks a checkpoint as proven. Updates provenCheckpointNumber. */ markCheckpointAsProven(checkpointNumber) {
|
|
161
174
|
this.provenCheckpointNumber = checkpointNumber;
|
|
162
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* Simulates what `rollup.getProvenCheckpointNumber({ blockNumber: atL1Block })` would return.
|
|
178
|
+
*/ getProvenCheckpointNumberAtL1Block(atL1Block) {
|
|
179
|
+
if (this.provenCheckpointNumber === 0) {
|
|
180
|
+
return CheckpointNumber(0);
|
|
181
|
+
}
|
|
182
|
+
const checkpoint = this.checkpoints.find((cp)=>cp.checkpointNumber === this.provenCheckpointNumber);
|
|
183
|
+
if (checkpoint && checkpoint.l1BlockNumber <= atL1Block) {
|
|
184
|
+
return this.provenCheckpointNumber;
|
|
185
|
+
}
|
|
186
|
+
return CheckpointNumber(0);
|
|
187
|
+
}
|
|
163
188
|
/** Sets the target committee size for attestation validation. */ setTargetCommitteeSize(size) {
|
|
164
189
|
this.targetCommitteeSize = size;
|
|
165
190
|
}
|
|
@@ -175,6 +200,19 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
175
200
|
this.updatePendingCheckpointNumber();
|
|
176
201
|
}
|
|
177
202
|
/**
|
|
203
|
+
* Moves a checkpoint to a different L1 block number (simulates L1 reorg that
|
|
204
|
+
* re-includes the same checkpoint transaction in a different block).
|
|
205
|
+
* The checkpoint content stays the same — only the L1 metadata changes.
|
|
206
|
+
* Auto-updates pending status.
|
|
207
|
+
*/ moveCheckpointToL1Block(checkpointNumber, newL1BlockNumber) {
|
|
208
|
+
for (const cpData of this.checkpoints){
|
|
209
|
+
if (cpData.checkpointNumber === checkpointNumber) {
|
|
210
|
+
cpData.l1BlockNumber = newL1BlockNumber;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
this.updatePendingCheckpointNumber();
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
178
216
|
* Removes messages after a given total index (simulates L1 reorg).
|
|
179
217
|
* Auto-updates rolling hash.
|
|
180
218
|
*/ removeMessagesAfter(totalIndex) {
|
|
@@ -246,6 +284,10 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
246
284
|
archiveOfMyCheckpoint: this.getArchiveAt(localCheckpointNum)
|
|
247
285
|
});
|
|
248
286
|
});
|
|
287
|
+
mockRollup.getProvenCheckpointNumber.mockImplementation((options)=>{
|
|
288
|
+
const atBlock = options?.blockNumber ?? this.l1BlockNumber;
|
|
289
|
+
return Promise.resolve(this.getProvenCheckpointNumberAtL1Block(atBlock));
|
|
290
|
+
});
|
|
249
291
|
mockRollup.canPruneAtTime.mockImplementation(()=>Promise.resolve(this.canPruneResult));
|
|
250
292
|
// Mock the wrapper method for fetching checkpoint events
|
|
251
293
|
mockRollup.getCheckpointProposedEvents.mockImplementation((fromBlock, toBlock)=>Promise.resolve(this.getCheckpointProposedLogs(fromBlock, toBlock)));
|
|
@@ -256,23 +298,49 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
256
298
|
}
|
|
257
299
|
/** Creates mock InboxContract that reads from this fake state. */ createMockInboxContract(_publicClient) {
|
|
258
300
|
const mockInbox = mock();
|
|
259
|
-
mockInbox.getState.mockImplementation(()=>
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
301
|
+
mockInbox.getState.mockImplementation((opts = {})=>{
|
|
302
|
+
// Filter messages visible at the given block number (or all if not specified)
|
|
303
|
+
const blockNumber = opts.blockNumber ?? this.l1BlockNumber;
|
|
304
|
+
const visibleMessages = this.messages.filter((m)=>m.l1BlockNumber <= blockNumber);
|
|
305
|
+
// treeInProgress must be > any sealed checkpoint. On L1, a checkpoint can only be proposed
|
|
306
|
+
// after its messages are sealed, so treeInProgress > checkpointNumber for all published checkpoints.
|
|
307
|
+
const maxFromMessages = visibleMessages.length > 0 ? Math.max(...visibleMessages.map((m)=>Number(m.checkpointNumber))) + 1 : 0;
|
|
308
|
+
const maxFromCheckpoints = this.checkpoints.length > 0 ? Math.max(...this.checkpoints.filter((cp)=>!cp.pruned && cp.l1BlockNumber <= blockNumber).map((cp)=>Number(cp.checkpointNumber)), 0) + 1 : 0;
|
|
309
|
+
const treeInProgress = Math.max(maxFromMessages, maxFromCheckpoints, INITIAL_CHECKPOINT_NUMBER);
|
|
310
|
+
// Compute rolling hash only for visible messages
|
|
311
|
+
const rollingHash = visibleMessages.length > 0 ? visibleMessages[visibleMessages.length - 1].rollingHash : Buffer16.ZERO;
|
|
312
|
+
return Promise.resolve({
|
|
313
|
+
messagesRollingHash: rollingHash,
|
|
314
|
+
totalMessagesInserted: BigInt(visibleMessages.length),
|
|
315
|
+
treeInProgress: BigInt(treeInProgress)
|
|
316
|
+
});
|
|
317
|
+
});
|
|
264
318
|
// Mock the wrapper methods for fetching message events
|
|
265
319
|
mockInbox.getMessageSentEvents.mockImplementation((fromBlock, toBlock)=>Promise.resolve(this.getMessageSentLogs(fromBlock, toBlock)));
|
|
266
|
-
mockInbox.getMessageSentEventByHash.mockImplementation((
|
|
320
|
+
mockInbox.getMessageSentEventByHash.mockImplementation((msgHash, aroundL1BlockNumber)=>Promise.resolve(this.getMessageSentLogByHash(msgHash, aroundL1BlockNumber)));
|
|
267
321
|
return mockInbox;
|
|
268
322
|
}
|
|
269
323
|
/** Creates mock PublicClient that reads from this fake state. */ createMockPublicClient() {
|
|
270
324
|
const publicClient = mock();
|
|
271
325
|
publicClient.getChainId.mockResolvedValue(1);
|
|
326
|
+
// Several consumers (CalldataRetriever, ArchiverL1Synchronizer) derive the EIP-712 signing
|
|
327
|
+
// context from `publicClient.chain.id`. Pin it so it matches `getSignatureContext()` below.
|
|
328
|
+
publicClient.chain = {
|
|
329
|
+
id: 1
|
|
330
|
+
};
|
|
272
331
|
publicClient.getBlockNumber.mockImplementation(()=>Promise.resolve(this.l1BlockNumber));
|
|
273
|
-
// Use async function pattern that existing test uses for getBlock
|
|
274
332
|
publicClient.getBlock.mockImplementation(async (args = {})=>{
|
|
275
|
-
|
|
333
|
+
let blockNum;
|
|
334
|
+
if (args.blockTag === 'finalized') {
|
|
335
|
+
if (this.finalizedL1BlockNumber === undefined) {
|
|
336
|
+
throw Object.assign(new Error('finalized block not found'), {
|
|
337
|
+
details: 'finalized block not found'
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
blockNum = this.finalizedL1BlockNumber;
|
|
341
|
+
} else {
|
|
342
|
+
blockNum = args.blockNumber ?? await publicClient.getBlockNumber();
|
|
343
|
+
}
|
|
276
344
|
return {
|
|
277
345
|
number: blockNum,
|
|
278
346
|
timestamp: BigInt(blockNum) * BigInt(this.config.ethereumSlotDuration) + this.config.l1GenesisTime,
|
|
@@ -285,8 +353,8 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
285
353
|
}
|
|
286
354
|
/** Creates mock BlobClient that reads from this fake state. */ createMockBlobClient() {
|
|
287
355
|
const blobClient = mock();
|
|
288
|
-
// The blockId is the
|
|
289
|
-
blobClient.getBlobSidecar.mockImplementation((blockId)=>Promise.resolve(this.checkpoints.find((cpData)=>cpData.
|
|
356
|
+
// The blockId is the L1 block hash, which we derive from the L1 block number
|
|
357
|
+
blobClient.getBlobSidecar.mockImplementation((blockId)=>Promise.resolve(this.checkpoints.find((cpData)=>Buffer32.fromBigInt(cpData.l1BlockNumber).toString() === blockId)?.blobs ?? []));
|
|
290
358
|
blobClient.testSources.mockResolvedValue(undefined);
|
|
291
359
|
return blobClient;
|
|
292
360
|
}
|
|
@@ -337,13 +405,37 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
337
405
|
}
|
|
338
406
|
}));
|
|
339
407
|
}
|
|
408
|
+
getMessageSentLogByHash(msgHash, aroundL1BlockNumber) {
|
|
409
|
+
const msg = this.messages.find((msg)=>msg.leaf.toString() === msgHash && msg.l1BlockNumber >= aroundL1BlockNumber - 5n && msg.l1BlockNumber <= aroundL1BlockNumber + 5n);
|
|
410
|
+
if (!msg) {
|
|
411
|
+
return undefined;
|
|
412
|
+
}
|
|
413
|
+
return {
|
|
414
|
+
l1BlockNumber: msg.l1BlockNumber,
|
|
415
|
+
l1BlockHash: Buffer32.fromBigInt(msg.l1BlockNumber),
|
|
416
|
+
l1TransactionHash: `0x${msg.l1BlockNumber.toString(16)}`,
|
|
417
|
+
args: {
|
|
418
|
+
checkpointNumber: msg.checkpointNumber,
|
|
419
|
+
index: msg.index,
|
|
420
|
+
leaf: msg.leaf,
|
|
421
|
+
rollingHash: msg.rollingHash
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
}
|
|
340
425
|
async makeRollupTx(checkpoint, signers) {
|
|
341
|
-
const
|
|
426
|
+
const signatureContext = this.getSignatureContext();
|
|
427
|
+
const consensusPayload = ConsensusPayload.fromCheckpoint(checkpoint, signatureContext);
|
|
428
|
+
const attestationDigest = getHashedSignaturePayloadTypedData(consensusPayload);
|
|
429
|
+
const attestations = signers.map((signer)=>CommitteeAttestation.fromSignature(signer.sign(attestationDigest))).map((committeeAttestation)=>committeeAttestation.toViem());
|
|
342
430
|
const header = checkpoint.header.toViem();
|
|
343
431
|
const blobInput = getPrefixedEthBlobCommitments(await getBlobsPerL1Block(checkpoint.toBlobFields()));
|
|
344
432
|
const archive = toHex(checkpoint.archive.root.toBuffer());
|
|
345
|
-
const attestationsAndSigners = new CommitteeAttestationsAndSigners(attestations.map((attestation)=>CommitteeAttestation.fromViem(attestation)));
|
|
346
|
-
|
|
433
|
+
const attestationsAndSigners = new CommitteeAttestationsAndSigners(attestations.map((attestation)=>CommitteeAttestation.fromViem(attestation)), signatureContext);
|
|
434
|
+
// Fall back to a random signer when no attesters are provided, so tests that
|
|
435
|
+
// don't care about the proposer identity (e.g. sync tests) still produce a
|
|
436
|
+
// valid-looking signature for the attestationsAndSigners struct.
|
|
437
|
+
const proposerSigner = signers[0] ?? Secp256k1Signer.random();
|
|
438
|
+
const attestationsAndSignersSignature = proposerSigner.sign(getHashedSignaturePayloadTypedData(attestationsAndSigners));
|
|
347
439
|
const packedAttestations = attestationsAndSigners.getPackedAttestations();
|
|
348
440
|
const rollupInput = encodeFunctionData({
|
|
349
441
|
abi: RollupAbi,
|
|
@@ -382,9 +474,7 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
382
474
|
packedAttestations
|
|
383
475
|
])));
|
|
384
476
|
// Compute payloadDigest (same logic as CalldataRetriever)
|
|
385
|
-
const
|
|
386
|
-
const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation);
|
|
387
|
-
const payloadDigest = Buffer32.fromString(keccak256(payloadToSign));
|
|
477
|
+
const payloadDigest = getHashedSignaturePayloadTypedData(consensusPayload);
|
|
388
478
|
const tx = {
|
|
389
479
|
input: multiCallInput,
|
|
390
480
|
hash: archive,
|
|
@@ -397,6 +487,12 @@ import { updateRollingHash } from '../structs/inbox_message.js';
|
|
|
397
487
|
payloadDigest
|
|
398
488
|
};
|
|
399
489
|
}
|
|
490
|
+
getSignatureContext() {
|
|
491
|
+
return {
|
|
492
|
+
chainId: 1,
|
|
493
|
+
rollupAddress: this.config.rollupAddress
|
|
494
|
+
};
|
|
495
|
+
}
|
|
400
496
|
/** Extracts the CommitteeAttestations struct definition from RollupAbi for hash computation. */ getCommitteeAttestationsStructDef() {
|
|
401
497
|
const proposeFunction = RollupAbi.find((item)=>item.type === 'function' && item.name === 'propose');
|
|
402
498
|
if (!proposeFunction) {
|
|
@@ -16,4 +16,4 @@ export declare class MockL1ToL2MessageSource implements L1ToL2MessageSource {
|
|
|
16
16
|
getBlockNumber(): Promise<BlockNumber>;
|
|
17
17
|
getL2Tips(): Promise<L2Tips>;
|
|
18
18
|
}
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19sMV90b19sMl9tZXNzYWdlX3NvdXJjZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvbW9ja19sMV90b19sMl9tZXNzYWdlX3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFvQyxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRixPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5FOztHQUVHO0FBQ0gscUJBQWEsdUJBQXdCLFlBQVcsbUJBQW1CO0lBR3JELE9BQU8sQ0FBQyxXQUFXO0lBRi9CLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBcUM7SUFFbEUsWUFBb0IsV0FBVyxFQUFFLE1BQU0sRUFBSTtJQUVwQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBRXRFO0lBRU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRXhDO0lBRUQsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBRW5FO0lBRUQscUJBQXFCLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUVyRTtJQUVELGNBQWMseUJBRWI7SUFFRCxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQWUzQjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_l1_to_l2_message_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l1_to_l2_message_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAoC,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE;;GAEG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IAGrD,OAAO,CAAC,WAAW;IAF/B,OAAO,CAAC,qBAAqB,CAAqC;IAElE,YAAoB,WAAW,EAAE,MAAM,EAAI;IAEpC,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,QAEtE;IAEM,cAAc,CAAC,WAAW,EAAE,MAAM,QAExC;IAED,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAEnE;IAED,qBAAqB,CAAC,cAAc,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAErE;IAED,cAAc,yBAEb;IAED,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"mock_l1_to_l2_message_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l1_to_l2_message_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAoC,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE;;GAEG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IAGrD,OAAO,CAAC,WAAW;IAF/B,OAAO,CAAC,qBAAqB,CAAqC;IAElE,YAAoB,WAAW,EAAE,MAAM,EAAI;IAEpC,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,QAEtE;IAEM,cAAc,CAAC,WAAW,EAAE,MAAM,QAExC;IAED,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAEnE;IAED,qBAAqB,CAAC,cAAc,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAErE;IAED,cAAc,yBAEb;IAED,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAe3B;CACF"}
|
|
@@ -4,7 +4,7 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
4
4
|
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
5
5
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
6
|
import { type BlockData, BlockHash, CheckpointedL2Block, L2Block, type L2BlockSource, type L2Tips, type ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
7
|
-
import { Checkpoint, type CheckpointData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
7
|
+
import { Checkpoint, type CheckpointData, type ProposedCheckpointData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
8
8
|
import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
9
9
|
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
10
10
|
import { type BlockHeader, TxHash, TxReceipt } from '@aztec/stdlib/tx';
|
|
@@ -18,15 +18,18 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
18
18
|
private provenBlockNumber;
|
|
19
19
|
private finalizedBlockNumber;
|
|
20
20
|
private checkpointedBlockNumber;
|
|
21
|
+
private proposedCheckpointBlockNumber;
|
|
21
22
|
private log;
|
|
22
23
|
/** Creates blocks grouped into single-block checkpoints. */
|
|
23
24
|
createBlocks(numBlocks: number): Promise<void>;
|
|
25
|
+
getCheckpointNumber(): Promise<CheckpointNumber>;
|
|
24
26
|
/** Creates checkpoints, each containing `blocksPerCheckpoint` blocks. */
|
|
25
27
|
createCheckpoints(numCheckpoints: number, blocksPerCheckpoint?: number): Promise<void>;
|
|
26
28
|
addProposedBlocks(blocks: L2Block[]): void;
|
|
27
29
|
removeBlocks(numBlocks: number): void;
|
|
28
30
|
setProvenBlockNumber(provenBlockNumber: number): void;
|
|
29
31
|
setFinalizedBlockNumber(finalizedBlockNumber: number): void;
|
|
32
|
+
setProposedCheckpointBlockNumber(blockNumber: number): void;
|
|
30
33
|
setCheckpointedBlockNumber(checkpointedBlockNumber: number): void;
|
|
31
34
|
/**
|
|
32
35
|
* Method to fetch the rollup contract address at the base-layer.
|
|
@@ -46,6 +49,7 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
46
49
|
getProvenBlockNumber(): Promise<BlockNumber>;
|
|
47
50
|
getCheckpointedL2BlockNumber(): Promise<BlockNumber>;
|
|
48
51
|
getFinalizedL2BlockNumber(): Promise<BlockNumber>;
|
|
52
|
+
getProposedCheckpointL2BlockNumber(): Promise<BlockNumber>;
|
|
49
53
|
getCheckpointedBlock(number: BlockNumber): Promise<CheckpointedL2Block | undefined>;
|
|
50
54
|
getCheckpointedBlocks(from: BlockNumber, limit: number): Promise<CheckpointedL2Block[]>;
|
|
51
55
|
/**
|
|
@@ -76,6 +80,15 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
76
80
|
getBlockHeaderByHash(blockHash: BlockHash): Promise<BlockHeader | undefined>;
|
|
77
81
|
getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined>;
|
|
78
82
|
getBlockData(number: BlockNumber): Promise<BlockData | undefined>;
|
|
83
|
+
getCheckpointData(_n: CheckpointNumber): Promise<CheckpointData | undefined>;
|
|
84
|
+
getCheckpointDataRange(_from: CheckpointNumber, _limit: number): Promise<CheckpointData[]>;
|
|
85
|
+
getCheckpointNumberBySlot(_slot: SlotNumber): Promise<CheckpointNumber | undefined>;
|
|
86
|
+
getBlockDataWithCheckpointContext(number: BlockNumber): Promise<{
|
|
87
|
+
data: BlockData;
|
|
88
|
+
checkpoint: undefined;
|
|
89
|
+
l1: undefined;
|
|
90
|
+
attestations: never[];
|
|
91
|
+
} | undefined>;
|
|
79
92
|
getBlockDataByArchive(archive: Fr): Promise<BlockData | undefined>;
|
|
80
93
|
getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined>;
|
|
81
94
|
getCheckpointsForEpoch(epochNumber: EpochNumber): Promise<Checkpoint[]>;
|
|
@@ -101,8 +114,8 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
101
114
|
*/
|
|
102
115
|
getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
|
|
103
116
|
getL2Tips(): Promise<L2Tips>;
|
|
104
|
-
|
|
105
|
-
|
|
117
|
+
getSyncedL2EpochNumber(): Promise<EpochNumber>;
|
|
118
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber>;
|
|
106
119
|
isEpochComplete(_epochNumber: EpochNumber): Promise<boolean>;
|
|
107
120
|
getL1Constants(): Promise<L1RollupConstants>;
|
|
108
121
|
getGenesisValues(): Promise<{
|
|
@@ -128,6 +141,8 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
128
141
|
syncImmediate(): Promise<void>;
|
|
129
142
|
isPendingChainInvalid(): Promise<boolean>;
|
|
130
143
|
getPendingChainValidationStatus(): Promise<ValidateCheckpointResult>;
|
|
144
|
+
getLastCheckpoint(): Promise<ProposedCheckpointData | undefined>;
|
|
145
|
+
getLastProposedCheckpoint(): Promise<ProposedCheckpointData | undefined>;
|
|
131
146
|
/** Returns checkpoints whose slot falls within the given epoch. */
|
|
132
147
|
private getCheckpointsInEpoch;
|
|
133
148
|
/** Creates a mock L1PublishedData for a checkpoint. */
|
|
@@ -137,4 +152,4 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
137
152
|
/** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */
|
|
138
153
|
private findCheckpointNumberForBlock;
|
|
139
154
|
}
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19sMl9ibG9ja19zb3VyY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L21vY2tfbDJfYmxvY2tfc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxTQUFTLEVBQ2QsU0FBUyxFQUNULG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsS0FBSyxhQUFhLEVBQ2xCLEtBQUssTUFBTSxFQUNYLEtBQUssd0JBQXdCLEVBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLFVBQVUsRUFDVixLQUFLLGNBQWMsRUFFbkIsS0FBSyxzQkFBc0IsRUFDM0IsbUJBQW1CLEVBQ3BCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuSCxPQUFPLEVBRUwsS0FBSyxpQkFBaUIsRUFHdkIsTUFBTSw2QkFBNkIsQ0FBQztBQUdyQyxPQUFPLEVBQUUsS0FBSyxXQUFXLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUNwRyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRDs7R0FFRztBQUNILHFCQUFhLGlCQUFrQixZQUFXLGFBQWEs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEzG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,KAAK,SAAS,EACd,SAAS,EACT,mBAAmB,EACnB,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"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"}
|