@aztec/prover-node 0.0.1-commit.d3ec352c → 0.0.1-commit.d58ff9d0

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 (81) hide show
  1. package/README.md +518 -0
  2. package/dest/actions/download-epoch-proving-job.d.ts +1 -1
  3. package/dest/actions/download-epoch-proving-job.js +1 -1
  4. package/dest/actions/rerun-epoch-proving-job.d.ts +6 -4
  5. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
  6. package/dest/actions/rerun-epoch-proving-job.js +191 -28
  7. package/dest/actions/upload-epoch-proof-failure.d.ts +2 -2
  8. package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -1
  9. package/dest/bin/run-failed-epoch.js +6 -5
  10. package/dest/checkpoint-store.d.ts +87 -0
  11. package/dest/checkpoint-store.d.ts.map +1 -0
  12. package/dest/checkpoint-store.js +186 -0
  13. package/dest/config.d.ts +10 -10
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/config.js +27 -22
  16. package/dest/factory.d.ts +23 -16
  17. package/dest/factory.d.ts.map +1 -1
  18. package/dest/factory.js +49 -68
  19. package/dest/index.d.ts +3 -1
  20. package/dest/index.d.ts.map +1 -1
  21. package/dest/index.js +2 -0
  22. package/dest/job/checkpoint-prover.d.ts +134 -0
  23. package/dest/job/checkpoint-prover.d.ts.map +1 -0
  24. package/dest/job/checkpoint-prover.js +353 -0
  25. package/dest/job/epoch-proving-job-data.d.ts +2 -2
  26. package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
  27. package/dest/job/epoch-proving-job-data.js +1 -1
  28. package/dest/job/epoch-session.d.ts +146 -0
  29. package/dest/job/epoch-session.d.ts.map +1 -0
  30. package/dest/job/epoch-session.js +720 -0
  31. package/dest/job/top-tree-job.d.ts +82 -0
  32. package/dest/job/top-tree-job.d.ts.map +1 -0
  33. package/dest/job/top-tree-job.js +152 -0
  34. package/dest/metrics.d.ts +41 -4
  35. package/dest/metrics.d.ts.map +1 -1
  36. package/dest/metrics.js +125 -102
  37. package/dest/monitors/epoch-monitor.d.ts +1 -1
  38. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  39. package/dest/monitors/epoch-monitor.js +12 -19
  40. package/dest/proof-publishing-service.d.ts +161 -0
  41. package/dest/proof-publishing-service.d.ts.map +1 -0
  42. package/dest/proof-publishing-service.js +335 -0
  43. package/dest/prover-node-publisher.d.ts +31 -19
  44. package/dest/prover-node-publisher.d.ts.map +1 -1
  45. package/dest/prover-node-publisher.js +222 -78
  46. package/dest/prover-node.d.ts +122 -72
  47. package/dest/prover-node.d.ts.map +1 -1
  48. package/dest/prover-node.js +872 -229
  49. package/dest/prover-publisher-factory.d.ts +12 -6
  50. package/dest/prover-publisher-factory.d.ts.map +1 -1
  51. package/dest/prover-publisher-factory.js +8 -5
  52. package/dest/session-manager.d.ts +158 -0
  53. package/dest/session-manager.d.ts.map +1 -0
  54. package/dest/session-manager.js +452 -0
  55. package/dest/test/index.d.ts +7 -6
  56. package/dest/test/index.d.ts.map +1 -1
  57. package/package.json +25 -23
  58. package/src/actions/download-epoch-proving-job.ts +1 -1
  59. package/src/actions/rerun-epoch-proving-job.ts +120 -30
  60. package/src/actions/upload-epoch-proof-failure.ts +1 -1
  61. package/src/bin/run-failed-epoch.ts +5 -3
  62. package/src/checkpoint-store.ts +218 -0
  63. package/src/config.ts +39 -34
  64. package/src/factory.ts +86 -113
  65. package/src/index.ts +2 -0
  66. package/src/job/checkpoint-prover.ts +468 -0
  67. package/src/job/epoch-proving-job-data.ts +1 -1
  68. package/src/job/epoch-session.ts +436 -0
  69. package/src/job/top-tree-job.ts +227 -0
  70. package/src/metrics.ts +143 -93
  71. package/src/monitors/epoch-monitor.ts +6 -14
  72. package/src/proof-publishing-service.ts +427 -0
  73. package/src/prover-node-publisher.ts +264 -98
  74. package/src/prover-node.ts +568 -259
  75. package/src/prover-publisher-factory.ts +22 -11
  76. package/src/session-manager.ts +552 -0
  77. package/src/test/index.ts +6 -6
  78. package/dest/job/epoch-proving-job.d.ts +0 -62
  79. package/dest/job/epoch-proving-job.d.ts.map +0 -1
  80. package/dest/job/epoch-proving-job.js +0 -363
  81. package/src/job/epoch-proving-job.ts +0 -426
