@aztec/archiver 4.1.0-rc.2 → 4.1.0-rc.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.
- package/dest/archiver.d.ts +3 -5
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +28 -7
- package/dest/modules/data_source_base.d.ts +3 -3
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +1 -1
- package/dest/modules/data_store_updater.js +2 -2
- package/dest/modules/l1_synchronizer.d.ts +1 -2
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +1 -1
- package/dest/store/block_store.d.ts +5 -5
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +10 -7
- package/dest/store/kv_archiver_store.d.ts +2 -2
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +2 -2
- package/dest/store/log_store.d.ts +1 -1
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +48 -10
- package/dest/test/mock_l2_block_source.d.ts +3 -3
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +4 -4
- package/dest/test/noop_l1_archiver.d.ts +4 -1
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +5 -1
- package/package.json +13 -13
- package/src/archiver.ts +27 -10
- package/src/modules/data_source_base.ts +3 -3
- package/src/modules/data_store_updater.ts +2 -2
- package/src/modules/l1_synchronizer.ts +1 -2
- package/src/store/block_store.ts +14 -6
- package/src/store/kv_archiver_store.ts +5 -2
- package/src/store/log_store.ts +66 -12
- package/src/test/mock_l2_block_source.ts +9 -3
- package/src/test/noop_l1_archiver.ts +7 -1
package/dest/store/log_store.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
-
import { filterAsync } from '@aztec/foundation/collection';
|
|
3
|
+
import { compactArray, filterAsync } from '@aztec/foundation/collection';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize';
|
|
@@ -192,14 +192,34 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
192
192
|
}
|
|
193
193
|
deleteLogs(blocks) {
|
|
194
194
|
return this.db.transactionAsync(async ()=>{
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
195
|
+
const blockNumbers = new Set(blocks.map((block)=>block.number));
|
|
196
|
+
const firstBlockToDelete = Math.min(...blockNumbers);
|
|
197
|
+
// Collect all unique private tags across all blocks being deleted
|
|
198
|
+
const allPrivateTags = new Set(compactArray(await Promise.all(blocks.map((block)=>this.#privateLogKeysByBlock.getAsync(block.number)))).flat());
|
|
199
|
+
// Trim private logs: for each tag, delete all instances including and after the first block being deleted.
|
|
200
|
+
// This hinges on the invariant that logs for a given tag are always inserted in order of block number, which is enforced in #addPrivateLogs.
|
|
201
|
+
for (const tag of allPrivateTags){
|
|
202
|
+
const existing = await this.#privateLogsByTag.getAsync(tag);
|
|
203
|
+
if (existing === undefined || existing.length === 0) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const lastIndexToKeep = existing.findLastIndex((buf)=>TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete);
|
|
207
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
208
|
+
await (remaining.length > 0 ? this.#privateLogsByTag.set(tag, remaining) : this.#privateLogsByTag.delete(tag));
|
|
209
|
+
}
|
|
210
|
+
// Collect all unique public keys across all blocks being deleted
|
|
211
|
+
const allPublicKeys = new Set(compactArray(await Promise.all(blocks.map((block)=>this.#publicLogKeysByBlock.getAsync(block.number)))).flat());
|
|
212
|
+
// And do the same as we did with private logs
|
|
213
|
+
for (const key of allPublicKeys){
|
|
214
|
+
const existing = await this.#publicLogsByContractAndTag.getAsync(key);
|
|
215
|
+
if (existing === undefined || existing.length === 0) {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
const lastIndexToKeep = existing.findLastIndex((buf)=>TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete);
|
|
219
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
220
|
+
await (remaining.length > 0 ? this.#publicLogsByContractAndTag.set(key, remaining) : this.#publicLogsByContractAndTag.delete(key));
|
|
221
|
+
}
|
|
222
|
+
// After trimming the tagged logs, we can delete the block-level keys that track which tags are in which blocks.
|
|
203
223
|
await Promise.all(blocks.map((block)=>Promise.all([
|
|
204
224
|
this.#publicLogsByBlock.delete(block.number),
|
|
205
225
|
this.#privateLogKeysByBlock.delete(block.number),
|
|
@@ -424,11 +444,20 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
424
444
|
};
|
|
425
445
|
}
|
|
426
446
|
#accumulatePublicLogs(results, blockNumber, blockHash, txIndex, txHash, txLogs, filter = {}) {
|
|
447
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
427
456
|
let maxLogsHit = false;
|
|
428
457
|
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
429
458
|
for(; logIndex < txLogs.length; logIndex++){
|
|
430
459
|
const log = txLogs[logIndex];
|
|
431
|
-
if (!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) {
|
|
460
|
+
if ((!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) && (!filter.tag || log.fields[0]?.equals(filter.tag))) {
|
|
432
461
|
results.push(new ExtendedPublicLog(new LogId(BlockNumber(blockNumber), blockHash, txHash, txIndex, logIndex), log));
|
|
433
462
|
if (results.length >= this.#logsMaxPageSize) {
|
|
434
463
|
maxLogsHit = true;
|
|
@@ -439,6 +468,15 @@ import { TxHash } from '@aztec/stdlib/tx';
|
|
|
439
468
|
return maxLogsHit;
|
|
440
469
|
}
|
|
441
470
|
#accumulateContractClassLogs(results, blockNumber, blockHash, txIndex, txHash, txLogs, filter = {}) {
|
|
471
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
475
|
+
return false;
|
|
476
|
+
}
|
|
477
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
442
480
|
let maxLogsHit = false;
|
|
443
481
|
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
444
482
|
for(; logIndex < txLogs.length; logIndex++){
|
|
@@ -102,8 +102,8 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
102
102
|
*/
|
|
103
103
|
getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
|
|
104
104
|
getL2Tips(): Promise<L2Tips>;
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
getSyncedL2EpochNumber(): Promise<EpochNumber>;
|
|
106
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber>;
|
|
107
107
|
isEpochComplete(_epochNumber: EpochNumber): Promise<boolean>;
|
|
108
108
|
getL1Constants(): Promise<L1RollupConstants>;
|
|
109
109
|
getGenesisValues(): Promise<{
|
|
@@ -138,4 +138,4 @@ export declare class MockL2BlockSource implements L2BlockSource, ContractDataSou
|
|
|
138
138
|
/** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */
|
|
139
139
|
private findCheckpointNumberForBlock;
|
|
140
140
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19sMl9ibG9ja19zb3VyY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L21vY2tfbDJfYmxvY2tfc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxTQUFTLEVBQ2QsU0FBUyxFQUNULG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsS0FBSyxhQUFhLEVBQ2xCLEtBQUssTUFBTSxFQUNYLEtBQUssd0JBQXdCLEVBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLGNBQWMsRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNqSCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ILE9BQU8sRUFFTCxLQUFLLGlCQUFpQixFQUd2QixNQUFNLDZCQUE2QixDQUFDO0FBR3JDLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BHLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxEOztHQUVHO0FBQ0gscUJBQWEsaUJBQWtCLFlBQVcsYUFBYSxFQUFFLGtCQUFrQjtJQUN6RSxT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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEzG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,KAAK,SAAS,EACd,SAAS,EACT,mBAAmB,EACnB,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAmB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACnH,OAAO,
|
|
1
|
+
{"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
7
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
8
|
import { CheckpointedL2Block } from '@aztec/stdlib/block';
|
|
9
9
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
10
|
-
import { EmptyL1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
10
|
+
import { EmptyL1RollupConstants, getEpochAtSlot, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
11
11
|
import { computeCheckpointOutHash } from '@aztec/stdlib/messaging';
|
|
12
12
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
13
13
|
import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
@@ -308,7 +308,7 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
308
308
|
for (const txEffect of block.body.txEffects){
|
|
309
309
|
if (txEffect.txHash.equals(txHash)) {
|
|
310
310
|
// In mock, assume all txs are checkpointed with successful execution
|
|
311
|
-
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), await block.hash(), block.number);
|
|
311
|
+
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), await block.hash(), block.number, getEpochAtSlot(block.slot, EmptyL1RollupConstants));
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
}
|
|
@@ -355,10 +355,10 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
355
355
|
finalized: makeTipId(finalizedBlockId)
|
|
356
356
|
};
|
|
357
357
|
}
|
|
358
|
-
|
|
358
|
+
getSyncedL2EpochNumber() {
|
|
359
359
|
throw new Error('Method not implemented.');
|
|
360
360
|
}
|
|
361
|
-
|
|
361
|
+
getSyncedL2SlotNumber() {
|
|
362
362
|
throw new Error('Method not implemented.');
|
|
363
363
|
}
|
|
364
364
|
isEpochComplete(_epochNumber) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
3
4
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -15,9 +16,11 @@ export declare class NoopL1Archiver extends Archiver {
|
|
|
15
16
|
}, instrumentation: ArchiverInstrumentation);
|
|
16
17
|
/** Override start to skip L1 validation checks. */
|
|
17
18
|
start(_blockUntilSynced?: boolean): Promise<void>;
|
|
19
|
+
/** Always reports as fully synced since there is no real L1 to sync from. */
|
|
20
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
18
21
|
}
|
|
19
22
|
/** Creates an archiver with mocked L1 connectivity for testing. */
|
|
20
23
|
export declare function createNoopL1Archiver(dataStore: KVArchiverDataStore, l1Constants: L1RollupConstants & {
|
|
21
24
|
genesisArchiveRoot: Fr;
|
|
22
25
|
}, telemetry?: TelemetryClient): Promise<NoopL1Archiver>;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcF9sMV9hcmNoaXZlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qvbm9vcF9sMV9hcmNoaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSXBELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFtQyxNQUFNLHlCQUF5QixDQUFDO0FBS2hHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBeUJ6RTs7OztHQUlHO0FBQ0gscUJBQWEsY0FBZSxTQUFRLFFBQVE7SUFDMUMsWUFDRSxTQUFTLEVBQUUsbUJBQW1CLEVBQzlCLFdBQVcsRUFBRSxpQkFBaUIsR0FBRztRQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQTtLQUFFLEVBQzNELGVBQWUsRUFBRSx1QkFBdUIsRUF1Q3pDO0lBRUQsbURBQW1EO0lBQ25DLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSWhFO0lBRUQsNkVBQTZFO0lBQzdELHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBRXZFO0NBQ0Y7QUFFRCxtRUFBbUU7QUFDbkUsd0JBQXNCLG9CQUFvQixDQUN4QyxTQUFTLEVBQUUsbUJBQW1CLEVBQzlCLFdBQVcsRUFBRSxpQkFBaUIsR0FBRztJQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQTtDQUFFLEVBQzNELFNBQVMsR0FBRSxlQUFzQyxHQUNoRCxPQUFPLENBQUMsY0FBYyxDQUFDLENBR3pCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noop_l1_archiver.d.ts","sourceRoot":"","sources":["../../src/test/noop_l1_archiver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"noop_l1_archiver.d.ts","sourceRoot":"","sources":["../../src/test/noop_l1_archiver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAmC,MAAM,yBAAyB,CAAC;AAKhG,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAyBzE;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,YACE,SAAS,EAAE,mBAAmB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;QAAE,kBAAkB,EAAE,EAAE,CAAA;KAAE,EAC3D,eAAe,EAAE,uBAAuB,EAuCzC;IAED,mDAAmD;IACnC,KAAK,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;IAED,6EAA6E;IAC7D,qBAAqB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEvE;CACF;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,mBAAmB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;IAAE,kBAAkB,EAAE,EAAE,CAAA;CAAE,EAC3D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,cAAc,CAAC,CAGzB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
2
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
4
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -15,7 +16,7 @@ import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
|
15
16
|
return 0n;
|
|
16
17
|
}
|
|
17
18
|
getL1Timestamp() {
|
|
18
|
-
return
|
|
19
|
+
return undefined;
|
|
19
20
|
}
|
|
20
21
|
testEthereumNodeSynced() {
|
|
21
22
|
return Promise.resolve();
|
|
@@ -61,6 +62,9 @@ import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
|
61
62
|
this.runningPromise.start();
|
|
62
63
|
return Promise.resolve();
|
|
63
64
|
}
|
|
65
|
+
/** Always reports as fully synced since there is no real L1 to sync from. */ getSyncedL2SlotNumber() {
|
|
66
|
+
return Promise.resolve(SlotNumber(Number.MAX_SAFE_INTEGER));
|
|
67
|
+
}
|
|
64
68
|
}
|
|
65
69
|
/** Creates an archiver with mocked L1 connectivity for testing. */ export async function createNoopL1Archiver(dataStore, l1Constants, telemetry = getTelemetryClient()) {
|
|
66
70
|
const instrumentation = await ArchiverInstrumentation.new(telemetry, ()=>dataStore.estimateSize());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "4.1.0-rc.
|
|
3
|
+
"version": "4.1.0-rc.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -65,18 +65,18 @@
|
|
|
65
65
|
]
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@aztec/blob-client": "4.1.0-rc.
|
|
69
|
-
"@aztec/blob-lib": "4.1.0-rc.
|
|
70
|
-
"@aztec/constants": "4.1.0-rc.
|
|
71
|
-
"@aztec/epoch-cache": "4.1.0-rc.
|
|
72
|
-
"@aztec/ethereum": "4.1.0-rc.
|
|
73
|
-
"@aztec/foundation": "4.1.0-rc.
|
|
74
|
-
"@aztec/kv-store": "4.1.0-rc.
|
|
75
|
-
"@aztec/l1-artifacts": "4.1.0-rc.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "4.1.0-rc.
|
|
77
|
-
"@aztec/protocol-contracts": "4.1.0-rc.
|
|
78
|
-
"@aztec/stdlib": "4.1.0-rc.
|
|
79
|
-
"@aztec/telemetry-client": "4.1.0-rc.
|
|
68
|
+
"@aztec/blob-client": "4.1.0-rc.4",
|
|
69
|
+
"@aztec/blob-lib": "4.1.0-rc.4",
|
|
70
|
+
"@aztec/constants": "4.1.0-rc.4",
|
|
71
|
+
"@aztec/epoch-cache": "4.1.0-rc.4",
|
|
72
|
+
"@aztec/ethereum": "4.1.0-rc.4",
|
|
73
|
+
"@aztec/foundation": "4.1.0-rc.4",
|
|
74
|
+
"@aztec/kv-store": "4.1.0-rc.4",
|
|
75
|
+
"@aztec/l1-artifacts": "4.1.0-rc.4",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "4.1.0-rc.4",
|
|
77
|
+
"@aztec/protocol-contracts": "4.1.0-rc.4",
|
|
78
|
+
"@aztec/stdlib": "4.1.0-rc.4",
|
|
79
|
+
"@aztec/telemetry-client": "4.1.0-rc.4",
|
|
80
80
|
"lodash.groupby": "^4.6.0",
|
|
81
81
|
"lodash.omit": "^4.5.0",
|
|
82
82
|
"tslib": "^2.5.0",
|
package/src/archiver.ts
CHANGED
|
@@ -22,9 +22,8 @@ import {
|
|
|
22
22
|
import { PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
23
23
|
import {
|
|
24
24
|
type L1RollupConstants,
|
|
25
|
-
|
|
25
|
+
getEpochAtSlot,
|
|
26
26
|
getSlotAtNextL1Block,
|
|
27
|
-
getSlotAtTimestamp,
|
|
28
27
|
getSlotRangeForEpoch,
|
|
29
28
|
getTimestampRangeForEpoch,
|
|
30
29
|
} from '@aztec/stdlib/epoch-helpers';
|
|
@@ -123,7 +122,6 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
123
122
|
protected override readonly l1Constants: L1RollupConstants & {
|
|
124
123
|
l1StartBlockHash: Buffer32;
|
|
125
124
|
genesisArchiveRoot: Fr;
|
|
126
|
-
rollupManaLimit?: number;
|
|
127
125
|
},
|
|
128
126
|
synchronizer: ArchiverL1Synchronizer,
|
|
129
127
|
events: ArchiverEmitter,
|
|
@@ -339,16 +337,35 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
339
337
|
return Promise.resolve(this.synchronizer.getL1Timestamp());
|
|
340
338
|
}
|
|
341
339
|
|
|
342
|
-
public
|
|
340
|
+
public getSyncedL2SlotNumber(): Promise<SlotNumber | undefined> {
|
|
343
341
|
const l1Timestamp = this.synchronizer.getL1Timestamp();
|
|
344
|
-
|
|
342
|
+
if (l1Timestamp === undefined) {
|
|
343
|
+
return Promise.resolve(undefined);
|
|
344
|
+
}
|
|
345
|
+
// The synced slot is the last L2 slot whose all L1 blocks have been processed.
|
|
346
|
+
// If the next L1 block (at l1Timestamp + ethereumSlotDuration) falls in slot N,
|
|
347
|
+
// then we've fully synced slot N-1.
|
|
348
|
+
const nextL1BlockSlot = getSlotAtNextL1Block(l1Timestamp, this.l1Constants);
|
|
349
|
+
if (Number(nextL1BlockSlot) === 0) {
|
|
350
|
+
return Promise.resolve(undefined);
|
|
351
|
+
}
|
|
352
|
+
return Promise.resolve(SlotNumber(nextL1BlockSlot - 1));
|
|
345
353
|
}
|
|
346
354
|
|
|
347
|
-
public
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
355
|
+
public async getSyncedL2EpochNumber(): Promise<EpochNumber | undefined> {
|
|
356
|
+
const syncedSlot = await this.getSyncedL2SlotNumber();
|
|
357
|
+
if (syncedSlot === undefined) {
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
360
|
+
// An epoch is fully synced when all its slots are synced.
|
|
361
|
+
// We check if syncedSlot is the last slot of its epoch; if so, that epoch is fully synced.
|
|
362
|
+
// Otherwise, only the previous epoch is fully synced.
|
|
363
|
+
const epoch = getEpochAtSlot(syncedSlot, this.l1Constants);
|
|
364
|
+
const [, endSlot] = getSlotRangeForEpoch(epoch, this.l1Constants);
|
|
365
|
+
if (syncedSlot >= endSlot) {
|
|
366
|
+
return epoch;
|
|
367
|
+
}
|
|
368
|
+
return Number(epoch) > 0 ? EpochNumber(Number(epoch) - 1) : undefined;
|
|
352
369
|
}
|
|
353
370
|
|
|
354
371
|
public async isEpochComplete(epochNumber: EpochNumber): Promise<boolean> {
|
|
@@ -46,9 +46,9 @@ export abstract class ArchiverDataSourceBase
|
|
|
46
46
|
|
|
47
47
|
abstract getL2Tips(): Promise<L2Tips>;
|
|
48
48
|
|
|
49
|
-
abstract
|
|
49
|
+
abstract getSyncedL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
50
50
|
|
|
51
|
-
abstract
|
|
51
|
+
abstract getSyncedL2EpochNumber(): Promise<EpochNumber | undefined>;
|
|
52
52
|
|
|
53
53
|
abstract isEpochComplete(epochNumber: EpochNumber): Promise<boolean>;
|
|
54
54
|
|
|
@@ -154,7 +154,7 @@ export abstract class ArchiverDataSourceBase
|
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
public getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined> {
|
|
157
|
-
return this.store.getSettledTxReceipt(txHash);
|
|
157
|
+
return this.store.getSettledTxReceipt(txHash, this.l1Constants);
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
public isPendingChainInvalid(): Promise<boolean> {
|
|
@@ -178,7 +178,7 @@ export class ArchiverDataStoreUpdater {
|
|
|
178
178
|
this.log.verbose(`Block number ${blockNumber} already inserted and matches checkpoint`, blockInfos);
|
|
179
179
|
lastAlreadyInsertedBlockNumber = blockNumber;
|
|
180
180
|
} else {
|
|
181
|
-
this.log.
|
|
181
|
+
this.log.info(`Conflict detected at block ${blockNumber} between checkpointed and local block`, blockInfos);
|
|
182
182
|
const prunedBlocks = await this.removeBlocksAfter(BlockNumber(blockNumber - 1));
|
|
183
183
|
return { prunedBlocks, lastAlreadyInsertedBlockNumber };
|
|
184
184
|
}
|
|
@@ -446,7 +446,7 @@ export class ArchiverDataStoreUpdater {
|
|
|
446
446
|
if (validFnCount > 0) {
|
|
447
447
|
this.log.verbose(`Storing ${validFnCount} functions for contract class ${contractClassId.toString()}`);
|
|
448
448
|
}
|
|
449
|
-
|
|
449
|
+
await this.store.addFunctions(contractClassId, validPrivateFns, validUtilityFns);
|
|
450
450
|
}
|
|
451
451
|
return true;
|
|
452
452
|
}
|
|
@@ -72,7 +72,6 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
72
72
|
private readonly l1Constants: L1RollupConstants & {
|
|
73
73
|
l1StartBlockHash: Buffer32;
|
|
74
74
|
genesisArchiveRoot: Fr;
|
|
75
|
-
rollupManaLimit?: number;
|
|
76
75
|
},
|
|
77
76
|
private readonly events: ArchiverEmitter,
|
|
78
77
|
tracer: Tracer,
|
|
@@ -820,7 +819,7 @@ export class ArchiverL1Synchronizer implements Traceable {
|
|
|
820
819
|
const prunedCheckpointNumber = result.prunedBlocks[0].checkpointNumber;
|
|
821
820
|
const prunedSlotNumber = result.prunedBlocks[0].header.globalVariables.slotNumber;
|
|
822
821
|
|
|
823
|
-
this.log.
|
|
822
|
+
this.log.info(
|
|
824
823
|
`Pruned ${result.prunedBlocks.length} mismatching blocks for checkpoint ${prunedCheckpointNumber}`,
|
|
825
824
|
{ prunedBlocks: result.prunedBlocks.map(b => b.toBlockInfo()), prunedSlotNumber, prunedCheckpointNumber },
|
|
826
825
|
);
|
package/src/store/block_store.ts
CHANGED
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
serializeValidateCheckpointResult,
|
|
21
21
|
} from '@aztec/stdlib/block';
|
|
22
22
|
import { type CheckpointData, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
23
|
-
import type
|
|
23
|
+
import { type L1RollupConstants, getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
24
24
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
25
25
|
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
26
26
|
import {
|
|
@@ -130,14 +130,14 @@ export class BlockStore {
|
|
|
130
130
|
|
|
131
131
|
/**
|
|
132
132
|
* Computes the finalized block number based on the proven block number.
|
|
133
|
-
*
|
|
133
|
+
* We approximate finalization as 2 epochs worth of checkpoints behind the proven block.
|
|
134
|
+
* Each checkpoint is assumed to contain 4 blocks, so the lookback is epochDuration * 2 * 4 blocks.
|
|
134
135
|
* TODO(#13569): Compute proper finalized block number based on L1 finalized block.
|
|
135
|
-
* TODO(palla/mbps): Even the provisional computation is wrong, since it should subtract checkpoints, not blocks
|
|
136
136
|
* @returns The finalized block number.
|
|
137
137
|
*/
|
|
138
138
|
async getFinalizedL2BlockNumber(): Promise<BlockNumber> {
|
|
139
139
|
const provenBlockNumber = await this.getProvenBlockNumber();
|
|
140
|
-
return BlockNumber(Math.max(provenBlockNumber - this.l1Constants.epochDuration * 2, 0));
|
|
140
|
+
return BlockNumber(Math.max(provenBlockNumber - this.l1Constants.epochDuration * 2 * 4, 0));
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
/**
|
|
@@ -871,7 +871,10 @@ export class BlockStore {
|
|
|
871
871
|
* @param txHash - The hash of a tx we try to get the receipt for.
|
|
872
872
|
* @returns The requested tx receipt (or undefined if not found).
|
|
873
873
|
*/
|
|
874
|
-
async getSettledTxReceipt(
|
|
874
|
+
async getSettledTxReceipt(
|
|
875
|
+
txHash: TxHash,
|
|
876
|
+
l1Constants?: Pick<L1RollupConstants, 'epochDuration'>,
|
|
877
|
+
): Promise<TxReceipt | undefined> {
|
|
875
878
|
const txEffect = await this.getTxEffect(txHash);
|
|
876
879
|
if (!txEffect) {
|
|
877
880
|
return undefined;
|
|
@@ -880,10 +883,11 @@ export class BlockStore {
|
|
|
880
883
|
const blockNumber = BlockNumber(txEffect.l2BlockNumber);
|
|
881
884
|
|
|
882
885
|
// Use existing archiver methods to determine finalization level
|
|
883
|
-
const [provenBlockNumber, checkpointedBlockNumber, finalizedBlockNumber] = await Promise.all([
|
|
886
|
+
const [provenBlockNumber, checkpointedBlockNumber, finalizedBlockNumber, blockData] = await Promise.all([
|
|
884
887
|
this.getProvenBlockNumber(),
|
|
885
888
|
this.getCheckpointedL2BlockNumber(),
|
|
886
889
|
this.getFinalizedL2BlockNumber(),
|
|
890
|
+
this.getBlockData(blockNumber),
|
|
887
891
|
]);
|
|
888
892
|
|
|
889
893
|
let status: TxStatus;
|
|
@@ -897,6 +901,9 @@ export class BlockStore {
|
|
|
897
901
|
status = TxStatus.PROPOSED;
|
|
898
902
|
}
|
|
899
903
|
|
|
904
|
+
const epochNumber =
|
|
905
|
+
blockData && l1Constants ? getEpochAtSlot(blockData.header.globalVariables.slotNumber, l1Constants) : undefined;
|
|
906
|
+
|
|
900
907
|
return new TxReceipt(
|
|
901
908
|
txHash,
|
|
902
909
|
status,
|
|
@@ -905,6 +912,7 @@ export class BlockStore {
|
|
|
905
912
|
txEffect.data.transactionFee.toBigInt(),
|
|
906
913
|
txEffect.l2BlockHash,
|
|
907
914
|
blockNumber,
|
|
915
|
+
epochNumber,
|
|
908
916
|
);
|
|
909
917
|
}
|
|
910
918
|
|
|
@@ -410,8 +410,11 @@ export class KVArchiverDataStore implements ContractDataSource {
|
|
|
410
410
|
* @param txHash - The hash of a tx we try to get the receipt for.
|
|
411
411
|
* @returns The requested tx receipt (or undefined if not found).
|
|
412
412
|
*/
|
|
413
|
-
getSettledTxReceipt(
|
|
414
|
-
|
|
413
|
+
getSettledTxReceipt(
|
|
414
|
+
txHash: TxHash,
|
|
415
|
+
l1Constants?: Pick<L1RollupConstants, 'epochDuration'>,
|
|
416
|
+
): Promise<TxReceipt | undefined> {
|
|
417
|
+
return this.#blockStore.getSettledTxReceipt(txHash, l1Constants);
|
|
415
418
|
}
|
|
416
419
|
|
|
417
420
|
/**
|
package/src/store/log_store.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
-
import { filterAsync } from '@aztec/foundation/collection';
|
|
3
|
+
import { compactArray, filterAsync } from '@aztec/foundation/collection';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize';
|
|
@@ -290,18 +290,49 @@ export class LogStore {
|
|
|
290
290
|
|
|
291
291
|
deleteLogs(blocks: L2Block[]): Promise<boolean> {
|
|
292
292
|
return this.db.transactionAsync(async () => {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
// Delete public logs
|
|
300
|
-
const publicKeys = (await this.#publicLogKeysByBlock.getAsync(block.number)) ?? [];
|
|
301
|
-
await Promise.all(publicKeys.map(key => this.#publicLogsByContractAndTag.delete(key)));
|
|
302
|
-
}),
|
|
293
|
+
const blockNumbers = new Set(blocks.map(block => block.number));
|
|
294
|
+
const firstBlockToDelete = Math.min(...blockNumbers);
|
|
295
|
+
|
|
296
|
+
// Collect all unique private tags across all blocks being deleted
|
|
297
|
+
const allPrivateTags = new Set(
|
|
298
|
+
compactArray(await Promise.all(blocks.map(block => this.#privateLogKeysByBlock.getAsync(block.number)))).flat(),
|
|
303
299
|
);
|
|
304
300
|
|
|
301
|
+
// Trim private logs: for each tag, delete all instances including and after the first block being deleted.
|
|
302
|
+
// This hinges on the invariant that logs for a given tag are always inserted in order of block number, which is enforced in #addPrivateLogs.
|
|
303
|
+
for (const tag of allPrivateTags) {
|
|
304
|
+
const existing = await this.#privateLogsByTag.getAsync(tag);
|
|
305
|
+
if (existing === undefined || existing.length === 0) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
const lastIndexToKeep = existing.findLastIndex(
|
|
309
|
+
buf => TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete,
|
|
310
|
+
);
|
|
311
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
312
|
+
await (remaining.length > 0 ? this.#privateLogsByTag.set(tag, remaining) : this.#privateLogsByTag.delete(tag));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Collect all unique public keys across all blocks being deleted
|
|
316
|
+
const allPublicKeys = new Set(
|
|
317
|
+
compactArray(await Promise.all(blocks.map(block => this.#publicLogKeysByBlock.getAsync(block.number)))).flat(),
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
// And do the same as we did with private logs
|
|
321
|
+
for (const key of allPublicKeys) {
|
|
322
|
+
const existing = await this.#publicLogsByContractAndTag.getAsync(key);
|
|
323
|
+
if (existing === undefined || existing.length === 0) {
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
const lastIndexToKeep = existing.findLastIndex(
|
|
327
|
+
buf => TxScopedL2Log.getBlockNumberFromBuffer(buf) < firstBlockToDelete,
|
|
328
|
+
);
|
|
329
|
+
const remaining = existing.slice(0, lastIndexToKeep + 1);
|
|
330
|
+
await (remaining.length > 0
|
|
331
|
+
? this.#publicLogsByContractAndTag.set(key, remaining)
|
|
332
|
+
: this.#publicLogsByContractAndTag.delete(key));
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// After trimming the tagged logs, we can delete the block-level keys that track which tags are in which blocks.
|
|
305
336
|
await Promise.all(
|
|
306
337
|
blocks.map(block =>
|
|
307
338
|
Promise.all([
|
|
@@ -588,11 +619,24 @@ export class LogStore {
|
|
|
588
619
|
txLogs: PublicLog[],
|
|
589
620
|
filter: LogFilter = {},
|
|
590
621
|
): boolean {
|
|
622
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
623
|
+
return false;
|
|
624
|
+
}
|
|
625
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
626
|
+
return false;
|
|
627
|
+
}
|
|
628
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
629
|
+
return false;
|
|
630
|
+
}
|
|
631
|
+
|
|
591
632
|
let maxLogsHit = false;
|
|
592
633
|
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
593
634
|
for (; logIndex < txLogs.length; logIndex++) {
|
|
594
635
|
const log = txLogs[logIndex];
|
|
595
|
-
if (
|
|
636
|
+
if (
|
|
637
|
+
(!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) &&
|
|
638
|
+
(!filter.tag || log.fields[0]?.equals(filter.tag))
|
|
639
|
+
) {
|
|
596
640
|
results.push(
|
|
597
641
|
new ExtendedPublicLog(new LogId(BlockNumber(blockNumber), blockHash, txHash, txIndex, logIndex), log),
|
|
598
642
|
);
|
|
@@ -616,6 +660,16 @@ export class LogStore {
|
|
|
616
660
|
txLogs: ContractClassLog[],
|
|
617
661
|
filter: LogFilter = {},
|
|
618
662
|
): boolean {
|
|
663
|
+
if (filter.fromBlock && blockNumber < filter.fromBlock) {
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
if (filter.toBlock && blockNumber >= filter.toBlock) {
|
|
667
|
+
return false;
|
|
668
|
+
}
|
|
669
|
+
if (filter.txHash && !txHash.equals(filter.txHash)) {
|
|
670
|
+
return false;
|
|
671
|
+
}
|
|
672
|
+
|
|
619
673
|
let maxLogsHit = false;
|
|
620
674
|
let logIndex = typeof filter.afterLog?.logIndex === 'number' ? filter.afterLog.logIndex + 1 : 0;
|
|
621
675
|
for (; logIndex < txLogs.length; logIndex++) {
|
|
@@ -18,7 +18,12 @@ import {
|
|
|
18
18
|
} from '@aztec/stdlib/block';
|
|
19
19
|
import { Checkpoint, type CheckpointData, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
20
20
|
import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
EmptyL1RollupConstants,
|
|
23
|
+
type L1RollupConstants,
|
|
24
|
+
getEpochAtSlot,
|
|
25
|
+
getSlotRangeForEpoch,
|
|
26
|
+
} from '@aztec/stdlib/epoch-helpers';
|
|
22
27
|
import { computeCheckpointOutHash } from '@aztec/stdlib/messaging';
|
|
23
28
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
24
29
|
import { type BlockHeader, TxExecutionResult, TxHash, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
@@ -394,6 +399,7 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
|
|
|
394
399
|
txEffect.transactionFee.toBigInt(),
|
|
395
400
|
await block.hash(),
|
|
396
401
|
block.number,
|
|
402
|
+
getEpochAtSlot(block.slot, EmptyL1RollupConstants),
|
|
397
403
|
);
|
|
398
404
|
}
|
|
399
405
|
}
|
|
@@ -447,11 +453,11 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
|
|
|
447
453
|
};
|
|
448
454
|
}
|
|
449
455
|
|
|
450
|
-
|
|
456
|
+
getSyncedL2EpochNumber(): Promise<EpochNumber> {
|
|
451
457
|
throw new Error('Method not implemented.');
|
|
452
458
|
}
|
|
453
459
|
|
|
454
|
-
|
|
460
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber> {
|
|
455
461
|
throw new Error('Method not implemented.');
|
|
456
462
|
}
|
|
457
463
|
|