@aztec/sequencer-client 0.0.1-commit.f5d02921e → 0.0.1-commit.f7ea82942
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/client/sequencer-client.d.ts +3 -1
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +3 -4
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +8 -11
- 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 +4 -9
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +3 -41
- package/dest/global_variable_builder/index.d.ts +3 -1
- package/dest/global_variable_builder/index.d.ts.map +1 -1
- package/dest/global_variable_builder/index.js +2 -0
- package/dest/publisher/config.d.ts +1 -1
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +2 -2
- 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-publisher-factory.d.ts +1 -3
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +0 -1
- package/dest/publisher/sequencer-publisher.d.ts +16 -35
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +60 -92
- package/dest/sequencer/chain_state_overrides.d.ts +25 -0
- package/dest/sequencer/chain_state_overrides.d.ts.map +1 -0
- package/dest/sequencer/chain_state_overrides.js +39 -0
- package/dest/sequencer/checkpoint_proposal_job.d.ts +27 -22
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +294 -155
- 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/events.d.ts +6 -1
- package/dest/sequencer/events.d.ts.map +1 -1
- package/dest/sequencer/metrics.d.ts +7 -10
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +27 -20
- package/dest/sequencer/sequencer.d.ts +5 -2
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +31 -23
- package/dest/sequencer/timetable.d.ts +14 -1
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +45 -36
- package/package.json +27 -27
- package/src/client/sequencer-client.ts +5 -7
- package/src/config.ts +8 -11
- 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 +7 -54
- package/src/global_variable_builder/index.ts +2 -0
- package/src/publisher/config.ts +6 -4
- package/src/publisher/l1_tx_failed_store/failed_tx_store.ts +3 -1
- package/src/publisher/sequencer-publisher-factory.ts +0 -3
- package/src/publisher/sequencer-publisher.ts +106 -152
- package/src/sequencer/README.md +83 -13
- package/src/sequencer/chain_state_overrides.ts +87 -0
- package/src/sequencer/checkpoint_proposal_job.ts +365 -205
- package/src/sequencer/checkpoint_proposal_job_metrics.ts +128 -0
- package/src/sequencer/events.ts +5 -0
- package/src/sequencer/metrics.ts +35 -25
- package/src/sequencer/sequencer.ts +44 -26
- package/src/sequencer/timetable.ts +57 -45
|
@@ -372,12 +372,11 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
372
372
|
}
|
|
373
373
|
var _dec, _dec1, _dec2, _initProto;
|
|
374
374
|
import { Blob, getBlobsPerL1Block, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
|
|
375
|
-
import { FeeAssetPriceOracle, MULTI_CALL_3_ADDRESS, Multicall3,
|
|
375
|
+
import { FeeAssetPriceOracle, MULTI_CALL_3_ADDRESS, Multicall3, SimulationOverridesBuilder, buildSimulationOverridesStateOverride } from '@aztec/ethereum/contracts';
|
|
376
376
|
import { L1FeeAnalyzer } from '@aztec/ethereum/l1-fee-analysis';
|
|
377
377
|
import { MAX_L1_TX_LIMIT, WEI_CONST } from '@aztec/ethereum/l1-tx-utils';
|
|
378
378
|
import { FormattedViemError, formatViemError, mergeAbis, tryExtractEvent } from '@aztec/ethereum/utils';
|
|
379
379
|
import { sumBigint } from '@aztec/foundation/bigint';
|
|
380
|
-
import { toHex as toPaddedHex } from '@aztec/foundation/bigint-buffer';
|
|
381
380
|
import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
382
381
|
import { trimmedBytesLength } from '@aztec/foundation/buffer';
|
|
383
382
|
import { pick } from '@aztec/foundation/collection';
|
|
@@ -402,9 +401,6 @@ export const Actions = [
|
|
|
402
401
|
'invalidate-by-insufficient-attestations',
|
|
403
402
|
'propose',
|
|
404
403
|
'governance-signal',
|
|
405
|
-
'empire-slashing-signal',
|
|
406
|
-
'create-empire-payload',
|
|
407
|
-
'execute-empire-payload',
|
|
408
404
|
'vote-offenses',
|
|
409
405
|
'execute-slash'
|
|
410
406
|
];
|
|
@@ -459,7 +455,6 @@ export class SequencerPublisher {
|
|
|
459
455
|
rollupContract;
|
|
460
456
|
govProposerContract;
|
|
461
457
|
slashingProposerContract;
|
|
462
|
-
slashFactoryContract;
|
|
463
458
|
tracer;
|
|
464
459
|
requests;
|
|
465
460
|
constructor(config, deps){
|
|
@@ -493,7 +488,6 @@ export class SequencerPublisher {
|
|
|
493
488
|
const newSlashingProposer = await this.rollupContract.getSlashingProposer();
|
|
494
489
|
this.slashingProposerContract = newSlashingProposer;
|
|
495
490
|
});
|
|
496
|
-
this.slashFactoryContract = deps.slashFactoryContract;
|
|
497
491
|
// Initialize L1 fee analyzer for fisherman mode
|
|
498
492
|
if (config.fishermanMode) {
|
|
499
493
|
this.l1FeeAnalyzer = new L1FeeAnalyzer(this.l1TxUtils.client, deps.dateProvider, createLogger('sequencer:publisher:fee-analyzer'));
|
|
@@ -759,6 +753,24 @@ export class SequencerPublisher {
|
|
|
759
753
|
if (this.interrupted) {
|
|
760
754
|
return undefined;
|
|
761
755
|
}
|
|
756
|
+
// Re-validate enqueued requests after the sleep (state may have changed, e.g. prune or L1 reorg)
|
|
757
|
+
const validRequests = [];
|
|
758
|
+
for (const request of this.requests){
|
|
759
|
+
if (!request.preCheck) {
|
|
760
|
+
validRequests.push(request);
|
|
761
|
+
continue;
|
|
762
|
+
}
|
|
763
|
+
try {
|
|
764
|
+
await request.preCheck();
|
|
765
|
+
validRequests.push(request);
|
|
766
|
+
} catch (err) {
|
|
767
|
+
this.log.warn(`Pre-send validation failed for ${request.action}, discarding request`, err);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
this.requests = validRequests;
|
|
771
|
+
if (this.requests.length === 0) {
|
|
772
|
+
return undefined;
|
|
773
|
+
}
|
|
762
774
|
return this.sendRequests();
|
|
763
775
|
}
|
|
764
776
|
callbackBundledTransactions(requests, result, txContext) {
|
|
@@ -855,20 +867,17 @@ export class SequencerPublisher {
|
|
|
855
867
|
* @notice Will call `canProposeAt` to make sure that it is possible to propose
|
|
856
868
|
* @param tipArchive - The archive to check
|
|
857
869
|
* @returns The slot and block number if it is possible to propose, undefined otherwise
|
|
858
|
-
*/ canProposeAt(tipArchive, msgSender,
|
|
870
|
+
*/ async canProposeAt(tipArchive, msgSender, simulationOverridesPlan) {
|
|
859
871
|
// TODO: #14291 - should loop through multiple keys to check if any of them can propose
|
|
860
872
|
const ignoredErrors = [
|
|
861
873
|
'SlotAlreadyInChain',
|
|
862
874
|
'InvalidProposer',
|
|
863
875
|
'InvalidArchive'
|
|
864
876
|
];
|
|
865
|
-
const pipelined =
|
|
877
|
+
const pipelined = this.epochCache.isProposerPipeliningEnabled();
|
|
866
878
|
const slotOffset = pipelined ? this.aztecSlotDuration : 0n;
|
|
867
879
|
const nextL1SlotTs = this.getNextL1SlotTimestamp() + slotOffset;
|
|
868
|
-
return this.rollupContract.canProposeAt(tipArchive.toBuffer(), msgSender.toString(), nextL1SlotTs, {
|
|
869
|
-
forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber,
|
|
870
|
-
forceArchive: opts.forceArchive
|
|
871
|
-
}).catch((err)=>{
|
|
880
|
+
return this.rollupContract.canProposeAt(tipArchive.toBuffer(), msgSender.toString(), nextL1SlotTs, await buildSimulationOverridesStateOverride(this.rollupContract, simulationOverridesPlan)).catch((err)=>{
|
|
872
881
|
if (err instanceof FormattedViemError && ignoredErrors.find((e)=>err.message.includes(e))) {
|
|
873
882
|
this.log.warn(`Failed canProposeAtTime check with ${ignoredErrors.find((e)=>err.message.includes(e))}`, {
|
|
874
883
|
error: err.message
|
|
@@ -884,7 +893,7 @@ export class SequencerPublisher {
|
|
|
884
893
|
* @dev This is a convenience function that can be used by the sequencer to validate a "partial" header.
|
|
885
894
|
* It will throw if the block header is invalid.
|
|
886
895
|
* @param header - The block header to validate
|
|
887
|
-
*/ async validateBlockHeader(header,
|
|
896
|
+
*/ async validateBlockHeader(header, simulationOverridesPlan) {
|
|
888
897
|
const flags = {
|
|
889
898
|
ignoreDA: true,
|
|
890
899
|
ignoreSignatures: true
|
|
@@ -899,7 +908,7 @@ export class SequencerPublisher {
|
|
|
899
908
|
flags
|
|
900
909
|
];
|
|
901
910
|
const ts = this.getSimulationTimestamp(header.slotNumber);
|
|
902
|
-
const stateOverrides = await this.rollupContract
|
|
911
|
+
const stateOverrides = await buildSimulationOverridesStateOverride(this.rollupContract, simulationOverridesPlan);
|
|
903
912
|
let balance = 0n;
|
|
904
913
|
if (this.config.fishermanMode) {
|
|
905
914
|
// In fisherman mode, we can't know where the proposer is publishing from
|
|
@@ -1041,7 +1050,7 @@ export class SequencerPublisher {
|
|
|
1041
1050
|
throw new Error(`Unknown reason for invalidation`);
|
|
1042
1051
|
}
|
|
1043
1052
|
}
|
|
1044
|
-
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature,
|
|
1053
|
+
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, simulationOverridesPlan) {
|
|
1045
1054
|
const blobFields = checkpoint.toBlobFields();
|
|
1046
1055
|
const blobs = await getBlobsPerL1Block(blobFields);
|
|
1047
1056
|
const blobInput = getPrefixedEthBlobCommitments(blobs);
|
|
@@ -1058,7 +1067,7 @@ export class SequencerPublisher {
|
|
|
1058
1067
|
attestationsAndSignersSignature.toViemSignature(),
|
|
1059
1068
|
blobInput
|
|
1060
1069
|
];
|
|
1061
|
-
await this.simulateProposeTx(args,
|
|
1070
|
+
await this.simulateProposeTx(args, simulationOverridesPlan);
|
|
1062
1071
|
}
|
|
1063
1072
|
async enqueueCastSignalHelper(slotNumber, signalType, payload, base, signerAddress, signer) {
|
|
1064
1073
|
if (this.lastActions[signalType] && this.lastActions[signalType] === slotNumber) {
|
|
@@ -1209,43 +1218,6 @@ export class SequencerPublisher {
|
|
|
1209
1218
|
}
|
|
1210
1219
|
for (const action of actions){
|
|
1211
1220
|
switch(action.type){
|
|
1212
|
-
case 'vote-empire-payload':
|
|
1213
|
-
{
|
|
1214
|
-
if (this.slashingProposerContract?.type !== 'empire') {
|
|
1215
|
-
this.log.error('Cannot vote for empire payload on non-empire slashing contract');
|
|
1216
|
-
break;
|
|
1217
|
-
}
|
|
1218
|
-
this.log.debug(`Enqueuing slashing vote for payload ${action.payload} at slot ${slotNumber}`, {
|
|
1219
|
-
signerAddress
|
|
1220
|
-
});
|
|
1221
|
-
await this.enqueueCastSignalHelper(slotNumber, 'empire-slashing-signal', action.payload, this.slashingProposerContract, signerAddress, signer);
|
|
1222
|
-
break;
|
|
1223
|
-
}
|
|
1224
|
-
case 'create-empire-payload':
|
|
1225
|
-
{
|
|
1226
|
-
this.log.debug(`Enqueuing slashing create payload at slot ${slotNumber}`, {
|
|
1227
|
-
slotNumber,
|
|
1228
|
-
signerAddress
|
|
1229
|
-
});
|
|
1230
|
-
const request = this.slashFactoryContract.buildCreatePayloadRequest(action.data);
|
|
1231
|
-
await this.simulateAndEnqueueRequest('create-empire-payload', request, (receipt)=>!!this.slashFactoryContract.tryExtractSlashPayloadCreatedEvent(receipt.logs), slotNumber);
|
|
1232
|
-
break;
|
|
1233
|
-
}
|
|
1234
|
-
case 'execute-empire-payload':
|
|
1235
|
-
{
|
|
1236
|
-
this.log.debug(`Enqueuing slashing execute payload at slot ${slotNumber}`, {
|
|
1237
|
-
slotNumber,
|
|
1238
|
-
signerAddress
|
|
1239
|
-
});
|
|
1240
|
-
if (this.slashingProposerContract?.type !== 'empire') {
|
|
1241
|
-
this.log.error('Cannot execute slashing payload on non-empire slashing contract');
|
|
1242
|
-
return false;
|
|
1243
|
-
}
|
|
1244
|
-
const empireSlashingProposer = this.slashingProposerContract;
|
|
1245
|
-
const request = empireSlashingProposer.buildExecuteRoundRequest(action.round);
|
|
1246
|
-
await this.simulateAndEnqueueRequest('execute-empire-payload', request, (receipt)=>!!empireSlashingProposer.tryExtractPayloadSubmittedEvent(receipt.logs), slotNumber);
|
|
1247
|
-
break;
|
|
1248
|
-
}
|
|
1249
1221
|
case 'vote-offenses':
|
|
1250
1222
|
{
|
|
1251
1223
|
this.log.debug(`Enqueuing slashing vote for ${action.votes.length} votes at slot ${slotNumber}`, {
|
|
@@ -1254,14 +1226,13 @@ export class SequencerPublisher {
|
|
|
1254
1226
|
votesCount: action.votes.length,
|
|
1255
1227
|
signerAddress
|
|
1256
1228
|
});
|
|
1257
|
-
if (this.slashingProposerContract
|
|
1258
|
-
this.log.error('
|
|
1229
|
+
if (!this.slashingProposerContract) {
|
|
1230
|
+
this.log.error('No slashing proposer contract available');
|
|
1259
1231
|
return false;
|
|
1260
1232
|
}
|
|
1261
|
-
const tallySlashingProposer = this.slashingProposerContract;
|
|
1262
1233
|
const votes = bufferToHex(encodeSlashConsensusVotes(action.votes));
|
|
1263
|
-
const request = await
|
|
1264
|
-
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!
|
|
1234
|
+
const request = await this.slashingProposerContract.buildVoteRequestFromSigner(votes, slotNumber, signer);
|
|
1235
|
+
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!this.slashingProposerContract.tryExtractVoteCastEvent(receipt.logs), slotNumber);
|
|
1265
1236
|
break;
|
|
1266
1237
|
}
|
|
1267
1238
|
case 'execute-slash':
|
|
@@ -1271,13 +1242,12 @@ export class SequencerPublisher {
|
|
|
1271
1242
|
round: action.round,
|
|
1272
1243
|
signerAddress
|
|
1273
1244
|
});
|
|
1274
|
-
if (this.slashingProposerContract
|
|
1275
|
-
this.log.error('
|
|
1245
|
+
if (!this.slashingProposerContract) {
|
|
1246
|
+
this.log.error('No slashing proposer contract available');
|
|
1276
1247
|
return false;
|
|
1277
1248
|
}
|
|
1278
|
-
const
|
|
1279
|
-
|
|
1280
|
-
await this.simulateAndEnqueueRequest('execute-slash', request, (receipt)=>!!tallySlashingProposer.tryExtractRoundExecutedEvent(receipt.logs), slotNumber);
|
|
1249
|
+
const executeRequest = this.slashingProposerContract.buildExecuteRoundRequest(action.round, action.committees);
|
|
1250
|
+
await this.simulateAndEnqueueRequest('execute-slash', executeRequest, (receipt)=>!!this.slashingProposerContract.tryExtractRoundExecutedEvent(receipt.logs), slotNumber);
|
|
1281
1251
|
break;
|
|
1282
1252
|
}
|
|
1283
1253
|
default:
|
|
@@ -1301,26 +1271,40 @@ export class SequencerPublisher {
|
|
|
1301
1271
|
attestationsAndSignersSignature,
|
|
1302
1272
|
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
1303
1273
|
};
|
|
1274
|
+
const simulationOverridesPlan = SimulationOverridesBuilder.from(opts.simulationOverridesPlan).withoutBlobCheck().build();
|
|
1304
1275
|
try {
|
|
1305
1276
|
// @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available
|
|
1306
1277
|
// This means that we can avoid the simulation issues in later checks.
|
|
1307
1278
|
// By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
|
|
1308
1279
|
// make time consistency checks break.
|
|
1309
1280
|
// TODO(palla): Check whether we're validating twice, once here and once within addProposeTx, since we call simulateProposeTx in both places.
|
|
1310
|
-
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature,
|
|
1281
|
+
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, simulationOverridesPlan);
|
|
1311
1282
|
} catch (err) {
|
|
1312
1283
|
this.log.error(`Checkpoint validation failed. ${err instanceof Error ? err.message : 'No error message'}`, err, {
|
|
1313
1284
|
...checkpoint.getStats(),
|
|
1314
1285
|
slotNumber: checkpoint.header.slotNumber,
|
|
1315
|
-
|
|
1286
|
+
simulationOverridesPlan
|
|
1316
1287
|
});
|
|
1317
1288
|
throw err;
|
|
1318
1289
|
}
|
|
1290
|
+
// Build a pre-check callback that re-validates the checkpoint before L1 submission.
|
|
1291
|
+
// During pipelining this catches stale proposals due to prunes or L1 reorgs that occur during the pipeline sleep.
|
|
1292
|
+
let preCheck = undefined;
|
|
1293
|
+
if (this.epochCache.isProposerPipeliningEnabled()) {
|
|
1294
|
+
preCheck = async ()=>{
|
|
1295
|
+
this.log.debug(`Re-validating checkpoint ${checkpoint.number} before L1 submission`);
|
|
1296
|
+
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, simulationOverridesPlan);
|
|
1297
|
+
};
|
|
1298
|
+
}
|
|
1319
1299
|
this.log.verbose(`Enqueuing checkpoint propose transaction`, {
|
|
1320
1300
|
...checkpoint.toCheckpointInfo(),
|
|
1321
|
-
|
|
1301
|
+
txTimeoutAt: opts.txTimeoutAt,
|
|
1302
|
+
simulationOverridesPlan
|
|
1322
1303
|
});
|
|
1323
|
-
await this.addProposeTx(checkpoint, proposeTxArgs,
|
|
1304
|
+
await this.addProposeTx(checkpoint, proposeTxArgs, {
|
|
1305
|
+
txTimeoutAt: opts.txTimeoutAt,
|
|
1306
|
+
simulationOverridesPlan
|
|
1307
|
+
}, preCheck);
|
|
1324
1308
|
}
|
|
1325
1309
|
enqueueInvalidateCheckpoint(request, opts = {}) {
|
|
1326
1310
|
if (!request) {
|
|
@@ -1466,7 +1450,7 @@ export class SequencerPublisher {
|
|
|
1466
1450
|
this.interrupted = false;
|
|
1467
1451
|
this.l1TxUtils.restart();
|
|
1468
1452
|
}
|
|
1469
|
-
async prepareProposeTx(encodedData,
|
|
1453
|
+
async prepareProposeTx(encodedData, simulationOverridesPlan) {
|
|
1470
1454
|
const kzg = Blob.getViemKzgInstance();
|
|
1471
1455
|
const blobInput = getPrefixedEthBlobCommitments(encodedData.blobs);
|
|
1472
1456
|
this.log.debug('Validating blob input', {
|
|
@@ -1543,7 +1527,7 @@ export class SequencerPublisher {
|
|
|
1543
1527
|
encodedData.attestationsAndSignersSignature.toViemSignature(),
|
|
1544
1528
|
blobInput
|
|
1545
1529
|
];
|
|
1546
|
-
const { rollupData, simulationResult } = await this.simulateProposeTx(args,
|
|
1530
|
+
const { rollupData, simulationResult } = await this.simulateProposeTx(args, simulationOverridesPlan);
|
|
1547
1531
|
return {
|
|
1548
1532
|
args,
|
|
1549
1533
|
blobEvaluationGas,
|
|
@@ -1555,30 +1539,13 @@ export class SequencerPublisher {
|
|
|
1555
1539
|
* Simulates the propose tx with eth_simulateV1
|
|
1556
1540
|
* @param args - The propose tx args
|
|
1557
1541
|
* @returns The simulation result
|
|
1558
|
-
*/ async simulateProposeTx(args,
|
|
1542
|
+
*/ async simulateProposeTx(args, simulationOverridesPlan) {
|
|
1559
1543
|
const rollupData = encodeFunctionData({
|
|
1560
1544
|
abi: RollupAbi,
|
|
1561
1545
|
functionName: 'propose',
|
|
1562
1546
|
args
|
|
1563
1547
|
});
|
|
1564
|
-
|
|
1565
|
-
const forcePendingCheckpointNumberStateDiff = (options.forcePendingCheckpointNumber !== undefined ? await this.rollupContract.makePendingCheckpointNumberOverride(options.forcePendingCheckpointNumber) : []).flatMap((override)=>override.stateDiff ?? []);
|
|
1566
|
-
// override the fee header for a specific checkpoint number if requested (used when pipelining)
|
|
1567
|
-
const forceProposedFeeHeaderStateDiff = (options.forceProposedFeeHeader !== undefined ? await this.rollupContract.makeFeeHeaderOverride(options.forceProposedFeeHeader.checkpointNumber, options.forceProposedFeeHeader.feeHeader) : []).flatMap((override)=>override.stateDiff ?? []);
|
|
1568
|
-
const stateOverrides = [
|
|
1569
|
-
{
|
|
1570
|
-
address: this.rollupContract.address,
|
|
1571
|
-
// @note we override checkBlob to false since blobs are not part simulate()
|
|
1572
|
-
stateDiff: [
|
|
1573
|
-
{
|
|
1574
|
-
slot: toPaddedHex(RollupContract.checkBlobStorageSlot, true),
|
|
1575
|
-
value: toPaddedHex(0n, true)
|
|
1576
|
-
},
|
|
1577
|
-
...forcePendingCheckpointNumberStateDiff,
|
|
1578
|
-
...forceProposedFeeHeaderStateDiff
|
|
1579
|
-
]
|
|
1580
|
-
}
|
|
1581
|
-
];
|
|
1548
|
+
const stateOverrides = await buildSimulationOverridesStateOverride(this.rollupContract, simulationOverridesPlan);
|
|
1582
1549
|
// In fisherman mode, simulate as the proposer but with sufficient balance
|
|
1583
1550
|
if (this.proposerAddressForSimulation) {
|
|
1584
1551
|
stateOverrides.push({
|
|
@@ -1643,11 +1610,11 @@ export class SequencerPublisher {
|
|
|
1643
1610
|
simulationResult
|
|
1644
1611
|
};
|
|
1645
1612
|
}
|
|
1646
|
-
async addProposeTx(checkpoint, encodedData, opts = {}) {
|
|
1613
|
+
async addProposeTx(checkpoint, encodedData, opts = {}, preCheck) {
|
|
1647
1614
|
const slot = checkpoint.header.slotNumber;
|
|
1648
1615
|
const timer = new Timer();
|
|
1649
1616
|
const kzg = Blob.getViemKzgInstance();
|
|
1650
|
-
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, opts);
|
|
1617
|
+
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, opts.simulationOverridesPlan);
|
|
1651
1618
|
const startBlock = await this.l1TxUtils.getBlockNumber();
|
|
1652
1619
|
const gasLimit = this.l1TxUtils.bumpGasLimit(BigInt(Math.ceil(Number(simulationResult.gasUsed) * 64 / 63)) + blobEvaluationGas + SequencerPublisher.MULTICALL_OVERHEAD_GAS_GUESS);
|
|
1653
1620
|
// Send the blobs to the blob client preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
@@ -1663,9 +1630,10 @@ export class SequencerPublisher {
|
|
|
1663
1630
|
},
|
|
1664
1631
|
lastValidL2Slot: checkpoint.header.slotNumber,
|
|
1665
1632
|
gasConfig: {
|
|
1666
|
-
|
|
1633
|
+
txTimeoutAt: opts.txTimeoutAt,
|
|
1667
1634
|
gasLimit
|
|
1668
1635
|
},
|
|
1636
|
+
preCheck,
|
|
1669
1637
|
blobConfig: {
|
|
1670
1638
|
blobs: encodedData.blobs.map((b)=>b.data),
|
|
1671
1639
|
kzg
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { RollupContract, type SimulationOverridesPlan } from '@aztec/ethereum/contracts';
|
|
2
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
5
|
+
import type { ProposedCheckpointData } from '@aztec/stdlib/checkpoint';
|
|
6
|
+
type PipelinedParentSimulationOverridesPlanInput = {
|
|
7
|
+
checkpointNumber: CheckpointNumber;
|
|
8
|
+
proposedCheckpointData?: ProposedCheckpointData;
|
|
9
|
+
rollup: RollupContract;
|
|
10
|
+
log: Logger;
|
|
11
|
+
};
|
|
12
|
+
type SubmissionSimulationOverridesPlanInput = {
|
|
13
|
+
pipelinedParentPlan?: SimulationOverridesPlan;
|
|
14
|
+
invalidateToPendingCheckpointNumber?: CheckpointNumber;
|
|
15
|
+
lastArchiveRoot: Fr;
|
|
16
|
+
pipeliningEnabled: boolean;
|
|
17
|
+
};
|
|
18
|
+
/** Builds the simulated parent checkpoint view used while constructing a pipelined proposal. */
|
|
19
|
+
export declare function buildPipelinedParentSimulationOverridesPlan(input: PipelinedParentSimulationOverridesPlanInput): Promise<SimulationOverridesPlan | undefined>;
|
|
20
|
+
/** Builds the simulated chain view used when validating and enqueueing checkpoint submission. */
|
|
21
|
+
export declare function buildSubmissionSimulationOverridesPlan(input: SubmissionSimulationOverridesPlanInput): SimulationOverridesPlan | undefined;
|
|
22
|
+
/** Derives the pending parent fee header used during pipelined proposal simulation. */
|
|
23
|
+
export declare function computePipelinedParentFeeHeader(input: PipelinedParentSimulationOverridesPlanInput): Promise<import("@aztec/ethereum/contracts").FeeHeader | undefined>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5fc3RhdGVfb3ZlcnJpZGVzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL2NoYWluX3N0YXRlX292ZXJyaWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUE4QixLQUFLLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RSxLQUFLLDJDQUEyQyxHQUFHO0lBQ2pELGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0lBQ25DLHNCQUFzQixDQUFDLEVBQUUsc0JBQXNCLENBQUM7SUFDaEQsTUFBTSxFQUFFLGNBQWMsQ0FBQztJQUN2QixHQUFHLEVBQUUsTUFBTSxDQUFDO0NBQ2IsQ0FBQztBQUVGLEtBQUssc0NBQXNDLEdBQUc7SUFDNUMsbUJBQW1CLENBQUMsRUFBRSx1QkFBdUIsQ0FBQztJQUM5QyxtQ0FBbUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0lBQ3ZELGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDcEIsaUJBQWlCLEVBQUUsT0FBTyxDQUFDO0NBQzVCLENBQUM7QUFFRixnR0FBZ0c7QUFDaEcsd0JBQXNCLDJDQUEyQyxDQUMvRCxLQUFLLEVBQUUsMkNBQTJDLEdBQ2pELE9BQU8sQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUMsQ0FVOUM7QUFFRCxpR0FBaUc7QUFDakcsd0JBQWdCLHNDQUFzQyxDQUNwRCxLQUFLLEVBQUUsc0NBQXNDLEdBQzVDLHVCQUF1QixHQUFHLFNBQVMsQ0FhckM7QUFFRCx1RkFBdUY7QUFDdkYsd0JBQXNCLCtCQUErQixDQUFDLEtBQUssRUFBRSwyQ0FBMkMsc0VBZ0N2RyJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain_state_overrides.d.ts","sourceRoot":"","sources":["../../src/sequencer/chain_state_overrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,KAAK,2CAA2C,GAAG;IACjD,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,sCAAsC,GAAG;IAC5C,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,mCAAmC,CAAC,EAAE,gBAAgB,CAAC;IACvD,eAAe,EAAE,EAAE,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,gGAAgG;AAChG,wBAAsB,2CAA2C,CAC/D,KAAK,EAAE,2CAA2C,GACjD,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAU9C;AAED,iGAAiG;AACjG,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,sCAAsC,GAC5C,uBAAuB,GAAG,SAAS,CAarC;AAED,uFAAuF;AACvF,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,2CAA2C,sEAgCvG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { RollupContract, SimulationOverridesBuilder } from '@aztec/ethereum/contracts';
|
|
2
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
/** Builds the simulated parent checkpoint view used while constructing a pipelined proposal. */ export async function buildPipelinedParentSimulationOverridesPlan(input) {
|
|
4
|
+
const parentCheckpointNumber = CheckpointNumber(input.checkpointNumber - 1);
|
|
5
|
+
const builder = new SimulationOverridesBuilder().forPendingCheckpoint(parentCheckpointNumber);
|
|
6
|
+
const pendingFeeHeader = await computePipelinedParentFeeHeader(input);
|
|
7
|
+
if (pendingFeeHeader) {
|
|
8
|
+
builder.withPendingFeeHeader(pendingFeeHeader);
|
|
9
|
+
}
|
|
10
|
+
return builder.build();
|
|
11
|
+
}
|
|
12
|
+
/** Builds the simulated chain view used when validating and enqueueing checkpoint submission. */ export function buildSubmissionSimulationOverridesPlan(input) {
|
|
13
|
+
const pendingCheckpointNumber = input.invalidateToPendingCheckpointNumber ?? input.pipelinedParentPlan?.pendingCheckpointNumber;
|
|
14
|
+
const builder = SimulationOverridesBuilder.from(input.pipelinedParentPlan).forPendingCheckpoint(pendingCheckpointNumber);
|
|
15
|
+
if (input.pipeliningEnabled && pendingCheckpointNumber !== undefined) {
|
|
16
|
+
builder.withPendingArchive(input.lastArchiveRoot);
|
|
17
|
+
}
|
|
18
|
+
return builder.build();
|
|
19
|
+
}
|
|
20
|
+
/** Derives the pending parent fee header used during pipelined proposal simulation. */ export async function computePipelinedParentFeeHeader(input) {
|
|
21
|
+
if (!input.proposedCheckpointData || input.checkpointNumber < 2) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const grandparentCheckpointNumber = CheckpointNumber(input.checkpointNumber - 2);
|
|
25
|
+
try {
|
|
26
|
+
const [grandparentCheckpoint, manaTarget] = await Promise.all([
|
|
27
|
+
input.rollup.getCheckpoint(grandparentCheckpointNumber),
|
|
28
|
+
input.rollup.getManaTarget()
|
|
29
|
+
]);
|
|
30
|
+
if (!grandparentCheckpoint?.feeHeader) {
|
|
31
|
+
input.log.error(`Grandparent checkpoint or feeHeader missing for checkpoint ${grandparentCheckpointNumber.toString()}`);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
return RollupContract.computeChildFeeHeader(grandparentCheckpoint.feeHeader, input.proposedCheckpointData.totalManaUsed, input.proposedCheckpointData.feeAssetPriceModifier, manaTarget);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
input.log.error(`Failed to derive pipelined parent fee header for checkpoint ${grandparentCheckpointNumber.toString()}: ${err}`);
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
2
|
-
import { type FeeHeader } from '@aztec/ethereum/contracts';
|
|
3
2
|
import { BlockNumber, CheckpointNumber, EpochNumber, IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
4
|
import { type Logger, type LoggerBindings } from '@aztec/foundation/log';
|
|
@@ -16,6 +15,7 @@ import { type Traceable, type Tracer } from '@aztec/telemetry-client';
|
|
|
16
15
|
import { CheckpointBuilder, type FullNodeCheckpointsBuilder, type ValidatorClient } from '@aztec/validator-client';
|
|
17
16
|
import type { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
|
|
18
17
|
import type { InvalidateCheckpointRequest, SequencerPublisher } from '../publisher/sequencer-publisher.js';
|
|
18
|
+
import type { CheckpointProposalJobMetricsRecorder } from './checkpoint_proposal_job_metrics.js';
|
|
19
19
|
import type { SequencerEvents } from './events.js';
|
|
20
20
|
import type { SequencerMetrics } from './metrics.js';
|
|
21
21
|
import type { SequencerTimetable } from './timetable.js';
|
|
@@ -52,26 +52,41 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
52
52
|
private readonly epochCache;
|
|
53
53
|
private readonly dateProvider;
|
|
54
54
|
private readonly metrics;
|
|
55
|
-
private readonly
|
|
55
|
+
private readonly checkpointMetrics;
|
|
56
|
+
protected readonly eventEmitter: TypedEventEmitter<SequencerEvents>;
|
|
56
57
|
private readonly setStateFn;
|
|
57
58
|
readonly tracer: Tracer;
|
|
58
59
|
private readonly proposedCheckpointData?;
|
|
59
60
|
protected readonly log: Logger;
|
|
60
61
|
/** Tracks the fire-and-forget L1 submission promise so it can be awaited during shutdown. */
|
|
61
62
|
private pendingL1Submission;
|
|
62
|
-
/**
|
|
63
|
-
private
|
|
64
|
-
constructor(slotNow: SlotNumber, targetSlot: SlotNumber, targetEpoch: EpochNumber, checkpointNumber: CheckpointNumber, syncedToBlockNumber: BlockNumber, proposer: EthAddress | undefined, publisher: SequencerPublisher, attestorAddress: EthAddress, invalidateCheckpoint: InvalidateCheckpointRequest | undefined, validatorClient: ValidatorClient, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, l1ToL2MessageSource: L1ToL2MessageSource, l2BlockSource: L2BlockSource, checkpointsBuilder: FullNodeCheckpointsBuilder, blockSink: L2BlockSink, l1Constants: SequencerRollupConstants, config: ResolvedSequencerConfig, timetable: SequencerTimetable, slasherClient: SlasherClientInterface | undefined, epochCache: EpochCache, dateProvider: DateProvider, metrics: SequencerMetrics, eventEmitter: TypedEventEmitter<SequencerEvents>, setStateFn: (state: SequencerState, slot?: SlotNumber) => void, tracer: Tracer, bindings?: LoggerBindings, proposedCheckpointData?: ProposedCheckpointData | undefined);
|
|
63
|
+
/** Pipelined parent chain state used while building and later submitting this checkpoint. */
|
|
64
|
+
private pipelinedParentSimulationOverridesPlan?;
|
|
65
|
+
constructor(slotNow: SlotNumber, targetSlot: SlotNumber, targetEpoch: EpochNumber, checkpointNumber: CheckpointNumber, syncedToBlockNumber: BlockNumber, proposer: EthAddress | undefined, publisher: SequencerPublisher, attestorAddress: EthAddress, invalidateCheckpoint: InvalidateCheckpointRequest | undefined, validatorClient: ValidatorClient, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, l1ToL2MessageSource: L1ToL2MessageSource, l2BlockSource: L2BlockSource, checkpointsBuilder: FullNodeCheckpointsBuilder, blockSink: L2BlockSink, l1Constants: SequencerRollupConstants, config: ResolvedSequencerConfig, timetable: SequencerTimetable, slasherClient: SlasherClientInterface | undefined, epochCache: EpochCache, dateProvider: DateProvider, metrics: SequencerMetrics, checkpointMetrics: CheckpointProposalJobMetricsRecorder, eventEmitter: TypedEventEmitter<SequencerEvents>, setStateFn: (state: SequencerState, slot?: SlotNumber) => void, tracer: Tracer, bindings?: LoggerBindings, proposedCheckpointData?: ProposedCheckpointData | undefined);
|
|
65
66
|
/** Awaits the pending L1 submission if one is in progress. Call during shutdown. */
|
|
66
67
|
awaitPendingSubmission(): Promise<void>;
|
|
67
68
|
/**
|
|
68
69
|
* Executes the checkpoint proposal job.
|
|
69
|
-
* Builds blocks,
|
|
70
|
-
*
|
|
70
|
+
* Builds blocks, assembles checkpoint, and broadcasts the proposal (blocking).
|
|
71
|
+
* Attestation collection, signing, and L1 submission are backgrounded so the
|
|
72
|
+
* work loop can return to IDLE immediately for consecutive slot proposals.
|
|
71
73
|
* Returns the built checkpoint if successful, undefined otherwise.
|
|
72
74
|
*/
|
|
73
75
|
execute(): Promise<Checkpoint | undefined>;
|
|
76
|
+
private waitForAttestationsAndEnqueueSubmissionAsync;
|
|
74
77
|
private enqueueCheckpointForSubmission;
|
|
78
|
+
private waitForSyncedL2SlotNumber;
|
|
79
|
+
/**
|
|
80
|
+
* Waits for the parent checkpoint to land on L1 before submitting a pipelined checkpoint.
|
|
81
|
+
* Polls until the archiver has synced L1 past the parent's slot, then verifies:
|
|
82
|
+
* - If we built on a proposed parent: it must have landed on L1 with matching hash and valid attestations.
|
|
83
|
+
* - If we built without a proposed parent: no new checkpoint must have appeared for that slot.
|
|
84
|
+
* If the parent has invalid attestations, enqueues an invalidation. Returns whether to proceed with the proposal.
|
|
85
|
+
*/
|
|
86
|
+
protected waitForValidParentCheckpointOnL1(): Promise<boolean>;
|
|
87
|
+
/** Emits the pipelined-checkpoint-discarded event and records the metric. */
|
|
88
|
+
private emitPipelinedCheckpointDiscarded;
|
|
89
|
+
private enqueueInvalidation;
|
|
75
90
|
private proposeCheckpoint;
|
|
76
91
|
private buildBlocksForCheckpoint;
|
|
77
92
|
/** Creates a block proposal for a given block via the validator client (unless in fisherman mode) */
|
|
@@ -88,11 +103,14 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
88
103
|
}): Promise<{
|
|
89
104
|
block: L2Block;
|
|
90
105
|
usedTxs: Tx[];
|
|
106
|
+
} | {
|
|
107
|
+
failure: 'insufficient-txs' | 'insufficient-valid-txs';
|
|
91
108
|
} | {
|
|
92
109
|
error: Error;
|
|
93
|
-
}
|
|
110
|
+
}>;
|
|
94
111
|
private buildSingleBlockWithCheckpointBuilder;
|
|
95
112
|
private waitForMinTxs;
|
|
113
|
+
private getSignedCommitteeAttestations;
|
|
96
114
|
private waitForAttestations;
|
|
97
115
|
/** Breaks the attestations before publishing based on attack configs */
|
|
98
116
|
private manipulateAttestations;
|
|
@@ -103,19 +121,6 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
103
121
|
* Helper to handle HA double-signing errors. Returns true if the error was handled (caller should yield).
|
|
104
122
|
*/
|
|
105
123
|
private handleHASigningError;
|
|
106
|
-
/**
|
|
107
|
-
* In times of congestion we need to simulate using the correct fee header override for the previous block
|
|
108
|
-
* We calculate the correct fee header values.
|
|
109
|
-
*
|
|
110
|
-
* If we are in block 1, or the checkpoint we are querying does not exist, we return undefined. However
|
|
111
|
-
* If we are pipelining - where this function is called, the grandparentCheckpointNumber should always exist
|
|
112
|
-
* @param parentCheckpointNumber
|
|
113
|
-
* @returns
|
|
114
|
-
*/
|
|
115
|
-
protected computeForceProposedFeeHeader(parentCheckpointNumber: CheckpointNumber): Promise<{
|
|
116
|
-
checkpointNumber: CheckpointNumber;
|
|
117
|
-
feeHeader: FeeHeader;
|
|
118
|
-
} | undefined>;
|
|
119
124
|
/** Waits until a specific time within the current slot */
|
|
120
125
|
protected waitUntilTimeInSlot(targetSecondsIntoSlot: number): Promise<void>;
|
|
121
126
|
/** Waits the polling interval for transactions. Extracted for test overriding. */
|
|
@@ -124,4 +129,4 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
124
129
|
private getSecondsIntoSlot;
|
|
125
130
|
getPublisher(): SequencerPublisher;
|
|
126
131
|
}
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF9qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvY2hlY2twb2ludF9wcm9wb3NhbF9qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFckQsT0FBTyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixVQUFVLEVBQ1gsTUFBTSxpQ0FBaUMsQ0FBQztBQVF6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR3ZGLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBQ3pGLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFHTCxPQUFPLEVBQ1AsS0FBSyxXQUFXLEVBQ2hCLEtBQUssYUFBYSxFQUduQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxLQUFLLHNCQUFzQixFQUFzQixNQUFNLDBCQUEwQixDQUFDO0FBRzVHLE9BQU8sRUFHTCxLQUFLLHVCQUF1QixFQUM1QixLQUFLLHNCQUFzQixFQUM1QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFtQyxNQUFNLHlCQUF5QixDQUFDO0FBU3BHLE9BQU8sRUFBaUIsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"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"}
|