@aztec/sequencer-client 0.0.1-commit.dbf9cec → 0.0.1-commit.e0f15ab9b

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 (54) hide show
  1. package/dest/client/sequencer-client.d.ts +4 -1
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +46 -23
  4. package/dest/config.d.ts +25 -5
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +31 -17
  7. package/dest/global_variable_builder/global_builder.d.ts +13 -7
  8. package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
  9. package/dest/global_variable_builder/global_builder.js +22 -21
  10. package/dest/global_variable_builder/index.d.ts +2 -2
  11. package/dest/global_variable_builder/index.d.ts.map +1 -1
  12. package/dest/publisher/config.d.ts +13 -1
  13. package/dest/publisher/config.d.ts.map +1 -1
  14. package/dest/publisher/config.js +17 -2
  15. package/dest/publisher/sequencer-publisher-factory.d.ts +3 -3
  16. package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
  17. package/dest/publisher/sequencer-publisher-factory.js +16 -2
  18. package/dest/publisher/sequencer-publisher.d.ts +13 -4
  19. package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
  20. package/dest/publisher/sequencer-publisher.js +78 -14
  21. package/dest/sequencer/checkpoint_proposal_job.d.ts +13 -7
  22. package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
  23. package/dest/sequencer/checkpoint_proposal_job.js +198 -128
  24. package/dest/sequencer/events.d.ts +2 -1
  25. package/dest/sequencer/events.d.ts.map +1 -1
  26. package/dest/sequencer/metrics.d.ts +5 -1
  27. package/dest/sequencer/metrics.d.ts.map +1 -1
  28. package/dest/sequencer/metrics.js +11 -0
  29. package/dest/sequencer/sequencer.d.ts +14 -9
  30. package/dest/sequencer/sequencer.d.ts.map +1 -1
  31. package/dest/sequencer/sequencer.js +72 -62
  32. package/dest/sequencer/timetable.d.ts +4 -3
  33. package/dest/sequencer/timetable.d.ts.map +1 -1
  34. package/dest/sequencer/timetable.js +6 -7
  35. package/dest/sequencer/types.d.ts +2 -2
  36. package/dest/sequencer/types.d.ts.map +1 -1
  37. package/dest/test/mock_checkpoint_builder.d.ts +7 -9
  38. package/dest/test/mock_checkpoint_builder.d.ts.map +1 -1
  39. package/dest/test/mock_checkpoint_builder.js +39 -30
  40. package/package.json +27 -28
  41. package/src/client/sequencer-client.ts +56 -21
  42. package/src/config.ts +39 -19
  43. package/src/global_variable_builder/global_builder.ts +22 -23
  44. package/src/global_variable_builder/index.ts +1 -1
  45. package/src/publisher/config.ts +32 -0
  46. package/src/publisher/sequencer-publisher-factory.ts +18 -3
  47. package/src/publisher/sequencer-publisher.ts +100 -20
  48. package/src/sequencer/checkpoint_proposal_job.ts +263 -140
  49. package/src/sequencer/events.ts +1 -1
  50. package/src/sequencer/metrics.ts +14 -0
  51. package/src/sequencer/sequencer.ts +98 -69
  52. package/src/sequencer/timetable.ts +7 -7
  53. package/src/sequencer/types.ts +1 -1
  54. package/src/test/mock_checkpoint_builder.ts +51 -48
@@ -1,4 +1,3 @@
1
- import { createLogger } from '@aztec/aztec.js/log';
2
1
  import { CHECKPOINT_ASSEMBLE_TIME, CHECKPOINT_INITIALIZATION_TIME, DEFAULT_P2P_PROPAGATION_TIME, MIN_EXECUTION_TIME } from '@aztec/stdlib/timetable';
3
2
  import { SequencerTooSlowError } from './errors.js';
4
3
  import { SequencerState } from './utils.js';