@@ -0,0 +1,82 @@
1
+ import type { BatchedBlob } from '@aztec/blob-lib/types';
2
+ import type { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import { type PromiseWithResolvers } from '@aztec/foundation/promise';
5
+ import type { EpochProverFactory } from '@aztec/prover-client';
6
+ import type { Proof } from '@aztec/stdlib/proofs';
7
+ import type { RootRollupPublicInputs } from '@aztec/stdlib/rollup';
8
+ import type { ProverNodeJobMetrics } from '../metrics.js';
9
+ import type { CheckpointProver } from './checkpoint-prover.js';
10
+ /** Result of a successful top-tree run. */
11
+ export type TopTreeProof = {
12
+ publicInputs: RootRollupPublicInputs;
13
+ proof: Proof;
14
+ batchedBlobInputs: BatchedBlob;
15
+ };
16
+ /**
17
+ * Hooks for tests to interpose around the underlying `topTree.prove(...)` call without
18
+ * monkey-patching the orchestrator.
19
+ */
20
+ export type TopTreeJobHooks = {
21
+ /** Called immediately before the top tree's `prove` runs. */
22
+ beforeProve?: () => Promise<void> | void;
23
+ /** Called after `prove` returns successfully (not on failure / cancellation). */
24
+ afterProve?: () => Promise<void> | void;
25
+ /**
26
+ * If set, called instead of running the underlying prove. Receives a thunk that
27
+ * runs the real call. Lets tests substitute a synthetic proof or delay/throw without
28
+ * re-implementing the rest of the finalize flow.
29
+ */
30
+ proveOverride?: (defaultProve: () => Promise<TopTreeProof>) => Promise<TopTreeProof>;
31
+ };
32
+ /**
33
+ * Self-contained top-tree job. Constructed from a snapshot of `CheckpointProver`s; runs
34
+ * `topTree.prove(...)` against their pending `blockProofs` promises and exposes the
35
+ * final epoch proof via `result`.
36
+ *
37
+ */
38
+ export declare class TopTreeJob {
39
+ private readonly epochNumber;
40
+ private readonly deps;
41
+ /** Resolves with the final proof on success; rejects on cancellation or any prove error. */
42
+ readonly result: PromiseWithResolvers<TopTreeProof>;
43
+ /** Snapshot of checkpoint jobs the top tree is built from, in checkpoint-number order. */
44
+ readonly snapshot: readonly CheckpointProver[];
45
+ private readonly topTree;
46
+ private readonly fromCheckpoint;
47
+ private readonly toCheckpoint;
48
+ private cancelled;
49
+ /** Tracks the cancel-driven background teardown so `whenDone()` can await it. */
50
+ private cancelPromise?;
51
+ private readonly executionTimer;
52
+ constructor(epochNumber: EpochNumber, snapshot: readonly CheckpointProver[], deps: {
53
+ proverFactory: EpochProverFactory;
54
+ metrics: ProverNodeJobMetrics;
55
+ log: Logger;
56
+ hooks?: TopTreeJobHooks;
57
+ });
58
+ /** Range covered by this attempt — useful for logging and L1 submission. */
59
+ getRange(): {
60
+ fromCheckpoint: CheckpointNumber;
61
+ toCheckpoint: CheckpointNumber;
62
+ count: number;
63
+ };
64
+ isCancelled(): boolean;
65
+ /** Wall-time since construction — used by the owning job for metrics. */
66
+ elapsedMs(): number;
67
+ /** Kicks off the prove. Returns the result promise (also available as `result.promise`). */
68
+ start(): Promise<TopTreeProof>;
69
+ /**
70
+ * Cancels the in-flight prove. Idempotent. Rejects the result promise with
71
+ * `TopTreeCancelledError`, then kicks off the underlying orchestrator's teardown
72
+ * in the background so callers don't block on it. The teardown promise is exposed
73
+ * via `whenDone()` — the parent collects the cancelled job and awaits all
74
+ * pending top-tree teardowns at the end of the epoch.
75
+ */
76
+ cancel(): void;
77
+ /** Resolves once the cancel-driven teardown of the underlying orchestrator has unwound. */
78
+ whenDone(): Promise<void>;
79
+ private runCancel;
80
+ private run;
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wLXRyZWUtam9iLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL3RvcC10cmVlLWpvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRixPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxvQkFBb0IsRUFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBTy9ELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkUsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCwyQ0FBMkM7QUFDM0MsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixZQUFZLEVBQUUsc0JBQXNCLENBQUM7SUFDckMsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUNiLGlCQUFpQixFQUFFLFdBQVcsQ0FBQztDQUNoQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1Qiw2REFBNkQ7SUFDN0QsV0FBVyxDQUFDLEVBQUUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLGlGQUFpRjtJQUNqRixVQUFVLENBQUMsRUFBRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDeEM7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztDQUN0RixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxxQkFBYSxVQUFVO0lBZ0JuQixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFFNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBakJ2Qiw0RkFBNEY7SUFDNUYsUUFBUSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBMEI7SUFFN0UsMEZBQTBGO0lBQzFGLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxnQkFBZ0IsRUFBRSxDQUFDO0lBRS9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFzQjtJQUM5QyxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBbUI7SUFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQW1CO0lBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQVM7SUFDMUIsaUZBQWlGO0lBQ2pGLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBZ0I7SUFDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWU7SUFFOUMsWUFDbUIsV0FBVyxFQUFFLFdBQVcsRUFDekMsUUFBUSxFQUFFLFNBQVMsZ0JBQWdCLEVBQUUsRUFDcEIsSUFBSSxFQUFFO1FBQ3JCLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQztRQUNsQyxPQUFPLEVBQUUsb0JBQW9CLENBQUM7UUFDOUIsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUNaLEtBQUssQ0FBQyxFQUFFLGVBQWUsQ0FBQztLQUN6QixFQThCRjtJQUVELDhFQUE0RTtJQUNyRSxRQUFRLElBQUk7UUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUM7UUFBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FFckc7SUFFTSxXQUFXLElBQUksT0FBTyxDQUU1QjtJQUVELDJFQUF5RTtJQUNsRSxTQUFTLElBQUksTUFBTSxDQUV6QjtJQUVELDRGQUE0RjtJQUNyRixLQUFLLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUdwQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sSUFBSSxJQUFJLENBbUJwQjtJQUVELDJGQUEyRjtJQUM5RSxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUlyQztZQUVhLFNBQVM7WUFhVCxHQUFHO0NBdURsQiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"top-tree-job.d.ts","sourceRoot":"","sources":["../../src/job/top-tree-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,oBAAoB,EAAwB,MAAM,2BAA2B,CAAC;AAE5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAO/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,2CAA2C;AAC3C,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,sBAAsB,CAAC;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,WAAW,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACtF,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,UAAU;IAgBnB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAjBvB,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAA0B;IAE7E,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAE/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,iFAAiF;IACjF,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAE9C,YACmB,WAAW,EAAE,WAAW,EACzC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACpB,IAAI,EAAE;QACrB,aAAa,EAAE,kBAAkB,CAAC;QAClC,OAAO,EAAE,oBAAoB,CAAC;QAC9B,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,eAAe,CAAC;KACzB,EA8BF;IAED,8EAA4E;IACrE,QAAQ,IAAI;QAAE,cAAc,EAAE,gBAAgB,CAAC;QAAC,YAAY,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAErG;IAEM,WAAW,IAAI,OAAO,CAE5B;IAED,2EAAyE;IAClE,SAAS,IAAI,MAAM,CAEzB;IAED,4FAA4F;IACrF,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CAGpC;IAED;;;;;;OAMG;IACI,MAAM,IAAI,IAAI,CAmBpB;IAED,2FAA2F;IAC9E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrC;YAEa,SAAS;YAaT,GAAG;CAuDlB"}
@@ -0,0 +1,152 @@
1
+ import { promiseWithResolvers } from '@aztec/foundation/promise';
2
+ import { Timer } from '@aztec/foundation/timer';
3
+ import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
4
+ import { TopTreeCancelledError } from '@aztec/prover-client/orchestrator';
5
+ /**
6
+ * Self-contained top-tree job. Constructed from a snapshot of `CheckpointProver`s; runs
7
+ * `topTree.prove(...)` against their pending `blockProofs` promises and exposes the
8
+ * final epoch proof via `result`.
9
+ *
10
+ */ export class TopTreeJob {
11
+ epochNumber;
12
+ deps;
13
+ /** Resolves with the final proof on success; rejects on cancellation or any prove error. */ result;
14
+ /** Snapshot of checkpoint jobs the top tree is built from, in checkpoint-number order. */ snapshot;
15
+ topTree;
16
+ fromCheckpoint;
17
+ toCheckpoint;
18
+ cancelled;
19
+ /** Tracks the cancel-driven background teardown so `whenDone()` can await it. */ cancelPromise;
20
+ executionTimer;
21
+ constructor(epochNumber, snapshot, deps){
22
+ this.epochNumber = epochNumber;
23
+ this.deps = deps;
24
+ this.result = promiseWithResolvers();
25
+ this.cancelled = false;
26
+ this.executionTimer = new Timer();
27
+ if (snapshot.length === 0) {
28
+ throw new Error(`Cannot construct TopTreeJob for epoch ${epochNumber}: empty snapshot`);
29
+ }
30
+ for(let i = 1; i < snapshot.length; i++){
31
+ const prev = snapshot[i - 1].checkpoint.number;
32
+ const curr = snapshot[i].checkpoint.number;
33
+ if (curr !== prev + 1) {
34
+ throw new Error(`Cannot construct TopTreeJob for epoch ${epochNumber}: checkpoint numbers must be contiguous, got gap between ${prev} and ${curr}`);
35
+ }
36
+ }
37
+ this.snapshot = snapshot;
38
+ this.fromCheckpoint = snapshot[0].checkpoint.number;
39
+ this.toCheckpoint = snapshot[snapshot.length - 1].checkpoint.number;
40
+ this.topTree = deps.proverFactory.createTopTreeOrchestrator();
41
+ deps.log.info(`Created TopTreeJob for epoch ${epochNumber} covering checkpoints ${this.fromCheckpoint}..${this.toCheckpoint}`, {
42
+ epochNumber,
43
+ fromCheckpoint: this.fromCheckpoint,
44
+ toCheckpoint: this.toCheckpoint,
45
+ checkpointCount: snapshot.length
46
+ });
47
+ // Mark the result's rejection branch as observed so a cancellation before any
48
+ // consumer awaits does not surface as unhandled.
49
+ this.result.promise.catch(()=>{});
50
+ }
51
+ /** Range covered by this attempt — useful for logging and L1 submission. */ getRange() {
52
+ return {
53
+ fromCheckpoint: this.fromCheckpoint,
54
+ toCheckpoint: this.toCheckpoint,
55
+ count: this.snapshot.length
56
+ };
57
+ }
58
+ isCancelled() {
59
+ return this.cancelled;
60
+ }
61
+ /** Wall-time since construction — used by the owning job for metrics. */ elapsedMs() {
62
+ return this.executionTimer.ms();
63
+ }
64
+ /** Kicks off the prove. Returns the result promise (also available as `result.promise`). */ start() {
65
+ void this.run();
66
+ return this.result.promise;
67
+ }
68
+ /**
69
+ * Cancels the in-flight prove. Idempotent. Rejects the result promise with
70
+ * `TopTreeCancelledError`, then kicks off the underlying orchestrator's teardown
71
+ * in the background so callers don't block on it. The teardown promise is exposed
72
+ * via `whenDone()` — the parent collects the cancelled job and awaits all
73
+ * pending top-tree teardowns at the end of the epoch.
74
+ */ cancel() {
75
+ if (this.cancelled) {
76
+ return;
77
+ }
78
+ this.cancelled = true;
79
+ this.deps.log.info(`Cancelling TopTreeJob for epoch ${this.epochNumber} (checkpoints ${this.fromCheckpoint}..${this.toCheckpoint})`, {
80
+ epochNumber: this.epochNumber,
81
+ fromCheckpoint: this.fromCheckpoint,
82
+ toCheckpoint: this.toCheckpoint,
83
+ elapsedMs: this.executionTimer.ms()
84
+ });
85
+ this.result.reject(new TopTreeCancelledError());
86
+ // Fire and forget: parent awaits the cancel-driven teardown via whenDone(); the
87
+ // chained .catch swallows rejections so the unawaited promise doesn't surface
88
+ // as an unhandled rejection.
89
+ this.cancelPromise = this.runCancel().catch(()=>{});
90
+ }
91
+ /** Resolves once the cancel-driven teardown of the underlying orchestrator has unwound. */ async whenDone() {
92
+ if (this.cancelPromise) {
93
+ await this.cancelPromise;
94
+ }
95
+ }
96
+ async runCancel() {
97
+ try {
98
+ this.topTree.cancel({
99
+ abortJobs: true
100
+ });
101
+ } catch (err) {
102
+ this.deps.log.error('Error cancelling top tree', err);
103
+ }
104
+ try {
105
+ await this.topTree.stop();
106
+ } catch (err) {
107
+ this.deps.log.error('Error stopping top tree', err);
108
+ }
109
+ }
110
+ async run() {
111
+ try {
112
+ const blobTimer = new Timer();
113
+ const blobFieldsPerCheckpoint = this.snapshot.map((j)=>j.checkpoint.toBlobFields());
114
+ const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
115
+ this.deps.metrics.recordBlobProcessing(blobTimer.ms());
116
+ this.deps.log.verbose(`Built final blob batching challenges for epoch ${this.epochNumber} in ${blobTimer.ms()}ms`, {
117
+ epochNumber: this.epochNumber,
118
+ checkpointCount: this.snapshot.length,
119
+ durationMs: blobTimer.ms()
120
+ });
121
+ const checkpointData = this.snapshot.map((j)=>({
122
+ blockProofs: j.whenBlockProofsReady(),
123
+ l2ToL1MsgsPerBlock: j.checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs)),
124
+ blobFields: j.checkpoint.toBlobFields(),
125
+ previousBlockHeader: j.previousBlockHeader,
126
+ previousArchiveSiblingPath: j.previousArchiveSiblingPath
127
+ }));
128
+ const defaultProve = ()=>this.topTree.prove(this.epochNumber, this.snapshot.length, finalBlobBatchingChallenges, checkpointData);
129
+ await this.deps.hooks?.beforeProve?.();
130
+ const proveTimer = new Timer();
131
+ this.deps.log.info(`Starting top-tree prove for epoch ${this.epochNumber} (checkpoints ${this.fromCheckpoint}..${this.toCheckpoint})`, {
132
+ epochNumber: this.epochNumber,
133
+ fromCheckpoint: this.fromCheckpoint,
134
+ toCheckpoint: this.toCheckpoint,
135
+ checkpointCount: this.snapshot.length
136
+ });
137
+ const proof = await (this.deps.hooks?.proveOverride ? this.deps.hooks.proveOverride(defaultProve) : defaultProve());
138
+ await this.deps.hooks?.afterProve?.();
139
+ this.deps.log.info(`Top-tree prove succeeded for epoch ${this.epochNumber} in ${proveTimer.ms()}ms`, {
140
+ epochNumber: this.epochNumber,
141
+ fromCheckpoint: this.fromCheckpoint,
142
+ toCheckpoint: this.toCheckpoint,
143
+ durationMs: proveTimer.ms(),
144
+ totalElapsedMs: this.executionTimer.ms()
145
+ });
146
+ this.result.resolve(proof);
147
+ } catch (err) {
148
+ // Cancel paths surface as TopTreeCancelledError; everything else propagates as-is.
149
+ this.result.reject(err);
150
+ }
151
+ }
152
+ }
package/dest/metrics.d.ts CHANGED
@@ -1,18 +1,45 @@
1
- import type { RollupContract } from '@aztec/ethereum';
1
+ import type { RollupContract } from '@aztec/ethereum/contracts';
2
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { L1PublishProofStats } from '@aztec/stdlib/stats';
4
4
  import { type Gauge, type Histogram, type Meter, type TelemetryClient, type Tracer, type UpDownCounter } from '@aztec/telemetry-client';
