@aztec/prover-node 0.76.1 → 0.76.3

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 (76) hide show
  1. package/dest/config.d.ts +1 -7
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +2 -23
  4. package/dest/factory.d.ts.map +1 -1
  5. package/dest/factory.js +3 -32
  6. package/dest/job/epoch-proving-job.d.ts +1 -0
  7. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  8. package/dest/job/epoch-proving-job.js +4 -1
  9. package/dest/monitors/epoch-monitor.d.ts +0 -1
  10. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  11. package/dest/monitors/epoch-monitor.js +2 -2
  12. package/dest/monitors/index.d.ts +0 -1
  13. package/dest/monitors/index.d.ts.map +1 -1
  14. package/dest/monitors/index.js +1 -2
  15. package/dest/prover-node-publisher.d.ts +0 -7
  16. package/dest/prover-node-publisher.d.ts.map +1 -1
  17. package/dest/prover-node-publisher.js +9 -10
  18. package/dest/prover-node.d.ts +12 -26
  19. package/dest/prover-node.d.ts.map +1 -1
  20. package/dest/prover-node.js +24 -89
  21. package/package.json +20 -20
  22. package/src/config.ts +1 -37
  23. package/src/factory.ts +2 -40
  24. package/src/job/epoch-proving-job.ts +4 -0
  25. package/src/monitors/epoch-monitor.ts +1 -2
  26. package/src/monitors/index.ts +0 -1
  27. package/src/prover-node-publisher.ts +8 -10
  28. package/src/prover-node.ts +29 -106
  29. package/dest/bond/bond-manager.d.ts +0 -22
  30. package/dest/bond/bond-manager.d.ts.map +0 -1
  31. package/dest/bond/bond-manager.js +0 -42
  32. package/dest/bond/config.d.ts +0 -8
  33. package/dest/bond/config.d.ts.map +0 -1
  34. package/dest/bond/config.js +0 -17
  35. package/dest/bond/escrow-contract.d.ts +0 -19
  36. package/dest/bond/escrow-contract.d.ts.map +0 -1
  37. package/dest/bond/escrow-contract.js +0 -32
  38. package/dest/bond/factory.d.ts +0 -6
  39. package/dest/bond/factory.d.ts.map +0 -1
  40. package/dest/bond/factory.js +0 -17
  41. package/dest/bond/index.d.ts +0 -3
  42. package/dest/bond/index.d.ts.map +0 -1
  43. package/dest/bond/index.js +0 -3
  44. package/dest/bond/token-contract.d.ts +0 -26
  45. package/dest/bond/token-contract.d.ts.map +0 -1
  46. package/dest/bond/token-contract.js +0 -58
  47. package/dest/monitors/claims-monitor.d.ts +0 -24
  48. package/dest/monitors/claims-monitor.d.ts.map +0 -1
  49. package/dest/monitors/claims-monitor.js +0 -54
  50. package/dest/quote-provider/http.d.ts +0 -15
  51. package/dest/quote-provider/http.d.ts.map +0 -1
  52. package/dest/quote-provider/http.js +0 -33
  53. package/dest/quote-provider/index.d.ts +0 -6
  54. package/dest/quote-provider/index.d.ts.map +0 -1
  55. package/dest/quote-provider/index.js +0 -2
  56. package/dest/quote-provider/simple.d.ts +0 -9
  57. package/dest/quote-provider/simple.d.ts.map +0 -1
  58. package/dest/quote-provider/simple.js +0 -11
  59. package/dest/quote-provider/utils.d.ts +0 -4
  60. package/dest/quote-provider/utils.d.ts.map +0 -1
  61. package/dest/quote-provider/utils.js +0 -8
  62. package/dest/quote-signer.d.ts +0 -13
  63. package/dest/quote-signer.d.ts.map +0 -1
  64. package/dest/quote-signer.js +0 -18
  65. package/src/bond/bond-manager.ts +0 -48
  66. package/src/bond/config.ts +0 -25
  67. package/src/bond/escrow-contract.ts +0 -50
  68. package/src/bond/factory.ts +0 -28
  69. package/src/bond/index.ts +0 -2
  70. package/src/bond/token-contract.ts +0 -72
  71. package/src/monitors/claims-monitor.ts +0 -69
  72. package/src/quote-provider/http.ts +0 -48
  73. package/src/quote-provider/index.ts +0 -8
  74. package/src/quote-provider/simple.ts +0 -15
  75. package/src/quote-provider/utils.ts +0 -10
  76. package/src/quote-signer.ts +0 -24
