@aztec/archiver 0.8.10 → 0.8.11

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.
@@ -1,15 +1,18 @@
1
1
  import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js';
2
- import { INITIAL_L2_BLOCK_NUM, LogType, } from '@aztec/types';
2
+ import { ExtendedUnencryptedL2Log, INITIAL_L2_BLOCK_NUM, L2BlockContext, LogId, LogType, UnencryptedL2Log, } from '@aztec/types';
3
3
  import { L1ToL2MessageStore, PendingL1ToL2MessageStore } from './l1_to_l2_message_store.js';
4
4
  /**
5
5
  * Simple, in-memory implementation of an archiver data store.
6
6
  */
7
7
  export class MemoryArchiverStore {
8
- constructor() {
8
+ constructor(
9
+ /** The max number of logs that can be obtained in 1 "getUnencryptedLogs" call. */
10
+ maxLogs) {
11
+ this.maxLogs = maxLogs;
9
12
  /**
10
13
  * An array containing all the L2 blocks that have been fetched so far.
11
14
  */
12
- this.l2Blocks = [];
15
+ this.l2BlockContexts = [];
13
16
  /**
14
17
  * An array containing all the L2 Txs in the L2 blocks that have been fetched so far.
15
18
  */
@@ -18,12 +21,12 @@ export class MemoryArchiverStore {
18
21
  * An array containing all the encrypted logs that have been fetched so far.
19
22
  * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
20
23
  */
21
- this.encryptedLogs = [];
24
+ this.encryptedLogsPerBlock = [];
22
25
  /**
23
26
  * An array containing all the unencrypted logs that have been fetched so far.
24
27
  * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
25
28
  */
26
- this.unencryptedLogs = [];
29
+ this.unencryptedLogsPerBlock = [];
27
30
  /**
28
31
  * A sparse array containing all the extended contract data that have been fetched so far.
29
32
  */
@@ -47,8 +50,8 @@ export class MemoryArchiverStore {
47
50
  * @param blocks - The L2 blocks to be added to the store.
48
51
  * @returns True if the operation is successful (always in this implementation).
49
52
  */
50
- addL2Blocks(blocks) {
51
- this.l2Blocks.push(...blocks);
53
+ addBlocks(blocks) {
54
+ this.l2BlockContexts.push(...blocks.map(block => new L2BlockContext(block)));
52
55
  this.l2Txs.push(...blocks.flatMap(b => b.getTxs()));
53
56
  return Promise.resolve(true);
54
57
  }
@@ -59,7 +62,9 @@ export class MemoryArchiverStore {
59
62
  * @returns True if the operation is successful.
60
63
  */
61
64
  addLogs(data, logType) {
62
- logType === LogType.ENCRYPTED ? this.encryptedLogs.push(...data) : this.unencryptedLogs.push(...data);
65
+ logType === LogType.ENCRYPTED
66
+ ? this.encryptedLogsPerBlock.push(...data)
67
+ : this.unencryptedLogsPerBlock.push(...data);
63
68
  return Promise.resolve(true);
64
69
  }
65
70
  /**
@@ -123,18 +128,19 @@ export class MemoryArchiverStore {
123
128
  * @param from - Number of the first block to return (inclusive).
124
129
  * @param limit - The number of blocks to return.
125
130
  * @returns The requested L2 blocks.
131
+ * @remarks When "from" is smaller than genesis block number, blocks from the beginning are returned.
126
132
  */
127
- getL2Blocks(from, limit) {
133
+ getBlocks(from, limit) {
128
134
  // Return an empty array if we are outside of range
129
135
  if (limit < 1) {
130
- throw new Error(`Invalid block range from: ${from}, limit: ${limit}`);
136
+ throw new Error(`Invalid limit: ${limit}`);
131
137
  }
132
- if (from < INITIAL_L2_BLOCK_NUM || from > this.l2Blocks.length) {
138
+ const fromIndex = Math.max(from - INITIAL_L2_BLOCK_NUM, 0);
139
+ if (fromIndex >= this.l2BlockContexts.length) {
133
140
  return Promise.resolve([]);
134
141
  }
135
- const startIndex = from - INITIAL_L2_BLOCK_NUM;
136
- const endIndex = startIndex + limit;
137
- return Promise.resolve(this.l2Blocks.slice(startIndex, endIndex));
142
+ const toIndex = fromIndex + limit;
143
+ return Promise.resolve(this.l2BlockContexts.slice(fromIndex, toIndex).map(blockContext => blockContext.block));
138
144
  }
139
145
  /**
140
146
  * Gets an l2 tx.
@@ -174,9 +180,9 @@ export class MemoryArchiverStore {
174
180
  */
175
181
  getLogs(from, limit, logType) {
176
182
  if (from < INITIAL_L2_BLOCK_NUM || limit < 1) {
177
- throw new Error(`Invalid block range from: ${from}, limit: ${limit}`);
183
+ throw new Error(`Invalid limit: ${limit}`);
178
184
  }
179
- const logs = logType === LogType.ENCRYPTED ? this.encryptedLogs : this.unencryptedLogs;
185
+ const logs = logType === LogType.ENCRYPTED ? this.encryptedLogsPerBlock : this.unencryptedLogsPerBlock;
180
186
  if (from > logs.length) {
181
187
  return Promise.resolve([]);
182
188
  }
@@ -184,6 +190,78 @@ export class MemoryArchiverStore {
184
190
  const endIndex = startIndex + limit;
185
191
  return Promise.resolve(logs.slice(startIndex, endIndex));
186
192
  }
193
+ /**
194
+ * Gets unencrypted logs based on the provided filter.
195
+ * @param filter - The filter to apply to the logs.
196
+ * @returns The requested logs.
197
+ * @remarks Works by doing an intersection of all params in the filter.
198
+ */
199
+ getUnencryptedLogs(filter) {
200
+ let txHash;
201
+ let fromBlockIndex = 0;
202
+ let toBlockIndex = this.unencryptedLogsPerBlock.length;
203
+ let txIndexInBlock = 0;
204
+ let logIndexInTx = 0;
205
+ if (filter.afterLog) {
206
+ // Continuation parameter is set --> tx hash is ignored
207
+ if (filter.fromBlock == undefined || filter.fromBlock <= filter.afterLog.blockNumber) {
208
+ fromBlockIndex = filter.afterLog.blockNumber - INITIAL_L2_BLOCK_NUM;
209
+ txIndexInBlock = filter.afterLog.txIndex;
210
+ logIndexInTx = filter.afterLog.logIndex + 1; // We want to start from the next log
211
+ }
212
+ else {
213
+ fromBlockIndex = filter.fromBlock - INITIAL_L2_BLOCK_NUM;
214
+ }
215
+ }
216
+ else {
217
+ txHash = filter.txHash;
218
+ if (filter.fromBlock !== undefined) {
219
+ fromBlockIndex = filter.fromBlock - INITIAL_L2_BLOCK_NUM;
220
+ }
221
+ }
222
+ if (filter.toBlock !== undefined) {
223
+ toBlockIndex = filter.toBlock - INITIAL_L2_BLOCK_NUM;
224
+ }
225
+ // Ensure the indices are within block array bounds
226
+ fromBlockIndex = Math.max(fromBlockIndex, 0);
227
+ toBlockIndex = Math.min(toBlockIndex, this.unencryptedLogsPerBlock.length);
228
+ if (fromBlockIndex > this.unencryptedLogsPerBlock.length || toBlockIndex < fromBlockIndex || toBlockIndex <= 0) {
229
+ return Promise.resolve({
230
+ logs: [],
231
+ maxLogsHit: false,
232
+ });
233
+ }
234
+ const contractAddress = filter.contractAddress;
235
+ const selector = filter.selector;
236
+ const logs = [];
237
+ for (; fromBlockIndex < toBlockIndex; fromBlockIndex++) {
238
+ const blockContext = this.l2BlockContexts[fromBlockIndex];
239
+ const blockLogs = this.unencryptedLogsPerBlock[fromBlockIndex];
240
+ for (; txIndexInBlock < blockLogs.txLogs.length; txIndexInBlock++) {
241
+ const txLogs = blockLogs.txLogs[txIndexInBlock].unrollLogs().map(log => UnencryptedL2Log.fromBuffer(log));
242
+ for (; logIndexInTx < txLogs.length; logIndexInTx++) {
243
+ const log = txLogs[logIndexInTx];
244
+ if ((!txHash || blockContext.getTxHash(txIndexInBlock).equals(txHash)) &&
245
+ (!contractAddress || log.contractAddress.equals(contractAddress)) &&
246
+ (!selector || log.selector.equals(selector))) {
247
+ logs.push(new ExtendedUnencryptedL2Log(new LogId(blockContext.block.number, txIndexInBlock, logIndexInTx), log));
248
+ if (logs.length === this.maxLogs) {
249
+ return Promise.resolve({
250
+ logs,
251
+ maxLogsHit: true,
252
+ });
253
+ }
254
+ }
255
+ }
256
+ logIndexInTx = 0;
257
+ }
258
+ txIndexInBlock = 0;
259
+ }
260
+ return Promise.resolve({
261
+ logs,
262
+ maxLogsHit: false,
263
+ });
264
+ }
187
265
  /**
188
266
  * Get the extended contract data for this contract.
189
267
  * @param contractAddress - The contract data address.
@@ -199,7 +277,7 @@ export class MemoryArchiverStore {
199
277
  * @returns All extended contract data in the block (if found).
200
278
  */
201
279
  getExtendedContractDataInBlock(blockNum) {
202
- if (blockNum > this.l2Blocks.length) {
280
+ if (blockNum > this.l2BlockContexts.length) {
203
281
  return Promise.resolve([]);
204
282
  }
205
283
  return Promise.resolve(this.extendedContractDataByBlock[blockNum] || []);
@@ -214,8 +292,8 @@ export class MemoryArchiverStore {
214
292
  if (contractAddress.isZero()) {
215
293
  return Promise.resolve(undefined);
216
294
  }
217
- for (const block of this.l2Blocks) {
218
- for (const contractData of block.newContractData) {
295
+ for (const blockContext of this.l2BlockContexts) {
296
+ for (const contractData of blockContext.block.newContractData) {
219
297
  if (contractData.contractAddress.equals(contractAddress)) {
220
298
  return Promise.resolve(contractData);
221
299
  }
@@ -230,10 +308,10 @@ export class MemoryArchiverStore {
230
308
  * @returns ContractData with the portal address (if we didn't throw an error).
231
309
  */
232
310
  getContractDataInBlock(l2BlockNum) {
233
- if (l2BlockNum > this.l2Blocks.length) {
311
+ if (l2BlockNum > this.l2BlockContexts.length) {
234
312
  return Promise.resolve([]);
235
313
  }
236
- const block = this.l2Blocks[l2BlockNum];
314
+ const block = this.l2BlockContexts[l2BlockNum].block;
237
315
  return Promise.resolve(block.newContractData);
238
316
  }
239
317
  /**
@@ -241,16 +319,9 @@ export class MemoryArchiverStore {
241
319
  * @returns The number of the latest L2 block processed.
242
320
  */
243
321
  getBlockNumber() {
244
- if (this.l2Blocks.length === 0)
322
+ if (this.l2BlockContexts.length === 0)
245
323
  return Promise.resolve(INITIAL_L2_BLOCK_NUM - 1);
246
- return Promise.resolve(this.l2Blocks[this.l2Blocks.length - 1].number);
247
- }
248
- /**
249
- * Gets the length of L2 blocks in store.
250
- * @returns The length of L2 Blocks array.
251
- */
252
- getBlocksLength() {
253
- return this.l2Blocks.length;
324
+ return Promise.resolve(this.l2BlockContexts[this.l2BlockContexts.length - 1].block.number);
254
325
  }
255
326
  }
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFNLG1DQUFtQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0UsT0FBTyxFQUdMLG9CQUFvQixFQUtwQixPQUFPLEdBRVIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFxSTVGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQTRDOUI7UUEzQ0E7O1dBRUc7UUFDSyxhQUFRLEdBQWMsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ0ssVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUUzQjs7O1dBR0c7UUFDSyxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFFNUM7OztXQUdHO1FBQ0ssb0JBQWUsR0FBb0IsRUFBRSxDQUFDO1FBRTlDOztXQUVHO1FBQ0ssZ0NBQTJCLEdBQTJDLEVBQUUsQ0FBQztRQUVqRjs7V0FFRztRQUNLLHlCQUFvQixHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVFOzs7V0FHRztRQUNLLDRCQUF1QixHQUF1QixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFL0U7O1dBRUc7UUFDSywwQkFBcUIsR0FBOEIsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO0lBRTVFLENBQUM7SUFFaEI7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxNQUFpQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQs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
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFNLG1DQUFtQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0UsT0FBTyxFQUdMLHdCQUF3QixFQUV4QixvQkFBb0IsRUFHcEIsY0FBYyxFQUlkLEtBQUssRUFDTCxPQUFPLEVBRVAsZ0JBQWdCLEdBQ2pCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBc0k1Rjs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUE0QzlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBN0NqQzs7V0FFRztRQUNLLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUUvQzs7V0FFRztRQUNLLFVBQUssR0FBVyxFQUFFLENBQUM7UUFFM0I7OztXQUdHO1FBQ0ssMEJBQXFCLEdBQW9CLEVBQUUsQ0FBQztRQUVwRDs7O1dBR0c7UUFDSyw0QkFBdUIsR0FBb0IsRUFBRSxDQUFDO1FBRXREOztXQUVHO1FBQ0ssZ0NBQTJCLEdBQTJDLEVBQUUsQ0FBQztRQUVqRjs7V0FFRztRQUNLLHlCQUFvQixHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVFOzs7V0FHRztRQUNLLDRCQUF1QixHQUF1QixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFL0U7O1dBRUc7UUFDSywwQkFBcUIsR0FBOEIsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO0lBS3hGLENBQUM7SUFFSjs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQWlCO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFD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
@@ -25,10 +25,6 @@ export interface ArchiverConfig {
25
25
  * The polling interval viem uses in ms
26
26
  */
27
27
  viemPollingIntervalMS?: number;
28
- /**
29
- * Eth block from which we start scanning for L2Blocks.
30
- */
31
- searchStartBlock: number;
32
28
  /**
33
29
  * The deployed L1 contract addresses
34
30
  */
@@ -37,6 +33,8 @@ export interface ArchiverConfig {
37
33
  * Optional dir to store data. If omitted will store in memory.
38
34
  */
39
35
  dataDirectory?: string;
36
+ /** The max number of logs that can be obtained in 1 "getUnencryptedLogs" call. */
37
+ maxLogs?: number;
40
38
  }
41
39
  /**
42
40
  * Returns the archiver configuration from the environment variables.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/archiver/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGtD;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,WAAW,EAAE,mBAAmB,CAAC;IAEjC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAkCjD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/archiver/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGtD;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,WAAW,EAAE,mBAAmB,CAAC;IAEjC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAgCjD"}
@@ -5,7 +5,7 @@ import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  * @returns The archiver configuration.
6
6
  */
7
7
  export function getConfigEnvVars() {
8
- const { ETHEREUM_HOST, ARCHIVER_POLLING_INTERVAL_MS, ARCHIVER_VIEM_POLLING_INTERVAL_MS, ROLLUP_CONTRACT_ADDRESS, CONTRACT_DEPLOYMENT_EMITTER_ADDRESS, SEARCH_START_BLOCK, API_KEY, INBOX_CONTRACT_ADDRESS, OUTBOX_CONTRACT_ADDRESS, REGISTRY_CONTRACT_ADDRESS, DATA_DIRECTORY, } = process.env;
8
+ const { ETHEREUM_HOST, ARCHIVER_POLLING_INTERVAL_MS, ARCHIVER_VIEM_POLLING_INTERVAL_MS, ROLLUP_CONTRACT_ADDRESS, CONTRACT_DEPLOYMENT_EMITTER_ADDRESS, API_KEY, INBOX_CONTRACT_ADDRESS, OUTBOX_CONTRACT_ADDRESS, REGISTRY_CONTRACT_ADDRESS, DATA_DIRECTORY, } = process.env;
9
9
  // Populate the relevant addresses for use by the archiver.
10
10
  const addresses = {
11
11
  rollupAddress: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
@@ -21,10 +21,9 @@ export function getConfigEnvVars() {
21
21
  rpcUrl: ETHEREUM_HOST || 'http://127.0.0.1:8545/',
22
22
  archiverPollingIntervalMS: ARCHIVER_POLLING_INTERVAL_MS ? +ARCHIVER_POLLING_INTERVAL_MS : 1000,
23
23
  viemPollingIntervalMS: ARCHIVER_VIEM_POLLING_INTERVAL_MS ? +ARCHIVER_VIEM_POLLING_INTERVAL_MS : 1000,
24
- searchStartBlock: SEARCH_START_BLOCK ? +SEARCH_START_BLOCK : 0,
25
24
  apiKey: API_KEY,
26
25
  l1Contracts: addresses,
27
26
  dataDirectory: DATA_DIRECTORY,
28
27
  };
29
28
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFpRDNEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE1BQU0sRUFDSixhQUFhLEVBQ2IsNEJBQTRCLEVBQzVCLGlDQUFpQyxFQUNqQyx1QkFBdUIsRUFDdkIsbUNBQW1DLEVBQ25DLGtCQUFrQixFQUNsQixPQUFPLEVBQ1Asc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIsY0FBYyxHQUNmLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNoQiwyREFBMkQ7SUFDM0QsTUFBTSxTQUFTLEdBQXdCO1FBQ3JDLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUN6RyxlQUFlLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDL0csWUFBWSxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ3RHLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUN6RyxnQ0FBZ0MsRUFBRSxtQ0FBbUM7WUFDbkUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUM7WUFDNUQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ25CLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxJQUFJO0tBQ3RDLENBQUM7SUFDRixPQUFPO1FBQ0wsTUFBTSxFQUFFLGFBQWEsSUFBSSx3QkFBd0I7UUFDakQseUJBQXlCLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUs7UUFDL0YscUJBQXFCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLElBQUs7UUFDckcsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxFQUFFLE9BQU87UUFDZixXQUFXLEVBQUUsU0FBUztRQUN0QixhQUFhLEVBQUUsY0FBYztLQUM5QixDQUFDO0FBQ0osQ0FBQyJ9
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUErQzNEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE1BQU0sRUFDSixhQUFhLEVBQ2IsNEJBQTRCLEVBQzVCLGlDQUFpQyxFQUNqQyx1QkFBdUIsRUFDdkIsbUNBQW1DLEVBQ25DLE9BQU8sRUFDUCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QixjQUFjLEdBQ2YsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ2hCLDJEQUEyRDtJQUMzRCxNQUFNLFNBQVMsR0FBd0I7UUFDckMsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ3pHLGVBQWUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUMvRyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDdEcsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ3pHLGdDQUFnQyxFQUFFLG1DQUFtQztZQUNuRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQztZQUM1RCxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDbkIsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLElBQUk7S0FDdEMsQ0FBQztJQUNGLE9BQU87UUFDTCxNQUFNLEVBQUUsYUFBYSxJQUFJLHdCQUF3QjtRQUNqRCx5QkFBeUIsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsSUFBSztRQUMvRixxQkFBcUIsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsSUFBSztRQUNyRyxNQUFNLEVBQUUsT0FBTztRQUNmLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGFBQWEsRUFBRSxjQUFjO0tBQzlCLENBQUM7QUFDSixDQUFDIn0=
package/dest/index.js CHANGED
@@ -12,13 +12,14 @@ const log = createDebugLogger('aztec:archiver');
12
12
  // eslint-disable-next-line require-await
13
13
  async function main() {
14
14
  const config = getConfigEnvVars();
15
- const { rpcUrl, l1Contracts, searchStartBlock } = config;
15
+ const { rpcUrl, l1Contracts } = config;
16
16
  const publicClient = createPublicClient({
17
17
  chain: localhost,
18
18
  transport: http(rpcUrl),
19
19
  });
20
- const archiverStore = new MemoryArchiverStore();
21
- const archiver = new Archiver(publicClient, l1Contracts.rollupAddress, l1Contracts.inboxAddress, l1Contracts.registryAddress, l1Contracts.contractDeploymentEmitterAddress, searchStartBlock, archiverStore);
20
+ const archiverStore = new MemoryArchiverStore(1000);
21
+ const archiver = new Archiver(publicClient, l1Contracts.rollupAddress, l1Contracts.inboxAddress, l1Contracts.registryAddress, l1Contracts.contractDeploymentEmitterAddress, 0, // searchStartBlock
22
+ archiverStore);
22
23
  const shutdown = async () => {
23
24
  await archiver.stop();
24
25
  process.exit(0);
@@ -34,4 +35,4 @@ if (process.argv[1] === fileURLToPath(import.meta.url).replace(/\/index\.js$/, '
34
35
  process.exit(1);
35
36
  });
36
37
  }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakUsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFekQsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsS0FBSyxFQUFFLFNBQVM7UUFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBRWhELE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUMzQixZQUFZLEVBQ1osV0FBVyxDQUFDLGFBQWEsRUFDekIsV0FBVyxDQUFDLFlBQVksRUFDeEIsV0FBVyxDQUFDLGVBQWUsRUFDM0IsV0FBVyxDQUFDLGdDQUFnQyxFQUM1QyxnQkFBZ0IsRUFDaEIsYUFBYSxDQUNkLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRTtRQUMxQixNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUU7SUFDbEYsbUVBQW1FO0lBQ25FLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztDQUNKIn0=
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakUsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFdkMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsS0FBSyxFQUFFLFNBQVM7UUFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FDM0IsWUFBWSxFQUNaLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLFdBQVcsQ0FBQyxZQUFZLEVBQ3hCLFdBQVcsQ0FBQyxlQUFlLEVBQzNCLFdBQVcsQ0FBQyxnQ0FBZ0MsRUFDNUMsQ0FBQyxFQUFFLG1CQUFtQjtJQUN0QixhQUFhLENBQ2QsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzFCLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsRUFBRTtJQUNsRixtRUFBbUU7SUFDbkUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0NBQ0oifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/archiver",
3
- "version": "0.8.10",
3
+ "version": "0.8.11",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -34,11 +34,11 @@
34
34
  "rootDir": "./src"
35
35
  },
36
36
  "dependencies": {
37
- "@aztec/circuits.js": "0.8.10",
38
- "@aztec/ethereum": "0.8.10",
39
- "@aztec/foundation": "0.8.10",
40
- "@aztec/l1-artifacts": "0.8.10",
41
- "@aztec/types": "0.8.10",
37
+ "@aztec/circuits.js": "0.8.11",
38
+ "@aztec/ethereum": "0.8.11",
39
+ "@aztec/foundation": "0.8.11",
40
+ "@aztec/l1-artifacts": "0.8.11",
41
+ "@aztec/types": "0.8.11",
42
42
  "@types/lodash.omit": "^4.5.7",
43
43
  "debug": "^4.3.4",
44
44
  "lodash.omit": "^4.5.0",
@@ -5,12 +5,13 @@ import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  import { Fr } from '@aztec/foundation/fields';
6
6
  import { DebugLogger, createDebugLogger } from '@aztec/foundation/log';
7
7
  import { RunningPromise } from '@aztec/foundation/running-promise';
8
+ import { RegistryAbi } from '@aztec/l1-artifacts';
8
9
  import {
9
10
  ContractData,
10
11
  ContractDataSource,
11
12
  EncodedContractFunction,
12
13
  ExtendedContractData,
13
- INITIAL_L2_BLOCK_NUM,
14
+ GetUnencryptedLogsResponse,
14
15
  L1ToL2Message,
15
16
  L1ToL2MessageSource,
16
17
  L2Block,
@@ -18,12 +19,13 @@ import {
18
19
  L2BlockSource,
19
20
  L2LogsSource,
20
21
  L2Tx,
22
+ LogFilter,
21
23
  LogType,
22
24
  TxHash,
23
25
  } from '@aztec/types';
24
26
 
25
27
  import omit from 'lodash.omit';
26
- import { Chain, HttpTransport, PublicClient, createPublicClient, http } from 'viem';
28
+ import { Chain, HttpTransport, PublicClient, createPublicClient, getContract, http } from 'viem';
27
29
 
28
30
  import { ArchiverDataStore, MemoryArchiverStore } from './archiver_store.js';
29
31
  import { ArchiverConfig } from './config.js';
@@ -48,17 +50,17 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
48
50
  /**
49
51
  * Next L1 block number to fetch `L2BlockProcessed` logs from (i.e. `fromBlock` in eth_getLogs).
50
52
  */
51
- private nextL2BlockFromBlock = 0n;
53
+ private nextL2BlockFromL1Block = 0n;
52
54
 
53
55
  /**
54
56
  * Last Processed Block Number
55
57
  */
56
- private lastProcessedBlockNumber = 0n;
58
+ private lastProcessedL1BlockNumber = 0n;
57
59
 
58
60
  /**
59
61
  * Use this to track logged block in order to avoid repeating the same message.
60
62
  */
61
- private lastLoggedBlockNumber = 0n;
63
+ private lastLoggedL1BlockNumber = 0n;
62
64
 
63
65
  /**
64
66
  * Creates a new instance of the Archiver.
@@ -83,8 +85,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
83
85
  private readonly pollingIntervalMs = 10_000,
84
86
  private readonly log: DebugLogger = createDebugLogger('aztec:archiver'),
85
87
  ) {
86
- this.nextL2BlockFromBlock = BigInt(searchStartBlock);
87
- this.lastProcessedBlockNumber = BigInt(searchStartBlock);
88
+ this.nextL2BlockFromL1Block = BigInt(searchStartBlock);
89
+ this.lastProcessedL1BlockNumber = BigInt(searchStartBlock);
88
90
  }
89
91
 
90
92
  /**
@@ -100,14 +102,24 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
100
102
  transport: http(chain.rpcUrl),
101
103
  pollingInterval: config.viemPollingIntervalMS,
102
104
  });
103
- const archiverStore = new MemoryArchiverStore();
105
+
106
+ // ask the registry for the block number when the rollup was deployed
107
+ // this is the block from which archiver has to search from
108
+ const registryContract = getContract({
109
+ address: config.l1Contracts.registryAddress.toString(),
110
+ abi: RegistryAbi,
111
+ publicClient,
112
+ });
113
+ const searchStartBlock = Number((await registryContract.read.getCurrentSnapshot()).blockNumber);
114
+
115
+ const archiverStore = new MemoryArchiverStore(config.maxLogs ?? 1000);
104
116
  const archiver = new Archiver(
105
117
  publicClient,
106
118
  config.l1Contracts.rollupAddress,
107
119
  config.l1Contracts.inboxAddress,
108
120
  config.l1Contracts.registryAddress,
109
121
  config.l1Contracts.contractDeploymentEmitterAddress,
110
- config.searchStartBlock,
122
+ searchStartBlock,
111
123
  archiverStore,
112
124
  config.archiverPollingIntervalMS,
113
125
  );
@@ -138,12 +150,12 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
138
150
  * @param blockUntilSynced - If true, blocks until the archiver has fully synced.
139
151
  */
140
152
  private async sync(blockUntilSynced: boolean) {
141
- const currentBlockNumber = await this.publicClient.getBlockNumber();
142
- if (currentBlockNumber <= this.lastProcessedBlockNumber) {
153
+ const currentL1BlockNumber = await this.publicClient.getBlockNumber();
154
+ if (currentL1BlockNumber <= this.lastProcessedL1BlockNumber) {
143
155
  // reducing logs, otherwise this gets triggered on every loop (1s)
144
- if (currentBlockNumber !== this.lastLoggedBlockNumber) {
145
- this.log(`No new blocks to process, current block number: ${currentBlockNumber}`);
146
- this.lastLoggedBlockNumber = currentBlockNumber;
156
+ if (currentL1BlockNumber !== this.lastLoggedL1BlockNumber) {
157
+ this.log(`No new blocks to process, current block number: ${currentL1BlockNumber}`);
158
+ this.lastLoggedL1BlockNumber = currentL1BlockNumber;
147
159
  }
148
160
  return;
149
161
  }
@@ -165,7 +177,7 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
165
177
  * This is a problem for example when setting the last block number marker for L1 to L2 messages -
166
178
  * this.lastProcessedBlockNumber = currentBlockNumber;
167
179
  * It's possible that we actually received messages in block currentBlockNumber + 1 meaning the next time
168
- * we do this sync we get the same message again. Addtionally, the call to get cancelled L1 to L2 messages
180
+ * we do this sync we get the same message again. Additionally, the call to get cancelled L1 to L2 messages
169
181
  * could read from a block not present when retrieving pending messages. If a message was added and cancelled
170
182
  * in the same eth block then we could try and cancel a non-existent pending message.
171
183
  *
@@ -182,15 +194,15 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
182
194
  this.publicClient,
183
195
  this.inboxAddress,
184
196
  blockUntilSynced,
185
- this.lastProcessedBlockNumber + 1n, // + 1 to prevent re-including messages from the last processed block
186
- currentBlockNumber,
197
+ this.lastProcessedL1BlockNumber + 1n, // + 1 to prevent re-including messages from the last processed block
198
+ currentL1BlockNumber,
187
199
  );
188
200
  const retrievedCancelledL1ToL2Messages = await retrieveNewCancelledL1ToL2Messages(
189
201
  this.publicClient,
190
202
  this.inboxAddress,
191
203
  blockUntilSynced,
192
- this.lastProcessedBlockNumber + 1n,
193
- currentBlockNumber,
204
+ this.lastProcessedL1BlockNumber + 1n,
205
+ currentL1BlockNumber,
194
206
  );
195
207
 
196
208
  // TODO (#717): optimise this - there could be messages in confirmed that are also in pending.
@@ -202,21 +214,21 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
202
214
  this.log('Removing pending l1 to l2 messages from store where messages were cancelled');
203
215
  await this.store.cancelPendingL1ToL2Messages(retrievedCancelledL1ToL2Messages.retrievedData);
204
216
 
205
- this.lastProcessedBlockNumber = currentBlockNumber;
217
+ this.lastProcessedL1BlockNumber = currentL1BlockNumber;
206
218
 
207
219
  // ********** Events that are processed per block **********
208
220
 
209
221
  // Read all data from chain and then write to our stores at the end
210
- const nextExpectedL2BlockNum = BigInt(this.store.getBlocksLength() + INITIAL_L2_BLOCK_NUM);
222
+ const nextExpectedL2BlockNum = BigInt((await this.store.getBlockNumber()) + 1);
211
223
  this.log(
212
- `Retrieving chain state from L1 block: ${this.nextL2BlockFromBlock}, next expected l2 block number: ${nextExpectedL2BlockNum}`,
224
+ `Retrieving chain state from L1 block: ${this.nextL2BlockFromL1Block}, next expected l2 block number: ${nextExpectedL2BlockNum}`,
213
225
  );
214
226
  const retrievedBlocks = await retrieveBlocks(
215
227
  this.publicClient,
216
228
  this.rollupAddress,
217
229
  blockUntilSynced,
218
- this.nextL2BlockFromBlock,
219
- currentBlockNumber,
230
+ this.nextL2BlockFromL1Block,
231
+ currentL1BlockNumber,
220
232
  nextExpectedL2BlockNum,
221
233
  );
222
234
 
@@ -229,8 +241,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
229
241
  this.publicClient,
230
242
  this.contractDeploymentEmitterAddress,
231
243
  blockUntilSynced,
232
- this.nextL2BlockFromBlock,
233
- currentBlockNumber,
244
+ this.nextL2BlockFromL1Block,
245
+ currentL1BlockNumber,
234
246
  blockHashMapping,
235
247
  );
236
248
  if (retrievedBlocks.retrievedData.length === 0) {
@@ -268,14 +280,14 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
268
280
 
269
281
  // store retrieved L2 blocks after removing new logs information.
270
282
  // remove logs to serve "lightweight" block information. Logs can be fetched separately if needed.
271
- await this.store.addL2Blocks(
283
+ await this.store.addBlocks(
272
284
  retrievedBlocks.retrievedData.map(block =>
273
285
  L2Block.fromFields(omit(block, ['newEncryptedLogs', 'newUnencryptedLogs']), block.getBlockHash()),
274
286
  ),
275
287
  );
276
288
 
277
289
  // set the L1 block for the next search
278
- this.nextL2BlockFromBlock = retrievedBlocks.nextEthBlockNumber;
290
+ this.nextL2BlockFromL1Block = retrievedBlocks.nextEthBlockNumber;
279
291
  }
280
292
 
281
293
  /**
@@ -304,8 +316,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
304
316
  * @param limit - The number of blocks to return.
305
317
  * @returns The requested L2 blocks.
306
318
  */
307
- public getL2Blocks(from: number, limit: number): Promise<L2Block[]> {
308
- return this.store.getL2Blocks(from, limit);
319
+ public getBlocks(from: number, limit: number): Promise<L2Block[]> {
320
+ return this.store.getBlocks(from, limit);
309
321
  }
310
322
 
311
323
  /**
@@ -313,12 +325,12 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
313
325
  * @param number - The block number to return (inclusive).
314
326
  * @returns The requested L2 block.
315
327
  */
316
- public async getL2Block(number: number): Promise<L2Block | undefined> {
328
+ public async getBlock(number: number): Promise<L2Block | undefined> {
317
329
  // If the number provided is -ve, then return the latest block.
318
330
  if (number < 0) {
319
- number = this.store.getBlocksLength();
331
+ number = await this.store.getBlockNumber();
320
332
  }
321
- const blocks = await this.store.getL2Blocks(number, 1);
333
+ const blocks = await this.store.getBlocks(number, 1);
322
334
  return blocks.length === 0 ? undefined : blocks[0];
323
335
  }
324
336
 
@@ -389,6 +401,15 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
389
401
  return this.store.getLogs(from, limit, logType);
390
402
  }
391
403
 
404
+ /**
405
+ * Gets unencrypted logs based on the provided filter.
406
+ * @param filter - The filter to apply to the logs.
407
+ * @returns The requested logs.
408
+ */
409
+ getUnencryptedLogs(filter: LogFilter): Promise<GetUnencryptedLogsResponse> {
410
+ return this.store.getUnencryptedLogs(filter);
411
+ }
412
+
392
413
  /**
393
414
  * Gets the number of the latest L2 block processed by the block source implementation.
394
415
  * @returns The number of the latest L2 block processed by the block source implementation.