@aztec/archiver 0.0.1-commit.cb6bed7c2 → 0.0.1-commit.cbf2c2d5d

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 (65) hide show
  1. package/dest/archiver.d.ts +3 -6
  2. package/dest/archiver.d.ts.map +1 -1
  3. package/dest/archiver.js +51 -18
  4. package/dest/config.d.ts +3 -3
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +2 -1
  7. package/dest/errors.d.ts +21 -9
  8. package/dest/errors.d.ts.map +1 -1
  9. package/dest/errors.js +27 -14
  10. package/dest/factory.d.ts +3 -4
  11. package/dest/factory.d.ts.map +1 -1
  12. package/dest/factory.js +19 -18
  13. package/dest/modules/data_source_base.d.ts +5 -5
  14. package/dest/modules/data_source_base.d.ts.map +1 -1
  15. package/dest/modules/data_source_base.js +5 -5
  16. package/dest/modules/data_store_updater.d.ts +12 -10
  17. package/dest/modules/data_store_updater.d.ts.map +1 -1
  18. package/dest/modules/data_store_updater.js +69 -76
  19. package/dest/modules/l1_synchronizer.d.ts +2 -2
  20. package/dest/modules/l1_synchronizer.d.ts.map +1 -1
  21. package/dest/modules/l1_synchronizer.js +34 -6
  22. package/dest/store/block_store.d.ts +12 -13
  23. package/dest/store/block_store.d.ts.map +1 -1
  24. package/dest/store/block_store.js +61 -61
  25. package/dest/store/contract_class_store.d.ts +2 -3
  26. package/dest/store/contract_class_store.d.ts.map +1 -1
  27. package/dest/store/contract_class_store.js +7 -67
  28. package/dest/store/contract_instance_store.d.ts +1 -1
  29. package/dest/store/contract_instance_store.d.ts.map +1 -1
  30. package/dest/store/contract_instance_store.js +6 -2
  31. package/dest/store/kv_archiver_store.d.ts +28 -18
  32. package/dest/store/kv_archiver_store.d.ts.map +1 -1
  33. package/dest/store/kv_archiver_store.js +34 -21
  34. package/dest/store/log_store.d.ts +6 -3
  35. package/dest/store/log_store.d.ts.map +1 -1
  36. package/dest/store/log_store.js +93 -16
  37. package/dest/store/message_store.d.ts +5 -1
  38. package/dest/store/message_store.d.ts.map +1 -1
  39. package/dest/store/message_store.js +13 -0
  40. package/dest/test/fake_l1_state.d.ts +8 -1
  41. package/dest/test/fake_l1_state.d.ts.map +1 -1
  42. package/dest/test/fake_l1_state.js +39 -5
  43. package/dest/test/mock_l2_block_source.d.ts +3 -3
  44. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  45. package/dest/test/mock_l2_block_source.js +4 -4
  46. package/dest/test/noop_l1_archiver.d.ts +4 -1
  47. package/dest/test/noop_l1_archiver.d.ts.map +1 -1
  48. package/dest/test/noop_l1_archiver.js +5 -1
  49. package/package.json +13 -13
  50. package/src/archiver.ts +53 -19
  51. package/src/config.ts +8 -1
  52. package/src/errors.ts +40 -24
  53. package/src/factory.ts +19 -14
  54. package/src/modules/data_source_base.ts +11 -6
  55. package/src/modules/data_store_updater.ts +77 -106
  56. package/src/modules/l1_synchronizer.ts +40 -12
  57. package/src/store/block_store.ts +72 -69
  58. package/src/store/contract_class_store.ts +8 -106
  59. package/src/store/contract_instance_store.ts +8 -5
  60. package/src/store/kv_archiver_store.ts +43 -32
  61. package/src/store/log_store.ts +126 -27
  62. package/src/store/message_store.ts +19 -0
  63. package/src/test/fake_l1_state.ts +50 -9
  64. package/src/test/mock_l2_block_source.ts +9 -3
  65. package/src/test/noop_l1_archiver.ts +7 -1
@@ -1,5 +1,6 @@
1
1
  import type { BlobClientInterface } from '@aztec/blob-client/client';
