@aztec/prover-node 0.0.1-commit.0208eb9 → 0.0.1-commit.031e54b

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 (44) hide show
  1. package/dest/actions/download-epoch-proving-job.js +1 -1
  2. package/dest/actions/rerun-epoch-proving-job.d.ts +4 -3
  3. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
  4. package/dest/actions/rerun-epoch-proving-job.js +8 -8
  5. package/dest/actions/upload-epoch-proof-failure.d.ts +2 -2
  6. package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -1
  7. package/dest/bin/run-failed-epoch.js +6 -5
  8. package/dest/config.d.ts +5 -8
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +16 -19
  11. package/dest/factory.d.ts +19 -13
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +40 -60
  14. package/dest/job/epoch-proving-job.d.ts +6 -2
  15. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  16. package/dest/job/epoch-proving-job.js +206 -35
  17. package/dest/metrics.d.ts +21 -1
  18. package/dest/metrics.d.ts.map +1 -1
  19. package/dest/metrics.js +47 -0
  20. package/dest/monitors/epoch-monitor.d.ts +1 -1
  21. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  22. package/dest/monitors/epoch-monitor.js +11 -9
  23. package/dest/prover-node-publisher.d.ts +22 -3
  24. package/dest/prover-node-publisher.d.ts.map +1 -1
  25. package/dest/prover-node-publisher.js +202 -7
  26. package/dest/prover-node.d.ts +24 -14
  27. package/dest/prover-node.d.ts.map +1 -1
  28. package/dest/prover-node.js +91 -41
  29. package/dest/prover-publisher-factory.d.ts +4 -4
  30. package/dest/prover-publisher-factory.d.ts.map +1 -1
  31. package/dest/prover-publisher-factory.js +3 -3
  32. package/package.json +23 -22
  33. package/src/actions/download-epoch-proving-job.ts +1 -1
  34. package/src/actions/rerun-epoch-proving-job.ts +17 -6
  35. package/src/actions/upload-epoch-proof-failure.ts +1 -1
  36. package/src/bin/run-failed-epoch.ts +5 -3
  37. package/src/config.ts +23 -31
  38. package/src/factory.ts +68 -103
  39. package/src/job/epoch-proving-job.ts +137 -41
  40. package/src/metrics.ts +71 -0
  41. package/src/monitors/epoch-monitor.ts +5 -6
  42. package/src/prover-node-publisher.ts +235 -12
  43. package/src/prover-node.ts +98 -55
  44. package/src/prover-publisher-factory.ts +5 -5
