@aztec/sequencer-client 0.0.1-commit.b6e433891 → 0.0.1-commit.b9865e97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +281 -21
- package/dest/client/sequencer-client.d.ts +8 -3
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +17 -23
- package/dest/config.d.ts +6 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +35 -15
- package/dest/global_variable_builder/fee_predictor.d.ts +37 -0
- package/dest/global_variable_builder/fee_predictor.d.ts.map +1 -0
- package/dest/global_variable_builder/fee_predictor.js +128 -0
- package/dest/global_variable_builder/fee_provider.d.ts +21 -0
- package/dest/global_variable_builder/fee_provider.d.ts.map +1 -0
- package/dest/global_variable_builder/fee_provider.js +58 -0
- package/dest/global_variable_builder/global_builder.d.ts +14 -14
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +16 -51
- package/dest/global_variable_builder/index.d.ts +4 -2
- package/dest/global_variable_builder/index.d.ts.map +1 -1
- package/dest/global_variable_builder/index.js +2 -0
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/publisher/config.d.ts +15 -3
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +19 -4
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts +3 -4
- package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts.map +1 -1
- package/dest/publisher/sequencer-bundle-simulator.d.ts +96 -0
- package/dest/publisher/sequencer-bundle-simulator.d.ts.map +1 -0
- package/dest/publisher/sequencer-bundle-simulator.js +198 -0
- package/dest/publisher/sequencer-publisher-factory.d.ts +3 -5
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +2 -3
- package/dest/publisher/sequencer-publisher.d.ts +70 -64
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +312 -533
- package/dest/sequencer/automine/automine_factory.d.ts +54 -0
- package/dest/sequencer/automine/automine_factory.d.ts.map +1 -0
- package/dest/sequencer/automine/automine_factory.js +84 -0
- package/dest/sequencer/automine/automine_sequencer.d.ts +151 -0
- package/dest/sequencer/automine/automine_sequencer.d.ts.map +1 -0
- package/dest/sequencer/automine/automine_sequencer.js +509 -0
- package/dest/sequencer/chain_state_overrides.d.ts +61 -0
- package/dest/sequencer/chain_state_overrides.d.ts.map +1 -0
- package/dest/sequencer/chain_state_overrides.js +98 -0
- package/dest/sequencer/checkpoint_proposal_job.d.ts +55 -13
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +668 -164
- package/dest/sequencer/checkpoint_proposal_job_metrics.d.ts +34 -0
- package/dest/sequencer/checkpoint_proposal_job_metrics.d.ts.map +1 -0
- package/dest/sequencer/checkpoint_proposal_job_metrics.js +72 -0
- package/dest/sequencer/checkpoint_voter.d.ts +1 -2
- package/dest/sequencer/checkpoint_voter.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_voter.js +2 -5
- package/dest/sequencer/events.d.ts +47 -2
- package/dest/sequencer/events.d.ts.map +1 -1
- package/dest/sequencer/index.d.ts +3 -1
- package/dest/sequencer/index.d.ts.map +1 -1
- package/dest/sequencer/index.js +2 -0
- package/dest/sequencer/metrics.d.ts +9 -10
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +34 -20
- package/dest/sequencer/sequencer.d.ts +59 -11
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +304 -74
- package/dest/sequencer/timetable.d.ts +11 -1
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +41 -36
- package/dest/sequencer/types.d.ts +2 -2
- package/dest/sequencer/types.d.ts.map +1 -1
- package/dest/test/utils.d.ts +1 -1
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +7 -6
- package/package.json +27 -27
- package/src/client/sequencer-client.ts +28 -31
- package/src/config.ts +40 -15
- package/src/global_variable_builder/README.md +44 -0
- package/src/global_variable_builder/fee_predictor.ts +172 -0
- package/src/global_variable_builder/fee_provider.ts +75 -0
- package/src/global_variable_builder/global_builder.ts +25 -63
- package/src/global_variable_builder/index.ts +3 -1
- package/src/index.ts +10 -1
- package/src/publisher/config.ts +40 -6
- package/src/publisher/l1_tx_failed_store/failed_tx_store.ts +3 -1
- package/src/publisher/sequencer-bundle-simulator.ts +254 -0
- package/src/publisher/sequencer-publisher-factory.ts +3 -6
- package/src/publisher/sequencer-publisher.ts +368 -577
- package/src/sequencer/README.md +162 -450
- package/src/sequencer/automine/README.md +46 -0
- package/src/sequencer/automine/automine_factory.ts +145 -0
- package/src/sequencer/automine/automine_sequencer.ts +595 -0
- package/src/sequencer/chain_state_overrides.ts +162 -0
- package/src/sequencer/checkpoint_proposal_job.ts +769 -185
- package/src/sequencer/checkpoint_proposal_job_metrics.ts +128 -0
- package/src/sequencer/checkpoint_voter.ts +1 -12
- package/src/sequencer/events.ts +51 -2
- package/src/sequencer/index.ts +2 -0
- package/src/sequencer/metrics.ts +43 -24
- package/src/sequencer/sequencer.ts +360 -83
- package/src/sequencer/timetable.ts +49 -44
- package/src/sequencer/types.ts +1 -1
- package/src/test/utils.ts +28 -10
|
@@ -4,6 +4,7 @@ import { SequencerState } from './utils.js';
|
|
|
4
4
|
export declare class SequencerTimetable {
|
|
5
5
|
private readonly metrics?;
|
|
6
6
|
private readonly log?;
|
|
7
|
+
private readonly checkpointTiming;
|
|
7
8
|
/**
|
|
8
9
|
* How late into the slot can we be to start working. Computed as the total time needed for assembling and publishing a block,
|
|
9
10
|
* assuming an execution time equal to `minExecutionTime`, subtracted from the slot duration. This means that, if the proposer
|
|
@@ -50,6 +51,11 @@ export declare class SequencerTimetable {
|
|
|
50
51
|
readonly blockDuration: number | undefined;
|
|
51
52
|
/** Maximum number of blocks that can be built in this slot configuration */
|
|
52
53
|
readonly maxNumberOfBlocks: number;
|
|
54
|
+
/**
|
|
55
|
+
* How far into the target slot assembly and attestation collection can start when pipelining.
|
|
56
|
+
* Production-like timing keeps this at zero; fast local publishing profiles can use the attestation window.
|
|
57
|
+
*/
|
|
58
|
+
readonly pipeliningAttestationGracePeriod: number;
|
|
53
59
|
constructor(opts: {
|
|
54
60
|
ethereumSlotDuration: number;
|
|
55
61
|
aztecSlotDuration: number;
|
|
@@ -58,6 +64,10 @@ export declare class SequencerTimetable {
|
|
|
58
64
|
blockDurationMs?: number;
|
|
59
65
|
enforce: boolean;
|
|
60
66
|
}, metrics?: SequencerMetrics | undefined, log?: Logger | undefined);
|
|
67
|
+
getCheckpointAssemblyDeadline(): number;
|
|
68
|
+
getCheckpointAttestationDeadline(): number;
|
|
69
|
+
getCheckpointAttestationStartDeadline(): number;
|
|
70
|
+
getCheckpointPublishingDeadline(): number;
|
|
61
71
|
getMaxAllowedTime(state: Extract<SequencerState, SequencerState.STOPPED | SequencerState.IDLE | SequencerState.SYNCHRONIZING>): undefined;
|
|
62
72
|
getMaxAllowedTime(state: Exclude<SequencerState, SequencerState.STOPPED | SequencerState.IDLE | SequencerState.SYNCHRONIZING>): number;
|
|
63
73
|
getMaxAllowedTime(state: SequencerState): number | undefined;
|
|
@@ -85,4 +95,4 @@ export declare class SequencerTimetable {
|
|
|
85
95
|
isLastBlock: boolean;
|
|
86
96
|
};
|
|
87
97
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3RpbWV0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVdwRCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTVDLHFCQUFhLGtCQUFrQjtJQTZFM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUE3RXZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQW1CO0lBRXBEOzs7O09BSUc7SUFDSCxTQUFnQixrQkFBa0IsRUFBRSxNQUFNLENBQUM7SUFFM0M7Ozs7T0FJRztJQUNILFNBQWdCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQztJQUU3Qzs7Ozs7T0FLRztJQUNILFNBQWdCLDBCQUEwQixFQUFFLE1BQU0sQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0gsU0FBZ0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBRXpDOzs7T0FHRztJQUNILFNBQWdCLGdCQUFnQixFQUFFLE1BQU0sQ0FBc0I7SUFFOUQsdURBQXVEO0lBQ3ZELFNBQWdCLDRCQUE0QixFQUFFLE1BQU0sQ0FBa0M7SUFFdEYsbUdBQW1HO0lBQ25HLFNBQWdCLGtCQUFrQixFQUFFLE1BQU0sQ0FBQztJQUUzQyxtRkFBbUY7SUFDbkYsU0FBZ0Isc0JBQXNCLEVBQUUsTUFBTSxDQUE0QjtJQUUxRSx3Q0FBd0M7SUFDeEMsU0FBZ0Isb0JBQW9CLEVBQUUsTUFBTSxDQUFDO0lBRTdDLGtGQUFrRjtJQUNsRixTQUFnQixpQkFBaUIsRUFBRSxNQUFNLENBQUM7SUFFMUMsNERBQTREO0lBQzVELFNBQWdCLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFFakMsb0dBQW9HO0lBQ3BHLFNBQWdCLGFBQWEsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBRWxELDRFQUE0RTtJQUM1RSxTQUFnQixpQkFBaUIsRUFBRSxNQUFNLENBQUM7SUFFMUM7OztPQUdHO0lBQ0gsU0FBZ0IsZ0NBQWdDLEVBQUUsTUFBTSxDQUFDO0lBRXpELFlBQ0UsSUFBSSxFQUFFO1FBQ0osb0JBQW9CLEVBQUUsTUFBTSxDQUFDO1FBQzdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUMxQixnQkFBZ0IsRUFBRSxNQUFNLENBQUM7UUFDekIsa0JBQWtCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDNUIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxPQUFPLENBQUM7S0FDbEIsRUFDZ0IsT0FBTyxDQUFDLDhCQUFrQixFQUMxQixHQUFHLENBQUMsb0JBQVEsRUFxRDlCO0lBRU0sNkJBQTZCLElBQUksTUFBTSxDQUU3QztJQUVNLGdDQUFnQyxJQUFJLE1BQU0sQ0FFaEQ7SUFFTSxxQ0FBcUMsSUFBSSxNQUFNLENBRXJEO0lBRU0sK0JBQStCLElBQUksTUFBTSxDQUUvQztJQUVNLGlCQUFpQixDQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxHQUMxRyxTQUFTLENBQUM7SUFDTixpQkFBaUIsQ0FDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FDMUcsTUFBTSxDQUFDO0lBQ0gsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGNBQWMsR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBNEI3RCxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxRQWlCdEU7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGlCQUFpQixDQUN0QixlQUFlLEVBQUUsTUFBTSxHQUVyQjtRQUFFLFFBQVEsRUFBRSxJQUFJLENBQUM7UUFBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO1FBQUMsV0FBVyxFQUFFLElBQUksQ0FBQTtLQUFFLEdBQzFEO1FBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQztRQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7UUFBQyxXQUFXLEVBQUUsS0FBSyxDQUFBO0tBQUUsR0FDNUQ7UUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUFDLFdBQVcsRUFBRSxPQUFPLENBQUE7S0FBRSxDQXdEaEU7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timetable.d.ts","sourceRoot":"","sources":["../../src/sequencer/timetable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"timetable.d.ts","sourceRoot":"","sources":["../../src/sequencer/timetable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAWpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,qBAAa,kBAAkB;IA6E3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IA7EvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;IAE3C;;;;OAIG;IACH,SAAgB,oBAAoB,EAAE,MAAM,CAAC;IAE7C;;;;;OAKG;IACH,SAAgB,0BAA0B,EAAE,MAAM,CAAC;IAEnD;;;;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,mFAAmF;IACnF,SAAgB,sBAAsB,EAAE,MAAM,CAA4B;IAE1E,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,4EAA4E;IAC5E,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IAE1C;;;OAGG;IACH,SAAgB,gCAAgC,EAAE,MAAM,CAAC;IAEzD,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,CAAC,oBAAQ,EAqD9B;IAEM,6BAA6B,IAAI,MAAM,CAE7C;IAEM,gCAAgC,IAAI,MAAM,CAEhD;IAEM,qCAAqC,IAAI,MAAM,CAErD;IAEM,+BAA+B,IAAI,MAAM,CAE/C;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;IA4B7D,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,QAiBtE;IAED;;;;;;;;OAQG;IACI,iBAAiB,CACtB,eAAe,EAAE,MAAM,GAErB;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAC;QAAC,WAAW,EAAE,IAAI,CAAA;KAAE,GAC1D;QAAE,QAAQ,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAC;QAAC,WAAW,EAAE,KAAK,CAAA;KAAE,GAC5D;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAwDhE;CACF"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { CHECKPOINT_ASSEMBLE_TIME, CHECKPOINT_INITIALIZATION_TIME, DEFAULT_P2P_PROPAGATION_TIME, MIN_EXECUTION_TIME } from '@aztec/stdlib/timetable';
|
|
1
|
+
import { CHECKPOINT_ASSEMBLE_TIME, CHECKPOINT_INITIALIZATION_TIME, DEFAULT_P2P_PROPAGATION_TIME, MIN_EXECUTION_TIME, createCheckpointTimingModel } from '@aztec/stdlib/timetable';
|
|
2
2
|
import { SequencerTooSlowError } from './errors.js';
|
|
3
3
|
import { SequencerState } from './utils.js';
|
|
4
4
|
export class SequencerTimetable {
|
|
5
5
|
metrics;
|
|
6
6
|
log;
|
|
7
|
+
checkpointTiming;
|
|
7
8
|
/**
|
|
8
9
|
* How late into the slot can we be to start working. Computed as the total time needed for assembling and publishing a block,
|
|
9
10
|
* assuming an execution time equal to `minExecutionTime`, subtracted from the slot duration. This means that, if the proposer
|
|
@@ -37,6 +38,10 @@ export class SequencerTimetable {
|
|
|
37
38
|
/** Whether assertTimeLeft will throw if not enough time. */ enforce;
|
|
38
39
|
/** Duration per block when building multiple blocks per slot (undefined = single block per slot) */ blockDuration;
|
|
39
40
|
/** Maximum number of blocks that can be built in this slot configuration */ maxNumberOfBlocks;
|
|
41
|
+
/**
|
|
42
|
+
* How far into the target slot assembly and attestation collection can start when pipelining.
|
|
43
|
+
* Production-like timing keeps this at zero; fast local publishing profiles can use the attestation window.
|
|
44
|
+
*/ pipeliningAttestationGracePeriod;
|
|
40
45
|
constructor(opts, metrics, log){
|
|
41
46
|
this.metrics = metrics;
|
|
42
47
|
this.log = log;
|
|
@@ -46,40 +51,26 @@ export class SequencerTimetable {
|
|
|
46
51
|
this.ethereumSlotDuration = opts.ethereumSlotDuration;
|
|
47
52
|
this.aztecSlotDuration = opts.aztecSlotDuration;
|
|
48
53
|
this.l1PublishingTime = opts.l1PublishingTime;
|
|
49
|
-
this.p2pPropagationTime = opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME;
|
|
50
54
|
this.blockDuration = opts.blockDurationMs ? opts.blockDurationMs / 1000 : undefined;
|
|
51
55
|
this.enforce = opts.enforce;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.
|
|
55
|
-
this.
|
|
56
|
-
this.
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
this.checkpointTiming = createCheckpointTimingModel({
|
|
57
|
+
aztecSlotDuration: this.aztecSlotDuration,
|
|
58
|
+
ethereumSlotDuration: this.ethereumSlotDuration,
|
|
59
|
+
blockDuration: this.blockDuration,
|
|
60
|
+
l1PublishingTime: this.l1PublishingTime,
|
|
61
|
+
p2pPropagationTime: opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME
|
|
62
|
+
});
|
|
63
|
+
this.p2pPropagationTime = this.checkpointTiming.p2pPropagationTime;
|
|
64
|
+
this.checkpointAssembleTime = this.checkpointTiming.checkpointAssembleTime;
|
|
65
|
+
this.checkpointInitializationTime = this.checkpointTiming.checkpointInitializationTime;
|
|
66
|
+
this.minExecutionTime = this.checkpointTiming.minExecutionTime;
|
|
63
67
|
// Calculate initialization offset - estimate of time needed for sync + proposer check
|
|
64
68
|
// This is the baseline for all sub-slot deadlines
|
|
65
|
-
this.initializationOffset = this.checkpointInitializationTime;
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
this.
|
|
69
|
-
|
|
70
|
-
if (!this.blockDuration) {
|
|
71
|
-
this.maxNumberOfBlocks = 1; // Single block per slot
|
|
72
|
-
} else {
|
|
73
|
-
const timeReservedAtEnd = this.blockDuration + // Last sub-slot for validator re-execution
|
|
74
|
-
this.checkpointFinalizationTime; // Checkpoint finalization
|
|
75
|
-
const timeAvailableForBlocks = this.aztecSlotDuration - this.initializationOffset - timeReservedAtEnd;
|
|
76
|
-
this.maxNumberOfBlocks = Math.floor(timeAvailableForBlocks / this.blockDuration);
|
|
77
|
-
}
|
|
78
|
-
// Minimum work to do within a slot for building a block with the minimum time for execution and publishing its checkpoint
|
|
79
|
-
const minWorkToDo = this.initializationOffset + this.minExecutionTime * 2 + // Execution and reexecution
|
|
80
|
-
this.checkpointFinalizationTime;
|
|
81
|
-
const initializeDeadline = this.aztecSlotDuration - minWorkToDo;
|
|
82
|
-
this.initializeDeadline = initializeDeadline;
|
|
69
|
+
this.initializationOffset = this.checkpointTiming.checkpointInitializationTime;
|
|
70
|
+
this.checkpointFinalizationTime = this.checkpointTiming.checkpointFinalizationTime;
|
|
71
|
+
this.pipeliningAttestationGracePeriod = this.checkpointTiming.pipeliningAttestationGracePeriod;
|
|
72
|
+
this.maxNumberOfBlocks = this.checkpointTiming.calculateMaxBlocksPerSlot();
|
|
73
|
+
this.initializeDeadline = this.checkpointTiming.initializeDeadline;
|
|
83
74
|
this.log?.info(`Sequencer timetable initialized with ${this.maxNumberOfBlocks} blocks per slot (${this.enforce ? 'enforced' : 'not enforced'})`, {
|
|
84
75
|
ethereumSlotDuration: this.ethereumSlotDuration,
|
|
85
76
|
aztecSlotDuration: this.aztecSlotDuration,
|
|
@@ -90,14 +81,27 @@ export class SequencerTimetable {
|
|
|
90
81
|
blockAssembleTime: this.checkpointAssembleTime,
|
|
91
82
|
initializeDeadline: this.initializeDeadline,
|
|
92
83
|
enforce: this.enforce,
|
|
93
|
-
|
|
84
|
+
pipeliningAttestationGracePeriod: this.pipeliningAttestationGracePeriod,
|
|
85
|
+
minWorkToDo: this.checkpointTiming.minimumBuildSlotWork,
|
|
94
86
|
blockDuration: this.blockDuration,
|
|
95
87
|
maxNumberOfBlocks: this.maxNumberOfBlocks
|
|
96
88
|
});
|
|
97
|
-
if (initializeDeadline <= 0) {
|
|
98
|
-
throw new Error(`Block proposal initialize deadline cannot be negative (got ${initializeDeadline} from total time needed ${
|
|
89
|
+
if (this.initializeDeadline <= 0) {
|
|
90
|
+
throw new Error(`Block proposal initialize deadline cannot be negative (got ${this.initializeDeadline} from total time needed ${this.checkpointTiming.minimumBuildSlotWork} and a slot duration of ${this.aztecSlotDuration}).`);
|
|
99
91
|
}
|
|
100
92
|
}
|
|
93
|
+
getCheckpointAssemblyDeadline() {
|
|
94
|
+
return this.checkpointTiming.checkpointAssemblyDeadline;
|
|
95
|
+
}
|
|
96
|
+
getCheckpointAttestationDeadline() {
|
|
97
|
+
return this.checkpointTiming.checkpointAttestationDeadline;
|
|
98
|
+
}
|
|
99
|
+
getCheckpointAttestationStartDeadline() {
|
|
100
|
+
return this.checkpointTiming.checkpointAttestationStartDeadline;
|
|
101
|
+
}
|
|
102
|
+
getCheckpointPublishingDeadline() {
|
|
103
|
+
return this.checkpointTiming.checkpointPublishingDeadline;
|
|
104
|
+
}
|
|
101
105
|
getMaxAllowedTime(state) {
|
|
102
106
|
switch(state){
|
|
103
107
|
case SequencerState.STOPPED:
|
|
@@ -113,10 +117,11 @@ export class SequencerTimetable {
|
|
|
113
117
|
case SequencerState.WAITING_UNTIL_NEXT_BLOCK:
|
|
114
118
|
return this.initializeDeadline + this.checkpointInitializationTime;
|
|
115
119
|
case SequencerState.ASSEMBLING_CHECKPOINT:
|
|
120
|
+
return this.getCheckpointAssemblyDeadline();
|
|
116
121
|
case SequencerState.COLLECTING_ATTESTATIONS:
|
|
117
|
-
return this.
|
|
122
|
+
return this.getCheckpointAttestationStartDeadline();
|
|
118
123
|
case SequencerState.PUBLISHING_CHECKPOINT:
|
|
119
|
-
return this.
|
|
124
|
+
return this.getCheckpointPublishingDeadline();
|
|
120
125
|
default:
|
|
121
126
|
{
|
|
122
127
|
const _exhaustiveCheck = state;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
2
|
-
export type SequencerRollupConstants = Pick<L1RollupConstants, 'ethereumSlotDuration' | 'l1GenesisTime' | 'slotDuration' | 'rollupManaLimit'>;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
export type SequencerRollupConstants = Pick<L1RollupConstants, 'ethereumSlotDuration' | 'l1GenesisTime' | 'slotDuration' | 'rollupManaLimit' | 'epochDuration'>;
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxNQUFNLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUN6QyxpQkFBaUIsRUFDakIsc0JBQXNCLEdBQUcsZUFBZSxHQUFHLGNBQWMsR0FBRyxpQkFBaUIsR0FBRyxlQUFlLENBQ2hHLENBQUMifQ==
|
|
@@ -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,GAAG,iBAAiB,
|
|
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,GAAG,eAAe,CAChG,CAAC"}
|
package/dest/test/utils.d.ts
CHANGED
|
@@ -50,4 +50,4 @@ export declare function setupTxsAndBlock(p2p: MockProxy<P2P>, globalVariables: G
|
|
|
50
50
|
txs: Tx[];
|
|
51
51
|
block: L2Block;
|
|
52
52
|
}>;
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQztBQU8vRyxPQUFPLEVBQWUsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFvQyxNQUFNLGtCQUFrQixDQUFDO0FBRTNHLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3BELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTdGOztHQUVHO0FBQ0gsd0JBQXNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FNckU7QUFFRDs7R0FFRztBQUNILHdCQUFzQixTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQWdCN0Y7QUFFRDs7R0FFRztBQUNILHdCQUFnQixjQUFjLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUluRTtBQUVEOztHQUVHO0FBQ0gsd0JBQXVCLGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBSW5GO0FBRUQ7O0dBRUc7QUFDSCx3QkFBZ0Isb0JBQW9CLENBQUMsTUFBTSxFQUFFLGVBQWUsR0FBRyxvQkFBb0IsRUFBRSxDQUdwRjtBQXVCRDs7R0FFRztBQUNILHdCQUFnQixtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUcsYUFBYSxDQVd2RjtBQUVEOztHQUVHO0FBQ0gsd0JBQWdCLHdCQUF3QixDQUN0QyxLQUFLLEVBQUUsT0FBTyxFQUNkLG1CQUFtQixFQUFFLFNBQVMsRUFDOUIsY0FBYyxDQUFDLEVBQUUsU0FBUyxFQUMxQixxQkFBcUIsR0FBRSxNQUFXLEdBQ2pDLGtCQUFrQixDQWdCcEI7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQWdCLDJCQUEyQixDQUN6QyxLQUFLLEVBQUUsT0FBTyxFQUNkLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLE1BQU0sRUFBRSxVQUFVLEVBQ2xCLHFCQUFxQixHQUFFLE1BQVcsR0FDakMscUJBQXFCLENBYXZCO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQXNCLGdCQUFnQixDQUNwQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUNuQixlQUFlLEVBQUUsZUFBZSxFQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUNmLE9BQU8sRUFBRSxFQUFFLEdBQ1YsT0FBTyxDQUFDO0lBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQTtDQUFFLENBQUMsQ0FLeEMifQ==
|
package/dest/test/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAoB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAoB,MAAM,mBAAmB,CAAC;AAO/G,OAAO,EAAe,eAAe,EAAE,KAAK,EAAE,EAAoC,MAAM,kBAAkB,CAAC;AAE3G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE7F;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAMrE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB7F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAInE;AAED;;GAEG;AACH,wBAAuB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAInF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,oBAAoB,EAAE,CAGpF;AAuBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,aAAa,CAWvF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,mBAAmB,EAAE,SAAS,EAC9B,cAAc,CAAC,EAAE,SAAS,EAC1B,qBAAqB,GAAE,MAAW,GACjC,kBAAkB,CAgBpB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,UAAU,EAClB,qBAAqB,GAAE,MAAW,GACjC,qBAAqB,CAavB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,EACnB,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,EAAE,GACV,OAAO,CAAC;IAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAKxC"}
|
package/dest/test/utils.js
CHANGED
|
@@ -7,7 +7,7 @@ import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
|
7
7
|
import { CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
8
8
|
import { BlockProposal, CheckpointAttestation, CheckpointProposal, ConsensusPayload } from '@aztec/stdlib/p2p';
|
|
9
9
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
10
|
-
import { makeAppendOnlyTreeSnapshot, mockTxForRollup } from '@aztec/stdlib/testing';
|
|
10
|
+
import { TEST_COORDINATION_SIGNATURE_CONTEXT, makeAppendOnlyTreeSnapshot, mockTxForRollup } from '@aztec/stdlib/testing';
|
|
11
11
|
import { BlockHeader, makeProcessedTxFromPrivateOnlyTx } from '@aztec/stdlib/tx';
|
|
12
12
|
// Re-export mock classes from their dedicated file
|
|
13
13
|
export { MockCheckpointBuilder, MockCheckpointsBuilder } from './mock_checkpoint_builder.js';
|
|
@@ -64,14 +64,14 @@ export { MockCheckpointBuilder, MockCheckpointsBuilder } from './mock_checkpoint
|
|
|
64
64
|
* Creates a block proposal from a block and signature
|
|
65
65
|
*/ export function createBlockProposal(block, signature) {
|
|
66
66
|
const txHashes = block.body.txEffects.map((tx)=>tx.txHash);
|
|
67
|
-
return new BlockProposal(block.header, block.indexWithinCheckpoint, Fr.ZERO, block.archive.root, txHashes, signature);
|
|
67
|
+
return new BlockProposal(block.header, block.indexWithinCheckpoint, Fr.ZERO, block.archive.root, txHashes, signature, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
70
|
* Creates a checkpoint proposal from a block and signature
|
|
71
71
|
*/ export function createCheckpointProposal(block, checkpointSignature, blockSignature, feeAssetPriceModifier = 0n) {
|
|
72
72
|
const txHashes = block.body.txEffects.map((tx)=>tx.txHash);
|
|
73
73
|
const checkpointHeader = createCheckpointHeaderFromBlock(block);
|
|
74
|
-
return new CheckpointProposal(checkpointHeader, block.archive.root, feeAssetPriceModifier, checkpointSignature, {
|
|
74
|
+
return new CheckpointProposal(checkpointHeader, block.archive.root, feeAssetPriceModifier, checkpointSignature, TEST_COORDINATION_SIGNATURE_CONTEXT, {
|
|
75
75
|
blockHeader: block.header,
|
|
76
76
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
77
77
|
txHashes,
|
|
@@ -84,10 +84,11 @@ export { MockCheckpointBuilder, MockCheckpointsBuilder } from './mock_checkpoint
|
|
|
84
84
|
* In production, the sender is recovered from the signature.
|
|
85
85
|
*/ export function createCheckpointAttestation(block, signature, sender, feeAssetPriceModifier = 0n) {
|
|
86
86
|
const checkpointHeader = createCheckpointHeaderFromBlock(block);
|
|
87
|
-
const payload = new ConsensusPayload(checkpointHeader, block.archive.root, feeAssetPriceModifier);
|
|
87
|
+
const payload = new ConsensusPayload(checkpointHeader, block.archive.root, feeAssetPriceModifier, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
88
88
|
const attestation = new CheckpointAttestation(payload, signature, signature);
|
|
89
|
-
//
|
|
90
|
-
attestation.
|
|
89
|
+
// Bypass signature recovery for testing since we use random signatures
|
|
90
|
+
attestation.getSender = ()=>sender;
|
|
91
|
+
attestation.getProposer = ()=>sender;
|
|
91
92
|
return attestation;
|
|
92
93
|
}
|
|
93
94
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.b9865e97",
|
|
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": "0.0.1-commit.
|
|
30
|
-
"@aztec/bb-prover": "0.0.1-commit.
|
|
31
|
-
"@aztec/blob-client": "0.0.1-commit.
|
|
32
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
33
|
-
"@aztec/constants": "0.0.1-commit.
|
|
34
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
35
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
36
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
37
|
-
"@aztec/l1-artifacts": "0.0.1-commit.
|
|
38
|
-
"@aztec/node-keystore": "0.0.1-commit.
|
|
39
|
-
"@aztec/noir-acvm_js": "0.0.1-commit.
|
|
40
|
-
"@aztec/noir-contracts.js": "0.0.1-commit.
|
|
41
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
42
|
-
"@aztec/noir-types": "0.0.1-commit.
|
|
43
|
-
"@aztec/p2p": "0.0.1-commit.
|
|
44
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
45
|
-
"@aztec/prover-client": "0.0.1-commit.
|
|
46
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
47
|
-
"@aztec/slasher": "0.0.1-commit.
|
|
48
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
49
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
50
|
-
"@aztec/validator-client": "0.0.1-commit.
|
|
51
|
-
"@aztec/validator-ha-signer": "0.0.1-commit.
|
|
52
|
-
"@aztec/world-state": "0.0.1-commit.
|
|
29
|
+
"@aztec/aztec.js": "0.0.1-commit.b9865e97",
|
|
30
|
+
"@aztec/bb-prover": "0.0.1-commit.b9865e97",
|
|
31
|
+
"@aztec/blob-client": "0.0.1-commit.b9865e97",
|
|
32
|
+
"@aztec/blob-lib": "0.0.1-commit.b9865e97",
|
|
33
|
+
"@aztec/constants": "0.0.1-commit.b9865e97",
|
|
34
|
+
"@aztec/epoch-cache": "0.0.1-commit.b9865e97",
|
|
35
|
+
"@aztec/ethereum": "0.0.1-commit.b9865e97",
|
|
36
|
+
"@aztec/foundation": "0.0.1-commit.b9865e97",
|
|
37
|
+
"@aztec/l1-artifacts": "0.0.1-commit.b9865e97",
|
|
38
|
+
"@aztec/node-keystore": "0.0.1-commit.b9865e97",
|
|
39
|
+
"@aztec/noir-acvm_js": "0.0.1-commit.b9865e97",
|
|
40
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.b9865e97",
|
|
41
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.b9865e97",
|
|
42
|
+
"@aztec/noir-types": "0.0.1-commit.b9865e97",
|
|
43
|
+
"@aztec/p2p": "0.0.1-commit.b9865e97",
|
|
44
|
+
"@aztec/protocol-contracts": "0.0.1-commit.b9865e97",
|
|
45
|
+
"@aztec/prover-client": "0.0.1-commit.b9865e97",
|
|
46
|
+
"@aztec/simulator": "0.0.1-commit.b9865e97",
|
|
47
|
+
"@aztec/slasher": "0.0.1-commit.b9865e97",
|
|
48
|
+
"@aztec/stdlib": "0.0.1-commit.b9865e97",
|
|
49
|
+
"@aztec/telemetry-client": "0.0.1-commit.b9865e97",
|
|
50
|
+
"@aztec/validator-client": "0.0.1-commit.b9865e97",
|
|
51
|
+
"@aztec/validator-ha-signer": "0.0.1-commit.b9865e97",
|
|
52
|
+
"@aztec/world-state": "0.0.1-commit.b9865e97",
|
|
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": "0.0.1-commit.
|
|
59
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
58
|
+
"@aztec/archiver": "0.0.1-commit.b9865e97",
|
|
59
|
+
"@aztec/kv-store": "0.0.1-commit.b9865e97",
|
|
60
60
|
"@electric-sql/pglite": "^0.3.14",
|
|
61
61
|
"@jest/globals": "^30.0.0",
|
|
62
62
|
"@types/jest": "^30.0.0",
|
|
@@ -12,15 +12,14 @@ import type { DateProvider } from '@aztec/foundation/timer';
|
|
|
12
12
|
import type { KeystoreManager } from '@aztec/node-keystore';
|
|
13
13
|
import type { P2P } from '@aztec/p2p';
|
|
14
14
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
15
|
-
import type { L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
15
|
+
import type { L2BlockSink, L2BlockSource, ProposedCheckpointSink } from '@aztec/stdlib/block';
|
|
16
16
|
import type { ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
17
|
-
import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
18
17
|
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
19
18
|
import { L1Metrics, type TelemetryClient } from '@aztec/telemetry-client';
|
|
20
19
|
import { FullNodeCheckpointsBuilder, NodeKeystoreAdapter, type ValidatorClient } from '@aztec/validator-client';
|
|
21
20
|
|
|
22
21
|
import { type SequencerClientConfig, getPublisherConfigFromSequencerConfig } from '../config.js';
|
|
23
|
-
import { GlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
22
|
+
import type { GlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
24
23
|
import { SequencerPublisherFactory } from '../publisher/sequencer-publisher-factory.js';
|
|
25
24
|
import { Sequencer, type SequencerConfig } from '../sequencer/index.js';
|
|
26
25
|
|
|
@@ -57,7 +56,7 @@ export class SequencerClient {
|
|
|
57
56
|
worldStateSynchronizer: WorldStateSynchronizer;
|
|
58
57
|
slasherClient: SlasherClientInterface | undefined;
|
|
59
58
|
checkpointsBuilder: FullNodeCheckpointsBuilder;
|
|
60
|
-
l2BlockSource: L2BlockSource & L2BlockSink;
|
|
59
|
+
l2BlockSource: L2BlockSource & L2BlockSink & ProposedCheckpointSink;
|
|
61
60
|
l1ToL2MessageSource: L1ToL2MessageSource;
|
|
62
61
|
telemetry: TelemetryClient;
|
|
63
62
|
publisherFactory?: SequencerPublisherFactory;
|
|
@@ -65,7 +64,9 @@ export class SequencerClient {
|
|
|
65
64
|
dateProvider: DateProvider;
|
|
66
65
|
epochCache?: EpochCache;
|
|
67
66
|
l1TxUtils: L1TxUtils[];
|
|
67
|
+
funderL1TxUtils?: L1TxUtils;
|
|
68
68
|
nodeKeyStore: KeystoreManager;
|
|
69
|
+
globalVariableBuilder: GlobalVariableBuilder;
|
|
69
70
|
},
|
|
70
71
|
) {
|
|
71
72
|
const {
|
|
@@ -87,42 +88,34 @@ export class SequencerClient {
|
|
|
87
88
|
publicClient,
|
|
88
89
|
l1TxUtils.map(x => x.getSenderAddress()),
|
|
89
90
|
);
|
|
90
|
-
const publisherManager = new PublisherManager(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
);
|
|
95
|
-
const
|
|
96
|
-
const [l1GenesisTime, slotDuration, rollupVersion, rollupManaLimit] = await Promise.all([
|
|
91
|
+
const publisherManager = new PublisherManager(l1TxUtils, getPublisherConfigFromSequencerConfig(config), {
|
|
92
|
+
bindings: log.getBindings(),
|
|
93
|
+
funder: deps.funderL1TxUtils,
|
|
94
|
+
});
|
|
95
|
+
const rollupContract = new RollupContract(publicClient, config.rollupAddress.toString());
|
|
96
|
+
const [l1GenesisTime, slotDuration, rollupManaLimit] = await Promise.all([
|
|
97
97
|
rollupContract.getL1GenesisTime(),
|
|
98
98
|
rollupContract.getSlotDuration(),
|
|
99
|
-
rollupContract.getVersion(),
|
|
100
99
|
rollupContract.getManaLimit().then(Number),
|
|
101
100
|
] as const);
|
|
102
101
|
|
|
103
102
|
const governanceProposerContract = new GovernanceProposerContract(
|
|
104
103
|
publicClient,
|
|
105
|
-
config.
|
|
104
|
+
config.governanceProposerAddress.toString(),
|
|
106
105
|
);
|
|
107
106
|
const epochCache =
|
|
108
107
|
deps.epochCache ??
|
|
109
108
|
(await EpochCache.create(
|
|
110
|
-
config.
|
|
109
|
+
config.rollupAddress,
|
|
111
110
|
{
|
|
112
111
|
l1RpcUrls: rpcUrls,
|
|
113
112
|
l1ChainId: chainId,
|
|
114
113
|
viemPollingIntervalMS: config.viemPollingIntervalMS,
|
|
115
114
|
ethereumSlotDuration: config.ethereumSlotDuration,
|
|
116
|
-
enableProposerPipelining: config.enableProposerPipelining,
|
|
117
115
|
},
|
|
118
116
|
{ dateProvider: deps.dateProvider },
|
|
119
117
|
));
|
|
120
118
|
|
|
121
|
-
const slashFactoryContract = new SlashFactoryContract(
|
|
122
|
-
publicClient,
|
|
123
|
-
config.l1Contracts.slashFactoryAddress?.toString() ?? EthAddress.ZERO.toString(),
|
|
124
|
-
);
|
|
125
|
-
|
|
126
119
|
const publisherFactory =
|
|
127
120
|
deps.publisherFactory ??
|
|
128
121
|
new SequencerPublisherFactory(config, {
|
|
@@ -130,7 +123,6 @@ export class SequencerClient {
|
|
|
130
123
|
blobClient: deps.blobClient,
|
|
131
124
|
epochCache,
|
|
132
125
|
governanceProposerContract,
|
|
133
|
-
slashFactoryContract,
|
|
134
126
|
rollupContract,
|
|
135
127
|
dateProvider: deps.dateProvider,
|
|
136
128
|
publisherManager,
|
|
@@ -140,13 +132,7 @@ export class SequencerClient {
|
|
|
140
132
|
|
|
141
133
|
const ethereumSlotDuration = config.ethereumSlotDuration;
|
|
142
134
|
|
|
143
|
-
const globalsBuilder =
|
|
144
|
-
...config,
|
|
145
|
-
l1GenesisTime,
|
|
146
|
-
slotDuration: Number(slotDuration),
|
|
147
|
-
ethereumSlotDuration,
|
|
148
|
-
rollupVersion,
|
|
149
|
-
});
|
|
135
|
+
const globalsBuilder = deps.globalVariableBuilder;
|
|
150
136
|
|
|
151
137
|
// When running in anvil, assume we can post a tx up until one second before the end of an L1 slot.
|
|
152
138
|
// Otherwise, we need the full L1 slot duration for publishing to ensure inclusion.
|
|
@@ -158,7 +144,13 @@ export class SequencerClient {
|
|
|
158
144
|
|
|
159
145
|
const { maxL2BlockGas, maxDABlockGas, maxTxsPerBlock } = capPerBlockLimits(config, rollupManaLimit, log);
|
|
160
146
|
|
|
161
|
-
const l1Constants = {
|
|
147
|
+
const l1Constants = {
|
|
148
|
+
l1GenesisTime,
|
|
149
|
+
slotDuration: Number(slotDuration),
|
|
150
|
+
ethereumSlotDuration,
|
|
151
|
+
rollupManaLimit,
|
|
152
|
+
epochDuration: config.aztecEpochDuration,
|
|
153
|
+
};
|
|
162
154
|
|
|
163
155
|
const sequencer = new Sequencer(
|
|
164
156
|
publisherFactory,
|
|
@@ -202,7 +194,7 @@ export class SequencerClient {
|
|
|
202
194
|
await this.validatorClient?.start();
|
|
203
195
|
this.sequencer.start();
|
|
204
196
|
this.l1Metrics?.start();
|
|
205
|
-
await this.publisherManager.
|
|
197
|
+
await this.publisherManager.start();
|
|
206
198
|
}
|
|
207
199
|
|
|
208
200
|
/**
|
|
@@ -211,10 +203,15 @@ export class SequencerClient {
|
|
|
211
203
|
public async stop() {
|
|
212
204
|
await this.sequencer.stop();
|
|
213
205
|
await this.validatorClient?.stop();
|
|
214
|
-
this.publisherManager.
|
|
206
|
+
await this.publisherManager.stop();
|
|
215
207
|
this.l1Metrics?.stop();
|
|
216
208
|
}
|
|
217
209
|
|
|
210
|
+
/** Triggers an immediate run of the sequencer, bypassing the polling interval. */
|
|
211
|
+
public trigger() {
|
|
212
|
+
return this.sequencer.trigger();
|
|
213
|
+
}
|
|
214
|
+
|
|
218
215
|
public getSequencer(): Sequencer {
|
|
219
216
|
return this.sequencer;
|
|
220
217
|
}
|
package/src/config.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
booleanConfigHelper,
|
|
6
6
|
getConfigFromMappings,
|
|
7
7
|
numberConfigHelper,
|
|
8
|
+
optionalNumberConfigHelper,
|
|
8
9
|
pickConfigMappings,
|
|
9
10
|
} from '@aztec/foundation/config';
|
|
10
11
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
@@ -13,10 +14,9 @@ import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p/config';
|
|
|
13
14
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
14
15
|
import {
|
|
15
16
|
type ChainConfig,
|
|
16
|
-
|
|
17
|
+
DEFAULT_MAX_BLOCKS_PER_CHECKPOINT,
|
|
17
18
|
type SequencerConfig,
|
|
18
19
|
chainConfigMappings,
|
|
19
|
-
pipelineConfigMappings,
|
|
20
20
|
sharedSequencerConfigMappings,
|
|
21
21
|
} from '@aztec/stdlib/config';
|
|
22
22
|
import type { ResolvedSequencerConfig } from '@aztec/stdlib/interfaces/server';
|
|
@@ -50,7 +50,9 @@ export const DefaultSequencerConfig = {
|
|
|
50
50
|
secondsBeforeInvalidatingBlockAsNonCommitteeMember: 432, // 36 L1 blocks
|
|
51
51
|
skipCollectingAttestations: false,
|
|
52
52
|
skipInvalidateBlockAsProposer: false,
|
|
53
|
+
skipWaitForValidParentCheckpointOnL1: false,
|
|
53
54
|
broadcastInvalidBlockProposal: false,
|
|
55
|
+
broadcastInvalidCheckpointProposalOnly: false,
|
|
54
56
|
injectFakeAttestation: false,
|
|
55
57
|
injectHighSValueAttestation: false,
|
|
56
58
|
injectUnrecoverableSignatureAttestation: false,
|
|
@@ -58,6 +60,7 @@ export const DefaultSequencerConfig = {
|
|
|
58
60
|
shuffleAttestationOrdering: false,
|
|
59
61
|
skipPushProposedBlocksToArchiver: false,
|
|
60
62
|
skipPublishingCheckpointsPercent: 0,
|
|
63
|
+
maxBlocksPerCheckpoint: DEFAULT_MAX_BLOCKS_PER_CHECKPOINT,
|
|
61
64
|
} satisfies ResolvedSequencerConfig;
|
|
62
65
|
|
|
63
66
|
/**
|
|
@@ -70,7 +73,6 @@ export type SequencerClientConfig = SequencerPublisherConfig &
|
|
|
70
73
|
SequencerConfig &
|
|
71
74
|
L1ReaderConfig &
|
|
72
75
|
ChainConfig &
|
|
73
|
-
PipelineConfig &
|
|
74
76
|
Pick<P2PConfig, 'txPublicSetupAllowListExtend'> &
|
|
75
77
|
Pick<L1ContractsConfig, 'ethereumSlotDuration' | 'aztecSlotDuration' | 'aztecEpochDuration'>;
|
|
76
78
|
|
|
@@ -83,7 +85,7 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
83
85
|
maxTxsPerCheckpoint: {
|
|
84
86
|
env: 'SEQ_MAX_TX_PER_CHECKPOINT',
|
|
85
87
|
description: 'The maximum number of txs across all blocks in a checkpoint.',
|
|
86
|
-
|
|
88
|
+
...optionalNumberConfigHelper(),
|
|
87
89
|
},
|
|
88
90
|
minTxsPerBlock: {
|
|
89
91
|
env: 'SEQ_MIN_TX_PER_BLOCK',
|
|
@@ -102,12 +104,12 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
102
104
|
maxL2BlockGas: {
|
|
103
105
|
env: 'SEQ_MAX_L2_BLOCK_GAS',
|
|
104
106
|
description: 'The maximum L2 block gas.',
|
|
105
|
-
|
|
107
|
+
...optionalNumberConfigHelper(),
|
|
106
108
|
},
|
|
107
109
|
maxDABlockGas: {
|
|
108
110
|
env: 'SEQ_MAX_DA_BLOCK_GAS',
|
|
109
111
|
description: 'The maximum DA block gas.',
|
|
110
|
-
|
|
112
|
+
...optionalNumberConfigHelper(),
|
|
111
113
|
},
|
|
112
114
|
perBlockAllocationMultiplier: {
|
|
113
115
|
env: 'SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER',
|
|
@@ -124,7 +126,7 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
124
126
|
},
|
|
125
127
|
coinbase: {
|
|
126
128
|
env: 'COINBASE',
|
|
127
|
-
parseEnv: (val: string) =>
|
|
129
|
+
parseEnv: (val: string) => EthAddress.fromString(val),
|
|
128
130
|
description: 'Recipient of block reward.',
|
|
129
131
|
},
|
|
130
132
|
feeRecipient: {
|
|
@@ -153,12 +155,7 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
153
155
|
l1PublishingTime: {
|
|
154
156
|
env: 'SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT',
|
|
155
157
|
description: 'How much time (in seconds) we allow in the slot for publishing the L1 tx (defaults to 1 L1 slot).',
|
|
156
|
-
|
|
157
|
-
},
|
|
158
|
-
attestationPropagationTime: {
|
|
159
|
-
env: 'SEQ_ATTESTATION_PROPAGATION_TIME',
|
|
160
|
-
description: 'How many seconds it takes for proposals and attestations to travel across the p2p layer (one-way)',
|
|
161
|
-
...numberConfigHelper(DefaultSequencerConfig.attestationPropagationTime),
|
|
158
|
+
...optionalNumberConfigHelper(),
|
|
162
159
|
},
|
|
163
160
|
fakeProcessingDelayPerTxMs: {
|
|
164
161
|
description: 'Used for testing to introduce a fake delay after processing each tx',
|
|
@@ -189,10 +186,25 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
189
186
|
description: 'Do not invalidate the previous block if invalid when we are the proposer (for testing only)',
|
|
190
187
|
...booleanConfigHelper(DefaultSequencerConfig.skipInvalidateBlockAsProposer),
|
|
191
188
|
},
|
|
189
|
+
skipWaitForValidParentCheckpointOnL1: {
|
|
190
|
+
description:
|
|
191
|
+
'Bypass the parent checkpoint validity check before submitting a pipelined checkpoint, ' +
|
|
192
|
+
'allowing the proposer to publish even when the parent landed on L1 with invalid attestations (for testing only)',
|
|
193
|
+
...booleanConfigHelper(DefaultSequencerConfig.skipWaitForValidParentCheckpointOnL1),
|
|
194
|
+
},
|
|
192
195
|
broadcastInvalidBlockProposal: {
|
|
193
196
|
description: 'Broadcast invalid block proposals with corrupted state (for testing only)',
|
|
194
197
|
...booleanConfigHelper(DefaultSequencerConfig.broadcastInvalidBlockProposal),
|
|
195
198
|
},
|
|
199
|
+
invalidBlockProposalIndexWithinCheckpoint: {
|
|
200
|
+
description: 'Broadcast an invalid block proposal only at this indexWithinCheckpoint (for testing only)',
|
|
201
|
+
...optionalNumberConfigHelper(),
|
|
202
|
+
},
|
|
203
|
+
broadcastInvalidCheckpointProposalOnly: {
|
|
204
|
+
description:
|
|
205
|
+
'Broadcast invalid checkpoint proposals while keeping the underlying block proposals valid (for testing only). When unset, the checkpoint follows broadcastInvalidBlockProposal.',
|
|
206
|
+
...booleanConfigHelper(DefaultSequencerConfig.broadcastInvalidCheckpointProposalOnly),
|
|
207
|
+
},
|
|
196
208
|
injectFakeAttestation: {
|
|
197
209
|
description: 'Inject a fake attestation (for testing only)',
|
|
198
210
|
...booleanConfigHelper(DefaultSequencerConfig.injectFakeAttestation),
|
|
@@ -233,18 +245,31 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
233
245
|
description: 'Percent probability (0 - 100) of sequencer skipping checkpoint publishing (testing only)',
|
|
234
246
|
...numberConfigHelper(DefaultSequencerConfig.skipPublishingCheckpointsPercent),
|
|
235
247
|
},
|
|
248
|
+
skipBroadcastProposals: {
|
|
249
|
+
description: 'Skip broadcasting checkpoint and block proposals via gossipsub when proposer (for testing only)',
|
|
250
|
+
...booleanConfigHelper(false),
|
|
251
|
+
},
|
|
252
|
+
skipBroadcastCheckpointProposal: {
|
|
253
|
+
description:
|
|
254
|
+
'Skip broadcasting only the CheckpointProposal via gossipsub when proposer; the held last block is broadcast ' +
|
|
255
|
+
'standalone instead so peers still receive it as a proposed-but-uncheckpointed tip (for testing only)',
|
|
256
|
+
...booleanConfigHelper(false),
|
|
257
|
+
},
|
|
258
|
+
pauseProposingForSlots: {
|
|
259
|
+
description:
|
|
260
|
+
'List of slots for which the sequencer will not produce a proposal (for testing only). Attestation paths are unaffected.',
|
|
261
|
+
},
|
|
236
262
|
...pickConfigMappings(p2pConfigMappings, ['txPublicSetupAllowListExtend']),
|
|
237
263
|
};
|
|
238
264
|
|
|
239
265
|
export const sequencerClientConfigMappings: ConfigMappingsType<SequencerClientConfig> = {
|
|
266
|
+
...chainConfigMappings,
|
|
240
267
|
...validatorClientConfigMappings,
|
|
241
268
|
...sequencerConfigMappings,
|
|
242
269
|
...keyStoreConfigMappings,
|
|
243
270
|
...l1ReaderConfigMappings,
|
|
244
271
|
...sequencerTxSenderConfigMappings,
|
|
245
272
|
...sequencerPublisherConfigMappings,
|
|
246
|
-
...chainConfigMappings,
|
|
247
|
-
...pipelineConfigMappings,
|
|
248
273
|
...pickConfigMappings(l1ContractsConfigMappings, ['ethereumSlotDuration', 'aztecSlotDuration', 'aztecEpochDuration']),
|
|
249
274
|
};
|
|
250
275
|
|