@aztec/sequencer-client 3.0.0-nightly.20251221 → 3.0.0-nightly.20251223

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 (79) hide show
  1. package/dest/client/sequencer-client.d.ts +9 -8
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +28 -24
  4. package/dest/config.d.ts +7 -1
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +63 -26
  7. package/dest/global_variable_builder/global_builder.d.ts +16 -8
  8. package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
  9. package/dest/global_variable_builder/global_builder.js +35 -26
  10. package/dest/index.d.ts +2 -2
  11. package/dest/index.d.ts.map +1 -1
  12. package/dest/index.js +1 -1
  13. package/dest/publisher/config.d.ts +3 -3
  14. package/dest/publisher/config.d.ts.map +1 -1
  15. package/dest/publisher/config.js +2 -2
  16. package/dest/publisher/sequencer-publisher-factory.d.ts +3 -3
  17. package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
  18. package/dest/publisher/sequencer-publisher-factory.js +1 -1
  19. package/dest/publisher/sequencer-publisher-metrics.d.ts +3 -3
  20. package/dest/publisher/sequencer-publisher-metrics.d.ts.map +1 -1
  21. package/dest/publisher/sequencer-publisher.d.ts +11 -24
  22. package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
  23. package/dest/publisher/sequencer-publisher.js +50 -62
  24. package/dest/sequencer/block_builder.d.ts +1 -3
  25. package/dest/sequencer/block_builder.d.ts.map +1 -1
  26. package/dest/sequencer/block_builder.js +4 -2
  27. package/dest/sequencer/checkpoint_builder.d.ts +63 -0
  28. package/dest/sequencer/checkpoint_builder.d.ts.map +1 -0
  29. package/dest/sequencer/checkpoint_builder.js +131 -0
  30. package/dest/sequencer/checkpoint_proposal_job.d.ts +73 -0
  31. package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -0
  32. package/dest/sequencer/checkpoint_proposal_job.js +638 -0
  33. package/dest/sequencer/checkpoint_voter.d.ts +34 -0
  34. package/dest/sequencer/checkpoint_voter.d.ts.map +1 -0
  35. package/dest/sequencer/checkpoint_voter.js +85 -0
  36. package/dest/sequencer/events.d.ts +46 -0
  37. package/dest/sequencer/events.d.ts.map +1 -0
  38. package/dest/sequencer/events.js +1 -0
  39. package/dest/sequencer/index.d.ts +5 -1
  40. package/dest/sequencer/index.d.ts.map +1 -1
  41. package/dest/sequencer/index.js +4 -0
  42. package/dest/sequencer/metrics.d.ts +3 -1
  43. package/dest/sequencer/metrics.d.ts.map +1 -1
  44. package/dest/sequencer/metrics.js +9 -0
  45. package/dest/sequencer/sequencer.d.ts +87 -127
  46. package/dest/sequencer/sequencer.d.ts.map +1 -1
  47. package/dest/sequencer/sequencer.js +179 -596
  48. package/dest/sequencer/timetable.d.ts +33 -13
  49. package/dest/sequencer/timetable.d.ts.map +1 -1
  50. package/dest/sequencer/timetable.js +73 -39
  51. package/dest/sequencer/types.d.ts +3 -0
  52. package/dest/sequencer/types.d.ts.map +1 -0
  53. package/dest/sequencer/types.js +1 -0
  54. package/dest/sequencer/utils.d.ts +14 -8
  55. package/dest/sequencer/utils.d.ts.map +1 -1
  56. package/dest/sequencer/utils.js +7 -4
  57. package/dest/test/index.d.ts +3 -1
  58. package/dest/test/index.d.ts.map +1 -1
  59. package/package.json +27 -27
  60. package/src/client/sequencer-client.ts +24 -31
  61. package/src/config.ts +68 -25
  62. package/src/global_variable_builder/global_builder.ts +45 -39
  63. package/src/index.ts +2 -0
  64. package/src/publisher/config.ts +3 -3
  65. package/src/publisher/sequencer-publisher-factory.ts +3 -3
  66. package/src/publisher/sequencer-publisher-metrics.ts +2 -2
  67. package/src/publisher/sequencer-publisher.ts +71 -74
  68. package/src/sequencer/block_builder.ts +4 -1
  69. package/src/sequencer/checkpoint_builder.ts +217 -0
  70. package/src/sequencer/checkpoint_proposal_job.ts +701 -0
  71. package/src/sequencer/checkpoint_voter.ts +105 -0
  72. package/src/sequencer/events.ts +27 -0
  73. package/src/sequencer/index.ts +4 -0
  74. package/src/sequencer/metrics.ts +11 -0
  75. package/src/sequencer/sequencer.ts +275 -804
  76. package/src/sequencer/timetable.ts +84 -49
  77. package/src/sequencer/types.ts +6 -0
  78. package/src/sequencer/utils.ts +18 -9
  79. package/src/test/index.ts +2 -0
@@ -1,5 +1,8 @@
1
1
  import type { SequencerMetrics } from './metrics.js';
2
2
  import { SequencerState } from './utils.js';
