@aztec/archiver 0.0.1-commit.ee80a48 → 0.0.1-commit.ef17749e1

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 (78) hide show
  1. package/dest/archiver.d.ts +7 -2
  2. package/dest/archiver.d.ts.map +1 -1
  3. package/dest/archiver.js +25 -96
  4. package/dest/factory.d.ts +2 -2
  5. package/dest/factory.d.ts.map +1 -1
  6. package/dest/factory.js +12 -8
  7. package/dest/index.d.ts +2 -1
  8. package/dest/index.d.ts.map +1 -1
  9. package/dest/index.js +1 -0
  10. package/dest/l1/bin/retrieve-calldata.js +36 -33
  11. package/dest/l1/calldata_retriever.d.ts +73 -50
  12. package/dest/l1/calldata_retriever.d.ts.map +1 -1
  13. package/dest/l1/calldata_retriever.js +190 -259
  14. package/dest/l1/data_retrieval.d.ts +9 -9
  15. package/dest/l1/data_retrieval.d.ts.map +1 -1
  16. package/dest/l1/data_retrieval.js +21 -19
  17. package/dest/l1/spire_proposer.d.ts +5 -5
  18. package/dest/l1/spire_proposer.d.ts.map +1 -1
  19. package/dest/l1/spire_proposer.js +9 -17
  20. package/dest/modules/data_source_base.d.ts +8 -3
  21. package/dest/modules/data_source_base.d.ts.map +1 -1
  22. package/dest/modules/data_source_base.js +28 -72
  23. package/dest/modules/data_store_updater.d.ts +13 -3
  24. package/dest/modules/data_store_updater.d.ts.map +1 -1
  25. package/dest/modules/data_store_updater.js +48 -19
  26. package/dest/modules/instrumentation.d.ts +15 -2
  27. package/dest/modules/instrumentation.d.ts.map +1 -1
  28. package/dest/modules/instrumentation.js +19 -2
  29. package/dest/modules/l1_synchronizer.d.ts +5 -8
  30. package/dest/modules/l1_synchronizer.d.ts.map +1 -1
  31. package/dest/modules/l1_synchronizer.js +16 -9
  32. package/dest/store/block_store.d.ts +18 -14
  33. package/dest/store/block_store.d.ts.map +1 -1
  34. package/dest/store/block_store.js +69 -17
  35. package/dest/store/kv_archiver_store.d.ts +18 -4
  36. package/dest/store/kv_archiver_store.d.ts.map +1 -1
  37. package/dest/store/kv_archiver_store.js +18 -0
  38. package/dest/store/l2_tips_cache.d.ts +19 -0
  39. package/dest/store/l2_tips_cache.d.ts.map +1 -0
  40. package/dest/store/l2_tips_cache.js +89 -0
  41. package/dest/store/log_store.d.ts +1 -1
  42. package/dest/store/log_store.d.ts.map +1 -1
  43. package/dest/store/log_store.js +55 -35
  44. package/dest/store/message_store.js +1 -1
  45. package/dest/test/fake_l1_state.d.ts +6 -1
  46. package/dest/test/fake_l1_state.d.ts.map +1 -1
  47. package/dest/test/fake_l1_state.js +56 -18
  48. package/dest/test/mock_archiver.d.ts +1 -1
  49. package/dest/test/mock_archiver.d.ts.map +1 -1
  50. package/dest/test/mock_archiver.js +3 -2
  51. package/dest/test/mock_l2_block_source.d.ts +19 -3
  52. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  53. package/dest/test/mock_l2_block_source.js +128 -82
  54. package/dest/test/mock_structs.d.ts +4 -1
  55. package/dest/test/mock_structs.d.ts.map +1 -1
  56. package/dest/test/mock_structs.js +13 -1
  57. package/package.json +13 -13
  58. package/src/archiver.ts +39 -116
  59. package/src/factory.ts +27 -10
  60. package/src/index.ts +1 -0
  61. package/src/l1/README.md +25 -68
  62. package/src/l1/bin/retrieve-calldata.ts +46 -39
  63. package/src/l1/calldata_retriever.ts +249 -379
  64. package/src/l1/data_retrieval.ts +23 -25
  65. package/src/l1/spire_proposer.ts +7 -15
  66. package/src/modules/data_source_base.ts +53 -92
  67. package/src/modules/data_store_updater.ts +49 -19
  68. package/src/modules/instrumentation.ts +29 -2
  69. package/src/modules/l1_synchronizer.ts +22 -13
  70. package/src/store/block_store.ts +85 -36
  71. package/src/store/kv_archiver_store.ts +35 -3
  72. package/src/store/l2_tips_cache.ts +89 -0
  73. package/src/store/log_store.ts +93 -31
  74. package/src/store/message_store.ts +1 -1
  75. package/src/test/fake_l1_state.ts +75 -17
  76. package/src/test/mock_archiver.ts +3 -2
  77. package/src/test/mock_l2_block_source.ts +164 -78
  78. package/src/test/mock_structs.ts +20 -6
