@aztec/archiver 0.7.2 → 0.7.4

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 (36) hide show
  1. package/.tsbuildinfo +1 -0
  2. package/dest/archiver/archiver.d.ts +147 -0
  3. package/dest/archiver/archiver.d.ts.map +1 -0
  4. package/dest/archiver/archiver.js +269 -0
  5. package/dest/archiver/archiver.test.d.ts +2 -0
  6. package/dest/archiver/archiver.test.d.ts.map +1 -0
  7. package/dest/archiver/archiver.test.js +184 -0
  8. package/dest/archiver/archiver_store.d.ts +267 -0
  9. package/dest/archiver/archiver_store.d.ts.map +1 -0
  10. package/dest/archiver/archiver_store.js +256 -0
  11. package/dest/archiver/archiver_store.test.d.ts +2 -0
  12. package/dest/archiver/archiver_store.test.d.ts.map +1 -0
  13. package/dest/archiver/archiver_store.test.js +61 -0
  14. package/dest/archiver/config.d.ts +39 -0
  15. package/dest/archiver/config.d.ts.map +1 -0
  16. package/dest/archiver/config.js +22 -0
  17. package/dest/archiver/data_retrieval.d.ts +64 -0
  18. package/dest/archiver/data_retrieval.d.ts.map +1 -0
  19. package/dest/archiver/data_retrieval.js +102 -0
  20. package/dest/archiver/eth_log_handlers.d.ts +77 -0
  21. package/dest/archiver/eth_log_handlers.d.ts.map +1 -0
  22. package/dest/archiver/eth_log_handlers.js +180 -0
  23. package/dest/archiver/index.d.ts +3 -0
  24. package/dest/archiver/index.d.ts.map +1 -0
  25. package/dest/archiver/index.js +3 -0
  26. package/dest/archiver/l1_to_l2_message_store.d.ts +40 -0
  27. package/dest/archiver/l1_to_l2_message_store.d.ts.map +1 -0
  28. package/dest/archiver/l1_to_l2_message_store.js +71 -0
  29. package/dest/archiver/l1_to_l2_message_store.test.d.ts +2 -0
  30. package/dest/archiver/l1_to_l2_message_store.test.d.ts.map +1 -0
  31. package/dest/archiver/l1_to_l2_message_store.test.js +77 -0
  32. package/dest/index.d.ts +2 -0
  33. package/dest/index.d.ts.map +1 -0
  34. package/dest/index.js +37 -0
  35. package/package.json +6 -6
  36. package/Dockerfile +0 -15
