@aztec/sequencer-client 0.0.1-commit.cd76b27 → 0.0.1-commit.ce4f8c4f2

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.
Files changed (73) hide show
  1. package/dest/client/sequencer-client.d.ts +4 -1
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +46 -23
  4. package/dest/config.d.ts +25 -5
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +31 -17
  7. package/dest/global_variable_builder/global_builder.d.ts +13 -7
  8. package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
  9. package/dest/global_variable_builder/global_builder.js +22 -21
  10. package/dest/global_variable_builder/index.d.ts +2 -2
  11. package/dest/global_variable_builder/index.d.ts.map +1 -1
  12. package/dest/publisher/config.d.ts +17 -1
  13. package/dest/publisher/config.d.ts.map +1 -1
  14. package/dest/publisher/config.js +23 -3
  15. package/dest/publisher/index.d.ts +2 -1
  16. package/dest/publisher/index.d.ts.map +1 -1
  17. package/dest/publisher/l1_tx_failed_store/factory.d.ts +11 -0
  18. package/dest/publisher/l1_tx_failed_store/factory.d.ts.map +1 -0
  19. package/dest/publisher/l1_tx_failed_store/factory.js +22 -0
  20. package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts +59 -0
  21. package/dest/publisher/l1_tx_failed_store/failed_tx_store.d.ts.map +1 -0
  22. package/dest/publisher/l1_tx_failed_store/failed_tx_store.js +1 -0
  23. package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.d.ts +15 -0
  24. package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.d.ts.map +1 -0
  25. package/dest/publisher/l1_tx_failed_store/file_store_failed_tx_store.js +34 -0
  26. package/dest/publisher/l1_tx_failed_store/index.d.ts +4 -0
  27. package/dest/publisher/l1_tx_failed_store/index.d.ts.map +1 -0
  28. package/dest/publisher/l1_tx_failed_store/index.js +2 -0
  29. package/dest/publisher/sequencer-publisher-factory.d.ts +3 -3
  30. package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
  31. package/dest/publisher/sequencer-publisher-factory.js +16 -2
  32. package/dest/publisher/sequencer-publisher.d.ts +19 -4
  33. package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
  34. package/dest/publisher/sequencer-publisher.js +294 -18
  35. package/dest/sequencer/checkpoint_proposal_job.d.ts +13 -7
  36. package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
  37. package/dest/sequencer/checkpoint_proposal_job.js +206 -130
  38. package/dest/sequencer/events.d.ts +2 -1
  39. package/dest/sequencer/events.d.ts.map +1 -1
  40. package/dest/sequencer/metrics.d.ts +5 -1
  41. package/dest/sequencer/metrics.d.ts.map +1 -1
  42. package/dest/sequencer/metrics.js +11 -0
  43. package/dest/sequencer/sequencer.d.ts +18 -9
  44. package/dest/sequencer/sequencer.d.ts.map +1 -1
  45. package/dest/sequencer/sequencer.js +77 -62
  46. package/dest/sequencer/timetable.d.ts +4 -3
  47. package/dest/sequencer/timetable.d.ts.map +1 -1
  48. package/dest/sequencer/timetable.js +6 -7
  49. package/dest/sequencer/types.d.ts +2 -2
  50. package/dest/sequencer/types.d.ts.map +1 -1
  51. package/dest/test/mock_checkpoint_builder.d.ts +7 -9
  52. package/dest/test/mock_checkpoint_builder.d.ts.map +1 -1
  53. package/dest/test/mock_checkpoint_builder.js +39 -30
  54. package/package.json +27 -28
  55. package/src/client/sequencer-client.ts +56 -21
  56. package/src/config.ts +39 -19
  57. package/src/global_variable_builder/global_builder.ts +22 -23
  58. package/src/global_variable_builder/index.ts +1 -1
  59. package/src/publisher/config.ts +41 -0
  60. package/src/publisher/index.ts +3 -0
  61. package/src/publisher/l1_tx_failed_store/factory.ts +32 -0
  62. package/src/publisher/l1_tx_failed_store/failed_tx_store.ts +55 -0
  63. package/src/publisher/l1_tx_failed_store/file_store_failed_tx_store.ts +46 -0
  64. package/src/publisher/l1_tx_failed_store/index.ts +3 -0
  65. package/src/publisher/sequencer-publisher-factory.ts +18 -3
  66. package/src/publisher/sequencer-publisher.ts +281 -26
  67. package/src/sequencer/checkpoint_proposal_job.ts +277 -142
  68. package/src/sequencer/events.ts +1 -1
  69. package/src/sequencer/metrics.ts +14 -0
  70. package/src/sequencer/sequencer.ts +105 -69
  71. package/src/sequencer/timetable.ts +7 -7
  72. package/src/sequencer/types.ts +1 -1
  73. package/src/test/mock_checkpoint_builder.ts +51 -48