@@ -8,6 +8,7 @@ import { createLogger } from '@aztec/foundation/log';
8
8
  import type { FunctionSelector } from '@aztec/stdlib/abi';
9
9
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
10
10
  import {
11
+ type BlockData,
11
12
  BlockHash,
12
13
  CheckpointedL2Block,
13
14
  L2Block,
@@ -15,9 +16,11 @@ import {
15
16
  type L2Tips,
16
17
  type ValidateCheckpointResult,
17
18
  } from '@aztec/stdlib/block';
18
- import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
19
+ import { Checkpoint, type CheckpointData, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
19
20
  import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
20
21
  import { EmptyL1RollupConstants, type L1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
22
+ import { computeCheckpointOutHash } from '@aztec/stdlib/messaging';
23
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
21
24
  import { type BlockHeader, TxExecutionResult, TxHash, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
22
25
  import type { UInt64 } from '@aztec/stdlib/types';
23
26
 
@@ -26,6 +29,7 @@ import type { UInt64 } from '@aztec/stdlib/types';
26
29
  */
27
30
  export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
28
31
  protected l2Blocks: L2Block[] = [];
32
+ protected checkpointList: Checkpoint[] = [];
29
33
 
30
34
  private provenBlockNumber: number = 0;
31
35
  private finalizedBlockNumber: number = 0;
@@ -33,14 +37,36 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
33
37
 
34
38
  private log = createLogger('archiver:mock_l2_block_source');
35
39
 
40
+ /** Creates blocks grouped into single-block checkpoints. */
36
41
  public async createBlocks(numBlocks: number) {
37
- for (let i = 0; i < numBlocks; i++) {
38
- const blockNum = this.l2Blocks.length + 1;
39
- const block = await L2Block.random(BlockNumber(blockNum), { slotNumber: SlotNumber(blockNum) });
40
- this.l2Blocks.push(block);
42
+ await this.createCheckpoints(numBlocks, 1);
43
+ }
44
+
45
+ public getCheckpointNumber(): Promise<CheckpointNumber> {
46
+ return Promise.resolve(
47
+ this.checkpointList.length === 0 ? CheckpointNumber.ZERO : CheckpointNumber(this.checkpointList.length),
48
+ );
49
+ }
50
+
51
+ /** Creates checkpoints, each containing `blocksPerCheckpoint` blocks. */
52
+ public async createCheckpoints(numCheckpoints: number, blocksPerCheckpoint: number = 1) {
53
+ for (let c = 0; c < numCheckpoints; c++) {
54
+ const checkpointNum = CheckpointNumber(this.checkpointList.length + 1);
55
+ const startBlockNum = this.l2Blocks.length + 1;
56
+ const slotNumber = SlotNumber(Number(checkpointNum));
57
+ const checkpoint = await Checkpoint.random(checkpointNum, {
58
+ numBlocks: blocksPerCheckpoint,
59
+ startBlockNumber: startBlockNum,
60
+ slotNumber,
61
+ checkpointNumber: checkpointNum,
62
+ });
63
+ this.checkpointList.push(checkpoint);
64
+ this.l2Blocks.push(...checkpoint.blocks);
41
65
  }
42
66
 
43
- this.log.verbose(`Created ${numBlocks} blocks in the mock L2 block source`);
67
+ this.log.verbose(
68
+ `Created ${numCheckpoints} checkpoints with ${blocksPerCheckpoint} blocks each in the mock L2 block source`,
69
+ );
44
70
  }
45
71
 
46
72
  public addProposedBlocks(blocks: L2Block[]) {
@@ -50,6 +76,16 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
50
76
 
51
77
  public removeBlocks(numBlocks: number) {
52
78
  this.l2Blocks = this.l2Blocks.slice(0, -numBlocks);
79
+ const maxBlockNum = this.l2Blocks.length;
80
+ // Remove any checkpoint whose last block is beyond the remaining blocks.
81
+ this.checkpointList = this.checkpointList.filter(c => {
82
+ const lastBlockNum = c.blocks[0].number + c.blocks.length - 1;
83
+ return lastBlockNum <= maxBlockNum;
84
+ });
85
+ // Keep tip numbers consistent with remaining blocks.
86
+ this.checkpointedBlockNumber = Math.min(this.checkpointedBlockNumber, maxBlockNum);
87
+ this.provenBlockNumber = Math.min(this.provenBlockNumber, maxBlockNum);
88
+ this.finalizedBlockNumber = Math.min(this.finalizedBlockNumber, maxBlockNum);
53
89
  this.log.verbose(`Removed ${numBlocks} blocks from the mock L2 block source`);
54
90
  }
55
91
 
@@ -65,7 +101,33 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
65
101
  }
66
102
 
67
103
  public setCheckpointedBlockNumber(checkpointedBlockNumber: number) {
104
+ const prevCheckpointed = this.checkpointedBlockNumber;
68
105
  this.checkpointedBlockNumber = checkpointedBlockNumber;
106
+ // Auto-create single-block checkpoints for newly checkpointed blocks that don't have one yet.
107
+ // This handles blocks added via addProposedBlocks that are now being marked as checkpointed.
108
+ const newCheckpoints: Checkpoint[] = [];
109
+ for (let blockNum = prevCheckpointed + 1; blockNum <= checkpointedBlockNumber; blockNum++) {
110
+ const block = this.l2Blocks[blockNum - 1];
111
+ if (!block) {
112
+ continue;
113
+ }
114
+ if (this.checkpointList.some(c => c.blocks.some(b => b.number === block.number))) {
115
+ continue;
116
+ }
117
+ const checkpointNum = CheckpointNumber(this.checkpointList.length + newCheckpoints.length + 1);
118
+ const checkpoint = new Checkpoint(
119
+ block.archive,
120
+ CheckpointHeader.random({ slotNumber: block.header.globalVariables.slotNumber }),
121
+ [block],
122
+ checkpointNum,
123
+ );
124
+ newCheckpoints.push(checkpoint);
125
+ }
126
+ // Insert new checkpoints in order by number.
127
+ if (newCheckpoints.length > 0) {
128
+ this.checkpointList.push(...newCheckpoints);
129
+ this.checkpointList.sort((a, b) => a.number - b.number);
130
+ }
69
131
  }
70
132
 
71
133
  /**
@@ -112,13 +174,7 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
112
174
  if (!block) {
113
175
  return Promise.resolve(undefined);
114
176
  }
115
- const checkpointedBlock = new CheckpointedL2Block(
116
- CheckpointNumber.fromBlockNumber(number),
117
- block,
118
- new L1PublishedData(BigInt(number), BigInt(number), `0x${number.toString(16).padStart(64, '0')}`),
119
- [],
120
- );
121
- return Promise.resolve(checkpointedBlock);
177
+ return Promise.resolve(this.toCheckpointedBlock(block));
122
178
  }
123
179
 
124
180
  public async getCheckpointedBlocks(from: BlockNumber, limit: number): Promise<CheckpointedL2Block[]> {
@@ -167,44 +223,22 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
167
223
  }
168
224
 
169
225
  public getCheckpoints(from: CheckpointNumber, limit: number) {
170
- // TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
171
- const blocks = this.l2Blocks.slice(from - 1, from - 1 + limit);
172
- return Promise.all(
173
- blocks.map(async block => {
174
- // Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
175
- const checkpoint = await Checkpoint.random(block.checkpointNumber, { numBlocks: 1 });
176
- checkpoint.blocks = [block];
177
- return new PublishedCheckpoint(
178
- checkpoint,
179
- new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
180
- [],
181
- );
182
- }),
226
+ const checkpoints = this.checkpointList.slice(from - 1, from - 1 + limit);
227
+ return Promise.resolve(
228
+ checkpoints.map(checkpoint => new PublishedCheckpoint(checkpoint, this.mockL1DataForCheckpoint(checkpoint), [])),
183
229
  );
184
230
  }
185
231
 
186
- public async getCheckpointByArchive(archive: Fr): Promise<Checkpoint | undefined> {
187
- // TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
188
- const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
189
- if (!block) {
190
- return undefined;
191
- }
192
- // Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
193
- const checkpoint = await Checkpoint.random(block.checkpointNumber, { numBlocks: 1 });
194
- checkpoint.blocks = [block];
195
- return checkpoint;
232
+ public getCheckpointByArchive(archive: Fr): Promise<Checkpoint | undefined> {
233
+ const checkpoint = this.checkpointList.find(c => c.archive.root.equals(archive));
234
+ return Promise.resolve(checkpoint);
196
235
  }
197
236
 
198
237
  public async getCheckpointedBlockByHash(blockHash: BlockHash): Promise<CheckpointedL2Block | undefined> {
199
238
  for (const block of this.l2Blocks) {
200
239
  const hash = await block.hash();
201
240
  if (hash.equals(blockHash)) {
202
- return CheckpointedL2Block.fromFields({
203
- checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
204
- block,
205
- l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
206
- attestations: [],
207
- });
241
+ return this.toCheckpointedBlock(block);
208
242
  }
209
243
  }
210
244
  return undefined;
@@ -215,14 +249,7 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
215
249
  if (!block) {
216
250
  return Promise.resolve(undefined);
217
251
  }
218
- return Promise.resolve(
219
- CheckpointedL2Block.fromFields({
220
- checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
221
- block,
222
- l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
223
- attestations: [],
224
- }),
225
- );
252
+ return Promise.resolve(this.toCheckpointedBlock(block));
226
253
  }
227
254
 
228
255
  public async getL2BlockByHash(blockHash: BlockHash): Promise<L2Block | undefined> {
@@ -255,47 +282,69 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
255
282
  return Promise.resolve(block?.header);
256
283
  }
257
284
 
285
+ public async getBlockData(number: BlockNumber): Promise<BlockData | undefined> {
286
+ const block = this.l2Blocks[number - 1];
287
+ if (!block) {
288
+ return undefined;
289
+ }
290
+ return {
291
+ header: block.header,
292
+ archive: block.archive,
293
+ blockHash: await block.hash(),
294
+ checkpointNumber: block.checkpointNumber,
295
+ indexWithinCheckpoint: block.indexWithinCheckpoint,
296
+ };
297
+ }
298
+
299
+ public async getBlockDataByArchive(archive: Fr): Promise<BlockData | undefined> {
300
+ const block = this.l2Blocks.find(b => b.archive.root.equals(archive));
301
+ if (!block) {
302
+ return undefined;
303
+ }
304
+ return {
305
+ header: block.header,
306
+ archive: block.archive,
307
+ blockHash: await block.hash(),
308
+ checkpointNumber: block.checkpointNumber,
309
+ indexWithinCheckpoint: block.indexWithinCheckpoint,
310
+ };
311
+ }
312
+
258
313
  getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined> {
259
314
  return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
260
315
  }
261
316
 
262
317
  getCheckpointsForEpoch(epochNumber: EpochNumber): Promise<Checkpoint[]> {
263
- // TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
264
- const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
265
- const [start, end] = getSlotRangeForEpoch(epochNumber, { epochDuration });
266
- const blocks = this.l2Blocks.filter(b => {
267
- const slot = b.header.globalVariables.slotNumber;
268
- return slot >= start && slot <= end;
269
- });
270
- // Create checkpoints from blocks - manually construct since L2Block doesn't have toCheckpoint()
271
- return Promise.all(
272
- blocks.map(async block => {
273
- const checkpoint = await Checkpoint.random(block.checkpointNumber, { numBlocks: 1 });
274
- checkpoint.blocks = [block];
275
- return checkpoint;
276
- }),
277
- );
318
+ return Promise.resolve(this.getCheckpointsInEpoch(epochNumber));
278
319
  }
279
320
 
280
- getCheckpointedBlocksForEpoch(epochNumber: EpochNumber): Promise<CheckpointedL2Block[]> {
281
- const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
282
- const [start, end] = getSlotRangeForEpoch(epochNumber, { epochDuration });
283
- const blocks = this.l2Blocks.filter(b => {
284
- const slot = b.header.globalVariables.slotNumber;
285
- return slot >= start && slot <= end;
286
- });
321
+ getCheckpointsDataForEpoch(epochNumber: EpochNumber): Promise<CheckpointData[]> {
322
+ const checkpoints = this.getCheckpointsInEpoch(epochNumber);
287
323
  return Promise.resolve(
288
- blocks.map(block =>
289
- CheckpointedL2Block.fromFields({
290
- checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
291
- block,
292
- l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
324
+ checkpoints.map(
325
+ (checkpoint): CheckpointData => ({
326
+ checkpointNumber: checkpoint.number,
327
+ header: checkpoint.header,
328
+ archive: checkpoint.archive,
329
+ checkpointOutHash: computeCheckpointOutHash(
330
+ checkpoint.blocks.map(b => b.body.txEffects.map(tx => tx.l2ToL1Msgs)),
331
+ ),
332
+ startBlock: checkpoint.blocks[0].number,
333
+ blockCount: checkpoint.blocks.length,
293
334
  attestations: [],
335
+ l1: this.mockL1DataForCheckpoint(checkpoint),
294
336
  }),
295
337
  ),
296
338
  );
297
339
  }
298
340
 
341
+ getCheckpointedBlocksForEpoch(epochNumber: EpochNumber): Promise<CheckpointedL2Block[]> {
342
+ const checkpoints = this.getCheckpointsInEpoch(epochNumber);
343
+ return Promise.resolve(
344
+ checkpoints.flatMap(checkpoint => checkpoint.blocks.map(block => this.toCheckpointedBlock(block))),
345
+ );
346
+ }
347
+
299
348
  getBlocksForSlot(slotNumber: SlotNumber): Promise<L2Block[]> {
300
349
  const blocks = this.l2Blocks.filter(b => b.header.globalVariables.slotNumber === slotNumber);
301
350
  return Promise.resolve(blocks);
@@ -384,7 +433,10 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
384
433
 
385
434
  const makeTipId = (blockId: typeof latestBlockId) => ({
386
435
  block: blockId,
387
- checkpoint: { number: CheckpointNumber.fromBlockNumber(blockId.number), hash: blockId.hash },
436
+ checkpoint: {
437
+ number: this.findCheckpointNumberForBlock(blockId.number) ?? CheckpointNumber(0),
438
+ hash: blockId.hash,
439
+ },
388
440
  });
389
441
 
390
442
  return {
@@ -472,4 +524,38 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
472
524
  getPendingChainValidationStatus(): Promise<ValidateCheckpointResult> {
473
525
  return Promise.resolve({ valid: true });
474
526
  }
527
+
528
+ /** Returns checkpoints whose slot falls within the given epoch. */
529
+ private getCheckpointsInEpoch(epochNumber: EpochNumber): Checkpoint[] {
530
+ const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
531
+ const [start, end] = getSlotRangeForEpoch(epochNumber, { epochDuration });
532
+ return this.checkpointList.filter(c => c.header.slotNumber >= start && c.header.slotNumber <= end);
533
+ }
534
+
535
+ /** Creates a mock L1PublishedData for a checkpoint. */
536
+ private mockL1DataForCheckpoint(checkpoint: Checkpoint): L1PublishedData {
537
+ return new L1PublishedData(BigInt(checkpoint.number), BigInt(checkpoint.number), Buffer32.random().toString());
538
+ }
539
+
540
+ /** Creates a CheckpointedL2Block from a block using stored checkpoint info. */
541
+ private toCheckpointedBlock(block: L2Block): CheckpointedL2Block {
542
+ const checkpoint = this.checkpointList.find(c => c.blocks.some(b => b.number === block.number));
543
+ const checkpointNumber = checkpoint?.number ?? block.checkpointNumber;
544
+ return new CheckpointedL2Block(
545
+ checkpointNumber,
546
+ block,
547
+ new L1PublishedData(
548
+ BigInt(block.number),
549
+ BigInt(block.number),
550
+ `0x${block.number.toString(16).padStart(64, '0')}`,
551
+ ),
552
+ [],
553
+ );
554
+ }
555
+
556
+ /** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */
557
+ private findCheckpointNumberForBlock(blockNumber: BlockNumber): CheckpointNumber | undefined {
558
+ const checkpoint = this.checkpointList.find(c => c.blocks.some(b => b.number === blockNumber));
559
+ return checkpoint?.number;
560
+ }
475
561
  }
@@ -127,6 +127,25 @@ export function makeL1PublishedData(l1BlockNumber: number): L1PublishedData {
127
127
  return new L1PublishedData(BigInt(l1BlockNumber), BigInt(l1BlockNumber * 1000), makeBlockHash(l1BlockNumber));
128
128
  }
129
129
 
130
+ /** Creates a Checkpoint from a list of blocks with a header that matches the blocks' structure. */
131
+ export function makeCheckpoint(blocks: L2Block[], checkpointNumber = CheckpointNumber(1)): Checkpoint {
132
+ const firstBlock = blocks[0];
133
+ const { slotNumber, timestamp, coinbase, feeRecipient, gasFees } = firstBlock.header.globalVariables;
134
+ return new Checkpoint(
135
+ blocks.at(-1)!.archive,
136
+ CheckpointHeader.random({
137
+ lastArchiveRoot: firstBlock.header.lastArchive.root,
138
+ slotNumber,
139
+ timestamp,
140
+ coinbase,
141
+ feeRecipient,
142
+ gasFees,
143
+ }),
144
+ blocks,
145
+ checkpointNumber,
146
+ );
147
+ }
148
+
130
149
  /** Wraps a Checkpoint with L1 published data and random attestations. */
131
150
  export function makePublishedCheckpoint(
132
151
  checkpoint: Checkpoint,
@@ -301,11 +320,6 @@ export async function makeCheckpointWithLogs(
301
320
  return txEffect;
302
321
  });
303
322
 
304
- const checkpoint = new Checkpoint(
305
- AppendOnlyTreeSnapshot.random(),
306
- CheckpointHeader.random(),
307
- [block],
308
- CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)),
309
- );
323
+ const checkpoint = makeCheckpoint([block], CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)));
310
324
  return makePublishedCheckpoint(checkpoint, blockNumber);
311
325
  }