@aztec/prover-node 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (80) hide show
  1. package/dest/bond/bond-manager.js +10 -12
  2. package/dest/bond/config.js +3 -4
  3. package/dest/bond/escrow-contract.js +23 -15
  4. package/dest/bond/factory.js +4 -2
  5. package/dest/bond/index.js +0 -1
  6. package/dest/bond/token-contract.js +52 -29
  7. package/dest/config.js +20 -21
  8. package/dest/factory.js +26 -14
  9. package/dest/http.js +1 -3
  10. package/dest/index.js +0 -1
  11. package/dest/job/epoch-proving-job.js +230 -190
  12. package/dest/metrics.js +33 -23
  13. package/dest/monitors/claims-monitor.js +52 -51
  14. package/dest/monitors/epoch-monitor.js +48 -47
  15. package/dest/monitors/index.js +0 -1
  16. package/dest/prover-coordination/config.js +2 -3
  17. package/dest/prover-coordination/factory.js +8 -7
  18. package/dest/prover-coordination/index.js +0 -1
  19. package/dest/prover-node-publisher.js +46 -43
  20. package/dest/prover-node.js +303 -308
  21. package/dest/quote-provider/http.js +11 -5
  22. package/dest/quote-provider/index.js +1 -2
  23. package/dest/quote-provider/simple.js +7 -3
  24. package/dest/quote-provider/utils.js +2 -3
  25. package/dest/quote-signer.js +6 -3
  26. package/dest/test/index.js +2 -1
  27. package/package.json +19 -19
  28. package/src/prover-node.ts +34 -62
  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/config.d.ts +0 -8
  32. package/dest/bond/config.d.ts.map +0 -1
  33. package/dest/bond/escrow-contract.d.ts +0 -19
  34. package/dest/bond/escrow-contract.d.ts.map +0 -1
  35. package/dest/bond/factory.d.ts +0 -6
  36. package/dest/bond/factory.d.ts.map +0 -1
  37. package/dest/bond/index.d.ts +0 -3
  38. package/dest/bond/index.d.ts.map +0 -1
  39. package/dest/bond/token-contract.d.ts +0 -26
  40. package/dest/bond/token-contract.d.ts.map +0 -1
  41. package/dest/config.d.ts +0 -31
  42. package/dest/config.d.ts.map +0 -1
  43. package/dest/factory.d.ts +0 -22
  44. package/dest/factory.d.ts.map +0 -1
  45. package/dest/http.d.ts +0 -8
  46. package/dest/http.d.ts.map +0 -1
  47. package/dest/index.d.ts +0 -6
  48. package/dest/index.d.ts.map +0 -1
  49. package/dest/job/epoch-proving-job.d.ts +0 -50
  50. package/dest/job/epoch-proving-job.d.ts.map +0 -1
  51. package/dest/metrics.d.ts +0 -23
  52. package/dest/metrics.d.ts.map +0 -1
  53. package/dest/monitors/claims-monitor.d.ts +0 -24
  54. package/dest/monitors/claims-monitor.d.ts.map +0 -1
  55. package/dest/monitors/epoch-monitor.d.ts +0 -22
  56. package/dest/monitors/epoch-monitor.d.ts.map +0 -1
  57. package/dest/monitors/index.d.ts +0 -3
  58. package/dest/monitors/index.d.ts.map +0 -1
  59. package/dest/prover-coordination/config.d.ts +0 -7
  60. package/dest/prover-coordination/config.d.ts.map +0 -1
  61. package/dest/prover-coordination/factory.d.ts +0 -22
  62. package/dest/prover-coordination/factory.d.ts.map +0 -1
  63. package/dest/prover-coordination/index.d.ts +0 -3
  64. package/dest/prover-coordination/index.d.ts.map +0 -1
  65. package/dest/prover-node-publisher.d.ts +0 -67
  66. package/dest/prover-node-publisher.d.ts.map +0 -1
  67. package/dest/prover-node.d.ts +0 -107
  68. package/dest/prover-node.d.ts.map +0 -1
  69. package/dest/quote-provider/http.d.ts +0 -15
  70. package/dest/quote-provider/http.d.ts.map +0 -1
  71. package/dest/quote-provider/index.d.ts +0 -6
  72. package/dest/quote-provider/index.d.ts.map +0 -1
  73. package/dest/quote-provider/simple.d.ts +0 -9
  74. package/dest/quote-provider/simple.d.ts.map +0 -1
  75. package/dest/quote-provider/utils.d.ts +0 -4
  76. package/dest/quote-provider/utils.d.ts.map +0 -1
  77. package/dest/quote-signer.d.ts +0 -13
  78. package/dest/quote-signer.d.ts.map +0 -1
  79. package/dest/test/index.d.ts +0 -10
  80. package/dest/test/index.d.ts.map +0 -1
