@aztec/archiver 0.16.0 → 0.16.2

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.
Files changed (41) hide show
  1. package/dest/archiver/archiver.d.ts +3 -6
  2. package/dest/archiver/archiver.d.ts.map +1 -1
  3. package/dest/archiver/archiver.js +25 -46
  4. package/dest/archiver/archiver_store.d.ts +10 -161
  5. package/dest/archiver/archiver_store.d.ts.map +1 -1
  6. package/dest/archiver/archiver_store.js +2 -328
  7. package/dest/archiver/archiver_store_test_suite.d.ts +8 -0
  8. package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -0
  9. package/dest/archiver/archiver_store_test_suite.js +478 -0
  10. package/dest/archiver/data_retrieval.d.ts +3 -4
  11. package/dest/archiver/data_retrieval.d.ts.map +1 -1
  12. package/dest/archiver/data_retrieval.js +1 -1
  13. package/dest/archiver/eth_log_handlers.d.ts +3 -4
  14. package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
  15. package/dest/archiver/eth_log_handlers.js +7 -6
  16. package/dest/archiver/index.d.ts +3 -0
  17. package/dest/archiver/index.d.ts.map +1 -1
  18. package/dest/archiver/index.js +3 -1
  19. package/dest/archiver/lmdb_archiver_store.d.ts +125 -0
  20. package/dest/archiver/lmdb_archiver_store.d.ts.map +1 -0
  21. package/dest/archiver/lmdb_archiver_store.js +545 -0
  22. package/dest/archiver/{l1_to_l2_message_store.d.ts → memory_archiver_store/l1_to_l2_message_store.d.ts} +6 -2
  23. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -0
  24. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +91 -0
  25. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +163 -0
  26. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -0
  27. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +338 -0
  28. package/dest/index.js +3 -4
  29. package/package.json +7 -6
  30. package/src/archiver/archiver.ts +40 -53
  31. package/src/archiver/archiver_store.ts +16 -373
  32. package/src/archiver/archiver_store_test_suite.ts +638 -0
  33. package/src/archiver/data_retrieval.ts +5 -6
  34. package/src/archiver/eth_log_handlers.ts +23 -16
  35. package/src/archiver/index.ts +3 -0
  36. package/src/archiver/lmdb_archiver_store.ts +728 -0
  37. package/src/archiver/{l1_to_l2_message_store.ts → memory_archiver_store/l1_to_l2_message_store.ts} +23 -3
  38. package/src/archiver/memory_archiver_store/memory_archiver_store.ts +399 -0
  39. package/src/index.ts +1 -2
  40. package/dest/archiver/l1_to_l2_message_store.d.ts.map +0 -1
  41. package/dest/archiver/l1_to_l2_message_store.js +0 -72
