@aztec/archiver 0.29.0 → 0.30.0

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 (42) hide show
  1. package/dest/archiver/archiver.d.ts +2 -2
  2. package/dest/archiver/archiver.d.ts.map +1 -1
  3. package/dest/archiver/archiver.js +25 -26
  4. package/dest/archiver/archiver_store.d.ts +7 -7
  5. package/dest/archiver/archiver_store.d.ts.map +1 -1
  6. package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
  7. package/dest/archiver/archiver_store_test_suite.js +42 -39
  8. package/dest/archiver/config.d.ts.map +1 -1
  9. package/dest/archiver/config.js +6 -2
  10. package/dest/archiver/data_retrieval.d.ts +5 -6
  11. package/dest/archiver/data_retrieval.d.ts.map +1 -1
  12. package/dest/archiver/data_retrieval.js +5 -5
  13. package/dest/archiver/eth_log_handlers.d.ts +2 -2
  14. package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
  15. package/dest/archiver/eth_log_handlers.js +3 -3
  16. package/dest/archiver/kv_archiver_store/block_store.d.ts +3 -2
  17. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
  18. package/dest/archiver/kv_archiver_store/block_store.js +10 -13
  19. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +7 -7
  20. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
  21. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +6 -7
  22. package/dest/archiver/kv_archiver_store/message_store.d.ts +5 -5
  23. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
  24. package/dest/archiver/kv_archiver_store/message_store.js +7 -11
  25. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +2 -2
  26. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -1
  27. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +3 -3
  28. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +9 -8
  29. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
  30. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +15 -16
  31. package/package.json +9 -9
  32. package/src/archiver/archiver.ts +41 -45
  33. package/src/archiver/archiver_store.ts +8 -7
  34. package/src/archiver/archiver_store_test_suite.ts +60 -42
  35. package/src/archiver/config.ts +6 -0
  36. package/src/archiver/data_retrieval.ts +9 -9
  37. package/src/archiver/eth_log_handlers.ts +4 -4
  38. package/src/archiver/kv_archiver_store/block_store.ts +11 -12
  39. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +8 -8
  40. package/src/archiver/kv_archiver_store/message_store.ts +9 -11
  41. package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +3 -3
  42. package/src/archiver/memory_archiver_store/memory_archiver_store.ts +17 -18
@@ -37,6 +37,7 @@ export class MemoryArchiverStore {
37
37
  this.l1ToL2Messages = new L1ToL2MessageStore();
38
38
  this.contractClasses = new Map();
39
39
  this.contractInstances = new Map();
40
+ this.lastL1BlockNewBlocks = 0n;
40
41
  this.lastL1BlockNewMessages = 0n;
41
42
  }
