@aztec/sequencer-client 0.0.1-commit.0dc957cde → 0.0.1-commit.0ec55a70b
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/dest/config.d.ts +2 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +12 -7
- package/dest/publisher/sequencer-publisher.d.ts +1 -1
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +2 -2
- package/dest/sequencer/checkpoint_proposal_job.d.ts +8 -2
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +189 -19
- package/dest/sequencer/metrics.d.ts +3 -1
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +7 -0
- package/dest/sequencer/sequencer.d.ts +12 -4
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +33 -8
- 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/config.ts +11 -4
- package/src/publisher/sequencer-publisher.ts +2 -4
- package/src/sequencer/README.md +20 -21
- package/src/sequencer/checkpoint_proposal_job.ts +211 -17
- package/src/sequencer/metrics.ts +9 -0
- package/src/sequencer/sequencer.ts +37 -9
- package/src/test/utils.ts +28 -10
|
@@ -491,6 +491,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
491
491
|
checkpointsBuilder;
|
|
492
492
|
blockSink;
|
|
493
493
|
l1Constants;
|
|
494
|
+
signatureContext;
|
|
494
495
|
config;
|
|
495
496
|
timetable;
|
|
496
497
|
slasherClient;
|
|
@@ -547,10 +548,14 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
547
548
|
], []));
|
|
548
549
|
}
|
|
549
550
|
log;
|
|
551
|
+
checkpointEventLog;
|
|
550
552
|
/** Tracks the fire-and-forget L1 submission promise so it can be awaited during shutdown. */ pendingL1Submission;
|
|
551
553
|
/** Pipelined parent chain state used while building and later submitting this checkpoint. */ pipelinedParentSimulationOverridesPlan;
|
|
554
|
+
getSignatureContext() {
|
|
555
|
+
return this.signatureContext;
|
|
556
|
+
}
|
|
552
557
|
constructor(slotNow, targetSlot, targetEpoch, checkpointNumber, syncedToBlockNumber, // TODO(palla/mbps): Can we remove the proposer in favor of attestorAddress? Need to check fisherman-node flows.
|
|
553
|
-
proposer, publisher, attestorAddress, invalidateCheckpoint, validatorClient, globalsBuilder, p2pClient, worldState, l1ToL2MessageSource, l2BlockSource, checkpointsBuilder, blockSink, l1Constants, config, timetable, slasherClient, epochCache, dateProvider, metrics, checkpointMetrics, eventEmitter, setStateFn, tracer, bindings, proposedCheckpointData){
|
|
558
|
+
proposer, publisher, attestorAddress, invalidateCheckpoint, validatorClient, globalsBuilder, p2pClient, worldState, l1ToL2MessageSource, l2BlockSource, checkpointsBuilder, blockSink, l1Constants, signatureContext, config, timetable, slasherClient, epochCache, dateProvider, metrics, checkpointMetrics, eventEmitter, setStateFn, tracer, bindings, proposedCheckpointData){
|
|
554
559
|
this.slotNow = slotNow;
|
|
555
560
|
this.targetSlot = targetSlot;
|
|
556
561
|
this.targetEpoch = targetEpoch;
|
|
@@ -569,6 +574,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
569
574
|
this.checkpointsBuilder = checkpointsBuilder;
|
|
570
575
|
this.blockSink = blockSink;
|
|
571
576
|
this.l1Constants = l1Constants;
|
|
577
|
+
this.signatureContext = signatureContext;
|
|
572
578
|
this.config = config;
|
|
573
579
|
this.timetable = timetable;
|
|
574
580
|
this.slasherClient = slasherClient;
|
|
@@ -585,11 +591,21 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
585
591
|
...bindings,
|
|
586
592
|
instanceId: `slot-${this.slotNow}`
|
|
587
593
|
});
|
|
594
|
+
this.checkpointEventLog = createLogger('sequencer:checkpoint-events', {
|
|
595
|
+
...bindings,
|
|
596
|
+
instanceId: `slot-${this.slotNow}`
|
|
597
|
+
});
|
|
588
598
|
}
|
|
589
599
|
/** Awaits the pending L1 submission if one is in progress. Call during shutdown. */ async awaitPendingSubmission() {
|
|
590
600
|
this.log.info('Awaiting pending L1 payload submission');
|
|
591
601
|
await this.pendingL1Submission;
|
|
592
602
|
}
|
|
603
|
+
logCheckpointEvent(eventName, message, fields) {
|
|
604
|
+
this.checkpointEventLog.debug(message, {
|
|
605
|
+
eventName: `sequencer-checkpoint-${eventName}`,
|
|
606
|
+
...fields
|
|
607
|
+
});
|
|
608
|
+
}
|
|
593
609
|
/**
|
|
594
610
|
* Executes the checkpoint proposal job.
|
|
595
611
|
* Builds blocks, assembles checkpoint, and broadcasts the proposal (blocking).
|
|
@@ -661,6 +677,12 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
661
677
|
const l1Response = await this.publisher.sendRequestsAt(submitAfter);
|
|
662
678
|
const proposedAction = l1Response?.successfulActions.find((a)=>a === 'propose');
|
|
663
679
|
if (proposedAction) {
|
|
680
|
+
this.logCheckpointEvent('published', `Checkpoint published for slot ${this.targetSlot}`, {
|
|
681
|
+
slot: this.targetSlot,
|
|
682
|
+
checkpointNumber: this.checkpointNumber,
|
|
683
|
+
successfulActions: l1Response?.successfulActions,
|
|
684
|
+
sentActions: l1Response?.sentActions
|
|
685
|
+
});
|
|
664
686
|
this.eventEmitter.emit('checkpoint-published', {
|
|
665
687
|
checkpoint: this.checkpointNumber,
|
|
666
688
|
slot: this.targetSlot
|
|
@@ -668,6 +690,24 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
668
690
|
const coinbase = checkpoint.header.coinbase;
|
|
669
691
|
await this.metrics.incFilledSlot(this.publisher.getSenderAddress().toString(), coinbase);
|
|
670
692
|
} else {
|
|
693
|
+
this.logCheckpointEvent('publish-failed', `Checkpoint publish failed for slot ${this.targetSlot}`, {
|
|
694
|
+
slot: this.targetSlot,
|
|
695
|
+
checkpointNumber: this.checkpointNumber,
|
|
696
|
+
successfulActions: l1Response?.successfulActions,
|
|
697
|
+
failedActions: l1Response?.failedActions,
|
|
698
|
+
sentActions: l1Response?.sentActions,
|
|
699
|
+
expiredActions: l1Response?.expiredActions,
|
|
700
|
+
reason: 'propose_action_not_successful'
|
|
701
|
+
});
|
|
702
|
+
this.log.warn(`Checkpoint publish failed for slot ${this.targetSlot}`, {
|
|
703
|
+
slot: this.targetSlot,
|
|
704
|
+
checkpointNumber: this.checkpointNumber,
|
|
705
|
+
successfulActions: l1Response?.successfulActions,
|
|
706
|
+
failedActions: l1Response?.failedActions,
|
|
707
|
+
sentActions: l1Response?.sentActions,
|
|
708
|
+
expiredActions: l1Response?.expiredActions,
|
|
709
|
+
reason: 'propose_action_not_successful'
|
|
710
|
+
});
|
|
671
711
|
this.eventEmitter.emit('checkpoint-publish-failed', {
|
|
672
712
|
...l1Response,
|
|
673
713
|
slot: this.targetSlot
|
|
@@ -680,7 +720,16 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
680
720
|
if (err instanceof SequencerInterruptedError) {
|
|
681
721
|
return;
|
|
682
722
|
}
|
|
683
|
-
this.
|
|
723
|
+
this.logCheckpointEvent('publish-failed', `Checkpoint publish failed for slot ${this.targetSlot}`, {
|
|
724
|
+
slot: this.targetSlot,
|
|
725
|
+
checkpointNumber: this.checkpointNumber,
|
|
726
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
727
|
+
});
|
|
728
|
+
this.log.error(`Background attestation/L1 pipeline failed for slot ${this.targetSlot}`, err, {
|
|
729
|
+
slot: this.targetSlot,
|
|
730
|
+
checkpointNumber: this.checkpointNumber,
|
|
731
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
732
|
+
});
|
|
684
733
|
this.eventEmitter.emit('checkpoint-publish-failed', {
|
|
685
734
|
slot: this.targetSlot
|
|
686
735
|
});
|
|
@@ -854,11 +903,15 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
854
903
|
const feeRecipient = this.validatorClient.getFeeRecipientForAttestor(this.attestorAddress);
|
|
855
904
|
// Start the checkpoint
|
|
856
905
|
this.setStateFn(SequencerState.INITIALIZING_CHECKPOINT, this.targetSlot);
|
|
857
|
-
this.
|
|
906
|
+
this.logCheckpointEvent('slot-started', `Starting checkpoint proposal for slot ${this.targetSlot}`, {
|
|
858
907
|
buildSlot: this.slotNow,
|
|
859
908
|
submissionSlot: this.targetSlot,
|
|
909
|
+
slot: this.targetSlot,
|
|
910
|
+
checkpointNumber: this.checkpointNumber,
|
|
860
911
|
pipelining: this.epochCache.isProposerPipeliningEnabled(),
|
|
861
912
|
proposer: this.proposer?.toString(),
|
|
913
|
+
attestorAddress: this.attestorAddress.toString(),
|
|
914
|
+
publisherAddress: this.publisher.getSenderAddress().toString(),
|
|
862
915
|
coinbase: coinbase.toString()
|
|
863
916
|
});
|
|
864
917
|
this.metrics.incOpenSlot(this.targetSlot, this.proposer?.toString() ?? 'unknown');
|
|
@@ -916,8 +969,15 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
916
969
|
throw err;
|
|
917
970
|
}
|
|
918
971
|
if (blocksInCheckpoint.length === 0) {
|
|
972
|
+
this.logCheckpointEvent('build-failed', `Checkpoint build failed for slot ${this.targetSlot}`, {
|
|
973
|
+
slot: this.targetSlot,
|
|
974
|
+
checkpointNumber: this.checkpointNumber,
|
|
975
|
+
reason: 'no_blocks_built'
|
|
976
|
+
});
|
|
919
977
|
this.log.warn(`No blocks were built for slot ${this.targetSlot}`, {
|
|
920
|
-
slot: this.targetSlot
|
|
978
|
+
slot: this.targetSlot,
|
|
979
|
+
checkpointNumber: this.checkpointNumber,
|
|
980
|
+
reason: 'no_blocks_built'
|
|
921
981
|
});
|
|
922
982
|
this.eventEmitter.emit('checkpoint-empty', {
|
|
923
983
|
slot: this.targetSlot
|
|
@@ -926,10 +986,19 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
926
986
|
}
|
|
927
987
|
const minBlocksForCheckpoint = this.config.minBlocksForCheckpoint;
|
|
928
988
|
if (minBlocksForCheckpoint !== undefined && blocksInCheckpoint.length < minBlocksForCheckpoint) {
|
|
989
|
+
this.logCheckpointEvent('build-failed', `Checkpoint build failed for slot ${this.targetSlot}`, {
|
|
990
|
+
slot: this.targetSlot,
|
|
991
|
+
checkpointNumber: this.checkpointNumber,
|
|
992
|
+
blocksBuilt: blocksInCheckpoint.length,
|
|
993
|
+
minBlocksForCheckpoint,
|
|
994
|
+
reason: 'min_blocks_not_met'
|
|
995
|
+
});
|
|
929
996
|
this.log.warn(`Checkpoint has fewer blocks than minimum (${blocksInCheckpoint.length} < ${minBlocksForCheckpoint}), skipping proposal`, {
|
|
930
997
|
slot: this.targetSlot,
|
|
998
|
+
checkpointNumber: this.checkpointNumber,
|
|
931
999
|
blocksBuilt: blocksInCheckpoint.length,
|
|
932
|
-
minBlocksForCheckpoint
|
|
1000
|
+
minBlocksForCheckpoint,
|
|
1001
|
+
reason: 'min_blocks_not_met'
|
|
933
1002
|
});
|
|
934
1003
|
return undefined;
|
|
935
1004
|
}
|
|
@@ -948,13 +1017,35 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
948
1017
|
maxTxsPerCheckpoint: this.config.maxTxsPerCheckpoint
|
|
949
1018
|
});
|
|
950
1019
|
} catch (err) {
|
|
1020
|
+
this.logCheckpointEvent('build-failed', `Checkpoint build failed for slot ${this.targetSlot}`, {
|
|
1021
|
+
slot: this.targetSlot,
|
|
1022
|
+
checkpointNumber: this.checkpointNumber,
|
|
1023
|
+
blocksBuilt: blocksInCheckpoint.length,
|
|
1024
|
+
reason: 'invalid_checkpoint',
|
|
1025
|
+
checkpoint: checkpoint.header.toInspect()
|
|
1026
|
+
});
|
|
951
1027
|
this.log.error(`Built an invalid checkpoint at slot ${this.slotNow} (skipping proposal)`, err, {
|
|
1028
|
+
slot: this.targetSlot,
|
|
1029
|
+
checkpointNumber: this.checkpointNumber,
|
|
1030
|
+
blocksBuilt: blocksInCheckpoint.length,
|
|
1031
|
+
reason: 'invalid_checkpoint',
|
|
952
1032
|
checkpoint: checkpoint.header.toInspect()
|
|
953
1033
|
});
|
|
954
1034
|
return undefined;
|
|
955
1035
|
}
|
|
956
1036
|
// Record checkpoint-level build metrics
|
|
957
1037
|
this.checkpointMetrics.recordCheckpointBuild(checkpointBuildTimer.ms(), blocksInCheckpoint.length, checkpoint.getStats().txCount, Number(checkpoint.header.totalManaUsed.toBigInt()));
|
|
1038
|
+
this.logCheckpointEvent('built', `Checkpoint built for slot ${this.targetSlot}`, {
|
|
1039
|
+
slot: this.targetSlot,
|
|
1040
|
+
buildSlot: this.slotNow,
|
|
1041
|
+
checkpointNumber: this.checkpointNumber,
|
|
1042
|
+
proposer: this.proposer?.toString(),
|
|
1043
|
+
attestorAddress: this.attestorAddress.toString(),
|
|
1044
|
+
publisherAddress: this.publisher.getSenderAddress().toString(),
|
|
1045
|
+
blocksBuilt: blocksInCheckpoint.length,
|
|
1046
|
+
txCount: checkpoint.getStats().txCount,
|
|
1047
|
+
totalMana: Number(checkpoint.header.totalManaUsed.toBigInt())
|
|
1048
|
+
});
|
|
958
1049
|
// In fisherman mode, return the checkpoint without broadcasting or collecting attestations
|
|
959
1050
|
if (this.config.fishermanMode) {
|
|
960
1051
|
this.log.info(`Built checkpoint for slot ${this.targetSlot} with ${blocksInCheckpoint.length} blocks. ` + `Skipping proposal in fisherman mode.`, {
|
|
@@ -973,8 +1064,10 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
973
1064
|
// Create the checkpoint proposal and broadcast it
|
|
974
1065
|
const proposal = await this.validatorClient.createCheckpointProposal(checkpoint.header, checkpoint.archive.root, this.checkpointNumber, feeAssetPriceModifier, blockPendingBroadcast, this.proposer, checkpointProposalOptions);
|
|
975
1066
|
const blockProposedAt = this.dateProvider.now();
|
|
976
|
-
|
|
977
|
-
|
|
1067
|
+
if (!this.config.skipBroadcastProposals) {
|
|
1068
|
+
await this.p2pClient.broadcastCheckpointProposal(proposal);
|
|
1069
|
+
this.checkpointMetrics.noteCheckpointBroadcast(this.dateProvider.now());
|
|
1070
|
+
}
|
|
978
1071
|
// Return immediately after broadcast — attestation collection happens in the background
|
|
979
1072
|
return {
|
|
980
1073
|
checkpoint,
|
|
@@ -1009,6 +1102,14 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1009
1102
|
const blocksBuilt = blocksInCheckpoint.length;
|
|
1010
1103
|
const indexWithinCheckpoint = IndexWithinCheckpoint(blocksBuilt);
|
|
1011
1104
|
const blockNumber = BlockNumber(initialBlockNumber + blocksBuilt);
|
|
1105
|
+
if (blocksBuilt >= this.config.maxBlocksPerCheckpoint) {
|
|
1106
|
+
this.log.debug(`Reached max blocks per checkpoint`, {
|
|
1107
|
+
slot: this.targetSlot,
|
|
1108
|
+
blocksBuilt,
|
|
1109
|
+
maxBlocksPerCheckpoint: this.config.maxBlocksPerCheckpoint
|
|
1110
|
+
});
|
|
1111
|
+
break;
|
|
1112
|
+
}
|
|
1012
1113
|
const secondsIntoSlot = this.getSecondsIntoSlot();
|
|
1013
1114
|
const timingInfo = this.timetable.canStartNextBlock(secondsIntoSlot);
|
|
1014
1115
|
if (!timingInfo.canStart) {
|
|
@@ -1077,7 +1178,9 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1077
1178
|
break;
|
|
1078
1179
|
}
|
|
1079
1180
|
// Once we have a signed proposal and the archiver agreed with our proposed block, then we broadcast it.
|
|
1080
|
-
proposal &&
|
|
1181
|
+
if (proposal && !this.config.skipBroadcastProposals) {
|
|
1182
|
+
await this.p2pClient.broadcastProposal(proposal);
|
|
1183
|
+
}
|
|
1081
1184
|
// Wait until the next block's start time
|
|
1082
1185
|
await this.waitUntilNextSubslot(timingInfo.deadline);
|
|
1083
1186
|
}
|
|
@@ -1114,10 +1217,23 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1114
1217
|
// Wait until we have enough txs to build the block
|
|
1115
1218
|
const { availableTxs, canStartBuilding, minTxs } = await this.waitForMinTxs(opts);
|
|
1116
1219
|
if (!canStartBuilding) {
|
|
1220
|
+
this.logCheckpointEvent('block-build-failed', `Block build failed for slot ${this.targetSlot}`, {
|
|
1221
|
+
reason: 'insufficient_txs',
|
|
1222
|
+
blockNumber,
|
|
1223
|
+
slot: this.targetSlot,
|
|
1224
|
+
checkpointNumber: this.checkpointNumber,
|
|
1225
|
+
indexWithinCheckpoint,
|
|
1226
|
+
availableTxs,
|
|
1227
|
+
minTxs
|
|
1228
|
+
});
|
|
1117
1229
|
this.log.warn(`Not enough txs to build block ${blockNumber} at index ${indexWithinCheckpoint} in slot ${this.targetSlot} (got ${availableTxs} txs but needs ${minTxs})`, {
|
|
1230
|
+
reason: 'insufficient_txs',
|
|
1118
1231
|
blockNumber,
|
|
1119
1232
|
slot: this.targetSlot,
|
|
1120
|
-
|
|
1233
|
+
checkpointNumber: this.checkpointNumber,
|
|
1234
|
+
indexWithinCheckpoint,
|
|
1235
|
+
availableTxs,
|
|
1236
|
+
minTxs
|
|
1121
1237
|
});
|
|
1122
1238
|
this.eventEmitter.emit('block-tx-count-check-failed', {
|
|
1123
1239
|
minTxs,
|
|
@@ -1158,8 +1274,19 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1158
1274
|
// If any txs failed during execution, drop them from the mempool so we don't pick them up again
|
|
1159
1275
|
await this.dropFailedTxsFromP2P(buildResult.failedTxs);
|
|
1160
1276
|
if (buildResult.status === 'insufficient-valid-txs') {
|
|
1277
|
+
this.logCheckpointEvent('block-build-failed', `Block build failed for slot ${this.targetSlot}`, {
|
|
1278
|
+
reason: 'insufficient_valid_txs',
|
|
1279
|
+
slot: this.targetSlot,
|
|
1280
|
+
checkpointNumber: this.checkpointNumber,
|
|
1281
|
+
blockNumber,
|
|
1282
|
+
numTxs: buildResult.processedCount,
|
|
1283
|
+
indexWithinCheckpoint,
|
|
1284
|
+
minValidTxs
|
|
1285
|
+
});
|
|
1161
1286
|
this.log.warn(`Block ${blockNumber} at index ${indexWithinCheckpoint} on slot ${this.targetSlot} has too few valid txs to be proposed`, {
|
|
1287
|
+
reason: 'insufficient_valid_txs',
|
|
1162
1288
|
slot: this.targetSlot,
|
|
1289
|
+
checkpointNumber: this.checkpointNumber,
|
|
1163
1290
|
blockNumber,
|
|
1164
1291
|
numTxs: buildResult.processedCount,
|
|
1165
1292
|
indexWithinCheckpoint,
|
|
@@ -1208,9 +1335,17 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1208
1335
|
reason: err.message,
|
|
1209
1336
|
slot: this.targetSlot
|
|
1210
1337
|
});
|
|
1338
|
+
this.logCheckpointEvent('block-build-failed', `Block build failed for slot ${this.targetSlot}`, {
|
|
1339
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
1340
|
+
slot: this.targetSlot,
|
|
1341
|
+
checkpointNumber: this.checkpointNumber,
|
|
1342
|
+
blockNumber
|
|
1343
|
+
});
|
|
1211
1344
|
this.log.error(`Error building block`, err, {
|
|
1212
|
-
|
|
1213
|
-
slot: this.targetSlot
|
|
1345
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
1346
|
+
slot: this.targetSlot,
|
|
1347
|
+
checkpointNumber: this.checkpointNumber,
|
|
1348
|
+
blockNumber
|
|
1214
1349
|
});
|
|
1215
1350
|
this.metrics.recordBlockProposalFailed(err.name || 'unknown_error');
|
|
1216
1351
|
this.metrics.recordFailedBlock();
|
|
@@ -1303,7 +1438,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1303
1438
|
*/ async waitForAttestations(proposal) {
|
|
1304
1439
|
if (this.config.fishermanMode) {
|
|
1305
1440
|
this.log.debug('Skipping attestation collection in fisherman mode');
|
|
1306
|
-
return CommitteeAttestationsAndSigners.empty();
|
|
1441
|
+
return CommitteeAttestationsAndSigners.empty(this.getSignatureContext());
|
|
1307
1442
|
}
|
|
1308
1443
|
const slotNumber = proposal.slotNumber;
|
|
1309
1444
|
const { committee, seed, epoch } = await this.epochCache.getCommittee(slotNumber);
|
|
@@ -1311,7 +1446,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1311
1446
|
throw new Error('No committee when collecting attestations');
|
|
1312
1447
|
} else if (committee.length === 0) {
|
|
1313
1448
|
this.log.verbose(`Attesting committee is empty`);
|
|
1314
|
-
return CommitteeAttestationsAndSigners.empty();
|
|
1449
|
+
return CommitteeAttestationsAndSigners.empty(this.getSignatureContext());
|
|
1315
1450
|
} else {
|
|
1316
1451
|
this.log.debug(`Attesting committee length is ${committee.length}`, {
|
|
1317
1452
|
committee
|
|
@@ -1321,7 +1456,10 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1321
1456
|
if (this.config.skipCollectingAttestations) {
|
|
1322
1457
|
this.log.warn('Skipping attestation collection as per config (attesting with own keys only)');
|
|
1323
1458
|
const attestations = await this.validatorClient?.collectOwnAttestations(proposal, this.checkpointNumber);
|
|
1324
|
-
|
|
1459
|
+
this.logCheckpointAttestations('collected', committee, attestations ?? [], numberOfRequiredAttestations, {
|
|
1460
|
+
reason: 'collect_own_only'
|
|
1461
|
+
});
|
|
1462
|
+
return new CommitteeAttestationsAndSigners(orderAttestations(attestations ?? [], committee), this.getSignatureContext());
|
|
1325
1463
|
}
|
|
1326
1464
|
const attestationTimeAllowed = this.config.enforceTimeTable ? this.timetable.getCheckpointAttestationDeadline() : this.l1Constants.slotDuration;
|
|
1327
1465
|
const attestationDeadline = new Date((this.getSlotStartBuildTimestamp() + attestationTimeAllowed) * 1000);
|
|
@@ -1339,16 +1477,27 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1339
1477
|
}
|
|
1340
1478
|
// Rollup contract requires that the signatures are provided in the order of the committee
|
|
1341
1479
|
const sorted = orderAttestations(trimmed, committee);
|
|
1480
|
+
this.logCheckpointAttestations('collected', committee, attestations, numberOfRequiredAttestations, {
|
|
1481
|
+
submittedCount: trimmed.length
|
|
1482
|
+
});
|
|
1342
1483
|
// Manipulate the attestations if we've been configured to do so
|
|
1343
1484
|
if (this.config.injectFakeAttestation || this.config.injectHighSValueAttestation || this.config.injectUnrecoverableSignatureAttestation || this.config.shuffleAttestationOrdering) {
|
|
1344
1485
|
return this.manipulateAttestations(proposal.slotNumber, epoch, seed, committee, sorted);
|
|
1345
1486
|
}
|
|
1346
|
-
return new CommitteeAttestationsAndSigners(sorted);
|
|
1487
|
+
return new CommitteeAttestationsAndSigners(sorted, this.getSignatureContext());
|
|
1347
1488
|
} catch (err) {
|
|
1348
1489
|
if (err && err instanceof AttestationTimeoutError) {
|
|
1349
1490
|
collectedAttestationsCount = err.collectedCount;
|
|
1491
|
+
this.logCheckpointAttestations('failed', committee, undefined, numberOfRequiredAttestations, {
|
|
1492
|
+
collectedCount: collectedAttestationsCount,
|
|
1493
|
+
reason: 'timeout'
|
|
1494
|
+
});
|
|
1350
1495
|
this.log.error(`Timeout while waiting for attestations for checkpoint proposal at slot ${proposal.slotNumber} (collected ${collectedAttestationsCount}/${numberOfRequiredAttestations})`, err);
|
|
1351
1496
|
} else {
|
|
1497
|
+
this.logCheckpointAttestations('failed', committee, undefined, numberOfRequiredAttestations, {
|
|
1498
|
+
collectedCount: collectedAttestationsCount,
|
|
1499
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
1500
|
+
});
|
|
1352
1501
|
this.log.error(`Error collecting attestations for checkpoint proposal at slot ${proposal.slotNumber}`, err);
|
|
1353
1502
|
}
|
|
1354
1503
|
return undefined;
|
|
@@ -1356,6 +1505,27 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1356
1505
|
this.metrics.recordCollectedAttestations(collectedAttestationsCount, collectAttestationsTimer.ms());
|
|
1357
1506
|
}
|
|
1358
1507
|
}
|
|
1508
|
+
logCheckpointAttestations(status, committee, attestations, requiredAttestations, opts = {}) {
|
|
1509
|
+
const signedValidators = attestations?.map((attestation)=>attestation.getSender()?.toString()).filter((address)=>address !== undefined) ?? [];
|
|
1510
|
+
const collectedCount = opts.collectedCount ?? new Set(signedValidators).size;
|
|
1511
|
+
const missingValidatorCount = status === 'failed' ? Math.max(0, requiredAttestations - collectedCount) : undefined;
|
|
1512
|
+
this.logCheckpointEvent(`attestations-${status}`, `Checkpoint attestations ${status} for slot ${this.targetSlot}`, {
|
|
1513
|
+
slot: this.targetSlot,
|
|
1514
|
+
checkpointNumber: this.checkpointNumber,
|
|
1515
|
+
committeeSize: committee.length,
|
|
1516
|
+
requiredAttestations,
|
|
1517
|
+
collectedAttestations: collectedCount,
|
|
1518
|
+
...opts.submittedCount !== undefined && {
|
|
1519
|
+
submittedAttestations: opts.submittedCount
|
|
1520
|
+
},
|
|
1521
|
+
...missingValidatorCount !== undefined && {
|
|
1522
|
+
missingValidatorCount
|
|
1523
|
+
},
|
|
1524
|
+
...opts.reason !== undefined && {
|
|
1525
|
+
reason: opts.reason
|
|
1526
|
+
}
|
|
1527
|
+
});
|
|
1528
|
+
}
|
|
1359
1529
|
/** Breaks the attestations before publishing based on attack configs */ manipulateAttestations(slotNumber, epoch, seed, committee, attestations) {
|
|
1360
1530
|
// Compute the proposer index in the committee, since we dont want to tweak it.
|
|
1361
1531
|
// Otherwise, the L1 rollup contract will reject the block outright.
|
|
@@ -1381,7 +1551,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1381
1551
|
unfreeze(attestations[targetIndex]).signature = generateRecoverableSignature();
|
|
1382
1552
|
}
|
|
1383
1553
|
}
|
|
1384
|
-
return new CommitteeAttestationsAndSigners(attestations);
|
|
1554
|
+
return new CommitteeAttestationsAndSigners(attestations, this.getSignatureContext());
|
|
1385
1555
|
}
|
|
1386
1556
|
if (this.config.shuffleAttestationOrdering) {
|
|
1387
1557
|
this.log.warn(`Shuffling attestation ordering in checkpoint for slot ${slotNumber} (proposer #${proposerIndex})`);
|
|
@@ -1407,10 +1577,10 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1407
1577
|
shuffled[i]
|
|
1408
1578
|
];
|
|
1409
1579
|
}
|
|
1410
|
-
const signers = new CommitteeAttestationsAndSigners(attestations).getSigners();
|
|
1411
|
-
return new MaliciousCommitteeAttestationsAndSigners(shuffled, signers);
|
|
1580
|
+
const signers = new CommitteeAttestationsAndSigners(attestations, this.getSignatureContext()).getSigners();
|
|
1581
|
+
return new MaliciousCommitteeAttestationsAndSigners(shuffled, signers, this.getSignatureContext());
|
|
1412
1582
|
}
|
|
1413
|
-
return new CommitteeAttestationsAndSigners(attestations);
|
|
1583
|
+
return new CommitteeAttestationsAndSigners(attestations, this.getSignatureContext());
|
|
1414
1584
|
}
|
|
1415
1585
|
async dropFailedTxsFromP2P(failedTxs) {
|
|
1416
1586
|
if (failedTxs.length === 0) {
|
|
@@ -13,6 +13,7 @@ export declare class SequencerMetrics {
|
|
|
13
13
|
private blockBuildDuration;
|
|
14
14
|
private blockBuildManaPerSecond;
|
|
15
15
|
private stateTransitionBufferDuration;
|
|
16
|
+
private stateDuration;
|
|
16
17
|
private timeToCollectAttestations;
|
|
17
18
|
private allowanceToCollectAttestations;
|
|
18
19
|
private requiredAttestions;
|
|
@@ -53,6 +54,7 @@ export declare class SequencerMetrics {
|
|
|
53
54
|
recordBuiltBlock(buildDurationMs: number, totalMana: number, slot: SlotNumber): void;
|
|
54
55
|
recordFailedBlock(): void;
|
|
55
56
|
recordStateTransitionBufferMs(durationMs: number, state: SequencerState): void;
|
|
57
|
+
recordStateDuration(durationMs: number, state: SequencerState): void;
|
|
56
58
|
recordPipelineDepth(depth: number): void;
|
|
57
59
|
recordPipelineDiscard(count?: number): void;
|
|
58
60
|
recordPipelineParentCheckpointMismatch(reason: string): void;
|
|
@@ -70,4 +72,4 @@ export declare class SequencerMetrics {
|
|
|
70
72
|
*/
|
|
71
73
|
recordFishermanFeeAnalysis(analysis: L1FeeAnalysisResult): void;
|
|
72
74
|
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFNTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxNQUFNLEVBR1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELHFCQUFhLGdCQUFnQjtJQXVEekIsT0FBTyxDQUFDLE1BQU07SUF0RGhCLFNBQWdCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixPQUFPLENBQUMsWUFBWSxDQUFnQjtJQUNwQyxPQUFPLENBQUMsa0JBQWtCLENBQVk7SUFDdEMsT0FBTyxDQUFDLHVCQUF1QixDQUFRO0lBQ3ZDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBWTtJQUNqRCxPQUFPLENBQUMsYUFBYSxDQUFZO0lBR2pDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBUTtJQUN6QyxPQUFPLENBQUMsOEJBQThCLENBQVE7SUFDOUMsT0FBTyxDQUFDLGtCQUFrQixDQUFRO0lBQ2xDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBUTtJQUVuQyxPQUFPLENBQUMsT0FBTyxDQUFRO0lBRXZCLE9BQU8sQ0FBQyxLQUFLLENBQWdCO0lBQzdCLE9BQU8sQ0FBQyxXQUFXLENBQWdCO0lBRW5DLE9B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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,gBAAgB;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export class SequencerMetrics {
|
|
|
8
8
|
blockBuildDuration;
|
|
9
9
|
blockBuildManaPerSecond;
|
|
10
10
|
stateTransitionBufferDuration;
|
|
11
|
+
stateDuration;
|
|
11
12
|
// these are gauges because for individual sequencers building a block is not something that happens often enough to warrant a histogram
|
|
12
13
|
timeToCollectAttestations;
|
|
13
14
|
allowanceToCollectAttestations;
|
|
@@ -58,6 +59,7 @@ export class SequencerMetrics {
|
|
|
58
59
|
this.blockBuildManaPerSecond = this.meter.createGauge(Metrics.SEQUENCER_BLOCK_BUILD_MANA_PER_SECOND);
|
|
59
60
|
this.blockInterBlockTime = this.meter.createHistogram(Metrics.SEQUENCER_BLOCK_INTER_BLOCK_TIME);
|
|
60
61
|
this.stateTransitionBufferDuration = this.meter.createHistogram(Metrics.SEQUENCER_STATE_TRANSITION_BUFFER_DURATION);
|
|
62
|
+
this.stateDuration = this.meter.createHistogram(Metrics.SEQUENCER_STATE_DURATION);
|
|
61
63
|
this.rewards = this.meter.createGauge(Metrics.SEQUENCER_CURRENT_SLOT_REWARDS);
|
|
62
64
|
this.slots = createUpDownCounterWithDefault(this.meter, Metrics.SEQUENCER_SLOT_COUNT);
|
|
63
65
|
/**
|
|
@@ -158,6 +160,11 @@ export class SequencerMetrics {
|
|
|
158
160
|
[Attributes.SEQUENCER_STATE]: state
|
|
159
161
|
});
|
|
160
162
|
}
|
|
163
|
+
recordStateDuration(durationMs, state) {
|
|
164
|
+
this.stateDuration.record(Math.ceil(durationMs), {
|
|
165
|
+
[Attributes.SEQUENCER_STATE]: state
|
|
166
|
+
});
|
|
167
|
+
}
|
|
161
168
|
recordPipelineDepth(depth) {
|
|
162
169
|
this.pipelineDepth.record(depth);
|
|
163
170
|
}
|
|
@@ -3,12 +3,14 @@ import { type RollupContract } from '@aztec/ethereum/contracts';
|
|
|
3
3
|
import { BlockNumber, CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
6
7
|
import type { DateProvider } from '@aztec/foundation/timer';
|
|
7
8
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
8
9
|
import type { P2P } from '@aztec/p2p';
|
|
9
10
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
10
11
|
import type { BlockData, L2BlockSink, L2BlockSource, ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
11
12
|
import type { Checkpoint, ProposedCheckpointData } from '@aztec/stdlib/checkpoint';
|
|
13
|
+
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
12
14
|
import { type ResolvedSequencerConfig, type SequencerConfig, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
13
15
|
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
14
16
|
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
@@ -46,11 +48,14 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
46
48
|
protected epochCache: EpochCache;
|
|
47
49
|
protected rollupContract: RollupContract;
|
|
48
50
|
protected telemetry: TelemetryClient;
|
|
49
|
-
protected log:
|
|
51
|
+
protected log: Logger;
|
|
50
52
|
private runningPromise?;
|
|
51
53
|
private state;
|
|
54
|
+
private stateSlotNumber;
|
|
55
|
+
private stateEnteredAtMs;
|
|
52
56
|
private metrics;
|
|
53
57
|
private checkpointProposalJobMetrics;
|
|
58
|
+
private readonly stateLog;
|
|
54
59
|
/** The last slot for which we attempted to perform our voting duties with degraded block production */
|
|
55
60
|
private lastSlotForFallbackVote;
|
|
56
61
|
/** The last slot for which we logged "no committee" warning, to avoid spam */
|
|
@@ -67,7 +72,8 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
67
72
|
protected timetable: SequencerTimetable;
|
|
68
73
|
/** Config for the sequencer */
|
|
69
74
|
protected config: ResolvedSequencerConfig;
|
|
70
|
-
|
|
75
|
+
private readonly signatureContext;
|
|
76
|
+
constructor(publisherFactory: SequencerPublisherFactory, validatorClient: ValidatorClient, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, slasherClient: SlasherClientInterface | undefined, l2BlockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, checkpointsBuilder: FullNodeCheckpointsBuilder, l1Constants: SequencerRollupConstants, dateProvider: DateProvider, epochCache: EpochCache, rollupContract: RollupContract, config: SequencerConfig & Pick<ChainConfig, 'l1ChainId' | 'l1Contracts'>, telemetry?: TelemetryClient, log?: Logger);
|
|
71
77
|
/** Updates sequencer config by the defined values and updates the timetable */
|
|
72
78
|
updateConfig(config: Partial<SequencerConfig>): void;
|
|
73
79
|
/** Initializes the sequencer (precomputes tables). Takes about 3s. */
|
|
@@ -164,6 +170,7 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
164
170
|
sequencerPollingIntervalMS: number;
|
|
165
171
|
maxTxsPerBlock?: number | undefined;
|
|
166
172
|
maxTxsPerCheckpoint?: number | undefined;
|
|
173
|
+
maxBlocksPerCheckpoint: number;
|
|
167
174
|
minTxsPerBlock: number;
|
|
168
175
|
minValidTxsPerBlock?: number | undefined;
|
|
169
176
|
publishTxsWithProposals: boolean;
|
|
@@ -175,7 +182,7 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
175
182
|
feeRecipient?: import("@aztec/stdlib/aztec-address").AztecAddress | undefined;
|
|
176
183
|
acvmWorkingDirectory?: string | undefined;
|
|
177
184
|
acvmBinaryPath?: string | undefined;
|
|
178
|
-
txPublicSetupAllowListExtend?: import("@aztec/stdlib/
|
|
185
|
+
txPublicSetupAllowListExtend?: import("@aztec/stdlib/config").AllowedElement[] | undefined;
|
|
179
186
|
governanceProposerPayload?: EthAddress | undefined;
|
|
180
187
|
enforceTimeTable: boolean;
|
|
181
188
|
l1PublishingTime?: number | undefined;
|
|
@@ -198,6 +205,7 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
198
205
|
skipPushProposedBlocksToArchiver: boolean;
|
|
199
206
|
minBlocksForCheckpoint?: number | undefined;
|
|
200
207
|
skipPublishingCheckpointsPercent: number;
|
|
208
|
+
skipBroadcastProposals?: boolean | undefined;
|
|
201
209
|
};
|
|
202
210
|
private get l1PublishingTime();
|
|
203
211
|
}
|
|
@@ -212,4 +220,4 @@ type SequencerSyncCheckResult = {
|
|
|
212
220
|
syncedL2Slot: SlotNumber;
|
|
213
221
|
pendingChainValidationStatus: ValidateCheckpointResult;
|
|
214
222
|
};
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQW9CLEtBQUssY0FBYyxFQUE4QixNQUFNLDJCQUEyQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRyxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQ0wsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxlQUFlLEVBRXBCLEtBQUssc0JBQXNCLEVBQzVCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUluRSxPQUFPLEVBQWMsS0FBSyxlQUFlLEVBQUUsS0FBSyxNQUFNLEVBQWlDLE1BQU0seUJBQXlCLENBQUM7QUFDdkgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLG1CQUFtQixFQUFFLEtBQUssZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFLaEgsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMxRixPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzdGLE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0csT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJckUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDOztBQUUxQjs7Ozs7OztHQU9HO0FBQ0gscUJBQWEsU0FBVSxTQUFRLGNBQThEO0lBbUN6RixTQUFTLENBQUMsZ0JBQWdCLEVBQUUseUJBQXlCO0lBQ3JELFNBQVMsQ0FBQyxlQUFlLEVBQUUsZUFBZTtJQUMxQyxTQUFTLENBQUMsY0FBYyxFQUFFLHFCQUFxQjtJQUMvQyxTQUFTLENBQUMsU0FBUyxFQUFFLEdBQUc7SUFDeEIsU0FBUyxDQUFDLFVBQVUsRUFBRSxzQkFBc0I7SUFDNUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxzQkFBc0IsR0FBRyxTQUFTO0lBQzNELFNBQVMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLFdBQVc7SUFDcEQsU0FBUyxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQjtJQUNsRCxTQUFTLENBQUMsa0JBQWtCLEVBQUUsMEJBQTBCO0lBQ3hELFNBQVMsQ0FBQyxXQUFXLEVBQUUsd0JBQXdCO0lBQy9DLFNBQVMsQ0FBQyxZQUFZLEVBQUUsWUFBWTtJQUNwQyxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDaEMsU0FBUyxDQUFDLGNBQWMsRUFBRSxjQUFjO0lBRXhDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsZUFBZTtJQUNwQyxTQUFTLENBQUMsR0FBRztJQWpEZixPQUFPLENBQUMsY0FBYyxDQUFDLENBQWlCO0lBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQTBCO0lBQ3ZDLE9BQU8sQ0FBQyxlQUFlLENBQXlCO0lBQ2hELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBcUI7SUFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBbUI7SUFDbEMsT0FBTyxDQUFDLDRCQUE0QixDQUErQjtJQUNuRSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBUztJQUVsQyx1R0FBdUc7SUFDdkcsT0FBTyxDQUFDLHVCQUF1QixDQUF5QjtJQUV4RCw4RUFBOEU7SUFDOUUsT0FBTyxDQUFDLDZCQUE2QixDQUF5QjtJQUU5RCxxR0FBcUc7SUFDckcsT0FBTyxDQUFDLGdDQUFnQyxDQUF5QjtJQUVqRSwwQ0FBMEM7SUFDMUMsT0FBTyxDQUFDLHNCQUFzQixDQUF5QjtJQUV2RCxnRkFBZ0Y7SUFDaEYsT0FBTyxDQUFDLDhCQUE4QixDQUEwQjtJQUVoRSwyR0FBMkc7SUFDM0csU0FBUyxDQUFDLHlCQUF5QixFQUFFLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztJQUV2RSwrR0FBK0c7SUFDL0csU0FBUyxDQUFDLFNBQVMsRUFBRyxrQkFBa0IsQ0FBQztJQUV6QywrQkFBK0I7SUFDL0IsU0FBUyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBMEI7SUFDbkUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBK0I7SUFFaEUsWUFDWSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFDM0MsZUFBZSxFQUFFLGVBQWUsRUFDaEMsY0FBYyxFQUFFLHFCQUFxQixFQUNyQyxTQUFTLEVBQUUsR0FBRyxFQUNkLFVBQVUsRUFBRSxzQkFBc0IsRUFDbEMsYUFBYSxFQUFFLHNCQUFzQixHQUFHLFNBQVMsRUFDakQsYUFBYSxFQUFFLGFBQWEsR0FBRyxXQUFXLEVBQzFDLG1CQUFtQixFQUFFLG1CQUFtQixFQUN4QyxrQkFBa0IsRUFBRSwwQkFBMEIsRUFDOUMsV0FBVyxFQUFFLHdCQUF3QixFQUNyQyxZQUFZLEVBQUUsWUFBWSxFQUMxQixVQUFVLEVBQUUsVUFBVSxFQUN0QixjQUFjLEVBQUUsY0FBYyxFQUN4QyxNQUFNLEVBQUUsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLGFBQWEsQ0FBQyxFQUM5RCxTQUFTLEdBQUUsZUFBc0MsRUFDakQsR0FBRyxTQUE0QixFQWlCMUM7SUFFRCwrRUFBK0U7SUFDeEUsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLFFBa0JuRDtJQUVELHNFQUFzRTtJQUMvRCxJQUFJLFNBRVY7SUFFRCxvREFBb0Q7SUFDN0MsS0FBSyxTQVNYO0lBRUQsa0ZBQWtGO0lBQzNFLE9BQU8sOEJBRWI7SUFFRCwyRUFBMkU7SUFDOUQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FRakM7SUFFRCwyQ0FBMkM7SUFDM0MsVUFBZ0IsUUFBUSxrQkFvQnZCO0lBRUQsa0RBQWtEO0lBQzNDLE1BQU07O01BRVo7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsVUFDZ0IsSUFBSSxvQ0F1Q25CO0lBRUQ7Ozs7T0FJRztJQUNILFVBQ2dCLHlCQUF5QixDQUN2QyxJQUFJLEVBQUUsVUFBVSxFQUNoQixVQUFVLEVBQUUsVUFBVSxFQUN0QixLQUFLLEVBQUUsV0FBVyxFQUNsQixXQUFXLEVBQUUsV0FBVyxFQUN4QixFQUFFLEVBQUUsTUFBTSxFQUNWLFVBQVUsRUFBRSxNQUFNLEdBQ2pCLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUMsQ0FzTTVDO0lBRUQsU0FBUyxDQUFDLDJCQUEyQixDQUNuQyxJQUFJLEVBQUUsVUFBVSxFQUNoQixVQUFVLEVBQUUsVUFBVSxFQUN0QixXQUFXLEVBQUUsV0FBVyxFQUN4QixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsbUJBQW1CLEVBQUUsV0FBVyxFQUNoQyxRQUFRLEVBQUUsVUFBVSxHQUFHLFNBQVMsRUFDaEMsU0FBUyxFQUFFLGtCQUFrQixFQUM3QixlQUFlLEVBQUUsVUFBVSxFQUMzQixvQkFBb0IsRUFBRSwyQkFBMkIsR0FBRyxTQUFTLEVBQzdELHNCQUFzQixDQUFDLEVBQUUsc0JBQXNCLEdBQzlDLHFCQUFxQixDQWtDdkI7SUFFRDs7T0FFRztJQUNJLFFBQVEsSUFBSSxjQUFjLENBRWhDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsUUFBUSxDQUNoQixhQUFhLEVBQUUsY0FBYyxFQUM3QixVQUFVLEVBQUUsVUFBVSxHQUFHLFNBQVMsRUFDbEMsSUFBSSxHQUFFO1FBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFBO0tBQU8sR0FDN0IsSUFBSSxDQTZDTjtJQUVEOzs7T0FHRztJQUNILFVBQWdCLFNBQVMsQ0FBQyxJQUFJLEVBQUU7UUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDO1FBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxDQThGL0c7SUFFRDs7O09BR0c7SUFDSCxVQUFnQixlQUFlLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBMkNsRztJQUVEOzs7T0FHRztJQUNILFVBQ2dCLG9CQUFvQixDQUFDLElBQUksRUFBRTtRQUFFLElBQUksRUFBRSxVQUFVLENBQUM7UUFBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO1FBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQW9FbEg7SUFFRDs7O09BR0c7SUFDSCxVQUNnQiwwQkFBMEIsQ0FBQyxJQUFJLEVBQUU7UUFDL0MsSUFBSSxFQUFFLFVBQVUsQ0FBQztRQUNqQixRQUFRLEVBQUUsVUFBVSxHQUFHLFNBQVMsQ0FBQztLQUNsQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FzQ2hCO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFnQiw4QkFBOEIsQ0FDNUMsUUFBUSxFQUFFLHdCQUF3QixFQUNsQyxXQUFXLEVBQUUsVUFBVSxHQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBb0ZmO0lBRUQsT0FBTyxDQUFDLHFCQUFxQjtJQTZCN0IsT0FBTyxDQUFDLDBCQUEwQjtJQUlsQyxPQUFPLENBQUMsa0JBQWtCO0lBSzFCLElBQVcsaUJBQWlCLFdBRTNCO0lBRUQsSUFBVyxhQUFhLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FFN0M7SUFFTSxnQkFBZ0IsSUFBSSxzQkFBc0IsR0FBRyxTQUFTLENBRTVEO0lBRUQsSUFBVyxNQUFNLElBQUksTUFBTSxDQUUxQjtJQUVNLHFCQUFxQixpQkFFM0I7SUFFRCxxRkFBcUY7SUFDOUUsMkJBQTJCLENBQUMsT0FBTyxFQUFFLG1CQUFtQixHQUFHLElBQUksQ0FFckU7SUFFTSxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRWY7SUFFRCxPQUFPLEtBQUssZ0JBQWdCLEdBRTNCO0NBQ0Y7QUFFRCxLQUFLLHdCQUF3QixHQUFHO0lBQzlCLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUN0QixnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztJQUNuQyw0QkFBNEIsRUFBRSxnQkFBZ0IsQ0FBQztJQUMvQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDWixxQkFBcUIsRUFBRSxPQUFPLENBQUM7SUFDL0Isc0JBQXNCLENBQUMsRUFBRSxzQkFBc0IsQ0FBQztJQUNoRCxZQUFZLEVBQUUsVUFBVSxDQUFDO0lBQ3pCLDRCQUE0QixFQUFFLHdCQUF3QixDQUFDO0NBQ3hELENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAoB,KAAK,cAAc,EAA8B,MAAM,2BAA2B,CAAC;AAC9G,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEzG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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"}
|