@aztec-labs/prover-node 6.0.0-nightly.20260829

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 (90) hide show
  1. package/README.md +573 -0
  2. package/dest/actions/download-epoch-proving-job.d.ts +18 -0
  3. package/dest/actions/download-epoch-proving-job.d.ts.map +1 -0
  4. package/dest/actions/download-epoch-proving-job.js +37 -0
  5. package/dest/actions/index.d.ts +3 -0
  6. package/dest/actions/index.d.ts.map +1 -0
  7. package/dest/actions/index.js +2 -0
  8. package/dest/actions/rerun-epoch-proving-job.d.ts +23 -0
  9. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -0
  10. package/dest/actions/rerun-epoch-proving-job.js +264 -0
  11. package/dest/actions/upload-epoch-proof-failure.d.ts +15 -0
  12. package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -0
  13. package/dest/actions/upload-epoch-proof-failure.js +78 -0
  14. package/dest/bin/run-failed-epoch.d.ts +2 -0
  15. package/dest/bin/run-failed-epoch.d.ts.map +1 -0
  16. package/dest/bin/run-failed-epoch.js +68 -0
  17. package/dest/checkpoint-store.d.ts +95 -0
  18. package/dest/checkpoint-store.d.ts.map +1 -0
  19. package/dest/checkpoint-store.js +178 -0
  20. package/dest/config.d.ts +31 -0
  21. package/dest/config.d.ts.map +1 -0
  22. package/dest/config.js +143 -0
  23. package/dest/factory.d.ts +36 -0
  24. package/dest/factory.d.ts.map +1 -0
  25. package/dest/factory.js +105 -0
  26. package/dest/index.d.ts +8 -0
  27. package/dest/index.d.ts.map +1 -0
  28. package/dest/index.js +7 -0
  29. package/dest/job/checkpoint-prover.d.ts +169 -0
  30. package/dest/job/checkpoint-prover.d.ts.map +1 -0
  31. package/dest/job/checkpoint-prover.js +413 -0
  32. package/dest/job/epoch-proving-job-data.d.ts +20 -0
  33. package/dest/job/epoch-proving-job-data.d.ts.map +1 -0
  34. package/dest/job/epoch-proving-job-data.js +61 -0
  35. package/dest/job/epoch-session.d.ts +160 -0
  36. package/dest/job/epoch-session.d.ts.map +1 -0
  37. package/dest/job/epoch-session.js +744 -0
  38. package/dest/job/top-tree-job.d.ts +82 -0
  39. package/dest/job/top-tree-job.d.ts.map +1 -0
  40. package/dest/job/top-tree-job.js +152 -0
  41. package/dest/metrics.d.ts +88 -0
  42. package/dest/metrics.d.ts.map +1 -0
  43. package/dest/metrics.js +264 -0
  44. package/dest/monitors/epoch-monitor.d.ts +43 -0
  45. package/dest/monitors/epoch-monitor.d.ts.map +1 -0
  46. package/dest/monitors/epoch-monitor.js +111 -0
  47. package/dest/monitors/index.d.ts +2 -0
  48. package/dest/monitors/index.d.ts.map +1 -0
  49. package/dest/monitors/index.js +1 -0
  50. package/dest/proof-publishing-service.d.ts +161 -0
  51. package/dest/proof-publishing-service.d.ts.map +1 -0
  52. package/dest/proof-publishing-service.js +335 -0
  53. package/dest/prover-node-publisher.d.ts +71 -0
  54. package/dest/prover-node-publisher.d.ts.map +1 -0
  55. package/dest/prover-node-publisher.js +346 -0
  56. package/dest/prover-node.d.ts +185 -0
  57. package/dest/prover-node.d.ts.map +1 -0
  58. package/dest/prover-node.js +1056 -0
  59. package/dest/prover-publisher-factory.d.ts +27 -0
  60. package/dest/prover-publisher-factory.d.ts.map +1 -0
  61. package/dest/prover-publisher-factory.js +29 -0
  62. package/dest/session-manager.d.ts +158 -0
  63. package/dest/session-manager.d.ts.map +1 -0
  64. package/dest/session-manager.js +493 -0
  65. package/dest/test/index.d.ts +13 -0
  66. package/dest/test/index.d.ts.map +1 -0
  67. package/dest/test/index.js +3 -0
  68. package/package.json +102 -0
  69. package/src/actions/download-epoch-proving-job.ts +43 -0
  70. package/src/actions/index.ts +2 -0
  71. package/src/actions/rerun-epoch-proving-job.ts +224 -0
  72. package/src/actions/upload-epoch-proof-failure.ts +87 -0
  73. package/src/bin/run-failed-epoch.ts +78 -0
  74. package/src/checkpoint-store.ts +212 -0
  75. package/src/config.ts +208 -0
  76. package/src/factory.ts +191 -0
  77. package/src/index.ts +7 -0
  78. package/src/job/checkpoint-prover.ts +551 -0
  79. package/src/job/epoch-proving-job-data.ts +94 -0
  80. package/src/job/epoch-session.ts +466 -0
  81. package/src/job/top-tree-job.ts +227 -0
  82. package/src/metrics.ts +323 -0
  83. package/src/monitors/epoch-monitor.ts +110 -0
  84. package/src/monitors/index.ts +1 -0
  85. package/src/proof-publishing-service.ts +427 -0
  86. package/src/prover-node-publisher.ts +473 -0
  87. package/src/prover-node.ts +830 -0
  88. package/src/prover-publisher-factory.ts +48 -0
  89. package/src/session-manager.ts +593 -0
  90. package/src/test/index.ts +14 -0