5
+ import type { CheckpointStore } from './checkpoint-store.js';
6
+ import type { SessionManager } from './session-manager.js';
5
7
  export declare class ProverNodeJobMetrics {
6
8
  private meter;
7
9
  readonly tracer: Tracer;
8
10
  private logger;
9
- proverEpochExecutionDuration: Histogram;
10
11
  provingJobDuration: Histogram;
11
12
  provingJobCheckpoints: Gauge;
12
13
  provingJobBlocks: Gauge;
13
14
  provingJobTransactions: Gauge;
15
+ private blobProcessingDuration;
16
+ private blockProcessingDuration;
17
+ private checkpointProcessingDuration;
18
+ private checkpointProvingDuration;
19
+ private checkpointBlocks;
20
+ private checkpointTransactions;
21
+ /** Observable gauges for live state. Registered via `observeState(...)` once the
22
+ * CheckpointStore and SessionManager are available. */
23
+ private activeCheckpoints;
24
+ private activeEpochSessions;
25
+ private stateObserver;
26
+ private stateObservedMetrics;
14
27
  constructor(meter: Meter, tracer: Tracer, logger?: import("@aztec/foundation/log").Logger);
15
- recordProvingJob(executionTimeMs: number, totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
28
+ recordProvingJob(totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
29
+ recordBlobProcessing(durationMs: number): void;
30
+ recordBlockProcessing(durationMs: number): void;
31
+ recordCheckpointProcessing(durationMs: number, numBlocks: number, numTxs: number): void;
32
+ recordCheckpointProving(durationMs: number): void;
33
+ /**
34
+ * Registers observable gauges for the prover-node's live state: how many canonical
35
+ * checkpoint provers are in the store, and how many epoch sessions are live (broken
36
+ * down by kind). Idempotent — repeated calls re-arm with the latest references.
37
+ *
38
+ * Call this once the `SessionManager` has been constructed (i.e. inside `ProverNode.start()`).
39
+ */
40
+ observeState(checkpointStore: CheckpointStore, sessionManager: SessionManager): void;
41
+ /** Tears down the observable callback registered by `observeState`. Idempotent. */
42
+ stopObservingState(): void;
16
43
  }
17
44
  export declare class ProverNodeRewardsMetrics {
18
45
  private meter;
@@ -28,6 +55,12 @@ export declare class ProverNodeRewardsMetrics {
28
55
  stop(): void;
29
56
  private observe;
30
57
  }
58
+ export type EstimatedSubmitProofStats = {
59
+ gasLimit: bigint;
60
+ baseFeePerGas: bigint;
61
+ maxPriorityFeePerGas: bigint;
62
+ estimatedTotalFee: bigint;
63
+ };
31
64
  export declare class ProverNodePublisherMetrics {
32
65
  readonly client: TelemetryClient;
33
66
  private logger;
@@ -40,12 +73,16 @@ export declare class ProverNodePublisherMetrics {
40
73
  txBlobDataGasUsed: Histogram;
41
74
  txBlobDataGasCost: Histogram;
42
75
  txTotalFee: Histogram;
76
+ private txGasEstimated;
77
+ private gasPriceEstimated;
78
+ private txTotalFeeEstimated;
43
79
  private senderBalance;
44
80
  private meter;
45
81
  constructor(client: TelemetryClient, name?: string, logger?: import("@aztec/foundation/log").Logger);
46
82
  recordFailedTx(): void;
47
83
  recordSubmitProof(durationMs: number, stats: L1PublishProofStats): void;
84
+ recordEstimatedSubmitProof(stats: EstimatedSubmitProofStats): void;
48
85
  recordSenderBalance(wei: bigint, senderAddress: string): void;
49
86
  private recordTx;
50
87
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxxQkFBYSxvQkFBb0I7SUFRN0IsT0FBTyxDQUFDLEtBQUs7YUFDRyxNQUFNLEVBQUUsTUFBTTtJQUM5QixPQUFPLENBQUMsTUFBTTtJQVRoQiw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDeEMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQzlCLHFCQUFxQixFQUFFLEtBQUssQ0FBQztJQUM3QixnQkFBZ0IsRUFBRSxLQUFLLENBQUM7SUFDeEIsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO0lBRTlCLFlBQ1UsS0FBSyxFQUFFLEtBQUssRUFDSixNQUFNLEVBQUUsTUFBTSxFQUN0QixNQUFNLHlDQUFnRCxFQXdCL0Q7SUFFTSxnQkFBZ0IsQ0FDckIsZUFBZSxFQUFFLE1BQU0sRUFDdkIsV0FBVyxFQUFFLE1BQU0sRUFDbkIsY0FBYyxFQUFFLE1BQU0sRUFDdEIsU0FBUyxFQUFFLE1BQU0sRUFDakIsTUFBTSxFQUFFLE1BQU0sUUFPZjtDQUNGO0FBRUQscUJBQWEsd0JBQXdCO0lBT2pDLE9BQU8sQ0FBQyxLQUFLO0lBQ2IsT0FBTyxDQUFDLFFBQVE7SUFDaEIsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsTUFBTTtJQVRoQixPQUFPLENBQUMsT0FBTyxDQUFrQjtJQUNqQyxPQUFPLENBQUMsa0JBQWtCLENBQWdCO0lBQzFDLE9BQU8sQ0FBQyxTQUFTLENBQU87SUFDeEIsT0FBTyxDQUFDLHFCQUFxQixDQUFLO0lBRWxDLFlBQ1UsS0FBSyxFQUFFLEtBQUssRUFDWixRQUFRLEVBQUUsVUFBVSxFQUNwQixNQUFNLEVBQUUsY0FBYyxFQUN0QixNQUFNLHlDQUFnRCxFQVcvRDtJQUVZLEtBQUssa0JBSWpCO0lBRU0sSUFBSSxTQUVWO0lBRUQsT0FBTyxDQUFDLE9BQU8sQ0F3QmI7Q0FDSDtBQUVELHFCQUFhLDBCQUEwQjthQWVuQixNQUFNLEVBQUUsZUFBZTtJQUV2QyxPQUFPLENBQUMsTUFBTTtJQWhCaEIsUUFBUSxFQUFFLFNBQVMsQ0FBQztJQUNwQixPQUFPLEVBQUUsYUFBYSxDQUFDO0lBQ3ZCLFVBQVUsRUFBRSxTQUFTLENBQUM7SUFDdEIsS0FBSyxFQUFFLFNBQVMsQ0FBQztJQUNqQixjQUFjLEVBQUUsU0FBUyxDQUFDO0lBQzFCLGFBQWEsRUFBRSxTQUFTLENBQUM7SUFDekIsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQzdCLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztJQUM3QixVQUFVLEVBQUUsU0FBUyxDQUFDO0lBRXRCLE9BQU8sQ0FBQyxhQUFhLENBQVE7SUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixZQUNrQixNQUFNLEVBQUUsZUFBZSxFQUN2QyxJQUFJLFNBQWUsRUFDWCxNQUFNLHlDQUFnRCxFQWtFL0Q7SUFFRCxjQUFjLFNBS2I7SUFFRCxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsUUFFL0Q7SUFFTSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBSzVEO0lBRUQsT0FBTyxDQUFDLFFBQVE7Q0F1Q2pCIn0=
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxxQkFBYSxvQkFBb0I7SUFxQjdCLE9BQU8sQ0FBQyxLQUFLO2FBQ0csTUFBTSxFQUFFLE1BQU07SUFDOUIsT0FBTyxDQUFDLE1BQU07SUF0QmhCLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUM5QixxQkFBcUIsRUFBRSxLQUFLLENBQUM7SUFDN0IsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO0lBQ3hCLHNCQUFzQixFQUFFLEtBQUssQ0FBQztJQUU5QixPQUFPLENBQUMsc0JBQXNCLENBQVE7SUFDdEMsT0FBTyxDQUFDLHVCQUF1QixDQUFZO0lBQzNDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBWTtJQUNoRCxPQUFPLENBQUMseUJBQXlCLENBQVk7SUFDN0MsT0FBTyxDQUFDLGdCQUFnQixDQUFZO0lBQ3BDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBWTtJQUUxQzs0REFDd0Q7SUFDeEQsT0FBTyxDQUFDLGlCQUFpQixDQUE4QjtJQUN2RCxPQUFPLENBQUMsbUJBQW1C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
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,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,EAwB/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,EAW/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,EAkE/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
@@ -1,49 +1,107 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
- import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
2
+ import { Attributes, Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
3
3
  import { formatEther, formatUnits } from 'viem';
4
4
  export class ProverNodeJobMetrics {
5
5
  meter;
6
6
  tracer;
7
7
  logger;
8
- proverEpochExecutionDuration;
9
8
  provingJobDuration;
10
9
  provingJobCheckpoints;
11
10
  provingJobBlocks;
12
11
  provingJobTransactions;
12
+ blobProcessingDuration;
13
+ blockProcessingDuration;
14
+ checkpointProcessingDuration;
15
+ checkpointProvingDuration;
16
+ checkpointBlocks;
17
+ checkpointTransactions;
18
+ /** Observable gauges for live state. Registered via `observeState(...)` once the
19
+ * CheckpointStore and SessionManager are available. */ activeCheckpoints;
20
+ activeEpochSessions;
21
+ stateObserver;
22
+ stateObservedMetrics;
13
23
  constructor(meter, tracer, logger = createLogger('prover-node:publisher:metrics')){
14
24
  this.meter = meter;
15
25
  this.tracer = tracer;
16
26
  this.logger = logger;
17
- this.proverEpochExecutionDuration = this.meter.createHistogram(Metrics.PROVER_NODE_EXECUTION_DURATION, {
18
- description: 'Duration of execution of an epoch by the prover',
19
- unit: 'ms',
20
- valueType: ValueType.INT
21
- });
22
- this.provingJobDuration = this.meter.createHistogram(Metrics.PROVER_NODE_JOB_DURATION, {
23
- description: 'Duration of proving job',
24
- unit: 's',
25
- valueType: ValueType.DOUBLE
26
- });
27
- this.provingJobCheckpoints = this.meter.createGauge(Metrics.PROVER_NODE_JOB_CHECKPOINTS, {
28
- description: 'Number of checkpoints in a proven epoch',
29
- valueType: ValueType.INT
30
- });
31
- this.provingJobBlocks = this.meter.createGauge(Metrics.PROVER_NODE_JOB_BLOCKS, {
32
- description: 'Number of blocks in a proven epoch',
33
- valueType: ValueType.INT
34
- });
35
- this.provingJobTransactions = this.meter.createGauge(Metrics.PROVER_NODE_JOB_TRANSACTIONS, {
36
- description: 'Number of transactions in a proven epoch',
37
- valueType: ValueType.INT
38
- });
27
+ this.stateObservedMetrics = [];
28
+ this.provingJobDuration = this.meter.createHistogram(Metrics.PROVER_NODE_JOB_DURATION);
29
+ this.provingJobCheckpoints = this.meter.createGauge(Metrics.PROVER_NODE_JOB_CHECKPOINTS);
30
+ this.provingJobBlocks = this.meter.createGauge(Metrics.PROVER_NODE_JOB_BLOCKS);
31
+ this.provingJobTransactions = this.meter.createGauge(Metrics.PROVER_NODE_JOB_TRANSACTIONS);
32
+ this.blobProcessingDuration = this.meter.createGauge(Metrics.PROVER_NODE_BLOB_PROCESSING_LAST_DURATION);
33
+ this.blockProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_BLOCK_PROCESSING_DURATION);
34
+ this.checkpointProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_PROCESSING_DURATION);
35
+ this.checkpointProvingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_PROVING_DURATION);
36
+ this.checkpointBlocks = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_BLOCKS);
37
+ this.checkpointTransactions = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_TRANSACTIONS);
39
38
  }
40
- recordProvingJob(executionTimeMs, totalTimeMs, numCheckpoints, numBlocks, numTxs) {
41
- this.proverEpochExecutionDuration.record(Math.ceil(executionTimeMs));
39
+ recordProvingJob(totalTimeMs, numCheckpoints, numBlocks, numTxs) {
42
40
  this.provingJobDuration.record(totalTimeMs / 1000);
43
41
  this.provingJobCheckpoints.record(Math.floor(numCheckpoints));
44
42
  this.provingJobBlocks.record(Math.floor(numBlocks));
45
43
  this.provingJobTransactions.record(Math.floor(numTxs));
46
44
  }
45
+ recordBlobProcessing(durationMs) {
46
+ this.blobProcessingDuration.record(Math.ceil(durationMs));
47
+ }
48
+ recordBlockProcessing(durationMs) {
49
+ this.blockProcessingDuration.record(Math.ceil(durationMs));
50
+ }
51
+ recordCheckpointProcessing(durationMs, numBlocks, numTxs) {
52
+ this.checkpointProcessingDuration.record(Math.ceil(durationMs));
53
+ this.checkpointBlocks.record(Math.floor(numBlocks));
54
+ this.checkpointTransactions.record(Math.floor(numTxs));
55
+ }
56
+ recordCheckpointProving(durationMs) {
57
+ this.checkpointProvingDuration.record(Math.ceil(durationMs));
58
+ }
59
+ /**
60
+ * Registers observable gauges for the prover-node's live state: how many canonical
61
+ * checkpoint provers are in the store, and how many epoch sessions are live (broken
62
+ * down by kind). Idempotent — repeated calls re-arm with the latest references.
63
+ *
64
+ * Call this once the `SessionManager` has been constructed (i.e. inside `ProverNode.start()`).
65
+ */ observeState(checkpointStore, sessionManager) {
66
+ this.stopObservingState();
67
+ this.activeCheckpoints = this.meter.createObservableGauge(Metrics.PROVER_NODE_ACTIVE_CHECKPOINTS);
68
+ this.activeEpochSessions = this.meter.createObservableGauge(Metrics.PROVER_NODE_ACTIVE_EPOCH_SESSIONS);
69
+ this.stateObserver = (observer)=>{
70
+ observer.observe(this.activeCheckpoints, checkpointStore.listCanonical().length);
71
+ let full = 0;
72
+ let partial = 0;
73
+ for (const session of sessionManager.allSessions()){
74
+ if (session.isTerminal()) {
75
+ continue;
76
+ }
77
+ if (session.getKind() === 'full') {
78
+ full++;
79
+ } else {
80
+ partial++;
81
+ }
82
+ }
83
+ observer.observe(this.activeEpochSessions, full, {
84
+ [Attributes.EPOCH_SESSION_KIND]: 'full'
85
+ });
86
+ observer.observe(this.activeEpochSessions, partial, {
87
+ [Attributes.EPOCH_SESSION_KIND]: 'partial'
88
+ });
89
+ };
90
+ this.stateObservedMetrics = [
91
+ this.activeCheckpoints,
92
+ this.activeEpochSessions
93
+ ];
94
+ this.meter.addBatchObservableCallback(this.stateObserver, this.stateObservedMetrics);
95
+ }
96
+ /** Tears down the observable callback registered by `observeState`. Idempotent. */ stopObservingState() {
97
+ if (this.stateObserver) {
98
+ this.meter.removeBatchObservableCallback(this.stateObserver, this.stateObservedMetrics);
99
+ this.stateObserver = undefined;
100
+ this.stateObservedMetrics = [];
101
+ this.activeCheckpoints = undefined;
102
+ this.activeEpochSessions = undefined;
103
+ }
104
+ }
47
105
  }
48
106
  export class ProverNodeRewardsMetrics {
49
107
  meter;
@@ -82,14 +140,8 @@ export class ProverNodeRewardsMetrics {
82
140
  }
83
141
  }
84
142
  };
85
- this.rewards = this.meter.createObservableGauge(Metrics.PROVER_NODE_REWARDS_PER_EPOCH, {
86
- valueType: ValueType.DOUBLE,
87
- description: 'The rewards earned'
88
- });
89
- this.accumulatedRewards = this.meter.createUpDownCounter(Metrics.PROVER_NODE_REWARDS_TOTAL, {
90
- valueType: ValueType.DOUBLE,
91
- description: 'The rewards earned (total)'
92
- });
143
+ this.rewards = this.meter.createObservableGauge(Metrics.PROVER_NODE_REWARDS_PER_EPOCH);
144
+ this.accumulatedRewards = createUpDownCounterWithDefault(this.meter, Metrics.PROVER_NODE_REWARDS_TOTAL);
93
145
  }