@@ -1,54 +1,55 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
2
7
  import { createLogger } from '@aztec/foundation/log';
3
8
  import { RunningPromise } from '@aztec/foundation/running-promise';
4
- import { getTelemetryClient, trackSpan, } from '@aztec/telemetry-client';
5
- let ClaimsMonitor = (() => {
6
- var _a;
7
- let _instanceExtraInitializers = [];
8
- let _work_decorators;
9
- return _a = class ClaimsMonitor {
10
- constructor(l1Publisher, options, telemetry = getTelemetryClient()) {
11
- this.l1Publisher = (__runInitializers(this, _instanceExtraInitializers), l1Publisher);
12
- this.options = options;
13
- this.log = createLogger('prover-node:claims-monitor');
14
- this.tracer = telemetry.getTracer('ClaimsMonitor');
15
- this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs);
9
+ import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
+ export class ClaimsMonitor {
11
+ l1Publisher;
12
+ options;
13
+ runningPromise;
14
+ log;
15
+ handler;
16
+ lastClaimEpochNumber;
17
+ tracer;
18
+ constructor(l1Publisher, options, telemetry = getTelemetryClient()){
19
+ this.l1Publisher = l1Publisher;
20
+ this.options = options;
21
+ this.log = createLogger('prover-node:claims-monitor');
22
+ this.tracer = telemetry.getTracer('ClaimsMonitor');
23
+ this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs);
24
+ }
25
+ start(handler) {
26
+ this.handler = handler;
27
+ this.runningPromise.start();
28
+ this.log.info(`Started ClaimsMonitor with prover address ${this.getProverAddress().toString()}`, this.options);
29
+ }
30
+ async stop() {
31
+ this.log.verbose('Stopping ClaimsMonitor');
32
+ await this.runningPromise.stop();
33
+ this.log.info('Stopped ClaimsMonitor');
34
+ }
35
+ async work() {
36
+ const proofClaim = await this.l1Publisher.getProofClaim();
37
+ if (!proofClaim) {
38
+ this.log.trace(`Found no proof claim`);
39
+ return;
40
+ }
41
+ if (this.lastClaimEpochNumber === undefined || proofClaim.epochToProve > this.lastClaimEpochNumber) {
42
+ this.log.verbose(`Found new claim for epoch ${proofClaim.epochToProve} by ${proofClaim.bondProvider.toString()}`);
43
+ if (proofClaim.bondProvider.equals(this.getProverAddress())) {
44
+ await this.handler?.handleClaim(proofClaim);
16
45
  }
17
- start(handler) {
18
- this.handler = handler;
19
- this.runningPromise.start();
20
- this.log.info(`Started ClaimsMonitor with prover address ${this.getProverAddress().toString()}`, this.options);
21
- }
22
- async stop() {
23
- this.log.verbose('Stopping ClaimsMonitor');
24
- await this.runningPromise.stop();
25
- this.log.info('Stopped ClaimsMonitor');
26
- }
27
- async work() {
28
- const proofClaim = await this.l1Publisher.getProofClaim();
29
- if (!proofClaim) {
30
- this.log.trace(`Found no proof claim`);
31
- return;
32
- }
33
- if (this.lastClaimEpochNumber === undefined || proofClaim.epochToProve > this.lastClaimEpochNumber) {
34
- this.log.verbose(`Found new claim for epoch ${proofClaim.epochToProve} by ${proofClaim.bondProvider.toString()}`);
35
- if (proofClaim.bondProvider.equals(this.getProverAddress())) {
36
- await this.handler?.handleClaim(proofClaim);
37
- }
38
- this.lastClaimEpochNumber = proofClaim.epochToProve;
39
- }
40
- }
41
- getProverAddress() {
42
- return this.l1Publisher.getSenderAddress();
43
- }
44
- },
45
- (() => {
46
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
47
- _work_decorators = [trackSpan('ClaimsMonitor.work')];
48
- __esDecorate(_a, null, _work_decorators, { kind: "method", name: "work", static: false, private: false, access: { has: obj => "work" in obj, get: obj => obj.work }, metadata: _metadata }, null, _instanceExtraInitializers);
49
- if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
50
- })(),
51
- _a;
52
- })();
53
- export { ClaimsMonitor };
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhaW1zLW1vbml0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9uaXRvcnMvY2xhaW1zLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUlMLGtCQUFrQixFQUNsQixTQUFTLEdBQ1YsTUFBTSx5QkFBeUIsQ0FBQztJQVFwQixhQUFhOzs7O3NCQUFiLGFBQWE7WUFTeEIsWUFDbUIsV0FBZ0MsRUFDekMsT0FBc0MsRUFDOUMsWUFBNkIsa0JBQWtCLEVBQUU7Z0JBRmhDLGdCQUFXLElBVm5CLG1EQUFhLEVBVUwsV0FBVyxFQUFxQjtnQkFDekMsWUFBTyxHQUFQLE9BQU8sQ0FBK0I7Z0JBVHhDLFFBQUcsR0FBRyxZQUFZLENBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFZdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNHLENBQUM7WUFFTSxLQUFLLENBQUMsT0FBNkI7Z0JBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUVNLEtBQUssQ0FBQyxJQUFJO2dCQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7Z0JBQzNDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBR00sS0FBSyxDQUFDLElBQUk7Z0JBQ2YsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7b0JBQ3ZDLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLElBQUksVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDbkcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLFVBQVUsQ0FBQyxZQUFZLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2xILElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUM1RCxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM5QyxDQUFDO29CQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO2dCQUN0RCxDQUFDO1lBQ0gsQ0FBQztZQUVTLGdCQUFnQjtnQkFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDN0MsQ0FBQzs7OztnQ0FuQkEsU0FBUyxDQUFDLG9CQUFvQixDQUFDO1lBQ2hDLDZKQUFhLElBQUksNkRBY2hCOzs7OztTQTdDVSxhQUFhIn0=
46
+ this.lastClaimEpochNumber = proofClaim.epochToProve;
47
+ }
48
+ }
49
+ getProverAddress() {
50
+ return this.l1Publisher.getSenderAddress();
51
+ }
52
+ }
53
+ _ts_decorate([
54
+ trackSpan('ClaimsMonitor.work')
55
+ ], ClaimsMonitor.prototype, "work", null);
@@ -1,50 +1,51 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
2
7
  import { createLogger } from '@aztec/foundation/log';