@@ -0,0 +1,178 @@
1
+ import { createLogger } from '@aztec-labs/foundation/log';
2
+ import { getEpochAtSlot, getSlotRangeForEpoch } from '@aztec-labs/stdlib/epoch-helpers';
3
+ import { CheckpointProver } from './job/checkpoint-prover.js';
4
+ /**
5
+ * Prover-node-wide registry of `CheckpointProver` instances, content-addressed by
6
+ * `(checkpoint number, slot, checkpoint archive root)`.
7
+ *
8
+ * The store survives every epoch / session boundary. A prover lives from its first
9
+ * `addOrUpdate` call until either:
10
+ * - its checkpoint is pruned by an L1 reorg (`cancelAndRemoveAboveBlock`), or
11
+ * - its epoch's proof-submission window has closed (`reapExpired`), so the proof could no
12
+ * longer be accepted on L1 even if produced.
13
+ *
14
+ * A prover's sub-tree work forks world-state per block and does not survive a prune of a base
15
+ * block, so there is nothing to preserve across a reorg: a pruned prover is cancelled and
16
+ * dropped, and a re-add (even of identical content) constructs a fresh prover.
17
+ */ export class CheckpointStore {
18
+ l2BlockSource;
19
+ proverDeps;
20
+ proverFactoryFn;
21
+ provers;
22
+ /**
23
+ * Teardowns of provers already removed from `provers` (by prune or reap), awaited on `stop()`.
24
+ * Keyed by a monotonic id rather than the prover's content id: a prune-then-re-add can leave two
25
+ * teardowns for the same content id in flight at once, which a content-id key would clobber.
26
+ */ pendingTeardowns;
27
+ nextTeardownId;
28
+ /** Test-only hooks injected into every prover this store constructs. */ testHooks;
29
+ log;
30
+ constructor(l2BlockSource, proverDeps, bindings, proverFactoryFn = (args, deps)=>new CheckpointProver(args, deps)){
31
+ this.l2BlockSource = l2BlockSource;
32
+ this.proverDeps = proverDeps;
33
+ this.proverFactoryFn = proverFactoryFn;
34
+ this.provers = new Map();
35
+ this.pendingTeardowns = new Map();
36
+ this.nextTeardownId = 0;
37
+ this.testHooks = {};
38
+ this.log = createLogger('prover-node:checkpoint-store', bindings);
39
+ }
40
+ start() {
41
+ return Promise.resolve();
42
+ }
43
+ async stop() {
44
+ // Cancel every live prover, then await both their teardown and any still in flight for provers
45
+ // already removed by a prune or reap.
46
+ const provers = Array.from(this.provers.values());
47
+ this.provers.clear();
48
+ for (const prover of provers){
49
+ prover.cancel();
50
+ }
51
+ await Promise.allSettled([
52
+ ...provers.map((p)=>p.whenDone()),
53
+ ...this.pendingTeardowns.values()
54
+ ]);
55
+ }
56
+ /**
57
+ * Tracks the teardown of a prover just removed from the store so `stop()` can await it. The entry
58
+ * removes itself once teardown settles, so the map stays bounded by the number in flight.
59
+ */ trackTeardown(prover) {
60
+ const id = this.nextTeardownId++;
61
+ const done = prover.whenDone();
62
+ this.pendingTeardowns.set(id, done);
63
+ void done.finally(()=>this.pendingTeardowns.delete(id));
64
+ }
65
+ /**
66
+ * Registers a checkpoint with the store. If a prover already exists for the
67
+ * `(number, slot, archive root)` content key it is reused (an at-least-once re-registration of
68
+ * still-canonical content); otherwise a new prover is constructed.
69
+ */ async addOrUpdate(checkpoint, data) {
70
+ const l1Constants = await this.l2BlockSource.getL1Constants();
71
+ const epochNumber = getEpochAtSlot(checkpoint.header.slotNumber, l1Constants);
72
+ const id = CheckpointProver.idFor(checkpoint);
73
+ const existing = this.provers.get(id);
74
+ if (existing) {
75
+ return existing;
76
+ }
77
+ // At most one canonical checkpoint per slot. A different checkpoint at the same slot means the
78
+ // caller forgot to prune the old chain before adding the replacement — surface it rather than
79
+ // silently creating a parallel canonical chain. A pruned checkpoint has already been removed,
80
+ // so every prover still in the store is canonical.
81
+ for (const prover of this.provers.values()){
82
+ if (prover.slotNumber === checkpoint.header.slotNumber) {
83
+ throw new Error(`Cannot add checkpoint ${checkpoint.number} (archive ${checkpoint.archive.root}) at slot ${checkpoint.header.slotNumber}: ` + `a different checkpoint already occupies this slot. Prune it first.`);
84
+ }
85
+ }
86
+ const prover = this.proverFactoryFn({
87
+ ...data,
88
+ checkpoint,
89
+ epochNumber
90
+ }, {
91
+ ...this.proverDeps,
92
+ checkpointProveOverride: this.testHooks.checkpointProveOverride,
93
+ log: this.log
94
+ });
95
+ this.provers.set(id, prover);
96
+ return prover;
97
+ }
98
+ /**
99
+ * Installs test-only hooks applied to every prover constructed from now on. Used by the e2e harness to
100
+ * force a checkpoint sub-tree failure without monkey-patching the prover factory.
101
+ */ setTestHooks(hooks) {
102
+ this.testHooks = hooks;
103
+ }
104
+ /**
105
+ * Cancels and removes every prover that holds a block above the prune target. A checkpoint is orphaned by a prune to
106
+ * block `targetBlockNumber` iff its last block sits above the target — including a checkpoint whose range straddles
107
+ * the target (partially orphaned), which block-range marking catches without boundary ambiguity. Keying off the
108
+ * surviving block number (rather than a checkpoint number) is correct even when the source has already
109
+ * re-checkpointed past the divergence: the prune event reports the highest surviving block, which by construction
110
+ * survives on the source, whereas the source's current checkpointed tip can sit above the prune target.
111
+ *
112
+ * The prover's in-flight sub-tree work forks world-state per block and faults once its base block is pruned, so it
113
+ * cannot be reused; it is cancelled (aborting the fork reads) and dropped. A subsequent re-add constructs a fresh
114
+ * prover. Returns the removed provers.
115
+ */ cancelAndRemoveAboveBlock(targetBlockNumber) {
116
+ const affected = [];
117
+ for (const [id, prover] of Array.from(this.provers.entries())){
118
+ const lastBlockNumber = prover.checkpoint.blocks.at(-1).number;
119
+ if (lastBlockNumber > targetBlockNumber) {
120
+ prover.cancel();
121
+ this.trackTeardown(prover);
122
+ this.provers.delete(id);
123
+ affected.push(prover);
124
+ }
125
+ }
126
+ return affected;
127
+ }
128
+ /**
129
+ * Drops provers whose epoch is at or below the supplied expired epoch. Once an epoch's
130
+ * proof-submission window has closed, its proof can no longer be accepted on L1, so the
131
+ * prover is no longer needed.
132
+ */ reapExpired(expiredEpoch) {
133
+ const reaped = [];
134
+ for (const [id, prover] of Array.from(this.provers.entries())){
135
+ if (prover.epochNumber <= expiredEpoch) {
136
+ reaped.push({
137
+ id,
138
+ checkpointNumber: prover.checkpoint.number,
139
+ epochNumber: prover.epochNumber
140
+ });
141
+ prover.cancel({
142
+ routine: true
143
+ });
144
+ this.trackTeardown(prover);
145
+ this.provers.delete(id);
146
+ }
147
+ }
148
+ if (reaped.length > 0) {
149
+ this.log.info(`Reaped ${reaped.length} expired CheckpointProver(s) for expiredEpoch ${expiredEpoch}`, {
150
+ expiredEpoch,
151
+ reapedCount: reaped.length,
152
+ reaped
153
+ });
154
+ }
155
+ }
156
+ /** Returns the prover with the supplied id, or undefined. */ get(id) {
157
+ return this.provers.get(id);
158
+ }
159
+ /** Returns the prover for the supplied checkpoint (by its content-addressed id), or undefined. */ getByCheckpoint(checkpoint) {
160
+ return this.provers.get(CheckpointProver.idFor(checkpoint));
161
+ }
162
+ /** Every prover currently in the store, in insertion order. */ listAll() {
163
+ return Array.from(this.provers.values());
164
+ }
165
+ /** Provers in the store, sorted by checkpoint number. */ list() {
166
+ return Array.from(this.provers.values()).sort((a, b)=>a.checkpoint.number - b.checkpoint.number);
167
+ }
168
+ /**
169
+ * Provers whose slot is in the supplied epoch's slot range, sorted by checkpoint number.
170
+ */ async listForEpoch(epoch) {
171
+ const l1Constants = await this.l2BlockSource.getL1Constants();
172
+ const [fromSlot, toSlot] = getSlotRangeForEpoch(epoch, l1Constants);
173
+ return this.listInSlotRange(fromSlot, toSlot);
174
+ }
175
+ /** Provers whose slot falls within `[fromSlot, toSlot]`, sorted by checkpoint number. */ listInSlotRange(fromSlot, toSlot) {
176
+ return this.list().filter((p)=>p.slotNumber >= fromSlot && p.slotNumber <= toSlot);
177
+ }
178
+ }
@@ -0,0 +1,31 @@
1
+ import type { ACVMConfig, BBConfig } from '@aztec-labs/bb-prover/config';
2
+ import { type ConfigMappingsType } from '@aztec-labs/foundation/config';
3
+ import { EthAddress } from '@aztec-labs/foundation/eth-address';
4
+ import { type KeyStoreConfig } from '@aztec-labs/node-keystore/config';
5
+ import type { KeyStore } from '@aztec-labs/node-keystore/types';
6
+ import { type SharedNodeConfig } from '@aztec-labs/node-lib/config';
7
+ import { type ProverAgentConfig, type ProverBrokerConfig } from '@aztec-labs/prover-client/broker/config';
8
+ import { type ProverClientUserConfig } from '@aztec-labs/prover-client/config';
9
+ import { type ProverPublisherConfig, type ProverTxSenderConfig } from '@aztec-labs/sequencer-client/config';
10
+ import { type DataStoreConfig } from '@aztec-labs/stdlib/kv-store';
11
+ export type ProverNodeConfig = ProverClientUserConfig & ProverPublisherConfig & ProverTxSenderConfig & DataStoreConfig & KeyStoreConfig & SpecificProverNodeConfig & Pick<SharedNodeConfig, 'web3SignerUrl'>;
12
+ export type SpecificProverNodeConfig = {
13
+ proverNodeMaxPendingJobs: number;
14
+ proverNodePollingIntervalMs: number;
15
+ proverNodeMaxParallelBlocksPerEpoch: number;
16
+ proverNodeFailedEpochStore: string | undefined;
17
+ proverNodeEpochProvingDelayMs: number | undefined;
18
+ proverNodeDisableProofPublish?: boolean;
19
+ txGatheringTimeoutMs: number;
20
+ txGatheringIntervalMs: number;
21
+ txGatheringBatchSize: number;
22
+ txGatheringMaxParallelRequestsPerNode: number;
23
+ proofSubmissionTargetAddress?: EthAddress;
24
+ };
25
+ export declare const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeConfig>;
26
+ export declare const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig>;
27
+ export declare function getProverNodeConfigFromEnv(): ProverNodeConfig;
28
+ export declare function getProverNodeBrokerConfigFromEnv(): ProverBrokerConfig;
29
+ export declare function getProverNodeAgentConfigFromEnv(): ProverAgentConfig & BBConfig & ACVMConfig;
30
+ export declare function createKeyStoreForProver(config: ProverNodeConfig): KeyStore | undefined;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFLeEIsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUEwQixNQUFNLGtDQUFrQyxDQUFDO0FBRS9GLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUE0QixNQUFNLDZCQUE2QixDQUFDO0FBQzlGLE9BQU8sRUFDTCxLQUFLLGlCQUFpQixFQUN0QixLQUFLLGtCQUFrQixFQUd4QixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFDTCxLQUFLLHNCQUFzQixFQUc1QixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxLQUFLLHFCQUFxQixFQUMxQixLQUFLLG9CQUFvQixFQUcxQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUV2RixNQUFNLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLEdBQ25ELHFCQUFxQixHQUNyQixvQkFBb0IsR0FDcEIsZUFBZSxHQUNmLGNBQWMsR0FDZCx3QkFBd0IsR0FDeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBRTFDLE1BQU0sTUFBTSx3QkFBd0IsR0FBRztJQUNyQyx3QkFBd0IsRUFBRSxNQUFNLENBQUM7SUFDakMsMkJBQTJCLEVBQUUsTUFBTSxDQUFDO0lBQ3BDLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQztJQUM1QywwQkFBMEIsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQy9DLDZCQUE2QixFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbEQsNkJBQTZCLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDeEMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDO0lBQzdCLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IscUNBQXFDLEVBQUUsTUFBTSxDQUFDO0lBQzlDLDRCQUE0QixDQUFDLEVBQUUsVUFBVSxDQUFDO0NBQzNDLENBQUM7QUFFRixlQUFPLE1BQU0sZ0NBQWdDLEVBQUUsa0JBQWtCLENBQUMsd0JBQXdCLENBMkR6RixDQUFDO0FBRUYsZUFBTyxNQUFNLHdCQUF3QixFQUFFLGtCQUFrQixDQUFDLGdCQUFnQixDQVF6RSxDQUFDO0FBRUYsd0JBQWdCLDBCQUEwQixJQUFJLGdCQUFnQixDQUU3RDtBQUVELHdCQUFnQixnQ0FBZ0MsSUFBSSxrQkFBa0IsQ0FJckU7QUFFRCx3QkFBZ0IsK0JBQStCLElBQUksaUJBQWlCLEdBQUcsUUFBUSxHQUFHLFVBQVUsQ0FLM0Y7QUEwREQsd0JBQWdCLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsR0FBRyxRQUFRLEdBQUcsU0FBUyxDQVN0RiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,kCAAkC,CAAC;AAE/F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,KAAK,sBAAsB,EAG5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAG1B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,6BAA6B,CAAC;AAEvF,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,GACnD,qBAAqB,GACrB,oBAAoB,GACpB,eAAe,GACf,cAAc,GACd,wBAAwB,GACxB,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAE1C,MAAM,MAAM,wBAAwB,GAAG;IACrC,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,mCAAmC,EAAE,MAAM,CAAC;IAC5C,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,6BAA6B,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qCAAqC,EAAE,MAAM,CAAC;IAC9C,4BAA4B,CAAC,EAAE,UAAU,CAAC;CAC3C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,kBAAkB,CAAC,wBAAwB,CA2DzF,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAQzE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D;AAED,wBAAgB,gCAAgC,IAAI,kBAAkB,CAIrE;AAED,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAK3F;AA0DD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAStF"}
package/dest/config.js ADDED
@@ -0,0 +1,143 @@
1
+ import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper, pickConfigMappings } from '@aztec-labs/foundation/config';
2
+ import { EthAddress } from '@aztec-labs/foundation/eth-address';
3
+ import { keyStoreConfigMappings } from '@aztec-labs/node-keystore/config';
4
+ import { ethPrivateKeySchema } from '@aztec-labs/node-keystore/schemas';
5
+ import { sharedNodeConfigMappings } from '@aztec-labs/node-lib/config';
6
+ import { proverAgentConfigMappings, proverBrokerConfigMappings } from '@aztec-labs/prover-client/broker/config';
7
+ import { bbConfigMappings, proverClientConfigMappings } from '@aztec-labs/prover-client/config';
8
+ import { proverPublisherConfigMappings, proverTxSenderConfigMappings } from '@aztec-labs/sequencer-client/config';
9
+ import { dataConfigMappings } from '@aztec-labs/stdlib/kv-store';
10
+ export const specificProverNodeConfigMappings = {
11
+ proverNodeMaxPendingJobs: {
12
+ env: 'PROVER_NODE_MAX_PENDING_JOBS',
13
+ description: 'The maximum number of pending jobs for the prover node',
14
+ ...numberConfigHelper(10)
15
+ },
16
+ proverNodePollingIntervalMs: {
17
+ env: 'PROVER_NODE_POLLING_INTERVAL_MS',
18
+ description: 'The interval in milliseconds to poll for new jobs',
19
+ ...numberConfigHelper(1000)
20
+ },
21
+ proverNodeMaxParallelBlocksPerEpoch: {
22
+ env: 'PROVER_NODE_MAX_PARALLEL_BLOCKS_PER_EPOCH',
23
+ description: 'The Maximum number of blocks to process in parallel while proving an epoch',
24
+ ...numberConfigHelper(0)
25
+ },
26
+ proverNodeFailedEpochStore: {
27
+ env: 'PROVER_NODE_FAILED_EPOCH_STORE',
28
+ description: 'File store where to upload node state when an epoch fails to be proven',
29
+ defaultValue: undefined
30
+ },
31
+ proverNodeEpochProvingDelayMs: {
32
+ description: 'Optional delay in milliseconds to wait for late-arriving events (e.g. reorgs) to settle before starting top-tree proving for an epoch',
33
+ defaultValue: undefined
34
+ },
35
+ txGatheringIntervalMs: {
36
+ env: 'PROVER_NODE_TX_GATHERING_INTERVAL_MS',
37
+ description: 'How often to check that tx data is available',
38
+ ...numberConfigHelper(1_000)
39
+ },
40
+ txGatheringBatchSize: {
41
+ env: 'PROVER_NODE_TX_GATHERING_BATCH_SIZE',
42
+ description: 'How many transactions to gather from a node in a single request',
43
+ ...numberConfigHelper(10)
44
+ },
45
+ txGatheringMaxParallelRequestsPerNode: {
46
+ env: 'PROVER_NODE_TX_GATHERING_MAX_PARALLEL_REQUESTS_PER_NODE',
47
+ description: 'How many tx requests to make in parallel to each node',
48
+ ...numberConfigHelper(100)
49
+ },
50
+ txGatheringTimeoutMs: {
51
+ env: 'PROVER_NODE_TX_GATHERING_TIMEOUT_MS',
52
+ description: 'How long to wait for tx data to be available before giving up',
53
+ ...numberConfigHelper(120_000)
54
+ },
55
+ proverNodeDisableProofPublish: {
56
+ env: 'PROVER_NODE_DISABLE_PROOF_PUBLISH',
57
+ description: 'Whether the prover node skips publishing proofs to L1',
58
+ ...booleanConfigHelper(false)
59
+ },
60
+ proofSubmissionTargetAddress: {
61
+ env: 'PROVER_NODE_PROOF_SUBMISSION_TARGET_ADDRESS',
62
+ description: 'Optional L1 address the submitEpochRootProof tx is sent to. Must expose the identical submitEpochRootProof ABI ' + 'and forward to the rollup. Defaults to the rollup address.',
63
+ parseEnv: (val)=>EthAddress.fromString(val),
64
+ defaultValue: undefined
65
+ }
66
+ };
67
+ export const proverNodeConfigMappings = {
68
+ ...dataConfigMappings,
69
+ ...keyStoreConfigMappings,
70
+ ...proverClientConfigMappings,
71
+ ...proverPublisherConfigMappings,
72
+ ...proverTxSenderConfigMappings,
73
+ ...specificProverNodeConfigMappings,
74
+ ...pickConfigMappings(sharedNodeConfigMappings, [
75
+ 'web3SignerUrl'
76
+ ])
77
+ };
78
+ export function getProverNodeConfigFromEnv() {
79
+ return getConfigFromMappings(proverNodeConfigMappings);
80
+ }
81
+ export function getProverNodeBrokerConfigFromEnv() {
82
+ return {
83
+ ...getConfigFromMappings(proverBrokerConfigMappings)
84
+ };
85
+ }
86
+ export function getProverNodeAgentConfigFromEnv() {
87
+ return {
88
+ ...getConfigFromMappings(proverAgentConfigMappings),
89
+ ...getConfigFromMappings(bbConfigMappings)
90
+ };
91
+ }
92
+ function createKeyStoreFromWeb3Signer(config) {
93
+ // If we don't have a valid prover Id then we can't build a valid key store with remote signers
94
+ if (config.proverId === undefined) {
95
+ return undefined;
96
+ }
97
+ // Also, we need at least one publisher address.
98
+ const publishers = config.proverPublisherAddresses ?? [];
99
+ if (publishers.length === 0) {
100
+ return undefined;
101
+ }
102
+ const keyStore = {
103
+ schemaVersion: 1,
104
+ slasher: undefined,
105
+ prover: {
106
+ id: config.proverId,
107
+ publisher: publishers
108
+ },
109
+ remoteSigner: config.web3SignerUrl,
110
+ validators: undefined
111
+ };
112
+ return keyStore;
113
+ }
114
+ function createKeyStoreFromPublisherKeys(config) {
115
+ // Extract the publisher keys from the provided config.
116
+ const publisherKeys = config.proverPublisherPrivateKeys ? config.proverPublisherPrivateKeys.map((k)=>ethPrivateKeySchema.parse(k.getValue())) : [];
117
+ // There must be at least 1.
118
+ if (publisherKeys.length === 0) {
119
+ return undefined;
120
+ }
121
+ // If we have a valid proverId then create a prover key store of the form { id, publisher: [publisherKeys] }
122
+ // Otherwise create one of the form ("0x12345678....." as EthAccount).
123
+ const keyStore = {
124
+ schemaVersion: 1,
125
+ slasher: undefined,
126
+ prover: config.proverId === undefined ? publisherKeys[0] : {
127
+ id: config.proverId,
128
+ publisher: publisherKeys
129
+ },
130
+ remoteSigner: undefined,
131
+ validators: undefined
132
+ };
133
+ return keyStore;
134
+ }
135
+ export function createKeyStoreForProver(config) {
136
+ if (config.web3SignerUrl !== undefined && config.web3SignerUrl.length > 0) {
137
+ const keyStore = createKeyStoreFromWeb3Signer(config);
138
+ if (keyStore) {
139
+ return keyStore;
140
+ }
141
+ }
142
+ return createKeyStoreFromPublisherKeys(config);
143
+ }
@@ -0,0 +1,36 @@
1
+ import type { Archiver } from '@aztec-labs/archiver';
2
+ import type { BlobClientInterface } from '@aztec-labs/blob-client/client';
3
+ import type { EpochCacheInterface } from '@aztec-labs/epoch-cache';
4
+ import { L1TxUtils } from '@aztec-labs/ethereum/l1-tx-utils';
5
+ import { type Logger } from '@aztec-labs/foundation/log';
6
+ import { DateProvider } from '@aztec-labs/foundation/timer';
7
+ import { KeystoreManager } from '@aztec-labs/node-keystore';
8
+ import { type ProverClientUserConfig } from '@aztec-labs/prover-client';
9
+ import { type ProverPublisherConfig, type ProverTxSenderConfig } from '@aztec-labs/sequencer-client';
10
+ import type { AvmSimulator } from '@aztec-labs/simulator/server';
11
+ import type { ITxProvider, ProverConfig, ProvingJobBroker, Service, WorldStateSynchronizer } from '@aztec-labs/stdlib/interfaces/server';
12
+ import { type TelemetryClient } from '@aztec-labs/telemetry-client';
13
+ import type { SpecificProverNodeConfig } from './config.js';
14
+ import { ProverNode } from './prover-node.js';
15
+ import { ProverPublisherFactory } from './prover-publisher-factory.js';
16
+ export type ProverNodeDeps = {
17
+ telemetry?: TelemetryClient;
18
+ log?: Logger;
19
+ archiver: Archiver;
20
+ publisherFactory?: ProverPublisherFactory;
21
+ broker?: ProvingJobBroker;
22
+ l1TxUtils?: L1TxUtils;
23
+ dateProvider?: DateProvider;
24
+ worldStateSynchronizer: WorldStateSynchronizer;
25
+ p2pClient: {
26
+ getTxProvider(): ITxProvider;
27
+ } & Partial<Service>;
28
+ epochCache: EpochCacheInterface;
29
+ blobClient: BlobClientInterface;
30
+ keyStoreManager?: KeystoreManager;
31
+ /** AVM execution backend (simulator pool + CDB server) for public simulation. */
32
+ avmSimulator: AvmSimulator;
33
+ };
34
+ /** Creates a new prover node subsystem given a config and dependencies */
35
+ export declare function createProverNode(userConfig: SpecificProverNodeConfig & ProverConfig & ProverClientUserConfig & ProverPublisherConfig & ProverTxSenderConfig, deps: ProverNodeDeps): Promise<ProverNode>;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSW5FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUc3RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxPQUFPLEVBQTJCLEtBQUssc0JBQXNCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFckgsT0FBTyxFQUNMLEtBQUsscUJBQXFCLEVBQzFCLEtBQUssb0JBQW9CLEVBRTFCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLHNCQUFzQixFQUN2QixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sRUFBYSxLQUFLLGVBQWUsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUduRyxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdkUsTUFBTSxNQUFNLGNBQWMsR0FBRztJQUMzQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDNUIsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2IsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxFQUFFLHNCQUFzQixDQUFDO0lBQzFDLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0lBQzFCLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUN0QixZQUFZLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDNUIsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUM7SUFDL0MsU0FBUyxFQUFFO1FBQUUsYUFBYSxJQUFJLFdBQVcsQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELFVBQVUsRUFBRSxtQkFBbUIsQ0FBQztJQUNoQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsZUFBZSxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQ2xDLGlGQUFpRjtJQUNqRixZQUFZLEVBQUUsWUFBWSxDQUFDO0NBQzVCLENBQUM7QUFFRiwwRUFBMEU7QUFDMUUsd0JBQXNCLGdCQUFnQixDQUNwQyxVQUFVLEVBQUUsd0JBQXdCLEdBQ2xDLFlBQVksR0FDWixzQkFBc0IsR0FDdEIscUJBQXFCLEdBQ3JCLG9CQUFvQixFQUN0QixJQUFJLEVBQUUsY0FBYyx1QkFrSXJCIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAG7D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAA2B,KAAK,sBAAsB,EAAsB,MAAM,2BAA2B,CAAC;AAErH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,OAAO,EACP,sBAAsB,EACvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAa,KAAK,eAAe,EAAsB,MAAM,8BAA8B,CAAC;AAGnG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,UAAU,EAAE,mBAAmB,CAAC;IAChC,UAAU,EAAE,mBAAmB,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,iFAAiF;IACjF,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,0EAA0E;AAC1E,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,wBAAwB,GAClC,YAAY,GACZ,sBAAsB,GACtB,qBAAqB,GACrB,oBAAoB,EACtB,IAAI,EAAE,cAAc,uBAkIrB"}
@@ -0,0 +1,105 @@
1
+ import { Blob } from '@aztec-labs/blob-lib';
2
+ import { createEthereumChain } from '@aztec-labs/ethereum/chain';
3
+ import { makeL1HttpTransport } from '@aztec-labs/ethereum/client';
4
+ import { RollupContract } from '@aztec-labs/ethereum/contracts';
5
+ import { PublisherManager } from '@aztec-labs/ethereum/publisher-manager';
6
+ import { pick } from '@aztec-labs/foundation/collection';
7
+ import { createLogger } from '@aztec-labs/foundation/log';
8
+ import { DateProvider } from '@aztec-labs/foundation/timer';
9
+ import { createForwarderL1TxUtilsFromSigners, createL1TxUtilsFromSigners } from '@aztec-labs/node-lib/factories';
10
+ import { createProverClient } from '@aztec-labs/prover-client';
11
+ import { createAndStartProvingBroker } from '@aztec-labs/prover-client/broker';
12
+ import { getPublisherConfigFromProverConfig } from '@aztec-labs/sequencer-client';
13
+ import { L1Metrics, getTelemetryClient } from '@aztec-labs/telemetry-client';
14
+ import { createPublicClient } from 'viem';
15
+ import { ProverNode } from './prover-node.js';
16
+ import { ProverPublisherFactory } from './prover-publisher-factory.js';
17
+ /** Creates a new prover node subsystem given a config and dependencies */ export async function createProverNode(userConfig, deps) {
18
+ const config = {
19
+ ...userConfig
20
+ };
21
+ const telemetry = deps.telemetry ?? getTelemetryClient();
22
+ const dateProvider = deps.dateProvider ?? new DateProvider();
23
+ const log = deps.log ?? createLogger('prover');
24
+ const { p2pClient, archiver, keyStoreManager, worldStateSynchronizer } = deps;
25
+ // Extract the prover signers from the key store and verify that we have one.
26
+ await keyStoreManager?.validateSigners();
27
+ const proverSigners = keyStoreManager?.createProverSigners();
28
+ if (proverSigners === undefined) {
29
+ throw new Error('Failed to create prover key store configuration');
30
+ } else if (proverSigners.signers.length === 0) {
31
+ throw new Error('No prover signers found in the key store');
32
+ }
33
+ log.info(`Creating prover with publishers ${proverSigners.signers.map((signer)=>signer.address.toString()).join()}`);
34
+ // Only consider user provided config if it is valid
35
+ const proverIdInUserConfig = config.proverId === undefined || config.proverId.isZero() ? undefined : config.proverId;
36
+ // ProverId: Take from key store if provided, otherwise from user config if valid, otherwise address of first signer
37
+ const proverId = proverSigners.id ?? proverIdInUserConfig ?? proverSigners.signers[0].address;
38
+ // Now create the prover client configuration from this.
39
+ const proverClientConfig = {
40
+ ...config,
41
+ proverId
42
+ };
43
+ const broker = deps.broker ?? await createAndStartProvingBroker(config, telemetry);
44
+ const prover = await createProverClient(proverClientConfig, worldStateSynchronizer, broker, telemetry);
45
+ const { l1RpcUrls: rpcUrls, l1ChainId: chainId } = config;
46
+ const chain = createEthereumChain(rpcUrls, chainId);
47
+ const publicClient = createPublicClient({
48
+ chain: chain.chainInfo,
49
+ transport: makeL1HttpTransport(config.l1RpcUrls, {
50
+ timeout: config.l1HttpTimeoutMS
51
+ }),
52
+ pollingInterval: config.viemPollingIntervalMS
53
+ });
54
+ const rollupContract = new RollupContract(publicClient, config.rollupAddress.toString());
55
+ const l1TxUtils = deps.l1TxUtils ? [
56
+ deps.l1TxUtils
57
+ ] : config.proverPublisherForwarderAddress ? await createForwarderL1TxUtilsFromSigners(publicClient, proverSigners.signers, config.proverPublisherForwarderAddress, {
58
+ ...config,
59
+ scope: 'prover'
60
+ }, {
61
+ telemetry,
62
+ logger: log.createChild('l1-tx-utils'),
63
+ dateProvider,
64
+ kzg: Blob.getViemKzgInstance()
65
+ }) : await createL1TxUtilsFromSigners(publicClient, proverSigners.signers, {
66
+ ...config,
67
+ scope: 'prover'
68
+ }, {
69
+ telemetry,
70
+ logger: log.createChild('l1-tx-utils'),
71
+ dateProvider
72
+ });
73
+ // Create a funder L1TxUtils from the keystore funding account (if configured)
74
+ const fundingSigner = keyStoreManager?.createFundingSigner();
75
+ let funderL1TxUtils;
76
+ if (fundingSigner) {
77
+ const [funder] = await createL1TxUtilsFromSigners(publicClient, [
78
+ fundingSigner
79
+ ], {
80
+ ...config,
81
+ scope: 'prover'
82
+ }, {
83
+ telemetry,
84
+ logger: log.createChild('l1-tx-utils:funder'),
85
+ dateProvider
86
+ });
87
+ funderL1TxUtils = funder;
88
+ }
89
+ const publisherFactory = deps.publisherFactory ?? new ProverPublisherFactory(config, {
90
+ rollupContract,
91
+ proofSubmissionTarget: config.proofSubmissionTargetAddress,
92
+ publisherManager: new PublisherManager(l1TxUtils, getPublisherConfigFromProverConfig(config), {
93
+ bindings: log.getBindings(),
94
+ funder: funderL1TxUtils
95
+ }),
96
+ telemetry
97
+ });
98
+ const proverNodeConfig = {
99
+ ...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'proverNodeEpochProvingDelayMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'proverNodeDisableProofPublish', 'dataDirectory', 'l1ChainId', 'rollupVersion')
100
+ };
101
+ const l1Metrics = new L1Metrics(telemetry.getMeter('ProverNodeL1Metrics'), publicClient, l1TxUtils.map((utils)=>utils.getSenderAddress()));
102
+ // Extract the shared delayer from the first L1TxUtils instance (all instances share the same delayer)
103
+ const delayer = l1TxUtils[0]?.delayer;
104
+ return new ProverNode(prover, publisherFactory, archiver, archiver, archiver, worldStateSynchronizer, p2pClient, rollupContract, l1Metrics, deps.avmSimulator, proverNodeConfig, telemetry, delayer, dateProvider);
105
+ }
@@ -0,0 +1,8 @@
1
+ export * from './actions/index.js';
2
+ export * from './config.js';
3
+ export * from './factory.js';
4
+ export * from './monitors/index.js';
5
+ export * from './proof-publishing-service.js';
6
+ export * from './prover-node-publisher.js';
7
+ export * from './prover-node.js';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsa0JBQWtCLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
package/dest/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from './actions/index.js';
2
+ export * from './config.js';
3
+ export * from './factory.js';
4
+ export * from './monitors/index.js';
5
+ export * from './proof-publishing-service.js';
6
+ export * from './prover-node-publisher.js';
7
+ export * from './prover-node.js';