2
2
  import { type Blob, getBlobsPerL1Block, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
3
+ import { INITIAL_CHECKPOINT_NUMBER } from '@aztec/constants';
3
4
  import type { CheckpointProposedLog, InboxContract, MessageSentLog, RollupContract } from '@aztec/ethereum/contracts';
4
5
  import { MULTI_CALL_3_ADDRESS } from '@aztec/ethereum/contracts';
5
6
  import type { ViemPublicClient } from '@aztec/ethereum/types';
@@ -150,8 +151,12 @@ export class FakeL1State {
150
151
  // Computed from checkpoints based on L1 block visibility
151
152
  private pendingCheckpointNumber: CheckpointNumber = CheckpointNumber(0);
152
153
 
154
+ // The L1 block number reported as "finalized" (defaults to the start block)
155
+ private finalizedL1BlockNumber: bigint;
156
+
153
157
  constructor(private readonly config: FakeL1StateConfig) {
154
158
  this.l1BlockNumber = config.l1StartBlock;
159
+ this.finalizedL1BlockNumber = config.l1StartBlock;
155
160
  this.lastArchive = new AppendOnlyTreeSnapshot(config.genesisArchiveRoot, 1);
156
161
  }
157
162
 
@@ -283,11 +288,30 @@ export class FakeL1State {
283
288
  this.updatePendingCheckpointNumber();
284
289
  }
285
290
 
291
+ /** Sets the L1 block number that will be reported as "finalized". */
292
+ setFinalizedL1BlockNumber(blockNumber: bigint): void {
293
+ this.finalizedL1BlockNumber = blockNumber;
294
+ }
295
+
286
296
  /** Marks a checkpoint as proven. Updates provenCheckpointNumber. */
287
297
  markCheckpointAsProven(checkpointNumber: CheckpointNumber): void {
288
298
  this.provenCheckpointNumber = checkpointNumber;
289
299
  }
290
300
 
301
+ /**
302
+ * Simulates what `rollup.getProvenCheckpointNumber({ blockNumber: atL1Block })` would return.
303
+ */
304
+ getProvenCheckpointNumberAtL1Block(atL1Block: bigint): CheckpointNumber {
305
+ if (this.provenCheckpointNumber === 0) {
306
+ return CheckpointNumber(0);
307
+ }
308
+ const checkpoint = this.checkpoints.find(cp => cp.checkpointNumber === this.provenCheckpointNumber);
309
+ if (checkpoint && checkpoint.l1BlockNumber <= atL1Block) {
310
+ return this.provenCheckpointNumber;
311
+ }
312
+ return CheckpointNumber(0);
313
+ }
314
+
291
315
  /** Sets the target committee size for attestation validation. */
292
316
  setTargetCommitteeSize(size: number): void {
293
317
  this.targetCommitteeSize = size;
@@ -406,6 +430,11 @@ export class FakeL1State {
406
430
  });
407
431
  });
408
432
 
433
+ mockRollup.getProvenCheckpointNumber.mockImplementation((options?: { blockNumber?: bigint }) => {
434
+ const atBlock = options?.blockNumber ?? this.l1BlockNumber;
435
+ return Promise.resolve(this.getProvenCheckpointNumberAtL1Block(atBlock));
436
+ });
437
+
409
438
  mockRollup.canPruneAtTime.mockImplementation(() => Promise.resolve(this.canPruneResult));
410
439
 
411
440
  // Mock the wrapper method for fetching checkpoint events