94
146
  async start() {
95
147
  const proofSubmissionEpochs = await this.rollup.getProofSubmissionEpochs();
@@ -117,81 +169,36 @@ export class ProverNodePublisherMetrics {
117
169
  txBlobDataGasUsed;
118
170
  txBlobDataGasCost;
119
171
  txTotalFee;
172
+ txGasEstimated;
173
+ gasPriceEstimated;
174
+ txTotalFeeEstimated;
120
175
  senderBalance;
121
176
  meter;
122
177
  constructor(client, name = 'ProverNode', logger = createLogger('prover-node:publisher:metrics')){
123
178
  this.client = client;
124
179
  this.logger = logger;
125
180
  this.meter = client.getMeter(name);
126
- this.gasPrice = this.meter.createHistogram(Metrics.L1_PUBLISHER_GAS_PRICE, {
127
- description: 'The gas price used for transactions',
128
- unit: 'gwei',
129
- valueType: ValueType.DOUBLE
130
- });
131
- this.txCount = this.meter.createUpDownCounter(Metrics.L1_PUBLISHER_TX_COUNT, {
132
- description: 'The number of transactions processed'
133
- });
134
- this.txDuration = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_DURATION, {
135
- description: 'The duration of transaction processing',
136
- unit: 'ms',
137
- valueType: ValueType.INT
138
- });
139
- this.txGas = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_GAS, {
140
- description: 'The gas consumed by transactions',
141
- unit: 'gas',
142
- valueType: ValueType.INT
143
- });
144
- this.txCalldataSize = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_SIZE, {
145
- description: 'The size of the calldata in transactions',
146
- unit: 'By',
147
- valueType: ValueType.INT
148
- });
149
- this.txCalldataGas = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_GAS, {
150
- description: 'The gas consumed by the calldata in transactions',
151
- unit: 'gas',
152
- valueType: ValueType.INT
153
- });
154
- this.txBlobDataGasUsed = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_USED, {
155
- description: 'The amount of blob gas used in transactions',
156
- unit: 'gas',
157
- valueType: ValueType.INT
158
- });
159
- this.txBlobDataGasCost = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_COST, {
160
- description: 'The gas cost of blobs in transactions',
161
- unit: 'gwei',
162
- valueType: ValueType.INT
163
- });
164
- this.txTotalFee = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_TOTAL_FEE, {
165
- description: 'How much L1 tx costs',
166
- unit: 'gwei',
167
- valueType: ValueType.DOUBLE,
168
- advice: {
169
- explicitBucketBoundaries: [
170
- 0.001,
171
- 0.002,
172
- 0.004,
173
- 0.008,
174
- 0.01,
175
- 0.02,
176
- 0.04,
177
- 0.08,
178
- 0.1,
179
- 0.2,
180
- 0.4,
181
- 0.8,
182
- 1,
183
- 1.2,
184
- 1.4,
185
- 1.8,
186
- 2
187
- ]
188
- }
189
- });
190
- this.senderBalance = this.meter.createGauge(Metrics.L1_PUBLISHER_BALANCE, {
191
- unit: 'eth',
192
- description: 'The balance of the sender address',
193
- valueType: ValueType.DOUBLE
181
+ this.gasPrice = this.meter.createHistogram(Metrics.L1_PUBLISHER_GAS_PRICE);
182
+ this.txCount = createUpDownCounterWithDefault(this.meter, Metrics.L1_PUBLISHER_TX_COUNT, {
183
+ [Attributes.L1_TX_TYPE]: [
184
+ 'submitProof'
185
+ ],
186
+ [Attributes.OK]: [
187
+ true,
188
+ false
189
+ ]
194
190
  });
191
+ this.txDuration = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_DURATION);
192
+ this.txGas = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_GAS);
193
+ this.txCalldataSize = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_SIZE);
194
+ this.txCalldataGas = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_GAS);
195
+ this.txBlobDataGasUsed = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_USED);
196
+ this.txBlobDataGasCost = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_COST);
197
+ this.txTotalFee = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_TOTAL_FEE);
198
+ this.txGasEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_GAS);
199
+ this.gasPriceEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_GAS_PRICE);
200
+ this.txTotalFeeEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_TOTAL_FEE);
201
+ this.senderBalance = this.meter.createGauge(Metrics.L1_PUBLISHER_BALANCE);
195
202
  }