@@ -0,0 +1,545 @@
1
+ var _LMDBArchiverStore_instances, _LMDBArchiverStore_tables, _LMDBArchiverStore_logsMaxPageSize, _LMDBArchiverStore_log, _LMDBArchiverStore_filterLogsOfTx, _LMDBArchiverStore_filterLogsBetweenBlocks, _LMDBArchiverStore_accumulateLogs, _LMDBArchiverStore_getBlock, _LMDBArchiverStore_computeBlockRange, _LMDBArchiverStore_getL1ToL2Message, _LMDBArchiverStore_updateMessageCountInTx;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { Fr } from '@aztec/circuits.js';
4
+ import { toBigIntBE, toBufferBE } from '@aztec/foundation/bigint-buffer';
5
+ import { createDebugLogger } from '@aztec/foundation/log';
6
+ import { ExtendedContractData, ExtendedUnencryptedL2Log, INITIAL_L2_BLOCK_NUM, L1ToL2Message, L2Block, L2BlockL2Logs, LogId, LogType, UnencryptedL2Log, } from '@aztec/types';
7
+ function l1ToL2MessageBlockKey(l1BlockNumber, key, indexInBlock) {
8
+ return `${toBufferBE(l1BlockNumber, 32).toString('hex')}:${key}:${indexInBlock}`;
9
+ }
10
+ /* eslint-enable */
11
+ /**
12
+ * LMDB implementation of the ArchiverDataStore interface.
13
+ */
14
+ export class LMDBArchiverStore {
15
+ constructor(db, logsMaxPageSize = 1000) {
16
+ _LMDBArchiverStore_instances.add(this);
17
+ _LMDBArchiverStore_tables.set(this, void 0);
18
+ _LMDBArchiverStore_logsMaxPageSize.set(this, void 0);
19
+ _LMDBArchiverStore_log.set(this, createDebugLogger('aztec:archiver:lmdb'));
20
+ __classPrivateFieldSet(this, _LMDBArchiverStore_tables, {
21
+ blocks: db.openDB('blocks', {
22
+ keyEncoding: 'uint32',
23
+ encoding: 'msgpack',
24
+ }),
25
+ txIndex: db.openDB('tx_index', {
26
+ keyEncoding: 'binary',
27
+ encoding: 'msgpack',
28
+ }),
29
+ contractIndex: db.openDB('contract_index', {
30
+ keyEncoding: 'binary',
31
+ encoding: 'msgpack',
32
+ }),
33
+ l1ToL2Messages: db.openDB('l1_to_l2_messages', {
34
+ keyEncoding: 'binary',
35
+ encoding: 'msgpack',
36
+ }),
37
+ l1ToL2MessagesByBlock: db.openDB('l1_to_l2_message_nonces', {
38
+ keyEncoding: 'ordered-binary',
39
+ encoding: 'binary',
40
+ }),
41
+ pendingMessagesByFee: db.openDB('pending_messages_by_fee', {
42
+ keyEncoding: 'ordered-binary',
43
+ encoding: 'binary',
44
+ dupSort: true,
45
+ }),
46
+ }, "f");
47
+ __classPrivateFieldSet(this, _LMDBArchiverStore_logsMaxPageSize, logsMaxPageSize, "f");
48
+ }
49
+ async close() {
50
+ await Promise.all(Object.values(__classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f")).map(table => table.close()));
51
+ }
52
+ /**
53
+ * Append new blocks to the store's list.
54
+ * @param blocks - The L2 blocks to be added to the store.
55
+ * @returns True if the operation is successful.
56
+ */
57
+ addBlocks(blocks) {
58
+ // LMDB transactions are shared across databases, so we can use a single transaction for all the writes
59
+ // https://github.com/kriszyp/lmdb-js/blob/67505a979ab63187953355a88747a7ad703d50b6/README.md#dbopendbdatabase-stringnamestring
60
+ return __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.transaction(() => {
61
+ for (const block of blocks) {
62
+ const blockCtx = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.get(block.number) ?? {};
63
+ blockCtx.block = block.toBuffer();
64
+ blockCtx.l1BlockNumber = toBufferBE(block.getL1BlockNumber(), 32);
65
+ // no need to await, all writes are enqueued in the transaction
66
+ // awaiting would interrupt the execution flow of this callback and "leak" the transaction to some other part
67
+ // of the system and any writes would then be part of our transaction here
68
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.put(block.number, blockCtx);
69
+ for (const [i, tx] of block.getTxs().entries()) {
70
+ if (tx.txHash.isZero()) {
71
+ continue;
72
+ }
73
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").txIndex.put(tx.txHash.buffer, [block.number, i]);
74
+ }
75
+ for (const [i, contractData] of block.newContractData.entries()) {
76
+ if (contractData.contractAddress.isZero()) {
77
+ continue;
78
+ }
79
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").contractIndex.put(contractData.contractAddress.toBuffer(), [block.number, i]);
80
+ }
81
+ }
82
+ return true;
83
+ });
84
+ }
85
+ /**
86
+ * Gets up to `limit` amount of L2 blocks starting from `from`.
87
+ * @param start - Number of the first block to return (inclusive).
88
+ * @param limit - The number of blocks to return.
89
+ * @returns The requested L2 blocks.
90
+ */
91
+ getBlocks(start, limit) {
92
+ try {
93
+ const blocks = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks
94
+ .getRange(__classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_computeBlockRange).call(this, start, limit))
95
+ .filter(({ value }) => value.block)
96
+ .map(({ value }) => {
97
+ const block = L2Block.fromBuffer(asBuffer(value.block));
98
+ if (value.encryptedLogs) {
99
+ block.attachLogs(L2BlockL2Logs.fromBuffer(asBuffer(value.encryptedLogs)), LogType.ENCRYPTED);
100
+ }
101
+ if (value.unencryptedLogs) {
102
+ block.attachLogs(L2BlockL2Logs.fromBuffer(asBuffer(value.unencryptedLogs)), LogType.UNENCRYPTED);
103
+ }
104
+ return block;
105
+ }).asArray;
106
+ return Promise.resolve(blocks);
107
+ }
108
+ catch (err) {
109
+ // this function is sync so if any errors are thrown we need to make sure they're passed on as rejected Promises
110
+ return Promise.reject(err);
111
+ }
112
+ }
113
+ /**
114
+ * Gets an l2 tx.
115
+ * @param txHash - The txHash of the l2 tx.
116
+ * @returns The requested L2 tx.
117
+ */
118
+ getL2Tx(txHash) {
119
+ const [blockNumber, txIndex] = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").txIndex.get(txHash.buffer) ?? [];
120
+ if (typeof blockNumber !== 'number' || typeof txIndex !== 'number') {
121
+ return Promise.resolve(undefined);
122
+ }
123
+ const block = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_getBlock).call(this, blockNumber, true);
124
+ return Promise.resolve(block?.getTx(txIndex));
125
+ }
126
+ /**
127
+ * Append new logs to the store's list.
128
+ * @param encryptedLogs - The logs to be added to the store.
129
+ * @param unencryptedLogs - The type of the logs to be added to the store.
130
+ * @param blockNumber - The block for which to add the logs.
131
+ * @returns True if the operation is successful.
132
+ */
133
+ addLogs(encryptedLogs, unencryptedLogs, blockNumber) {
134
+ return __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.transaction(() => {
135
+ const blockCtx = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.get(blockNumber) ?? {};
136
+ if (encryptedLogs) {
137
+ blockCtx.encryptedLogs = encryptedLogs.toBuffer();
138
+ }
139
+ if (unencryptedLogs) {
140
+ blockCtx.unencryptedLogs = unencryptedLogs.toBuffer();
141
+ }
142
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.put(blockNumber, blockCtx);
143
+ return true;
144
+ });
145
+ }
146
+ /**
147
+ * Append new pending L1 to L2 messages to the store.
148
+ * @param messages - The L1 to L2 messages to be added to the store.
149
+ * @returns True if the operation is successful.
150
+ */
151
+ addPendingL1ToL2Messages(messages) {
152
+ return __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.transaction(() => {
153
+ for (const { message, blockNumber, indexInBlock } of messages) {
154
+ const messageKey = message.entryKey?.toBuffer();
155
+ if (!messageKey) {
156
+ throw new Error('Message does not have an entry key');
157
+ }
158
+ const dupeKey = l1ToL2MessageBlockKey(blockNumber, 'newMessage', indexInBlock);
159
+ const messageInBlock = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2MessagesByBlock.get(dupeKey);
160
+ if (messageInBlock?.equals(messageKey)) {
161
+ continue;
162
+ }
163
+ else {
164
+ if (messageInBlock) {
165
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Previously add pending message ${messageInBlock.toString('hex')} at ${dupeKey.toString()}, now got ${messageKey.toString('hex')}`);
166
+ }
167
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2MessagesByBlock.put(dupeKey, messageKey);
168
+ }
169
+ let messageWithCount = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.get(messageKey);
170
+ if (!messageWithCount) {
171
+ messageWithCount = {
172
+ message: message.toBuffer(),
173
+ pendingCount: 0,
174
+ confirmedCount: 0,
175
+ };
176
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.put(messageKey, messageWithCount);
177
+ }
178
+ __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_updateMessageCountInTx).call(this, messageKey, message, 1, 0);
179
+ }
180
+ return true;
181
+ });
182
+ }
183
+ /**
184
+ * Remove pending L1 to L2 messages from the store (if they were cancelled).
185
+ * @param messages - The message keys to be removed from the store.
186
+ * @returns True if the operation is successful.
187
+ */
188
+ cancelPendingL1ToL2Messages(messages) {
189
+ return __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.transaction(() => {
190
+ for (const { blockNumber, indexInBlock, entryKey } of messages) {
191
+ const messageKey = entryKey.toBuffer();
192
+ const dupeKey = l1ToL2MessageBlockKey(blockNumber, 'cancelledMessage', indexInBlock);
193
+ const messageInBlock = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2MessagesByBlock.get(dupeKey);
194
+ if (messageInBlock?.equals(messageKey)) {
195
+ continue;
196
+ }
197
+ else {
198
+ if (messageInBlock) {
199
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Previously add pending message ${messageInBlock.toString('hex')} at ${dupeKey.toString()}, now got ${messageKey.toString('hex')}`);
200
+ }
201
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2MessagesByBlock.put(dupeKey, messageKey);
202
+ }
203
+ const message = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_getL1ToL2Message).call(this, messageKey);
204
+ __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_updateMessageCountInTx).call(this, messageKey, message, -1, 0);
205
+ }
206
+ return true;
207
+ });
208
+ }
209
+ /**
210
+ * Messages that have been published in an L2 block are confirmed.
211
+ * Add them to the confirmed store, also remove them from the pending store.
212
+ * @param entryKeys - The message keys to be removed from the store.
213
+ * @returns True if the operation is successful.
214
+ */
215
+ confirmL1ToL2Messages(entryKeys) {
216
+ return __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.transaction(() => {
217
+ for (const entryKey of entryKeys) {
218
+ const messageKey = entryKey.toBuffer();
219
+ const message = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_getL1ToL2Message).call(this, messageKey);
220
+ __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_updateMessageCountInTx).call(this, messageKey, message, -1, 1);
221
+ }
222
+ return true;
223
+ });
224
+ }
225
+ /**
226
+ * Gets up to `limit` amount of pending L1 to L2 messages, sorted by fee
227
+ * @param limit - The number of messages to return (by default NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).
228
+ * @returns The requested L1 to L2 message keys.
229
+ */
230
+ getPendingL1ToL2MessageKeys(limit) {
231
+ // start a read transaction in order to have a consistent view of the data
232
+ // this is all sync code, but better to be safe in case it changes in the future
233
+ // or we end up having multiple processes touching the same db
234
+ const transaction = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").pendingMessagesByFee.useReadTransaction();
235
+ try {
236
+ // get all the keys, in reverse order
237
+ const fees = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").pendingMessagesByFee.getKeys({ reverse: true, transaction });
238
+ const messages = [];
239
+ loopOverFees: for (const fee of fees) {
240
+ const pendingMessages = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").pendingMessagesByFee.getValues(fee, { transaction });
241
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Found pending messages for ${fee}`);
242
+ for (const messageKey of pendingMessages) {
243
+ const messageWithCount = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.get(messageKey, { transaction });
244
+ if (!messageWithCount || messageWithCount.pendingCount === 0) {
245
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Message ${messageKey.toString('hex')} has no pending count but it got picked up by getPEndingL1ToL2MessageKeys`);
246
+ continue;
247
+ }
248
+ const toAdd = Array(messageWithCount.pendingCount).fill(Fr.fromBuffer(messageKey));
249
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Adding ${toAdd.length} copies of ${messageKey.toString('hex')} for ${fee}`);
250
+ messages.push(...toAdd);
251
+ if (messages.length >= limit) {
252
+ break loopOverFees;
253
+ }
254
+ }
255
+ }
256
+ return Promise.resolve(messages);
257
+ }
258
+ catch (err) {
259
+ return Promise.reject(err);
260
+ }
261
+ finally {
262
+ transaction.done();
263
+ }
264
+ }
265
+ /**
266
+ * Gets the confirmed L1 to L2 message corresponding to the given message key.
267
+ * @param messageKey - The message key to look up.
268
+ * @returns The requested L1 to L2 message or throws if not found.
269
+ */
270
+ getConfirmedL1ToL2Message(messageKey) {
271
+ const value = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.get(messageKey.toBuffer());
272
+ if (!value) {
273
+ return Promise.reject(new Error(`Message with key ${messageKey} not found`));
274
+ }
275
+ if (value.confirmedCount === 0) {
276
+ return Promise.reject(new Error(`Message with key ${messageKey} not confirmed`));
277
+ }
278
+ return Promise.resolve(L1ToL2Message.fromBuffer(value.message));
279
+ }
280
+ /**
281
+ * Gets up to `limit` amount of logs starting from `from`.
282
+ * @param start - Number of the L2 block to which corresponds the first logs to be returned.
283
+ * @param limit - The number of logs to return.
284
+ * @param logType - Specifies whether to return encrypted or unencrypted logs.
285
+ * @returns The requested logs.
286
+ */
287
+ getLogs(start, limit, logType) {
288
+ try {
289
+ const blockCtxKey = logType === LogType.ENCRYPTED ? 'encryptedLogs' : 'unencryptedLogs';
290
+ const logs = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks
291
+ .getRange(__classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_computeBlockRange).call(this, start, limit))
292
+ .map(({ value: { [blockCtxKey]: logs } }) => logs ? L2BlockL2Logs.fromBuffer(asBuffer(logs)) : new L2BlockL2Logs([])).asArray;
293
+ return Promise.resolve(logs);
294
+ }
295
+ catch (err) {
296
+ return Promise.reject(err);
297
+ }
298
+ }
299
+ /**
300
+ * Gets unencrypted logs based on the provided filter.
301
+ * @param filter - The filter to apply to the logs.
302
+ * @returns The requested logs.
303
+ */
304
+ getUnencryptedLogs(filter) {
305
+ try {
306
+ if (filter.afterLog) {
307
+ return Promise.resolve(__classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_filterLogsBetweenBlocks).call(this, filter));
308
+ }
309
+ else if (filter.txHash) {
310
+ return Promise.resolve(__classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_filterLogsOfTx).call(this, filter));
311
+ }
312
+ else {
313
+ return Promise.resolve(__classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_filterLogsBetweenBlocks).call(this, filter));
314
+ }
315
+ }
316
+ catch (err) {
317
+ return Promise.reject(err);
318
+ }
319
+ }
320
+ /**
321
+ * Add new extended contract data from an L2 block to the store's list.
322
+ * @param data - List of contracts' data to be added.
323
+ * @param blockNum - Number of the L2 block the contract data was deployed in.
324
+ * @returns True if the operation is successful.
325
+ */
326
+ addExtendedContractData(data, blockNum) {
327
+ return __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.transaction(() => {
328
+ const blockCtx = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.get(blockNum) ?? {};
329
+ if (!blockCtx.extendedContractData) {
330
+ blockCtx.extendedContractData = [];
331
+ }
332
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Adding ${data.length} extended contract data to block ${blockNum}`);
333
+ blockCtx.extendedContractData.push(...data.map(data => data.toBuffer()));
334
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.put(blockNum, blockCtx);
335
+ return true;
336
+ });
337
+ }
338
+ /**
339
+ * Get the extended contract data for this contract.
340
+ * @param contractAddress - The contract data address.
341
+ * @returns The extended contract data or undefined if not found.
342
+ */
343
+ getExtendedContractData(contractAddress) {
344
+ const [blockNumber, _] = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").contractIndex.get(contractAddress.toBuffer()) ?? [];
345
+ if (typeof blockNumber !== 'number') {
346
+ return Promise.resolve(undefined);
347
+ }
348
+ const blockCtx = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.get(blockNumber);
349
+ if (!blockCtx) {
350
+ return Promise.resolve(undefined);
351
+ }
352
+ for (const data of blockCtx.extendedContractData ?? []) {
353
+ const extendedContractData = ExtendedContractData.fromBuffer(asBuffer(data));
354
+ if (extendedContractData.contractData.contractAddress.equals(contractAddress)) {
355
+ return Promise.resolve(extendedContractData);
356
+ }
357
+ }
358
+ return Promise.resolve(undefined);
359
+ }
360
+ /**
361
+ * Lookup all extended contract data in an L2 block.
362
+ * @param blockNum - The block number to get all contract data from.
363
+ * @returns All extended contract data in the block (if found).
364
+ */
365
+ getExtendedContractDataInBlock(blockNum) {
366
+ const blockCtx = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.get(blockNum);
367
+ if (!blockCtx || !blockCtx.extendedContractData) {
368
+ return Promise.resolve([]);
369
+ }
370
+ return Promise.resolve(blockCtx.extendedContractData.map(data => ExtendedContractData.fromBuffer(asBuffer(data))));
371
+ }
372
+ /**
373
+ * Get basic info for an L2 contract.
374
+ * Contains contract address & the ethereum portal address.
375
+ * @param contractAddress - The contract data address.
376
+ * @returns ContractData with the portal address (if we didn't throw an error).
377
+ */
378
+ getContractData(contractAddress) {
379
+ const [blockNumber, index] = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").contractIndex.get(contractAddress.toBuffer()) ?? [];
380
+ if (typeof blockNumber !== 'number' || typeof index !== 'number') {
381
+ return Promise.resolve(undefined);
382
+ }
383
+ const block = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_getBlock).call(this, blockNumber);
384
+ return Promise.resolve(block?.newContractData[index]);
385
+ }
386
+ /**
387
+ * Get basic info for an all L2 contracts deployed in a block.
388
+ * Contains contract address & the ethereum portal address.
389
+ * @param blockNumber - Number of the L2 block where contracts were deployed.
390
+ * @returns ContractData with the portal address (if we didn't throw an error).
391
+ */
392
+ getContractDataInBlock(blockNumber) {
393
+ const block = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_getBlock).call(this, blockNumber);
394
+ return Promise.resolve(block?.newContractData ?? []);
395
+ }
396
+ /**
397
+ * Gets the number of the latest L2 block processed.
398
+ * @returns The number of the latest L2 block processed.
399
+ */
400
+ getBlockNumber() {
401
+ // inverse range with no start/end will return the last key
402
+ const [lastBlockNumber] = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.getKeys({ reverse: true, limit: 1 }).asArray;
403
+ return Promise.resolve(typeof lastBlockNumber === 'number' ? lastBlockNumber : INITIAL_L2_BLOCK_NUM - 1);
404
+ }
405
+ getL1BlockNumber() {
406
+ // inverse range with no start/end will return the last value
407
+ const [lastBlock] = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.getRange({ reverse: true, limit: 1 }).asArray;
408
+ if (!lastBlock) {
409
+ return Promise.resolve(0n);
410
+ }
411
+ else {
412
+ const blockCtx = lastBlock.value;
413
+ if (!blockCtx.l1BlockNumber) {
414
+ return Promise.reject(new Error('L1 block number not found'));
415
+ }
416
+ else {
417
+ return Promise.resolve(toBigIntBE(asBuffer(blockCtx.l1BlockNumber)));
418
+ }
419
+ }
420
+ }
421
+ }
422
+ _LMDBArchiverStore_tables = new WeakMap(), _LMDBArchiverStore_logsMaxPageSize = new WeakMap(), _LMDBArchiverStore_log = new WeakMap(), _LMDBArchiverStore_instances = new WeakSet(), _LMDBArchiverStore_filterLogsOfTx = function _LMDBArchiverStore_filterLogsOfTx(filter) {
423
+ if (!filter.txHash) {
424
+ throw new Error('Missing txHash');
425
+ }
426
+ const [blockNumber, txIndex] = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").txIndex.get(filter.txHash.buffer) ?? [];
427
+ if (typeof blockNumber !== 'number' || typeof txIndex !== 'number') {
428
+ return { logs: [], maxLogsHit: false };
429
+ }
430
+ const block = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_getBlock).call(this, blockNumber, true);
431
+ if (!block || !block.newUnencryptedLogs) {
432
+ return { logs: [], maxLogsHit: false };
433
+ }
434
+ const txLogs = block.newUnencryptedLogs.txLogs[txIndex].unrollLogs().map(log => UnencryptedL2Log.fromBuffer(log));
435
+ const logs = [];
436
+ const maxLogsHit = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_accumulateLogs).call(this, logs, blockNumber, txIndex, txLogs, filter);
437
+ return { logs, maxLogsHit };
438
+ }, _LMDBArchiverStore_filterLogsBetweenBlocks = function _LMDBArchiverStore_filterLogsBetweenBlocks(filter) {
439
+ const start = filter.afterLog?.blockNumber ?? Math.max(filter.fromBlock ?? INITIAL_L2_BLOCK_NUM, INITIAL_L2_BLOCK_NUM);
440
+ const end = filter.toBlock;
441
+ if (typeof end === 'number' && end < start) {
442
+ return {
443
+ logs: [],
444
+ maxLogsHit: true,
445
+ };
446
+ }
447
+ const logs = [];
448
+ const blockNumbers = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.getKeys({ start, end, snapshot: false });
449
+ let maxLogsHit = false;
450
+ loopOverBlocks: for (const blockNumber of blockNumbers) {
451
+ const block = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_getBlock).call(this, blockNumber, true);
452
+ if (!block || !block.newUnencryptedLogs) {
453
+ continue;
454
+ }
455
+ const unencryptedLogsInBlock = block.newUnencryptedLogs;
456
+ for (let txIndex = filter.afterLog?.txIndex ?? 0; txIndex < unencryptedLogsInBlock.txLogs.length; txIndex++) {
457
+ const txLogs = unencryptedLogsInBlock.txLogs[txIndex].unrollLogs().map(log => UnencryptedL2Log.fromBuffer(log));
458
+ maxLogsHit = __classPrivateFieldGet(this, _LMDBArchiverStore_instances, "m", _LMDBArchiverStore_accumulateLogs).call(this, logs, blockNumber, txIndex, txLogs, filter);
459
+ if (maxLogsHit) {
460
+ break loopOverBlocks;
461
+ }
462
+ }
463
+ }
464
+ return { logs, maxLogsHit };
465
+ }, _LMDBArchiverStore_accumulateLogs = function _LMDBArchiverStore_accumulateLogs(results, blockNumber, txIndex, txLogs, filter) {
466
+ let maxLogsHit = false;
467
+ let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
468
+ for (; logIndex < txLogs.length; logIndex++) {
469
+ const log = txLogs[logIndex];
470
+ if (filter.contractAddress && !log.contractAddress.equals(filter.contractAddress)) {
471
+ continue;
472
+ }
473
+ if (filter.selector && !log.selector.equals(filter.selector)) {
474
+ continue;
475
+ }
476
+ results.push(new ExtendedUnencryptedL2Log(new LogId(blockNumber, txIndex, logIndex), log));
477
+ if (results.length >= __classPrivateFieldGet(this, _LMDBArchiverStore_logsMaxPageSize, "f")) {
478
+ maxLogsHit = true;
479
+ break;
480
+ }
481
+ }
482
+ return maxLogsHit;
483
+ }, _LMDBArchiverStore_getBlock = function _LMDBArchiverStore_getBlock(blockNumber, withLogs = false) {
484
+ const blockCtx = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").blocks.get(blockNumber);
485
+ if (!blockCtx || !blockCtx.block) {
486
+ return undefined;
487
+ }
488
+ const block = L2Block.fromBuffer(asBuffer(blockCtx.block));
489
+ if (withLogs) {
490
+ if (blockCtx.encryptedLogs) {
491
+ block.attachLogs(L2BlockL2Logs.fromBuffer(asBuffer(blockCtx.encryptedLogs)), LogType.ENCRYPTED);
492
+ }
493
+ if (blockCtx.unencryptedLogs) {
494
+ block.attachLogs(L2BlockL2Logs.fromBuffer(asBuffer(blockCtx.unencryptedLogs)), LogType.UNENCRYPTED);
495
+ }
496
+ }
497
+ return block;
498
+ }, _LMDBArchiverStore_computeBlockRange = function _LMDBArchiverStore_computeBlockRange(start, limit) {
499
+ if (limit < 1) {
500
+ throw new Error(`Invalid limit: ${limit}`);
501
+ }
502
+ if (start < INITIAL_L2_BLOCK_NUM) {
503
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Clamping start block ${start} to ${INITIAL_L2_BLOCK_NUM}`);
504
+ start = INITIAL_L2_BLOCK_NUM;
505
+ }
506
+ const end = start + limit;
507
+ return { start, end };
508
+ }, _LMDBArchiverStore_getL1ToL2Message = function _LMDBArchiverStore_getL1ToL2Message(entryKey) {
509
+ const value = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.get(entryKey);
510
+ if (!value) {
511
+ throw new Error('Unknown message: ' + entryKey.toString());
512
+ }
513
+ return L1ToL2Message.fromBuffer(value.message);
514
+ }, _LMDBArchiverStore_updateMessageCountInTx = function _LMDBArchiverStore_updateMessageCountInTx(messageKey, message, deltaPendingCount, deltaConfirmedCount) {
515
+ const entry = __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.getEntry(messageKey);
516
+ if (!entry) {
517
+ return;
518
+ }
519
+ const { value } = entry;
520
+ value.pendingCount = Math.max(0, value.pendingCount + deltaPendingCount);
521
+ value.confirmedCount = Math.max(0, value.confirmedCount + deltaConfirmedCount);
522
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Updating count of ${messageKey.toString('hex')} to ${value.pendingCount} pending and ${value.confirmedCount} confirmed}`);
523
+ if (value.pendingCount === 0) {
524
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Removing message ${messageKey.toString('hex')} from pending messages group with fee ${message.fee}`);
525
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").pendingMessagesByFee.remove(message.fee, messageKey);
526
+ }
527
+ else if (value.pendingCount > 0) {
528
+ __classPrivateFieldGet(this, _LMDBArchiverStore_log, "f").call(this, `Adding message ${messageKey.toString('hex')} to pending message group with fee ${message.fee}`);
529
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").pendingMessagesByFee.put(message.fee, messageKey);
530
+ }
531
+ if (value.pendingCount === 0 && value.confirmedCount === 0) {
532
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.remove(messageKey);
533
+ }
534
+ else {
535
+ void __classPrivateFieldGet(this, _LMDBArchiverStore_tables, "f").l1ToL2Messages.put(messageKey, value);
536
+ }
537
+ };
538
+ /**
539
+ * Creates a Buffer viewing the same memory location as the passed array.
540
+ * @param arr - A Uint8Array
541
+ */
542
+ function asBuffer(arr) {
543
+ return Buffer.isBuffer(arr) ? arr : Buffer.from(arr.buffer, arr.byteOffset, arr.length / arr.BYTES_PER_ELEMENT);
544
+ }
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG1kYl9hcmNoaXZlcl9zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9sbWRiX2FyY2hpdmVyX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUdMLG9CQUFvQixFQUNwQix3QkFBd0IsRUFFeEIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixPQUFPLEVBQ1AsYUFBYSxFQUdiLEtBQUssRUFDTCxPQUFPLEVBR1AsZ0JBQWdCLEdBQ2pCLE1BQU0sY0FBYyxDQUFDO0FBZXRCLFNBQVMscUJBQXFCLENBQzVCLGFBQXFCLEVBQ3JCLEdBQXNDLEVBQ3RDLFlBQW9CO0lBRXBCLE9BQU8sR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7QUFDbkYsQ0FBQztBQVdELG1CQUFtQjtBQUVuQjs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFvQjVCLFlBQVksRUFBZ0IsRUFBRSxrQkFBMEIsSUFBSTs7UUFuQjVELDRDQWFFO1FBRUYscURBQXlCO1FBRXpCLGlDQUFPLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLEVBQUM7UUFHOUMsdUJBQUEsSUFBSSw2QkFBVztZQUNiLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDMUIsV0FBVyxFQUFFLFFBQVE7Z0JBQ3JCLFFBQVEsRUFBRSxTQUFTO2FBQ3BCLENBQUM7WUFDRixPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JB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
@@ -10,8 +10,10 @@ export declare class L1ToL2MessageStore {
10
10
  * messages (and the number of times the message has been seen).
11
11
  */
12
12
  protected store: Map<bigint, L1ToL2MessageAndCount>;
13
+ private messagesByBlock;
13
14
  constructor();
14
- addMessage(messageKey: Fr, msg: L1ToL2Message): void;
15
+ addMessage(messageKey: Fr, message: L1ToL2Message, l1BlocKNumber: bigint, messageIndex: number): void;
16
+ addMessageUnsafe(messageKey: Fr, message: L1ToL2Message): void;
15
17
  getMessage(messageKey: Fr): L1ToL2Message | undefined;
16
18
  getMessageAndCount(messageKey: Fr): L1ToL2MessageAndCount | undefined;
17
19
  }
@@ -20,8 +22,10 @@ export declare class L1ToL2MessageStore {
20
22
  * for removing messages or fetching multiple messages.
21
23
  */
22
24
  export declare class PendingL1ToL2MessageStore extends L1ToL2MessageStore {
25
+ private cancelledMessagesByBlock;
23
26
  getMessageKeys(limit: number): Fr[];
24
- removeMessage(messageKey: Fr): void;
27
+ removeMessage(messageKey: Fr, l1BlockNumber: bigint, messageIndex: number): void;
28
+ removeMessageUnsafe(messageKey: Fr): void;
25
29
  }
26
30
  /**
27
31
  * Useful to keep track of the number of times a message has been seen.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_to_l2_message_store.d.ts","sourceRoot":"","sources":["../../../src/archiver/memory_archiver_store/l1_to_l2_message_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAa;IAChE,OAAO,CAAC,eAAe,CAAqB;;IAI5C,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAS9F,gBAAgB,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa;IAUvD,UAAU,CAAC,UAAU,EAAE,EAAE,GAAG,aAAa,GAAG,SAAS;IAIrD,kBAAkB,CAAC,UAAU,EAAE,EAAE,GAAG,qBAAqB,GAAG,SAAS;CAGtE;AAED;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,kBAAkB;IAC/D,OAAO,CAAC,wBAAwB,CAAqB;IACrD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE;IAmBnC,aAAa,CAAC,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAazE,mBAAmB,CAAC,UAAU,EAAE,EAAE;CAYnC;AAED;;GAEG;AACH,KAAK,qBAAqB,GAAG;IAC3B;;OAEG;IACH,OAAO,EAAE,aAAa,CAAC;IACvB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}