@@ -422,13 +451,22 @@ export class FakeL1State {
422
451
  createMockInboxContract(_publicClient: MockProxy<ViemPublicClient>): MockProxy<InboxContract> {
423
452
  const mockInbox = mock<InboxContract>();
424
453
 
425
- mockInbox.getState.mockImplementation(() =>
426
- Promise.resolve({
454
+ mockInbox.getState.mockImplementation(() => {
455
+ // treeInProgress must be > any sealed checkpoint. On L1, a checkpoint can only be proposed
456
+ // after its messages are sealed, so treeInProgress > checkpointNumber for all published checkpoints.
457
+ const maxFromMessages =
458
+ this.messages.length > 0 ? Math.max(...this.messages.map(m => Number(m.checkpointNumber))) + 1 : 0;
459
+ const maxFromCheckpoints =
460
+ this.checkpoints.length > 0
461
+ ? Math.max(...this.checkpoints.filter(cp => !cp.pruned).map(cp => Number(cp.checkpointNumber))) + 1
462
+ : 0;
463
+ const treeInProgress = Math.max(maxFromMessages, maxFromCheckpoints, INITIAL_CHECKPOINT_NUMBER);
464
+ return Promise.resolve({
427
465
  messagesRollingHash: this.messagesRollingHash,
428
466
  totalMessagesInserted: BigInt(this.messages.length),
429
- treeInProgress: 0n,
430
- }),
431
- );
467
+ treeInProgress: BigInt(treeInProgress),
468
+ });
469
+ });
432
470
 
433
471
  // Mock the wrapper methods for fetching message events
434
472
  mockInbox.getMessageSentEvents.mockImplementation((fromBlock: bigint, toBlock: bigint) =>
@@ -449,10 +487,13 @@ export class FakeL1State {
449
487
  publicClient.getChainId.mockResolvedValue(1);
450
488
  publicClient.getBlockNumber.mockImplementation(() => Promise.resolve(this.l1BlockNumber));
451
489
 
452
- // Use async function pattern that existing test uses for getBlock
453
-
454
- publicClient.getBlock.mockImplementation((async (args: { blockNumber?: bigint } = {}) => {
455
- const blockNum = args.blockNumber ?? (await publicClient.getBlockNumber());
490
+ publicClient.getBlock.mockImplementation((async (args: { blockNumber?: bigint; blockTag?: string } = {}) => {
491
+ let blockNum: bigint;
492
+ if (args.blockTag === 'finalized') {
493
+ blockNum = this.finalizedL1BlockNumber;
494
+ } else {
495
+ blockNum = args.blockNumber ?? (await publicClient.getBlockNumber());
496
+ }
456
497
  return {
457
498
  number: blockNum,
458
499
  timestamp: BigInt(blockNum) * BigInt(this.config.ethereumSlotDuration) + this.config.l1GenesisTime,
@@ -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 { EmptyL1RollupConstants, type L1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
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
- getL2EpochNumber(): Promise<EpochNumber> {
456
+ getSyncedL2EpochNumber(): Promise<EpochNumber> {
451
457
  throw new Error('Method not implemented.');
452
458
  }
453
459
 
454
- getL2SlotNumber(): Promise<SlotNumber> {
460
+ getSyncedL2SlotNumber(): Promise<SlotNumber> {
455
461
  throw new Error('Method not implemented.');
456
462
  }
457
463
 
@@ -1,6 +1,7 @@
1
1
  import type { BlobClientInterface } from '@aztec/blob-client/client';
2
2
  import type { RollupContract } from '@aztec/ethereum/contracts';
3
3
  import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
4
+ import { SlotNumber } from '@aztec/foundation/branded-types';
4
5
  import { Buffer32 } from '@aztec/foundation/buffer';
5
6
  import { Fr } from '@aztec/foundation/curves/bn254';
6
7
  import { EthAddress } from '@aztec/foundation/eth-address';
@@ -30,7 +31,7 @@ class NoopL1Synchronizer implements FunctionsOf<ArchiverL1Synchronizer> {
30
31
  return 0n;
31
32
  }
32
33
  getL1Timestamp(): bigint | undefined {
33
- return 0n;
34
+ return undefined;
34
35
  }
35
36
  testEthereumNodeSynced(): Promise<void> {
36
37
  return Promise.resolve();
@@ -96,6 +97,11 @@ export class NoopL1Archiver extends Archiver {
96
97
  this.runningPromise.start();
97
98
  return Promise.resolve();
98
99
  }
100
+
101
+ /** Always reports as fully synced since there is no real L1 to sync from. */
102
+ public override getSyncedL2SlotNumber(): Promise<SlotNumber | undefined> {
103
+ return Promise.resolve(SlotNumber(Number.MAX_SAFE_INTEGER));
104
+ }
99
105
  }
100
106
 
101
107
  /** Creates an archiver with mocked L1 connectivity for testing. */