196
203
  recordFailedTx() {
197
204
  this.txCount.add(1, {
@@ -202,6 +209,22 @@ export class ProverNodePublisherMetrics {
202
209
  recordSubmitProof(durationMs, stats) {
203
210
  this.recordTx(durationMs, stats);
204
211
  }
212
+ recordEstimatedSubmitProof(stats) {
213
+ const attributes = {
214
+ [Attributes.L1_TX_TYPE]: 'submitProof'
215
+ };
216
+ this.txGasEstimated.record(Number(stats.gasLimit), attributes);
217
+ try {
218
+ this.gasPriceEstimated.record(parseInt(formatEther(stats.baseFeePerGas + stats.maxPriorityFeePerGas, 'gwei'), 10));
219
+ } catch {
220
+ // ignore
221
+ }
222
+ try {
223
+ this.txTotalFeeEstimated.record(parseFloat(formatEther(stats.estimatedTotalFee)));
224
+ } catch {
225
+ // ignore
226
+ }
227
+ }
205
228
  recordSenderBalance(wei, senderAddress) {
206
229
  const eth = parseFloat(formatEther(wei, 'wei'));
207
230
  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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vbml0b3JzL2Vwb2NoLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTNFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxTQUFTLEVBQ2QsS0FBSyxNQUFNLEVBR1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxNQUFNLFdBQVcsbUJBQW1CO0lBQ2xDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3JFO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHFCQUFhLFlBQWEsWUFBVyxTQUFTO0lBUzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYTtJQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFDNUIsT0FBTyxDQUFDLE9BQU87SUFWakIsT0FBTyxDQUFDLGNBQWMsQ0FBaUI7SUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBNkM7SUFDeEQsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsT0FBTyxDQUFrQztJQUNqRCxPQUFPLENBQUMsaUJBQWlCLENBQTBCO0lBRW5ELFlBQ21CLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEVBQzlELE9BQU8sRUFBRTtRQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQ3ZFLFNBQVMsR0FBRSxlQUFzQyxFQU9sRDtJQUVELE9BQW9CLE1BQU0sQ0FDeEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsT0FBTyxFQUFFO1FBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFDL0QsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FHdkI7SUFFTSxLQUFLLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUl4QztJQUVELDBCQUEwQjtJQUNuQixVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUU3QztJQUVZLElBQUksa0JBR2hCO0lBR1ksSUFBSSxrQkEyQmhCO1lBRWEscUJBQXFCO0NBWXBDIn0=
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,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,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;IAGY,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"}