@aztec/archiver 0.0.1-commit.e3c1de76 → 0.0.1-commit.e588bc7e5
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 +9 -6
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +78 -113
- package/dest/config.d.ts +3 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +2 -1
- package/dest/errors.d.ts +34 -10
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +45 -16
- package/dest/factory.d.ts +4 -5
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +31 -26
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/l1/bin/retrieve-calldata.js +36 -33
- package/dest/l1/calldata_retriever.d.ts +73 -50
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +191 -259
- package/dest/l1/data_retrieval.d.ts +10 -10
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +35 -34
- 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/modules/data_source_base.d.ts +14 -7
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +39 -77
- package/dest/modules/data_store_updater.d.ts +25 -12
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +125 -94
- package/dest/modules/instrumentation.d.ts +15 -2
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +19 -2
- package/dest/modules/l1_synchronizer.d.ts +7 -9
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +176 -136
- package/dest/modules/validation.d.ts +1 -1
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +2 -2
- package/dest/store/block_store.d.ts +65 -28
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +311 -134
- 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 +61 -24
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +75 -27
- package/dest/store/l2_tips_cache.d.ts +20 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +109 -0
- 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 +148 -51
- 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 +14 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +120 -26
- 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_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 +26 -5
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +160 -89
- 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 +5 -1
- package/package.json +13 -13
- package/src/archiver.ts +97 -133
- package/src/config.ts +8 -1
- package/src/errors.ts +70 -26
- package/src/factory.ts +46 -24
- package/src/index.ts +1 -0
- package/src/l1/README.md +25 -68
- package/src/l1/bin/retrieve-calldata.ts +46 -39
- package/src/l1/calldata_retriever.ts +250 -379
- package/src/l1/data_retrieval.ts +31 -37
- package/src/l1/spire_proposer.ts +7 -15
- package/src/modules/data_source_base.ts +78 -98
- package/src/modules/data_store_updater.ts +138 -124
- package/src/modules/instrumentation.ts +29 -2
- package/src/modules/l1_synchronizer.ts +195 -168
- package/src/modules/validation.ts +2 -2
- package/src/store/block_store.ts +393 -170
- 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 +115 -41
- package/src/store/l2_tips_cache.ts +128 -0
- package/src/store/log_store.ts +219 -58
- package/src/store/message_store.ts +27 -10
- package/src/structs/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +163 -30
- package/src/test/mock_archiver.ts +3 -2
- package/src/test/mock_l1_to_l2_message_source.ts +1 -0
- package/src/test/mock_l2_block_source.ts +209 -82
- package/src/test/mock_structs.ts +20 -6
- package/src/test/noop_l1_archiver.ts +7 -1
package/dest/store/log_store.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
-
import { filterAsync } from '@aztec/foundation/collection';
|
|
3
|
+
import { compactArray, filterAsync } from '@aztec/foundation/collection';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize';
|
|
7
7
|
import { BlockHash } from '@aztec/stdlib/block';
|
|
8
8
|
import { MAX_LOGS_PER_TAG } from '@aztec/stdlib/interfaces/api-limit';
|
|
9
9
|
import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, PublicLog, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
10
|
+
import { TxHash } from '@aztec/stdlib/tx';
|
|
11
|
+
import { OutOfOrderLogInsertionError } from '../errors.js';
|
|
10
12
|
/**
|
|
11
13
|
* A store for logs
|
|
12
14
|
*/ export class LogStore {
|
|
@@ -107,7 +109,16 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
107
109
|
})));
|
|
108
110
|
for (const taggedLogBuffer of currentPrivateTaggedLogs){
|
|
109
111
|
if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
|
|
110
|
-
|
|
112
|
+
const newLogs = privateTaggedLogs.get(taggedLogBuffer.tag);
|
|
113
|
+
if (newLogs.length === 0) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const lastExisting = TxScopedL2Log.fromBuffer(taggedLogBuffer.logBuffers.at(-1));
|
|
117
|
+
const firstNew = TxScopedL2Log.fromBuffer(newLogs[0]);
|
|
118
|
+
if (lastExisting.blockNumber > firstNew.blockNumber) {
|
|
119
|
+
throw new OutOfOrderLogInsertionError('private', taggedLogBuffer.tag, lastExisting.blockNumber, firstNew.blockNumber);
|
|
120
|
+
}
|
|
121
|
+
privateTaggedLogs.set(taggedLogBuffer.tag, taggedLogBuffer.logBuffers.concat(newLogs));
|
|
111
122
|
}
|
|
112
123
|
}
|
|
113
124
|
for (const block of newBlocks){
|
|
@@ -129,7 +140,16 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
129
140
|
})));
|
|
130
141
|
for (const taggedLogBuffer of currentPublicTaggedLogs){
|
|
131
142
|
if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
|
|
132
|
-
|
|
143
|
+
const newLogs = publicTaggedLogs.get(taggedLogBuffer.tag);
|
|
144
|
+
if (newLogs.length === 0) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const lastExisting = TxScopedL2Log.fromBuffer(taggedLogBuffer.logBuffers.at(-1));
|
|
148
|
+
const firstNew = TxScopedL2Log.fromBuffer(newLogs[0]);
|
|
149
|
+
if (lastExisting.blockNumber > firstNew.blockNumber) {
|
|
150
|
+
throw new OutOfOrderLogInsertionError('public', taggedLogBuffer.tag, lastExisting.blockNumber, firstNew.blockNumber);
|
|
151
|
+
}
|
|
152
|
+
publicTaggedLogs.set(taggedLogBuffer.tag, taggedLogBuffer.logBuffers.concat(newLogs));
|
|
133
153
|
}
|
|
134
154
|
}
|
|
135
155
|
for (const block of newBlocks){
|
|
@@ -142,6 +162,7 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
142
162
|
await this.#publicLogKeysByBlock.set(block.number, publicTagsInBlock);
|
|
143
163
|
const publicLogsInBlock = block.body.txEffects.map((txEffect, txIndex)=>[
|
|
144
164
|
numToUInt32BE(txIndex),
|
|
165
|
+
txEffect.txHash.toBuffer(),
|
|
145
166
|
numToUInt32BE(txEffect.publicLogs.length),
|
|
146
167
|
txEffect.publicLogs.map((log)=>log.toBuffer())
|
|
147
168
|
].flat()).flat();
|
|
@@ -154,6 +175,7 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
154
175
|
const blockHash = await block.hash();
|
|
155
176
|
const contractClassLogsInBlock = block.body.txEffects.map((txEffect, txIndex)=>[
|
|
156
177
|
numToUInt32BE(txIndex),
|
|
178
|
+
txEffect.txHash.toBuffer(),
|
|
157
179
|
numToUInt32BE(txEffect.contractClassLogs.length),
|
|
158
180
|
txEffect.contractClassLogs.map((log)=>log.toBuffer())
|
|
159
181
|
].flat()).flat();
|
|
@@ -189,14 +211,34 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
189
211
|
}
|
|
190
212
|
deleteLogs(blocks) {
|
|
191
213
|
return this.db.transactionAsync(async ()=>{
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
214
|
+
const blockNumbers = new Set(blocks.map((block)=>block.number));
|
|
215
|
+
const firstBlockToDelete = Math.min(...blockNumbers);
|
|
216
|
+
// Collect all unique private tags across all blocks being deleted
|
|
217
|
+
const allPrivateTags = new Set(compactArray(await Promise.all(blocks.map((block)=>this.#privateLogKeysByBlock.getAsync(block.number)))).flat());
|
|
218
|
+
// Trim private logs: for each tag, delete all instances including and after the first block being deleted.
|
|
219
|
+
// This hinges on the invariant that logs for a given tag are always inserted in order of block number, which is enforced in #addPrivateLogs.
|
|
220
|
+
for (const tag of allPrivateTags){
|
|
221
|
+
const existing = await this.#privateLogsByTag.getAsync(tag);
|
|
222
|
+
if (existing === undefined || existing.length === 0) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const lastIndexToKeep = existing.findLastIndex((buf)=>TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete);
|
|
226
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
227
|
+
await (remaining.length > 0 ? this.#privateLogsByTag.set(tag, remaining) : this.#privateLogsByTag.delete(tag));
|
|
228
|
+
}
|
|
229
|
+
// Collect all unique public keys across all blocks being deleted
|
|
230
|
+
const allPublicKeys = new Set(compactArray(await Promise.all(blocks.map((block)=>this.#publicLogKeysByBlock.getAsync(block.number)))).flat());
|
|
231
|
+
// And do the same as we did with private logs
|
|
232
|
+
for (const key of allPublicKeys){
|
|
233
|
+
const existing = await this.#publicLogsByContractAndTag.getAsync(key);
|
|
234
|
+
if (existing === undefined || existing.length === 0) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const lastIndexToKeep = existing.findLastIndex((buf)=>TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete);
|
|
238
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
239
|
+
await (remaining.length > 0 ? this.#publicLogsByContractAndTag.set(key, remaining) : this.#publicLogsByContractAndTag.delete(key));
|
|
240
|
+
}
|
|
241
|
+
// After trimming the tagged logs, we can delete the block-level keys that track which tags are in which blocks.
|
|
200
242
|
await Promise.all(blocks.map((block)=>Promise.all([
|
|
201
243
|
this.#publicLogsByBlock.delete(block.number),
|
|
202
244
|
this.#privateLogKeysByBlock.delete(block.number),
|
|
@@ -211,13 +253,23 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
211
253
|
* array implies no logs match that tag.
|
|
212
254
|
* @param tags - The tags to search for.
|
|
213
255
|
* @param page - The page number (0-indexed) for pagination.
|
|
256
|
+
* @param upToBlockNumber - If set, only return logs from blocks up to and including this block number.
|
|
214
257
|
* @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
|
|
215
258
|
* MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
|
|
216
|
-
*/ async getPrivateLogsByTags(tags, page = 0) {
|
|
259
|
+
*/ async getPrivateLogsByTags(tags, page = 0, upToBlockNumber) {
|
|
217
260
|
const logs = await Promise.all(tags.map((tag)=>this.#privateLogsByTag.getAsync(tag.toString())));
|
|
218
261
|
const start = page * MAX_LOGS_PER_TAG;
|
|
219
262
|
const end = start + MAX_LOGS_PER_TAG;
|
|
220
|
-
return logs.map((logBuffers)=>
|
|
263
|
+
return logs.map((logBuffers)=>{
|
|
264
|
+
const deserialized = logBuffers?.slice(start, end).map((buf)=>TxScopedL2Log.fromBuffer(buf)) ?? [];
|
|
265
|
+
if (upToBlockNumber !== undefined) {
|
|
266
|
+
const cutoff = deserialized.findIndex((log)=>log.blockNumber > upToBlockNumber);
|
|
267
|
+
if (cutoff !== -1) {
|
|
268
|
+
return deserialized.slice(0, cutoff);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return deserialized;
|
|
272
|
+
});
|
|
221
273
|
}
|
|
222
274
|
/**
|
|
223
275
|
* Gets public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
|
|
@@ -225,16 +277,26 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
225
277
|
* @param contractAddress - The contract address to search logs for.
|
|
226
278
|
* @param tags - The tags to search for.
|
|
227
279
|
* @param page - The page number (0-indexed) for pagination.
|
|
280
|
+
* @param upToBlockNumber - If set, only return logs from blocks up to and including this block number.
|
|
228
281
|
* @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
|
|
229
282
|
* MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
|
|
230
|
-
*/ async getPublicLogsByTagsFromContract(contractAddress, tags, page = 0) {
|
|
283
|
+
*/ async getPublicLogsByTagsFromContract(contractAddress, tags, page = 0, upToBlockNumber) {
|
|
231
284
|
const logs = await Promise.all(tags.map((tag)=>{
|
|
232
285
|
const key = `${contractAddress.toString()}_${tag.value.toString()}`;
|
|
233
286
|
return this.#publicLogsByContractAndTag.getAsync(key);
|
|
234
287
|
}));
|
|
235
288
|
const start = page * MAX_LOGS_PER_TAG;
|
|
236
289
|
const end = start + MAX_LOGS_PER_TAG;
|
|
237
|
-
return logs.map((logBuffers)=>
|
|
290
|
+
return logs.map((logBuffers)=>{
|
|
291
|
+
const deserialized = logBuffers?.slice(start, end).map((buf)=>TxScopedL2Log.fromBuffer(buf)) ?? [];
|
|
292
|
+
if (upToBlockNumber !== undefined) {
|
|
293
|
+
const cutoff = deserialized.findIndex((log)=>log.blockNumber > upToBlockNumber);
|
|
294
|
+
if (cutoff !== -1) {
|
|
295
|
+
return deserialized.slice(0, cutoff);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return deserialized;
|
|
299
|
+
});
|
|
238
300
|
}
|
|
239
301
|
/**
|
|
240
302
|
* Gets public logs based on the provided filter.
|
|
@@ -261,22 +323,24 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
261
323
|
};
|
|
262
324
|
}
|
|
263
325
|
const buffer = await this.#publicLogsByBlock.getAsync(blockNumber) ?? Buffer.alloc(0);
|
|
264
|
-
const publicLogsInBlock = [
|
|
265
|
-
[]
|
|
266
|
-
];
|
|
326
|
+
const publicLogsInBlock = [];
|
|
267
327
|
const reader = new BufferReader(buffer);
|
|
268
328
|
const blockHash = this.#unpackBlockHash(reader);
|
|
269
329
|
while(reader.remainingBytes() > 0){
|
|
270
330
|
const indexOfTx = reader.readNumber();
|
|
331
|
+
const txHash = reader.readObject(TxHash);
|
|
271
332
|
const numLogsInTx = reader.readNumber();
|
|
272
|
-
publicLogsInBlock[indexOfTx] =
|
|
333
|
+
publicLogsInBlock[indexOfTx] = {
|
|
334
|
+
txHash,
|
|
335
|
+
logs: []
|
|
336
|
+
};
|
|
273
337
|
for(let i = 0; i < numLogsInTx; i++){
|
|
274
|
-
publicLogsInBlock[indexOfTx].push(reader.readObject(PublicLog));
|
|
338
|
+
publicLogsInBlock[indexOfTx].logs.push(reader.readObject(PublicLog));
|
|
275
339
|
}
|
|
276
340
|
}
|
|
277
|
-
const
|
|
341
|
+
const txData = publicLogsInBlock[txIndex];
|
|
278
342
|
const logs = [];
|
|
279
|
-
const maxLogsHit = this.#
|
|
343
|
+
const maxLogsHit = this.#accumulatePublicLogs(logs, blockNumber, blockHash, txIndex, txData.txHash, txData.logs, filter);
|
|
280
344
|
return {
|
|
281
345
|
logs,
|
|
282
346
|
maxLogsHit
|
|
@@ -297,22 +361,24 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
297
361
|
start,
|
|
298
362
|
end
|
|
299
363
|
})){
|
|
300
|
-
const publicLogsInBlock = [
|
|
301
|
-
[]
|
|
302
|
-
];
|
|
364
|
+
const publicLogsInBlock = [];
|
|
303
365
|
const reader = new BufferReader(logBuffer);
|
|
304
366
|
const blockHash = this.#unpackBlockHash(reader);
|
|
305
367
|
while(reader.remainingBytes() > 0){
|
|
306
368
|
const indexOfTx = reader.readNumber();
|
|
369
|
+
const txHash = reader.readObject(TxHash);
|
|
307
370
|
const numLogsInTx = reader.readNumber();
|
|
308
|
-
publicLogsInBlock[indexOfTx] =
|
|
371
|
+
publicLogsInBlock[indexOfTx] = {
|
|
372
|
+
txHash,
|
|
373
|
+
logs: []
|
|
374
|
+
};
|
|
309
375
|
for(let i = 0; i < numLogsInTx; i++){
|
|
310
|
-
publicLogsInBlock[indexOfTx].push(reader.readObject(PublicLog));
|
|
376
|
+
publicLogsInBlock[indexOfTx].logs.push(reader.readObject(PublicLog));
|
|
311
377
|
}
|
|
312
378
|
}
|
|
313
379
|
for(let txIndex = filter.afterLog?.txIndex ?? 0; txIndex < publicLogsInBlock.length; txIndex++){
|
|
314
|
-
const
|
|
315
|
-
maxLogsHit = this.#
|
|
380
|
+
const txData = publicLogsInBlock[txIndex];
|
|
381
|
+
maxLogsHit = this.#accumulatePublicLogs(logs, blockNumber, blockHash, txIndex, txData.txHash, txData.logs, filter);
|
|
316
382
|
if (maxLogsHit) {
|
|
317
383
|
this.#log.debug(`Max logs hit at block ${blockNumber}`);
|
|
318
384
|
break loopOverBlocks;
|
|
@@ -349,22 +415,24 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
349
415
|
};
|
|
350
416
|
}
|
|
351
417
|
const contractClassLogsBuffer = await this.#contractClassLogsByBlock.getAsync(blockNumber) ?? Buffer.alloc(0);
|
|
352
|
-
const contractClassLogsInBlock = [
|
|
353
|
-
[]
|
|
354
|
-
];
|
|
418
|
+
const contractClassLogsInBlock = [];
|
|
355
419
|
const reader = new BufferReader(contractClassLogsBuffer);
|
|
356
420
|
const blockHash = this.#unpackBlockHash(reader);
|
|
357
421
|
while(reader.remainingBytes() > 0){
|
|
358
422
|
const indexOfTx = reader.readNumber();
|
|
423
|
+
const txHash = reader.readObject(TxHash);
|
|
359
424
|
const numLogsInTx = reader.readNumber();
|
|
360
|
-
contractClassLogsInBlock[indexOfTx] =
|
|
425
|
+
contractClassLogsInBlock[indexOfTx] = {
|
|
426
|
+
txHash,
|
|
427
|
+
logs: []
|
|
428
|
+
};
|
|
361
429
|
for(let i = 0; i < numLogsInTx; i++){
|
|
362
|
-
contractClassLogsInBlock[indexOfTx].push(reader.readObject(ContractClassLog));
|
|
430
|
+
contractClassLogsInBlock[indexOfTx].logs.push(reader.readObject(ContractClassLog));
|
|
363
431
|
}
|
|
364
432
|
}
|
|
365
|
-
const
|
|
433
|
+
const txData = contractClassLogsInBlock[txIndex];
|
|
366
434
|
const logs = [];
|
|
367
|
-
const maxLogsHit = this.#
|
|
435
|
+
const maxLogsHit = this.#accumulateContractClassLogs(logs, blockNumber, blockHash, txIndex, txData.txHash, txData.logs, filter);
|
|
368
436
|
return {
|
|
369
437
|
logs,
|
|
370
438
|
maxLogsHit
|
|
@@ -385,22 +453,24 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
385
453
|
start,
|
|
386
454
|
end
|
|
387
455
|
})){
|
|
388
|
-
const contractClassLogsInBlock = [
|
|
389
|
-
[]
|
|
390
|
-
];
|
|
456
|
+
const contractClassLogsInBlock = [];
|
|
391
457
|
const reader = new BufferReader(logBuffer);
|
|
392
458
|
const blockHash = this.#unpackBlockHash(reader);
|
|
393
459
|
while(reader.remainingBytes() > 0){
|
|
394
460
|
const indexOfTx = reader.readNumber();
|
|
461
|
+
const txHash = reader.readObject(TxHash);
|
|
395
462
|
const numLogsInTx = reader.readNumber();
|
|
396
|
-
contractClassLogsInBlock[indexOfTx] =
|
|
463
|
+
contractClassLogsInBlock[indexOfTx] = {
|
|
464
|
+
txHash,
|
|
465
|
+
logs: []
|
|
466
|
+
};
|
|
397
467
|
for(let i = 0; i < numLogsInTx; i++){
|
|
398
|
-
contractClassLogsInBlock[indexOfTx].push(reader.readObject(ContractClassLog));
|
|
468
|
+
contractClassLogsInBlock[indexOfTx].logs.push(reader.readObject(ContractClassLog));
|
|
399
469
|
}
|
|
400
470
|
}
|
|
401
471
|
for(let txIndex = filter.afterLog?.txIndex ?? 0; txIndex < contractClassLogsInBlock.length; txIndex++){
|
|
402
|
-
const
|
|
403
|
-
maxLogsHit = this.#
|
|
472
|
+
const txData = contractClassLogsInBlock[txIndex];
|
|
473
|
+
maxLogsHit = this.#accumulateContractClassLogs(logs, blockNumber, blockHash, txIndex, txData.txHash, txData.logs, filter);
|
|
404
474
|
if (maxLogsHit) {
|
|
405
475
|
this.#log.debug(`Max logs hit at block ${blockNumber}`);
|
|
406
476
|
break loopOverBlocks;
|
|
@@ -412,19 +482,46 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
412
482
|
maxLogsHit
|
|
413
483
|
};
|
|
414
484
|
}
|
|
415
|
-
#
|
|
485
|
+
#accumulatePublicLogs(results, blockNumber, blockHash, txIndex, txHash, txLogs, filter = {}) {
|
|
486
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
492
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
416
495
|
let maxLogsHit = false;
|
|
417
496
|
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
418
497
|
for(; logIndex < txLogs.length; logIndex++){
|
|
419
498
|
const log = txLogs[logIndex];
|
|
420
|
-
if (!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) {
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
} else {
|
|
426
|
-
throw new Error('Unknown log type');
|
|
499
|
+
if ((!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) && (!filter.tag || log.fields[0]?.equals(filter.tag))) {
|
|
500
|
+
results.push(new ExtendedPublicLog(new LogId(BlockNumber(blockNumber), blockHash, txHash, txIndex, logIndex), log));
|
|
501
|
+
if (results.length >= this.#logsMaxPageSize) {
|
|
502
|
+
maxLogsHit = true;
|
|
503
|
+
break;
|
|
427
504
|
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return maxLogsHit;
|
|
508
|
+
}
|
|
509
|
+
#accumulateContractClassLogs(results, blockNumber, blockHash, txIndex, txHash, txLogs, filter = {}) {
|
|
510
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
514
|
+
return false;
|
|
515
|
+
}
|
|
516
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
let maxLogsHit = false;
|
|
520
|
+
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
521
|
+
for(; logIndex < txLogs.length; logIndex++){
|
|
522
|
+
const log = txLogs[logIndex];
|
|
523
|
+
if (!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) {
|
|
524
|
+
results.push(new ExtendedContractClassLog(new LogId(BlockNumber(blockNumber), blockHash, txHash, txIndex, logIndex), log));
|
|
428
525
|
if (results.length >= this.#logsMaxPageSize) {
|
|
429
526
|
maxLogsHit = true;
|
|
430
527
|
break;
|
|
@@ -29,6 +29,10 @@ export declare class MessageStore {
|
|
|
29
29
|
*/
|
|
30
30
|
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined>;
|
|
31
31
|
getLastMessage(): Promise<InboxMessage | undefined>;
|
|
32
|
+
/** Returns the inbox tree-in-progress checkpoint number from L1, or undefined if not yet set. */
|
|
33
|
+
getInboxTreeInProgress(): Promise<bigint | undefined>;
|
|
34
|
+
/** Atomically updates the message sync state: the L1 sync point and the inbox tree-in-progress marker. */
|
|
35
|
+
setMessageSyncState(l1Block: L1BlockId, treeInProgress: bigint | undefined): Promise<void>;
|
|
32
36
|
getL1ToL2Messages(checkpointNumber: CheckpointNumber): Promise<Fr[]>;
|
|
33
37
|
iterateL1ToL2Messages(range?: CustomRange<bigint>): AsyncIterableIterator<InboxMessage>;
|
|
34
38
|
removeL1ToL2Messages(startIndex: bigint): Promise<void>;
|
|
@@ -37,4 +41,4 @@ export declare class MessageStore {
|
|
|
37
41
|
private leafToIndexKey;
|
|
38
42
|
private increaseTotalMessageCount;
|
|
39
43
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZV9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3JlL21lc3NhZ2Vfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSXBELE9BQU8sRUFDTCxLQUFLLGlCQUFpQixFQUd0QixLQUFLLFdBQVcsRUFFakIsTUFBTSxpQkFBaUIsQ0FBQztBQUl6QixPQUFPLEVBQ0wsS0FBSyxZQUFZLEVBSWxCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMscUJBQWEsaUJBQWtCLFNBQVEsS0FBSzthQUd4QixZQUFZLEVBQUUsWUFBWTtJQUY1QyxZQUNFLE9BQU8sRUFBRSxNQUFNLEVBQ0MsWUFBWSxFQUFFLFlBQVksRUFJM0M7Q0FDRjtBQUVELHFCQUFhLFlBQVk7O0lBY1gsT0FBTyxDQUFDLEVBQUU7SUFBdEIsWUFBb0IsRUFBRSxFQUFFLGlCQUFpQixFQU14QztJQUVZLDBCQUEwQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFekQ7SUFFRCxxQ0FBcUM7SUFDeEIsaUJBQWlCLElBQUksT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FRL0Q7SUFFRCxvQ0FBb0M7SUFDdkIsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBR2hFO0lBRUQ7Ozs7T0FJRztJQUNJLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBb0ZoRTtJQUVEOzs7O09BSUc7SUFDSSxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRTNFO0lBRVksY0FBYyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLENBRy9EO0lBRUQsaUdBQWlHO0lBQzFGLHNCQUFzQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRTNEO0lBRUQsMEdBQTBHO0lBQ25HLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVNoRztJQUVZLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQTRCaEY7SUFFYSxxQkFBcUIsQ0FBQyxLQUFLLEdBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBTSxHQUFHLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUt4RztJQUVNLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWdCN0Q7SUFFTSxrQ0FBa0MsQ0FBQyxzQkFBc0IsRUFBRSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSWpHO0lBRUQsT0FBTyxDQUFDLFVBQVU7SUFJbEIsT0FBTyxDQUFDLGNBQWM7WUFJUix5QkFBeUI7Q0FTeEMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_store.d.ts","sourceRoot":"","sources":["../../src/store/message_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIpD,OAAO,EACL,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"message_store.d.ts","sourceRoot":"","sources":["../../src/store/message_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIpD,OAAO,EACL,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,6BAA6B,CAAC;AAErC,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,YAAY,EAAE,YAAY;IAF5C,YACE,OAAO,EAAE,MAAM,EACC,YAAY,EAAE,YAAY,EAI3C;CACF;AAED,qBAAa,YAAY;;IAcX,OAAO,CAAC,EAAE;IAAtB,YAAoB,EAAE,EAAE,iBAAiB,EAMxC;IAEY,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAEzD;IAED,qCAAqC;IACxB,iBAAiB,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAQ/D;IAED,oCAAoC;IACvB,iBAAiB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;IAED;;;;OAIG;IACI,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFhE;IAED;;;;OAIG;IACI,qBAAqB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE3E;IAEY,cAAc,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAG/D;IAED,iGAAiG;IAC1F,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE3D;IAED,0GAA0G;IACnG,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAShG;IAEY,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CA4BhF;IAEa,qBAAqB,CAAC,KAAK,GAAE,WAAW,CAAC,MAAM,CAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAKxG;IAEM,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7D;IAEM,kCAAkC,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjG;IAED,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,cAAc;YAIR,yBAAyB;CASxC"}
|
|
@@ -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;
|
|
@@ -91,7 +91,9 @@ export declare class FakeL1State {
|
|
|
91
91
|
private provenCheckpointNumber;
|
|
92
92
|
private targetCommitteeSize;
|
|
93
93
|
private version;
|
|
94
|
+
private canPruneResult;
|
|
94
95
|
private pendingCheckpointNumber;
|
|
96
|
+
private finalizedL1BlockNumber;
|
|
95
97
|
constructor(config: FakeL1StateConfig);
|
|
96
98
|
/**
|
|
97
99
|
* Adds messages for a checkpoint. Returns the message leaves.
|
|
@@ -124,10 +126,18 @@ export declare class FakeL1State {
|
|
|
124
126
|
* Auto-updates pending checkpoint number based on visible checkpoints.
|
|
125
127
|
*/
|
|
126
128
|
setL1BlockNumber(blockNumber: bigint): void;
|
|
129
|
+
/** Sets the L1 block number that will be reported as "finalized". */
|
|
130
|
+
setFinalizedL1BlockNumber(blockNumber: bigint): void;
|
|
127
131
|
/** Marks a checkpoint as proven. Updates provenCheckpointNumber. */
|
|
128
132
|
markCheckpointAsProven(checkpointNumber: CheckpointNumber): void;
|
|
133
|
+
/**
|
|
134
|
+
* Simulates what `rollup.getProvenCheckpointNumber({ blockNumber: atL1Block })` would return.
|
|
135
|
+
*/
|
|
136
|
+
getProvenCheckpointNumberAtL1Block(atL1Block: bigint): CheckpointNumber;
|
|
129
137
|
/** Sets the target committee size for attestation validation. */
|
|
130
138
|
setTargetCommitteeSize(size: number): void;
|
|
139
|
+
/** Sets whether the rollup contract would allow pruning at the next block. */
|
|
140
|
+
setCanPrune(value: boolean): void;
|
|
131
141
|
/**
|
|
132
142
|
* Removes all entries for a checkpoint number (simulates L1 reorg or prune).
|
|
133
143
|
* Note: Does NOT remove messages for this checkpoint (use numL1ToL2Messages: 0 when re-adding).
|
|
@@ -182,9 +192,12 @@ export declare class FakeL1State {
|
|
|
182
192
|
private getNextBlockNumber;
|
|
183
193
|
private getCheckpointProposedLogs;
|
|
184
194
|
private getMessageSentLogs;
|
|
195
|
+
private getMessageSentLogByHash;
|
|
185
196
|
private makeRollupTx;
|
|
197
|
+
/** Extracts the CommitteeAttestations struct definition from RollupAbi for hash computation. */
|
|
198
|
+
private getCommitteeAttestationsStructDef;
|
|
186
199
|
private makeVersionedBlobHashes;
|
|
187
200
|
private makeBlobsFromCheckpoint;
|
|
188
201
|
}
|
|
189
202
|
export {};
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFrZV9sMV9zdGF0ZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvZmFrZV9sMV9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBcUQsTUFBTSxpQkFBaUIsQ0FBQztBQUUvRixPQUFPLEtBQUssRUFBeUIsYUFBYSxFQUFrQixjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV0SCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBb0IsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUF5RCxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFTdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFjMUQsMkNBQTJDO0FBQzNDLE1BQU0sTUFBTSxpQkFBaUIsR0FBRztJQUM5Qiw0QkFBNEI7SUFDNUIsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLDZCQUE2QjtJQUM3QixZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLGtDQUFrQztJQUNsQyxhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLHlDQUF5QztJQUN6QyxvQkFBb0IsRUFBRSxNQUFNLENBQUM7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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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"}
|