@aztec/archiver 0.47.1 → 0.49.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.
- package/dest/archiver/archiver.d.ts +4 -0
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +53 -22
- package/dest/archiver/archiver_store.d.ts +5 -3
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +21 -5
- package/dest/archiver/config.d.ts +5 -15
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +30 -13
- package/dest/archiver/data_retrieval.d.ts +11 -5
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +26 -5
- package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
- package/dest/archiver/eth_log_handlers.js +35 -13
- package/dest/archiver/instrumentation.d.ts +3 -1
- package/dest/archiver/instrumentation.d.ts.map +1 -1
- package/dest/archiver/instrumentation.js +15 -6
- package/dest/archiver/kv_archiver_store/block_body_store.d.ts +11 -4
- package/dest/archiver/kv_archiver_store/block_body_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_body_store.js +27 -9
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +2 -2
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +2 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +4 -3
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +7 -8
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +4 -2
- package/package.json +10 -10
- package/src/archiver/archiver.ts +61 -22
- package/src/archiver/archiver_store.ts +5 -3
- package/src/archiver/archiver_store_test_suite.ts +26 -9
- package/src/archiver/config.ts +33 -37
- package/src/archiver/data_retrieval.ts +39 -8
- package/src/archiver/eth_log_handlers.ts +43 -13
- package/src/archiver/instrumentation.ts +26 -6
- package/src/archiver/kv_archiver_store/block_body_store.ts +30 -10
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +3 -2
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +10 -12
- package/src/index.ts +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory_archiver_store.d.ts","sourceRoot":"","sources":["../../../src/archiver/memory_archiver_store/memory_archiver_store.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,KAAK,IAAI,EACT,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAE/B,KAAK,WAAW,EAChB,KAAK,0BAA0B,EAC/B,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,SAAS,EAEd,OAAO,EACP,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,SAAS,EACT,KAAK,wBAAwB,EAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,EAAE,EAAwB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,4CAA4C,EACjD,KAAK,wCAAwC,EAC9C,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D;;GAEG;AACH,qBAAa,mBAAoB,YAAW,iBAAiB;
|
|
1
|
+
{"version":3,"file":"memory_archiver_store.d.ts","sourceRoot":"","sources":["../../../src/archiver/memory_archiver_store/memory_archiver_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ export class MemoryArchiverStore {
|
|
|
18
18
|
*/
|
|
19
19
|
this.l2BlockBodies = new Map();
|
|
20
20
|
/**
|
|
21
|
-
* An array containing all the
|
|
21
|
+
* An array containing all the tx effects in the L2 blocks that have been fetched so far.
|
|
22
22
|
*/
|
|
23
23
|
this.txEffects = [];
|
|
24
24
|
/**
|
|
@@ -46,6 +46,7 @@ export class MemoryArchiverStore {
|
|
|
46
46
|
this.unconstrainedFunctions = new Map();
|
|
47
47
|
this.contractInstances = new Map();
|
|
48
48
|
this.lastL1BlockNewBlocks = 0n;
|
|
49
|
+
this.lastL1BlockNewBlockBodies = 0n;
|
|
49
50
|
this.lastL1BlockNewMessages = 0n;
|
|
50
51
|
this.lastProvenL2BlockNumber = 0;
|
|
51
52
|
}
|
|
@@ -107,9 +108,10 @@ export class MemoryArchiverStore {
|
|
|
107
108
|
* @returns True if the operation is successful.
|
|
108
109
|
*/
|
|
109
110
|
addBlockBodies(blockBodies) {
|
|
110
|
-
for (const body of blockBodies) {
|
|
111
|
+
for (const body of blockBodies.retrievedData) {
|
|
111
112
|
void this.l2BlockBodies.set(body.getTxsEffectsHash().toString('hex'), body);
|
|
112
113
|
}
|
|
114
|
+
this.lastL1BlockNewBlockBodies = blockBodies.lastProcessedL1BlockNumber;
|
|
113
115
|
return Promise.resolve(true);
|
|
114
116
|
}
|
|
115
117
|
/**
|
|
@@ -119,11 +121,7 @@ export class MemoryArchiverStore {
|
|
|
119
121
|
* @returns The requested L2 block bodies
|
|
120
122
|
*/
|
|
121
123
|
getBlockBodies(txsEffectsHashes) {
|
|
122
|
-
|
|
123
|
-
if (blockBodies.some(bodyBuffer => bodyBuffer === undefined)) {
|
|
124
|
-
throw new Error('Block body is undefined');
|
|
125
|
-
}
|
|
126
|
-
return Promise.resolve(blockBodies);
|
|
124
|
+
return Promise.resolve(txsEffectsHashes.map(txsEffectsHash => this.l2BlockBodies.get(txsEffectsHash.toString('hex'))));
|
|
127
125
|
}
|
|
128
126
|
/**
|
|
129
127
|
* Append new logs to the store's list.
|
|
@@ -339,6 +337,7 @@ export class MemoryArchiverStore {
|
|
|
339
337
|
return Promise.resolve({
|
|
340
338
|
blocksSynchedTo: this.lastL1BlockNewBlocks,
|
|
341
339
|
messagesSynchedTo: this.lastL1BlockNewMessages,
|
|
340
|
+
blockBodiesSynchedTo: this.lastL1BlockNewBlockBodies,
|
|
342
341
|
});
|
|
343
342
|
}
|
|
344
343
|
addContractArtifact(address, contract) {
|
|
@@ -349,4 +348,4 @@ export class MemoryArchiverStore {
|
|
|
349
348
|
return Promise.resolve(this.contractArtifacts.get(address.toString()));
|
|
350
349
|
}
|
|
351
350
|
}
|
|
352
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2FyY2hpdmVyX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdmVyL21lbW9yeV9hcmNoaXZlcl9zdG9yZS9tZW1vcnlfYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLHdCQUF3QixFQU94QixLQUFLLEVBQ0wsT0FBTyxFQUdQLFNBQVMsR0FFVixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVk5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRTs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFxRDlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBdERqQzs7V0FFRztRQUNLLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFFakM7O1dBRUc7UUFDSyxrQkFBYSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRXJEOztXQUVHO1FBQ0ssY0FBUyxHQUFlLEVBQUUsQ0FBQztRQUVuQzs7O1dBR0c7UUFDSyw4QkFBeUIsR0FBaUMsRUFBRSxDQUFDO1FBRXJFOzs7V0FHRztRQUNLLDBCQUFxQixHQUE2QixFQUFFLENBQUM7UUFFN0Q7OztXQUdHO1FBQ0ssNEJBQXVCLEdBQStCLEVBQUUsQ0FBQztRQUVqRTs7V0FFRztRQUNLLG1CQUFjLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTFDLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTdELG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQscUJBQWdCLEdBQWdFLElBQUksR0FBRyxFQUFFLENBQUM7UUFFMUYsMkJBQXNCLEdBQTRELElBQUksR0FBRyxFQUFFLENBQUM7UUFFNUYsc0JBQWlCLEdB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
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2FyY2hpdmVyX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdmVyL21lbW9yeV9hcmNoaXZlcl9zdG9yZS9tZW1vcnlfYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLHdCQUF3QixFQU94QixLQUFLLEVBQ0wsT0FBTyxFQUdQLFNBQVMsR0FFVixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVk5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRTs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFzRDlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBdkRqQzs7V0FFRztRQUNLLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFFakM7O1dBRUc7UUFDSyxrQkFBYSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRXJEOztXQUVHO1FBQ0ssY0FBUyxHQUFlLEVBQUUsQ0FBQztRQUVuQzs7O1dBR0c7UUFDSyw4QkFBeUIsR0FBaUMsRUFBRSxDQUFDO1FBRXJFOzs7V0FHRztRQUNLLDBCQUFxQixHQUE2QixFQUFFLENBQUM7UUFFN0Q7OztXQUdHO1FBQ0ssNEJBQXVCLEdBQStCLEVBQUUsQ0FBQztRQUVqRTs7V0FFRztRQUNLLG1CQUFjLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTFDLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTdELG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQscUJBQWdCLEdBQWdFLElBQUksR0FBRyxFQUFFLENBQUM7UUFFMUYsMkJBQXNCLEdBQTRELElBQUksR0FBRyxFQUFFLENBQUM7UUFFNUYsc0JBQWlCLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEUseUJBQW9CLEdBQVcsRUFBRSxDQUFDO1FBQ2xDLDhCQUF5QixHQUFXLEVBQUUsQ0FBQztRQUN2QywyQkFBc0IsR0FBVyxFQUFFLENBQUM7UUFDcEMsNEJBQXVCLEdBQVcsQ0FBQyxDQUFDO0lBS3pDLENBQUM7SUFFRyxnQkFBZ0IsQ0FBQyxFQUFNO1FBQzVCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FDcEIsYUFBYSxJQUFJO1lBQ2YsR0FBRyxhQUFhO1lBQ2hCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRTtZQUNoRSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUU7U0FDN0UsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE9BQXFCO1FBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVNLFlBQVksQ0FDakIsZUFBbUIsRUFDbkIsbUJBQW1FLEVBQ25FLHlCQUFxRTtRQUVyRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JGLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakcsTUFBTSx1QkFBdUIsR0FBRztZQUM5QixHQUFHLGdCQUFnQjtZQUNuQixHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDdkcsQ0FBQztRQUNGLE1BQU0sNkJBQTZCLEdBQUc7WUFDcEMsR0FBRyxzQkFBc0I7WUFDekIsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQ2pDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDOUU7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBMkIsRUFBRSxZQUFvQjtRQUN6RSxLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sb0JBQW9CLENBQUMsSUFBbUMsRUFBRSxZQUFvQjtRQUNuRixLQUFLLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQThCO1FBQzdDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM1RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsV0FBZ0M7UUFDN0MsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxXQUFXLENBQUMsMEJBQTBCLENBQUM7UUFDeEUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxnQkFBMEI7UUFDdkMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUNwQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDL0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQ0wsaUJBQTZDLEVBQzdDLGFBQXFDLEVBQ3JDLGVBQXlDLEVBQ3pDLFdBQW1CO1FBRW5CLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFDekYsQ0FBQztRQUVELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUNqRixDQUFDO1FBRUQsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsZUFBZSxDQUFDO1FBQ3JGLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxRQUFrQztRQUN6RCxJQUFJLFFBQVEsQ0FBQywwQkFBMEIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxRQUFRLENBQUMsMEJBQTBCLENBQUM7UUFDbEUsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FBQyxhQUFpQixFQUFFLFVBQWtCO1FBQ3pELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQzFDLG1EQUFtRDtRQUNuRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsTUFBYztRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDckUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CLENBQUMsTUFBYztRQUN2QyxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUNwQixJQUFJLFNBQVMsQ0FDWCxNQUFNLEVBQ04sU0FBUyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFDbkQsRUFBRSxFQUNGLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEVBQ2xDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFDdkIsS0FBSyxDQUFDLE1BQU0sQ0FDYixDQUNGLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsV0FBbUI7UUFDbkMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE9BQU8sQ0FDTCxJQUFZLEVBQ1osS0FBYSxFQUNiLE9BQWlCO1FBRWpCLElBQUksSUFBSSxHQUFHLG9CQUFvQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNqQixRQUFRLE9BQU8sRUFBRSxDQUFDO2dCQUNoQixLQUFLLE9BQU8sQ0FBQyxTQUFTO29CQUNwQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztnQkFDcEMsS0FBSyxPQUFPLENBQUMsYUFBYTtvQkFDeEIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUM7Z0JBQ3hDLEtBQUssT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDekI7b0JBQ0UsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUE0QyxDQUFDO1FBRS9DLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxvQkFBb0IsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFDLE1BQWlCO1FBQ2xDLElBQUksTUFBMEIsQ0FBQztRQUMvQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckYsY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDO2dCQUNwRSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQ3pDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7WUFDcEYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGNBQWMsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBRXZCLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLENBQUM7UUFDdkQsQ0FBQztRQUVELG1EQUFtRDtRQUNuRCxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxJQUFJLFlBQVksR0FBRyxjQUFjLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9HLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsVUFBVSxFQUFFLEtBQUs7YUFDbEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFFL0MsTUFBTSxJQUFJLEdBQStCLEVBQUUsQ0FBQztRQUU1QyxPQUFPLGNBQWMsR0FBRyxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvRCxPQUFPLGNBQWMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUNsRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM3RCxPQUFPLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUM7b0JBQ3BELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDakMsSUFDRSxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3ZFLENBQUMsQ0FBQyxlQUFlLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsRUFDakUsQ0FBQzt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDcEcsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDakMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dDQUNyQixJQUFJO2dDQUNKLFVBQVUsRUFBRSxJQUFJOzZCQUNqQixDQUFDLENBQUM7d0JBQ0wsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCLElBQUk7WUFDSixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksdUJBQXVCO1FBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsYUFBcUI7UUFDakQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGFBQWEsQ0FBQztRQUM3QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sYUFBYTtRQUNsQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDckIsZUFBZSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDMUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtZQUM5QyxvQkFBb0IsRUFBRSxJQUFJLENBQUMseUJBQXlCO1NBQ3JELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxPQUFxQixFQUFFLFFBQTBCO1FBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxPQUFxQjtRQUM5QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiJ9
|
package/dest/index.d.ts
CHANGED
package/dest/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dest/index.js
CHANGED
|
@@ -8,6 +8,8 @@ import { MemoryArchiverStore } from './archiver/memory_archiver_store/memory_arc
|
|
|
8
8
|
export * from './archiver/index.js';
|
|
9
9
|
export * from './rpc/index.js';
|
|
10
10
|
export * from './factory.js';
|
|
11
|
+
// We are not storing the info from these events in the archiver for now (and we don't really need to), so we expose this query directly
|
|
12
|
+
export { retrieveL2ProofVerifiedEvents } from './archiver/data_retrieval.js';
|
|
11
13
|
const log = createDebugLogger('aztec:archiver');
|
|
12
14
|
/**
|
|
13
15
|
* A function which instantiates and starts Archiver.
|
|
@@ -15,7 +17,7 @@ const log = createDebugLogger('aztec:archiver');
|
|
|
15
17
|
// eslint-disable-next-line require-await
|
|
16
18
|
async function main() {
|
|
17
19
|
const config = getArchiverConfigFromEnv();
|
|
18
|
-
const { rpcUrl, l1Contracts } = config;
|
|
20
|
+
const { l1RpcUrl: rpcUrl, l1Contracts } = config;
|
|
19
21
|
const publicClient = createPublicClient({
|
|
20
22
|
chain: localhost,
|
|
21
23
|
transport: http(rpcUrl),
|
|
@@ -37,4 +39,4 @@ if (process.argv[1] === fileURLToPath(import.meta.url).replace(/\/index\.js$/, '
|
|
|
37
39
|
process.exit(1);
|
|
38
40
|
});
|
|
39
41
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRW5FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFFaEcsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBRTdCLHdJQUF3STtBQUN4SSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU3RSxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixFQUFFLENBQUM7SUFDMUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRWpELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ3RDLEtBQUssRUFBRSxTQUFTO1FBQ2hCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQ3hCLENBQUMsQ0FBQztJQUVILE1BQU0sYUFBYSxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQzNCLFlBQVksRUFDWixXQUFXLENBQUMsYUFBYSxFQUN6QixXQUFXLENBQUMseUJBQXlCLEVBQ3JDLFdBQVcsQ0FBQyxZQUFZLEVBQ3hCLFdBQVcsQ0FBQyxlQUFlLEVBQzNCLGFBQWEsRUFDYixJQUFJLEVBQ0osSUFBSSxtQkFBbUIsRUFBRSxDQUMxQixDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDMUIsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUM7SUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbkYsbUVBQW1FO0lBQ25FLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.49.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -58,15 +58,15 @@
|
|
|
58
58
|
]
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@aztec/circuit-types": "0.
|
|
62
|
-
"@aztec/circuits.js": "0.
|
|
63
|
-
"@aztec/ethereum": "0.
|
|
64
|
-
"@aztec/foundation": "0.
|
|
65
|
-
"@aztec/kv-store": "0.
|
|
66
|
-
"@aztec/l1-artifacts": "0.
|
|
67
|
-
"@aztec/protocol-contracts": "0.
|
|
68
|
-
"@aztec/telemetry-client": "0.
|
|
69
|
-
"@aztec/types": "0.
|
|
61
|
+
"@aztec/circuit-types": "0.49.2",
|
|
62
|
+
"@aztec/circuits.js": "0.49.2",
|
|
63
|
+
"@aztec/ethereum": "0.49.2",
|
|
64
|
+
"@aztec/foundation": "0.49.2",
|
|
65
|
+
"@aztec/kv-store": "0.49.2",
|
|
66
|
+
"@aztec/l1-artifacts": "0.49.2",
|
|
67
|
+
"@aztec/protocol-contracts": "0.49.2",
|
|
68
|
+
"@aztec/telemetry-client": "0.49.2",
|
|
69
|
+
"@aztec/types": "0.49.2",
|
|
70
70
|
"debug": "^4.3.4",
|
|
71
71
|
"lodash.groupby": "^4.6.0",
|
|
72
72
|
"lodash.omit": "^4.5.0",
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -28,7 +28,7 @@ import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
|
28
28
|
import { Fr } from '@aztec/foundation/fields';
|
|
29
29
|
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
30
30
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
31
|
-
import {
|
|
31
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
32
32
|
import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-registerer';
|
|
33
33
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
34
34
|
import {
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
} from '@aztec/types/contracts';
|
|
42
42
|
|
|
43
43
|
import groupBy from 'lodash.groupby';
|
|
44
|
-
import { type Chain, type HttpTransport, type PublicClient, createPublicClient,
|
|
44
|
+
import { type Chain, type HttpTransport, type PublicClient, createPublicClient, http } from 'viem';
|
|
45
45
|
|
|
46
46
|
import { type ArchiverDataStore } from './archiver_store.js';
|
|
47
47
|
import { type ArchiverConfig } from './config.js';
|
|
@@ -50,6 +50,7 @@ import {
|
|
|
50
50
|
retrieveBlockBodiesFromAvailabilityOracle,
|
|
51
51
|
retrieveBlockMetadataFromRollup,
|
|
52
52
|
retrieveL1ToL2Messages,
|
|
53
|
+
retrieveL2ProofVerifiedEvents,
|
|
53
54
|
} from './data_retrieval.js';
|
|
54
55
|
import { ArchiverInstrumentation } from './instrumentation.js';
|
|
55
56
|
|
|
@@ -109,7 +110,7 @@ export class Archiver implements ArchiveSource {
|
|
|
109
110
|
telemetry: TelemetryClient,
|
|
110
111
|
blockUntilSynced = true,
|
|
111
112
|
): Promise<Archiver> {
|
|
112
|
-
const chain = createEthereumChain(config.
|
|
113
|
+
const chain = createEthereumChain(config.l1RpcUrl, config.l1ChainId);
|
|
113
114
|
const publicClient = createPublicClient({
|
|
114
115
|
chain: chain.chainInfo,
|
|
115
116
|
transport: http(chain.rpcUrl),
|
|
@@ -144,10 +145,21 @@ export class Archiver implements ArchiveSource {
|
|
|
144
145
|
await this.sync(blockUntilSynced);
|
|
145
146
|
}
|
|
146
147
|
|
|
147
|
-
this.runningPromise = new RunningPromise(() => this.
|
|
148
|
+
this.runningPromise = new RunningPromise(() => this.safeSync(), this.pollingIntervalMs);
|
|
148
149
|
this.runningPromise.start();
|
|
149
150
|
}
|
|
150
151
|
|
|
152
|
+
/**
|
|
153
|
+
* Syncs and catches exceptions.
|
|
154
|
+
*/
|
|
155
|
+
private async safeSync() {
|
|
156
|
+
try {
|
|
157
|
+
await this.sync(false);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
this.log.error('Error syncing archiver', error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
151
163
|
/**
|
|
152
164
|
* Fetches logs from L1 contracts and processes them.
|
|
153
165
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
@@ -165,10 +177,14 @@ export class Archiver implements ArchiveSource {
|
|
|
165
177
|
*
|
|
166
178
|
* This code does not handle reorgs.
|
|
167
179
|
*/
|
|
168
|
-
const { blocksSynchedTo, messagesSynchedTo } = await this.store.getSynchPoint();
|
|
180
|
+
const { blockBodiesSynchedTo, blocksSynchedTo, messagesSynchedTo } = await this.store.getSynchPoint();
|
|
169
181
|
const currentL1BlockNumber = await this.publicClient.getBlockNumber();
|
|
170
182
|
|
|
171
|
-
if (
|
|
183
|
+
if (
|
|
184
|
+
currentL1BlockNumber <= blocksSynchedTo &&
|
|
185
|
+
currentL1BlockNumber <= messagesSynchedTo &&
|
|
186
|
+
currentL1BlockNumber <= blockBodiesSynchedTo
|
|
187
|
+
) {
|
|
172
188
|
// chain hasn't moved forward
|
|
173
189
|
// or it's been rolled back
|
|
174
190
|
this.log.debug(`Nothing to sync`, { currentL1BlockNumber, blocksSynchedTo, messagesSynchedTo });
|
|
@@ -219,21 +235,27 @@ export class Archiver implements ArchiveSource {
|
|
|
219
235
|
// Read all data from chain and then write to our stores at the end
|
|
220
236
|
const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
|
|
221
237
|
|
|
238
|
+
this.log.debug(`Retrieving block bodies from ${blockBodiesSynchedTo + 1n} to ${currentL1BlockNumber}`);
|
|
222
239
|
const retrievedBlockBodies = await retrieveBlockBodiesFromAvailabilityOracle(
|
|
223
240
|
this.publicClient,
|
|
224
241
|
this.availabilityOracleAddress,
|
|
225
242
|
blockUntilSynced,
|
|
226
|
-
|
|
243
|
+
blockBodiesSynchedTo + 1n,
|
|
227
244
|
currentL1BlockNumber,
|
|
228
245
|
);
|
|
229
246
|
|
|
230
|
-
|
|
231
|
-
|
|
247
|
+
this.log.debug(
|
|
248
|
+
`Retrieved ${retrievedBlockBodies.retrievedData.length} block bodies up to L1 block ${retrievedBlockBodies.lastProcessedL1BlockNumber}`,
|
|
249
|
+
);
|
|
250
|
+
await this.store.addBlockBodies(retrievedBlockBodies);
|
|
232
251
|
|
|
233
252
|
// Now that we have block bodies we will retrieve block metadata and build L2 blocks from the bodies and
|
|
234
253
|
// the metadata
|
|
235
254
|
let retrievedBlocks: DataRetrieval<L2Block>;
|
|
236
255
|
{
|
|
256
|
+
// @todo @LHerskind Investigate how necessary that nextExpectedL2BlockNum really is.
|
|
257
|
+
// Also, I would expect it to break horribly if we have a reorg.
|
|
258
|
+
this.log.debug(`Retrieving block metadata from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`);
|
|
237
259
|
const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(
|
|
238
260
|
this.publicClient,
|
|
239
261
|
this.rollupAddress,
|
|
@@ -247,15 +269,27 @@ export class Archiver implements ArchiveSource {
|
|
|
247
269
|
([header]) => header.contentCommitment.txsEffectsHash,
|
|
248
270
|
);
|
|
249
271
|
|
|
272
|
+
// @note @LHerskind We will occasionally be hitting this point BEFORE, we have actually retrieved the bodies.
|
|
273
|
+
// The main reason this have not been an issue earlier is because:
|
|
274
|
+
// i) the design previously published the body in one tx and the header in another,
|
|
275
|
+
// which in an anvil auto mine world mean that they are separate blocks.
|
|
276
|
+
// ii) We have been lucky that latency have been small enough to not matter.
|
|
250
277
|
const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
|
|
251
278
|
|
|
252
279
|
if (retrievedBlockMetadata.retrievedData.length !== blockBodiesFromStore.length) {
|
|
253
|
-
|
|
280
|
+
this.log.warn('Block headers length does not equal block bodies length');
|
|
254
281
|
}
|
|
255
282
|
|
|
256
|
-
const blocks =
|
|
257
|
-
|
|
258
|
-
|
|
283
|
+
const blocks: L2Block[] = [];
|
|
284
|
+
for (let i = 0; i < retrievedBlockMetadata.retrievedData.length; i++) {
|
|
285
|
+
const [header, archive] = retrievedBlockMetadata.retrievedData[i];
|
|
286
|
+
const blockBody = blockBodiesFromStore[i];
|
|
287
|
+
if (blockBody) {
|
|
288
|
+
blocks.push(new L2Block(archive, header, blockBody));
|
|
289
|
+
} else {
|
|
290
|
+
this.log.warn(`Block body not found for block ${header.globalVariables.blockNumber.toBigInt()}.`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
259
293
|
|
|
260
294
|
(blocks.length ? this.log.verbose : this.log.debug)(
|
|
261
295
|
`Retrieved ${blocks.length || 'no'} new L2 blocks between L1 blocks ${
|
|
@@ -269,6 +303,12 @@ export class Archiver implements ArchiveSource {
|
|
|
269
303
|
};
|
|
270
304
|
}
|
|
271
305
|
|
|
306
|
+
this.log.debug(
|
|
307
|
+
`Processing retrieved blocks ${retrievedBlocks.retrievedData
|
|
308
|
+
.map(b => b.number)
|
|
309
|
+
.join(',')} with last processed L1 block ${retrievedBlocks.lastProcessedL1BlockNumber}`,
|
|
310
|
+
);
|
|
311
|
+
|
|
272
312
|
await Promise.all(
|
|
273
313
|
retrievedBlocks.retrievedData.map(block => {
|
|
274
314
|
const noteEncryptedLogs = block.body.noteEncryptedLogs;
|
|
@@ -291,8 +331,12 @@ export class Archiver implements ArchiveSource {
|
|
|
291
331
|
);
|
|
292
332
|
|
|
293
333
|
if (retrievedBlocks.retrievedData.length > 0) {
|
|
334
|
+
const timer = new Timer();
|
|
294
335
|
await this.store.addBlocks(retrievedBlocks);
|
|
295
|
-
this.instrumentation.processNewBlocks(
|
|
336
|
+
this.instrumentation.processNewBlocks(
|
|
337
|
+
timer.ms() / retrievedBlocks.retrievedData.length,
|
|
338
|
+
retrievedBlocks.retrievedData,
|
|
339
|
+
);
|
|
296
340
|
const lastL2BlockNumber = retrievedBlocks.retrievedData[retrievedBlocks.retrievedData.length - 1].number;
|
|
297
341
|
this.log.verbose(`Processed ${retrievedBlocks.retrievedData.length} new L2 blocks up to ${lastL2BlockNumber}`);
|
|
298
342
|
}
|
|
@@ -307,20 +351,14 @@ export class Archiver implements ArchiveSource {
|
|
|
307
351
|
}
|
|
308
352
|
|
|
309
353
|
private async updateLastProvenL2Block(fromBlock: bigint, toBlock: bigint) {
|
|
310
|
-
const logs = await this.publicClient.
|
|
311
|
-
address: this.rollupAddress.toString(),
|
|
312
|
-
fromBlock,
|
|
313
|
-
toBlock: toBlock + 1n, // toBlock is exclusive
|
|
314
|
-
strict: true,
|
|
315
|
-
event: getAbiItem({ abi: RollupAbi, name: 'L2ProofVerified' }),
|
|
316
|
-
});
|
|
354
|
+
const logs = await retrieveL2ProofVerifiedEvents(this.publicClient, this.rollupAddress, fromBlock, toBlock);
|
|
317
355
|
|
|
318
356
|
const lastLog = logs[logs.length - 1];
|
|
319
357
|
if (!lastLog) {
|
|
320
358
|
return;
|
|
321
359
|
}
|
|
322
360
|
|
|
323
|
-
const provenBlockNumber = lastLog.
|
|
361
|
+
const provenBlockNumber = lastLog.l2BlockNumber;
|
|
324
362
|
if (!provenBlockNumber) {
|
|
325
363
|
throw new Error(`Missing argument blockNumber from L2ProofVerified event`);
|
|
326
364
|
}
|
|
@@ -329,6 +367,7 @@ export class Archiver implements ArchiveSource {
|
|
|
329
367
|
if (provenBlockNumber > currentProvenBlockNumber) {
|
|
330
368
|
this.log.verbose(`Updated last proven block number from ${currentProvenBlockNumber} to ${provenBlockNumber}`);
|
|
331
369
|
await this.store.setProvenL2BlockNumber(Number(provenBlockNumber));
|
|
370
|
+
this.instrumentation.updateLastProvenBlock(Number(provenBlockNumber));
|
|
332
371
|
}
|
|
333
372
|
}
|
|
334
373
|
|
|
@@ -30,8 +30,10 @@ import { type DataRetrieval } from './data_retrieval.js';
|
|
|
30
30
|
* Represents the latest L1 block processed by the archiver for various objects in L2.
|
|
31
31
|
*/
|
|
32
32
|
export type ArchiverL1SynchPoint = {
|
|
33
|
-
/** Number of the last L1 block that added a new L2 block. */
|
|
33
|
+
/** Number of the last L1 block that added a new L2 block metadata. */
|
|
34
34
|
blocksSynchedTo: bigint;
|
|
35
|
+
/** Number of the last L1 block that added a new L2 block body. */
|
|
36
|
+
blockBodiesSynchedTo: bigint;
|
|
35
37
|
/** Number of the last L1 block that added L1 -> L2 messages from the Inbox. */
|
|
36
38
|
messagesSynchedTo: bigint;
|
|
37
39
|
};
|
|
@@ -53,7 +55,7 @@ export interface ArchiverDataStore {
|
|
|
53
55
|
* @param blockBodies - The L2 block bodies to be added to the store.
|
|
54
56
|
* @returns True if the operation is successful.
|
|
55
57
|
*/
|
|
56
|
-
addBlockBodies(blockBodies: Body
|
|
58
|
+
addBlockBodies(blockBodies: DataRetrieval<Body>): Promise<boolean>;
|
|
57
59
|
|
|
58
60
|
/**
|
|
59
61
|
* Gets block bodies that have the same txsEffectsHashes as we supply.
|
|
@@ -61,7 +63,7 @@ export interface ArchiverDataStore {
|
|
|
61
63
|
* @param txsEffectsHashes - A list of txsEffectsHashes.
|
|
62
64
|
* @returns The requested L2 block bodies
|
|
63
65
|
*/
|
|
64
|
-
getBlockBodies(txsEffectsHashes: Buffer[]): Promise<Body[]>;
|
|
66
|
+
getBlockBodies(txsEffectsHashes: Buffer[]): Promise<(Body | undefined)[]>;
|
|
65
67
|
|
|
66
68
|
/**
|
|
67
69
|
* Gets up to `limit` amount of L2 blocks starting from `from`.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InboxLeaf, L2Block, LogId, LogType, TxHash } from '@aztec/circuit-types';
|
|
1
|
+
import { type Body, InboxLeaf, L2Block, LogId, LogType, TxHash } from '@aztec/circuit-types';
|
|
2
2
|
import '@aztec/circuit-types/jest';
|
|
3
3
|
import { AztecAddress, Fr, INITIAL_L2_BLOCK_NUM, L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/circuits.js';
|
|
4
4
|
import {
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
SerializableContractInstance,
|
|
15
15
|
} from '@aztec/types/contracts';
|
|
16
16
|
|
|
17
|
-
import { type ArchiverDataStore } from './archiver_store.js';
|
|
17
|
+
import { type ArchiverDataStore, type ArchiverL1SynchPoint } from './archiver_store.js';
|
|
18
18
|
import { type DataRetrieval } from './data_retrieval.js';
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -25,6 +25,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
25
25
|
describe(testName, () => {
|
|
26
26
|
let store: ArchiverDataStore;
|
|
27
27
|
let blocks: DataRetrieval<L2Block>;
|
|
28
|
+
let blockBodies: DataRetrieval<Body>;
|
|
28
29
|
const blockTests: [number, number, () => L2Block[]][] = [
|
|
29
30
|
[1, 1, () => blocks.retrievedData.slice(0, 1)],
|
|
30
31
|
[10, 1, () => blocks.retrievedData.slice(9, 10)],
|
|
@@ -39,11 +40,15 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
39
40
|
lastProcessedL1BlockNumber: 5n,
|
|
40
41
|
retrievedData: Array.from({ length: 10 }).map((_, i) => L2Block.random(i + 1)),
|
|
41
42
|
};
|
|
43
|
+
blockBodies = {
|
|
44
|
+
retrievedData: blocks.retrievedData.map(block => block.body),
|
|
45
|
+
lastProcessedL1BlockNumber: 4n,
|
|
46
|
+
};
|
|
42
47
|
});
|
|
43
48
|
|
|
44
49
|
describe('addBlocks', () => {
|
|
45
50
|
it('returns success when adding block bodies', async () => {
|
|
46
|
-
await expect(store.addBlockBodies(
|
|
51
|
+
await expect(store.addBlockBodies(blockBodies)).resolves.toBe(true);
|
|
47
52
|
});
|
|
48
53
|
|
|
49
54
|
it('returns success when adding blocks', async () => {
|
|
@@ -59,7 +64,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
59
64
|
describe('getBlocks', () => {
|
|
60
65
|
beforeEach(async () => {
|
|
61
66
|
await store.addBlocks(blocks);
|
|
62
|
-
await store.addBlockBodies(
|
|
67
|
+
await store.addBlockBodies(blockBodies);
|
|
63
68
|
});
|
|
64
69
|
|
|
65
70
|
it.each(blockTests)('retrieves previously stored blocks', async (start, limit, getExpectedBlocks) => {
|
|
@@ -95,7 +100,8 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
95
100
|
await expect(store.getSynchPoint()).resolves.toEqual({
|
|
96
101
|
blocksSynchedTo: 0n,
|
|
97
102
|
messagesSynchedTo: 0n,
|
|
98
|
-
|
|
103
|
+
blockBodiesSynchedTo: 0n,
|
|
104
|
+
} satisfies ArchiverL1SynchPoint);
|
|
99
105
|
});
|
|
100
106
|
|
|
101
107
|
it('returns the L1 block number in which the most recent L2 block was published', async () => {
|
|
@@ -103,7 +109,17 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
103
109
|
await expect(store.getSynchPoint()).resolves.toEqual({
|
|
104
110
|
blocksSynchedTo: blocks.lastProcessedL1BlockNumber,
|
|
105
111
|
messagesSynchedTo: 0n,
|
|
106
|
-
|
|
112
|
+
blockBodiesSynchedTo: 0n,
|
|
113
|
+
} satisfies ArchiverL1SynchPoint);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('returns the L1 block number in which the most recent L2 block body was published', async () => {
|
|
117
|
+
await store.addBlockBodies(blockBodies);
|
|
118
|
+
await expect(store.getSynchPoint()).resolves.toEqual({
|
|
119
|
+
blocksSynchedTo: 0n,
|
|
120
|
+
messagesSynchedTo: 0n,
|
|
121
|
+
blockBodiesSynchedTo: blockBodies.lastProcessedL1BlockNumber,
|
|
122
|
+
} satisfies ArchiverL1SynchPoint);
|
|
107
123
|
});
|
|
108
124
|
|
|
109
125
|
it('returns the L1 block number that most recently added messages from inbox', async () => {
|
|
@@ -114,7 +130,8 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
114
130
|
await expect(store.getSynchPoint()).resolves.toEqual({
|
|
115
131
|
blocksSynchedTo: 0n,
|
|
116
132
|
messagesSynchedTo: 1n,
|
|
117
|
-
|
|
133
|
+
blockBodiesSynchedTo: 0n,
|
|
134
|
+
} satisfies ArchiverL1SynchPoint);
|
|
118
135
|
});
|
|
119
136
|
});
|
|
120
137
|
|
|
@@ -179,7 +196,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
179
196
|
),
|
|
180
197
|
);
|
|
181
198
|
await store.addBlocks(blocks);
|
|
182
|
-
await store.addBlockBodies(
|
|
199
|
+
await store.addBlockBodies(blockBodies);
|
|
183
200
|
});
|
|
184
201
|
|
|
185
202
|
it.each([
|
|
@@ -335,7 +352,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
335
352
|
};
|
|
336
353
|
|
|
337
354
|
await store.addBlocks(blocks);
|
|
338
|
-
await store.addBlockBodies(
|
|
355
|
+
await store.addBlockBodies(blockBodies);
|
|
339
356
|
|
|
340
357
|
await Promise.all(
|
|
341
358
|
blocks.retrievedData.map(block =>
|
package/src/archiver/config.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type L1ContractAddresses,
|
|
1
|
+
import { type L1ContractAddresses, type L1ReaderConfig, l1ReaderConfigMappings } from '@aztec/ethereum';
|
|
2
|
+
import { type ConfigMappingsType, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* There are 2 polling intervals used in this configuration. The first is the archiver polling interval, archiverPollingIntervalMS.
|
|
@@ -10,27 +11,12 @@ import { type L1ContractAddresses, getL1ContractAddressesFromEnv } from '@aztec/
|
|
|
10
11
|
/**
|
|
11
12
|
* The archiver configuration.
|
|
12
13
|
*/
|
|
13
|
-
export
|
|
14
|
+
export type ArchiverConfig = {
|
|
14
15
|
/**
|
|
15
16
|
* URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.
|
|
16
17
|
*/
|
|
17
18
|
archiverUrl?: string;
|
|
18
19
|
|
|
19
|
-
/**
|
|
20
|
-
* The url of the Ethereum RPC node.
|
|
21
|
-
*/
|
|
22
|
-
rpcUrl: string;
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* The key for the ethereum node.
|
|
26
|
-
*/
|
|
27
|
-
apiKey?: string;
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* The L1 chain's ID
|
|
31
|
-
*/
|
|
32
|
-
l1ChainId: number;
|
|
33
|
-
|
|
34
20
|
/**
|
|
35
21
|
* The polling interval in ms for retrieving new L2 blocks and encrypted logs.
|
|
36
22
|
*/
|
|
@@ -53,7 +39,35 @@ export interface ArchiverConfig {
|
|
|
53
39
|
|
|
54
40
|
/** The max number of logs that can be obtained in 1 "getUnencryptedLogs" call. */
|
|
55
41
|
maxLogs?: number;
|
|
56
|
-
}
|
|
42
|
+
} & L1ReaderConfig;
|
|
43
|
+
|
|
44
|
+
export const archiverConfigMappings: ConfigMappingsType<ArchiverConfig> = {
|
|
45
|
+
archiverUrl: {
|
|
46
|
+
env: 'ARCHIVER_URL',
|
|
47
|
+
description:
|
|
48
|
+
'URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.',
|
|
49
|
+
},
|
|
50
|
+
archiverPollingIntervalMS: {
|
|
51
|
+
env: 'ARCHIVER_POLLING_INTERVAL_MS',
|
|
52
|
+
description: 'The polling interval in ms for retrieving new L2 blocks and encrypted logs.',
|
|
53
|
+
...numberConfigHelper(1000),
|
|
54
|
+
},
|
|
55
|
+
viemPollingIntervalMS: {
|
|
56
|
+
env: 'ARCHIVER_VIEM_POLLING_INTERVAL_MS',
|
|
57
|
+
description: 'The polling interval viem uses in ms',
|
|
58
|
+
...numberConfigHelper(1000),
|
|
59
|
+
},
|
|
60
|
+
dataDirectory: {
|
|
61
|
+
env: 'DATA_DIRECTORY',
|
|
62
|
+
description: 'Optional dir to store data. If omitted will store in memory.',
|
|
63
|
+
},
|
|
64
|
+
maxLogs: {
|
|
65
|
+
env: 'ARCHIVER_MAX_LOGS',
|
|
66
|
+
description: 'The max number of logs that can be obtained in 1 "getUnencryptedLogs" call.',
|
|
67
|
+
...numberConfigHelper(1_000),
|
|
68
|
+
},
|
|
69
|
+
...l1ReaderConfigMappings,
|
|
70
|
+
};
|
|
57
71
|
|
|
58
72
|
/**
|
|
59
73
|
* Returns the archiver configuration from the environment variables.
|
|
@@ -61,23 +75,5 @@ export interface ArchiverConfig {
|
|
|
61
75
|
* @returns The archiver configuration.
|
|
62
76
|
*/
|
|
63
77
|
export function getArchiverConfigFromEnv(): ArchiverConfig {
|
|
64
|
-
|
|
65
|
-
ETHEREUM_HOST,
|
|
66
|
-
L1_CHAIN_ID,
|
|
67
|
-
ARCHIVER_POLLING_INTERVAL_MS,
|
|
68
|
-
ARCHIVER_VIEM_POLLING_INTERVAL_MS,
|
|
69
|
-
API_KEY,
|
|
70
|
-
DATA_DIRECTORY,
|
|
71
|
-
ARCHIVER_URL,
|
|
72
|
-
} = process.env;
|
|
73
|
-
return {
|
|
74
|
-
rpcUrl: ETHEREUM_HOST || '',
|
|
75
|
-
l1ChainId: L1_CHAIN_ID ? +L1_CHAIN_ID : 31337, // 31337 is the default chain id for anvil
|
|
76
|
-
archiverPollingIntervalMS: ARCHIVER_POLLING_INTERVAL_MS ? +ARCHIVER_POLLING_INTERVAL_MS : 1_000,
|
|
77
|
-
viemPollingIntervalMS: ARCHIVER_VIEM_POLLING_INTERVAL_MS ? +ARCHIVER_VIEM_POLLING_INTERVAL_MS : 1_000,
|
|
78
|
-
apiKey: API_KEY,
|
|
79
|
-
l1Contracts: getL1ContractAddressesFromEnv(),
|
|
80
|
-
dataDirectory: DATA_DIRECTORY,
|
|
81
|
-
archiverUrl: ARCHIVER_URL,
|
|
82
|
-
};
|
|
78
|
+
return getConfigFromMappings<ArchiverConfig>(archiverConfigMappings);
|
|
83
79
|
}
|