3
8
  import { RunningPromise } from '@aztec/foundation/running-promise';
4
- import { getTelemetryClient, trackSpan, } from '@aztec/telemetry-client';
5
- let EpochMonitor = (() => {
6
- var _a;
7
- let _instanceExtraInitializers = [];
8
- let _work_decorators;
9
- return _a = class EpochMonitor {
10
- constructor(l2BlockSource, options, telemetry = getTelemetryClient()) {
11
- this.l2BlockSource = (__runInitializers(this, _instanceExtraInitializers), l2BlockSource);
12
- this.options = options;
13
- this.log = createLogger('prover-node:epoch-monitor');
14
- this.tracer = telemetry.getTracer('EpochMonitor');
15
- this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs);
9
+ import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
+ export class EpochMonitor {
11
+ l2BlockSource;
12
+ options;
13
+ runningPromise;
14
+ log;
15
+ tracer;
16
+ handler;
17
+ latestEpochNumber;
18
+ constructor(l2BlockSource, options, telemetry = getTelemetryClient()){
19
+ this.l2BlockSource = l2BlockSource;
20
+ this.options = options;
21
+ this.log = createLogger('prover-node:epoch-monitor');
22
+ this.tracer = telemetry.getTracer('EpochMonitor');
23
+ this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs);
24
+ }
25
+ start(handler) {
26
+ this.handler = handler;
27
+ this.runningPromise.start();
28
+ this.log.info('Started EpochMonitor', this.options);
29
+ }
30
+ async stop() {
31
+ await this.runningPromise.stop();
32
+ this.log.info('Stopped EpochMonitor');
33
+ }
34
+ async work() {
35
+ if (!this.latestEpochNumber) {
36
+ const epochNumber = await this.l2BlockSource.getL2EpochNumber();
37
+ if (epochNumber > 0n) {
38
+ await this.handler?.handleInitialEpochSync(epochNumber - 1n);
16
39
  }
17
- start(handler) {
18
- this.handler = handler;
19
- this.runningPromise.start();
20
- this.log.info('Started EpochMonitor', this.options);
21
- }
22
- async stop() {
23
- await this.runningPromise.stop();
24
- this.log.info('Stopped EpochMonitor');
25
- }
26
- async work() {
27
- if (!this.latestEpochNumber) {
28
- const epochNumber = await this.l2BlockSource.getL2EpochNumber();
29
- if (epochNumber > 0n) {
30
- await this.handler?.handleInitialEpochSync(epochNumber - 1n);
31
- }
32
- this.latestEpochNumber = epochNumber;
33
- return;
34
- }
35
- if (await this.l2BlockSource.isEpochComplete(this.latestEpochNumber)) {
36
- await this.handler?.handleEpochCompleted(this.latestEpochNumber);
37
- this.latestEpochNumber += 1n;
38
- }
39
- }
40
- },
41
- (() => {
42
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
43
- _work_decorators = [trackSpan('EpochMonitor.work')];
44
- __esDecorate(_a, null, _work_decorators, { kind: "method", name: "work", static: false, private: false, access: { has: obj => "work" in obj, get: obj => obj.work }, metadata: _metadata }, null, _instanceExtraInitializers);
45
- if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
46
- })(),
47
- _a;
48
- })();
49
- export { EpochMonitor };
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb25pdG9ycy9lcG9jaC1tb25pdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFJTCxrQkFBa0IsRUFDbEIsU0FBUyxHQUNWLE1BQU0seUJBQXlCLENBQUM7SUFPcEIsWUFBWTs7OztzQkFBWixZQUFZO1lBU3ZCLFlBQ21CLGFBQTRCLEVBQ3JDLE9BQXNDLEVBQzlDLFlBQTZCLGtCQUFrQixFQUFFO2dCQUZoQyxrQkFBYSxJQVZyQixtREFBWSxFQVVKLGFBQWEsRUFBZTtnQkFDckMsWUFBTyxHQUFQLE9BQU8sQ0FBK0I7Z0JBVHhDLFFBQUcsR0FBRyxZQUFZLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFZdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNHLENBQUM7WUFFTSxLQUFLLENBQUMsT0FBNEI7Z0JBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUVNLEtBQUssQ0FBQyxJQUFJO2dCQUNmLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBR00sS0FBSyxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUM1QixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDaEUsSUFBSSxXQUFXLEdBQUcsRUFBRSxFQUFFLENBQUM7d0JBQ3JCLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQy9ELENBQUM7b0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztvQkFDckMsT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO29CQUNyRSxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7Z0JBQy9CLENBQUM7WUFDSCxDQUFDOzs7O2dDQWZBLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztZQUMvQiw2SkFBYSxJQUFJLDZEQWNoQjs7Ozs7U0E1Q1UsWUFBWSJ9
40
+ this.latestEpochNumber = epochNumber;
41
+ return;
42
+ }
43
+ if (await this.l2BlockSource.isEpochComplete(this.latestEpochNumber)) {
44
+ await this.handler?.handleEpochCompleted(this.latestEpochNumber);
45
+ this.latestEpochNumber += 1n;
46
+ }
47
+ }
48
+ }
49
+ _ts_decorate([
50
+ trackSpan('EpochMonitor.work')
51
+ ], EpochMonitor.prototype, "work", null);
@@ -1,3 +1,2 @@
1
1
  export * from './claims-monitor.js';