@@ -0,0 +1,267 @@
1
+ import { Fr } from '@aztec/circuits.js';
2
+ import { AztecAddress } from '@aztec/foundation/aztec-address';
3
+ import { ContractData, ExtendedContractData, L1ToL2Message, L2Block, L2BlockL2Logs, L2Tx, LogType, TxHash } from '@aztec/types';
4
+ /**
5
+ * Interface describing a data store to be used by the archiver to store all its relevant data
6
+ * (blocks, encrypted logs, aztec contract data extended contract data).
7
+ */
8
+ export interface ArchiverDataStore {
9
+ /**
10
+ * Append new blocks to the store's list.
11
+ * @param blocks - The L2 blocks to be added to the store.
12
+ * @returns True if the operation is successful.
13
+ */
14
+ addL2Blocks(blocks: L2Block[]): Promise<boolean>;
15
+ /**
16
+ * Gets up to `limit` amount of L2 blocks starting from `from`.
17
+ * @param from - Number of the first block to return (inclusive).
18
+ * @param limit - The number of blocks to return.
19
+ * @returns The requested L2 blocks.
20
+ */
21
+ getL2Blocks(from: number, limit: number): Promise<L2Block[]>;
22
+ /**
23
+ * Gets an l2 tx.
24
+ * @param txHash - The txHash of the l2 tx.
25
+ * @returns The requested L2 tx.
26
+ */
27
+ getL2Tx(txHash: TxHash): Promise<L2Tx | undefined>;
28
+ /**
29
+ * Append new logs to the store's list.
30
+ * @param data - The logs to be added to the store.
31
+ * @param logType - The type of the logs to be added to the store.
32
+ * @returns True if the operation is successful.
33
+ */
34
+ addLogs(data: L2BlockL2Logs[], logType: LogType): Promise<boolean>;
35
+ /**
36
+ * Append new pending L1 to L2 messages to the store.
37
+ * @param messages - The L1 to L2 messages to be added to the store.
38
+ * @returns True if the operation is successful.
39
+ */
40
+ addPendingL1ToL2Messages(messages: L1ToL2Message[]): Promise<boolean>;
41
+ /**
42
+ * Remove pending L1 to L2 messages from the store (if they were cancelled).
43
+ * @param messageKeys - The message keys to be removed from the store.
44
+ * @returns True if the operation is successful.
45
+ */
46
+ cancelPendingL1ToL2Messages(messageKeys: Fr[]): Promise<boolean>;
47
+ /**
48
+ * Messages that have been published in an L2 block are confirmed.
49
+ * Add them to the confirmed store, also remove them from the pending store.
50
+ * @param messageKeys - The message keys to be removed from the store.
51
+ * @returns True if the operation is successful.
52
+ */
53
+ confirmL1ToL2Messages(messageKeys: Fr[]): Promise<boolean>;
54
+ /**
55
+ * Gets up to `limit` amount of pending L1 to L2 messages, sorted by fee
56
+ * @param limit - The number of messages to return (by default NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).
57
+ * @returns The requested L1 to L2 message keys.
58
+ */
59
+ getPendingL1ToL2MessageKeys(limit: number): Promise<Fr[]>;
60
+ /**
61
+ * Gets the confirmed L1 to L2 message corresponding to the given message key.
62
+ * @param messageKey - The message key to look up.
63
+ * @returns The requested L1 to L2 message or throws if not found.
64
+ */
65
+ getConfirmedL1ToL2Message(messageKey: Fr): Promise<L1ToL2Message>;
66
+ /**
67
+ * Gets up to `limit` amount of logs starting from `from`.
68
+ * @param from - Number of the L2 block to which corresponds the first logs to be returned.
69
+ * @param limit - The number of logs to return.
70
+ * @param logType - Specifies whether to return encrypted or unencrypted logs.
71
+ * @returns The requested logs.
72
+ */
73
+ getLogs(from: number, limit: number, logType: LogType): Promise<L2BlockL2Logs[]>;
74
+ /**
75
+ * Add new extended contract data from an L2 block to the store's list.
76
+ * @param data - List of contracts' data to be added.
77
+ * @param blockNum - Number of the L2 block the contract data was deployed in.
78
+ * @returns True if the operation is successful.
79
+ */
80
+ addExtendedContractData(data: ExtendedContractData[], blockNum: number): Promise<boolean>;
81
+ /**
82
+ * Get the extended contract data for this contract.
83
+ * @param contractAddress - The contract data address.
84
+ * @returns The extended contract data or undefined if not found.
85
+ */
86
+ getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined>;
87
+ /**
88
+ * Lookup all extended contract data in an L2 block.
89
+ * @param blockNum - The block number to get all contract data from.
90
+ * @returns All extended contract data in the block (if found).
91
+ */
92
+ getExtendedContractDataInBlock(blockNum: number): Promise<ExtendedContractData[]>;
93
+ /**
94
+ * Get basic info for an L2 contract.
95
+ * Contains contract address & the ethereum portal address.
96
+ * @param contractAddress - The contract data address.
97
+ * @returns ContractData with the portal address (if we didn't throw an error).
98
+ */
99
+ getContractData(contractAddress: AztecAddress): Promise<ContractData | undefined>;
100
+ /**
101
+ * Get basic info for an all L2 contracts deployed in a block.
102
+ * Contains contract address & the ethereum portal address.
103
+ * @param l2BlockNum - Number of the L2 block where contracts were deployed.
104
+ * @returns ContractData with the portal address (if we didn't throw an error).
105
+ */
106
+ getContractDataInBlock(l2BlockNum: number): Promise<ContractData[] | undefined>;
107
+ /**
108
+ * Gets the number of the latest L2 block processed.
109
+ * @returns The number of the latest L2 block processed.
110
+ */
111
+ getBlockNumber(): Promise<number>;
112
+ /**
113
+ * Gets the length of L2 blocks in store.
114
+ * @returns The length of L2 Blocks stored.
115
+ */
116
+ getBlocksLength(): number;
117
+ }
118
+ /**
119
+ * Simple, in-memory implementation of an archiver data store.
120
+ */
121
+ export declare class MemoryArchiverStore implements ArchiverDataStore {
122
+ /**
123
+ * An array containing all the L2 blocks that have been fetched so far.
124
+ */
125
+ private l2Blocks;
126
+ /**
127
+ * An array containing all the L2 Txs in the L2 blocks that have been fetched so far.
128
+ */
129
+ private l2Txs;
130
+ /**
131
+ * An array containing all the encrypted logs that have been fetched so far.
132
+ * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
133
+ */
134
+ private encryptedLogs;
135
+ /**
136
+ * An array containing all the unencrypted logs that have been fetched so far.
137
+ * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
138
+ */
139
+ private unencryptedLogs;
140
+ /**
141
+ * A sparse array containing all the extended contract data that have been fetched so far.
142
+ */
143
+ private extendedContractDataByBlock;
144
+ /**
145
+ * A mapping of contract address to extended contract data.
146
+ */
147
+ private extendedContractData;
148
+ /**
149
+ * Contains all the confirmed L1 to L2 messages (i.e. messages that were consumed in an L2 block)
150
+ * It is a map of entryKey to the corresponding L1 to L2 message and the number of times it has appeared
151
+ */
152
+ private confirmedL1ToL2Messages;
153
+ /**
154
+ * Contains all the pending L1 to L2 messages (accounts for duplication of messages)
155
+ */
156
+ private pendingL1ToL2Messages;
157
+ constructor();
158
+ /**
159
+ * Append new blocks to the store's list.
160
+ * @param blocks - The L2 blocks to be added to the store.
161
+ * @returns True if the operation is successful (always in this implementation).
162
+ */
163
+ addL2Blocks(blocks: L2Block[]): Promise<boolean>;
164
+ /**
165
+ * Append new logs to the store's list.
166
+ * @param data - The logs to be added to the store.
167
+ * @param logType - The type of the logs to be added to the store.
168
+ * @returns True if the operation is successful.
169
+ */
170
+ addLogs(data: L2BlockL2Logs[], logType: LogType): Promise<boolean>;
171
+ /**
172
+ * Append new pending L1 to L2 messages to the store.
173
+ * @param messages - The L1 to L2 messages to be added to the store.
174
+ * @returns True if the operation is successful (always in this implementation).
175
+ */
176
+ addPendingL1ToL2Messages(messages: L1ToL2Message[]): Promise<boolean>;
177
+ /**
178
+ * Remove pending L1 to L2 messages from the store (if they were cancelled).
179
+ * @param messageKeys - The message keys to be removed from the store.
180
+ * @returns True if the operation is successful (always in this implementation).
181
+ */
182
+ cancelPendingL1ToL2Messages(messageKeys: Fr[]): Promise<boolean>;
183
+ /**
184
+ * Messages that have been published in an L2 block are confirmed.
185
+ * Add them to the confirmed store, also remove them from the pending store.
186
+ * @param messageKeys - The message keys to be removed from the store.
187
+ * @returns True if the operation is successful (always in this implementation).
188
+ */
189
+ confirmL1ToL2Messages(messageKeys: Fr[]): Promise<boolean>;
190
+ /**
191
+ * Store new extended contract data from an L2 block to the store's list.
192
+ * @param data - List of contracts' data to be added.
193
+ * @param blockNum - Number of the L2 block the contract data was deployed in.
194
+ * @returns True if the operation is successful (always in this implementation).
195
+ */
196
+ addExtendedContractData(data: ExtendedContractData[], blockNum: number): Promise<boolean>;
197
+ /**
198
+ * Gets up to `limit` amount of L2 blocks starting from `from`.
199
+ * @param from - Number of the first block to return (inclusive).
200
+ * @param limit - The number of blocks to return.
201
+ * @returns The requested L2 blocks.
202
+ */
203
+ getL2Blocks(from: number, limit: number): Promise<L2Block[]>;
204
+ /**
205
+ * Gets an l2 tx.
206
+ * @param txHash - The txHash of the l2 tx.
207
+ * @returns The requested L2 tx.
208
+ */
209
+ getL2Tx(txHash: TxHash): Promise<L2Tx | undefined>;
210
+ /**
211
+ * Gets up to `limit` amount of pending L1 to L2 messages, sorted by fee
212
+ * @param limit - The number of messages to return (by default NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).
213
+ * @returns The requested L1 to L2 message keys.
214
+ */
215
+ getPendingL1ToL2MessageKeys(limit?: number): Promise<Fr[]>;
216
+ /**
217
+ * Gets the confirmed L1 to L2 message corresponding to the given message key.
218
+ * @param messageKey - The message key to look up.
219
+ * @returns The requested L1 to L2 message or throws if not found.
220
+ */
221
+ getConfirmedL1ToL2Message(messageKey: Fr): Promise<L1ToL2Message>;
222
+ /**
223
+ * Gets up to `limit` amount of logs starting from `from`.
224
+ * @param from - Number of the L2 block to which corresponds the first logs to be returned.
225
+ * @param limit - The number of logs to return.
226
+ * @param logType - Specifies whether to return encrypted or unencrypted logs.
227
+ * @returns The requested logs.
228
+ */
229
+ getLogs(from: number, limit: number, logType: LogType): Promise<L2BlockL2Logs[]>;
230
+ /**
231
+ * Get the extended contract data for this contract.
232
+ * @param contractAddress - The contract data address.
233
+ * @returns The extended contract data or undefined if not found.
234
+ */
235
+ getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined>;
236
+ /**
237
+ * Lookup all contract data in an L2 block.
238
+ * @param blockNum - The block number to get all contract data from.
239
+ * @returns All extended contract data in the block (if found).
240
+ */
241
+ getExtendedContractDataInBlock(blockNum: number): Promise<ExtendedContractData[]>;
242
+ /**
243
+ * Get basic info for an L2 contract.
244
+ * Contains contract address & the ethereum portal address.
245
+ * @param contractAddress - The contract data address.
246
+ * @returns ContractData with the portal address (if we didn't throw an error).
247
+ */
248
+ getContractData(contractAddress: AztecAddress): Promise<ContractData | undefined>;
249
+ /**
250
+ * Get basic info for an all L2 contracts deployed in a block.
251
+ * Contains contract address & the ethereum portal address.
252
+ * @param l2BlockNum - Number of the L2 block where contracts were deployed.
253
+ * @returns ContractData with the portal address (if we didn't throw an error).
254
+ */
255
+ getContractDataInBlock(l2BlockNum: number): Promise<ContractData[] | undefined>;
256
+ /**
257
+ * Gets the number of the latest L2 block processed.
258
+ * @returns The number of the latest L2 block processed.
259
+ */
260
+ getBlockNumber(): Promise<number>;
261
+ /**
262
+ * Gets the length of L2 blocks in store.
263
+ * @returns The length of L2 Blocks array.
264
+ */
265
+ getBlocksLength(): number;
266
+ }
267
+ //# sourceMappingURL=archiver_store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archiver_store.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver_store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js';
2
+ import { INITIAL_L2_BLOCK_NUM, LogType, } from '@aztec/types';
3
+ import { L1ToL2MessageStore, PendingL1ToL2MessageStore } from './l1_to_l2_message_store.js';
4
+ /**
5
+ * Simple, in-memory implementation of an archiver data store.
6
+ */
7
+ export class MemoryArchiverStore {
8
+ constructor() {
9
+ /**
10
+ * An array containing all the L2 blocks that have been fetched so far.
11
+ */
12
+ this.l2Blocks = [];
13
+ /**
14
+ * An array containing all the L2 Txs in the L2 blocks that have been fetched so far.
15
+ */
16
+ this.l2Txs = [];
17
+ /**
18
+ * An array containing all the encrypted logs that have been fetched so far.
19
+ * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
20
+ */
21
+ this.encryptedLogs = [];
22
+ /**
23
+ * An array containing all the unencrypted logs that have been fetched so far.
24
+ * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
25
+ */
26
+ this.unencryptedLogs = [];
27
+ /**
28
+ * A sparse array containing all the extended contract data that have been fetched so far.
29
+ */
30
+ this.extendedContractDataByBlock = [];
31
+ /**
32
+ * A mapping of contract address to extended contract data.
33
+ */
34
+ this.extendedContractData = new Map();
35
+ /**
36
+ * Contains all the confirmed L1 to L2 messages (i.e. messages that were consumed in an L2 block)
37
+ * It is a map of entryKey to the corresponding L1 to L2 message and the number of times it has appeared
38
+ */
39
+ this.confirmedL1ToL2Messages = new L1ToL2MessageStore();
40
+ /**
41
+ * Contains all the pending L1 to L2 messages (accounts for duplication of messages)
42
+ */
43
+ this.pendingL1ToL2Messages = new PendingL1ToL2MessageStore();
44
+ }
45
+ /**
46
+ * Append new blocks to the store's list.
47
+ * @param blocks - The L2 blocks to be added to the store.
48
+ * @returns True if the operation is successful (always in this implementation).
49
+ */
50
+ addL2Blocks(blocks) {
51
+ this.l2Blocks.push(...blocks);
52
+ this.l2Txs.push(...blocks.flatMap(b => b.getTxs()));
53
+ return Promise.resolve(true);
54
+ }
55
+ /**
56
+ * Append new logs to the store's list.
57
+ * @param data - The logs to be added to the store.
58
+ * @param logType - The type of the logs to be added to the store.
59
+ * @returns True if the operation is successful.
60
+ */
61
+ addLogs(data, logType) {
62
+ logType === LogType.ENCRYPTED ? this.encryptedLogs.push(...data) : this.unencryptedLogs.push(...data);
63
+ return Promise.resolve(true);
64
+ }
65
+ /**
66
+ * Append new pending L1 to L2 messages to the store.
67
+ * @param messages - The L1 to L2 messages to be added to the store.
68
+ * @returns True if the operation is successful (always in this implementation).
69
+ */
70
+ addPendingL1ToL2Messages(messages) {
71
+ for (const msg of messages) {
72
+ this.pendingL1ToL2Messages.addMessage(msg.entryKey, msg);
73
+ }
74
+ return Promise.resolve(true);
75
+ }
76
+ /**
77
+ * Remove pending L1 to L2 messages from the store (if they were cancelled).
78
+ * @param messageKeys - The message keys to be removed from the store.
79
+ * @returns True if the operation is successful (always in this implementation).
80
+ */
81
+ cancelPendingL1ToL2Messages(messageKeys) {
82
+ messageKeys.forEach(messageKey => {
83
+ this.pendingL1ToL2Messages.removeMessage(messageKey);
84
+ });
85
+ return Promise.resolve(true);
86
+ }
87
+ /**
88
+ * Messages that have been published in an L2 block are confirmed.
89
+ * Add them to the confirmed store, also remove them from the pending store.
90
+ * @param messageKeys - The message keys to be removed from the store.
91
+ * @returns True if the operation is successful (always in this implementation).
92
+ */
93
+ confirmL1ToL2Messages(messageKeys) {
94
+ messageKeys.forEach(messageKey => {
95
+ this.confirmedL1ToL2Messages.addMessage(messageKey, this.pendingL1ToL2Messages.getMessage(messageKey));
96
+ this.pendingL1ToL2Messages.removeMessage(messageKey);
97
+ });
98
+ return Promise.resolve(true);
99
+ }
100
+ /**
101
+ * Store new extended contract data from an L2 block to the store's list.
102
+ * @param data - List of contracts' data to be added.
103
+ * @param blockNum - Number of the L2 block the contract data was deployed in.
104
+ * @returns True if the operation is successful (always in this implementation).
105
+ */
106
+ addExtendedContractData(data, blockNum) {
107
+ // Add to the contracts mapping
108
+ for (const contractData of data) {
109
+ const key = contractData.contractData.contractAddress.toString();
110
+ this.extendedContractData.set(key, contractData);
111
+ }
112
+ // Add the index per block
113
+ if (this.extendedContractDataByBlock[blockNum]?.length) {
114
+ this.extendedContractDataByBlock[blockNum]?.push(...data);
115
+ }
116
+ else {
117
+ this.extendedContractDataByBlock[blockNum] = [...data];
118
+ }
119
+ return Promise.resolve(true);
120
+ }
121
+ /**
122
+ * Gets up to `limit` amount of L2 blocks starting from `from`.
123
+ * @param from - Number of the first block to return (inclusive).
124
+ * @param limit - The number of blocks to return.
125
+ * @returns The requested L2 blocks.
126
+ */
127
+ getL2Blocks(from, limit) {
128
+ // Return an empty array if we are outside of range
129
+ if (limit < 1) {
130
+ throw new Error(`Invalid block range from: ${from}, limit: ${limit}`);
131
+ }
132
+ if (from < INITIAL_L2_BLOCK_NUM || from > this.l2Blocks.length) {
133
+ return Promise.resolve([]);
134
+ }
135
+ const startIndex = from - INITIAL_L2_BLOCK_NUM;
136
+ const endIndex = startIndex + limit;
137
+ return Promise.resolve(this.l2Blocks.slice(startIndex, endIndex));
138
+ }
139
+ /**
140
+ * Gets an l2 tx.
141
+ * @param txHash - The txHash of the l2 tx.
142
+ * @returns The requested L2 tx.
143
+ */
144
+ getL2Tx(txHash) {
145
+ const l2Tx = this.l2Txs.find(tx => tx.txHash.equals(txHash));
146
+ return Promise.resolve(l2Tx);
147
+ }
148
+ /**
149
+ * Gets up to `limit` amount of pending L1 to L2 messages, sorted by fee
150
+ * @param limit - The number of messages to return (by default NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).
151
+ * @returns The requested L1 to L2 message keys.
152
+ */
153
+ getPendingL1ToL2MessageKeys(limit = NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP) {
154
+ return Promise.resolve(this.pendingL1ToL2Messages.getMessageKeys(limit));
155
+ }
156
+ /**
157
+ * Gets the confirmed L1 to L2 message corresponding to the given message key.
158
+ * @param messageKey - The message key to look up.
159
+ * @returns The requested L1 to L2 message or throws if not found.
160
+ */
161
+ getConfirmedL1ToL2Message(messageKey) {
162
+ const message = this.confirmedL1ToL2Messages.getMessage(messageKey);
163
+ if (!message) {
164
+ throw new Error(`L1 to L2 Message with key ${messageKey.toString()} not found in the confirmed messages store`);
165
+ }
166
+ return Promise.resolve(message);
167
+ }
168
+ /**
169
+ * Gets up to `limit` amount of logs starting from `from`.
170
+ * @param from - Number of the L2 block to which corresponds the first logs to be returned.
171
+ * @param limit - The number of logs to return.
172
+ * @param logType - Specifies whether to return encrypted or unencrypted logs.
173
+ * @returns The requested logs.
174
+ */
175
+ getLogs(from, limit, logType) {
176
+ if (from < INITIAL_L2_BLOCK_NUM || limit < 1) {
177
+ throw new Error(`Invalid block range from: ${from}, limit: ${limit}`);
178
+ }
179
+ const logs = logType === LogType.ENCRYPTED ? this.encryptedLogs : this.unencryptedLogs;
180
+ if (from > logs.length) {
181
+ return Promise.resolve([]);
182
+ }
183
+ const startIndex = from - INITIAL_L2_BLOCK_NUM;
184
+ const endIndex = startIndex + limit;
185
+ return Promise.resolve(logs.slice(startIndex, endIndex));
186
+ }
187
+ /**
188
+ * Get the extended contract data for this contract.
189
+ * @param contractAddress - The contract data address.
190
+ * @returns The extended contract data or undefined if not found.
191
+ */
192
+ getExtendedContractData(contractAddress) {
193
+ const result = this.extendedContractData.get(contractAddress.toString());
194
+ return Promise.resolve(result);
195
+ }
196
+ /**
197
+ * Lookup all contract data in an L2 block.
198
+ * @param blockNum - The block number to get all contract data from.
199
+ * @returns All extended contract data in the block (if found).
200
+ */
201
+ getExtendedContractDataInBlock(blockNum) {
202
+ if (blockNum > this.l2Blocks.length) {
203
+ return Promise.resolve([]);
204
+ }
205
+ return Promise.resolve(this.extendedContractDataByBlock[blockNum] || []);
206
+ }
207
+ /**
208
+ * Get basic info for an L2 contract.
209
+ * Contains contract address & the ethereum portal address.
210
+ * @param contractAddress - The contract data address.
211
+ * @returns ContractData with the portal address (if we didn't throw an error).
212
+ */
213
+ getContractData(contractAddress) {
214
+ if (contractAddress.isZero()) {
215
+ return Promise.resolve(undefined);
216
+ }
217
+ for (const block of this.l2Blocks) {
218
+ for (const contractData of block.newContractData) {
219
+ if (contractData.contractAddress.equals(contractAddress)) {
220
+ return Promise.resolve(contractData);
221
+ }
222
+ }
223
+ }
224
+ return Promise.resolve(undefined);
225
+ }
226
+ /**
227
+ * Get basic info for an all L2 contracts deployed in a block.
228
+ * Contains contract address & the ethereum portal address.
229
+ * @param l2BlockNum - Number of the L2 block where contracts were deployed.
230
+ * @returns ContractData with the portal address (if we didn't throw an error).
231
+ */
232
+ getContractDataInBlock(l2BlockNum) {
233
+ if (l2BlockNum > this.l2Blocks.length) {
234
+ return Promise.resolve([]);
235
+ }
236
+ const block = this.l2Blocks[l2BlockNum];
237
+ return Promise.resolve(block.newContractData);
238
+ }
239
+ /**
240
+ * Gets the number of the latest L2 block processed.
241
+ * @returns The number of the latest L2 block processed.
242
+ */
243
+ getBlockNumber() {
244
+ if (this.l2Blocks.length === 0)
245
+ 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;
254
+ }
255
+ }
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFNLG1DQUFtQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0UsT0FBTyxFQUdMLG9CQUFvQixFQUtwQixPQUFPLEdBRVIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFxSTVGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQTRDOUI7UUEzQ0E7O1dBRUc7UUFDSyxhQUFRLEdBQWMsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ0ssVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUUzQjs7O1dBR0c7UUFDSyxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFFNUM7OztXQUdHO1FBQ0ssb0JBQWUsR0FBb0IsRUFBRSxDQUFDO1FBRTlDOztXQUVHO1FBQ0ssZ0NBQTJCLEdBQTJDLEVBQUUsQ0FBQztRQUVqRjs7V0FFRztRQUNLLHlCQUFvQixHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVFOzs7V0FHRztRQUNLLDRCQUF1QixHQUF1QixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFL0U7O1dBRUc7UUFDSywwQkFBcUIsR0FBOEIsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO0lBRTVFLENBQUM7SUFFaEI7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxNQUFpQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQs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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=archiver_store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archiver_store.test.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver_store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { INITIAL_L2_BLOCK_NUM, L2Block, L2BlockL2Logs, LogType } from '@aztec/types';
2
+ import { MemoryArchiverStore } from './archiver_store.js';
3
+ describe('Archiver Memory Store', () => {
4
+ let archiverStore;
5
+ beforeEach(() => {
6
+ archiverStore = new MemoryArchiverStore();
7
+ });
8
+ it('can store and retrieve blocks', async () => {
9
+ const blocks = Array(10)
10
+ .fill(0)
11
+ .map((_, index) => L2Block.random(index));
12
+ await archiverStore.addL2Blocks(blocks);
13
+ // Offset indices by INTIAL_L2_BLOCK_NUM to ensure we are correctly aligned
14
+ for (const [from, limit] of [
15
+ [0 + INITIAL_L2_BLOCK_NUM, 10],
16
+ [3 + INITIAL_L2_BLOCK_NUM, 3],
17
+ [1 + INITIAL_L2_BLOCK_NUM, 7],
18
+ [5 + INITIAL_L2_BLOCK_NUM, 8],
19
+ [10 + INITIAL_L2_BLOCK_NUM, 1],
20
+ [11 + INITIAL_L2_BLOCK_NUM, 1],
21
+ ]) {
22
+ const expected = blocks.slice(from - INITIAL_L2_BLOCK_NUM, from - INITIAL_L2_BLOCK_NUM + limit);
23
+ const actual = await archiverStore.getL2Blocks(from, limit);
24
+ expect(expected).toEqual(actual);
25
+ }
26
+ });
27
+ test.each([LogType.ENCRYPTED, LogType.UNENCRYPTED])('can store and retrieve logs', async (logType) => {
28
+ const logs = Array(10)
29
+ .fill(0)
30
+ .map(_ => L2BlockL2Logs.random(6, 3, 2));
31
+ await archiverStore.addLogs(logs, logType);
32
+ // Offset indices by INTIAL_L2_BLOCK_NUM to ensure we are correctly aligned
33
+ for (const [from, limit] of [
34
+ [0 + INITIAL_L2_BLOCK_NUM, 10],
35
+ [3 + INITIAL_L2_BLOCK_NUM, 3],
36
+ [1 + INITIAL_L2_BLOCK_NUM, 7],
37
+ [5 + INITIAL_L2_BLOCK_NUM, 8],
38
+ [10 + INITIAL_L2_BLOCK_NUM, 1],
39
+ [11 + INITIAL_L2_BLOCK_NUM, 1],
40
+ ]) {
41
+ const expected = logs.slice(from - INITIAL_L2_BLOCK_NUM, from - INITIAL_L2_BLOCK_NUM + limit);
42
+ const actual = await archiverStore.getLogs(from, limit, logType);
43
+ expect(expected).toEqual(actual);
44
+ }
45
+ });
46
+ it('throws if we try and request less than 1 block', async () => {
47
+ const blocks = Array(10)
48
+ .fill(0)
49
+ .map((_, index) => L2Block.random(index));
50
+ await archiverStore.addL2Blocks(blocks);
51
+ await expect(async () => await archiverStore.getL2Blocks(1, 0)).rejects.toThrow(`Invalid block range from: 1, limit: 0`);
52
+ });
53
+ test.each([LogType.ENCRYPTED, LogType.UNENCRYPTED])('throws if we try and request less than 1 log', async (logType) => {
54
+ const logs = Array(10)
55
+ .fill(0)
56
+ .map(_ => L2BlockL2Logs.random(6, 3, 2));
57
+ await archiverStore.addLogs(logs, logType);
58
+ await expect(async () => await archiverStore.getLogs(1, 0, logType)).rejects.toThrow(`Invalid block range from: 1, limit: 0`);
59
+ });
60
+ });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfc3RvcmUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9hcmNoaXZlcl9zdG9yZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRixPQUFPLEVBQXFCLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0UsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxJQUFJLGFBQWdDLENBQUM7SUFFckMsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLGFBQWEsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0JBQStCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQzthQUNyQixJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ1AsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QywyRUFBMkU7UUFDM0UsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQzFCLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztZQUM5QixDQUFDLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUMsQ0FBQztZQUM3QixDQUFDLEVBQUUsR0FBRyxv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
@@ -0,0 +1,39 @@
1
+ import { L1Addresses } from '@aztec/types';
2
+ /**
3
+ * There are 2 polling intervals used in this configuration. The first is the archiver polling interval, archiverPollingIntervalMS.
4
+ * This is the interval between successive calls to eth_blockNumber via viem.
5
+ * Results of calls to eth_blockNumber are cached by viem with this cache being updated periodically at the interval specified by viemPollingIntervalMS.
6
+ * As a result the maximum observed polling time for new blocks will be viemPollingIntervalMS + archiverPollingIntervalMS.
7
+ */
8
+ /**
9
+ * The archiver configuration.
10
+ */
11
+ export interface ArchiverConfig extends L1Addresses {
12
+ /**
13
+ * The url of the Ethereum RPC node.
14
+ */
15
+ rpcUrl: string;
16
+ /**
17
+ * The key for the ethereum node.
18
+ */
19
+ apiKey?: string;
20
+ /**
21
+ * The polling interval in ms for retrieving new L2 blocks and encrypted logs.
22
+ */
23
+ archiverPollingIntervalMS?: number;
24
+ /**
25
+ * The polling interval viem uses in ms
26
+ */
27
+ viemPollingIntervalMS?: number;
28
+ /**
29
+ * Eth block from which we start scanning for L2Blocks.
30
+ */
31
+ searchStartBlock: number;
32
+ }
33
+ /**
34
+ * Returns the archiver configuration from the environment variables.
35
+ * Note: If an environment variable is not set, the default value is used.
36
+ * @returns The archiver configuration.
37
+ */
38
+ export declare function getConfigEnvVars(): ArchiverConfig;
39
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/archiver/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD;;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;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAuBjD"}