@aztec/sequencer-client 0.0.1-commit.8afd444 → 0.0.1-commit.8c0b8ff
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 +16 -7
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +56 -23
- package/dest/config.d.ts +25 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +46 -28
- package/dest/global_variable_builder/global_builder.d.ts +14 -10
- 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/config.d.ts +31 -17
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +101 -42
- package/dest/publisher/sequencer-publisher-factory.d.ts +11 -3
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +13 -2
- package/dest/publisher/sequencer-publisher.d.ts +29 -13
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +106 -57
- package/dest/sequencer/checkpoint_proposal_job.d.ts +6 -4
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +139 -80
- 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/metrics.d.ts +17 -5
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +86 -15
- package/dest/sequencer/sequencer.d.ts +27 -13
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +42 -42
- package/dest/sequencer/timetable.d.ts +4 -6
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +7 -11
- package/dest/sequencer/types.d.ts +2 -2
- package/dest/sequencer/types.d.ts.map +1 -1
- package/dest/test/index.d.ts +3 -5
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.d.ts +11 -11
- package/dest/test/mock_checkpoint_builder.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.js +47 -34
- package/dest/test/utils.d.ts +3 -3
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +5 -4
- package/package.json +28 -28
- package/src/client/sequencer-client.ts +78 -21
- package/src/config.ts +61 -38
- package/src/global_variable_builder/global_builder.ts +23 -24
- package/src/global_variable_builder/index.ts +1 -1
- package/src/publisher/config.ts +112 -43
- package/src/publisher/sequencer-publisher-factory.ts +23 -6
- package/src/publisher/sequencer-publisher.ts +123 -71
- package/src/sequencer/checkpoint_proposal_job.ts +213 -109
- package/src/sequencer/checkpoint_voter.ts +1 -12
- package/src/sequencer/metrics.ts +92 -18
- package/src/sequencer/sequencer.ts +53 -48
- package/src/sequencer/timetable.ts +13 -12
- package/src/sequencer/types.ts +1 -1
- package/src/test/index.ts +2 -4
- package/src/test/mock_checkpoint_builder.ts +65 -49
- package/src/test/utils.ts +5 -2
|
@@ -372,22 +372,25 @@ 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 { MULTI_CALL_3_ADDRESS, Multicall3, RollupContract } from '@aztec/ethereum/contracts';
|
|
375
|
+
import { FeeAssetPriceOracle, MULTI_CALL_3_ADDRESS, Multicall3, RollupContract } 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
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';
|
|
385
386
|
import { createLogger } from '@aztec/foundation/log';
|
|
387
|
+
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
386
388
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
387
389
|
import { Timer } from '@aztec/foundation/timer';
|
|
388
390
|
import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
389
391
|
import { encodeSlashConsensusVotes } from '@aztec/slasher';
|
|
390
392
|
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
393
|
+
import { getLastL1SlotTimestampForL2Slot, getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
391
394
|
import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
392
395
|
import { encodeFunctionData, toHex } from 'viem';
|
|
393
396
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
@@ -433,11 +436,15 @@ export class SequencerPublisher {
|
|
|
433
436
|
slashingLog;
|
|
434
437
|
lastActions;
|
|
435
438
|
isPayloadEmptyCache;
|
|
439
|
+
payloadProposedCache;
|
|
436
440
|
log;
|
|
437
441
|
ethereumSlotDuration;
|
|
442
|
+
aztecSlotDuration;
|
|
443
|
+
dateProvider;
|
|
438
444
|
blobClient;
|
|
439
445
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
|
|
440
446
|
/** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
|
|
447
|
+
/** Fee asset price oracle for computing price modifiers from Uniswap V4 */ feeAssetPriceOracle;
|
|
441
448
|
// A CALL to a cold address is 2700 gas
|
|
442
449
|
static MULTICALL_OVERHEAD_GAS_GUESS = 5000n;
|
|
443
450
|
// Gas report for VotingWithSigTest shows a max gas of 100k, but we've seen it cost 700k+ in testnet
|
|
@@ -456,9 +463,12 @@ export class SequencerPublisher {
|
|
|
456
463
|
this.slashingLog = createLogger('sequencer:publisher:slashing');
|
|
457
464
|
this.lastActions = {};
|
|
458
465
|
this.isPayloadEmptyCache = new Map();
|
|
466
|
+
this.payloadProposedCache = new Set();
|
|
459
467
|
this.requests = [];
|
|
460
468
|
this.log = deps.log ?? createLogger('sequencer:publisher');
|
|
461
469
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
470
|
+
this.aztecSlotDuration = BigInt(config.aztecSlotDuration);
|
|
471
|
+
this.dateProvider = deps.dateProvider;
|
|
462
472
|
this.epochCache = deps.epochCache;
|
|
463
473
|
this.lastActions = deps.lastActions;
|
|
464
474
|
this.blobClient = deps.blobClient;
|
|
@@ -479,10 +489,18 @@ export class SequencerPublisher {
|
|
|
479
489
|
if (config.fishermanMode) {
|
|
480
490
|
this.l1FeeAnalyzer = new L1FeeAnalyzer(this.l1TxUtils.client, deps.dateProvider, createLogger('sequencer:publisher:fee-analyzer'));
|
|
481
491
|
}
|
|
492
|
+
// Initialize fee asset price oracle
|
|
493
|
+
this.feeAssetPriceOracle = new FeeAssetPriceOracle(this.l1TxUtils.client, this.rollupContract, createLogger('sequencer:publisher:price-oracle'));
|
|
482
494
|
}
|
|
483
495
|
getRollupContract() {
|
|
484
496
|
return this.rollupContract;
|
|
485
497
|
}
|
|
498
|
+
/**
|
|
499
|
+
* Gets the fee asset price modifier from the oracle.
|
|
500
|
+
* Returns 0n if the oracle query fails.
|
|
501
|
+
*/ getFeeAssetPriceModifier() {
|
|
502
|
+
return this.feeAssetPriceOracle.computePriceModifier();
|
|
503
|
+
}
|
|
486
504
|
getSenderAddress() {
|
|
487
505
|
return this.l1TxUtils.getSenderAddress();
|
|
488
506
|
}
|
|
@@ -590,8 +608,8 @@ export class SequencerPublisher {
|
|
|
590
608
|
// @note - we can only have one blob config per bundle
|
|
591
609
|
// find requests with gas and blob configs
|
|
592
610
|
// See https://github.com/AztecProtocol/aztec-packages/issues/11513
|
|
593
|
-
const gasConfigs =
|
|
594
|
-
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);
|
|
595
613
|
if (blobConfigs.length > 1) {
|
|
596
614
|
throw new Error('Multiple blob configs found');
|
|
597
615
|
}
|
|
@@ -653,7 +671,16 @@ export class SequencerPublisher {
|
|
|
653
671
|
} else {
|
|
654
672
|
this.log.verbose(`Published bundled transactions (${actionsListStr})`, {
|
|
655
673
|
result,
|
|
656
|
-
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
|
+
}))
|
|
657
684
|
});
|
|
658
685
|
const successfulActions = [];
|
|
659
686
|
const failedActions = [];
|
|
@@ -671,17 +698,20 @@ export class SequencerPublisher {
|
|
|
671
698
|
}
|
|
672
699
|
}
|
|
673
700
|
/**
|
|
674
|
-
* @notice Will call `
|
|
701
|
+
* @notice Will call `canProposeAt` to make sure that it is possible to propose
|
|
675
702
|
* @param tipArchive - The archive to check
|
|
676
703
|
* @returns The slot and block number if it is possible to propose, undefined otherwise
|
|
677
|
-
*/
|
|
704
|
+
*/ canProposeAt(tipArchive, msgSender, opts = {}) {
|
|
678
705
|
// TODO: #14291 - should loop through multiple keys to check if any of them can propose
|
|
679
706
|
const ignoredErrors = [
|
|
680
707
|
'SlotAlreadyInChain',
|
|
681
708
|
'InvalidProposer',
|
|
682
709
|
'InvalidArchive'
|
|
683
710
|
];
|
|
684
|
-
|
|
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, {
|
|
685
715
|
forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber
|
|
686
716
|
}).catch((err)=>{
|
|
687
717
|
if (err instanceof FormattedViemError && ignoredErrors.find((e)=>err.message.includes(e))) {
|
|
@@ -713,7 +743,7 @@ export class SequencerPublisher {
|
|
|
713
743
|
header.blobsHash.toString(),
|
|
714
744
|
flags
|
|
715
745
|
];
|
|
716
|
-
const ts =
|
|
746
|
+
const ts = this.getSimulationTimestamp(header.slotNumber);
|
|
717
747
|
const stateOverrides = await this.rollupContract.makePendingCheckpointNumberOverride(opts?.forcePendingCheckpointNumber);
|
|
718
748
|
let balance = 0n;
|
|
719
749
|
if (this.config.fishermanMode) {
|
|
@@ -736,7 +766,7 @@ export class SequencerPublisher {
|
|
|
736
766
|
}),
|
|
737
767
|
from: MULTI_CALL_3_ADDRESS
|
|
738
768
|
}, {
|
|
739
|
-
time: ts
|
|
769
|
+
time: ts
|
|
740
770
|
}, stateOverrides);
|
|
741
771
|
this.log.debug(`Simulated validateHeader`);
|
|
742
772
|
}
|
|
@@ -834,30 +864,15 @@ export class SequencerPublisher {
|
|
|
834
864
|
}
|
|
835
865
|
}
|
|
836
866
|
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, options) {
|
|
837
|
-
const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
838
|
-
// TODO(palla/mbps): This should not be needed, there's no flow where we propose with zero attestations. Or is there?
|
|
839
|
-
// If we have no attestations, we still need to provide the empty attestations
|
|
840
|
-
// so that the committee is recalculated correctly
|
|
841
|
-
// const ignoreSignatures = attestationsAndSigners.attestations.length === 0;
|
|
842
|
-
// if (ignoreSignatures) {
|
|
843
|
-
// const { committee } = await this.epochCache.getCommittee(block.header.globalVariables.slotNumber);
|
|
844
|
-
// if (!committee) {
|
|
845
|
-
// this.log.warn(`No committee found for slot ${block.header.globalVariables.slotNumber}`);
|
|
846
|
-
// throw new Error(`No committee found for slot ${block.header.globalVariables.slotNumber}`);
|
|
847
|
-
// }
|
|
848
|
-
// attestationsAndSigners.attestations = committee.map(committeeMember =>
|
|
849
|
-
// CommitteeAttestation.fromAddress(committeeMember),
|
|
850
|
-
// );
|
|
851
|
-
// }
|
|
852
867
|
const blobFields = checkpoint.toBlobFields();
|
|
853
|
-
const blobs = getBlobsPerL1Block(blobFields);
|
|
868
|
+
const blobs = await getBlobsPerL1Block(blobFields);
|
|
854
869
|
const blobInput = getPrefixedEthBlobCommitments(blobs);
|
|
855
870
|
const args = [
|
|
856
871
|
{
|
|
857
872
|
header: checkpoint.header.toViem(),
|
|
858
873
|
archive: toHex(checkpoint.archive.root.toBuffer()),
|
|
859
874
|
oracleInput: {
|
|
860
|
-
feeAssetPriceModifier:
|
|
875
|
+
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
861
876
|
}
|
|
862
877
|
},
|
|
863
878
|
attestationsAndSigners.getPackedAttestations(),
|
|
@@ -865,10 +880,9 @@ export class SequencerPublisher {
|
|
|
865
880
|
attestationsAndSignersSignature.toViemSignature(),
|
|
866
881
|
blobInput
|
|
867
882
|
];
|
|
868
|
-
await this.simulateProposeTx(args,
|
|
869
|
-
return ts;
|
|
883
|
+
await this.simulateProposeTx(args, options);
|
|
870
884
|
}
|
|
871
|
-
async enqueueCastSignalHelper(slotNumber,
|
|
885
|
+
async enqueueCastSignalHelper(slotNumber, signalType, payload, base, signerAddress, signer) {
|
|
872
886
|
if (this.lastActions[signalType] && this.lastActions[signalType] === slotNumber) {
|
|
873
887
|
this.log.debug(`Skipping duplicate vote cast signal ${signalType} for slot ${slotNumber}`);
|
|
874
888
|
return false;
|
|
@@ -892,6 +906,28 @@ export class SequencerPublisher {
|
|
|
892
906
|
this.log.warn(`Skipping vote cast for payload with empty code`);
|
|
893
907
|
return false;
|
|
894
908
|
}
|
|
909
|
+
// Check if payload was already submitted to governance
|
|
910
|
+
const cacheKey = payload.toString();
|
|
911
|
+
if (!this.payloadProposedCache.has(cacheKey)) {
|
|
912
|
+
try {
|
|
913
|
+
const l1StartBlock = await this.rollupContract.getL1StartBlock();
|
|
914
|
+
const proposed = await retry(()=>base.hasPayloadBeenProposed(payload.toString(), l1StartBlock), 'Check if payload was proposed', makeBackoff([
|
|
915
|
+
0,
|
|
916
|
+
1,
|
|
917
|
+
2
|
|
918
|
+
]), this.log, true);
|
|
919
|
+
if (proposed) {
|
|
920
|
+
this.payloadProposedCache.add(cacheKey);
|
|
921
|
+
}
|
|
922
|
+
} catch (err) {
|
|
923
|
+
this.log.warn(`Failed to check if payload ${payload} was proposed after retries, skipping signal`, err);
|
|
924
|
+
return false;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
if (this.payloadProposedCache.has(cacheKey)) {
|
|
928
|
+
this.log.info(`Payload ${payload} was already proposed to governance, stopping signals`);
|
|
929
|
+
return false;
|
|
930
|
+
}
|
|
895
931
|
const cachedLastVote = this.lastActions[signalType];
|
|
896
932
|
this.lastActions[signalType] = slotNumber;
|
|
897
933
|
const action = signalType;
|
|
@@ -902,6 +938,7 @@ export class SequencerPublisher {
|
|
|
902
938
|
signer: this.l1TxUtils.client.account?.address,
|
|
903
939
|
lastValidL2Slot: slotNumber
|
|
904
940
|
});
|
|
941
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
905
942
|
try {
|
|
906
943
|
await this.l1TxUtils.simulate(request, {
|
|
907
944
|
time: timestamp
|
|
@@ -913,7 +950,10 @@ export class SequencerPublisher {
|
|
|
913
950
|
request
|
|
914
951
|
});
|
|
915
952
|
} catch (err) {
|
|
916
|
-
|
|
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
|
+
});
|
|
917
957
|
// Yes, we enqueue the request anyway, in case there was a bug with the simulation itself
|
|
918
958
|
}
|
|
919
959
|
// TODO(palla/slash): All votes (governance and slashing) should txTimeoutAt at the end of the slot.
|
|
@@ -957,12 +997,11 @@ export class SequencerPublisher {
|
|
|
957
997
|
/**
|
|
958
998
|
* Enqueues a governance castSignal transaction to cast a signal for a given slot number.
|
|
959
999
|
* @param slotNumber - The slot number to cast a signal for.
|
|
960
|
-
* @param timestamp - The timestamp of the slot to cast a signal for.
|
|
961
1000
|
* @returns True if the signal was successfully enqueued, false otherwise.
|
|
962
|
-
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber,
|
|
963
|
-
return this.enqueueCastSignalHelper(slotNumber,
|
|
1001
|
+
*/ enqueueGovernanceCastSignal(governancePayload, slotNumber, signerAddress, signer) {
|
|
1002
|
+
return this.enqueueCastSignalHelper(slotNumber, 'governance-signal', governancePayload, this.govProposerContract, signerAddress, signer);
|
|
964
1003
|
}
|
|
965
|
-
/** 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) {
|
|
966
1005
|
if (actions.length === 0) {
|
|
967
1006
|
this.log.debug(`No slashing actions to enqueue for slot ${slotNumber}`);
|
|
968
1007
|
return false;
|
|
@@ -978,7 +1017,7 @@ export class SequencerPublisher {
|
|
|
978
1017
|
this.log.debug(`Enqueuing slashing vote for payload ${action.payload} at slot ${slotNumber}`, {
|
|
979
1018
|
signerAddress
|
|
980
1019
|
});
|
|
981
|
-
await this.enqueueCastSignalHelper(slotNumber,
|
|
1020
|
+
await this.enqueueCastSignalHelper(slotNumber, 'empire-slashing-signal', action.payload, this.slashingProposerContract, signerAddress, signer);
|
|
982
1021
|
break;
|
|
983
1022
|
}
|
|
984
1023
|
case 'create-empire-payload':
|
|
@@ -988,7 +1027,7 @@ export class SequencerPublisher {
|
|
|
988
1027
|
signerAddress
|
|
989
1028
|
});
|
|
990
1029
|
const request = this.slashFactoryContract.buildCreatePayloadRequest(action.data);
|
|
991
|
-
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);
|
|
992
1031
|
break;
|
|
993
1032
|
}
|
|
994
1033
|
case 'execute-empire-payload':
|
|
@@ -1003,7 +1042,7 @@ export class SequencerPublisher {
|
|
|
1003
1042
|
}
|
|
1004
1043
|
const empireSlashingProposer = this.slashingProposerContract;
|
|
1005
1044
|
const request = empireSlashingProposer.buildExecuteRoundRequest(action.round);
|
|
1006
|
-
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);
|
|
1007
1046
|
break;
|
|
1008
1047
|
}
|
|
1009
1048
|
case 'vote-offenses':
|
|
@@ -1021,7 +1060,7 @@ export class SequencerPublisher {
|
|
|
1021
1060
|
const tallySlashingProposer = this.slashingProposerContract;
|
|
1022
1061
|
const votes = bufferToHex(encodeSlashConsensusVotes(action.votes));
|
|
1023
1062
|
const request = await tallySlashingProposer.buildVoteRequestFromSigner(votes, slotNumber, signer);
|
|
1024
|
-
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);
|
|
1025
1064
|
break;
|
|
1026
1065
|
}
|
|
1027
1066
|
case 'execute-slash':
|
|
@@ -1037,7 +1076,7 @@ export class SequencerPublisher {
|
|
|
1037
1076
|
}
|
|
1038
1077
|
const tallySlashingProposer = this.slashingProposerContract;
|
|
1039
1078
|
const request = tallySlashingProposer.buildExecuteRoundRequest(action.round, action.committees);
|
|
1040
|
-
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);
|
|
1041
1080
|
break;
|
|
1042
1081
|
}
|
|
1043
1082
|
default:
|
|
@@ -1052,22 +1091,22 @@ export class SequencerPublisher {
|
|
|
1052
1091
|
/** Simulates and enqueues a proposal for a checkpoint on L1 */ async enqueueProposeCheckpoint(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts = {}) {
|
|
1053
1092
|
const checkpointHeader = checkpoint.header;
|
|
1054
1093
|
const blobFields = checkpoint.toBlobFields();
|
|
1055
|
-
const blobs = getBlobsPerL1Block(blobFields);
|
|
1094
|
+
const blobs = await getBlobsPerL1Block(blobFields);
|
|
1056
1095
|
const proposeTxArgs = {
|
|
1057
1096
|
header: checkpointHeader,
|
|
1058
1097
|
archive: checkpoint.archive.root.toBuffer(),
|
|
1059
1098
|
blobs,
|
|
1060
1099
|
attestationsAndSigners,
|
|
1061
|
-
attestationsAndSignersSignature
|
|
1100
|
+
attestationsAndSignersSignature,
|
|
1101
|
+
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier
|
|
1062
1102
|
};
|
|
1063
|
-
let ts;
|
|
1064
1103
|
try {
|
|
1065
1104
|
// @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available
|
|
1066
1105
|
// This means that we can avoid the simulation issues in later checks.
|
|
1067
1106
|
// By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
|
|
1068
1107
|
// make time consistency checks break.
|
|
1069
1108
|
// TODO(palla): Check whether we're validating twice, once here and once within addProposeTx, since we call simulateProposeTx in both places.
|
|
1070
|
-
|
|
1109
|
+
await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts);
|
|
1071
1110
|
} catch (err) {
|
|
1072
1111
|
this.log.error(`Checkpoint validation failed. ${err instanceof Error ? err.message : 'No error message'}`, err, {
|
|
1073
1112
|
...checkpoint.getStats(),
|
|
@@ -1080,7 +1119,7 @@ export class SequencerPublisher {
|
|
|
1080
1119
|
...checkpoint.toCheckpointInfo(),
|
|
1081
1120
|
...opts
|
|
1082
1121
|
});
|
|
1083
|
-
await this.addProposeTx(checkpoint, proposeTxArgs, opts
|
|
1122
|
+
await this.addProposeTx(checkpoint, proposeTxArgs, opts);
|
|
1084
1123
|
}
|
|
1085
1124
|
enqueueInvalidateCheckpoint(request, opts = {}) {
|
|
1086
1125
|
if (!request) {
|
|
@@ -1121,7 +1160,8 @@ export class SequencerPublisher {
|
|
|
1121
1160
|
}
|
|
1122
1161
|
});
|
|
1123
1162
|
}
|
|
1124
|
-
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber
|
|
1163
|
+
async simulateAndEnqueueRequest(action, request, checkSuccess, slotNumber) {
|
|
1164
|
+
const timestamp = this.getSimulationTimestamp(slotNumber);
|
|
1125
1165
|
const logData = {
|
|
1126
1166
|
slotNumber,
|
|
1127
1167
|
timestamp,
|
|
@@ -1142,7 +1182,7 @@ export class SequencerPublisher {
|
|
|
1142
1182
|
try {
|
|
1143
1183
|
({ gasUsed } = await this.l1TxUtils.simulate(request, {
|
|
1144
1184
|
time: timestamp
|
|
1145
|
-
}, [], simulateAbi));
|
|
1185
|
+
}, [], simulateAbi));
|
|
1146
1186
|
this.log.verbose(`Simulation for ${action} succeeded`, {
|
|
1147
1187
|
...logData,
|
|
1148
1188
|
request,
|
|
@@ -1202,7 +1242,7 @@ export class SequencerPublisher {
|
|
|
1202
1242
|
this.interrupted = false;
|
|
1203
1243
|
this.l1TxUtils.restart();
|
|
1204
1244
|
}
|
|
1205
|
-
async prepareProposeTx(encodedData,
|
|
1245
|
+
async prepareProposeTx(encodedData, options) {
|
|
1206
1246
|
const kzg = Blob.getViemKzgInstance();
|
|
1207
1247
|
const blobInput = getPrefixedEthBlobCommitments(encodedData.blobs);
|
|
1208
1248
|
this.log.debug('Validating blob input', {
|
|
@@ -1243,8 +1283,7 @@ export class SequencerPublisher {
|
|
|
1243
1283
|
header: encodedData.header.toViem(),
|
|
1244
1284
|
archive: toHex(encodedData.archive),
|
|
1245
1285
|
oracleInput: {
|
|
1246
|
-
|
|
1247
|
-
feeAssetPriceModifier: 0n
|
|
1286
|
+
feeAssetPriceModifier: encodedData.feeAssetPriceModifier
|
|
1248
1287
|
}
|
|
1249
1288
|
},
|
|
1250
1289
|
encodedData.attestationsAndSigners.getPackedAttestations(),
|
|
@@ -1252,7 +1291,7 @@ export class SequencerPublisher {
|
|
|
1252
1291
|
encodedData.attestationsAndSignersSignature.toViemSignature(),
|
|
1253
1292
|
blobInput
|
|
1254
1293
|
];
|
|
1255
|
-
const { rollupData, simulationResult } = await this.simulateProposeTx(args,
|
|
1294
|
+
const { rollupData, simulationResult } = await this.simulateProposeTx(args, options);
|
|
1256
1295
|
return {
|
|
1257
1296
|
args,
|
|
1258
1297
|
blobEvaluationGas,
|
|
@@ -1263,9 +1302,8 @@ export class SequencerPublisher {
|
|
|
1263
1302
|
/**
|
|
1264
1303
|
* Simulates the propose tx with eth_simulateV1
|
|
1265
1304
|
* @param args - The propose tx args
|
|
1266
|
-
* @param timestamp - The timestamp to simulate proposal at
|
|
1267
1305
|
* @returns The simulation result
|
|
1268
|
-
*/ async simulateProposeTx(args,
|
|
1306
|
+
*/ async simulateProposeTx(args, options) {
|
|
1269
1307
|
const rollupData = encodeFunctionData({
|
|
1270
1308
|
abi: RollupAbi,
|
|
1271
1309
|
functionName: 'propose',
|
|
@@ -1293,6 +1331,7 @@ export class SequencerPublisher {
|
|
|
1293
1331
|
balance: 10n * WEI_CONST * WEI_CONST
|
|
1294
1332
|
});
|
|
1295
1333
|
}
|
|
1334
|
+
const simTs = this.getSimulationTimestamp(SlotNumber.fromBigInt(args[0].header.slotNumber));
|
|
1296
1335
|
const simulationResult = await this.l1TxUtils.simulate({
|
|
1297
1336
|
to: this.rollupContract.address,
|
|
1298
1337
|
data: rollupData,
|
|
@@ -1301,8 +1340,7 @@ export class SequencerPublisher {
|
|
|
1301
1340
|
from: this.proposerAddressForSimulation.toString()
|
|
1302
1341
|
}
|
|
1303
1342
|
}, {
|
|
1304
|
-
|
|
1305
|
-
time: timestamp + 1n,
|
|
1343
|
+
time: simTs,
|
|
1306
1344
|
// @note reth should have a 30m gas limit per block but throws errors that this tx is beyond limit so we increase here
|
|
1307
1345
|
gasLimit: MAX_L1_TX_LIMIT * 2n
|
|
1308
1346
|
}, stateOverrides, RollupAbi, {
|
|
@@ -1319,7 +1357,9 @@ export class SequencerPublisher {
|
|
|
1319
1357
|
logs: []
|
|
1320
1358
|
};
|
|
1321
1359
|
}
|
|
1322
|
-
this.log.error(`Failed to simulate propose tx`, viemError
|
|
1360
|
+
this.log.error(`Failed to simulate propose tx`, viemError, {
|
|
1361
|
+
simulationTimestamp: simTs
|
|
1362
|
+
});
|
|
1323
1363
|
throw err;
|
|
1324
1364
|
});
|
|
1325
1365
|
return {
|
|
@@ -1327,11 +1367,11 @@ export class SequencerPublisher {
|
|
|
1327
1367
|
simulationResult
|
|
1328
1368
|
};
|
|
1329
1369
|
}
|
|
1330
|
-
async addProposeTx(checkpoint, encodedData, opts = {}
|
|
1370
|
+
async addProposeTx(checkpoint, encodedData, opts = {}) {
|
|
1331
1371
|
const slot = checkpoint.header.slotNumber;
|
|
1332
1372
|
const timer = new Timer();
|
|
1333
1373
|
const kzg = Blob.getViemKzgInstance();
|
|
1334
|
-
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData,
|
|
1374
|
+
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, opts);
|
|
1335
1375
|
const startBlock = await this.l1TxUtils.getBlockNumber();
|
|
1336
1376
|
const gasLimit = this.l1TxUtils.bumpGasLimit(BigInt(Math.ceil(Number(simulationResult.gasUsed) * 64 / 63)) + blobEvaluationGas + SequencerPublisher.MULTICALL_OVERHEAD_GAS_GUESS);
|
|
1337
1377
|
// Send the blobs to the blob client preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
@@ -1396,4 +1436,13 @@ export class SequencerPublisher {
|
|
|
1396
1436
|
}
|
|
1397
1437
|
});
|
|
1398
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
|
+
}
|
|
1399
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>;
|
|
@@ -93,8 +93,10 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
93
93
|
private handleHASigningError;
|
|
94
94
|
/** Waits until a specific time within the current slot */
|
|
95
95
|
protected waitUntilTimeInSlot(targetSecondsIntoSlot: number): Promise<void>;
|
|
96
|
+
/** Waits the polling interval for transactions. Extracted for test overriding. */
|
|
97
|
+
protected waitForTxsPollingInterval(): Promise<void>;
|
|
96
98
|
private getSlotStartBuildTimestamp;
|
|
97
99
|
private getSecondsIntoSlot;
|
|
98
100
|
getPublisher(): SequencerPublisher;
|
|
99
101
|
}
|
|
100
|
-
//# 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":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,UAAU,EACX,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,yBAAyB,CAAC;AACzF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAGL,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,UAAU,EAAsB,MAAM,0BAA0B,CAAC;AAG/E,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,mBAAmB,EAAmC,MAAM,yBAAyB,CAAC;AASpG,OAAO,EAAiB,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,KAAK,0BAA0B,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGnH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,KAAK,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAG3G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK5C;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,SAAS;IAInD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,SAAS,CAAC,MAAM,EAAE,uBAAuB;IACzC,SAAS,CAAC,SAAS,EAAE,kBAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;aACX,MAAM,EAAE,MAAM;IA7BhC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAE/B,YACmB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,UAAU,EAChB,gBAAgB,EAAE,gBAAgB,EAClC,mBAAmB,EAAE,WAAW,EAEhC,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,SAAS,EAAE,kBAAkB,EAC7B,eAAe,EAAE,UAAU,EAC3B,oBAAoB,EAAE,2BAA2B,GAAG,SAAS,EAC7D,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,qBAAqB,EACrC,SAAS,EAAE,GAAG,EACd,UAAU,EAAE,sBAAsB,EAClC,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,0BAA0B,EAC9C,SAAS,EAAE,WAAW,EACtB,WAAW,EAAE,wBAAwB,EAC5C,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE,kBAAkB,EACtB,aAAa,EAAE,sBAAsB,GAAG,SAAS,EACjD,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,iBAAiB,CAAC,eAAe,CAAC,EAChD,UAAU,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,UAAU,KAAK,IAAI,EAC/D,MAAM,EAAE,MAAM,EAC9B,QAAQ,CAAC,EAAE,cAAc,EAG1B;IAED;;;OAGG;IAEU,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA4CtD;YASa,iBAAiB;YAqOjB,wBAAwB;IAsGtC,qGAAqG;IACrG,OAAO,CAAC,mBAAmB;YAuBb,oBAAoB;IAMlC,uEAAuE;IACvE,UACgB,gBAAgB,CAC9B,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE;QACJ,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,WAAW,CAAC;QACzB,qBAAqB,EAAE,qBAAqB,CAAC;QAC7C,aAAa,EAAE,IAAI,GAAG,SAAS,CAAC;QAChC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KACtC,GACA,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,EAAE,EAAE,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,SAAS,CAAC,CAgH3E;YAGa,qCAAqC;YA0BrC,aAAa;YA2Cb,mBAAmB;IAgFjC,wEAAwE;IACxE,OAAO,CAAC,sBAAsB;YA8DhB,oBAAoB;YAmBpB,2BAA2B;YAgB3B,8BAA8B;IAwB5C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B,0DAA0D;IAC1D,UACgB,mBAAmB,CAAC,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhF;IAED,kFAAkF;IAClF,UAAgB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzD;IAED,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,kBAAkB;IAKnB,YAAY,uBAElB;CACF"}
|