2
2
  export * from './epoch-monitor.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9uaXRvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLG9CQUFvQixDQUFDIn0=
@@ -3,10 +3,9 @@ export const proverCoordinationConfigMappings = {
3
3
  proverCoordinationNodeUrl: {
4
4
  env: 'PROVER_COORDINATION_NODE_URL',
5
5
  description: 'The URL of the tx provider node',
6
- parseEnv: (val) => val,
7
- },
6
+ parseEnv: (val)=>val
7
+ }
8
8
  };
9
9
  export function getTxProviderConfigFromEnv() {
10
10
  return getConfigFromMappings(proverCoordinationConfigMappings);
11
11
  }
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zlci1jb29yZGluYXRpb24vY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMkIscUJBQXFCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU0xRixNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBaUQ7SUFDNUYseUJBQXlCLEVBQUU7UUFDekIsR0FBRyxFQUFFLDhCQUE4QjtRQUNuQyxXQUFXLEVBQUUsaUNBQWlDO1FBQzlDLFFBQVEsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRztLQUMvQjtDQUNGLENBQUM7QUFFRixNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLE9BQU8scUJBQXFCLENBQTJCLGdDQUFnQyxDQUFDLENBQUM7QUFDM0YsQ0FBQyJ9
@@ -1,5 +1,5 @@
1
1
  import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