@@ -1,5 +1,5 @@
1
1
  import { __esDecorate, __runInitializers } from "tslib";
2
- import { EpochProofQuotePayload, getTimestampRangeForEpoch, tryStop, } from '@aztec/circuit-types';
2
+ import { EpochProvingJobTerminalState, getTimestampRangeForEpoch, tryStop, } from '@aztec/circuit-types';
3
3
  import { compact } from '@aztec/foundation/collection';
4
4
  import { memoize } from '@aztec/foundation/decorators';
5
5
  import { createLogger } from '@aztec/foundation/log';
@@ -23,7 +23,7 @@ let ProverNode = (() => {
23
23
  let _checkForTxs_decorators;
24
24
  let _gatherEpochData_decorators;
25
25
  return _a = class ProverNode {
26
- constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, coordination, quoteProvider, quoteSigner, claimsMonitor, epochsMonitor, bondManager, options = {}, telemetryClient = getTelemetryClient()) {
26
+ constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, coordination, epochsMonitor, options = {}, telemetryClient = getTelemetryClient()) {
27
27
  this.prover = (__runInitializers(this, _instanceExtraInitializers), prover);
28
28
  this.publisher = publisher;
29
29
  this.l2BlockSource = l2BlockSource;
@@ -31,11 +31,7 @@ let ProverNode = (() => {
31
31
  this.contractDataSource = contractDataSource;
32
32
  this.worldState = worldState;
33
33
  this.coordination = coordination;
34
- this.quoteProvider = quoteProvider;
35
- this.quoteSigner = quoteSigner;
36
- this.claimsMonitor = claimsMonitor;
37
34
  this.epochsMonitor = epochsMonitor;
38
- this.bondManager = bondManager;
39
35
  this.telemetryClient = telemetryClient;
40
36
  this.log = createLogger('prover-node');
41
37
  this.dateProvider = new DateProvider();
@@ -61,81 +57,24 @@ let ProverNode = (() => {
61
57
  }
62
58
  return undefined;
63
59
  }
64
- async handleClaim(proofClaim) {
65
- if (proofClaim.epochToProve === this.latestEpochWeAreProving) {
66
- this.log.verbose(`Already proving claim for epoch ${proofClaim.epochToProve}`);
67
- return;
68
- }
69
- const provenEpoch = await this.l2BlockSource.getProvenL2EpochNumber();
70
- if (provenEpoch !== undefined && proofClaim.epochToProve <= provenEpoch) {
71
- this.log.verbose(`Claim for epoch ${proofClaim.epochToProve} is already proven`);
72
- return;
73
- }
74
- try {
75
- await this.startProof(proofClaim.epochToProve);
76
- this.latestEpochWeAreProving = proofClaim.epochToProve;
77
- }
78
- catch (err) {
79
- this.log.error(`Error handling claim for epoch ${proofClaim.epochToProve}`, err);
80
- }
81
- try {
82
- // Staked amounts are lowered after a claim, so this is a good time for doing a top-up if needed
83
- await this.bondManager.ensureBond();
84
- }
85
- catch (err) {
86
- this.log.error(`Error ensuring prover bond after handling claim for epoch ${proofClaim.epochToProve}`, err);
87
- }
88
- }
89
60
  /**
90
- * Handles the epoch number to prove when the prover node starts by checking if there
91
- * is an existing claim for it. If not, it creates and sends a quote for it.
92
- * @param epochNumber - The epoch immediately before the current one when the prover node starts.
93
- */
94
- async handleInitialEpochSync(epochNumber) {
95
- try {
96
- const claim = await this.publisher.getProofClaim();
97
- if (!claim || claim.epochToProve < epochNumber) {
98
- this.log.verbose(`Handling epoch ${epochNumber} completed as initial sync`);
99
- await this.handleEpochCompleted(epochNumber);
100
- }
101
- }
102
- catch (err) {
103
- this.log.error(`Error handling initial epoch sync`, err);
104
- }
105
- }
106
- /**
107
- * Handles an epoch being completed by sending a quote for proving it.
61
+ * Handles an epoch being completed by starting a proof for it if there are no active jobs for it.
108
62
  * @param epochNumber - The epoch number that was just completed.
109
63
  */
110
64
  async handleEpochCompleted(epochNumber) {
111
65
  try {
112
- // Gather data for the epoch
113
- const epochData = await this.gatherEpochData(epochNumber);
114
- const { blocks } = epochData;
115
- this.cachedEpochData = { epochNumber, ...epochData };
116
- // Construct a quote for the epoch
117
- const partialQuote = await this.quoteProvider.getQuote(Number(epochNumber), blocks);
118
- if (!partialQuote) {
119
- this.log.info(`No quote produced for epoch ${epochNumber}`);
66
+ this.log.debug('jobs', JSON.stringify(this.jobs, null, 2));
67
+ const activeJobs = await this.getActiveJobsForEpoch(epochNumber);
68
+ if (activeJobs.length > 0) {
69
+ this.log.info(`Not starting proof for ${epochNumber} since there are active jobs`);
120
70
  return;
121
71
  }
122
- // Ensure we have deposited enough funds for sending this quote
123
- await this.bondManager.ensureBond(partialQuote.bondAmount);
124
- // Assemble and sign full quote
125
- const quote = EpochProofQuotePayload.from({
126
- ...partialQuote,
127
- epochToProve: BigInt(epochNumber),
128
- prover: this.publisher.getSenderAddress(),
129
- validUntilSlot: partialQuote.validUntilSlot ?? BigInt(Number.MAX_SAFE_INTEGER), // Should we constrain this?
130
- });
131
- const signed = await this.quoteSigner.sign(quote);
132
- // Send it to the coordinator
133
- this.log.info(`Sending quote for epoch ${epochNumber} with blocks ${blocks[0].number} to ${blocks.at(-1).number}`, quote.toViemArgs());
134
- await this.doSendEpochProofQuote(signed);
72
+ // TODO: we probably want to skip starting a proof if we are too far into the current epoch
73
+ await this.startProof(epochNumber);
135
74
  }
136
75
  catch (err) {
137
76
  if (err instanceof EmptyEpochError) {
138
- this.log.info(`Not producing quote for ${epochNumber} since no blocks were found`);
77
+ this.log.info(`Not starting proof for ${epochNumber} since no blocks were found`);
139
78
  }
140
79
  else {
141
80
  this.log.error(`Error handling epoch completed`, err);
@@ -143,15 +82,12 @@ let ProverNode = (() => {
143
82
  }
144
83
  }
145
84
  /**
146
- * Starts the prover node so it periodically checks for unproven epochs in the unfinalised chain from L1 and sends
147
- * quotes for them, as well as monitors the claims for the epochs it has sent quotes for and starts proving jobs.
148
- * This method returns once the prover node has deposited an initial bond into the escrow contract.
85
+ * Starts the prover node so it periodically checks for unproven epochs in the unfinalised chain from L1 and
86
+ * starts proving jobs for them.
149
87
  */
150
- async start() {
88
+ start() {
151
89
  this.txFetcher.start();
152
- await this.bondManager.ensureBond();
153
90
  this.epochsMonitor.start(this);
154
- this.claimsMonitor.start(this);
155
91
  this.log.info('Started ProverNode', this.options);
156
92
  }
157
93
  /**
@@ -161,7 +97,6 @@ let ProverNode = (() => {
161
97
  this.log.info('Stopping ProverNode');
162
98
  await this.txFetcher.stop();
163
99
  await this.epochsMonitor.stop();
164
- await this.claimsMonitor.stop();
165
100
  await this.prover.stop();
166
101
  await tryStop(this.l2BlockSource);
167
102
  this.publisher.interrupt();
@@ -171,14 +106,6 @@ let ProverNode = (() => {
171
106
  await this.telemetryClient.stop();
172
107
  this.log.info('Stopped ProverNode');
173
108
  }
174
- /** Sends an epoch proof quote to the coordinator. */
175
- sendEpochProofQuote(quote) {
176
- this.log.info(`Sending quote for epoch`, quote.toViemArgs().quote);
177
- return this.doSendEpochProofQuote(quote);
178
- }
179
- doSendEpochProofQuote(quote) {
180
- return this.coordination.addEpochProofQuote(quote);
181
- }
182
109
  /**
183
110
  * Creates a proof for a block range. Returns once the proof has been submitted to L1.
184
111
  */
@@ -203,7 +130,16 @@ let ProverNode = (() => {
203
130
  * Returns an array of jobs being processed.
204
131
  */
205
132
  getJobs() {
206
- return Promise.resolve(Array.from(this.jobs.entries()).map(([uuid, job]) => ({ uuid, status: job.getState() })));
133
+ return Promise.resolve(Array.from(this.jobs.entries()).map(([uuid, job]) => ({
134
+ uuid,
135
+ status: job.getState(),
136
+ epochNumber: Number(job.getEpochNumber()),
137
+ })));
138
+ }
139
+ async getActiveJobsForEpoch(epochBigInt) {
140
+ const jobs = await this.getJobs();
141
+ const epochNumber = Number(epochBigInt);
142
+ return jobs.filter(job => job.epochNumber === epochNumber && !EpochProvingJobTerminalState.includes(job.status));
207
143
  }
208
144
  checkMaximumPendingJobs() {
209
145
  const { maxPendingJobs } = this.options;
@@ -283,7 +219,6 @@ let ProverNode = (() => {
283
219
  /** Extracted for testing purposes. */
284
220
  async triggerMonitors() {
285
221
  await this.epochsMonitor.work();
286
- await this.claimsMonitor.work();
287
222
  }
288
223
  },
289
224
  (() => {
@@ -307,4 +242,4 @@ class EmptyEpochError extends Error {
307
242
  this.name = 'EmptyEpochError';
308
243
  }
309
244
  }
310
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFHTCxzQkFBc0IsRUFZdEIseUJBQXlCLEVBQ3pCLE9BQU8sR0FDUixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUNMLFVBQVUsRUFJVixrQkFBa0IsRUFDbEIsU0FBUyxHQUNWLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxFQUFFLGVBQWUsRUFBNkIsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFnQmpEOzs7OztHQUtHO0lBQ1UsVUFBVTs7Ozs7OztzQkFBVixVQUFVO1lBZXJCLFlBQ3FCLE1BQTBCLEVBQzFCLFNBQThCLEVBQzlCLGFBQTZDLEVBQzdDLG1CQUF3QyxFQUN4QyxrQkFBc0MsRUFDdEMsVUFBa0MsRUFDbEMsWUFBaUQsRUFDakQsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsYUFBMkIsRUFDM0IsV0FBd0IsRUFDM0MsVUFBc0MsRUFBRSxFQUNyQixrQkFBbUMsa0JBQWtCLEVBQUU7Z0JBYnZELFdBQU0sSUFoQmhCLG1EQUFVLEVBZ0JBLE1BQU0sRUFBb0I7Z0JBQzFCLGNBQVMsR0FBVCxTQUFTLENBQXFC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
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCw0QkFBNEIsRUFXNUIseUJBQXlCLEVBQ3pCLE9BQU8sR0FDUixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUNMLFVBQVUsRUFJVixrQkFBa0IsRUFDbEIsU0FBUyxHQUNWLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGVBQWUsRUFBNkIsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFhakQ7Ozs7O0dBS0c7SUFDVSxVQUFVOzs7Ozs7O3NCQUFWLFVBQVU7WUFlckIsWUFDcUIsTUFBMEIsRUFDMUIsU0FBOEIsRUFDOUIsYUFBNkMsRUFDN0MsbUJBQXdDLEVBQ3hDLGtCQUFzQyxFQUN0QyxVQUFrQyxFQUNsQyxZQUFpRCxFQUNqRCxhQUEyQixFQUM5QyxVQUFzQyxFQUFFLEVBQ3JCLGtCQUFtQyxrQkFBa0IsRUFBRTtnQkFUdkQsV0FBTSxJQWhCaEIsbURBQVUsRUFnQkEsTUFBTSxFQUFvQjtnQkFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBcUI7Z0JBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFnQztnQkFDN0Msd0JBQW1CLEdBQW5C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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/prover-node",
3
- "version": "0.76.1",
3
+ "version": "0.76.3",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -53,25 +53,25 @@
53
53
  ]
54
54
  },
55
55
  "dependencies": {
56
- "@aztec/archiver": "0.76.1",
57
- "@aztec/bb-prover": "0.76.1",
58
- "@aztec/blob-sink": "0.76.1",
59
- "@aztec/circuit-types": "0.76.1",
60
- "@aztec/circuits.js": "0.76.1",
61
- "@aztec/epoch-cache": "0.76.1",
62
- "@aztec/ethereum": "0.76.1",
63
- "@aztec/foundation": "0.76.1",
64
- "@aztec/kv-store": "0.76.1",
65
- "@aztec/l1-artifacts": "0.76.1",
66
- "@aztec/noir-protocol-circuits-types": "0.76.1",
67
- "@aztec/p2p": "0.76.1",
68
- "@aztec/protocol-contracts": "0.76.1",
69
- "@aztec/prover-client": "0.76.1",
70
- "@aztec/sequencer-client": "0.76.1",
71
- "@aztec/simulator": "0.76.1",
72
- "@aztec/telemetry-client": "0.76.1",
73
- "@aztec/types": "0.76.1",
74
- "@aztec/world-state": "0.76.1",
56
+ "@aztec/archiver": "0.76.3",
57
+ "@aztec/bb-prover": "0.76.3",
58
+ "@aztec/blob-sink": "0.76.3",
59
+ "@aztec/circuit-types": "0.76.3",
60
+ "@aztec/circuits.js": "0.76.3",
61
+ "@aztec/epoch-cache": "0.76.3",
62
+ "@aztec/ethereum": "0.76.3",
63
+ "@aztec/foundation": "0.76.3",
64
+ "@aztec/kv-store": "0.76.3",
65
+ "@aztec/l1-artifacts": "0.76.3",
66
+ "@aztec/noir-protocol-circuits-types": "0.76.3",
67
+ "@aztec/p2p": "0.76.3",
68
+ "@aztec/protocol-contracts": "0.76.3",
69
+ "@aztec/prover-client": "0.76.3",
70
+ "@aztec/sequencer-client": "0.76.3",
71
+ "@aztec/simulator": "0.76.3",
72
+ "@aztec/telemetry-client": "0.76.3",
73
+ "@aztec/types": "0.76.3",
74
+ "@aztec/world-state": "0.76.3",
75
75
  "source-map-support": "^0.5.21",
76
76
  "tslib": "^2.4.0",
77
77
  "viem": "2.22.8"
package/src/config.ts CHANGED
@@ -1,11 +1,6 @@
1
1
  import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver/config';
2
2
  import { type ACVMConfig, type BBConfig } from '@aztec/bb-prover/config';
3
- import {
4
- type ConfigMappingsType,
5
- bigintConfigHelper,
6
- getConfigFromMappings,
7
- numberConfigHelper,
8
- } from '@aztec/foundation/config';
3
+ import { type ConfigMappingsType, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
9
4
  import { type DataStoreConfig, dataConfigMappings, getDataConfigFromEnv } from '@aztec/kv-store/config';
10
5
  import { type P2PConfig, getP2PConfigFromEnv, p2pConfigMappings } from '@aztec/p2p/config';
11
6
  import {
@@ -30,7 +25,6 @@ import {
30
25
  } from '@aztec/sequencer-client/config';
31
26
  import { type WorldStateConfig, getWorldStateConfigFromEnv, worldStateConfigMappings } from '@aztec/world-state/config';
32
27
 
33
- import { type ProverBondManagerConfig, proverBondManagerConfigMappings } from './bond/config.js';
34
28
  import {
35
29
  type ProverCoordinationConfig,
36
30
  getTxProviderConfigFromEnv,
@@ -45,8 +39,6 @@ export type ProverNodeConfig = ArchiverConfig &
45
39
  TxSenderConfig &
46
40
  DataStoreConfig &
47
41
  ProverCoordinationConfig &
48
- ProverBondManagerConfig &
49
- QuoteProviderConfig &
50
42
  SpecificProverNodeConfig;
51
43
 
52
44
  type SpecificProverNodeConfig = {
@@ -58,12 +50,6 @@ type SpecificProverNodeConfig = {
58
50
  txGatheringMaxParallelRequests: number;
59
51
  };
60
52
 
61
- export type QuoteProviderConfig = {
62
- quoteProviderBasisPointFee: number;
63
- quoteProviderBondAmount: bigint;
64
- quoteProviderUrl?: string;
65
- };
66
-
67
53
  const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeConfig> = {
68
54
  proverNodeMaxPendingJobs: {
69
55
  env: 'PROVER_NODE_MAX_PENDING_JOBS',
@@ -97,24 +83,6 @@ const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeCon
97
83
  },
98
84
  };
99
85
 
100
- const quoteProviderConfigMappings: ConfigMappingsType<QuoteProviderConfig> = {
101
- quoteProviderBasisPointFee: {
102
- env: 'QUOTE_PROVIDER_BASIS_POINT_FEE',
103
- description: 'The basis point fee to charge for providing quotes',
104
- ...numberConfigHelper(100),
105
- },
106
- quoteProviderBondAmount: {
107
- env: 'QUOTE_PROVIDER_BOND_AMOUNT',
108
- description: 'The bond amount to charge for providing quotes',
109
- ...bigintConfigHelper(1000n),
110
- },
111
- quoteProviderUrl: {
112
- env: 'QUOTE_PROVIDER_URL',
113
- description:
114
- 'The URL of the remote quote provider. Overrides QUOTE_PROVIDER_BASIS_POINT_FEE and QUOTE_PROVIDER_BOND_AMOUNT.',
115
- },
116
- };
117
-
118
86
  export const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig> = {
119
87
  ...dataConfigMappings,
120
88
  ...archiverConfigMappings,
@@ -124,8 +92,6 @@ export const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig> = {
124
92
  ...getPublisherConfigMappings('PROVER'),
125
93
  ...getTxSenderConfigMappings('PROVER'),
126
94
  ...proverCoordinationConfigMappings,
127
- ...quoteProviderConfigMappings,
128
- ...proverBondManagerConfigMappings,
129
95
  ...specificProverNodeConfigMappings,
130
96
  };
131
97
 
@@ -139,9 +105,7 @@ export function getProverNodeConfigFromEnv(): ProverNodeConfig {
139
105
  ...getPublisherConfigFromEnv('PROVER'),
140
106
  ...getTxSenderConfigFromEnv('PROVER'),
141
107
  ...getTxProviderConfigFromEnv(),
142
- ...getConfigFromMappings(quoteProviderConfigMappings),
143
108
  ...getConfigFromMappings(specificProverNodeConfigMappings),
144
- ...getConfigFromMappings(proverBondManagerConfigMappings),
145
109
  };
146
110
  }
147
111
 
package/src/factory.ts CHANGED
@@ -3,28 +3,18 @@ import { type BlobSinkClientInterface, createBlobSinkClient } from '@aztec/blob-
3
3
  import { type ProverCoordination, type ProvingJobBroker } from '@aztec/circuit-types';
4
4
  import { EpochCache } from '@aztec/epoch-cache';
5
5
  import { L1TxUtils, RollupContract, createEthereumChain, createL1Clients } from '@aztec/ethereum';
6
- import { Buffer32 } from '@aztec/foundation/buffer';
7
- import { EthAddress } from '@aztec/foundation/eth-address';
8
6
  import { type Logger, createLogger } from '@aztec/foundation/log';
9
7
  import { type DataStoreConfig } from '@aztec/kv-store/config';
10
- import { RollupAbi } from '@aztec/l1-artifacts';
11
8
  import { createProverClient } from '@aztec/prover-client';
12
9
  import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
13
10
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
14
11
  import { createWorldStateSynchronizer } from '@aztec/world-state';
15
12
 
16
- import { createPublicClient, getAddress, getContract, http } from 'viem';
17
-
18
- import { createBondManager } from './bond/factory.js';
19
- import { type ProverNodeConfig, type QuoteProviderConfig } from './config.js';
20
- import { ClaimsMonitor } from './monitors/claims-monitor.js';
13
+ import { type ProverNodeConfig } from './config.js';
21
14
  import { EpochMonitor } from './monitors/epoch-monitor.js';
22
15
  import { createProverCoordination } from './prover-coordination/factory.js';
23
16
  import { ProverNodePublisher } from './prover-node-publisher.js';
24
17
  import { ProverNode, type ProverNodeOptions } from './prover-node.js';
25
- import { HttpQuoteProvider } from './quote-provider/http.js';
26
- import { SimpleQuoteProvider } from './quote-provider/simple.js';
27
- import { QuoteSigner } from './quote-signer.js';
28
18
 
29
19
  /** Creates a new prover node given a config. */
30
20
  export async function createProverNode(
@@ -64,7 +54,7 @@ export async function createProverNode(
64
54
 
65
55
  const epochCache = await EpochCache.create(config.l1Contracts.rollupAddress, config);
66
56
 
67
- // If config.p2pEnabled is true, createProverCoordination will create a p2p client where quotes will be shared and tx's requested
57
+ // If config.p2pEnabled is true, createProverCoordination will create a p2p client where txs are requested
68
58
  // If config.p2pEnabled is false, createProverCoordination request information from the AztecNode
69
59
  const proverCoordination = await createProverCoordination(config, {
70
60
  aztecNodeTxProvider: deps.aztecNodeTxProvider,
@@ -74,9 +64,6 @@ export async function createProverNode(
74
64
  telemetry,
75
65
  });
76
66
 
77
- const quoteProvider = createQuoteProvider(config);
78
- const quoteSigner = createQuoteSigner(config);
79
-
80
67
  const proverNodeConfig: ProverNodeOptions = {
81
68
  maxPendingJobs: config.proverNodeMaxPendingJobs,
82
69
  pollingIntervalMs: config.proverNodePollingIntervalMs,
@@ -86,12 +73,8 @@ export async function createProverNode(
86
73
  txGatheringTimeoutMs: config.txGatheringTimeoutMs,
87
74
  };
88
75
 
89
- const claimsMonitor = new ClaimsMonitor(publisher, proverNodeConfig, telemetry);
90
76
  const epochMonitor = new EpochMonitor(archiver, proverNodeConfig, telemetry);
91
77
 
92
- const escrowContractAddress = await rollupContract.getProofCommitmentEscrow();
93
- const bondManager = await createBondManager(EthAddress.fromString(escrowContractAddress), walletClient, config);
94
-
95
78
  return new ProverNode(
96
79
  prover,
97
80
  publisher,
@@ -100,29 +83,8 @@ export async function createProverNode(
100
83
  archiver,
101
84
  worldStateSynchronizer,
102
85
  proverCoordination,
103
- quoteProvider,
104
- quoteSigner,
105
- claimsMonitor,
106
86
  epochMonitor,
107
- bondManager,
108
87
  proverNodeConfig,
109
88
  telemetry,
110
89
  );
111
90
  }
112
-
113
- function createQuoteProvider(config: QuoteProviderConfig) {
114
- return config.quoteProviderUrl
115
- ? new HttpQuoteProvider(config.quoteProviderUrl)
116
- : new SimpleQuoteProvider(config.quoteProviderBasisPointFee, config.quoteProviderBondAmount);
117
- }
118
-
119
- function createQuoteSigner(config: ProverNodeConfig) {
120
- // REFACTOR: We need a package that just returns an instance of a rollup contract ready to use
121
- const { l1RpcUrl: rpcUrl, l1ChainId: chainId, l1Contracts } = config;
122
- const chain = createEthereumChain(rpcUrl, chainId);
123
- const client = createPublicClient({ chain: chain.chainInfo, transport: http(chain.rpcUrl) });
124
- const address = getAddress(l1Contracts.rollupAddress.toString());
125
- const rollupContract = getContract({ address, abi: RollupAbi, client });
126
- const privateKey = config.publisherPrivateKey;
127
- return QuoteSigner.new(Buffer32.fromString(privateKey), rollupContract);
128
- }
@@ -63,6 +63,10 @@ export class EpochProvingJob implements Traceable {
63
63
  return this.state;
64
64
  }
65
65
 
66
+ public getEpochNumber(): bigint {
67
+ return this.epochNumber;
68
+ }
69
+
66
70
  /**
67
71
  * Proves the given epoch and submits the proof to L1.
68
72
  */
@@ -10,7 +10,6 @@ import {
10
10
  } from '@aztec/telemetry-client';
11
11
 
12
12
  export interface EpochMonitorHandler {
13
- handleInitialEpochSync(epochNumber: bigint): Promise<void>;
14
13
  handleEpochCompleted(epochNumber: bigint): Promise<void>;
15
14
  }
16
15
 
@@ -48,7 +47,7 @@ export class EpochMonitor implements Traceable {
48
47
  if (!this.latestEpochNumber) {
49
48
  const epochNumber = await this.l2BlockSource.getL2EpochNumber();
50
49
  if (epochNumber > 0n) {
51
- await this.handler?.handleInitialEpochSync(epochNumber - 1n);
50
+ await this.handler?.handleEpochCompleted(epochNumber - 1n);
52
51
  }
53
52
  this.latestEpochNumber = epochNumber;
54
53
  return;
@@ -1,2 +1 @@
1
- export * from './claims-monitor.js';
2
1
  export * from './epoch-monitor.js';
@@ -85,10 +85,6 @@ export class ProverNodePublisher {
85
85
  return EthAddress.fromString(this.l1TxUtils.getSenderAddress());
86
86
  }
87
87
 
88
- public getProofClaim() {
89
- return this.rollupContract.getProofClaim();
90
- }
91
-
92
88
  public async submitEpochProof(args: {
93
89
  epochNumber: number;
94
90
  fromBlock: number;
@@ -205,11 +201,12 @@ export class ProverNodePublisher {
205
201
 
206
202
  const txArgs = [
207
203
  {
208
- epochSize: argsArray[0],
209
- args: argsArray[1],
210
- fees: argsArray[2],
211
- blobPublicInputs: argsArray[3],
212
- aggregationObject: argsArray[4],
204
+ start: argsArray[0],
205
+ end: argsArray[1],
206
+ args: argsArray[2],
207
+ fees: argsArray[3],
208
+ blobPublicInputs: argsArray[4],
209
+ aggregationObject: argsArray[5],
213
210
  proof: proofHex,
214
211
  },
215
212
  ] as const;
@@ -252,7 +249,8 @@ export class ProverNodePublisher {
252
249
  proof: Proof;
253
250
  }) {
254
251
  return [
255
- BigInt(args.toBlock - args.fromBlock + 1),
252
+ BigInt(args.fromBlock),
253
+ BigInt(args.toBlock),
256
254
  [
257
255
  args.publicInputs.previousArchive.root.toString(),
258
256
  args.publicInputs.endArchive.root.toString(),