@@ -379,7 +379,9 @@ 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';
384
+ import { TimeoutError } from '@aztec/foundation/error';
383
385
  import { EthAddress } from '@aztec/foundation/eth-address';
384
386
  import { Signature } from '@aztec/foundation/eth-signature';
385
387
  import { createLogger } from '@aztec/foundation/log';
@@ -389,8 +391,10 @@ import { Timer } from '@aztec/foundation/timer';
389
391
  import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
390
392
  import { encodeSlashConsensusVotes } from '@aztec/slasher';
391
393
  import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
394
+ import { getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
392
395
  import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
393
- import { encodeFunctionData, toHex } from 'viem';
396
+ import { encodeFunctionData, keccak256, multicall3Abi, toHex } from 'viem';
397
+ import { createL1TxFailedStore } from './l1_tx_failed_store/index.js';
394
398
  import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
395
399
  export const Actions = [
396
400
  'invalidate-by-invalid-attestation',
@@ -430,6 +434,7 @@ export class SequencerPublisher {
430
434
  interrupted;
431
435
  metrics;
432
436
  epochCache;
437
+ failedTxStore;
433
438
  governanceLog;
434
439
  slashingLog;
435
440
  lastActions;
@@ -437,8 +442,11 @@ export class SequencerPublisher {
437
442
  payloadProposedCache;
438
443
  log;
439
444
  ethereumSlotDuration;
445
+ aztecSlotDuration;
446
+ dateProvider;
440
447
  blobClient;
441
448
  /** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
449
+ /** Optional callback to obtain a replacement publisher when the current one fails to send. */ getNextPublisher;
442
450
  /** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
443
451
  /** Fee asset price oracle for computing price modifiers from Uniswap V4 */ feeAssetPriceOracle;
444
452
  // A CALL to a cold address is 2700 gas
@@ -463,6 +471,8 @@ export class SequencerPublisher {
463
471
  this.requests = [];
464
472
  this.log = deps.log ?? createLogger('sequencer:publisher');
465
473
  this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
474
+ this.aztecSlotDuration = BigInt(config.aztecSlotDuration);
475
+ this.dateProvider = deps.dateProvider;
466
476
  this.epochCache = deps.epochCache;
467
477
  this.lastActions = deps.lastActions;
468
478
  this.blobClient = deps.blobClient;
@@ -470,6 +480,7 @@ export class SequencerPublisher {
470
480
  this.metrics = deps.metrics ?? new SequencerPublisherMetrics(telemetry, 'SequencerPublisher');
471
481
  this.tracer = telemetry.getTracer('SequencerPublisher');
472
482
  this.l1TxUtils = deps.l1TxUtils;
483
+ this.getNextPublisher = deps.getNextPublisher;
473
484
  this.rollupContract = deps.rollupContract;
474
485
  this.govProposerContract = deps.governanceProposerContract;
475
486
  this.slashingProposerContract = deps.slashingProposerContract;
@@ -485,6 +496,24 @@ export class SequencerPublisher {
485
496
  }
486
497
  // Initialize fee asset price oracle
487
498
  this.feeAssetPriceOracle = new FeeAssetPriceOracle(this.l1TxUtils.client, this.rollupContract, createLogger('sequencer:publisher:price-oracle'));
499
+ // Initialize failed L1 tx store (optional, for test networks)
500
+ this.failedTxStore = createL1TxFailedStore(config.l1TxFailedStore, this.log);
501
+ }
502
+ /**
503
+ * Backs up a failed L1 transaction to the configured store for debugging.
504
+ * Does nothing if no store is configured.
505
+ */ backupFailedTx(failedTx) {
506
+ if (!this.failedTxStore) {
507
+ return;
508
+ }
509
+ const tx = {
510
+ ...failedTx,
511
+ timestamp: Date.now()
512
+ };
513
+ // Fire and forget - don't block on backup
514
+ void this.failedTxStore.then((store)=>store?.saveFailedTx(tx)).catch((err)=>{
515
+ this.log.warn(`Failed to backup failed L1 tx to store`, err);
516
+ });
488
517
  }
489
518
  getRollupContract() {
490
519
  return this.rollupContract;
@@ -513,7 +542,7 @@ export class SequencerPublisher {
513
542
  this.requests.push(request);
514
543
  }
515
544
  getCurrentL2Slot() {
516
- return this.epochCache.getEpochAndSlotNow().slot;
545
+ return this.epochCache.getSlotNow();
517
546
  }
518
547
  /**
519
548
  * Clears all pending requests without sending them.
@@ -602,8 +631,8 @@ export class SequencerPublisher {
602
631
  // @note - we can only have one blob config per bundle
603
632
  // find requests with gas and blob configs
604
633
  // See https://github.com/AztecProtocol/aztec-packages/issues/11513
605
- const gasConfigs = requestsToProcess.filter((request)=>request.gasConfig).map((request)=>request.gasConfig);
606
- const blobConfigs = requestsToProcess.filter((request)=>request.blobConfig).map((request)=>request.blobConfig);
634
+ const gasConfigs = validRequests.filter((request)=>request.gasConfig).map((request)=>request.gasConfig);
635
+ const blobConfigs = validRequests.filter((request)=>request.blobConfig).map((request)=>request.blobConfig);
607
636
  if (blobConfigs.length > 1) {
608
637
  throw new Error('Multiple blob configs found');
609
638
  }
@@ -630,12 +659,34 @@ export class SequencerPublisher {
630
659
  // This ensures the committee gets precomputed correctly
631
660
  validRequests.sort((a, b)=>compareActions(a.action, b.action));
632
661
  try {
662
+ // Capture context for failed tx backup before sending
663
+ const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
664
+ const multicallData = encodeFunctionData({
665
+ abi: multicall3Abi,
666
+ functionName: 'aggregate3',
667
+ args: [
668
+ validRequests.map((r)=>({
669
+ target: r.request.to,
670
+ callData: r.request.data,
671
+ allowFailure: true
672
+ }))
673
+ ]
674
+ });
675
+ const blobDataHex = blobConfig?.blobs?.map((b)=>toHex(b));
676
+ const txContext = {
677
+ multicallData,
678
+ blobData: blobDataHex,
679
+ l1BlockNumber
680
+ };
633
681
  this.log.debug('Forwarding transactions', {
634
682
  validRequests: validRequests.map((request)=>request.action),
635
683
  txConfig
636
684
  });
637
- const result = await Multicall3.forward(validRequests.map((request)=>request.request), this.l1TxUtils, txConfig, blobConfig, this.rollupContract.address, this.log);
638
- const { successfulActions = [], failedActions = [] } = this.callbackBundledTransactions(validRequests, result);
685
+ const result = await this.forwardWithPublisherRotation(validRequests, txConfig, blobConfig);
686
+ if (result === undefined) {
687
+ return undefined;
688
+ }
689
+ const { successfulActions = [], failedActions = [] } = this.callbackBundledTransactions(validRequests, result, txContext);
639
690
  return {
640
691
  result,
641
692
  expiredActions,
@@ -655,17 +706,83 @@ export class SequencerPublisher {
655
706
  }
656
707
  }
657
708
  }
658
- callbackBundledTransactions(requests, result) {
709
+ /**
710
+ * Forwards transactions via Multicall3, rotating to the next available publisher if a send
711
+ * failure occurs (i.e. the tx never reached the chain).
712
+ * On-chain reverts and simulation errors are returned as-is without rotation.
713
+ */ async forwardWithPublisherRotation(validRequests, txConfig, blobConfig) {
714
+ const triedAddresses = [];
715
+ let currentPublisher = this.l1TxUtils;
716
+ while(true){
717
+ triedAddresses.push(currentPublisher.getSenderAddress());
718
+ try {
719
+ const result = await Multicall3.forward(validRequests.map((r)=>r.request), currentPublisher, txConfig, blobConfig, this.rollupContract.address, this.log);
720
+ this.l1TxUtils = currentPublisher;
721
+ return result;
722
+ } catch (err) {
723
+ if (err instanceof TimeoutError) {
724
+ throw err;
725
+ }
726
+ const viemError = formatViemError(err);
727
+ if (!this.getNextPublisher) {
728
+ this.log.error('Failed to publish bundled transactions', viemError);
729
+ return undefined;
730
+ }
731
+ this.log.warn(`Publisher ${currentPublisher.getSenderAddress()} failed to send, rotating to next publisher`, viemError);
732
+ const nextPublisher = await this.getNextPublisher([
733
+ ...triedAddresses
734
+ ]);
735
+ if (!nextPublisher) {
736
+ this.log.error('All available publishers exhausted, failed to publish bundled transactions');
737
+ return undefined;
738
+ }
739
+ currentPublisher = nextPublisher;
740
+ }
741
+ }
742
+ }
743
+ callbackBundledTransactions(requests, result, txContext) {
659
744
  const actionsListStr = requests.map((r)=>r.action).join(', ');
660
745
  if (result instanceof FormattedViemError) {
661
746
  this.log.error(`Failed to publish bundled transactions (${actionsListStr})`, result);
747
+ this.backupFailedTx({
748
+ id: keccak256(txContext.multicallData),
749
+ failureType: 'send-error',
750
+ request: {
751
+ to: MULTI_CALL_3_ADDRESS,
752
+ data: txContext.multicallData
753
+ },
754
+ blobData: txContext.blobData,
755
+ l1BlockNumber: txContext.l1BlockNumber.toString(),
756
+ error: {
757
+ message: result.message,
758
+ name: result.name
759
+ },
760
+ context: {
761
+ actions: requests.map((r)=>r.action),
762
+ requests: requests.map((r)=>({
763
+ action: r.action,
764
+ to: r.request.to,
765
+ data: r.request.data
766
+ })),
767
+ sender: this.getSenderAddress().toString()
768
+ }
769
+ });
662
770
  return {
663
771
  failedActions: requests.map((r)=>r.action)
664
772
  };
665
773
  } else {
666
774
  this.log.verbose(`Published bundled transactions (${actionsListStr})`, {
667
775
  result,
668
- requests
776
+ requests: requests.map((r)=>({
777
+ ...r,
778
+ // Avoid logging large blob data
779
+ blobConfig: r.blobConfig ? {
780
+ ...r.blobConfig,
781
+ blobs: r.blobConfig.blobs.map((b)=>({
782
+ size: trimmedBytesLength(b)
783
+ }))
784
+ } : undefined
785
+ }))
669
786
  });
670
787
  const successfulActions = [];
671
788
  const failedActions = [];
@@ -676,6 +793,37 @@ export class SequencerPublisher {
676
793
  failedActions.push(request.action);
677
794
  }
678
795
  }
796
+ // Single backup for the whole reverted tx
797
+ if (failedActions.length > 0 && result?.receipt?.status === 'reverted') {
798
+ this.backupFailedTx({
799
+ id: result.receipt.transactionHash,
800
+ failureType: 'revert',
801
+ request: {
802
+ to: MULTI_CALL_3_ADDRESS,
803
+ data: txContext.multicallData
804
+ },
805
+ blobData: txContext.blobData,
806
+ l1BlockNumber: result.receipt.blockNumber.toString(),
807
+ receipt: {
808
+ transactionHash: result.receipt.transactionHash,
809
+ blockNumber: result.receipt.blockNumber.toString(),
810
+ gasUsed: (result.receipt.gasUsed ?? 0n).toString(),
811
+ status: 'reverted'
812
+ },
813
+ error: {
814
+ message: result.errorMsg ?? 'Transaction reverted'
815
+ },
816
+ context: {
817
+ actions: failedActions,
818
+ requests: requests.filter((r)=>failedActions.includes(r.action)).map((r)=>({
819
+ action: r.action,
820
+ to: r.request.to,
821
+ data: r.request.data
822
+ })),
823
+ sender: this.getSenderAddress().toString()
824
+ }
825
+ });
826
+ }
679
827
  return {
680
828
  successfulActions,
681
829
  failedActions
@@ -683,17 +831,20 @@ export class SequencerPublisher {
683
831
  }
684
832
  }
685
833
  /**
686
- * @notice Will call `canProposeAtNextEthBlock` to make sure that it is possible to propose
834
+ * @notice Will call `canProposeAt` to make sure that it is possible to propose
687
835
  * @param tipArchive - The archive to check
688
836
  * @returns The slot and block number if it is possible to propose, undefined otherwise
689
- */ canProposeAtNextEthBlock(tipArchive, msgSender, opts = {}) {
837
+ */ canProposeAt(tipArchive, msgSender, opts = {}) {
690
838
  // TODO: #14291 - should loop through multiple keys to check if any of them can propose
691
839
  const ignoredErrors = [
692
840
  'SlotAlreadyInChain',
693
841
  'InvalidProposer',
694
842
  'InvalidArchive'
695
843
  ];
696
- return this.rollupContract.canProposeAtNextEthBlock(tipArchive.toBuffer(), msgSender.toString(), Number(this.ethereumSlotDuration), {
844
+ const pipelined = opts.pipelined ?? this.epochCache.isProposerPipeliningEnabled();
845
+ const slotOffset = pipelined ? this.aztecSlotDuration : 0n;
846
+ const nextL1SlotTs = this.getNextL1SlotTimestamp() + slotOffset;
847
+ return this.rollupContract.canProposeAt(tipArchive.toBuffer(), msgSender.toString(), nextL1SlotTs, {
697
848
  forcePendingCheckpointNumber: opts.forcePendingCheckpointNumber
698
849
  }).catch((err)=>{
699
850
  if (err instanceof FormattedViemError && ignoredErrors.find((e)=>err.message.includes(e))) {
@@ -725,7 +876,7 @@ export class SequencerPublisher {
725
876
  header.blobsHash.toString(),
726
877
  flags
727
878
  ];
728
- const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
879
+ const ts = this.getNextL1SlotTimestamp();
729
880
  const stateOverrides = await this.rollupContract.makePendingCheckpointNumberOverride(opts?.forcePendingCheckpointNumber);
730
881
  let balance = 0n;
731
882
  if (this.config.fishermanMode) {
@@ -778,6 +929,7 @@ export class SequencerPublisher {
778
929
  ...logData,
779
930
  request
780
931
  });
932
+ const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
781
933
  try {
782
934
  const { gasUsed } = await this.l1TxUtils.simulate(request, undefined, undefined, mergeAbis([
783
935
  request.abi ?? [],
@@ -820,6 +972,27 @@ export class SequencerPublisher {
820
972
  }
821
973
  // Otherwise, throw. We cannot build the next checkpoint if we cannot invalidate the previous one.
822
974
  this.log.error(`Simulation for invalidate checkpoint ${checkpointNumber} failed`, viemError, logData);
975
+ this.backupFailedTx({
976
+ id: keccak256(request.data),
977
+ failureType: 'simulation',
978
+ request: {
979
+ to: request.to,
980
+ data: request.data,
981
+ value: request.value?.toString()
982
+ },
983
+ l1BlockNumber: l1BlockNumber.toString(),
984
+ error: {
985
+ message: viemError.message,
986
+ name: viemError.name
987
+ },
988
+ context: {
989
+ actions: [
990
+ `invalidate-${reason}`
991
+ ],
992
+ checkpointNumber,
993
+ sender: this.getSenderAddress().toString()
994
+ }
995
+ });
823
996
  throw new Error(`Failed to simulate invalidate checkpoint ${checkpointNumber}`, {
824
997
  cause: viemError
825
998
  });
@@ -846,7 +1019,12 @@ export class SequencerPublisher {
846
1019
  }
847
1020
  }
848
1021
  /** 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);
1022
+ // When pipelining, the checkpoint targets the next slot so its timestamp is in the future.
1023
+ // Without pipelining, the checkpoint targets the current slot so its timestamp is in the past
1024
+ // by the time we simulate (~24s of build time), causing eth_simulateV1 to reject it.
1025
+ // In that case, use the latest L1 block timestamp + one ethereum slot, which is just ahead
1026
+ // of L1 and still within the same L2 slot.
1027
+ const ts = this.epochCache.isProposerPipeliningEnabled() ? checkpoint.header.timestamp : (await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration;
850
1028
  const blobFields = checkpoint.toBlobFields();
851
1029
  const blobs = await getBlobsPerL1Block(blobFields);
852
1030
  const blobInput = getPrefixedEthBlobCommitments(blobs);
@@ -922,6 +1100,7 @@ export class SequencerPublisher {
922
1100
  signer: this.l1TxUtils.client.account?.address,
923
1101
  lastValidL2Slot: slotNumber
924
1102
  });
1103
+ const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
925
1104
  try {
926
1105
  await this.l1TxUtils.simulate(request, {
927
1106
  time: timestamp
@@ -933,7 +1112,29 @@ export class SequencerPublisher {
933
1112
  request
934
1113
  });
935
1114
  } catch (err) {
936
- this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, err);
1115
+ const viemError = formatViemError(err);
1116
+ this.log.error(`Failed simulation for ${action} at slot ${slotNumber} (enqueuing the action anyway)`, viemError);
1117
+ this.backupFailedTx({
1118
+ id: keccak256(request.data),
1119
+ failureType: 'simulation',
1120
+ request: {
1121
+ to: request.to,
1122
+ data: request.data,
1123
+ value: request.value?.toString()
1124
+ },
1125
+ l1BlockNumber: l1BlockNumber.toString(),
1126
+ error: {
1127
+ message: viemError.message,
1128
+ name: viemError.name
1129
+ },
1130
+ context: {
1131
+ actions: [
1132
+ action
1133
+ ],
1134
+ slot: slotNumber,
1135
+ sender: this.getSenderAddress().toString()
1136
+ }
1137
+ });
937
1138
  // Yes, we enqueue the request anyway, in case there was a bug with the simulation itself
938
1139
  }
939
1140
  // TODO(palla/slash): All votes (governance and slashing) should txTimeoutAt at the end of the slot.
@@ -1155,6 +1356,7 @@ export class SequencerPublisher {
1155
1356
  const cachedLastActionSlot = this.lastActions[action];
1156
1357
  this.lastActions[action] = slotNumber;
1157
1358
  this.log.debug(`Simulating ${action} for slot ${slotNumber}`, logData);
1359
+ const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
1158
1360
  let gasUsed;
1159
1361
  const simulateAbi = mergeAbis([
1160
1362
  request.abi ?? [],
@@ -1172,6 +1374,27 @@ export class SequencerPublisher {
1172
1374
  } catch (err) {
1173
1375
  const viemError = formatViemError(err, simulateAbi);
1174
1376
  this.log.error(`Simulation for ${action} at ${slotNumber} failed`, viemError, logData);
1377
+ this.backupFailedTx({
1378
+ id: keccak256(request.data),
1379
+ failureType: 'simulation',
1380
+ request: {
1381
+ to: request.to,
1382
+ data: request.data,
1383
+ value: request.value?.toString()
1384
+ },
1385
+ l1BlockNumber: l1BlockNumber.toString(),
1386
+ error: {
1387
+ message: viemError.message,
1388
+ name: viemError.name
1389
+ },
1390
+ context: {
1391
+ actions: [
1392
+ action
1393
+ ],
1394
+ slot: slotNumber,
1395
+ sender: this.getSenderAddress().toString()
1396
+ }
1397
+ });
1175
1398
  return false;
1176
1399
  }
1177
1400
  // We issued the simulation against the rollup contract, so we need to account for the overhead of the multicall3
@@ -1250,10 +1473,38 @@ export class SequencerPublisher {
1250
1473
  }, {}, {
1251
1474
  blobs: encodedData.blobs.map((b)=>b.data),
1252
1475
  kzg
1253
- }).catch((err)=>{
1254
- const { message, metaMessages } = formatViemError(err);
1255
- this.log.error(`Failed to validate blobs`, message, {
1256
- metaMessages
1476
+ }).catch(async (err)=>{
1477
+ const viemError = formatViemError(err);
1478
+ this.log.error(`Failed to validate blobs`, viemError.message, {
1479
+ metaMessages: viemError.metaMessages
1480
+ });
1481
+ const validateBlobsData = encodeFunctionData({
1482
+ abi: RollupAbi,
1483
+ functionName: 'validateBlobs',
1484
+ args: [
1485
+ blobInput
1486
+ ]
1487
+ });
1488
+ const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
1489
+ this.backupFailedTx({
1490
+ id: keccak256(validateBlobsData),
1491
+ failureType: 'simulation',
1492
+ request: {
1493
+ to: this.rollupContract.address,
1494
+ data: validateBlobsData
1495
+ },
1496
+ blobData: encodedData.blobs.map((b)=>toHex(b.data)),
1497
+ l1BlockNumber: l1BlockNumber.toString(),
1498
+ error: {
1499
+ message: viemError.message,
1500
+ name: viemError.name
1501
+ },
1502
+ context: {
1503
+ actions: [
1504
+ 'validate-blobs'
1505
+ ],
1506
+ sender: this.getSenderAddress().toString()
1507
+ }
1257
1508
  });
1258
1509
  throw new Error('Failed to validate blobs');
1259
1510
  });
@@ -1313,6 +1564,7 @@ export class SequencerPublisher {
1313
1564
  balance: 10n * WEI_CONST * WEI_CONST
1314
1565
  });
1315
1566
  }
1567
+ const l1BlockNumber = await this.l1TxUtils.getBlockNumber();
1316
1568
  const simulationResult = await this.l1TxUtils.simulate({
1317
1569
  to: this.rollupContract.address,
1318
1570
  data: rollupData,
@@ -1340,6 +1592,26 @@ export class SequencerPublisher {
1340
1592
  };
1341
1593
  }
1342
1594
  this.log.error(`Failed to simulate propose tx`, viemError);
1595
+ this.backupFailedTx({
1596
+ id: keccak256(rollupData),
1597
+ failureType: 'simulation',
1598
+ request: {
1599
+ to: this.rollupContract.address,
1600
+ data: rollupData
1601
+ },
1602
+ l1BlockNumber: l1BlockNumber.toString(),
1603
+ error: {
1604
+ message: viemError.message,
1605
+ name: viemError.name
1606
+ },
1607
+ context: {
1608
+ actions: [
1609
+ 'propose'
1610
+ ],
1611
+ slot: Number(args[0].header.slotNumber),
1612
+ sender: this.getSenderAddress().toString()
1613
+ }
1614
+ });
1343
1615
  throw err;
1344
1616
  });
1345
1617
  return {
@@ -1416,4 +1688,8 @@ export class SequencerPublisher {
1416
1688
  }
1417
1689
  });
1418
1690
  }
1691
+ /** Returns the timestamp to use when simulating L1 proposal calls */ getNextL1SlotTimestamp() {
1692
+ const l1Constants = this.epochCache.getL1Constants();
1693
+ return getNextL1SlotTimestamp(this.dateProvider.nowInSeconds(), l1Constants);
1694
+ }
1419
1695
  }
@@ -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 { Checkpoint } from '@aztec/stdlib/checkpoint';
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';
@@ -27,8 +27,10 @@ import { SequencerState } from './utils.js';
27
27
  * the Sequencer once the check for being the proposer for the slot has succeeded.
28
28
  */
29
29
  export declare class CheckpointProposalJob implements Traceable {
30
- private readonly epoch;
31
- private readonly slot;
30
+ private readonly slotNow;
31
+ private readonly targetSlot;
32
+ private readonly epochNow;
33
+ private readonly targetEpoch;
32
34
  private readonly checkpointNumber;
33
35
  private readonly syncedToBlockNumber;
34
36
  private readonly proposer;
@@ -54,7 +56,11 @@ export declare class CheckpointProposalJob implements Traceable {
54
56
  private readonly setStateFn;
55
57
  readonly tracer: Tracer;
56
58
  protected readonly log: Logger;
57
- constructor(epoch: EpochNumber, slot: SlotNumber, 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);
59
+ constructor(slotNow: SlotNumber, targetSlot: SlotNumber, epochNow: EpochNumber, 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);
60
+ /** The wall-clock slot during which the proposer builds. */
61
+ private get slot();
62
+ /** The wall-clock epoch. */
63
+ private get epoch();
58
64
  /**
59
65
  * Executes the checkpoint proposal job.
60
66
  * Returns the published checkpoint if successful, undefined otherwise.
@@ -62,6 +68,8 @@ export declare class CheckpointProposalJob implements Traceable {
62
68
  execute(): Promise<Checkpoint | undefined>;
63
69
  private proposeCheckpoint;
64
70
  private buildBlocksForCheckpoint;
71
+ /** Creates a block proposal for a given block via the validator client (unless in fisherman mode) */
72
+ private createBlockProposal;
65
73
  private waitUntilNextSubslot;
66
74
  /** Builds a single block. Called from the main block building loop. */
67
75
  protected buildSingleBlock(checkpointBuilder: CheckpointBuilder, opts: {
@@ -71,11 +79,9 @@ export declare class CheckpointProposalJob implements Traceable {
71
79
  indexWithinCheckpoint: IndexWithinCheckpoint;
72
80
  buildDeadline: Date | undefined;
73
81
  txHashesAlreadyIncluded: Set<string>;
74
- remainingBlobFields: number;
75
82
  }): Promise<{
76
83
  block: L2Block;
77
84
  usedTxs: Tx[];
78
- remainingBlobFields: number;
79
85
  } | {
80
86
  error: Error;
81
87
  } | undefined>;
@@ -99,4 +105,4 @@ export declare class CheckpointProposalJob implements Traceable {
99
105
  private getSecondsIntoSlot;
100
106
  getPublisher(): SequencerPublisher;
101
107
  }
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF9qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvY2hlY2twb2ludF9wcm9wb3NhbF9qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixVQUFVLEVBQ1gsTUFBTSxpQ0FBaUMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBQ3pGLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFHTCxPQUFPLEVBQ1AsS0FBSyxXQUFXLEVBQ2hCLEtBQUssYUFBYSxFQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzNELE9BQU8sRUFHTCxLQUFLLHVCQUF1QixFQUM1QixLQUFLLHNCQUFzQixFQUM1QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFtQyxNQUFNLHlCQUF5QixDQUFDO0FBSXBHLE9BQU8sRUFBaUIsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQsT0FBTyxFQUFjLEtBQUssU0FB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
108
+ //# 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":"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"}
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,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,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;IA/BhC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAE/B,YACmB,OAAO,EAAE,UAAU,EACnB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,WAAW,EACxB,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,EAM1B;IAED,4DAA4D;IAC5D,OAAO,KAAK,IAAI,GAEf;IAED,4BAA4B;IAC5B,OAAO,KAAK,KAAK,GAEhB;IAED;;;OAGG;IAEU,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAmEtD;YASa,iBAAiB;YA4OjB,wBAAwB;IAiHtC,qGAAqG;IACrG,OAAO,CAAC,mBAAmB;YAuBb,oBAAoB;IAQlC,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,CA0H3E;YAGa,qCAAqC;YA0BrC,aAAa;YA2Cb,mBAAmB;IAgFjC,wEAAwE;IACxE,OAAO,CAAC,sBAAsB;YAuEhB,oBAAoB;YAepB,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"}