@@ -38,7 +37,7 @@ export class SequencerTimetable {
38
37
  /** Whether assertTimeLeft will throw if not enough time. */ enforce;
39
38
  /** Duration per block when building multiple blocks per slot (undefined = single block per slot) */ blockDuration;
40
39
  /** Maximum number of blocks that can be built in this slot configuration */ maxNumberOfBlocks;
41
- constructor(opts, metrics, log = createLogger('sequencer:timetable')){
40
+ constructor(opts, metrics, log){
42
41
  this.metrics = metrics;
43
42
  this.log = log;
44
43
  this.minExecutionTime = MIN_EXECUTION_TIME;
@@ -81,7 +80,7 @@ export class SequencerTimetable {
81
80
  this.checkpointFinalizationTime;
82
81
  const initializeDeadline = this.aztecSlotDuration - minWorkToDo;
83
82
  this.initializeDeadline = initializeDeadline;
84
- this.log.info(`Sequencer timetable initialized with ${this.maxNumberOfBlocks} blocks per slot (${this.enforce ? 'enforced' : 'not enforced'})`, {
83
+ this.log?.info(`Sequencer timetable initialized with ${this.maxNumberOfBlocks} blocks per slot (${this.enforce ? 'enforced' : 'not enforced'})`, {
85
84
  ethereumSlotDuration: this.ethereumSlotDuration,
86
85
  aztecSlotDuration: this.aztecSlotDuration,
87
86
  l1PublishingTime: this.l1PublishingTime,
@@ -138,7 +137,7 @@ export class SequencerTimetable {
138
137
  throw new SequencerTooSlowError(newState, maxAllowedTime, secondsIntoSlot);
139
138
  }
140
139
  this.metrics?.recordStateTransitionBufferMs(Math.floor(bufferSeconds * 1000), newState);
141
- this.log.trace(`Enough time to transition to ${newState}`, {
140
+ this.log?.trace(`Enough time to transition to ${newState}`, {
142
141
  maxAllowedTime,
143
142
  secondsIntoSlot
144
143
  });
@@ -172,7 +171,7 @@ export class SequencerTimetable {
172
171
  const available = (maxAllowed - secondsIntoSlot) / 2; // Split remaining time: half for execution, half for re-execution
173
172
  const canStart = available >= this.minExecutionTime;
174
173
  const deadline = secondsIntoSlot + available;
175
- this.log.verbose(`${canStart ? 'Can' : 'Cannot'} start single-block checkpoint at ${secondsIntoSlot}s into slot`, {
174
+ this.log?.verbose(`${canStart ? 'Can' : 'Cannot'} start single-block checkpoint at ${secondsIntoSlot}s into slot`, {
176
175
  secondsIntoSlot,
177
176
  maxAllowed,
178
177
  available,
@@ -194,7 +193,7 @@ export class SequencerTimetable {
194
193
  if (timeUntilDeadline >= this.minExecutionTime) {
195
194
  // Found an available sub-slot! Is this the last one?
196
195
  const isLastBlock = subSlot === this.maxNumberOfBlocks;
197
- this.log.verbose(`Can start ${isLastBlock ? 'last block' : 'block'} in sub-slot ${subSlot} with deadline ${deadline}s`, {
196
+ this.log?.verbose(`Can start ${isLastBlock ? 'last block' : 'block'} in sub-slot ${subSlot} with deadline ${deadline}s`, {
198
197
  secondsIntoSlot,
199
198
  deadline,
200
199
  timeUntilDeadline,
@@ -209,7 +208,7 @@ export class SequencerTimetable {
209
208
  }
210
209
  }
211
210
  // No sub-slots available with enough time
212
- this.log.verbose(`No time left to start any more blocks`, {
211
+ this.log?.verbose(`No time left to start any more blocks`, {
213
212
  secondsIntoSlot,
214
213
  maxBlocks: this.maxNumberOfBlocks,
215
214
  initializationOffset: this.initializationOffset
@@ -1,3 +1,3 @@
1
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
2
+ export type SequencerRollupConstants = Pick<L1RollupConstants, 'ethereumSlotDuration' | 'l1GenesisTime' | 'slotDuration' | 'rollupManaLimit'>;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxNQUFNLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUN6QyxpQkFBaUIsRUFDakIsc0JBQXNCLEdBQUcsZUFBZSxHQUFHLGNBQWMsR0FBRyxpQkFBaUIsQ0FDOUUsQ0FBQyJ9
@@ -1 +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"}
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,GAAG,iBAAiB,CAC9E,CAAC"}
@@ -2,7 +2,7 @@ import { type BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-ty
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { L2Block } from '@aztec/stdlib/block';
4
4
  import { Checkpoint } from '@aztec/stdlib/checkpoint';
5
- import type { FullNodeBlockBuilderConfig, ICheckpointBlockBuilder, ICheckpointsBuilder, MerkleTreeWriteOperations, PublicProcessorLimits } from '@aztec/stdlib/interfaces/server';
5
+ import type { BlockBuilderOptions, FullNodeBlockBuilderConfig, ICheckpointBlockBuilder, ICheckpointsBuilder, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
6
6
  import type { CheckpointGlobalVariables, Tx } from '@aztec/stdlib/tx';
7
7
  import type { BuildBlockInCheckpointResult } from '@aztec/validator-client';
8
8
  /**
@@ -22,7 +22,7 @@ export declare class MockCheckpointBuilder implements ICheckpointBlockBuilder {
22
22
  buildBlockCalls: Array<{
23
23
  blockNumber: BlockNumber;
24
24
  timestamp: bigint;
25
- opts: PublicProcessorLimits;
25
+ opts: BlockBuilderOptions;
26
26
  }>;
27
27
  /** Track all consumed transaction hashes across buildBlock calls */
28
28
  consumedTxHashes: Set<string>;
@@ -39,14 +39,12 @@ export declare class MockCheckpointBuilder implements ICheckpointBlockBuilder {
39
39
  */
40
40
  setBlockProvider(provider: () => L2Block): this;
41
41
  getConstantData(): CheckpointGlobalVariables;
42
- buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts: PublicProcessorLimits): Promise<BuildBlockInCheckpointResult>;
42
+ buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts: BlockBuilderOptions): Promise<BuildBlockInCheckpointResult>;
43
43
  completeCheckpoint(): Promise<Checkpoint>;
44
44
  getCheckpoint(): Promise<Checkpoint>;
45
- /**
46
- * Creates a CheckpointHeader from a block's header for testing.
47
- * This is a simplified version that creates a minimal CheckpointHeader.
48
- */
49
- private createCheckpointHeader;
45
+ private buildCheckpoint;
46
+ /** Resets per-checkpoint state (built blocks, consumed txs) while preserving config (blockProvider, seeded blocks). */
47
+ resetCheckpointState(): void;
50
48
  /** Reset for reuse in another test */
51
49
  reset(): void;
52
50
  }
@@ -94,4 +92,4 @@ export declare class MockCheckpointsBuilder implements ICheckpointsBuilder {
94
92
  /** Reset for reuse in another test */
95
93
  reset(): void;
96
94
  }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19jaGVja3BvaW50X2J1aWxkZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L21vY2tfY2hlY2twb2ludF9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sS0FBSyxFQUNWLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDdEIsTUFBTSxpQ0FBaUMsQ0FBQztBQUd6QyxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RSxPQUFPLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTVFOzs7R0FHRztBQUNILHFCQUFhLHFCQUFzQixZQUFXLHVCQUF1QjtJQXdCakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO0lBeEJuQyxPQUFPLENBQUMsTUFBTSxDQUFpQjtJQUMvQixPQUFPLENBQUMsV0FBVyxDQUFpQjtJQUNwQyxPQUFPLENBQUMsZUFBZSxDQUFjO0lBQ3JDLE9BQU8sQ0FBQyxVQUFVLENBQUs7SUFFdkIscUZBQXFGO0lBQ3JGLE9BQU8sQ0FBQyxhQUFhLENBQTBDO0lBRS9ELGlDQUFpQztJQUMxQixlQUFlLEVBQUUsS0FBSyxDQUFDO1FBQzVCLFdBQVcsRUFBRSxXQUFXLENBQUM7UUFDekIsU0FBUyxFQUFFLE1BQU0sQ0FBQztRQUNsQixJ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
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19jaGVja3BvaW50X2J1aWxkZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L21vY2tfY2hlY2twb2ludF9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFDVixtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQzFCLE1BQU0saUNBQWlDLENBQUM7QUFHekMsT0FBTyxLQUFLLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxLQUFLLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RTs7O0dBR0c7QUFDSCxxQkFBYSxxQkFBc0IsWUFBVyx1QkFBdUI7SUF3QmpFLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUztJQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQjtJQXhCbkMsT0FBTyxDQUFDLE1BQU0sQ0FBaUI7SUFDL0IsT0FBTyxDQUFDLFdBQVcsQ0FBaUI7SUFDcEMsT0FBTyxDQUFDLGVBQWUsQ0FBYztJQUNyQyxPQUFPLENBQUMsVUFBVSxDQUFLO0lBRXZCLHFGQUFxRjtJQUNyRixPQUFPLENBQUMsYUFBYSxDQUEwQztJQUUvRCxpQ0FBaUM7SUFDMUIsZUFBZSxFQUFFLEtBQUssQ0FBQztRQUM1QixXQUFXLEVBQUUsV0FBVyxDQUFDO1FBQ3pCLFNBQVMsRUFBRSxNQUFNLENBQUM7UUFDbEIsSUFBSSxFQUFFLG1CQUFtQixDQUFDO0tBQzNCLENBQUMsQ0FBTTtJQUNSLG9FQUFvRTtJQUM3RCxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQWE7SUFDMUMsd0JBQXdCLFVBQVM7SUFDakMsbUJBQW1CLFVBQVM7SUFFbkMsNERBQTREO0lBQ3JELFlBQVksRUFBRSxLQUFLLEdBQUcsU0FBUyxDQUFhO0lBRW5ELFlBQ21CLFNBQVMsRUFBRSx5QkFBeUIsRUFDcEMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ2pEO0lBRUosNEVBQTRFO0lBQzVFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBTTVEO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FJOUM7SUFFRCxlQUFlLElBQUkseUJBQXlCLENBRTNDO0lBRUssVUFBVSxDQUNkLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUM1QyxXQUFXLEVBQUUsV0FBVyxFQUN4QixTQUFTLEVBQUUsTUFBTSxFQUNqQixJQUFJLEVBQUUsbUJBQW1CLEdBQ3hCLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQTZDdkM7SUFFRCxrQkFBa0IsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLENBSXhDO0lBRUQsYUFBYSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FPbkM7WUFHYSxlQUFlO0lBaUM3Qix1SEFBdUg7SUFDdkgsb0JBQW9CLElBQUksSUFBSSxDQU0zQjtJQUVELHNDQUFzQztJQUN0QyxLQUFLLElBQUksSUFBSSxDQU9aO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gscUJBQWEsc0JBQXVCLFlBQVcsbUJBQW1CO0lBQ2hFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBb0M7SUFFN0QsaUNBQWlDO0lBQzFCLG9CQUFvQixFQUFFLEtBQUssQ0FBQztRQUNqQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztRQUNuQyxTQUFTLEVBQUUseUJBQXlCLENBQUM7UUFDckMsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLDJCQUEyQixFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztLQUMvQixDQUFDLENBQU07SUFDRCxtQkFBbUIsRUFBRSxLQUFLLENBQUM7UUFDaEMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7UUFDbkMsU0FBUyxFQUFFLHlCQUF5QixDQUFDO1FBQ3JDLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNyQiwyQkFBMkIsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQyxjQUFjLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDMUIscUJBQXFCLEVBQUUsTUFBTSxDQUFDO0tBQy9CLENBQUMsQ0FBTTtJQUNELGlCQUFpQixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFNO0lBRTFFOzs7T0FHRztJQUNILG9CQUFvQixDQUFDLE9BQU8sRUFBRSxxQkFBcUIsR0FBRyxJQUFJLENBR3pEO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCLENBQ3JCLFNBQVMsRUFBRSx5QkFBeUIsRUFDcEMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQ2pDLHFCQUFxQixDQUd2QjtJQUVELDBEQUEwRDtJQUMxRCxvQkFBb0IsSUFBSSxxQkFBcUIsR0FBRyxTQUFTLENBRXhEO0lBRUQsU0FBUyxJQUFJLDBCQUEwQixDQVF0QztJQUVELFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsSUFBSSxDQUU5RDtJQUVELGVBQWUsQ0FDYixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsU0FBUyxFQUFFLHlCQUF5QixFQUNwQyxxQkFBcUIsRUFBRSxNQUFNLEVBQzdCLGNBQWMsRUFBRSxFQUFFLEVBQUUsRUFDcEIsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLEVBQ2pDLEtBQUssRUFBRSx5QkFBeUIsR0FDL0IsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBaUJsQztJQUVELGNBQWMsQ0FDWixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsU0FBUyxFQUFFLHlCQUF5QixFQUNwQyxxQkFBcUIsRUFBRSxNQUFNLEVBQzdCLGNBQWMsRUFBRSxFQUFFLEVBQUUsRUFDcEIsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLEVBQ2pDLEtBQUssRUFBRSx5QkFBeUIsRUFDaEMsY0FBYyxHQUFFLE9BQU8sRUFBTyxHQUM3QixPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FnQmxDO0lBRUQsT0FBTyxDQUFDLFlBQVksRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBRXJFO0lBRUQsc0NBQXNDO0lBQ3RDLEtBQUssSUFBSSxJQUFJLENBS1o7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"mock_checkpoint_builder.d.ts","sourceRoot":"","sources":["../../src/test/mock_checkpoint_builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock_checkpoint_builder.d.ts","sourceRoot":"","sources":["../../src/test/mock_checkpoint_builder.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
+ import { IndexWithinCheckpoint } from '@aztec/foundation/branded-types';
1
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { unfreeze } from '@aztec/foundation/types';
4
+ import { L2Block } from '@aztec/stdlib/block';
2
5
  import { Checkpoint } from '@aztec/stdlib/checkpoint';
3
- import { Gas } from '@aztec/stdlib/gas';
4
6
  import { CheckpointHeader } from '@aztec/stdlib/rollup';
5
7
  import { makeAppendOnlyTreeSnapshot } from '@aztec/stdlib/testing';
6
8
  /**
@@ -63,8 +65,10 @@ import { makeAppendOnlyTreeSnapshot } from '@aztec/stdlib/testing';
63
65
  let block;
64
66
  let usedTxs;
65
67
  if (this.blockProvider) {
66
- // Dynamic mode: get block from provider
67
- block = this.blockProvider();
68
+ // Dynamic mode: get block from provider, cloning to avoid shared references across multiple buildBlock calls
69
+ block = L2Block.fromBuffer(this.blockProvider().toBuffer());
70
+ block.header.globalVariables.blockNumber = blockNumber;
71
+ await block.header.recomputeHash();
68
72
  usedTxs = [];
69
73
  this.builtBlocks.push(block);
70
74
  } else {
@@ -87,61 +91,63 @@ import { makeAppendOnlyTreeSnapshot } from '@aztec/stdlib/testing';
87
91
  }
88
92
  return {
89
93
  block,
90
- publicGas: Gas.empty(),
91
94
  publicProcessorDuration: 0,
92
95
  numTxs: block?.body?.txEffects?.length ?? usedTxs.length,
93
96
  usedTxs,
94
- failedTxs: [],
95
- usedTxBlobFields: block?.body?.txEffects?.reduce((sum, tx)=>sum + tx.getNumBlobFields(), 0) ?? 0
97
+ failedTxs: []
96
98
  };
97
99
  }
98
100
  completeCheckpoint() {
99
101
  this.completeCheckpointCalled = true;
100
102
  const allBlocks = this.blockProvider ? this.builtBlocks : this.blocks;
101
- const lastBlock = allBlocks[allBlocks.length - 1];
102
- // Create a CheckpointHeader from the last block's header for testing
103
- const checkpointHeader = this.createCheckpointHeader(lastBlock);
104
- return Promise.resolve(new Checkpoint(makeAppendOnlyTreeSnapshot(lastBlock.header.globalVariables.blockNumber + 1), checkpointHeader, allBlocks, this.checkpointNumber));
103
+ return this.buildCheckpoint(allBlocks);
105
104
  }
106
105
  getCheckpoint() {
107
106
  this.getCheckpointCalled = true;
108
107
  const builtBlocks = this.blockProvider ? this.builtBlocks : this.blocks.slice(0, this.blockIndex);
109
- const lastBlock = builtBlocks[builtBlocks.length - 1];
110
- if (!lastBlock) {
108
+ if (builtBlocks.length === 0) {
111
109
  throw new Error('No blocks built yet');
112
110
  }
113
- // Create a CheckpointHeader from the last block's header for testing
114
- const checkpointHeader = this.createCheckpointHeader(lastBlock);
115
- return Promise.resolve(new Checkpoint(makeAppendOnlyTreeSnapshot(lastBlock.header.globalVariables.blockNumber + 1), checkpointHeader, builtBlocks, this.checkpointNumber));
116
- }
117
- /**
118
- * Creates a CheckpointHeader from a block's header for testing.
119
- * This is a simplified version that creates a minimal CheckpointHeader.
120
- */ createCheckpointHeader(block) {
121
- const header = block.header;
122
- const gv = header.globalVariables;
123
- return CheckpointHeader.empty({
124
- lastArchiveRoot: header.lastArchive.root,
111
+ return this.buildCheckpoint(builtBlocks);
112
+ }
113
+ /** Builds a structurally valid Checkpoint from a list of blocks, fixing up indexes and archive chaining. */ async buildCheckpoint(blocks) {
114
+ // Fix up indexWithinCheckpoint and archive chaining so the checkpoint passes structural validation.
115
+ for(let i = 0; i < blocks.length; i++){
116
+ blocks[i].indexWithinCheckpoint = IndexWithinCheckpoint(i);
117
+ if (i > 0) {
118
+ unfreeze(blocks[i].header).lastArchive = blocks[i - 1].archive;
119
+ await blocks[i].header.recomputeHash();
120
+ }
121
+ }
122
+ const firstBlock = blocks[0];
123
+ const lastBlock = blocks[blocks.length - 1];
124
+ const gv = firstBlock.header.globalVariables;
125
+ const checkpointHeader = CheckpointHeader.empty({
126
+ lastArchiveRoot: firstBlock.header.lastArchive.root,
125
127
  blockHeadersHash: Fr.random(),
126
128
  slotNumber: gv.slotNumber,
127
129
  timestamp: gv.timestamp,
128
130
  coinbase: gv.coinbase,
129
131
  feeRecipient: gv.feeRecipient,
130
132
  gasFees: gv.gasFees,
131
- totalManaUsed: header.totalManaUsed
133
+ totalManaUsed: lastBlock.header.totalManaUsed
132
134
  });
135
+ return new Checkpoint(makeAppendOnlyTreeSnapshot(lastBlock.header.globalVariables.blockNumber + 1), checkpointHeader, blocks, this.checkpointNumber);
133
136
  }
134
- /** Reset for reuse in another test */ reset() {
135
- this.blocks = [];
137
+ /** Resets per-checkpoint state (built blocks, consumed txs) while preserving config (blockProvider, seeded blocks). */ resetCheckpointState() {
136
138
  this.builtBlocks = [];
137
- this.usedTxsPerBlock = [];
138
139
  this.blockIndex = 0;
139
- this.buildBlockCalls = [];
140
140
  this.consumedTxHashes.clear();
141
141
  this.completeCheckpointCalled = false;
142
142
  this.getCheckpointCalled = false;
143
+ }
144
+ /** Reset for reuse in another test */ reset() {
145
+ this.blocks = [];
146
+ this.usedTxsPerBlock = [];
147
+ this.buildBlockCalls = [];
143
148
  this.errorOnBuild = undefined;
144
149
  this.blockProvider = undefined;
150
+ this.resetCheckpointState();
145
151
  }
146
152
  }
147
153
  /**
@@ -175,7 +181,8 @@ import { makeAppendOnlyTreeSnapshot } from '@aztec/stdlib/testing';
175
181
  l1GenesisTime: 0n,
176
182
  slotDuration: 24,
177
183
  l1ChainId: 1,
178
- rollupVersion: 1
184
+ rollupVersion: 1,
185
+ rollupManaLimit: 200_000_000
179
186
  };
180
187
  }
181
188
  updateConfig(config) {
@@ -192,6 +199,8 @@ import { makeAppendOnlyTreeSnapshot } from '@aztec/stdlib/testing';
192
199
  if (!this.checkpointBuilder) {
193
200
  // Auto-create a builder if none was set
194
201
  this.checkpointBuilder = new MockCheckpointBuilder(constants, checkpointNumber);
202
+ } else {
203
+ this.checkpointBuilder.resetCheckpointState();
195
204
  }
196
205
  return Promise.resolve(this.checkpointBuilder);
197
206
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/sequencer-client",
3
- "version": "0.0.1-commit.dbf9cec",
3
+ "version": "0.0.1-commit.e0f15ab9b",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -26,38 +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": "0.0.1-commit.dbf9cec",
30
- "@aztec/bb-prover": "0.0.1-commit.dbf9cec",
31
- "@aztec/blob-client": "0.0.1-commit.dbf9cec",
32
- "@aztec/blob-lib": "0.0.1-commit.dbf9cec",
33
- "@aztec/constants": "0.0.1-commit.dbf9cec",
34
- "@aztec/epoch-cache": "0.0.1-commit.dbf9cec",
35
- "@aztec/ethereum": "0.0.1-commit.dbf9cec",
36
- "@aztec/foundation": "0.0.1-commit.dbf9cec",
37
- "@aztec/l1-artifacts": "0.0.1-commit.dbf9cec",
38
- "@aztec/merkle-tree": "0.0.1-commit.dbf9cec",
39
- "@aztec/node-keystore": "0.0.1-commit.dbf9cec",
40
- "@aztec/noir-acvm_js": "0.0.1-commit.dbf9cec",
41
- "@aztec/noir-contracts.js": "0.0.1-commit.dbf9cec",
42
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.dbf9cec",
43
- "@aztec/noir-types": "0.0.1-commit.dbf9cec",
44
- "@aztec/p2p": "0.0.1-commit.dbf9cec",
45
- "@aztec/protocol-contracts": "0.0.1-commit.dbf9cec",
46
- "@aztec/prover-client": "0.0.1-commit.dbf9cec",
47
- "@aztec/simulator": "0.0.1-commit.dbf9cec",
48
- "@aztec/slasher": "0.0.1-commit.dbf9cec",
49
- "@aztec/stdlib": "0.0.1-commit.dbf9cec",
50
- "@aztec/telemetry-client": "0.0.1-commit.dbf9cec",
51
- "@aztec/validator-client": "0.0.1-commit.dbf9cec",
52
- "@aztec/validator-ha-signer": "0.0.1-commit.dbf9cec",
53
- "@aztec/world-state": "0.0.1-commit.dbf9cec",
29
+ "@aztec/aztec.js": "0.0.1-commit.e0f15ab9b",
30
+ "@aztec/bb-prover": "0.0.1-commit.e0f15ab9b",
31
+ "@aztec/blob-client": "0.0.1-commit.e0f15ab9b",
32
+ "@aztec/blob-lib": "0.0.1-commit.e0f15ab9b",
33
+ "@aztec/constants": "0.0.1-commit.e0f15ab9b",
34
+ "@aztec/epoch-cache": "0.0.1-commit.e0f15ab9b",
35
+ "@aztec/ethereum": "0.0.1-commit.e0f15ab9b",
36
+ "@aztec/foundation": "0.0.1-commit.e0f15ab9b",
37
+ "@aztec/l1-artifacts": "0.0.1-commit.e0f15ab9b",
38
+ "@aztec/node-keystore": "0.0.1-commit.e0f15ab9b",
39
+ "@aztec/noir-acvm_js": "0.0.1-commit.e0f15ab9b",
40
+ "@aztec/noir-contracts.js": "0.0.1-commit.e0f15ab9b",
41
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.e0f15ab9b",
42
+ "@aztec/noir-types": "0.0.1-commit.e0f15ab9b",
43
+ "@aztec/p2p": "0.0.1-commit.e0f15ab9b",
44
+ "@aztec/protocol-contracts": "0.0.1-commit.e0f15ab9b",
45
+ "@aztec/prover-client": "0.0.1-commit.e0f15ab9b",
46
+ "@aztec/simulator": "0.0.1-commit.e0f15ab9b",
47
+ "@aztec/slasher": "0.0.1-commit.e0f15ab9b",
48
+ "@aztec/stdlib": "0.0.1-commit.e0f15ab9b",
49
+ "@aztec/telemetry-client": "0.0.1-commit.e0f15ab9b",
50
+ "@aztec/validator-client": "0.0.1-commit.e0f15ab9b",
51
+ "@aztec/validator-ha-signer": "0.0.1-commit.e0f15ab9b",
52
+ "@aztec/world-state": "0.0.1-commit.e0f15ab9b",
54
53
  "lodash.chunk": "^4.2.0",
55
54
  "tslib": "^2.4.0",
56
55
  "viem": "npm:@aztec/viem@2.38.2"
57
56
  },
58
57
  "devDependencies": {
59
- "@aztec/archiver": "0.0.1-commit.dbf9cec",
60
- "@aztec/kv-store": "0.0.1-commit.dbf9cec",
58
+ "@aztec/archiver": "0.0.1-commit.e0f15ab9b",
59
+ "@aztec/kv-store": "0.0.1-commit.e0f15ab9b",
61
60
  "@electric-sql/pglite": "^0.3.14",
62
61
  "@jest/globals": "^30.0.0",
63
62
  "@types/jest": "^30.0.0",
@@ -1,4 +1,5 @@
1
1
  import type { BlobClientInterface } from '@aztec/blob-client/client';
2
+ import { MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT } from '@aztec/constants';
2
3
  import { EpochCache } from '@aztec/epoch-cache';
3
4
  import { isAnvilTestChain } from '@aztec/ethereum/chain';
4
5
  import { getPublicClient } from '@aztec/ethereum/client';
@@ -19,7 +20,7 @@ import { L1Metrics, type TelemetryClient } from '@aztec/telemetry-client';
19
20
  import { FullNodeCheckpointsBuilder, NodeKeystoreAdapter, type ValidatorClient } from '@aztec/validator-client';
20
21
 
21
22
  import { type SequencerClientConfig, getPublisherConfigFromSequencerConfig } from '../config.js';
22
- import { GlobalVariableBuilder } from '../global_variable_builder/index.js';
23
+ import type { GlobalVariableBuilder } from '../global_variable_builder/index.js';
23
24
  import { SequencerPublisherFactory } from '../publisher/sequencer-publisher-factory.js';
24
25
  import { Sequencer, type SequencerConfig } from '../sequencer/index.js';
25
26
 
@@ -64,7 +65,9 @@ export class SequencerClient {
64
65
  dateProvider: DateProvider;
65
66
  epochCache?: EpochCache;
66
67
  l1TxUtils: L1TxUtils[];
68
+ funderL1TxUtils?: L1TxUtils;
67
69
  nodeKeyStore: KeystoreManager;
70
+ globalVariableBuilder: GlobalVariableBuilder;
68
71
  },
69
72
  ) {
70
73
  const {
@@ -86,16 +89,14 @@ export class SequencerClient {
86
89
  publicClient,
87
90
  l1TxUtils.map(x => x.getSenderAddress()),
88
91
  );
89
- const publisherManager = new PublisherManager(
90
- l1TxUtils,
91
- getPublisherConfigFromSequencerConfig(config),
92
- log.getBindings(),
93
- );
92
+ const publisherManager = new PublisherManager(l1TxUtils, getPublisherConfigFromSequencerConfig(config), {
93
+ bindings: log.getBindings(),
94
+ funder: deps.funderL1TxUtils,
95
+ });
94
96
  const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
95
- const [l1GenesisTime, slotDuration, rollupVersion, rollupManaLimit] = await Promise.all([
97
+ const [l1GenesisTime, slotDuration, rollupManaLimit] = await Promise.all([
96
98
  rollupContract.getL1GenesisTime(),
97
99
  rollupContract.getSlotDuration(),
98
- rollupContract.getVersion(),
99
100
  rollupContract.getManaLimit().then(Number),
100
101
  ] as const);
101
102
 
@@ -112,6 +113,7 @@ export class SequencerClient {
112
113
  l1ChainId: chainId,
113
114
  viemPollingIntervalMS: config.viemPollingIntervalMS,
114
115
  ethereumSlotDuration: config.ethereumSlotDuration,
116
+ enableProposerPipelining: config.enableProposerPipelining,
115
117
  },
116
118
  { dateProvider: deps.dateProvider },
117
119
  ));
@@ -137,17 +139,8 @@ export class SequencerClient {
137
139
  });
138
140
 
139
141
  const ethereumSlotDuration = config.ethereumSlotDuration;
140
- const l1Constants = { l1GenesisTime, slotDuration: Number(slotDuration), ethereumSlotDuration };
141
-
142
- const globalsBuilder = new GlobalVariableBuilder({ ...config, ...l1Constants, rollupVersion });
143
142
 
144
- let sequencerManaLimit = config.maxL2BlockGas ?? rollupManaLimit;
145
- if (sequencerManaLimit > rollupManaLimit) {
146
- log.warn(
147
- `Provided maxL2BlockGas ${sequencerManaLimit} is greater than the max allowed by L1. Setting limit to ${rollupManaLimit}.`,
148
- );
149
- sequencerManaLimit = rollupManaLimit;
150
- }
143
+ const globalsBuilder = deps.globalVariableBuilder;
151
144
 
152
145
  // When running in anvil, assume we can post a tx up until one second before the end of an L1 slot.
153
146
  // Otherwise, we need the full L1 slot duration for publishing to ensure inclusion.
@@ -157,6 +150,10 @@ export class SequencerClient {
157
150
  const l1PublishingTimeBasedOnChain = isAnvilTestChain(config.l1ChainId) ? 1 : ethereumSlotDuration;
158
151
  const l1PublishingTime = config.l1PublishingTime ?? l1PublishingTimeBasedOnChain;
159
152
 
153
+ const { maxL2BlockGas, maxDABlockGas, maxTxsPerBlock } = capPerBlockLimits(config, rollupManaLimit, log);
154
+
155
+ const l1Constants = { l1GenesisTime, slotDuration: Number(slotDuration), ethereumSlotDuration, rollupManaLimit };
156
+
160
157
  const sequencer = new Sequencer(
161
158
  publisherFactory,
162
159
  validatorClient,
@@ -171,7 +168,7 @@ export class SequencerClient {
171
168
  deps.dateProvider,
172
169
  epochCache,
173
170
  rollupContract,
174
- { ...config, l1PublishingTime, maxL2BlockGas: sequencerManaLimit },
171
+ { ...config, l1PublishingTime, maxL2BlockGas, maxDABlockGas, maxTxsPerBlock },
175
172
  telemetryClient,
176
173
  log,
177
174
  );
@@ -199,7 +196,7 @@ export class SequencerClient {
199
196
  await this.validatorClient?.start();
200
197
  this.sequencer.start();
201
198
  this.l1Metrics?.start();
202
- await this.publisherManager.loadState();
199
+ await this.publisherManager.start();
203
200
  }
204
201
 
205
202
  /**
@@ -208,7 +205,7 @@ export class SequencerClient {
208
205
  public async stop() {
209
206
  await this.sequencer.stop();
210
207
  await this.validatorClient?.stop();
211
- this.publisherManager.interrupt();
208
+ await this.publisherManager.stop();
212
209
  this.l1Metrics?.stop();
213
210
  }
214
211
 
@@ -234,3 +231,41 @@ export class SequencerClient {
234
231
  return this.sequencer.maxL2BlockGas;
235
232
  }
236
233
  }
234
+
235
+ /**
236
+ * Caps operator-provided per-block limits at checkpoint-level limits.
237
+ * Returns undefined for any limit the operator didn't set — the checkpoint builder handles redistribution.
238
+ */
239
+ function capPerBlockLimits(
240
+ config: SequencerClientConfig,
241
+ rollupManaLimit: number,
242
+ log: ReturnType<typeof createLogger>,
243
+ ): { maxL2BlockGas: number | undefined; maxDABlockGas: number | undefined; maxTxsPerBlock: number | undefined } {
244
+ let maxL2BlockGas = config.maxL2BlockGas;
245
+ if (maxL2BlockGas !== undefined && maxL2BlockGas > rollupManaLimit) {
246
+ log.warn(`Provided MAX_L2_BLOCK_GAS ${maxL2BlockGas} exceeds rollup mana limit ${rollupManaLimit} (capping)`);
247
+ maxL2BlockGas = rollupManaLimit;
248
+ }
249
+
250
+ let maxDABlockGas = config.maxDABlockGas;
251
+ if (maxDABlockGas !== undefined && maxDABlockGas > MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT) {
252
+ log.warn(
253
+ `Provided MAX_DA_BLOCK_GAS ${maxDABlockGas} exceeds DA checkpoint limit ${MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT} (capping)`,
254
+ );
255
+ maxDABlockGas = MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT;
256
+ }
257
+
258
+ let maxTxsPerBlock = config.maxTxsPerBlock;
259
+ if (
260
+ maxTxsPerBlock !== undefined &&
261
+ config.maxTxsPerCheckpoint !== undefined &&
262
+ maxTxsPerBlock > config.maxTxsPerCheckpoint
263
+ ) {
264
+ log.warn(
265
+ `Provided MAX_TX_PER_BLOCK ${maxTxsPerBlock} exceeds MAX_TX_PER_CHECKPOINT ${config.maxTxsPerCheckpoint} (capping)`,
266
+ );
267
+ maxTxsPerBlock = config.maxTxsPerCheckpoint;
268
+ }
269
+
270
+ return { maxL2BlockGas, maxDABlockGas, maxTxsPerBlock };
271
+ }
package/src/config.ts CHANGED
@@ -13,8 +13,10 @@ import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p/config';
13
13
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
14
14
  import {
15
15
  type ChainConfig,
16
+ type PipelineConfig,
16
17
  type SequencerConfig,
17
18
  chainConfigMappings,
19
+ pipelineConfigMappings,
18
20
  sharedSequencerConfigMappings,
19
21
  } from '@aztec/stdlib/config';
20
22
  import type { ResolvedSequencerConfig } from '@aztec/stdlib/interfaces/server';
@@ -35,15 +37,13 @@ export type { SequencerConfig };
35
37
  * Default values for SequencerConfig.
36
38
  * Centralized location for all sequencer configuration defaults.
37
39
  */
38
- export const DefaultSequencerConfig: ResolvedSequencerConfig = {
40
+ export const DefaultSequencerConfig = {
39
41
  sequencerPollingIntervalMS: 500,
40
- maxTxsPerBlock: 32,
41
42
  minTxsPerBlock: 1,
42
43
  buildCheckpointIfEmpty: false,
43
44
  publishTxsWithProposals: false,
44
- maxL2BlockGas: 10e9,
45
- maxDABlockGas: 10e9,
46
- maxBlockSizeInBytes: 1024 * 1024,
45
+ perBlockAllocationMultiplier: 1.2,
46
+ redistributeCheckpointBudget: true,
47
47
  enforceTimeTable: true,
48
48
  attestationPropagationTime: DEFAULT_P2P_PROPAGATION_TIME,
49
49
  secondsBeforeInvalidatingBlockAsCommitteeMember: 144, // 12 L1 blocks
@@ -52,11 +52,13 @@ export const DefaultSequencerConfig: ResolvedSequencerConfig = {
52
52
  skipInvalidateBlockAsProposer: false,
53
53
  broadcastInvalidBlockProposal: false,
54
54
  injectFakeAttestation: false,
55
+ injectHighSValueAttestation: false,
56
+ injectUnrecoverableSignatureAttestation: false,
55
57
  fishermanMode: false,
56
58
  shuffleAttestationOrdering: false,
57
59
  skipPushProposedBlocksToArchiver: false,
58
60
  skipPublishingCheckpointsPercent: 0,
59
- };
61
+ } satisfies ResolvedSequencerConfig;
60
62
 
61
63
  /**
62
64
  * Configuration settings for the SequencerClient.
@@ -68,7 +70,8 @@ export type SequencerClientConfig = SequencerPublisherConfig &
68
70
  SequencerConfig &
69
71
  L1ReaderConfig &
70
72
  ChainConfig &
71
- Pick<P2PConfig, 'txPublicSetupAllowList'> &
73
+ PipelineConfig &
74
+ Pick<P2PConfig, 'txPublicSetupAllowListExtend'> &
72
75
  Pick<L1ContractsConfig, 'ethereumSlotDuration' | 'aztecSlotDuration' | 'aztecEpochDuration'>;
73
76
 
74
77
  export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
@@ -77,10 +80,10 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
77
80
  description: 'The number of ms to wait between polling for checking to build on the next slot.',
78
81
  ...numberConfigHelper(DefaultSequencerConfig.sequencerPollingIntervalMS),
79
82
  },
80
- maxTxsPerBlock: {
81
- env: 'SEQ_MAX_TX_PER_BLOCK',
82
- description: 'The maximum number of txs to include in a block.',
83
- ...numberConfigHelper(DefaultSequencerConfig.maxTxsPerBlock),
83
+ maxTxsPerCheckpoint: {
84
+ env: 'SEQ_MAX_TX_PER_CHECKPOINT',
85
+ description: 'The maximum number of txs across all blocks in a checkpoint.',
86
+ parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
84
87
  },
85
88
  minTxsPerBlock: {
86
89
  env: 'SEQ_MIN_TX_PER_BLOCK',
@@ -99,12 +102,25 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
99
102
  maxL2BlockGas: {
100
103
  env: 'SEQ_MAX_L2_BLOCK_GAS',
101
104
  description: 'The maximum L2 block gas.',
102
- ...numberConfigHelper(DefaultSequencerConfig.maxL2BlockGas),
105
+ parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
103
106
  },
104
107
  maxDABlockGas: {
105
108
  env: 'SEQ_MAX_DA_BLOCK_GAS',
106
109
  description: 'The maximum DA block gas.',
107
- ...numberConfigHelper(DefaultSequencerConfig.maxDABlockGas),
110
+ parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
111
+ },
112
+ perBlockAllocationMultiplier: {
113
+ env: 'SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER',
114
+ description:
115
+ 'Per-block gas budget multiplier for both L2 and DA gas. Budget per block is (checkpointLimit / maxBlocks) * multiplier.' +
116
+ ' Values greater than one allow early blocks to use more than their even share, relying on checkpoint-level capping for later blocks.',
117
+ ...numberConfigHelper(DefaultSequencerConfig.perBlockAllocationMultiplier),
118
+ },
119
+ redistributeCheckpointBudget: {
120
+ env: 'SEQ_REDISTRIBUTE_CHECKPOINT_BUDGET',
121
+ description:
122
+ 'Redistribute remaining checkpoint budget evenly across remaining blocks instead of allowing a single block to consume the entire remaining budget.',
123
+ ...booleanConfigHelper(DefaultSequencerConfig.redistributeCheckpointBudget),
108
124
  },
109
125
  coinbase: {
110
126
  env: 'COINBASE',
@@ -124,11 +140,6 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
124
140
  env: 'ACVM_BINARY_PATH',
125
141
  description: 'The path to the ACVM binary',
126
142
  },
127
- maxBlockSizeInBytes: {
128
- env: 'SEQ_MAX_BLOCK_SIZE_IN_BYTES',
129
- description: 'Max block size',
130
- ...numberConfigHelper(DefaultSequencerConfig.maxBlockSizeInBytes),
131
- },
132
143
  enforceTimeTable: {
133
144
  env: 'SEQ_ENFORCE_TIME_TABLE',
134
145
  description: 'Whether to enforce the time table when building blocks',
@@ -186,6 +197,14 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
186
197
  description: 'Inject a fake attestation (for testing only)',
187
198
  ...booleanConfigHelper(DefaultSequencerConfig.injectFakeAttestation),
188
199
  },
200
+ injectHighSValueAttestation: {
201
+ description: 'Inject a malleable attestation with a high-s value (for testing only)',
202
+ ...booleanConfigHelper(DefaultSequencerConfig.injectHighSValueAttestation),
203
+ },
204
+ injectUnrecoverableSignatureAttestation: {
205
+ description: 'Inject an attestation with an unrecoverable signature (for testing only)',
206
+ ...booleanConfigHelper(DefaultSequencerConfig.injectUnrecoverableSignatureAttestation),
207
+ },
189
208
  fishermanMode: {
190
209
  env: 'FISHERMAN_MODE',
191
210
  description:
@@ -214,7 +233,7 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
214
233
  description: 'Percent probability (0 - 100) of sequencer skipping checkpoint publishing (testing only)',
215
234
  ...numberConfigHelper(DefaultSequencerConfig.skipPublishingCheckpointsPercent),
216
235
  },
217
- ...pickConfigMappings(p2pConfigMappings, ['txPublicSetupAllowList']),
236
+ ...pickConfigMappings(p2pConfigMappings, ['txPublicSetupAllowListExtend']),
218
237
  };
219
238
 
220
239
  export const sequencerClientConfigMappings: ConfigMappingsType<SequencerClientConfig> = {
@@ -225,6 +244,7 @@ export const sequencerClientConfigMappings: ConfigMappingsType<SequencerClientCo
225
244
  ...sequencerTxSenderConfigMappings,
226
245
  ...sequencerPublisherConfigMappings,
227
246
  ...chainConfigMappings,
247
+ ...pipelineConfigMappings,
228
248
  ...pickConfigMappings(l1ContractsConfigMappings, ['ethereumSlotDuration', 'aztecSlotDuration', 'aztecEpochDuration']),
229
249
  };
230
250