2
- import { P2PClientType, createAztecNodeClient, } from '@aztec/circuit-types';
2
+ import { P2PClientType, createAztecNodeClient } from '@aztec/circuit-types';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { createP2PClient } from '@aztec/p2p';
5
5
  import { makeTracedFetch } from '@aztec/telemetry-client';
@@ -8,8 +8,7 @@ import { makeTracedFetch } from '@aztec/telemetry-client';
8
8
  * If p2p is enabled, prover coordination is done via p2p.
9
9
  * If an Aztec node URL is provided, prover coordination is done via the Aztec node over http.
10
10
  * If an aztec node is provided, it is returned directly.
11
- */
12
- export async function createProverCoordination(config, deps) {
11
+ */ export async function createProverCoordination(config, deps) {
13
12
  const log = createLogger('prover-node:prover-coordination');
14
13
  if (deps.aztecNodeTxProvider) {
15
14
  log.info('Using prover coordination via aztec node');
@@ -27,10 +26,12 @@ export async function createProverCoordination(config, deps) {
27
26
  }
28
27
  if (config.proverCoordinationNodeUrl) {
29
28
  log.info('Using prover coordination via node url');
30
- return createAztecNodeClient(config.proverCoordinationNodeUrl, makeTracedFetch([1, 2, 3], false));
31
- }
32
- else {
29
+ return createAztecNodeClient(config.proverCoordinationNodeUrl, makeTracedFetch([
30
+ 1,
31
+ 2,
32
+ 3
33
+ ], false));
34
+ } else {
33
35
  throw new Error(`Aztec Node URL for Tx Provider is not set.`);
34
36
  }
35
37
  }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92ZXItY29vcmRpbmF0aW9uL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUUsT0FBTyxFQUNMLGFBQWEsRUFHYixxQkFBcUIsR0FDdEIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQXdCLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBYWhGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsTUFBMEMsRUFDMUMsSUFBNEI7SUFFNUIsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFFNUQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUYsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzFHLE1BQU0sU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUNyQyxhQUFhLENBQUMsTUFBTSxFQUNwQixNQUFNLEVBQ04sSUFBSSxDQUFDLFFBQVEsRUFDYixhQUFhLEVBQ2IsSUFBSSxDQUFDLHNCQUFzQixFQUMzQixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztRQUNGLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXhCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUNuRCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEcsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDaEUsQ0FBQztBQUNILENBQUMifQ==
@@ -1,3 +1,2 @@
1
1
  export * from './config.js';
2
2
  export * from './factory.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmVyLWNvb3JkaW5hdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGNBQWMsQ0FBQyJ9
@@ -12,28 +12,30 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
12
12
  import { encodeFunctionData } from 'viem';
13
13
  import { ProverNodeMetrics } from './metrics.js';
14
14
  export class ProverNodePublisher {
15
- constructor(config, deps) {
16
- this.interruptibleSleep = new InterruptibleSleep();
17
- this.interrupted = false;
18
- this.log = createLogger('prover-node:l1-tx-publisher');
19
- this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60000;
15
+ interruptibleSleep = new InterruptibleSleep();
16
+ sleepTimeMs;
17
+ interrupted = false;
18
+ metrics;
19
+ log = createLogger('prover-node:l1-tx-publisher');
20
+ rollupContract;
21
+ l1TxUtils;
22
+ constructor(config, deps){
23
+ this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
20
24
  const telemetry = deps.telemetry ?? getTelemetryClient();
21
25
  this.metrics = new ProverNodeMetrics(telemetry, 'ProverNode');
22
26
  this.rollupContract = deps.rollupContract;
23
27
  this.l1TxUtils = deps.l1TxUtils;
24
28
  }
25
29
  /**
26
- * Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap.
27
- * Be warned, the call may return false even if the tx subsequently gets successfully mined.
28
- * In practice this shouldn't matter, as we'll only ever be calling `interrupt` when we know it's going to fail.
29
- * A call to `restart` is required before you can continue publishing.
30
- */
31
- interrupt() {
30
+ * Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap.
31
+ * Be warned, the call may return false even if the tx subsequently gets successfully mined.
32
+ * In practice this shouldn't matter, as we'll only ever be calling `interrupt` when we know it's going to fail.
33
+ * A call to `restart` is required before you can continue publishing.
34
+ */ interrupt() {
32
35
  this.interrupted = true;
33
36
  this.interruptibleSleep.interrupt();
34
37
  }
35
- /** Restarts the publisher after calling `interrupt`. */
36
- restart() {
38
+ /** Restarts the publisher after calling `interrupt`. */ restart() {
37
39
  this.interrupted = false;
38
40
  }
39
41
  getSenderAddress() {
@@ -44,7 +46,11 @@ export class ProverNodePublisher {
44
46
  }
45
47
  async submitEpochProof(args) {
46
48
  const { epochNumber, fromBlock, toBlock } = args;
47
- const ctx = { epochNumber, fromBlock, toBlock };
49
+ const ctx = {
50
+ epochNumber,
51
+ fromBlock,
52
+ toBlock
53
+ };
48
54
  if (!this.interrupted) {
49
55
  const timer = new Timer();
50
56
  // Validate epoch proof range and hashes are correct before submitting
@@ -65,9 +71,12 @@ export class ProverNodePublisher {
65
71
  sender: tx.sender,
66
72
  blobDataGas: 0n,
67
73
  blobGasUsed: 0n,
68
- eventName: 'proof-published-to-l1',
74
+ eventName: 'proof-published-to-l1'
69
75
  };
70
- this.log.info(`Published epoch proof to L1 rollup contract`, { ...stats, ...ctx });
76
+ this.log.info(`Published epoch proof to L1 rollup contract`, {
77
+ ...stats,
78
+ ...ctx
79
+ });
71
80
  this.metrics.recordSubmitProof(timer.ms(), stats);
72
81
  return true;
73
82
  }
@@ -107,12 +116,13 @@ export class ProverNodePublisher {
107
116
  }
108
117
  // Compare the public inputs computed by the contract with the ones injected
109
118
  const rollupPublicInputs = await this.rollupContract.getEpochProofPublicInputs(this.getSubmitEpochProofArgs(args));
110
- const aggregationObject = proof.isEmpty()
111
- ? times(AGGREGATION_OBJECT_LENGTH, Fr.zero)
112
- : proof.extractAggregationObject();
113
- const argsPublicInputs = [...publicInputs.toFields(), ...aggregationObject];
114
- if (!areArraysEqual(rollupPublicInputs.map(Fr.fromHexString), argsPublicInputs, (a, b) => a.equals(b))) {
115
- const fmt = (inputs) => inputs.map(x => x.toString()).join(', ');
119
+ const aggregationObject = proof.isEmpty() ? times(AGGREGATION_OBJECT_LENGTH, Fr.zero) : proof.extractAggregationObject();
120
+ const argsPublicInputs = [
121
+ ...publicInputs.toFields(),
122
+ ...aggregationObject
123
+ ];
124
+ if (!areArraysEqual(rollupPublicInputs.map(Fr.fromHexString), argsPublicInputs, (a, b)=>a.equals(b))) {
125
+ const fmt = (inputs)=>inputs.map((x)=>x.toString()).join(', ');
116
126
  throw new Error(`Root rollup public inputs mismatch:\nRollup: ${fmt(rollupPublicInputs)}\nComputed:${fmt(argsPublicInputs)}`);
117
127
  }
118
128
  }
@@ -126,32 +136,31 @@ export class ProverNodePublisher {
126
136
  fees: argsArray[2],
127
137
  blobPublicInputs: argsArray[3],
128
138
  aggregationObject: argsArray[4],
129
- proof: proofHex,
130
- },
139
+ proof: proofHex
140
+ }
131
141
  ];
132
142
  this.log.info(`SubmitEpochProof proofSize=${args.proof.withoutPublicInputs().length} bytes`);
133
143
  const data = encodeFunctionData({
134
144
  abi: RollupAbi,
135
145
  functionName: 'submitEpochRootProof',
136
- args: txArgs,
146
+ args: txArgs
137
147
  });
138
148
  try {
139
149
  const { receipt } = await this.l1TxUtils.sendAndMonitorTransaction({
140
150
  to: this.rollupContract.address,
141
- data,
151
+ data
142
152
  });
143
153
  return receipt;
144
- }
145
- catch (err) {
154
+ } catch (err) {
146
155
  this.log.error(`Rollup submit epoch proof failed`, err);
147
156
  const errorMsg = await this.l1TxUtils.tryGetErrorFromRevertedTx(data, {
148
- args: [...txArgs],
157
+ args: [
158
+ ...txArgs
159
+ ],
149
160
  functionName: 'submitEpochRootProof',
150
161
  abi: RollupAbi,
151
- address: this.rollupContract.address,
152
- },
153
- /*blobInputs*/ undefined,
154
- /*stateOverride*/ []);
162
+ address: this.rollupContract.address
163
+ }, /*blobInputs*/ undefined, /*stateOverride*/ []);
155
164
  this.log.error(`Rollup submit epoch proof tx reverted. ${errorMsg}`);
156
165
  return undefined;
157
166
  }
@@ -166,20 +175,14 @@ export class ProverNodePublisher {
166
175
  args.publicInputs.endBlockHash.toString(),
167
176
  args.publicInputs.endTimestamp.toString(),
168
177
  args.publicInputs.outHash.toString(),
169
- args.publicInputs.proverId.toString(),
178
+ args.publicInputs.proverId.toString()
170
179
  ],
171
- makeTuple(AZTEC_MAX_EPOCH_DURATION * 2, i => i % 2 === 0
172
- ? args.publicInputs.fees[i / 2].recipient.toField().toString()
173
- : args.publicInputs.fees[(i - 1) / 2].value.toString()),
174
- `0x${args.publicInputs.blobPublicInputs
175
- .filter((_, i) => i < args.toBlock - args.fromBlock + 1)
176
- .map(b => b.toString())
177
- .join(``)}`,
178
- `0x${serializeToBuffer(args.proof.extractAggregationObject()).toString('hex')}`,
180
+ makeTuple(AZTEC_MAX_EPOCH_DURATION * 2, (i)=>i % 2 === 0 ? args.publicInputs.fees[i / 2].recipient.toField().toString() : args.publicInputs.fees[(i - 1) / 2].value.toString()),
181
+ `0x${args.publicInputs.blobPublicInputs.filter((_, i)=>i < args.toBlock - args.fromBlock + 1).map((b)=>b.toString()).join(``)}`,
182
+ `0x${serializeToBuffer(args.proof.extractAggregationObject()).toString('hex')}`
179
183
  ];
180
184
  }
181
185
  async sleepOrInterrupted() {
182
186
  await this.interruptibleSleep.sleep(this.sleepTimeMs);
183
187
  }
184
188
  }
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Zlci1ub2RlLXB1Ymxpc2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQWMsTUFBTSxvQkFBb0IsQ0FBQztBQUdyRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBd0Isa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRixPQUFPLEVBQXFDLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQW1CakQsTUFBTSxPQUFPLG1CQUFtQjtJQVk5QixZQUNFLE1BQXdDLEVBQ3hDLElBSUM7UUFqQkssdUJBQWtCLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTlDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBR2xCLFFBQUcsR0FBRyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQWMxRCxJQUFJLENBQUMs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