@aztec/sequencer-client 4.0.0-devnet.2-patch.3 → 4.0.0-devnet.3-patch.0
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 +38 -19
- package/dest/config.d.ts +24 -4
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +29 -16
- package/dest/global_variable_builder/global_builder.d.ts +13 -7
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +22 -21
- package/dest/global_variable_builder/index.d.ts +2 -2
- package/dest/global_variable_builder/index.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.d.ts +15 -8
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +65 -36
- package/dest/sequencer/checkpoint_proposal_job.d.ts +4 -4
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +98 -68
- 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/sequencer.d.ts +12 -7
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +15 -17
- package/dest/sequencer/timetable.d.ts +4 -3
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +6 -7
- package/dest/sequencer/types.d.ts +2 -2
- package/dest/sequencer/types.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.d.ts +7 -9
- package/dest/test/mock_checkpoint_builder.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.js +41 -30
- package/package.json +28 -28
- package/src/client/sequencer-client.ts +48 -14
- package/src/config.ts +35 -19
- package/src/global_variable_builder/global_builder.ts +22 -23
- package/src/global_variable_builder/index.ts +1 -1
- package/src/publisher/sequencer-publisher.ts +61 -44
- package/src/sequencer/checkpoint_proposal_job.ts +156 -98
- package/src/sequencer/checkpoint_voter.ts +1 -12
- package/src/sequencer/sequencer.ts +16 -18
- package/src/sequencer/timetable.ts +7 -7
- package/src/sequencer/types.ts +1 -1
- package/src/test/mock_checkpoint_builder.ts +53 -48
|
@@ -379,6 +379,7 @@ import { FormattedViemError, formatViemError, mergeAbis, tryExtractEvent } from
|
|
|
379
379
|
import { sumBigint } from '@aztec/foundation/bigint';
|
|
380
380
|
import { toHex as toPaddedHex } from '@aztec/foundation/bigint-buffer';
|
|
381
381
|
import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
382
|
+
import { trimmedBytesLength } from '@aztec/foundation/buffer';
|
|
382
383
|
import { pick } from '@aztec/foundation/collection';
|
|
383
384
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
384
385
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
@@ -389,6 +390,7 @@ import { Timer } from '@aztec/foundation/timer';
|
|
|
389
390
|
import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
390
391
|
import { encodeSlashConsensusVotes } from '@aztec/slasher';
|
|
391
392
|
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
393
|
+
import { getLastL1SlotTimestampForL2Slot, getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
392
394
|
import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
393
395
|
import { encodeFunctionData, toHex } from 'viem';
|
|
394
396
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
@@ -437,6 +439,8 @@ export class SequencerPublisher {
|
|
|
437
439
|
payloadProposedCache;
|
|
438
440
|
log;
|
|
439
441
|
ethereumSlotDuration;
|
|
442
|
+
aztecSlotDuration;
|
|
443
|
+
dateProvider;
|
|
440
444
|
blobClient;
|
|
441
445
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
|
|
442
446
|
/** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
|
|
@@ -463,6 +467,8 @@ export class SequencerPublisher {
|
|
|
463
467
|
this.requests = [];
|
|
464
468
|
this.log = deps.log ?? createLogger('sequencer:publisher');
|
|
465
469
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
470
|
+
this.aztecSlotDuration = BigInt(config.aztecSlotDuration);
|
|
471
|
+
this.dateProvider = deps.dateProvider;
|
|
466
472
|
this.epochCache = deps.epochCache;
|
|
467
473
|
this.lastActions = deps.lastActions;
|
|
468
474
|
this.blobClient = deps.blobClient;
|
|
@@ -602,8 +608,8 @@ export class SequencerPublisher {
|
|
|
602
608
|
// @note - we can only have one blob config per bundle
|
|
603
609
|
// find requests with gas and blob configs
|
|
604
610
|
// See https://github.com/AztecProtocol/aztec-packages/issues/11513
|
|
605
|
-
const gasConfigs =
|
|
606
|
-
const blobConfigs =
|
|
611
|
+
const gasConfigs = validRequests.filter((request)=>request.gasConfig).map((request)=>request.gasConfig);
|
|
612
|
+
const blobConfigs = validRequests.filter((request)=>request.blobConfig).map((request)=>request.blobConfig);
|
|
607
613
|
if (blobConfigs.length > 1) {
|
|
608
614
|
throw new Error('Multiple blob configs found');
|
|
609
615
|
}
|
|
@@ -665,7 +671,16 @@ export class SequencerPublisher {
|
|
|
665
671
|
} else {
|
|
666
672
|
this.log.verbose(`Published bundled transactions (${actionsListStr})`, {
|
|
667
673
|
result,
|
|
668
|
-
requests
|
|
674
|
+
requests: requests.map((r)=>({
|
|
675
|
+
...r,
|
|
676
|
+
// Avoid logging large blob data
|
|
677
|
+
blobConfig: r.blobConfig ? {
|
|
678
|
+
...r.blobConfig,
|
|
679
|
+
blobs: r.blobConfig.blobs.map((b)=>({
|
|
680
|
+
size: trimmedBytesLength(b)
|
|
681
|
+
}))
|
|
682
|
+
} : undefined
|
|
683
|
+
}))
|
|
669
684
|
});
|
|
670
685
|
const successfulActions = [];
|
|
671
686
|
const failedActions = [];
|
|
@@ -683,17 +698,20 @@ export class SequencerPublisher {
|
|
|
683
698
|
}
|
|
684
699
|
}
|
|
685
700
|
/**
|
|
686
|
-
* @notice Will call `
|
|
701
|
+
* @notice Will call `canProposeAt` to make sure that it is possible to propose
|
|
687
702
|
* @param tipArchive - The archive to check
|
|
688
703
|
* @returns The slot and block number if it is possible to propose, undefined otherwise
|
|
689
|
-
*/
|
|
704
|
+
*/ canProposeAt(tipArchive, msgSender, opts = {}) {
|
|
690
705
|
// TODO: #14291 - should loop through multiple keys to check if any of them can propose
|
|
691
706
|
const ignoredErrors = [
|
|
692
707
|
'SlotAlreadyInChain',
|
|
693
708
|
'InvalidProposer',
|
|
694
709
|
'InvalidArchive'
|
|
695
710
|
];
|
|
696
|
-
|
|
711
|
+
const pipelined = opts.pipelined ?? false;
|
|
712
|
+
const slotOffset = pipelined ? this.aztecSlotDuration : 0n;
|
|
713
|
+
const nextL1SlotTs = this.getNextL1SlotTimestamp() + slotOffset;
|
|
714
|
+
return this.rollupContract.canProposeAt(tipArchive.toBuffer(), msgSender.toString(), nextL1SlotTs, {
|
|
697
715
|
forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber
|
|
698
716
|
}).catch((err)=>{
|
|
699
717
|
if (err instanceof FormattedViemError && ignoredErrors.find((e)=>err.message.includes(e))) {
|
|
@@ -725,7 +743,7 @@ export class SequencerPublisher {
|
|
|
725
743
|
header.blobsHash.toString(),
|
|
726
744
|
flags
|
|
727
745
|
];
|
|
728
|
-
const ts =
|
|
746
|
+
const ts = this.getSimulationTimestamp(header.slotNumber);
|
|
729
747
|
const stateOverrides = await this.rollupContract.makePendingCheckpointNumberOverride(opts?.forcePendingCheckpointNumber);
|
|
730
748
|
let balance = 0n;
|
|
731
749
|
if (this.config.fishermanMode) {
|
|
@@ -748,7 +766,7 @@ export class SequencerPublisher {
|
|
|
748
766
|
}),
|
|
749
767
|
from: MULTI_CALL_3_ADDRESS
|
|
750
768
|
}, {
|
|
751
|
-
time: ts
|
|
769
|
+
time: ts
|
|
752
770
|
}, stateOverrides);
|
|
753
771
|
this.log.debug(`Simulated validateHeader`);
|
|
754
772
|
}
|
|
@@ -846,7 +864,6 @@ export class SequencerPublisher {
|
|
|
846
864
|
}
|
|
847
865
|
}
|
|
848
866
|
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, options) {
|
|
849
|
-
const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
850
867
|
const blobFields = checkpoint.toBlobFields();
|
|
851
868
|
const blobs = await getBlobsPerL1Block(blobFields);
|
|
852
869
|
const blobInput = getPrefixedEthBlobCommitments(blobs);
|
|
@@ -863,10 +880,9 @@ export class SequencerPublisher {
|
|
|
863
880
|
attestationsAndSignersSignature.toViemSignature(),
|
|
864
881
|
blobInput
|
|
865
882
|
];
|
|
866
|
-
await this.simulateProposeTx(args,
|
|
867
|
-
return ts;
|
|
883
|
+
await this.simulateProposeTx(args, options);
|
|
868
884
|
}
|
|
869
|
-
async enqueueCastSignalHelper(slotNumber,
|
|
885
|
+
async enqueueCastSignalHelper(slotNumber, signalType, payload, base, signerAddress, signer) {
|
|
870
886
|
if (this.lastActions[signalType] && this.lastActions[signalType] === slotNumber) {
|
|
871
887
|
this.log.debug(`Skipping duplicate vote cast signal ${signalType} for slot ${slotNumber}`);
|
|
872
888
|
return false;
|
|
@@ -922,6 +938,7 @@ export class SequencerPublisher {
|
|
|
922
938
|
signer: this.l1TxUtils.client.account?.address,
|
|
923
939
|
lastValidL2Slot: slotNumber
|
|
924
940
|
});
|
|
941
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
925
942
|
try {
|
|
926
943
|
await this.l1TxUtils.simulate(request, {
|
|
927
944
|
time: timestamp
|
|
@@ -933,7 +950,10 @@ export class SequencerPublisher {
|
|
|
933
950
|
request
|
|
934
951
|
});
|
|
935
952
|
} catch (err) {
|
|
936
|
-
|
|
953
|
+
const viemError = formatViemError(err);
|
|
954
|
+
this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError, {
|
|
955
|
+
simulationTimestamp: timestamp
|
|
956
|
+
});
|
|
937
957
|
// Yes, we enqueue the request anyway, in case there was a bug with the simulation itself
|
|
938
958
|
}
|
|
939
959
|
// TODO(palla/slash): All votes (governance and slashing) should txTimeoutAt at the end of the slot.
|
|
@@ -977,12 +997,11 @@ export class SequencerPublisher {
|
|
|
977
997
|
/**
|
|
978
998
|
* Enqueues a governance castSignal transaction to cast a signal for a given slot number.
|
|
979
999
|
* @param slotNumber - The slot number to cast a signal for.
|
|
980
|
-
* @param timestamp - The timestamp of the slot to cast a signal for.
|
|
981
1000
|
* @returns True if the signal was successfully enqueued, false otherwise.
|
|
982
|
-
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber,
|
|
983
|
-
return this.enqueueCastSignalHelper(slotNumber,
|
|
1001
|
+
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber, signerAddress, signer) {
|
|
1002
|
+
return this.enqueueCastSignalHelper(slotNumber, 'governance-signal', governancePayload, this.govProposerContract, signerAddress, signer);
|
|
984
1003
|
}
|
|
985
|
-
/** Enqueues all slashing actions as returned by the slasher client. */ async enqueueSlashingActions(actions, slotNumber,
|
|
1004
|
+
/** Enqueues all slashing actions as returned by the slasher client. */ async enqueueSlashingActions(actions, slotNumber, signerAddress, signer) {
|
|
986
1005
|
if (actions.length === 0) {
|
|
987
1006
|
this.log.debug(`No slashing actions to enqueue for slot ${slotNumber}`);
|
|
988
1007
|
return false;
|
|
@@ -998,7 +1017,7 @@ export class SequencerPublisher {
|
|
|
998
1017
|
this.log.debug(`Enqueuing slashing vote for payload ${action.payload} at slot ${slotNumber}`, {
|
|
999
1018
|
signerAddress
|
|
1000
1019
|
});
|
|
1001
|
-
await this.enqueueCastSignalHelper(slotNumber,
|
|
1020
|
+
await this.enqueueCastSignalHelper(slotNumber, 'empire-slashing-signal', action.payload, this.slashingProposerContract, signerAddress, signer);
|
|
1002
1021
|
break;
|
|
1003
1022
|
}
|
|
1004
1023
|
case 'create-empire-payload':
|
|
@@ -1008,7 +1027,7 @@ export class SequencerPublisher {
|
|
|
1008
1027
|
signerAddress
|
|
1009
1028
|
});
|
|
1010
1029
|
const request = this.slashFactoryContract.buildCreatePayloadRequest(action.data);
|
|
1011
|
-
await this.simulateAndEnqueueRequest('create-empire-payload', request, (receipt)=>!!this.slashFactoryContract.tryExtractSlashPayloadCreatedEvent(receipt.logs), slotNumber
|
|
1030
|
+
await this.simulateAndEnqueueRequest('create-empire-payload', request, (receipt)=>!!this.slashFactoryContract.tryExtractSlashPayloadCreatedEvent(receipt.logs), slotNumber);
|
|
1012
1031
|
break;
|
|
1013
1032
|
}
|
|
1014
1033
|
case 'execute-empire-payload':
|
|
@@ -1023,7 +1042,7 @@ export class SequencerPublisher {
|
|
|
1023
1042
|
}
|
|
1024
1043
|
const empireSlashingProposer = this.slashingProposerContract;
|
|
1025
1044
|
const request = empireSlashingProposer.buildExecuteRoundRequest(action.round);
|
|
1026
|
-
await this.simulateAndEnqueueRequest('execute-empire-payload', request, (receipt)=>!!empireSlashingProposer.tryExtractPayloadSubmittedEvent(receipt.logs), slotNumber
|
|
1045
|
+
await this.simulateAndEnqueueRequest('execute-empire-payload', request, (receipt)=>!!empireSlashingProposer.tryExtractPayloadSubmittedEvent(receipt.logs), slotNumber);
|
|
1027
1046
|
break;
|
|
1028
1047
|
}
|
|
1029
1048
|
case 'vote-offenses':
|
|
@@ -1041,7 +1060,7 @@ export class SequencerPublisher {
|
|
|
1041
1060
|
const tallySlashingProposer = this.slashingProposerContract;
|
|
1042
1061
|
const votes = bufferToHex(encodeSlashConsensusVotes(action.votes));
|
|
1043
1062
|
const request = await tallySlashingProposer.buildVoteRequestFromSigner(votes, slotNumber, signer);
|
|
1044
|
-
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!tallySlashingProposer.tryExtractVoteCastEvent(receipt.logs), slotNumber
|
|
1063
|
+
await this.simulateAndEnqueueRequest('vote-offenses', request, (receipt)=>!!tallySlashingProposer.tryExtractVoteCastEvent(receipt.logs), slotNumber);
|
|
1045
1064
|
break;
|
|
1046
1065
|
}
|
|
1047
1066
|
case 'execute-slash':
|
|
@@ -1057,7 +1076,7 @@ export class SequencerPublisher {
|
|
|
1057
1076
|
}
|
|
1058
1077
|
const tallySlashingProposer = this.slashingProposerContract;
|
|
1059
1078
|
const request = tallySlashingProposer.buildExecuteRoundRequest(action.round, action.committees);
|
|
1060
|
-
await this.simulateAndEnqueueRequest('execute-slash', request, (receipt)=>!!tallySlashingProposer.tryExtractRoundExecutedEvent(receipt.logs), slotNumber
|
|
1079
|
+
await this.simulateAndEnqueueRequest('execute-slash', request, (receipt)=>!!tallySlashingProposer.tryExtractRoundExecutedEvent(receipt.logs), slotNumber);
|
|
1061
1080
|
break;
|
|
1062
1081
|
}
|
|
1063
1082
|
default:
|
|
@@ -1081,14 +1100,13 @@ export class SequencerPublisher {
|
|
|
1081
1100
|
attestationsAndSignersSignature,
|
|
1082
1101
|
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
1083
1102
|
};
|
|
1084
|
-
let ts;
|
|
1085
1103
|
try {
|
|
1086
1104
|
// @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available
|
|
1087
1105
|
// This means that we can avoid the simulation issues in later checks.
|
|
1088
1106
|
// By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
|
|
1089
1107
|
// make time consistency checks break.
|
|
1090
1108
|
// TODO(palla): Check whether we're validating twice, once here and once within addProposeTx, since we call simulateProposeTx in both places.
|
|
1091
|
-
|
|
1109
|
+
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts);
|
|
1092
1110
|
} catch (err) {
|
|
1093
1111
|
this.log.error(`Checkpoint validation failed. ${err instanceof Error ? err.message : 'No error message'}`, err, {
|
|
1094
1112
|
...checkpoint.getStats(),
|
|
@@ -1101,7 +1119,7 @@ export class SequencerPublisher {
|
|
|
1101
1119
|
...checkpoint.toCheckpointInfo(),
|
|
1102
1120
|
...opts
|
|
1103
1121
|
});
|
|
1104
|
-
await this.addProposeTx(checkpoint, proposeTxArgs, opts
|
|
1122
|
+
await this.addProposeTx(checkpoint, proposeTxArgs, opts);
|
|
1105
1123
|
}
|
|
1106
1124
|
enqueueInvalidateCheckpoint(request, opts = {}) {
|
|
1107
1125
|
if (!request) {
|
|
@@ -1142,7 +1160,8 @@ export class SequencerPublisher {
|
|
|
1142
1160
|
}
|
|
1143
1161
|
});
|
|
1144
1162
|
}
|
|
1145
|
-
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber
|
|
1163
|
+
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber) {
|
|
1164
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
1146
1165
|
const logData = {
|
|
1147
1166
|
slotNumber,
|
|
1148
1167
|
timestamp,
|
|
@@ -1163,7 +1182,7 @@ export class SequencerPublisher {
|
|
|
1163
1182
|
try {
|
|
1164
1183
|
({ gasUsed } = await this.l1TxUtils.simulate(request, {
|
|
1165
1184
|
time: timestamp
|
|
1166
|
-
}, [], simulateAbi));
|
|
1185
|
+
}, [], simulateAbi));
|
|
1167
1186
|
this.log.verbose(`Simulation for ${action} succeeded`, {
|
|
1168
1187
|
...logData,
|
|
1169
1188
|
request,
|
|
@@ -1223,7 +1242,7 @@ export class SequencerPublisher {
|
|
|
1223
1242
|
this.interrupted = false;
|
|
1224
1243
|
this.l1TxUtils.restart();
|
|
1225
1244
|
}
|
|
1226
|
-
async prepareProposeTx(encodedData,
|
|
1245
|
+
async prepareProposeTx(encodedData, options) {
|
|
1227
1246
|
const kzg = Blob.getViemKzgInstance();
|
|
1228
1247
|
const blobInput = getPrefixedEthBlobCommitments(encodedData.blobs);
|
|
1229
1248
|
this.log.debug('Validating blob input', {
|
|
@@ -1272,7 +1291,7 @@ export class SequencerPublisher {
|
|
|
1272
1291
|
encodedData.attestationsAndSignersSignature.toViemSignature(),
|
|
1273
1292
|
blobInput
|
|
1274
1293
|
];
|
|
1275
|
-
const { rollupData, simulationResult } = await this.simulateProposeTx(args,
|
|
1294
|
+
const { rollupData, simulationResult } = await this.simulateProposeTx(args, options);
|
|
1276
1295
|
return {
|
|
1277
1296
|
args,
|
|
1278
1297
|
blobEvaluationGas,
|
|
@@ -1283,9 +1302,8 @@ export class SequencerPublisher {
|
|
|
1283
1302
|
/**
|
|
1284
1303
|
* Simulates the propose tx with eth_simulateV1
|
|
1285
1304
|
* @param args - The propose tx args
|
|
1286
|
-
* @param timestamp - The timestamp to simulate proposal at
|
|
1287
1305
|
* @returns The simulation result
|
|
1288
|
-
*/ async simulateProposeTx(args,
|
|
1306
|
+
*/ async simulateProposeTx(args, options) {
|
|
1289
1307
|
const rollupData = encodeFunctionData({
|
|
1290
1308
|
abi: RollupAbi,
|
|
1291
1309
|
functionName: 'propose',
|
|
@@ -1313,6 +1331,7 @@ export class SequencerPublisher {
|
|
|
1313
1331
|
balance: 10n * WEI_CONST * WEI_CONST
|
|
1314
1332
|
});
|
|
1315
1333
|
}
|
|
1334
|
+
const simTs = this.getSimulationTimestamp(SlotNumber.fromBigInt(args[0].header.slotNumber));
|
|
1316
1335
|
const simulationResult = await this.l1TxUtils.simulate({
|
|
1317
1336
|
to: this.rollupContract.address,
|
|
1318
1337
|
data: rollupData,
|
|
@@ -1321,8 +1340,7 @@ export class SequencerPublisher {
|
|
|
1321
1340
|
from: this.proposerAddressForSimulation.toString()
|
|
1322
1341
|
}
|
|
1323
1342
|
}, {
|
|
1324
|
-
|
|
1325
|
-
time: timestamp + 1n,
|
|
1343
|
+
time: simTs,
|
|
1326
1344
|
// @note reth should have a 30m gas limit per block but throws errors that this tx is beyond limit so we increase here
|
|
1327
1345
|
gasLimit: MAX_L1_TX_LIMIT * 2n
|
|
1328
1346
|
}, stateOverrides, RollupAbi, {
|
|
@@ -1339,7 +1357,9 @@ export class SequencerPublisher {
|
|
|
1339
1357
|
logs: []
|
|
1340
1358
|
};
|
|
1341
1359
|
}
|
|
1342
|
-
this.log.error(`Failed to simulate propose tx`, viemError
|
|
1360
|
+
this.log.error(`Failed to simulate propose tx`, viemError, {
|
|
1361
|
+
simulationTimestamp: simTs
|
|
1362
|
+
});
|
|
1343
1363
|
throw err;
|
|
1344
1364
|
});
|
|
1345
1365
|
return {
|
|
@@ -1347,11 +1367,11 @@ export class SequencerPublisher {
|
|
|
1347
1367
|
simulationResult
|
|
1348
1368
|
};
|
|
1349
1369
|
}
|
|
1350
|
-
async addProposeTx(checkpoint, encodedData, opts = {}
|
|
1370
|
+
async addProposeTx(checkpoint, encodedData, opts = {}) {
|
|
1351
1371
|
const slot = checkpoint.header.slotNumber;
|
|
1352
1372
|
const timer = new Timer();
|
|
1353
1373
|
const kzg = Blob.getViemKzgInstance();
|
|
1354
|
-
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData,
|
|
1374
|
+
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, opts);
|
|
1355
1375
|
const startBlock = await this.l1TxUtils.getBlockNumber();
|
|
1356
1376
|
const gasLimit = this.l1TxUtils.bumpGasLimit(BigInt(Math.ceil(Number(simulationResult.gasUsed) * 64 / 63)) + blobEvaluationGas + SequencerPublisher.MULTICALL_OVERHEAD_GAS_GUESS);
|
|
1357
1377
|
// Send the blobs to the blob client preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
@@ -1416,4 +1436,13 @@ export class SequencerPublisher {
|
|
|
1416
1436
|
}
|
|
1417
1437
|
});
|
|
1418
1438
|
}
|
|
1439
|
+
/** Returns the timestamp of the last L1 slot within a given L2 slot. Used as the simulation timestamp
|
|
1440
|
+
* for eth_simulateV1 calls, since it's guaranteed to be greater than any L1 block produced during the slot. */ getSimulationTimestamp(slot) {
|
|
1441
|
+
const l1Constants = this.epochCache.getL1Constants();
|
|
1442
|
+
return getLastL1SlotTimestampForL2Slot(slot, l1Constants);
|
|
1443
|
+
}
|
|
1444
|
+
/** Returns the timestamp of the next L1 slot boundary after now. */ getNextL1SlotTimestamp() {
|
|
1445
|
+
const l1Constants = this.epochCache.getL1Constants();
|
|
1446
|
+
return getNextL1SlotTimestamp(this.dateProvider.nowInSeconds(), l1Constants);
|
|
1447
|
+
}
|
|
1419
1448
|
}
|
|
@@ -7,7 +7,7 @@ import { type TypedEventEmitter } from '@aztec/foundation/types';
|
|
|
7
7
|
import type { P2P } from '@aztec/p2p';
|
|
8
8
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
9
9
|
import { L2Block, type L2BlockSink, type L2BlockSource } from '@aztec/stdlib/block';
|
|
10
|
-
import type
|
|
10
|
+
import { type Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
11
11
|
import { type ResolvedSequencerConfig, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
12
12
|
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
13
13
|
import { Tx } from '@aztec/stdlib/tx';
|
|
@@ -62,6 +62,8 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
62
62
|
execute(): Promise<Checkpoint | undefined>;
|
|
63
63
|
private proposeCheckpoint;
|
|
64
64
|
private buildBlocksForCheckpoint;
|
|
65
|
+
/** Creates a block proposal for a given block via the validator client (unless in fisherman mode) */
|
|
66
|
+
private createBlockProposal;
|
|
65
67
|
private waitUntilNextSubslot;
|
|
66
68
|
/** Builds a single block. Called from the main block building loop. */
|
|
67
69
|
protected buildSingleBlock(checkpointBuilder: CheckpointBuilder, opts: {
|
|
@@ -71,11 +73,9 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
71
73
|
indexWithinCheckpoint: IndexWithinCheckpoint;
|
|
72
74
|
buildDeadline: Date | undefined;
|
|
73
75
|
txHashesAlreadyIncluded: Set<string>;
|
|
74
|
-
remainingBlobFields: number;
|
|
75
76
|
}): Promise<{
|
|
76
77
|
block: L2Block;
|
|
77
78
|
usedTxs: Tx[];
|
|
78
|
-
remainingBlobFields: number;
|
|
79
79
|
} | {
|
|
80
80
|
error: Error;
|
|
81
81
|
} | undefined>;
|
|
@@ -99,4 +99,4 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
99
99
|
private getSecondsIntoSlot;
|
|
100
100
|
getPublisher(): SequencerPublisher;
|
|
101
101
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF9qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvY2hlY2twb2ludF9wcm9wb3NhbF9qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixVQUFVLEVBQ1gsTUFBTSxpQ0FBaUMsQ0FBQztBQVF6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBQ3pGLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFHTCxPQUFPLEVBQ1AsS0FBSyxXQUFXLEVBQ2hCLEtBQUssYUFBYSxFQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBc0IsTUFBTSwwQkFBMEIsQ0FBQztBQUcvRSxPQUFPLEVBR0wsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxzQkFBc0IsRUFDNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBbUMsTUFBTSx5QkFBeUIsQ0FBQztBQVNwRyxPQUFPLEVBQWlCLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJELE9BQU8sRUFBYyxLQUFLLFNB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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":"
|
|
1
|
+
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"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"}
|