@@ -1,3 +1,68 @@
1
+ function _ts_add_disposable_resource(env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() {
16
+ try {
17
+ inner.call(this);
18
+ } catch (e) {
19
+ return Promise.reject(e);
20
+ }
21
+ };
22
+ env.stack.push({
23
+ value: value,
24
+ dispose: dispose,
25
+ async: async
26
+ });
27
+ } else if (async) {
28
+ env.stack.push({
29
+ async: true
30
+ });
31
+ }
32
+ return value;
33
+ }
34
+ function _ts_dispose_resources(env) {
35
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
36
+ var e = new Error(message);
37
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
38
+ };
39
+ return (_ts_dispose_resources = function _ts_dispose_resources(env) {
40
+ function fail(e) {
41
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
42
+ env.hasError = true;
43
+ }
44
+ var r, s = 0;
45
+ function next() {
46
+ while(r = env.stack.pop()){
47
+ try {
48
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
49
+ if (r.dispose) {
50
+ var result = r.dispose.call(r.value);
51
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
52
+ fail(e);
53
+ return next();
54
+ });
55
+ } else s |= 1;
56
+ } catch (e) {
57
+ fail(e);
58
+ }
59
+ }
60
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
61
+ if (env.hasError) throw env.error;
62
+ }
63
+ return next();
64
+ })(env);
65
+ }
1
66
  function applyDecs2203RFactory() {
2
67
  function createAddInitializerMethod(initializers, decoratorFinishedRef) {
3
68
  return function addInitializer(initializer) {
@@ -371,21 +436,19 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
436
  return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
372
437
  }
373
438
  var _dec, _initProto;
374
- import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
375
439
  import { asyncPool } from '@aztec/foundation/async-pool';
376
440
  import { BlockNumber } from '@aztec/foundation/branded-types';
377
- import { padArrayEnd } from '@aztec/foundation/collection';
378
- import { Fr } from '@aztec/foundation/curves/bn254';
379
441
  import { createLogger } from '@aztec/foundation/log';
380
442
  import { RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
381
443
  import { Timer } from '@aztec/foundation/timer';
444
+ import { AVM_MAX_CONCURRENT_SIMULATIONS } from '@aztec/native';
382
445
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
383
446
  import { protocolContractsHash } from '@aztec/protocol-contracts';
384
447
  import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
385
448
  import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
386
449
  import { EpochProvingJobTerminalState } from '@aztec/stdlib/interfaces/server';
450
+ import { appendL1ToL2MessagesToTree } from '@aztec/stdlib/messaging';
387
451
  import { CheckpointConstantData } from '@aztec/stdlib/rollup';
388
- import { MerkleTreeId } from '@aztec/stdlib/trees';
389
452
  import { Attributes, trackSpan } from '@aztec/telemetry-client';
390
453
  import * as crypto from 'node:crypto';
391
454
  import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
@@ -421,6 +484,7 @@ _dec = trackSpan('EpochProvingJob.run', function() {
421
484
  log;
422
485
  uuid;
423
486
  runPromise;
487
+ abortController;
424
488
  epochCheckPromise;
425
489
  deadlineTimeoutHandler;
426
490
  tracer;
@@ -435,6 +499,7 @@ _dec = trackSpan('EpochProvingJob.run', function() {
435
499
  this.deadline = deadline;
436
500
  this.config = config;
437
501
  this.state = (_initProto(this), 'initialized');
502
+ this.abortController = new AbortController();
438
503
  validateEpochProvingJobData(data);
439
504
  this.uuid = crypto.randomUUID();
440
505
  this.log = createLogger('prover-node:epoch-proving-job', {
@@ -498,15 +563,22 @@ _dec = trackSpan('EpochProvingJob.run', function() {
498
563
  const { promise, resolve } = promiseWithResolvers();
499
564
  this.runPromise = promise;
500
565
  try {
566
+ const blobTimer = new Timer();
501
567
  const blobFieldsPerCheckpoint = this.checkpoints.map((checkpoint)=>checkpoint.toBlobFields());
502
568
  const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
569
+ this.metrics.recordBlobProcessing(blobTimer.ms());
503
570
  this.prover.startNewEpoch(epochNumber, epochSizeCheckpoints, finalBlobBatchingChallenges);
571
+ const chonkTimer = new Timer();
504
572
  await this.prover.startChonkVerifierCircuits(Array.from(this.txs.values()));
573
+ this.metrics.recordChonkVerifier(chonkTimer.ms());
505
574
  // Everything in the epoch should have the same chainId and version.
506
575
  const { chainId, version } = this.checkpoints[0].blocks[0].header.globalVariables;
507
576
  const previousBlockHeaders = this.gatherPreviousBlockHeaders();
508
- await asyncPool(this.config.parallelBlockLimit ?? 32, this.checkpoints, async (checkpoint)=>{
577
+ const allCheckpointsTimer = new Timer();
578
+ const parallelism = this.config.parallelBlockLimit ? this.config.parallelBlockLimit : AVM_MAX_CONCURRENT_SIMULATIONS > 0 ? AVM_MAX_CONCURRENT_SIMULATIONS : this.checkpoints.length;
579
+ await this.processCheckpoints(parallelism, async (checkpoint)=>{
509
580
  this.checkState();
581
+ const checkpointTimer = new Timer();
510
582
  const checkpointIndex = checkpoint.number - fromCheckpoint;
511
583
  const checkpointConstants = CheckpointConstantData.from({
512
584
  chainId,
@@ -521,15 +593,18 @@ _dec = trackSpan('EpochProvingJob.run', function() {
521
593
  });
522
594
  const previousHeader = previousBlockHeaders[checkpointIndex];
523
595
  const l1ToL2Messages = this.getL1ToL2Messages(checkpoint);
524
- this.log.verbose(`Starting processing checkpoint ${checkpoint.number}`, {
596
+ this.log.debug(`Starting processing checkpoint ${checkpoint.number}`, {
525
597
  number: checkpoint.number,
526
598
  checkpointHash: checkpoint.hash().toString(),
527
- lastArchive: checkpoint.header.lastArchiveRoot,
528
- previousHeader: previousHeader.hash(),
599
+ headerHash: checkpoint.header.hash().toString(),
600
+ numL1ToL2Messages: l1ToL2Messages.length,
601
+ previousBlockNumber: previousHeader.globalVariables.blockNumber,
529
602
  uuid: this.uuid
530
603
  });
531
604
  await this.prover.startNewCheckpoint(checkpointIndex, checkpointConstants, l1ToL2Messages, checkpoint.blocks.length, previousHeader);
532
- for (const block of checkpoint.blocks){
605
+ for(let blockIndex = 0; blockIndex < checkpoint.blocks.length; blockIndex++){
606
+ const blockTimer = new Timer();
607
+ const block = checkpoint.blocks[blockIndex];
533
608
  const globalVariables = block.header.globalVariables;
534
609
  const txs = this.getTxs(block);
535
610
  this.log.verbose(`Starting processing block ${block.number}`, {
@@ -544,20 +619,38 @@ _dec = trackSpan('EpochProvingJob.run', function() {
544
619
  });
545
620
  // Start block proving
546
621
  await this.prover.startNewBlock(block.number, globalVariables.timestamp, txs.length);
547
- // Process public fns
548
- const db = await this.createFork(BlockNumber(block.number - 1), l1ToL2Messages);
549
- const config = PublicSimulatorConfig.from({
550
- proverId: this.prover.getProverId().toField(),
551
- skipFeeEnforcement: false,
552
- collectDebugLogs: false,
553
- collectHints: true,
554
- collectPublicInputs: true,
555
- collectStatistics: false
556
- });
557
- const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
558
- const processed = await this.processTxs(publicProcessor, txs);
559
- await this.prover.addTxs(processed);
560
- await db.close();
622
+ // Process public fns. L1 to L2 messages are only inserted for the first block of a checkpoint,
623
+ // as the fork for subsequent blocks already includes them from the previous block's synced state.
624
+ {
625
+ const env = {
626
+ stack: [],
627
+ error: void 0,
628
+ hasError: false
629
+ };
630
+ try {
631
+ const db = _ts_add_disposable_resource(env, await this.createFork(BlockNumber(block.number - 1), blockIndex === 0 ? l1ToL2Messages : undefined), true);
632
+ this.checkState();
633
+ const config = PublicSimulatorConfig.from({
634
+ proverId: this.prover.getProverId().toField(),
635
+ skipFeeEnforcement: false,
636
+ collectDebugLogs: false,
637
+ collectHints: true,
638
+ collectPublicInputs: true,
639
+ collectStatistics: false
640
+ });
641
+ const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
642
+ const processed = await this.processTxs(publicProcessor, txs);
643
+ this.checkState();
644
+ await this.prover.addTxs(processed);
645
+ } catch (e) {
646
+ env.error = e;
647
+ env.hasError = true;
648
+ } finally{
649
+ const result = _ts_dispose_resources(env);
650
+ if (result) await result;
651
+ }
652
+ }
653
+ this.checkState();
561
654
  this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
562
655
  blockNumber: block.number,
563
656
  blockHash: (await block.hash()).toString(),
@@ -566,8 +659,11 @@ _dec = trackSpan('EpochProvingJob.run', function() {
566
659
  // Mark block as completed to pad it
567
660
  const expectedBlockHeader = block.header;
568
661
  await this.prover.setBlockCompleted(block.number, expectedBlockHeader);
662
+ this.metrics.recordBlockProcessing(blockTimer.ms());
569
663
  }
664
+ this.metrics.recordCheckpointProcessing(checkpointTimer.ms());
570
665
  });
666
+ this.metrics.recordAllCheckpointsProcessing(allCheckpointsTimer.ms());
571
667
  const executionTime = timer.ms();
572
668
  this.progressState('awaiting-prover');
573
669
  const { publicInputs, proof, batchedBlobInputs } = await this.prover.finalizeEpoch();
@@ -578,7 +674,20 @@ _dec = trackSpan('EpochProvingJob.run', function() {
578
674
  });
579
675
  this.progressState('publishing-proof');
580
676
  if (this.config.skipSubmitProof) {
581
- this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`);
677
+ this.log.info(`Proof publishing is disabled. Analyzing estimated L1 fees for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`);
678
+ try {
679
+ await this.publisher.analyzeEpochProofSubmission({
680
+ fromCheckpoint,
681
+ toCheckpoint,
682
+ epochNumber,
683
+ publicInputs,
684
+ proof,
685
+ batchedBlobInputs,
686
+ attestations
687
+ });
688
+ } catch (err) {
689
+ this.log.warn(`Failed to analyze estimated L1 fees for epoch ${epochNumber}`, err);
690
+ }
582
691
  this.state = 'completed';
583
692
  this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeCheckpoints, epochSizeBlocks, epochSizeTxs);
584
693
  return;
@@ -625,17 +734,64 @@ _dec = trackSpan('EpochProvingJob.run', function() {
625
734
  }
626
735
  }
627
736
  /**
628
- * Create a new db fork for tx processing, inserting all L1 to L2.
737
+ * Create a new db fork for tx processing, optionally inserting L1 to L2 messages.
738
+ * L1 to L2 messages should only be inserted for the first block in a checkpoint,
739
+ * as subsequent blocks' synced state already includes them.
629
740
  * REFACTOR: The prover already spawns a db fork of its own for each block, so we may be able to do away with just one fork.
630
741
  */ async createFork(blockNumber, l1ToL2Messages) {
631
- const db = await this.dbProvider.fork(blockNumber);
632
- const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 'Too many L1 to L2 messages');
633
- this.log.verbose(`Creating fork at ${blockNumber} with ${l1ToL2Messages.length} L1 to L2 messages`, {
634
- blockNumber,
635
- l1ToL2Messages: l1ToL2Messages.map((m)=>m.toString())
742
+ const env = {
743
+ stack: [],
744
+ error: void 0,
745
+ hasError: false
746
+ };
747
+ try {
748
+ this.log.verbose(`Creating fork at ${blockNumber}`, {
749
+ blockNumber
750
+ });
751
+ const cleanup = _ts_add_disposable_resource(env, new AsyncDisposableStack(), true);
752
+ const db = cleanup.use(await this.dbProvider.fork(blockNumber));
753
+ if (l1ToL2Messages !== undefined) {
754
+ this.log.verbose(`Inserting ${l1ToL2Messages.length} L1 to L2 messages in fork`, {
755
+ blockNumber,
756
+ l1ToL2Messages: l1ToL2Messages.map((m)=>m.toString())
757
+ });
758
+ await appendL1ToL2MessagesToTree(db, l1ToL2Messages);
759
+ }
760
+ // everything run succesfully so we can release this stack and give control of the fork's lifetime to the caller
761
+ cleanup.move();
762
+ return db;
763
+ } catch (e) {
764
+ env.error = e;
765
+ env.hasError = true;
766
+ } finally{
767
+ const result = _ts_dispose_resources(env);
768
+ if (result) await result;
769
+ }
770
+ }
771
+ async processCheckpoints(parallelism, processCheckpoint) {
772
+ let hasError = false;
773
+ let firstError;
774
+ await asyncPool(Math.max(parallelism, 1), this.checkpoints, async (checkpoint)=>{
775
+ if (hasError || this.abortController.signal.aborted) {
776
+ return;
777
+ }
778
+ try {
779
+ this.checkState();
780
+ await processCheckpoint(checkpoint);
781
+ } catch (err) {
782
+ if (!hasError) {
783
+ hasError = true;
784
+ firstError = err;
785
+ this.failProcessing();
786
+ }
787
+ }
636
788
  });
637
- await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
638
- return db;
789
+ if (hasError) {
790
+ throw firstError;
791
+ }
792
+ if (this.abortController.signal.aborted) {
793
+ this.checkState();
794
+ }
639
795
  }
640
796
  progressState(state) {
641
797
  this.checkState();
@@ -648,11 +804,21 @@ _dec = trackSpan('EpochProvingJob.run', function() {
648
804
  }
649
805
  async stop(state = 'stopped') {
650
806
  this.state = state;
651
- this.prover.cancel();
807
+ this.interruptProcessing();
652
808
  if (this.runPromise) {
653
809
  await this.runPromise;
654
810
  }
655
811
  }
812
+ failProcessing() {
813
+ if (!EpochProvingJobTerminalState.includes(this.state)) {
814
+ this.state = 'failed';
815
+ }
816
+ this.interruptProcessing();
817
+ }
818
+ interruptProcessing() {
819
+ this.abortController.abort();
820
+ this.prover.cancel();
821
+ }
656
822
  scheduleDeadlineStop() {
657
823
  const deadline = this.deadline;
658
824
  if (deadline) {
@@ -688,7 +854,10 @@ _dec = trackSpan('EpochProvingJob.run', function() {
688
854
  }
689
855
  const intervalMs = Math.ceil((await l2BlockSource.getL1Constants()).ethereumSlotDuration / 2) * 1000;
690
856
  this.epochCheckPromise = new RunningPromise(async ()=>{
691
- const blockHeaders = await l2BlockSource.getCheckpointedBlockHeadersForEpoch(this.epochNumber);
857
+ const blockHeaders = (await l2BlockSource.getBlocksData({
858
+ epoch: this.epochNumber,
859
+ onlyCheckpointed: true
860
+ })).map((d)=>d.header);
692
861
  const blockHashes = await Promise.all(blockHeaders.map((header)=>header.hash()));
693
862
  const thisBlocks = this.checkpoints.flatMap((checkpoint)=>checkpoint.blocks);
694
863
  const thisBlockHashes = await Promise.all(thisBlocks.map((block)=>block.hash()));
@@ -720,8 +889,10 @@ _dec = trackSpan('EpochProvingJob.run', function() {
720
889
  async processTxs(publicProcessor, txs) {
721
890
  const { deadline } = this;
722
891
  const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
723
- deadline
892
+ deadline,
893
+ signal: this.abortController.signal
724
894
  });
895
+ this.checkState();
725
896
  if (failedTxs.length) {
726
897
  const failedTxHashes = await Promise.all(failedTxs.map(({ tx })=>tx.getTxHash()));
727
898
  throw new Error(`Txs failed processing: ${failedTxs.map(({ error }, index)=>`${failedTxHashes[index]} (${error})`).join(', ')}`);
package/dest/metrics.d.ts CHANGED
@@ -11,8 +11,18 @@ export declare class ProverNodeJobMetrics {
11
11
  provingJobCheckpoints: Gauge;
12
12
  provingJobBlocks: Gauge;
13
13
  provingJobTransactions: Gauge;
14
+ private blobProcessingDuration;
15
+ private chonkVerifierDuration;
16
+ private blockProcessingDuration;
17
+ private checkpointProcessingDuration;
18
+ private allCheckpointsProcessingDuration;
14
19
  constructor(meter: Meter, tracer: Tracer, logger?: import("@aztec/foundation/log").Logger);
15
20
  recordProvingJob(executionTimeMs: number, totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
21
+ recordBlobProcessing(durationMs: number): void;
22
+ recordChonkVerifier(durationMs: number): void;
23
+ recordBlockProcessing(durationMs: number): void;
24
+ recordCheckpointProcessing(durationMs: number): void;
25
+ recordAllCheckpointsProcessing(durationMs: number): void;
16
26
  }
17
27
  export declare class ProverNodeRewardsMetrics {
18
28
  private meter;
@@ -28,6 +38,12 @@ export declare class ProverNodeRewardsMetrics {
28
38
  stop(): void;
29
39
  private observe;
30
40
  }
41
+ export type EstimatedSubmitProofStats = {
42
+ gasLimit: bigint;
43
+ baseFeePerGas: bigint;
44
+ maxPriorityFeePerGas: bigint;
45
+ estimatedTotalFee: bigint;
46
+ };
31
47
  export declare class ProverNodePublisherMetrics {
32
48
  readonly client: TelemetryClient;
33
49
  private logger;
@@ -40,12 +56,16 @@ export declare class ProverNodePublisherMetrics {
40
56
  txBlobDataGasUsed: Histogram;
41
57
  txBlobDataGasCost: Histogram;
42
58
  txTotalFee: Histogram;
59
+ private txGasEstimated;
60
+ private gasPriceEstimated;
61
+ private txTotalFeeEstimated;
43
62
  private senderBalance;
44
63
  private meter;
45
64
  constructor(client: TelemetryClient, name?: string, logger?: import("@aztec/foundation/log").Logger);
46
65
  recordFailedTx(): void;
47
66
  recordSubmitProof(durationMs: number, stats: L1PublishProofStats): void;
67
+ recordEstimatedSubmitProof(stats: EstimatedSubmitProofStats): void;
48
68
  recordSenderBalance(wei: bigint, senderAddress: string): void;
49
69
  private recordTx;
50
70
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxxQkFBYSxvQkFBb0I7SUFRN0IsT0FBTyxDQUFDLEtBQUs7YUFDRyxNQUFNLEVBQUUsTUFBTTtJQUM5QixPQUFPLENBQUMsTUFBTTtJQVRoQiw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDeEMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQzlCLHFCQUFxQixFQUFFLEtBQUssQ0FBQztJQUM3QixnQkFBZ0IsRUFBRSxLQUFLLENBQUM7SUFDeEIsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO0lBRTlCLFlBQ1UsS0FBSyxFQUFFLEtBQUssRUFDSixNQUFNLEVBQUUsTUFBTSxFQUN0QixNQUFNLHlDQUFnRCxFQU8vRDtJQUVNLGdCQUFnQixDQUNyQixlQUFlLEVBQUUsTUFBTSxFQUN2QixXQUFXLEVBQUUsTUFBTSxFQUNuQixjQUFjLEVBQUUsTUFBTSxFQUN0QixTQUFTLEVBQUUsTUFBTSxFQUNqQixNQUFNLEVBQUUsTUFBTSxRQU9mO0NBQ0Y7QUFFRCxxQkFBYSx3QkFBd0I7SUFPakMsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxNQUFNO0lBVGhCLE9BQU8sQ0FBQyxPQUFPLENBQWtCO0lBQ2pDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBZ0I7SUFDMUMsT0FBTyxDQUFDLFNBQVMsQ0FBTztJQUN4QixPQUFPLENBQUMscUJBQXFCLENBQUs7SUFFbEMsWUFDVSxLQUFLLEVBQUUsS0FBSyxFQUNaLFFBQVEsRUFBRSxVQUFVLEVBQ3BCLE1BQU0sRUFBRSxjQUFjLEVBQ3RCLE1BQU0seUNBQWdELEVBSy9EO0lBRVksS0FBSyxrQkFJakI7SUFFTSxJQUFJLFNBRVY7SUFFRCxPQUFPLENBQUMsT0FBTyxDQXdCYjtDQUNIO0FBRUQscUJBQWEsMEJBQTBCO2FBZW5CLE1BQU0sRUFBRSxlQUFlO0lBRXZDLE9BQU8sQ0FBQyxNQUFNO0lBaEJoQixRQUFRLEVBQUUsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sRUFBRSxhQUFhLENBQUM7SUFDdkIsVUFBVSxFQUFFLFNBQVMsQ0FBQztJQUN0QixLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ2pCLGNBQWMsRUFBRSxTQUFTLENBQUM7SUFDMUIsYUFBYSxFQUFFLFNBQVMsQ0FBQztJQUN6QixpQkFBaUIsRUFBRSxTQUFTLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQzdCLFVBQVUsRUFBRSxTQUFTLENBQUM7SUFFdEIsT0FBTyxDQUFDLGFBQWEsQ0FBUTtJQUM3QixPQUFPLENBQUMsS0FBSyxDQUFRO0lBRXJCLFlBQ2tCLE1BQU0sRUFBRSxlQUFlLEVBQ3ZDLElBQUksU0FBZSxFQUNYLE1BQU0seUNBQWdELEVBMEIvRDtJQUVELGNBQWMsU0FLYjtJQUVELGlCQUFpQixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixRQUUvRDtJQUVNLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFLNUQ7SUFFRCxPQUFPLENBQUMsUUFBUTtDQXVDakIifQ==
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxxQkFBYSxvQkFBb0I7SUFjN0IsT0FBTyxDQUFDLEtBQUs7YUFDRyxNQUFNLEVBQUUsTUFBTTtJQUM5QixPQUFPLENBQUMsTUFBTTtJQWZoQiw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDeEMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQzlCLHFCQUFxQixFQUFFLEtBQUssQ0FBQztJQUM3QixnQkFBZ0IsRUFBRSxLQUFLLENBQUM7SUFDeEIsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO0lBRTlCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBUTtJQUN0QyxPQUFPLENBQUMscUJBQXFCLENBQVE7SUFDckMsT0FBTyxDQUFDLHVCQUF1QixDQUFZO0lBQzNDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBWTtJQUNoRCxPQUFPLENBQUMsZ0NBQWdDLENBQVE7SUFFaEQsWUFDVSxLQUFLLEVBQUUsS0FBSyxFQUNKLE1BQU0sRUFBRSxNQUFNLEVBQ3RCLE1BQU0seUNBQWdELEVBZS9EO0lBRU0sZ0JBQWdCLENBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLFdBQVcsRUFBRSxNQUFNLEVBQ25CLGNBQWMsRUFBRSxNQUFNLEVBQ3RCLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLE1BQU0sRUFBRSxNQUFNLFFBT2Y7SUFFTSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxRQUU3QztJQUVNLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxNQUFNLFFBRTVDO0lBRU0scUJBQXFCLENBQUMsVUFBVSxFQUFFLE1BQU0sUUFFOUM7SUFFTSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxRQUVuRDtJQUVNLDhCQUE4QixDQUFDLFVBQVUsRUFBRSxNQUFNLFFBRXZEO0NBQ0Y7QUFFRCxxQkFBYSx3QkFBd0I7SUFPakMsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxNQUFNO0lBVGhCLE9BQU8sQ0FBQyxPQUFPLENBQWtCO0lBQ2pDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBZ0I7SUFDMUMsT0FBTyxDQUFDLFNBQVMsQ0FBTztJQUN4QixPQUFPLENBQUMscUJBQXFCLENBQUs7SUFFbEMsWUFDVSxLQUFLLEVBQUUsS0FBSyxFQUNaLFFBQVEsRUFBRSxVQUFVLEVBQ3BCLE1BQU0sRUFBRSxjQUFjLEVBQ3RCLE1BQU0seUNBQWdELEVBSy9EO0lBRVksS0FBSyxrQkFJakI7SUFFTSxJQUFJLFNBRVY7SUFFRCxPQUFPLENBQUMsT0FBTyxDQXdCYjtDQUNIO0FBRUQsTUFBTSxNQUFNLHlCQUF5QixHQUFHO0lBQ3RDLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUN0QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO0NBQzNCLENBQUM7QUFFRixxQkFBYSwwQkFBMEI7YUFtQm5CLE1BQU0sRUFBRSxlQUFlO0lBRXZDLE9BQU8sQ0FBQyxNQUFNO0lBcEJoQixRQUFRLEVBQUUsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sRUFBRSxhQUFhLENBQUM7SUFDdkIsVUFBVSxFQUFFLFNBQVMsQ0FBQztJQUN0QixLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ2pCLGNBQWMsRUFBRSxTQUFTLENBQUM7SUFDMUIsYUFBYSxFQUFFLFNBQVMsQ0FBQztJQUN6QixpQkFBaUIsRUFBRSxTQUFTLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQzdCLFVBQVUsRUFBRSxTQUFTLENBQUM7SUFFdEIsT0FBTyxDQUFDLGNBQWMsQ0FBWTtJQUNsQyxPQUFPLENBQUMsaUJBQWlCLENBQVk7SUFDckMsT0FBTyxDQUFDLG1CQUFtQixDQUFZO0lBRXZDLE9BQU8sQ0FBQyxhQUFhLENBQVE7SUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixZQUNrQixNQUFNLEVBQUUsZUFBZSxFQUN2QyxJQUFJLFNBQWUsRUFDWCxNQUFNLHlDQUFnRCxFQWdDL0Q7SUFFRCxjQUFjLFNBS2I7SUFFRCxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsUUFFL0Q7SUFFTSwwQkFBMEIsQ0FBQyxLQUFLLEVBQUUseUJBQXlCLFFBa0JqRTtJQUVNLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFLNUQ7SUFFRCxPQUFPLENBQUMsUUFBUTtDQXVDakIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,KAAK,EAGV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,KAAK;aACG,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,MAAM;IAThB,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,qBAAqB,EAAE,KAAK,CAAC;IAC7B,gBAAgB,EAAE,KAAK,CAAC;IACxB,sBAAsB,EAAE,KAAK,CAAC;IAE9B,YACU,KAAK,EAAE,KAAK,EACJ,MAAM,EAAE,MAAM,EACtB,MAAM,yCAAgD,EAO/D;IAEM,gBAAgB,CACrB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,QAOf;CACF;AAED,qBAAa,wBAAwB;IAOjC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAThB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,qBAAqB,CAAK;IAElC,YACU,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,cAAc,EACtB,MAAM,yCAAgD,EAK/D;IAEY,KAAK,kBAIjB;IAEM,IAAI,SAEV;IAED,OAAO,CAAC,OAAO,CAwBb;CACH;AAED,qBAAa,0BAA0B;aAenB,MAAM,EAAE,eAAe;IAEvC,OAAO,CAAC,MAAM;IAhBhB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IAEtB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAQ;IAErB,YACkB,MAAM,EAAE,eAAe,EACvC,IAAI,SAAe,EACX,MAAM,yCAAgD,EA0B/D;IAED,cAAc,SAKb;IAED,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,QAE/D;IAEM,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAK5D;IAED,OAAO,CAAC,QAAQ;CAuCjB"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
package/dest/metrics.js CHANGED
@@ -10,6 +10,11 @@ export class ProverNodeJobMetrics {
10
10
  provingJobCheckpoints;
11
11
  provingJobBlocks;
12
12
  provingJobTransactions;
13
+ blobProcessingDuration;
14
+ chonkVerifierDuration;
15
+ blockProcessingDuration;
16
+ checkpointProcessingDuration;
17
+ allCheckpointsProcessingDuration;
13
18
  constructor(meter, tracer, logger = createLogger('prover-node:publisher:metrics')){
14
19
  this.meter = meter;
15
20
  this.tracer = tracer;
@@ -19,6 +24,11 @@ export class ProverNodeJobMetrics {
19
24
  this.provingJobCheckpoints = this.meter.createGauge(Metrics.PROVER_NODE_JOB_CHECKPOINTS);
20
25
  this.provingJobBlocks = this.meter.createGauge(Metrics.PROVER_NODE_JOB_BLOCKS);
21
26
  this.provingJobTransactions = this.meter.createGauge(Metrics.PROVER_NODE_JOB_TRANSACTIONS);
27
+ this.blobProcessingDuration = this.meter.createGauge(Metrics.PROVER_NODE_BLOB_PROCESSING_LAST_DURATION);
28
+ this.chonkVerifierDuration = this.meter.createGauge(Metrics.PROVER_NODE_CHONK_VERIFIER_LAST_DURATION);
29
+ this.blockProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_BLOCK_PROCESSING_DURATION);
30
+ this.checkpointProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_PROCESSING_DURATION);
31
+ this.allCheckpointsProcessingDuration = this.meter.createGauge(Metrics.PROVER_NODE_ALL_CHECKPOINTS_PROCESSING_LAST_DURATION);
22
32
  }
23
33
  recordProvingJob(executionTimeMs, totalTimeMs, numCheckpoints, numBlocks, numTxs) {
24
34
  this.proverEpochExecutionDuration.record(Math.ceil(executionTimeMs));
@@ -27,6 +37,21 @@ export class ProverNodeJobMetrics {
27
37
  this.provingJobBlocks.record(Math.floor(numBlocks));
28
38
  this.provingJobTransactions.record(Math.floor(numTxs));
29
39
  }
40
+ recordBlobProcessing(durationMs) {
41
+ this.blobProcessingDuration.record(Math.ceil(durationMs));
42
+ }
43
+ recordChonkVerifier(durationMs) {
44
+ this.chonkVerifierDuration.record(Math.ceil(durationMs));
45
+ }
46
+ recordBlockProcessing(durationMs) {
47
+ this.blockProcessingDuration.record(Math.ceil(durationMs));
48
+ }
49
+ recordCheckpointProcessing(durationMs) {
50
+ this.checkpointProcessingDuration.record(Math.ceil(durationMs));
51
+ }
52
+ recordAllCheckpointsProcessing(durationMs) {
53
+ this.allCheckpointsProcessingDuration.record(Math.ceil(durationMs));
54
+ }
30
55
  }
31
56
  export class ProverNodeRewardsMetrics {
32
57
  meter;
@@ -94,6 +119,9 @@ export class ProverNodePublisherMetrics {
94
119
  txBlobDataGasUsed;
95
120
  txBlobDataGasCost;
96
121
  txTotalFee;
122
+ txGasEstimated;
123
+ gasPriceEstimated;
124
+ txTotalFeeEstimated;
97
125
  senderBalance;
98
126
  meter;
99
127
  constructor(client, name = 'ProverNode', logger = createLogger('prover-node:publisher:metrics')){
@@ -117,6 +145,9 @@ export class ProverNodePublisherMetrics {
117
145
  this.txBlobDataGasUsed = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_USED);
118
146
  this.txBlobDataGasCost = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_COST);
119
147
  this.txTotalFee = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_TOTAL_FEE);
148
+ this.txGasEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_GAS);
149
+ this.gasPriceEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_GAS_PRICE);
150
+ this.txTotalFeeEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_TOTAL_FEE);
120
151
  this.senderBalance = this.meter.createGauge(Metrics.L1_PUBLISHER_BALANCE);
121
152
  }
122
153
  recordFailedTx() {
@@ -128,6 +159,22 @@ export class ProverNodePublisherMetrics {
128
159
  recordSubmitProof(durationMs, stats) {
129
160
  this.recordTx(durationMs, stats);
130
161
  }
162
+ recordEstimatedSubmitProof(stats) {
163
+ const attributes = {
164
+ [Attributes.L1_TX_TYPE]: 'submitProof'
165
+ };
166
+ this.txGasEstimated.record(Number(stats.gasLimit), attributes);
167
+ try {
168
+ this.gasPriceEstimated.record(parseInt(formatEther(stats.baseFeePerGas + stats.maxPriorityFeePerGas, 'gwei'), 10));
169
+ } catch {
170
+ // ignore
171
+ }
172
+ try {
173
+ this.txTotalFeeEstimated.record(parseFloat(formatEther(stats.estimatedTotalFee)));
174
+ } catch {
175
+ // ignore
176
+ }
177
+ }
131
178
  recordSenderBalance(wei, senderAddress) {
132
179
  const eth = parseFloat(formatEther(wei, 'wei'));
133
180
  this.senderBalance.record(eth, {
@@ -40,4 +40,4 @@ export declare class EpochMonitor implements Traceable {
40
40
  work(): Promise<void>;
41
41
  private getEpochNumberToProve;
42
42
  }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vbml0b3JzL2Vwb2NoLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTNFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUVoSCxNQUFNLFdBQVcsbUJBQW1CO0lBQ2xDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3JFO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHFCQUFhLFlBQWEsWUFBVyxTQUFTO0lBUzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYTtJQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFDNUIsT0FBTyxDQUFDLE9BQU87SUFWakIsT0FBTyxDQUFDLGNBQWMsQ0FBaUI7SUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBNkM7SUFDeEQsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsT0FBTyxDQUFrQztJQUNqRCxPQUFPLENBQUMsaUJBQWlCLENBQTBCO0lBRW5ELFlBQ21CLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEVBQzlELE9BQU8sRUFBRTtRQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQ3ZFLFNBQVMsR0FBRSxlQUFzQyxFQU9sRDtJQUVELE9BQW9CLE1BQU0sQ0FDeEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsT0FBTyxFQUFFO1FBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFDL0QsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FHdkI7SUFFTSxLQUFLLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUl4QztJQUVELDBCQUEwQjtJQUNuQixVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUU3QztJQUVZLElBQUksa0JBR2hCO0lBRVksSUFBSSxrQkEyQmhCO1lBRWEscUJBQXFCO0NBWXBDIn0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vbml0b3JzL2Vwb2NoLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTNFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUVoSCxNQUFNLFdBQVcsbUJBQW1CO0lBQ2xDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3JFO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHFCQUFhLFlBQWEsWUFBVyxTQUFTO0lBUzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYTtJQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFDNUIsT0FBTyxDQUFDLE9BQU87SUFWakIsT0FBTyxDQUFDLGNBQWMsQ0FBaUI7SUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBNkM7SUFDeEQsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsT0FBTyxDQUFrQztJQUNqRCxPQUFPLENBQUMsaUJBQWlCLENBQTBCO0lBRW5ELFlBQ21CLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEVBQzlELE9BQU8sRUFBRTtRQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQ3ZFLFNBQVMsR0FBRSxlQUFzQyxFQU9sRDtJQUVELE9BQW9CLE1BQU0sQ0FDeEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsT0FBTyxFQUFFO1FBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFDL0QsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FHdkI7SUFFTSxLQUFLLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUl4QztJQUVELDBCQUEwQjtJQUNuQixVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUU3QztJQUVZLElBQUksa0JBR2hCO0lBRVksSUFBSSxrQkEwQmhCO1lBRWEscUJBQXFCO0NBWXBDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"epoch-monitor.d.ts","sourceRoot":"","sources":["../../src/monitors/epoch-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAI3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAsB,MAAM,yBAAyB,CAAC;AAEhH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,SAAS;IAS1C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,GAAG,CAA6C;IACxD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAA0B;IAEnD,YACmB,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAC9D,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EACvE,SAAS,GAAE,eAAsC,EAOlD;IAED,OAAoB,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EAC/D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,YAAY,CAAC,CAGvB;IAEM,KAAK,CAAC,OAAO,EAAE,mBAAmB,QAIxC;IAED,0BAA0B;IACnB,UAAU,CAAC,OAAO,EAAE,mBAAmB,QAE7C;IAEY,IAAI,kBAGhB;IAEY,IAAI,kBA2BhB;YAEa,qBAAqB;CAYpC"}
1
+ {"version":3,"file":"epoch-monitor.d.ts","sourceRoot":"","sources":["../../src/monitors/epoch-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAI3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAsB,MAAM,yBAAyB,CAAC;AAEhH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,SAAS;IAS1C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,GAAG,CAA6C;IACxD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAA0B;IAEnD,YACmB,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAC9D,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EACvE,SAAS,GAAE,eAAsC,EAOlD;IAED,OAAoB,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EAC/D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,YAAY,CAAC,CAGvB;IAEM,KAAK,CAAC,OAAO,EAAE,mBAAmB,QAIxC;IAED,0BAA0B;IACnB,UAAU,CAAC,OAAO,EAAE,mBAAmB,QAE7C;IAEY,IAAI,kBAGhB;IAEY,IAAI,kBA0BhB;YAEa,qBAAqB;CAYpC"}
@@ -52,13 +52,11 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
52
52
  }
53
53
  async work() {
54
54
  const { epochToProve, blockNumber, slotNumber } = await this.getEpochNumberToProve();
55
- this.log.debug(`Epoch to prove: ${epochToProve}`, {
56
- blockNumber,
57
- slotNumber
58
- });
59
55
  if (epochToProve === undefined) {
60
56
  this.log.trace(`Next block to prove ${blockNumber} not yet mined`, {
61
- blockNumber
57
+ epochToProve,
58
+ blockNumber,
59
+ slotNumber
62
60
  });
63
61
  return;
64
62
  }
@@ -80,18 +78,22 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
80
78
  return;
81
79
  }
82
80
  if (this.options.provingDelayMs) {
83
- this.log.debug(`Waiting ${this.options.provingDelayMs}ms before proving epoch ${epochToProve}`);
81
+ this.log.warn(`Waiting ${this.options.provingDelayMs}ms before proving epoch ${epochToProve}`);
84
82
  await sleep(this.options.provingDelayMs);
85
83
  }
86
- this.log.debug(`Epoch ${epochToProve} is ready to be proven`);
84
+ this.log.verbose(`Epoch ${epochToProve} is ready to be proven`);
87
85
  if (await this.handler?.handleEpochReadyToProve(epochToProve)) {
88
86
  this.latestEpochNumber = epochToProve;
89
87
  }
90
88
  }
91
89
  async getEpochNumberToProve() {
92
- const lastBlockProven = await this.l2BlockSource.getProvenBlockNumber();
90
+ const lastBlockProven = await this.l2BlockSource.getBlockNumber({
91
+ tag: 'proven'
92
+ }) ?? BlockNumber.ZERO;
93
93
  const firstBlockToProve = BlockNumber(lastBlockProven + 1);
94
- const firstBlockHeaderToProve = await this.l2BlockSource.getBlockHeader(firstBlockToProve);
94
+ const firstBlockHeaderToProve = (await this.l2BlockSource.getBlockData({
95
+ number: firstBlockToProve
96
+ }))?.header;
95
97
  if (!firstBlockHeaderToProve) {
96
98
  return {
97
99
  epochToProve: undefined,
@@ -1,5 +1,5 @@
1
1
  import { BatchedBlob } from '@aztec/blob-lib';
2
- import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
2
+ import { MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
3
3
  import type { RollupContract, ViemCommitteeAttestation } from '@aztec/ethereum/contracts';
4
4
  import type { L1TxUtils } from '@aztec/ethereum/l1-tx-utils';
5
5
  import { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
@@ -19,7 +19,7 @@ export type L1SubmitEpochProofArgs = {
19
19
  endTimestamp: Fr;
20
20
  outHash: Fr;
21
21
  proverId: Fr;
22
- fees: Tuple<FeeRecipient, typeof AZTEC_MAX_EPOCH_DURATION>;
22
+ fees: Tuple<FeeRecipient, typeof MAX_CHECKPOINTS_PER_EPOCH>;
23
23
  proof: Proof;
24
24
  };
25
25
  export declare class ProverNodePublisher {
@@ -53,9 +53,28 @@ export declare class ProverNodePublisher {
53
53
  batchedBlobInputs: BatchedBlob;
54
54
  attestations: ViemCommitteeAttestation[];
55
55
  }): Promise<boolean>;
56
+ private waitUntilStartBuildsOnProven;
57
+ private getProvenCheckpoint;
58
+ private isStartBuildingOnProven;
59
+ private getSecondsUntilProofSubmissionWindowEnd;
56
60
  private validateEpochProofSubmission;
61
+ /**
62
+ * Estimates what submitting the epoch proof would have cost on L1 without actually sending it.
63
+ * Runs the same validation as `submitEpochProof`, encodes the calldata, estimates gas, and records metrics.
64
+ * Used when proof publishing is disabled (e.g. PROVER_NODE_DISABLE_PROOF_PUBLISH=true on mainnet).
65
+ */
66
+ analyzeEpochProofSubmission(args: {
67
+ epochNumber: EpochNumber;
68
+ fromCheckpoint: CheckpointNumber;
69
+ toCheckpoint: CheckpointNumber;
70
+ publicInputs: RootRollupPublicInputs;
71
+ proof: Proof;
72
+ batchedBlobInputs: BatchedBlob;
73
+ attestations: ViemCommitteeAttestation[];
74
+ }): Promise<void>;
75
+ private encodeSubmitEpochProofCalldata;
57
76
  private sendSubmitEpochProofTx;
58
77
  private getEpochProofPublicInputsArgs;
59
78
  private getSubmitEpochProofArgs;
60
79
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUtcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3pELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFPbkYsc0VBQXNFO0FBQ3RFLE1BQU0sTUFBTSxzQkFBc0IsR0FBRztJQUNuQyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDcEIsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxFQUFFLENBQUM7SUFDakIsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNaLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLHdCQUF3QixDQUFDLENBQUM7SUFDM0QsS0FBSyxFQUFFLEtBQUssQ0FBQztDQUNkLENBQUM7QUFFRixxQkFBYSxtQkFBbUI7SUFDOUIsT0FBTyxDQUFDLFdBQVcsQ0FBUztJQUM1QixPQUFPLENBQUMsT0FBTyxDQUE2QjtJQUU1QyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztJQUV0QixTQUFTLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQztJQUV6QyxTQUFnQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBRXJDLFlBQ0UsTUFBTSxFQUFFLGNBQWMsR0FBRyxlQUFlLEVBQ3hDLElBQUksRUFBRTtRQUNKLGNBQWMsRUFBRSxjQUFjLENBQUM7UUFDL0IsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNyQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7S0FDN0IsRUFDRCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBUzFCO0lBRU0saUJBQWlCLG1CQUV2QjtJQUVEOzs7OztPQUtHO0lBQ0ksU0FBUyxTQUdmO0lBRUQsd0RBQXdEO0lBQ2pELE9BQU8sU0FHYjtJQUVNLGdCQUFnQixlQUV0QjtJQUVZLGdCQUFnQixDQUFDLElBQUksRUFBRTtRQUNsQyxXQUFXLEVBQUUsV0FBVyxDQUFDO1FBQ3pCLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQztRQUNqQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0IsWUFBWSxFQUFFLHNCQUFzQixDQUFDO1FBQ3JDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDYixpQkFBaUIsRUFBRSxXQUFXLENBQUM7UUFDL0IsWUFBWSxFQUFFLHdCQUF3QixFQUFFLENBQUM7S0FDMUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBaURuQjtZQUVhLDRCQUE0QjtZQStENUIsc0JBQXNCO0lBNENwQyxPQUFPLENBQUMsNkJBQTZCO0lBMEJyQyxPQUFPLENBQUMsdUJBQXVCO0NBdUJoQyJ9
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUtcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3pELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUcvRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFPbkYsc0VBQXNFO0FBQ3RFLE1BQU0sTUFBTSxzQkFBc0IsR0FBRztJQUNuQyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDcEIsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxFQUFFLENBQUM7SUFDakIsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNaLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLHlCQUF5QixDQUFDLENBQUM7SUFDNUQsS0FBSyxFQUFFLEtBQUssQ0FBQztDQUNkLENBQUM7QUFFRixxQkFBYSxtQkFBbUI7SUFDOUIsT0FBTyxDQUFDLFdBQVcsQ0FBUztJQUM1QixPQUFPLENBQUMsT0FBTyxDQUE2QjtJQUU1QyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztJQUV0QixTQUFTLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQztJQUV6QyxTQUFnQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBRXJDLFlBQ0UsTUFBTSxFQUFFLGNBQWMsR0FBRyxlQUFlLEVBQ3hDLElBQUksRUFBRTtRQUNKLGNBQWMsRUFBRSxjQUFjLENBQUM7UUFDL0IsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNyQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7S0FDN0IsRUFDRCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBUzFCO0lBRU0saUJBQWlCLG1CQUV2QjtJQUVEOzs7OztPQUtHO0lBQ0ksU0FBUyxTQUdmO0lBRUQsd0RBQXdEO0lBQ2pELE9BQU8sU0FHYjtJQUVNLGdCQUFnQixlQUV0QjtJQUVZLGdCQUFnQixDQUFDLElBQUksRUFBRTtRQUNsQyxXQUFXLEVBQUUsV0FBVyxDQUFDO1FBQ3pCLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQztRQUNqQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0IsWUFBWSxFQUFFLHNCQUFzQixDQUFDO1FBQ3JDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDYixpQkFBaUIsRUFBRSxXQUFXLENBQUM7UUFDL0IsWUFBWSxFQUFFLHdCQUF3QixFQUFFLENBQUM7S0FDMUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBc0RuQjtZQUVhLDRCQUE0QjtZQWlDNUIsbUJBQW1CO0lBSWpDLE9BQU8sQ0FBQyx1QkFBdUI7WUFJakIsdUNBQXVDO1lBTXZDLDRCQUE0QjtJQW1FMUM7Ozs7T0FJRztJQUNVLDJCQUEyQixDQUFDLElBQUksRUFBRTtRQUM3QyxXQUFXLEVBQUUsV0FBVyxDQUFDO1FBQ3pCLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQztRQUNqQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0IsWUFBWSxFQUFFLHNCQUFzQixDQUFDO1FBQ3JDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDYixpQkFBaUIsRUFBRSxXQUFXLENBQUM7UUFDL0IsWUFBWSxFQUFFLHdCQUF3QixFQUFFLENBQUM7S0FDMUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBc0NoQjtJQUVELE9BQU8sQ0FBQyw4QkFBOEI7WUFleEIsc0JBQXNCO0lBNENwQyxPQUFPLENBQUMsNkJBQTZCO0lBMEJyQyxPQUFPLENBQUMsdUJBQXVCO0NBdUJoQyJ9