3
+ export declare const MIN_EXECUTION_TIME = 1;
4
+ export declare const CHECKPOINT_INITIALIZATION_TIME = 1;
5
+ export declare const CHECKPOINT_FINALIZATION_TIME = 1;
3
6
  export declare class SequencerTimetable {
4
7
  private readonly metrics?;
5
8
  private readonly log;
@@ -15,36 +18,53 @@ export declare class SequencerTimetable {
15
18
  * we can just post in the very last second of the L1 slot and still expect the tx to be accepted.
16
19
  */
17
20
  readonly l1PublishingTime: number;
18
- /** What's the minimum time we want to leave available for execution and reexecution (used to derive init deadline) */
21
+ /**
22
+ * What's the minimum time we want to leave available for execution and reexecution (used to derive init deadline)
23
+ * Defaults to half of the block duration if set, otherwise a constant.
24
+ */
19
25
  readonly minExecutionTime: number;
20
26
  /** How long it takes to get ready to start building */
21
- readonly blockPrepareTime: number;
27
+ readonly checkpointInitializationTime: number;
22
28
  /** How long it takes to for proposals and attestations to travel across the p2p layer (one-way) */
23
- readonly attestationPropagationTime: number;
24
- /** How much time we spend validating and processing a block after building it, and assembling the proposal to send to attestors */
25
- readonly blockValidationTime: number;
29
+ readonly p2pPropagationTime: number;
30
+ /** How much time we spend validating and processing a checkpoint after building it */
31
+ readonly checkpointFinalizationTime: number;
26
32
  /** Ethereum slot duration in seconds */
27
33
  readonly ethereumSlotDuration: number;
28
34
  /** Aztec slot duration in seconds (must be multiple of ethereum slot duration) */
29
35
  readonly aztecSlotDuration: number;
30
- /** How late into an L1 slot we can send a tx to make sure it gets included in the immediate next block. Complement of l1PublishingTime. */
31
- readonly maxL1TxInclusionTimeIntoSlot: number;
32
36
  /** Whether assertTimeLeft will throw if not enough time. */
33
37
  readonly enforce: boolean;
38
+ /** Duration per block when building multiple blocks per slot (undefined = single block per slot) */
39
+ readonly blockDuration: number | undefined;
34
40
  constructor(opts: {
35
41
  ethereumSlotDuration: number;
36
42
  aztecSlotDuration: number;
37
- maxL1TxInclusionTimeIntoSlot: number;
38
- attestationPropagationTime?: number;
43
+ l1PublishingTime: number;
44
+ p2pPropagationTime?: number;
45
+ blockDurationMs?: number;
39
46
  enforce: boolean;
40
47
  }, metrics?: SequencerMetrics | undefined, log?: import("@aztec/aztec.js/log").Logger);
41
- private get afterBlockBuildingTimeNeededWithoutReexec();
42
- getBlockProposalExecTimeEnd(secondsIntoSlot: number): number;
43
- private get afterBlockReexecTimeNeeded();
48
+ /** Deadline for a block proposal execution. Ensures we have enough time left for reexecution and publishing. */
49
+ getProposerExecTimeEnd(secondsIntoSlot: number): number;
50
+ /** Deadline for block proposal reexecution. Ensures the proposer has enough time for publishing. */
44
51
  getValidatorReexecTimeEnd(secondsIntoSlot?: number): number;
45
52
  getMaxAllowedTime(state: Extract<SequencerState, SequencerState.STOPPED | SequencerState.IDLE | SequencerState.SYNCHRONIZING>): undefined;
46
53
  getMaxAllowedTime(state: Exclude<SequencerState, SequencerState.STOPPED | SequencerState.IDLE | SequencerState.SYNCHRONIZING>): number;
47
54
  getMaxAllowedTime(state: SequencerState): number | undefined;
48
55
  assertTimeLeft(newState: SequencerState, secondsIntoSlot: number): void;
56
+ /**
57
+ * Get timing information for building blocks within a slot.
58
+ * @param secondsIntoSlot - Current seconds into the slot
59
+ * @returns Object containing:
60
+ * - canStart: boolean - Whether there's time to start a block now
61
+ * - deadline: number - Deadline (seconds into slot) for building the block
62
+ * - isLastBlock: boolean - Whether the next block would be the last one in the checkpoint
63
+ */
64
+ canStartNextBlock(secondsIntoSlot: number): {
65
+ canStart: boolean;
66
+ deadline: number | undefined;
67
+ isLastBlock: boolean;
68
+ };
49
69
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3RpbWV0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTTVDLHFCQUFhLGtCQUFrQjtJQStDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBL0N0Qjs7OztPQUlHO0lBQ0gsU0FBZ0Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0lBRTNDOzs7O09BSUc7SUFDSCxTQUFnQixnQkFBZ0IsU0FBQztJQUVqQyxzSEFBc0g7SUFDdEgsU0FBZ0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFzQjtJQUU5RCx1REFBdUQ7SUFDdkQsU0FBZ0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFzQjtJQUU5RCxtR0FBbUc7SUFDbkcsU0FBZ0IsMEJBQTBCLEVBQUUsTUFBTSxDQUFDO0lBRW5ELG1JQUFtSTtJQUNuSSxTQUFnQixtQkFBbUIsRUFBRSxNQUFNLENBQXlCO0lBRXBFLHdDQUF3QztJQUN4QyxTQUFnQixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFFN0Msa0ZBQWtGO0lBQ2xGLFNBQWdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUUxQywySUFBMkk7SUFDM0ksU0FBZ0IsNEJBQTRCLEVBQUUsTUFBTSxDQUFDO0lBRXJELDREQUE0RDtJQUM1RCxTQUFnQixPQUFPLEVBQUUsT0FBTyxDQUFDO0lBRWpDLFlBQ0UsSUFBSSxFQUFFO1FBQ0osb0JBQW9CLEVBQUUsTUFBTSxDQUFDO1FBQzdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUMxQiw0QkFBNEIsRUFBRSxNQUFNLENBQUM7UUFDckMsMEJBQTBCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDcEMsT0FBTyxFQUFFLE9BQU8sQ0FBQztLQUNsQixFQUNnQixPQUFPLENBQUMsOEJBQWtCLEVBQzFCLEdBQUcsdUNBQXNDLEVBNkMzRDtJQUVELE9BQU8sS0FBSyx5Q0FBeUMsR0FFcEQ7SUFFTSwyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FhbEU7SUFFRCxPQUFPLEtBQUssMEJBQTBCLEdBRXJDO0lBRU0seUJBQXlCLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FRakU7SUFFTSxpQkFBaUIsQ0FDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FDMUcsU0FBUyxDQUFDO0lBQ04saUJBQWlCLENBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQzFHLE1BQU0sQ0FBQztJQUNILGlCQUFpQixDQUFDLEtBQUssRUFBRSxjQUFjLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQXdCN0QsY0FBYyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sUUFpQnRFO0NBQ0YifQ==
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3RpbWV0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTVDLGVBQU8sTUFBTSxrQkFBa0IsSUFBSSxDQUFDO0FBQ3BDLGVBQU8sTUFBTSw4QkFBOEIsSUFBSSxDQUFDO0FBQ2hELGVBQU8sTUFBTSw0QkFBNEIsSUFBSSxDQUFDO0FBRTlDLHFCQUFhLGtCQUFrQjtJQW1EM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBbkR0Qjs7OztPQUlHO0lBQ0gsU0FBZ0Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0lBRTNDOzs7O09BSUc7SUFDSCxTQUFnQixnQkFBZ0IsRUFBRSxNQUFNLENBQUM7SUFFekM7OztPQUdHO0lBQ0gsU0FBZ0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFzQjtJQUU5RCx1REFBdUQ7SUFDdkQsU0FBZ0IsNEJBQTRCLEVBQUUsTUFBTSxDQUFrQztJQUV0RixtR0FBbUc7SUFDbkcsU0FBZ0Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0lBRTNDLHNGQUFzRjtJQUN0RixTQUFnQiwwQkFBMEIsRUFBRSxNQUFNLENBQWdDO0lBRWxGLHdDQUF3QztJQUN4QyxTQUFnQixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFFN0Msa0ZBQWtGO0lBQ2xGLFNBQWdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUUxQyw0REFBNEQ7SUFDNUQsU0FBZ0IsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUVqQyxvR0FBb0c7SUFDcEcsU0FBZ0IsYUFBYSxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFFbEQsWUFDRSxJQUFJLEVBQUU7UUFDSixvQkFBb0IsRUFBRSxNQUFNLENBQUM7UUFDN0IsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQzFCLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztRQUN6QixrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUM1QixlQUFlLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDekIsT0FBTyxFQUFFLE9BQU8sQ0FBQztLQUNsQixFQUNnQixPQUFPLENBQUMsOEJBQWtCLEVBQzFCLEdBQUcsdUNBQXNDLEVBOEMzRDtJQUVELGdIQUFnSDtJQUN6RyxzQkFBc0IsQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FlN0Q7SUFFRCxvR0FBb0c7SUFDN0YseUJBQXlCLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FTakU7SUFFTSxpQkFBaUIsQ0FDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FDMUcsU0FBUyxDQUFDO0lBQ04saUJBQWlCLENBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQzFHLE1BQU0sQ0FBQztJQUNILGlCQUFpQixDQUFDLEtBQUssRUFBRSxjQUFjLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQTJCN0QsY0FBYyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sUUFpQnRFO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxNQUFNLEdBQUc7UUFDakQsUUFBUSxFQUFFLE9BQU8sQ0FBQztRQUNsQixRQUFRLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUM3QixXQUFXLEVBQUUsT0FBTyxDQUFDO0tBQ3RCLENBZ0JBO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"timetable.d.ts","sourceRoot":"","sources":["../../src/sequencer/timetable.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM5C,qBAAa,kBAAkB;IA+C3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IA/CtB;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;IAE3C;;;;OAIG;IACH,SAAgB,gBAAgB,SAAC;IAEjC,sHAAsH;IACtH,SAAgB,gBAAgB,EAAE,MAAM,CAAsB;IAE9D,uDAAuD;IACvD,SAAgB,gBAAgB,EAAE,MAAM,CAAsB;IAE9D,mGAAmG;IACnG,SAAgB,0BAA0B,EAAE,MAAM,CAAC;IAEnD,mIAAmI;IACnI,SAAgB,mBAAmB,EAAE,MAAM,CAAyB;IAEpE,wCAAwC;IACxC,SAAgB,oBAAoB,EAAE,MAAM,CAAC;IAE7C,kFAAkF;IAClF,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IAE1C,2IAA2I;IAC3I,SAAgB,4BAA4B,EAAE,MAAM,CAAC;IAErD,4DAA4D;IAC5D,SAAgB,OAAO,EAAE,OAAO,CAAC;IAEjC,YACE,IAAI,EAAE;QACJ,oBAAoB,EAAE,MAAM,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,4BAA4B,EAAE,MAAM,CAAC;QACrC,0BAA0B,CAAC,EAAE,MAAM,CAAC;QACpC,OAAO,EAAE,OAAO,CAAC;KAClB,EACgB,OAAO,CAAC,8BAAkB,EAC1B,GAAG,uCAAsC,EA6C3D;IAED,OAAO,KAAK,yCAAyC,GAEpD;IAEM,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAalE;IAED,OAAO,KAAK,0BAA0B,GAErC;IAEM,yBAAyB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjE;IAEM,iBAAiB,CACtB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,GAC1G,SAAS,CAAC;IACN,iBAAiB,CACtB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,GAC1G,MAAM,CAAC;IACH,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;IAwB7D,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,QAiBtE;CACF"}
1
+ {"version":3,"file":"timetable.d.ts","sourceRoot":"","sources":["../../src/sequencer/timetable.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,qBAAa,kBAAkB;IAmD3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAnDtB;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;IAE3C;;;;OAIG;IACH,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IAEzC;;;OAGG;IACH,SAAgB,gBAAgB,EAAE,MAAM,CAAsB;IAE9D,uDAAuD;IACvD,SAAgB,4BAA4B,EAAE,MAAM,CAAkC;IAEtF,mGAAmG;IACnG,SAAgB,kBAAkB,EAAE,MAAM,CAAC;IAE3C,sFAAsF;IACtF,SAAgB,0BAA0B,EAAE,MAAM,CAAgC;IAElF,wCAAwC;IACxC,SAAgB,oBAAoB,EAAE,MAAM,CAAC;IAE7C,kFAAkF;IAClF,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IAE1C,4DAA4D;IAC5D,SAAgB,OAAO,EAAE,OAAO,CAAC;IAEjC,oGAAoG;IACpG,SAAgB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAElD,YACE,IAAI,EAAE;QACJ,oBAAoB,EAAE,MAAM,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,OAAO,EAAE,OAAO,CAAC;KAClB,EACgB,OAAO,CAAC,8BAAkB,EAC1B,GAAG,uCAAsC,EA8C3D;IAED,gHAAgH;IACzG,sBAAsB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAe7D;IAED,oGAAoG;IAC7F,yBAAyB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CASjE;IAEM,iBAAiB,CACtB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,GAC1G,SAAS,CAAC;IACN,iBAAiB,CACtB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,GAC1G,MAAM,CAAC;IACH,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;IA2B7D,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,QAiBtE;IAED;;;;;;;OAOG;IACI,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG;QACjD,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,WAAW,EAAE,OAAO,CAAC;KACtB,CAgBA;CACF"}
@@ -1,10 +1,10 @@
1
1
  import { createLogger } from '@aztec/aztec.js/log';
2
- import { DEFAULT_ATTESTATION_PROPAGATION_TIME } from '../config.js';
2
+ import { DEFAULT_ATTESTATION_PROPAGATION_TIME as DEFAULT_P2P_PROPAGATION_TIME } from '../config.js';
3
3
  import { SequencerTooSlowError } from './errors.js';
4
4
  import { SequencerState } from './utils.js';
5
- const MIN_EXECUTION_TIME = 1;
6
- const BLOCK_PREPARE_TIME = 1;
7
- const BLOCK_VALIDATION_TIME = 1;
5
+ export const MIN_EXECUTION_TIME = 1;
6
+ export const CHECKPOINT_INITIALIZATION_TIME = 1;
7
+ export const CHECKPOINT_FINALIZATION_TIME = 1;
8
8
  export class SequencerTimetable {
9
9
  metrics;
10
10
  log;
@@ -18,59 +18,63 @@ export class SequencerTimetable {
18
18
  * but we'll timeout sooner to give it more time to propagate (remember we also have blobs!). Still, when working in anvil,
19
19
  * we can just post in the very last second of the L1 slot and still expect the tx to be accepted.
20
20
  */ l1PublishingTime;
21
- /** What's the minimum time we want to leave available for execution and reexecution (used to derive init deadline) */ minExecutionTime;
22
- /** How long it takes to get ready to start building */ blockPrepareTime;
23
- /** How long it takes to for proposals and attestations to travel across the p2p layer (one-way) */ attestationPropagationTime;
24
- /** How much time we spend validating and processing a block after building it, and assembling the proposal to send to attestors */ blockValidationTime;
21
+ /**
22
+ * What's the minimum time we want to leave available for execution and reexecution (used to derive init deadline)
23
+ * Defaults to half of the block duration if set, otherwise a constant.
24
+ */ minExecutionTime;
25
+ /** How long it takes to get ready to start building */ checkpointInitializationTime;
26
+ /** How long it takes to for proposals and attestations to travel across the p2p layer (one-way) */ p2pPropagationTime;
27
+ /** How much time we spend validating and processing a checkpoint after building it */ checkpointFinalizationTime;
25
28
  /** Ethereum slot duration in seconds */ ethereumSlotDuration;
26
29
  /** Aztec slot duration in seconds (must be multiple of ethereum slot duration) */ aztecSlotDuration;
27
- /** How late into an L1 slot we can send a tx to make sure it gets included in the immediate next block. Complement of l1PublishingTime. */ maxL1TxInclusionTimeIntoSlot;
28
30
  /** Whether assertTimeLeft will throw if not enough time. */ enforce;
31
+ /** Duration per block when building multiple blocks per slot (undefined = single block per slot) */ blockDuration;
29
32
  constructor(opts, metrics, log = createLogger('sequencer:timetable')){
30
33
  this.metrics = metrics;
31
34
  this.log = log;
32
35
  this.minExecutionTime = MIN_EXECUTION_TIME;
33
- this.blockPrepareTime = BLOCK_PREPARE_TIME;
34
- this.blockValidationTime = BLOCK_VALIDATION_TIME;
36
+ this.checkpointInitializationTime = CHECKPOINT_INITIALIZATION_TIME;
37
+ this.checkpointFinalizationTime = CHECKPOINT_FINALIZATION_TIME;
35
38
  this.ethereumSlotDuration = opts.ethereumSlotDuration;
36
39
  this.aztecSlotDuration = opts.aztecSlotDuration;
37
- this.maxL1TxInclusionTimeIntoSlot = opts.maxL1TxInclusionTimeIntoSlot;
38
- this.attestationPropagationTime = opts.attestationPropagationTime ?? DEFAULT_ATTESTATION_PROPAGATION_TIME;
39
- this.l1PublishingTime = this.ethereumSlotDuration - this.maxL1TxInclusionTimeIntoSlot;
40
+ this.l1PublishingTime = opts.l1PublishingTime;
41
+ this.p2pPropagationTime = opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME;
42
+ this.blockDuration = opts.blockDurationMs ? opts.blockDurationMs / 1000 : undefined;
43
+ this.minExecutionTime = MIN_EXECUTION_TIME;
40
44
  this.enforce = opts.enforce;
41
45
  // Assume zero-cost propagation time and faster runs in test environments where L1 slot duration is shortened
42
46
  if (this.ethereumSlotDuration < 8) {
43
- this.attestationPropagationTime = 0;
44
- this.blockValidationTime = 0.5;
45
- this.blockPrepareTime = 0.5;
47
+ this.p2pPropagationTime = 0;
48
+ this.checkpointFinalizationTime = 0.5;
49
+ this.checkpointInitializationTime = 0.5;
46
50
  }
47
- const allWorkToDo = this.blockPrepareTime + this.minExecutionTime * 2 + this.attestationPropagationTime * 2 + this.blockValidationTime + this.l1PublishingTime;
48
- const initializeDeadline = this.aztecSlotDuration - allWorkToDo;
51
+ // Minimum work to do within a slot for building a block with the minimum time for execution and publishing its checkpoint
52
+ const minWorkToDo = this.checkpointInitializationTime + this.minExecutionTime * 2 + // Execution and reexecution
53
+ this.checkpointFinalizationTime + this.p2pPropagationTime * 2 + // Send proposal and receive attestations
54
+ this.l1PublishingTime; // Submit to L1
55
+ const initializeDeadline = this.aztecSlotDuration - minWorkToDo;
49
56
  this.initializeDeadline = initializeDeadline;
50
57
  this.log.verbose(`Sequencer timetable initialized (${this.enforce ? 'enforced' : 'not enforced'})`, {
51
58
  ethereumSlotDuration: this.ethereumSlotDuration,
52
59
  aztecSlotDuration: this.aztecSlotDuration,
53
- maxL1TxInclusionTimeIntoSlot: this.maxL1TxInclusionTimeIntoSlot,
54
60
  l1PublishingTime: this.l1PublishingTime,
55
61
  minExecutionTime: this.minExecutionTime,
56
- blockPrepareTime: this.blockPrepareTime,
57
- attestationPropagationTime: this.attestationPropagationTime,
58
- blockValidationTime: this.blockValidationTime,
62
+ blockPrepareTime: this.checkpointInitializationTime,
63
+ p2pPropagationTime: this.p2pPropagationTime,
64
+ blockValidationTime: this.checkpointFinalizationTime,
59
65
  initializeDeadline: this.initializeDeadline,
60
66
  enforce: this.enforce,
61
- allWorkToDo
67
+ allWorkToDo: minWorkToDo
62
68
  });
63
69
  if (initializeDeadline <= 0) {
64
- throw new Error(`Block proposal initialize deadline cannot be negative (got ${initializeDeadline} from total time needed ${allWorkToDo} and a slot duration of ${this.aztecSlotDuration}).`);
70
+ throw new Error(`Block proposal initialize deadline cannot be negative (got ${initializeDeadline} from total time needed ${minWorkToDo} and a slot duration of ${this.aztecSlotDuration}).`);
65
71
  }
66
72
  }
67
- get afterBlockBuildingTimeNeededWithoutReexec() {
68
- return this.blockValidationTime + this.attestationPropagationTime * 2 + this.l1PublishingTime;
69
- }
70
- getBlockProposalExecTimeEnd(secondsIntoSlot) {
73
+ /** Deadline for a block proposal execution. Ensures we have enough time left for reexecution and publishing. */ getProposerExecTimeEnd(secondsIntoSlot) {
71
74
  // We are N seconds into the slot. We need to account for `afterBlockBuildingTimeNeededWithoutReexec` seconds,
72
75
  // send then split the remaining time between the re-execution and the block building.
73
- const maxAllowed = this.aztecSlotDuration - this.afterBlockBuildingTimeNeededWithoutReexec;
76
+ const afterBlockBuildingTimeNeededWithoutReexec = this.checkpointFinalizationTime + this.p2pPropagationTime * 2 + this.l1PublishingTime;
77
+ const maxAllowed = this.aztecSlotDuration - afterBlockBuildingTimeNeededWithoutReexec;
74
78
  const available = maxAllowed - secondsIntoSlot;
75
79
  const executionTimeEnd = secondsIntoSlot + available / 2;
76
80
  this.log.debug(`Block proposal execution time deadline is ${executionTimeEnd}`, {
@@ -81,12 +85,10 @@ export class SequencerTimetable {
81
85
  });
82
86
  return executionTimeEnd;
83
87
  }
84
- get afterBlockReexecTimeNeeded() {
85
- return this.attestationPropagationTime + this.l1PublishingTime;
86
- }
87
- getValidatorReexecTimeEnd(secondsIntoSlot) {
88
+ /** Deadline for block proposal reexecution. Ensures the proposer has enough time for publishing. */ getValidatorReexecTimeEnd(secondsIntoSlot) {
88
89
  // We need to leave for `afterBlockReexecTimeNeeded` seconds available.
89
- const validationTimeEnd = this.aztecSlotDuration - this.afterBlockReexecTimeNeeded;
90
+ const afterBlockReexecTimeNeeded = this.p2pPropagationTime + this.l1PublishingTime;
91
+ const validationTimeEnd = this.aztecSlotDuration - afterBlockReexecTimeNeeded;
90
92
  this.log.debug(`Validator re-execution time deadline is ${validationTimeEnd}`, {
91
93
  secondsIntoSlot,
92
94
  validationTimeEnd
@@ -101,13 +103,16 @@ export class SequencerTimetable {
101
103
  case SequencerState.SYNCHRONIZING:
102
104
  return; // We don't really care about times for this states
103
105
  case SequencerState.PROPOSER_CHECK:
104
- case SequencerState.INITIALIZING_PROPOSAL:
106
+ case SequencerState.INITIALIZING_CHECKPOINT:
105
107
  return this.initializeDeadline;
108
+ case SequencerState.WAITING_FOR_TXS:
106
109
  case SequencerState.CREATING_BLOCK:
107
- return this.initializeDeadline + this.blockPrepareTime;
110
+ case SequencerState.WAITING_UNTIL_NEXT_BLOCK:
111
+ return this.initializeDeadline + this.checkpointInitializationTime;
112
+ case SequencerState.FINALIZING_CHECKPOINT:
108
113
  case SequencerState.COLLECTING_ATTESTATIONS:
109
- return this.aztecSlotDuration - this.l1PublishingTime - 2 * this.attestationPropagationTime;
110
- case SequencerState.PUBLISHING_BLOCK:
114
+ return this.aztecSlotDuration - this.l1PublishingTime - 2 * this.p2pPropagationTime;
115
+ case SequencerState.PUBLISHING_CHECKPOINT:
111
116
  return this.aztecSlotDuration - this.l1PublishingTime;
112
117
  default:
113
118
  {
@@ -134,4 +139,33 @@ export class SequencerTimetable {
134
139
  secondsIntoSlot
135
140
  });
136
141
  }
142
+ /**
143
+ * Get timing information for building blocks within a slot.
144
+ * @param secondsIntoSlot - Current seconds into the slot
145
+ * @returns Object containing:
146
+ * - canStart: boolean - Whether there's time to start a block now
147
+ * - deadline: number - Deadline (seconds into slot) for building the block
148
+ * - isLastBlock: boolean - Whether the next block would be the last one in the checkpoint
149
+ */ canStartNextBlock(secondsIntoSlot) {
150
+ const minExecutionTime = this.minExecutionTime;
151
+ const deadline = this.enforce ? this.getProposerExecTimeEnd(secondsIntoSlot) : undefined;
152
+ // Always allow to start if we don't enforce the timetable
153
+ const canStart = !this.enforce || deadline === undefined || deadline - secondsIntoSlot >= minExecutionTime;
154
+ // Single block per slot
155
+ if (this.blockDuration === undefined) {
156
+ this.log.debug(`${canStart ? 'Can' : 'Cannot'} start single-block checkpoint at ${secondsIntoSlot}s into slot`);
157
+ return {
158
+ deadline,
159
+ canStart,
160
+ isLastBlock: true
161
+ };
162
+ }
163
+ // Multiple blocks per slot
164
+ // TODO(palla/mbps) Implement me
165
+ return {
166
+ deadline,
167
+ canStart,
168
+ isLastBlock: true
169
+ };
170
+ }
137
171
  }
@@ -0,0 +1,3 @@
1
+ import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
2
+ export type SequencerRollupConstants = Pick<L1RollupConstants, 'ethereumSlotDuration' | 'l1GenesisTime' | 'slotDuration'>;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxNQUFNLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUN6QyxpQkFBaUIsRUFDakIsc0JBQXNCLEdBQUcsZUFBZSxHQUFHLGNBQWMsQ0FDMUQsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sequencer/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG,IAAI,CACzC,iBAAiB,EACjB,sBAAsB,GAAG,eAAe,GAAG,cAAc,CAC1D,CAAC"}
@@ -0,0 +1 @@
1
+ export { };
@@ -9,16 +9,22 @@ export declare enum SequencerState {
9
9
  SYNCHRONIZING = "SYNCHRONIZING",
10
10
  /** Checking if we are the proposer for the current slot. */
11
11
  PROPOSER_CHECK = "PROPOSER_CHECK",
12
- /** Initializing the block proposal. Will move to CREATING_BLOCK if there are valid txs to include, or back to SYNCHRONIZING otherwise. */
13
- INITIALIZING_PROPOSAL = "INITIALIZING_PROPOSAL",
14
- /** Creating a new L2 block. Includes processing public function calls and running rollup circuits. Will move to PUBLISHING_CONTRACT_DATA. */
12
+ /** Initializing the checkpoint proposal. */
13
+ INITIALIZING_CHECKPOINT = "INITIALIZING_CHECKPOINT",
14
+ /** Waiting for transactions to arrive in the pool. */
15
+ WAITING_FOR_TXS = "WAITING_FOR_TXS",
16
+ /** Creating a new L2 block. Includes processing public function calls. */
15
17
  CREATING_BLOCK = "CREATING_BLOCK",
16
- /** Collecting attestations from its peers. Will move to PUBLISHING_BLOCK. */
18
+ /** Waiting until the next block can be created. */
19
+ WAITING_UNTIL_NEXT_BLOCK = "WAITING_UNTIL_NEXT_BLOCK",
20
+ /** Finalizing and broadcasting the checkpoint. */
21
+ FINALIZING_CHECKPOINT = "FINALIZING_CHECKPOINT",
22
+ /** Collecting attestations from its peers. */
17
23
  COLLECTING_ATTESTATIONS = "COLLECTING_ATTESTATIONS",
18
- /** Sending the tx to L1 with the L2 block data and awaiting it to be mined. Will move to SYNCHRONIZING. */
19
- PUBLISHING_BLOCK = "PUBLISHING_BLOCK"
24
+ /** Sending the tx to L1 with the L2 checkpoint data and awaiting it to be mined.. */
25
+ PUBLISHING_CHECKPOINT = "PUBLISHING_CHECKPOINT"
20
26
  }
21
- export type SequencerStateWithSlot = SequencerState.INITIALIZING_PROPOSAL | SequencerState.CREATING_BLOCK | SequencerState.COLLECTING_ATTESTATIONS | SequencerState.PUBLISHING_BLOCK | SequencerState.PROPOSER_CHECK;
27
+ export type SequencerStateWithSlot = SequencerState.INITIALIZING_CHECKPOINT | SequencerState.WAITING_FOR_TXS | SequencerState.CREATING_BLOCK | SequencerState.WAITING_UNTIL_NEXT_BLOCK | SequencerState.COLLECTING_ATTESTATIONS | SequencerState.PUBLISHING_CHECKPOINT | SequencerState.PROPOSER_CHECK | SequencerState.FINALIZING_CHECKPOINT;
22
28
  export type SequencerStateCallback = () => SequencerState;
23
29
  export declare function sequencerStateToNumber(state: SequencerState): number;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQVksY0FBYztJQUN4QixxRUFBcUU7SUFDckUsT0FBTyxZQUFZO0lBQ25CLGdFQUFnRTtJQUNoRSxRQUFRLGFBQWE7SUFDckIscURBQXFEO0lBQ3JELElBQUksU0FBUztJQUNiLHVDQUF1QztJQUN2QyxhQUFhLGtCQUFrQjtJQUMvQiw0REFBNEQ7SUFDNUQsY0FBYyxtQkFBbUI7SUFDakMsMElBQTBJO0lBQzFJLHFCQUFxQiwwQkFBMEI7SUFDL0MsNklBQTZJO0lBQzdJLGNBQWMsbUJBQW1CO0lBQ2pDLDZFQUE2RTtJQUM3RSx1QkFBdUIsNEJBQTRCO0lBQ25ELDJHQUEyRztJQUMzRyxnQkFBZ0IscUJBQXFCO0NBQ3RDO0FBRUQsTUFBTSxNQUFNLHNCQUFzQixHQUM5QixjQUFjLENBQUMscUJBQXFCLEdBQ3BDLGNBQWMsQ0FBQyxjQUFjLEdBQzdCLGNBQWMsQ0FBQyx1QkFBdUIsR0FDdEMsY0FBYyxDQUFDLGdCQUFnQixHQUMvQixjQUFjLENBQUMsY0FBYyxDQUFDO0FBRWxDLE1BQU0sTUFBTSxzQkFBc0IsR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUUxRCx3QkFBZ0Isc0JBQXNCLENBQUMsS0FBSyxFQUFFLGNBQWMsR0FBRyxNQUFNLENBRXBFIn0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQVksY0FBYztJQUN4QixxRUFBcUU7SUFDckUsT0FBTyxZQUFZO0lBQ25CLGdFQUFnRTtJQUNoRSxRQUFRLGFBQWE7SUFDckIscURBQXFEO0lBQ3JELElBQUksU0FBUztJQUNiLHVDQUF1QztJQUN2QyxhQUFhLGtCQUFrQjtJQUMvQiw0REFBNEQ7SUFDNUQsY0FBYyxtQkFBbUI7SUFDakMsNENBQTRDO0lBQzVDLHVCQUF1Qiw0QkFBNEI7SUFDbkQsc0RBQXNEO0lBQ3RELGVBQWUsb0JBQW9CO0lBQ25DLDBFQUEwRTtJQUMxRSxjQUFjLG1CQUFtQjtJQUNqQyxtREFBbUQ7SUFDbkQsd0JBQXdCLDZCQUE2QjtJQUNyRCxrREFBa0Q7SUFDbEQscUJBQXFCLDBCQUEwQjtJQUMvQyw4Q0FBOEM7SUFDOUMsdUJBQXVCLDRCQUE0QjtJQUNuRCxxRkFBcUY7SUFDckYscUJBQXFCLDBCQUEwQjtDQUNoRDtBQUVELE1BQU0sTUFBTSxzQkFBc0IsR0FDOUIsY0FBYyxDQUFDLHVCQUF1QixHQUN0QyxjQUFjLENBQUMsZUFBZSxHQUM5QixjQUFjLENBQUMsY0FBYyxHQUM3QixjQUFjLENBQUMsd0JBQXdCLEdBQ3ZDLGNBQWMsQ0FBQyx1QkFBdUIsR0FDdEMsY0FBYyxDQUFDLHFCQUFxQixHQUNwQyxjQUFjLENBQUMsY0FBYyxHQUM3QixjQUFjLENBQUMscUJBQXFCLENBQUM7QUFFekMsTUFBTSxNQUFNLHNCQUFzQixHQUFHLE1BQU0sY0FBYyxDQUFDO0FBRTFELHdCQUFnQixzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsY0FBYyxHQUFHLE1BQU0sQ0FFcEUifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/sequencer/utils.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB,qEAAqE;IACrE,OAAO,YAAY;IACnB,gEAAgE;IAChE,QAAQ,aAAa;IACrB,qDAAqD;IACrD,IAAI,SAAS;IACb,uCAAuC;IACvC,aAAa,kBAAkB;IAC/B,4DAA4D;IAC5D,cAAc,mBAAmB;IACjC,0IAA0I;IAC1I,qBAAqB,0BAA0B;IAC/C,6IAA6I;IAC7I,cAAc,mBAAmB;IACjC,6EAA6E;IAC7E,uBAAuB,4BAA4B;IACnD,2GAA2G;IAC3G,gBAAgB,qBAAqB;CACtC;AAED,MAAM,MAAM,sBAAsB,GAC9B,cAAc,CAAC,qBAAqB,GACpC,cAAc,CAAC,cAAc,GAC7B,cAAc,CAAC,uBAAuB,GACtC,cAAc,CAAC,gBAAgB,GAC/B,cAAc,CAAC,cAAc,CAAC;AAElC,MAAM,MAAM,sBAAsB,GAAG,MAAM,cAAc,CAAC;AAE1D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEpE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/sequencer/utils.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB,qEAAqE;IACrE,OAAO,YAAY;IACnB,gEAAgE;IAChE,QAAQ,aAAa;IACrB,qDAAqD;IACrD,IAAI,SAAS;IACb,uCAAuC;IACvC,aAAa,kBAAkB;IAC/B,4DAA4D;IAC5D,cAAc,mBAAmB;IACjC,4CAA4C;IAC5C,uBAAuB,4BAA4B;IACnD,sDAAsD;IACtD,eAAe,oBAAoB;IACnC,0EAA0E;IAC1E,cAAc,mBAAmB;IACjC,mDAAmD;IACnD,wBAAwB,6BAA6B;IACrD,kDAAkD;IAClD,qBAAqB,0BAA0B;IAC/C,8CAA8C;IAC9C,uBAAuB,4BAA4B;IACnD,qFAAqF;IACrF,qBAAqB,0BAA0B;CAChD;AAED,MAAM,MAAM,sBAAsB,GAC9B,cAAc,CAAC,uBAAuB,GACtC,cAAc,CAAC,eAAe,GAC9B,cAAc,CAAC,cAAc,GAC7B,cAAc,CAAC,wBAAwB,GACvC,cAAc,CAAC,uBAAuB,GACtC,cAAc,CAAC,qBAAqB,GACpC,cAAc,CAAC,cAAc,GAC7B,cAAc,CAAC,qBAAqB,CAAC;AAEzC,MAAM,MAAM,sBAAsB,GAAG,MAAM,cAAc,CAAC;AAE1D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEpE"}
@@ -4,10 +4,13 @@ export var SequencerState = /*#__PURE__*/ function(SequencerState) {
4
4
  /** Sequencer is awaiting the next call to work(). */ SequencerState["IDLE"] = "IDLE";
5
5
  /** Synchronizing with the L2 chain. */ SequencerState["SYNCHRONIZING"] = "SYNCHRONIZING";
6
6
  /** Checking if we are the proposer for the current slot. */ SequencerState["PROPOSER_CHECK"] = "PROPOSER_CHECK";
7
- /** Initializing the block proposal. Will move to CREATING_BLOCK if there are valid txs to include, or back to SYNCHRONIZING otherwise. */ SequencerState["INITIALIZING_PROPOSAL"] = "INITIALIZING_PROPOSAL";
8
- /** Creating a new L2 block. Includes processing public function calls and running rollup circuits. Will move to PUBLISHING_CONTRACT_DATA. */ SequencerState["CREATING_BLOCK"] = "CREATING_BLOCK";
9
- /** Collecting attestations from its peers. Will move to PUBLISHING_BLOCK. */ SequencerState["COLLECTING_ATTESTATIONS"] = "COLLECTING_ATTESTATIONS";
10
- /** Sending the tx to L1 with the L2 block data and awaiting it to be mined. Will move to SYNCHRONIZING. */ SequencerState["PUBLISHING_BLOCK"] = "PUBLISHING_BLOCK";
7
+ /** Initializing the checkpoint proposal. */ SequencerState["INITIALIZING_CHECKPOINT"] = "INITIALIZING_CHECKPOINT";
8
+ /** Waiting for transactions to arrive in the pool. */ SequencerState["WAITING_FOR_TXS"] = "WAITING_FOR_TXS";
9
+ /** Creating a new L2 block. Includes processing public function calls. */ SequencerState["CREATING_BLOCK"] = "CREATING_BLOCK";
10
+ /** Waiting until the next block can be created. */ SequencerState["WAITING_UNTIL_NEXT_BLOCK"] = "WAITING_UNTIL_NEXT_BLOCK";
11
+ /** Finalizing and broadcasting the checkpoint. */ SequencerState["FINALIZING_CHECKPOINT"] = "FINALIZING_CHECKPOINT";
12
+ /** Collecting attestations from its peers. */ SequencerState["COLLECTING_ATTESTATIONS"] = "COLLECTING_ATTESTATIONS";
13
+ /** Sending the tx to L1 with the L2 checkpoint data and awaiting it to be mined.. */ SequencerState["PUBLISHING_CHECKPOINT"] = "PUBLISHING_CHECKPOINT";
11
14
  return SequencerState;
12
15
  }({});
13
16
  export function sequencerStateToNumber(state) {
@@ -5,6 +5,7 @@ import type { ValidatorClient } from '@aztec/validator-client';
5
5
  import { SequencerClient } from '../client/sequencer-client.js';
6
6
  import type { SequencerPublisherFactory } from '../publisher/sequencer-publisher-factory.js';
7
7
  import type { SequencerPublisher } from '../publisher/sequencer-publisher.js';
8
+ import type { FullNodeCheckpointsBuilder } from '../sequencer/checkpoint_builder.js';
8
9
  import { Sequencer } from '../sequencer/sequencer.js';
9
10
  import type { SequencerTimetable } from '../sequencer/timetable.js';
10
11
  declare class TestSequencer_ extends Sequencer {
@@ -13,6 +14,7 @@ declare class TestSequencer_ extends Sequencer {
13
14
  publisher: SequencerPublisher;
14
15
  publisherFactory: SequencerPublisherFactory;
15
16
  validatorClient: ValidatorClient;
17
+ checkpointsBuilder: FullNodeCheckpointsBuilder;
16
18
  }
17
19
  export type TestSequencer = TestSequencer_;
18
20
  declare class TestSequencerClient_ extends SequencerClient {
@@ -21,4 +23,4 @@ declare class TestSequencerClient_ extends SequencerClient {
21
23
  }
22
24
  export type TestSequencerClient = TestSequencerClient_;
23
25
  export {};
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzdGLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFcEUsY0FBTSxjQUFlLFNBQVEsU0FBUztJQUNyQixzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQztJQUMvQyxTQUFTLEVBQUUsa0JBQWtCLENBQUM7SUFDOUIsU0FBUyxFQUFFLGtCQUFrQixDQUFDO0lBQzlCLGdCQUFnQixFQUFFLHlCQUF5QixDQUFDO0lBQzVDLGVBQWUsRUFBRSxlQUFlLENBQUM7Q0FDakQ7QUFFRCxNQUFNLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUUzQyxjQUFNLG9CQUFxQixTQUFRLGVBQWU7SUFDakMsU0FBUyxFQUFFLGFBQWEsQ0FBQztJQUN6QixnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0NBQ3ZFO0FBRUQsTUFBTSxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDIn0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzdGLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUUsT0FBTyxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVwRSxjQUFNLGNBQWUsU0FBUSxTQUFTO0lBQ3JCLHNCQUFzQixFQUFFLHNCQUFzQixDQUFDO0lBQy9DLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQztJQUM5QixTQUFTLEVBQUUsa0JBQWtCLENBQUM7SUFDOUIsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUM7SUFDNUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztJQUNqQyxrQkFBa0IsRUFBRSwwQkFBMEIsQ0FBQztDQUMvRDtBQUVELE1BQU0sTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDO0FBRTNDLGNBQU0sb0JBQXFCLFNBQVEsZUFBZTtJQUNqQyxTQUFTLEVBQUUsYUFBYSxDQUFDO0lBQ3pCLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Q0FDdkU7QUFFRCxNQUFNLE1BQU0sbUJBQW1CLEdBQUcsb0JBQW9CLENBQUMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,cAAM,cAAe,SAAQ,SAAS;IACrB,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;CACjD;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C,cAAM,oBAAqB,SAAQ,eAAe;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;CACvE;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,cAAM,cAAe,SAAQ,SAAS;IACrB,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,0BAA0B,CAAC;CAC/D;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C,cAAM,oBAAqB,SAAQ,eAAe;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;CACvE;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/sequencer-client",
3
- "version": "3.0.0-nightly.20251221",
3
+ "version": "3.0.0-nightly.20251223",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -26,37 +26,37 @@
26
26
  "test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
27
27
  },
28
28
  "dependencies": {
29
- "@aztec/aztec.js": "3.0.0-nightly.20251221",
30
- "@aztec/bb-prover": "3.0.0-nightly.20251221",
31
- "@aztec/blob-lib": "3.0.0-nightly.20251221",
32
- "@aztec/blob-sink": "3.0.0-nightly.20251221",
33
- "@aztec/constants": "3.0.0-nightly.20251221",
34
- "@aztec/epoch-cache": "3.0.0-nightly.20251221",
35
- "@aztec/ethereum": "3.0.0-nightly.20251221",
36
- "@aztec/foundation": "3.0.0-nightly.20251221",
37
- "@aztec/l1-artifacts": "3.0.0-nightly.20251221",
38
- "@aztec/merkle-tree": "3.0.0-nightly.20251221",
39
- "@aztec/node-keystore": "3.0.0-nightly.20251221",
40
- "@aztec/noir-acvm_js": "3.0.0-nightly.20251221",
41
- "@aztec/noir-contracts.js": "3.0.0-nightly.20251221",
42
- "@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251221",
43
- "@aztec/noir-types": "3.0.0-nightly.20251221",
44
- "@aztec/p2p": "3.0.0-nightly.20251221",
45
- "@aztec/protocol-contracts": "3.0.0-nightly.20251221",
46
- "@aztec/prover-client": "3.0.0-nightly.20251221",
47
- "@aztec/simulator": "3.0.0-nightly.20251221",
48
- "@aztec/slasher": "3.0.0-nightly.20251221",
49
- "@aztec/stdlib": "3.0.0-nightly.20251221",
50
- "@aztec/telemetry-client": "3.0.0-nightly.20251221",
51
- "@aztec/validator-client": "3.0.0-nightly.20251221",
52
- "@aztec/world-state": "3.0.0-nightly.20251221",
29
+ "@aztec/aztec.js": "3.0.0-nightly.20251223",
30
+ "@aztec/bb-prover": "3.0.0-nightly.20251223",
31
+ "@aztec/blob-client": "3.0.0-nightly.20251223",
32
+ "@aztec/blob-lib": "3.0.0-nightly.20251223",
33
+ "@aztec/constants": "3.0.0-nightly.20251223",
34
+ "@aztec/epoch-cache": "3.0.0-nightly.20251223",
35
+ "@aztec/ethereum": "3.0.0-nightly.20251223",
36
+ "@aztec/foundation": "3.0.0-nightly.20251223",
37
+ "@aztec/l1-artifacts": "3.0.0-nightly.20251223",
38
+ "@aztec/merkle-tree": "3.0.0-nightly.20251223",
39
+ "@aztec/node-keystore": "3.0.0-nightly.20251223",
40
+ "@aztec/noir-acvm_js": "3.0.0-nightly.20251223",
41
+ "@aztec/noir-contracts.js": "3.0.0-nightly.20251223",
42
+ "@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251223",
43
+ "@aztec/noir-types": "3.0.0-nightly.20251223",
44
+ "@aztec/p2p": "3.0.0-nightly.20251223",
45
+ "@aztec/protocol-contracts": "3.0.0-nightly.20251223",
46
+ "@aztec/prover-client": "3.0.0-nightly.20251223",
47
+ "@aztec/simulator": "3.0.0-nightly.20251223",
48
+ "@aztec/slasher": "3.0.0-nightly.20251223",
49
+ "@aztec/stdlib": "3.0.0-nightly.20251223",
50
+ "@aztec/telemetry-client": "3.0.0-nightly.20251223",
51
+ "@aztec/validator-client": "3.0.0-nightly.20251223",
52
+ "@aztec/world-state": "3.0.0-nightly.20251223",
53
53
  "lodash.chunk": "^4.2.0",
54
54
  "tslib": "^2.4.0",
55
55
  "viem": "npm:@aztec/viem@2.38.2"
56
56
  },
57
57
  "devDependencies": {
58
- "@aztec/archiver": "3.0.0-nightly.20251221",
59
- "@aztec/kv-store": "3.0.0-nightly.20251221",
58
+ "@aztec/archiver": "3.0.0-nightly.20251223",
59
+ "@aztec/kv-store": "3.0.0-nightly.20251223",
60
60
  "@jest/globals": "^30.0.0",
61
61
  "@types/jest": "^30.0.0",
62
62
  "@types/lodash.chunk": "^4.2.7",
@@ -1,4 +1,4 @@
1
- import type { BlobSinkClientInterface } from '@aztec/blob-sink/client';
1
+ import type { BlobClientInterface } from '@aztec/blob-client/client';
2
2
  import { EpochCache } from '@aztec/epoch-cache';
3
3
  import { isAnvilTestChain } from '@aztec/ethereum/chain';
4
4
  import { getPublicClient } from '@aztec/ethereum/client';
@@ -12,11 +12,7 @@ import type { KeystoreManager } from '@aztec/node-keystore';
12
12
  import type { P2P } from '@aztec/p2p';
13
13
  import type { SlasherClientInterface } from '@aztec/slasher';
14
14
  import type { L2BlockSource } from '@aztec/stdlib/block';
15
- import type {
16
- IFullNodeBlockBuilder,
17
- ValidatorClientFullConfig,
18
- WorldStateSynchronizer,
19
- } from '@aztec/stdlib/interfaces/server';
15
+ import type { ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
20
16
  import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
21
17
  import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
22
18
  import { L1Metrics, type TelemetryClient } from '@aztec/telemetry-client';
@@ -25,6 +21,7 @@ import { NodeKeystoreAdapter, type ValidatorClient } from '@aztec/validator-clie
25
21
  import type { SequencerClientConfig } from '../config.js';
26
22
  import { GlobalVariableBuilder } from '../global_variable_builder/index.js';
27
23
  import { SequencerPublisherFactory } from '../publisher/sequencer-publisher-factory.js';
24
+ import { FullNodeCheckpointsBuilder } from '../sequencer/checkpoint_builder.js';
28
25
  import { Sequencer, type SequencerConfig } from '../sequencer/index.js';
29
26
 
30
27
  /**
@@ -34,7 +31,7 @@ export class SequencerClient {
34
31
  constructor(
35
32
  protected publisherManager: PublisherManager<L1TxUtilsWithBlobs>,
36
33
  protected sequencer: Sequencer,
37
- protected blockBuilder: IFullNodeBlockBuilder,
34
+ protected checkpointsBuilder: FullNodeCheckpointsBuilder,
38
35
  protected validatorClient?: ValidatorClient,
39
36
  private l1Metrics?: L1Metrics,
40
37
  ) {}
@@ -54,16 +51,16 @@ export class SequencerClient {
54
51
  public static async new(
55
52
  config: SequencerClientConfig,
56
53
  deps: {
57
- validatorClient: ValidatorClient | undefined; // allowed to be undefined while we migrate
54
+ validatorClient: ValidatorClient;
58
55
  p2pClient: P2P;
59
56
  worldStateSynchronizer: WorldStateSynchronizer;
60
57
  slasherClient: SlasherClientInterface | undefined;
61
- blockBuilder: IFullNodeBlockBuilder;
58
+ checkpointsBuilder: FullNodeCheckpointsBuilder;
62
59
  l2BlockSource: L2BlockSource;
63
60
  l1ToL2MessageSource: L1ToL2MessageSource;
64
61
  telemetry: TelemetryClient;
65
62
  publisherFactory?: SequencerPublisherFactory;
66
- blobSinkClient?: BlobSinkClientInterface;
63
+ blobClient?: BlobClientInterface;
67
64
  dateProvider: DateProvider;
68
65
  epochCache?: EpochCache;
69
66
  l1TxUtils: L1TxUtilsWithBlobs[];
@@ -75,7 +72,7 @@ export class SequencerClient {
75
72
  p2pClient,
76
73
  worldStateSynchronizer,
77
74
  slasherClient,
78
- blockBuilder,
75
+ checkpointsBuilder,
79
76
  l2BlockSource,
80
77
  l1ToL2MessageSource,
81
78
  telemetry: telemetryClient,
@@ -91,9 +88,11 @@ export class SequencerClient {
91
88
  );
92
89
  const publisherManager = new PublisherManager(l1TxUtils, config);
93
90
  const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
94
- const [l1GenesisTime, slotDuration] = await Promise.all([
91
+ const [l1GenesisTime, slotDuration, rollupVersion, rollupManaLimit] = await Promise.all([
95
92
  rollupContract.getL1GenesisTime(),
96
93
  rollupContract.getSlotDuration(),
94
+ rollupContract.getVersion(),
95
+ rollupContract.getManaLimit().then(Number),
97
96
  ] as const);
98
97
 
99
98
  const governanceProposerContract = new GovernanceProposerContract(
@@ -122,7 +121,7 @@ export class SequencerClient {
122
121
  deps.publisherFactory ??
123
122
  new SequencerPublisherFactory(config, {
124
123
  telemetry: telemetryClient,
125
- blobSinkClient: deps.blobSinkClient,
124
+ blobClient: deps.blobClient,
126
125
  epochCache,
127
126
  governanceProposerContract,
128
127
  slashFactoryContract,
@@ -132,33 +131,27 @@ export class SequencerClient {
132
131
  nodeKeyStore: NodeKeystoreAdapter.fromKeyStoreManager(deps.nodeKeyStore),
133
132
  logger: log,
134
133
  });
135
- const globalsBuilder = new GlobalVariableBuilder(config);
136
134
 
137
135
  const ethereumSlotDuration = config.ethereumSlotDuration;
136
+ const l1Constants = { l1GenesisTime, slotDuration: Number(slotDuration), ethereumSlotDuration };
137
+
138
+ const globalsBuilder = new GlobalVariableBuilder({ ...config, ...l1Constants, rollupVersion });
138
139
 
139
- const rollupManaLimit = Number(await rollupContract.getManaLimit());
140
140
  let sequencerManaLimit = config.maxL2BlockGas ?? rollupManaLimit;
141
141
  if (sequencerManaLimit > rollupManaLimit) {
142
142
  log.warn(
143
- `Provided maxL2BlockGas of ${sequencerManaLimit} is greater than the maximum allowed by the L1 (${rollupManaLimit}), setting limit to ${rollupManaLimit}`,
143
+ `Provided maxL2BlockGas ${sequencerManaLimit} is greater than the max allowed by L1. Setting limit to ${rollupManaLimit}.`,
144
144
  );
145
145
  sequencerManaLimit = rollupManaLimit;
146
146
  }
147
147
 
148
148
  // When running in anvil, assume we can post a tx up until one second before the end of an L1 slot.
149
- // Otherwise, assume we must have broadcasted the tx before the slot started (we use a default
150
- // maxL1TxInclusionTimeIntoSlot of zero) to get the tx into that L1 slot.
149
+ // Otherwise, we need the full L1 slot duration for publishing to ensure inclusion.
151
150
  // In theory, the L1 slot has an initial 4s phase where the block is propagated, so we could
152
- // make it with a propagation time into slot equal to 4s. However, we prefer being conservative.
151
+ // reduce the publishing time allowance. However, we prefer being conservative.
153
152
  // See https://www.blocknative.com/blog/anatomy-of-a-slot#7 for more info.
154
- const maxInclusionBasedOnChain = isAnvilTestChain(config.l1ChainId) ? ethereumSlotDuration - 1 : 0;
155
- const maxL1TxInclusionTimeIntoSlot = config.maxL1TxInclusionTimeIntoSlot ?? maxInclusionBasedOnChain;
156
-
157
- const l1Constants = {
158
- l1GenesisTime,
159
- slotDuration: Number(slotDuration),
160
- ethereumSlotDuration,
161
- };
153
+ const l1PublishingTimeBasedOnChain = isAnvilTestChain(config.l1ChainId) ? 1 : ethereumSlotDuration;
154
+ const l1PublishingTime = config.l1PublishingTime ?? l1PublishingTimeBasedOnChain;
162
155
 
163
156
  const sequencer = new Sequencer(
164
157
  publisherFactory,
@@ -169,19 +162,19 @@ export class SequencerClient {
169
162
  slasherClient,
170
163
  l2BlockSource,
171
164
  l1ToL2MessageSource,
172
- blockBuilder,
165
+ checkpointsBuilder,
173
166
  l1Constants,
174
167
  deps.dateProvider,
175
168
  epochCache,
176
169
  rollupContract,
177
- { ...config, maxL1TxInclusionTimeIntoSlot, maxL2BlockGas: sequencerManaLimit },
170
+ { ...config, l1PublishingTime, maxL2BlockGas: sequencerManaLimit },
178
171
  telemetryClient,
179
172
  log,
180
173
  );
181
174
 
182
175
  await sequencer.init();
183
176
 
184
- return new SequencerClient(publisherManager, sequencer, blockBuilder, validatorClient, l1Metrics);
177
+ return new SequencerClient(publisherManager, sequencer, checkpointsBuilder, validatorClient, l1Metrics);
185
178
  }
186
179
 
187
180
  /**
@@ -190,7 +183,7 @@ export class SequencerClient {
190
183
  */
191
184
  public updateConfig(config: SequencerConfig & Partial<ValidatorClientFullConfig>) {
192
185
  this.sequencer.updateConfig(config);
193
- this.blockBuilder.updateConfig(config);
186
+ this.checkpointsBuilder.updateConfig(config);
194
187
  this.validatorClient?.updateConfig(config);
195
188
  }
196
189