42
43
  getContractClass(id) {
@@ -62,12 +63,13 @@ export class MemoryArchiverStore {
62
63
  }
63
64
  /**
64
65
  * Append new blocks to the store's list.
65
- * @param blocks - The L2 blocks to be added to the store.
66
- * @returns True if the operation is successful (always in this implementation).
66
+ * @param blocks - The L2 blocks to be added to the store and the last processed L1 block.
67
+ * @returns True if the operation is successful.
67
68
  */
68
69
  addBlocks(blocks) {
69
- this.l2BlockContexts.push(...blocks.map(block => new L2BlockContext(block)));
70
- this.txEffects.push(...blocks.flatMap(b => b.getTxs()));
70
+ this.lastL1BlockNewBlocks = blocks.lastProcessedL1BlockNumber;
71
+ this.l2BlockContexts.push(...blocks.retrievedData.map(block => new L2BlockContext(block)));
72
+ this.txEffects.push(...blocks.retrievedData.flatMap(b => b.getTxs()));
71
73
  return Promise.resolve(true);
72
74
  }
73
75
  /**
@@ -112,16 +114,15 @@ export class MemoryArchiverStore {
112
114
  }
113
115
  /**
114
116
  * Append L1 to L2 messages to the store.
115
- * @param messages - The L1 to L2 messages to be added to the store.
116
- * @param lastMessageL1BlockNumber - The L1 block number in which the last message was emitted.
117
+ * @param messages - The L1 to L2 messages to be added to the store and the last processed L1 block.
117
118
  * @returns True if the operation is successful.
118
119
  */
119
- addL1ToL2Messages(messages, lastMessageL1BlockNumber) {
120
- if (lastMessageL1BlockNumber <= this.lastL1BlockNewMessages) {
120
+ addL1ToL2Messages(messages) {
121
+ if (messages.lastProcessedL1BlockNumber <= this.lastL1BlockNewMessages) {
121
122
  return Promise.resolve(false);
122
123
  }
123
- this.lastL1BlockNewMessages = lastMessageL1BlockNumber;
124
- for (const message of messages) {
124
+ this.lastL1BlockNewMessages = messages.lastProcessedL1BlockNumber;
125
+ for (const message of messages.retrievedData) {
125
126
  this.l1ToL2Messages.addMessage(message);
126
127
  }
127
128
  return Promise.resolve(true);
@@ -129,7 +130,7 @@ export class MemoryArchiverStore {
129
130
  /**
130
131
  * Gets the L1 to L2 message index in the L1 to L2 message tree.
131
132
  * @param l1ToL2Message - The L1 to L2 message.
132
- * @returns The index of the L1 to L2 message in the L1 to L2 message tree.
133
+ * @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
133
134
  */
134
135
  getL1ToL2MessageIndex(l1ToL2Message) {
135
136
  return Promise.resolve(this.l1ToL2Messages.getMessageIndex(l1ToL2Message));
@@ -287,12 +288,10 @@ export class MemoryArchiverStore {
287
288
  return Promise.resolve(this.l2BlockContexts[this.l2BlockContexts.length - 1].block.number);
288
289
  }
289
290
  getSynchedL1BlockNumbers() {
290
- const blocks = this.l2BlockContexts[this.l2BlockContexts.length - 1]?.block?.getL1BlockNumber() ?? 0n;
291
- const messages = this.lastL1BlockNewMessages;
292
291
  return Promise.resolve({
293
- blocks,
294
- messages,
292
+ blocks: this.lastL1BlockNewBlocks,
293
+ messages: this.lastL1BlockNewMessages,
295
294
  });
296
295
  }
297
296
  }
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2FyY2hpdmVyX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdmVyL21lbW9yeV9hcmNoaXZlcl9zdG9yZS9tZW1vcnlfYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHdCQUF3QixFQUl4QixjQUFjLEVBR2QsS0FBSyxFQUNMLE9BQU8sRUFHUCxTQUFTLEVBQ1QsUUFBUSxFQUNSLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUs5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRTs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUF1QzlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBeENqQzs7V0FFRztRQUNLLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUUvQzs7V0FFRztRQUNLLGtCQUFhLEdBQXNCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFckQ7O1dBRUc7UUFDSyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBRW5DOzs7V0FHRztRQUNLLDBCQUFxQixHQUFvQixFQUFFLENBQUM7UUFFcEQ7OztXQUdHO1FBQ0ssNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztRQUV0RDs7V0FFRztRQUNLLG1CQUFjLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTFDLG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQsc0JBQWlCLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEUsMkJBQXNCLEdBQVcsRUFBRSxDQUFDO0lBS3pDLENBQUM7SUFFRyxnQkFBZ0IsQ0FBQyxFQUFNO1FBQzVCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENB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
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2FyY2hpdmVyX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdmVyL21lbW9yeV9hcmNoaXZlcl9zdG9yZS9tZW1vcnlfYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHdCQUF3QixFQUl4QixjQUFjLEVBR2QsS0FBSyxFQUNMLE9BQU8sRUFHUCxTQUFTLEVBQ1QsUUFBUSxFQUNSLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU05RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRTs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUF3QzlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBekNqQzs7V0FFRztRQUNLLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUUvQzs7V0FFRztRQUNLLGtCQUFhLEdBQXNCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFckQ7O1dBRUc7UUFDSyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBRW5DOzs7V0FHRztRQUNLLDBCQUFxQixHQUFvQixFQUFFLENBQUM7UUFFcEQ7OztXQUdHO1FBQ0ssNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztRQUV0RDs7V0FFRztRQUNLLG1CQUFjLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTFDLG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQsc0JBQWlCLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEUseUJBQW9CLEdBQVcsRUFBRSxDQUFDO1FBQ2xDLDJCQUFzQixHQUFXLEVBQUUsQ0FBQztJQUt6QyxDQUFDO0lBRUcsZ0JBQWdCLENBQUMsRUFBTTtRQUM1QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRU0sbUJBQW1CLENBQUMsT0FBcUI7UUFDOUMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBMkIsRUFBRSxZQUFvQjtRQUN6RSxLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sb0JBQW9CLENBQUMsSUFBbUMsRUFBRSxZQUFvQjtRQUNuRixLQUFLLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQThCO1FBQzdDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsV0FBbUI7UUFDaEMsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQixLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxnQkFBMEI7UUFDdkMsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkgsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBcUIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsYUFBNEIsRUFBRSxlQUE4QixFQUFFLFdBQW1CO1FBQ3ZGLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUNqRixDQUFDO1FBRUQsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsZUFBZSxDQUFDO1FBQ3JGLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxRQUFrQztRQUN6RCxJQUFJLFFBQVEsQ0FBQywwQkFBMEIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxRQUFRLENBQUMsMEJBQTBCLENBQUM7UUFDbEUsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHFCQUFxQixDQUFDLGFBQWlCO1FBQzVDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxTQUFTLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDMUMsbURBQW1EO1FBQ25ELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGtCQUFrQixLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0MsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsTUFBYztRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDckUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CLENBQUMsTUFBYztRQUN2QyxLQUFLLE1BQU0sWUFBWSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNoRCxLQUFLLE1BQU0sYUFBYSxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDakMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUNwQixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUMzRyxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLFdBQW1CO1FBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxPQUFnQjtRQUNuRCxJQUFJLElBQUksR0FBRyxvQkFBb0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQ3ZHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxvQkFBb0IsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFDLE1BQWlCO1FBQ2xDLElBQUksTUFBMEIsQ0FBQztRQUMvQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckYsY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDO2dCQUNwRSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQ3pDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7WUFDcEYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGNBQWMsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBRXZCLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLENBQUM7UUFDdkQsQ0FBQztRQUVELG1EQUFtRDtRQUNuRCxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxJQUFJLFlBQVksR0FBRyxjQUFjLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9HLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsVUFBVSxFQUFFLEtBQUs7YUFDbEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUVqQyxNQUFNLElBQUksR0FBK0IsRUFBRSxDQUFDO1FBRTVDLE9BQU8sY0FBYyxHQUFHLFlBQVksRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sY0FBYyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFHLE9BQU8sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQztvQkFDcEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNqQyxJQUNFLENBQUMsQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ2xFLENBQUMsQ0FBQyxlQUFlLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ2pFLENBQUMsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFDNUMsQ0FBQzt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUNQLElBQUksd0JBQXdCLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUN0RyxDQUFDO3dCQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQ2pDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQ0FDckIsSUFBSTtnQ0FDSixVQUFVLEVBQUUsSUFBSTs2QkFDakIsQ0FBQyxDQUFDO3dCQUNMLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFlBQVksR0FBRyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUNELGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNyQixJQUFJO1lBQ0osVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHVCQUF1QjtRQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1NBQ3RDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/archiver",
3
- "version": "0.29.0",
3
+ "version": "0.30.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -35,14 +35,14 @@
35
35
  "workerThreads": true
36
36
  },
37
37
  "dependencies": {
38
- "@aztec/circuit-types": "0.29.0",
39
- "@aztec/circuits.js": "0.29.0",
40
- "@aztec/ethereum": "0.29.0",
41
- "@aztec/foundation": "0.29.0",
42
- "@aztec/kv-store": "0.29.0",
43
- "@aztec/l1-artifacts": "0.29.0",
44
- "@aztec/protocol-contracts": "0.29.0",
45
- "@aztec/types": "0.29.0",
38
+ "@aztec/circuit-types": "0.30.0",
39
+ "@aztec/circuits.js": "0.30.0",
40
+ "@aztec/ethereum": "0.30.0",
41
+ "@aztec/foundation": "0.30.0",
42
+ "@aztec/kv-store": "0.30.0",
43
+ "@aztec/l1-artifacts": "0.30.0",
44
+ "@aztec/protocol-contracts": "0.30.0",
45
+ "@aztec/types": "0.30.0",
46
46
  "debug": "^4.3.4",
47
47
  "lmdb": "^2.9.2",
48
48
  "lodash.omit": "^4.5.0",
@@ -33,6 +33,7 @@ import { Chain, HttpTransport, PublicClient, createPublicClient, http } from 'vi
33
33
  import { ArchiverDataStore } from './archiver_store.js';
34
34
  import { ArchiverConfig } from './config.js';
35
35
  import {
36
+ DataRetrieval,
36
37
  retrieveBlockBodiesFromAvailabilityOracle,
37
38
  retrieveBlockMetadataFromRollup,
38
39
  retrieveL1ToL2Messages,
@@ -195,12 +196,7 @@ export class Archiver implements ArchiveSource {
195
196
  );
196
197
  }
197
198
 
198
- await this.store.addL1ToL2Messages(
199
- retrievedL1ToL2Messages.retrievedData,
200
- // -1n because the function expects the last block in which the message was emitted and not the one after next
201
- // TODO(#5264): Check whether this could be cleaned up - `nextEthBlockNumber` value doesn't seem to be used much
202
- retrievedL1ToL2Messages.nextEthBlockNumber - 1n,
203
- );
199
+ await this.store.addL1ToL2Messages(retrievedL1ToL2Messages);
204
200
 
205
201
  // Read all data from chain and then write to our stores at the end
206
202
  const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
@@ -214,50 +210,50 @@ export class Archiver implements ArchiveSource {
214
210
  );
215
211
 
216
212
  const blockBodies = retrievedBlockBodies.retrievedData.map(([blockBody]) => blockBody);
217
-
218
213
  await this.store.addBlockBodies(blockBodies);
219
214
 
220
- const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(
221
- this.publicClient,
222
- this.rollupAddress,
223
- blockUntilSynced,
224
- lastL1Blocks.blocks + 1n,
225
- currentL1BlockNumber,
226
- nextExpectedL2BlockNum,
227
- );
228
-
229
- const retrievedBodyHashes = retrievedBlockMetadata.retrievedData.map(
230
- ([header]) => header.contentCommitment.txsEffectsHash,
231
- );
215
+ // Now that we have block bodies we will retrieve block metadata and build L2 blocks from the bodies and
216
+ // the metadata
217
+ let retrievedBlocks: DataRetrieval<L2Block>;
218
+ {
219
+ const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(
220
+ this.publicClient,
221
+ this.rollupAddress,
222
+ blockUntilSynced,
223
+ lastL1Blocks.blocks + 1n,
224
+ currentL1BlockNumber,
225
+ nextExpectedL2BlockNum,
226
+ );
232
227
 
233
- const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
228
+ const retrievedBodyHashes = retrievedBlockMetadata.retrievedData.map(
229
+ ([header]) => header.contentCommitment.txsEffectsHash,
230
+ );
234
231
 
235
- if (retrievedBlockMetadata.retrievedData.length !== blockBodiesFromStore.length) {
236
- throw new Error('Block headers length does not equal block bodies length');
237
- }
232
+ const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
238
233
 
239
- const retrievedBlocks = {
240
- retrievedData: retrievedBlockMetadata.retrievedData.map(
241
- (blockMetadata, i) =>
242
- new L2Block(blockMetadata[1], blockMetadata[0], blockBodiesFromStore[i], blockMetadata[2]),
243
- ),
244
- };
234
+ if (retrievedBlockMetadata.retrievedData.length !== blockBodiesFromStore.length) {
235
+ throw new Error('Block headers length does not equal block bodies length');
236
+ }
245
237
 
246
- if (retrievedBlocks.retrievedData.length === 0) {
247
- return;
248
- } else {
249
- this.log(
250
- `Retrieved ${retrievedBlocks.retrievedData.length} new L2 blocks between L1 blocks ${
251
- lastL1Blocks.blocks + 1n
252
- } and ${currentL1BlockNumber}.`,
238
+ const blocks = retrievedBlockMetadata.retrievedData.map(
239
+ (blockMetadata, i) => new L2Block(blockMetadata[1], blockMetadata[0], blockBodiesFromStore[i]),
253
240
  );
254
- }
255
241
 
256
- // create the block number -> block hash mapping to ensure we retrieve the appropriate events
257
- const blockNumberToBodyHash: { [key: number]: Buffer | undefined } = {};
258
- retrievedBlocks.retrievedData.forEach((block: L2Block) => {
259
- blockNumberToBodyHash[block.number] = block.header.contentCommitment.txsEffectsHash;
260
- });
242
+ if (blocks.length === 0) {
243
+ return;
244
+ } else {
245
+ this.log(
246
+ `Retrieved ${blocks.length} new L2 blocks between L1 blocks ${
247
+ lastL1Blocks.blocks + 1n
248
+ } and ${currentL1BlockNumber}.`,
249
+ );
250
+ }
251
+
252
+ retrievedBlocks = {
253
+ lastProcessedL1BlockNumber: retrievedBlockMetadata.lastProcessedL1BlockNumber,
254
+ retrievedData: blocks,
255
+ };
256
+ }
261
257
 
262
258
  await Promise.all(
263
259
  retrievedBlocks.retrievedData.map(block => {
@@ -280,7 +276,7 @@ export class Archiver implements ArchiveSource {
280
276
  }),
281
277
  );
282
278
 
283
- await this.store.addBlocks(retrievedBlocks.retrievedData);
279
+ await this.store.addBlocks(retrievedBlocks);
284
280
  }
285
281
 
286
282
  /**
@@ -430,9 +426,9 @@ export class Archiver implements ArchiveSource {
430
426
  /**
431
427
  * Gets the L1 to L2 message index in the L1 to L2 message tree.
432
428
  * @param l1ToL2Message - The L1 to L2 message.
433
- * @returns The index of the L1 to L2 message in the L1 to L2 message tree.
429
+ * @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
434
430
  */
435
- getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint> {
431
+ getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined> {
436
432
  return this.store.getL1ToL2MessageIndex(l1ToL2Message);
437
433
  }
438
434
 
@@ -14,6 +14,8 @@ import { Fr } from '@aztec/circuits.js';
14
14
  import { AztecAddress } from '@aztec/foundation/aztec-address';
15
15
  import { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/types/contracts';
16
16
 
17
+ import { DataRetrieval } from './data_retrieval.js';
18
+
17
19
  /**
18
20
  * Represents the latest L1 block processed by the archiver for various objects in L2.
19
21
  */
@@ -31,10 +33,10 @@ export type ArchiverL1SynchPoint = {
31
33
  export interface ArchiverDataStore {
32
34
  /**
33
35
  * Append new blocks to the store's list.
34
- * @param blocks - The L2 blocks to be added to the store.
36
+ * @param blocks - The L2 blocks to be added to the store and the last processed L1 block.
35
37
  * @returns True if the operation is successful.
36
38
  */
37
- addBlocks(blocks: L2Block[]): Promise<boolean>;
39
+ addBlocks(blocks: DataRetrieval<L2Block>): Promise<boolean>;
38
40
 
39
41
  /**
40
42
  * Append new block bodies to the store's list.
@@ -88,11 +90,10 @@ export interface ArchiverDataStore {
88
90
 
89
91
  /**
90
92
  * Append L1 to L2 messages to the store.
91
- * @param messages - The L1 to L2 messages to be added to the store.
92
- * @param lastMessageL1BlockNumber - The L1 block number in which the last message was emitted.
93
+ * @param messages - The L1 to L2 messages to be added to the store and the last processed L1 block.
93
94
  * @returns True if the operation is successful.
94
95
  */
95
- addL1ToL2Messages(messages: InboxLeaf[], lastMessageL1BlockNumber: bigint): Promise<boolean>;
96
+ addL1ToL2Messages(messages: DataRetrieval<InboxLeaf>): Promise<boolean>;
96
97
 
97
98
  /**
98
99
  * Gets L1 to L2 message (to be) included in a given block.
@@ -104,9 +105,9 @@ export interface ArchiverDataStore {
104
105
  /**
105
106
  * Gets the L1 to L2 message index in the L1 to L2 message tree.
106
107
  * @param l1ToL2Message - The L1 to L2 message.
107
- * @returns The index of the L1 to L2 message in the L1 to L2 message tree.
108
+ * @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
108
109
  */
109
- getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint>;
110
+ getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined>;
110
111
 
111
112
  /**
112
113
  * Gets up to `limit` amount of logs starting from `from`.
@@ -6,6 +6,7 @@ import { randomBytes, randomInt } from '@aztec/foundation/crypto';
6
6
  import { ContractClassPublic, ContractInstanceWithAddress, SerializableContractInstance } from '@aztec/types/contracts';
7
7
 
8
8
  import { ArchiverDataStore } from './archiver_store.js';
9
+ import { DataRetrieval } from './data_retrieval.js';
9
10
 
10
11
  /**
11
12
  * @param testName - The name of the test suite.
@@ -14,27 +15,26 @@ import { ArchiverDataStore } from './archiver_store.js';
14
15
  export function describeArchiverDataStore(testName: string, getStore: () => ArchiverDataStore) {
15
16
  describe(testName, () => {
16
17
  let store: ArchiverDataStore;
17
- let blocks: L2Block[];
18
+ let blocks: DataRetrieval<L2Block>;
18
19
  const blockTests: [number, number, () => L2Block[]][] = [
19
- [1, 1, () => blocks.slice(0, 1)],
20
- [10, 1, () => blocks.slice(9, 10)],
21
- [1, 10, () => blocks.slice(0, 10)],
22
- [2, 5, () => blocks.slice(1, 6)],
23
- [5, 2, () => blocks.slice(4, 6)],
20
+ [1, 1, () => blocks.retrievedData.slice(0, 1)],
21
+ [10, 1, () => blocks.retrievedData.slice(9, 10)],
22
+ [1, 10, () => blocks.retrievedData.slice(0, 10)],
23
+ [2, 5, () => blocks.retrievedData.slice(1, 6)],
24
+ [5, 2, () => blocks.retrievedData.slice(4, 6)],
24
25
  ];
25
26
 
26
27
  beforeEach(() => {
27
28
  store = getStore();
28
- blocks = Array.from({ length: 10 }).map((_, i) => {
29
- const block = L2Block.random(i + 1);
30
- block.setL1BlockNumber(BigInt(i + 1));
31
- return block;
32
- });
29
+ blocks = {
30
+ lastProcessedL1BlockNumber: 5n,
31
+ retrievedData: Array.from({ length: 10 }).map((_, i) => L2Block.random(i + 1)),
32
+ };
33
33
  });
34
34
 
35
35
  describe('addBlocks', () => {
36
36
  it('returns success when adding block bodies', async () => {
37
- await expect(store.addBlockBodies(blocks.map(block => block.body))).resolves.toBe(true);
37
+ await expect(store.addBlockBodies(blocks.retrievedData.map(block => block.body))).resolves.toBe(true);
38
38
  });
39
39
 
40
40
  it('returns success when adding blocks', async () => {
@@ -50,7 +50,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
50
50
  describe('getBlocks', () => {
51
51
  beforeEach(async () => {
52
52
  await store.addBlocks(blocks);
53
- await store.addBlockBodies(blocks.map(block => block.body));
53
+ await store.addBlockBodies(blocks.retrievedData.map(block => block.body));
54
54
  });
55
55
 
56
56
  it.each(blockTests)('retrieves previously stored blocks', async (start, limit, getExpectedBlocks) => {
@@ -66,7 +66,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
66
66
  });
67
67
 
68
68
  it('resets `from` to the first block if it is out of range', async () => {
69
- await expect(store.getBlocks(INITIAL_L2_BLOCK_NUM - 100, 1)).resolves.toEqual(blocks.slice(0, 1));
69
+ await expect(store.getBlocks(INITIAL_L2_BLOCK_NUM - 100, 1)).resolves.toEqual(blocks.retrievedData.slice(0, 1));
70
70
  });
71
71
  });
72
72
 
@@ -77,7 +77,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
77
77
 
78
78
  it("returns the most recently added block's number", async () => {
79
79
  await store.addBlocks(blocks);
80
- await expect(store.getSynchedL2BlockNumber()).resolves.toEqual(blocks.at(-1)!.number);
80
+ await expect(store.getSynchedL2BlockNumber()).resolves.toEqual(blocks.retrievedData.at(-1)!.number);
81
81
  });
82
82
  });
83
83
 
@@ -92,13 +92,16 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
92
92
  it('returns the L1 block number in which the most recent L2 block was published', async () => {
93
93
  await store.addBlocks(blocks);
94
94
  await expect(store.getSynchedL1BlockNumbers()).resolves.toEqual({
95
- blocks: blocks.at(-1)!.getL1BlockNumber(),
95
+ blocks: blocks.lastProcessedL1BlockNumber,
96
96
  messages: 0n,
97
97
  });
98
98
  });
99
99
 
100
100
  it('returns the L1 block number that most recently added messages from inbox', async () => {
101
- await store.addL1ToL2Messages([new InboxLeaf(0n, 0n, Fr.ZERO)], 1n);
101
+ await store.addL1ToL2Messages({
102
+ lastProcessedL1BlockNumber: 1n,
103
+ retrievedData: [new InboxLeaf(0n, 0n, Fr.ZERO)],
104
+ });
102
105
  await expect(store.getSynchedL1BlockNumbers()).resolves.toEqual({
103
106
  blocks: 0n,
104
107
  messages: 1n,
@@ -109,7 +112,11 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
109
112
  describe('addLogs', () => {
110
113
  it('adds encrypted & unencrypted logs', async () => {
111
114
  await expect(
112
- store.addLogs(blocks[0].body.encryptedLogs, blocks[0].body.unencryptedLogs, blocks[0].number),
115
+ store.addLogs(
116
+ blocks.retrievedData[0].body.encryptedLogs,
117
+ blocks.retrievedData[0].body.unencryptedLogs,
118
+ blocks.retrievedData[0].number,
119
+ ),
113
120
  ).resolves.toEqual(true);
114
121
  });
115
122
  });
@@ -120,7 +127,9 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
120
127
  ])('getLogs (%s)', (_, logType) => {
121
128
  beforeEach(async () => {
122
129
  await Promise.all(
123
- blocks.map(block => store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number)),
130
+ blocks.retrievedData.map(block =>
131
+ store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number),
132
+ ),
124
133
  );
125
134
  });
126
135
 
@@ -136,18 +145,20 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
136
145
  describe('getTxEffect', () => {
137
146
  beforeEach(async () => {
138
147
  await Promise.all(
139
- blocks.map(block => store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number)),
148
+ blocks.retrievedData.map(block =>
149
+ store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number),
150
+ ),
140
151
  );
141
152
  await store.addBlocks(blocks);
142
- await store.addBlockBodies(blocks.map(block => block.body));
153
+ await store.addBlockBodies(blocks.retrievedData.map(block => block.body));
143
154
  });
144
155
 
145
156
  it.each([
146
- () => blocks[0].getTx(0),
147
- () => blocks[9].getTx(3),
148
- () => blocks[3].getTx(1),
149
- () => blocks[5].getTx(2),
150
- () => blocks[1].getTx(0),
157
+ () => blocks.retrievedData[0].getTx(0),
158
+ () => blocks.retrievedData[9].getTx(3),
159
+ () => blocks.retrievedData[3].getTx(1),
160
+ () => blocks.retrievedData[5].getTx(2),
161
+ () => blocks.retrievedData[1].getTx(0),
151
162
  ])('retrieves a previously stored transaction', async getExpectedTx => {
152
163
  const expectedTx = getExpectedTx();
153
164
  const actualTx = await store.getTxEffect(expectedTx.txHash);
@@ -169,7 +180,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
169
180
  it('returns messages in correct order', async () => {
170
181
  const msgs = generateBlockMessages(l2BlockNumber, l1ToL2MessageSubtreeSize);
171
182
  const shuffledMessages = msgs.slice().sort(() => randomInt(1) - 0.5);
172
- await store.addL1ToL2Messages(shuffledMessages, 100n);
183
+ await store.addL1ToL2Messages({ lastProcessedL1BlockNumber: 100n, retrievedData: shuffledMessages });
173
184
  const retrievedMessages = await store.getL1ToL2Messages(l2BlockNumber);
174
185
 
175
186
  const expectedLeavesOrder = msgs.map(msg => msg.leaf);
@@ -182,7 +193,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
182
193
  // --> with that there will be a gap and it will be impossible to sequence the messages
183
194
  msgs[4] = new InboxLeaf(l2BlockNumber, BigInt(l1ToL2MessageSubtreeSize - 1), Fr.random());
184
195
 
185
- await store.addL1ToL2Messages(msgs, 100n);
196
+ await store.addL1ToL2Messages({ lastProcessedL1BlockNumber: 100n, retrievedData: msgs });
186
197
  await expect(async () => {
187
198
  await store.getL1ToL2Messages(l2BlockNumber);
188
199
  }).rejects.toThrow(`L1 to L2 message gap found in block ${l2BlockNumber}`);
@@ -192,7 +203,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
192
203
  const msgs = generateBlockMessages(l2BlockNumber, l1ToL2MessageSubtreeSize + 1);
193
204
 
194
205
  await expect(async () => {
195
- await store.addL1ToL2Messages(msgs, 100n);
206
+ await store.addL1ToL2Messages({ lastProcessedL1BlockNumber: 100n, retrievedData: msgs });
196
207
  }).rejects.toThrow(`Message index ${l1ToL2MessageSubtreeSize} out of subtree range`);
197
208
  });
198
209
  });
@@ -238,20 +249,25 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
238
249
  const numPublicFunctionCalls = 3;
239
250
  const numUnencryptedLogs = 4;
240
251
  const numBlocks = 10;
241
- let blocks: L2Block[];
252
+ let blocks: DataRetrieval<L2Block>;
242
253
 
243
254
  beforeEach(async () => {
244
- blocks = Array(numBlocks)
245
- .fill(0)
246
- .map((_, index: number) =>
247
- L2Block.random(index + 1, txsPerBlock, 2, numPublicFunctionCalls, 2, numUnencryptedLogs),
248
- );
255
+ blocks = {
256
+ lastProcessedL1BlockNumber: 4n,
257
+ retrievedData: Array(numBlocks)
258
+ .fill(0)
259
+ .map((_, index: number) =>
260
+ L2Block.random(index + 1, txsPerBlock, 2, numPublicFunctionCalls, 2, numUnencryptedLogs),
261
+ ),
262
+ };
249
263
 
250
264
  await store.addBlocks(blocks);
251
- await store.addBlockBodies(blocks.map(block => block.body));
265
+ await store.addBlockBodies(blocks.retrievedData.map(block => block.body));
252
266
 
253
267
  await Promise.all(
254
- blocks.map(block => store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number)),
268
+ blocks.retrievedData.map(block =>
269
+ store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number),
270
+ ),
255
271
  );
256
272
  });
257
273
 
@@ -259,7 +275,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
259
275
  // get random tx
260
276
  const targetBlockIndex = randomInt(numBlocks);
261
277
  const targetTxIndex = randomInt(txsPerBlock);
262
- const targetTxHash = new L2BlockContext(blocks[targetBlockIndex]).getTxHash(targetTxIndex);
278
+ const targetTxHash = new L2BlockContext(blocks.retrievedData[targetBlockIndex]).getTxHash(targetTxIndex);
263
279
 
264
280
  const response = await store.getUnencryptedLogs({ txHash: targetTxHash });
265
281
  const logs = response.logs;
@@ -303,8 +319,9 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
303
319
  const targetFunctionLogIndex = randomInt(numPublicFunctionCalls);
304
320
  const targetLogIndex = randomInt(numUnencryptedLogs);
305
321
  const targetContractAddress = UnencryptedL2Log.fromBuffer(
306
- blocks[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[targetFunctionLogIndex]
307
- .logs[targetLogIndex],
322
+ blocks.retrievedData[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[
323
+ targetFunctionLogIndex
324
+ ].logs[targetLogIndex],
308
325
  ).contractAddress;
309
326
 
310
327
  const response = await store.getUnencryptedLogs({ contractAddress: targetContractAddress });
@@ -323,8 +340,9 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
323
340
  const targetFunctionLogIndex = randomInt(numPublicFunctionCalls);
324
341
  const targetLogIndex = randomInt(numUnencryptedLogs);
325
342
  const targetSelector = UnencryptedL2Log.fromBuffer(
326
- blocks[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[targetFunctionLogIndex]
327
- .logs[targetLogIndex],
343
+ blocks.retrievedData[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[
344
+ targetFunctionLogIndex
345
+ ].logs[targetLogIndex],
328
346
  ).selector;
329
347
 
330
348
  const response = await store.getUnencryptedLogs({ selector: targetSelector });
@@ -62,6 +62,8 @@ export function getConfigEnvVars(): ArchiverConfig {
62
62
  INBOX_CONTRACT_ADDRESS,
63
63
  OUTBOX_CONTRACT_ADDRESS,
64
64
  REGISTRY_CONTRACT_ADDRESS,
65
+ GAS_TOKEN_CONTRACT_ADDRESS,
66
+ GAS_PORTAL_CONTRACT_ADDRESS,
65
67
  DATA_DIRECTORY,
66
68
  } = process.env;
67
69
  // Populate the relevant addresses for use by the archiver.
@@ -73,6 +75,10 @@ export function getConfigEnvVars(): ArchiverConfig {
73
75
  registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO,
74
76
  inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
75
77
  outboxAddress: OUTBOX_CONTRACT_ADDRESS ? EthAddress.fromString(OUTBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
78
+ gasTokenAddress: GAS_TOKEN_CONTRACT_ADDRESS ? EthAddress.fromString(GAS_TOKEN_CONTRACT_ADDRESS) : EthAddress.ZERO,
79
+ gasPortalAddress: GAS_PORTAL_CONTRACT_ADDRESS
80
+ ? EthAddress.fromString(GAS_PORTAL_CONTRACT_ADDRESS)
81
+ : EthAddress.ZERO,
76
82
  };
77
83
  return {
78
84
  rpcUrl: ETHEREUM_HOST || 'http://127.0.0.1:8545/',
@@ -16,11 +16,11 @@ import {
16
16
  /**
17
17
  * Data retrieved from logs
18
18
  */
19
- type DataRetrieval<T> = {
19
+ export type DataRetrieval<T> = {
20
20
  /**
21
- * The next block number.
21
+ * Blocknumber of the last L1 block from which we obtained data.
22
22
  */
23
- nextEthBlockNumber: bigint;
23
+ lastProcessedL1BlockNumber: bigint;
24
24
  /**
25
25
  * The data returned.
26
26
  */
@@ -35,7 +35,7 @@ type DataRetrieval<T> = {
35
35
  * @param searchStartBlock - The block number to use for starting the search.
36
36
  * @param searchEndBlock - The highest block number that we should search up to.
37
37
  * @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
38
- * @returns An array of tuples representing block metadata including the header, archive tree snapshot, and associated l1 block number; as well as the next eth block to search from.
38
+ * @returns An array of tuples representing block metadata including the header, archive tree snapshot; as well as the next eth block to search from.
39
39
  */
40
40
  export async function retrieveBlockMetadataFromRollup(
41
41
  publicClient: PublicClient,
@@ -44,8 +44,8 @@ export async function retrieveBlockMetadataFromRollup(
44
44
  searchStartBlock: bigint,
45
45
  searchEndBlock: bigint,
46
46
  expectedNextL2BlockNum: bigint,
47
- ): Promise<DataRetrieval<[Header, AppendOnlyTreeSnapshot, bigint]>> {
48
- const retrievedBlockMetadata: [Header, AppendOnlyTreeSnapshot, bigint][] = [];
47
+ ): Promise<DataRetrieval<[Header, AppendOnlyTreeSnapshot]>> {
48
+ const retrievedBlockMetadata: [Header, AppendOnlyTreeSnapshot][] = [];
49
49
  do {
50
50
  if (searchStartBlock > searchEndBlock) {
51
51
  break;
@@ -69,7 +69,7 @@ export async function retrieveBlockMetadataFromRollup(
69
69
  searchStartBlock = l2BlockProcessedLogs[l2BlockProcessedLogs.length - 1].blockNumber! + 1n;
70
70
  expectedNextL2BlockNum += BigInt(newBlockMetadata.length);
71
71
  } while (blockUntilSynced && searchStartBlock <= searchEndBlock);
72
- return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedBlockMetadata };
72
+ return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedBlockMetadata };
73
73
  }
74
74
 
75
75
  /**
@@ -108,7 +108,7 @@ export async function retrieveBlockBodiesFromAvailabilityOracle(
108
108
  retrievedBlockBodies.push(...newBlockBodies);
109
109
  searchStartBlock = l2TxsPublishedLogs[l2TxsPublishedLogs.length - 1].blockNumber! + 1n;
110
110
  } while (blockUntilSynced && searchStartBlock <= searchEndBlock);
111
- return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedBlockBodies };
111
+ return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedBlockBodies };
112
112
  }
113
113
 
114
114
  /**
@@ -141,5 +141,5 @@ export async function retrieveL1ToL2Messages(
141
141
  // handles the case when there are no new messages:
142
142
  searchStartBlock = (leafInsertedLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
143
143
  } while (blockUntilSynced && searchStartBlock <= searchEndBlock);
144
- return { nextEthBlockNumber: searchStartBlock, retrievedData: retrievedL1ToL2Messages };
144
+ return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedL1ToL2Messages };
145
145
  }