@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.
- package/dest/bond/bond-manager.js +10 -12
- package/dest/bond/config.js +3 -4
- package/dest/bond/escrow-contract.js +23 -15
- package/dest/bond/factory.js +4 -2
- package/dest/bond/index.js +0 -1
- package/dest/bond/token-contract.js +52 -29
- package/dest/config.js +20 -21
- package/dest/factory.js +26 -14
- package/dest/http.js +1 -3
- package/dest/index.js +0 -1
- package/dest/job/epoch-proving-job.js +230 -190
- package/dest/metrics.js +33 -23
- package/dest/monitors/claims-monitor.js +52 -51
- package/dest/monitors/epoch-monitor.js +48 -47
- package/dest/monitors/index.js +0 -1
- package/dest/prover-coordination/config.js +2 -3
- package/dest/prover-coordination/factory.js +8 -7
- package/dest/prover-coordination/index.js +0 -1
- package/dest/prover-node-publisher.js +46 -43
- package/dest/prover-node.js +303 -308
- package/dest/quote-provider/http.js +11 -5
- package/dest/quote-provider/index.js +1 -2
- package/dest/quote-provider/simple.js +7 -3
- package/dest/quote-provider/utils.js +2 -3
- package/dest/quote-signer.js +6 -3
- package/dest/test/index.js +2 -1
- package/package.json +19 -19
- package/src/prover-node.ts +34 -62
- package/dest/bond/bond-manager.d.ts +0 -22
- package/dest/bond/bond-manager.d.ts.map +0 -1
- package/dest/bond/config.d.ts +0 -8
- package/dest/bond/config.d.ts.map +0 -1
- package/dest/bond/escrow-contract.d.ts +0 -19
- package/dest/bond/escrow-contract.d.ts.map +0 -1
- package/dest/bond/factory.d.ts +0 -6
- package/dest/bond/factory.d.ts.map +0 -1
- package/dest/bond/index.d.ts +0 -3
- package/dest/bond/index.d.ts.map +0 -1
- package/dest/bond/token-contract.d.ts +0 -26
- package/dest/bond/token-contract.d.ts.map +0 -1
- package/dest/config.d.ts +0 -31
- package/dest/config.d.ts.map +0 -1
- package/dest/factory.d.ts +0 -22
- package/dest/factory.d.ts.map +0 -1
- package/dest/http.d.ts +0 -8
- package/dest/http.d.ts.map +0 -1
- package/dest/index.d.ts +0 -6
- package/dest/index.d.ts.map +0 -1
- package/dest/job/epoch-proving-job.d.ts +0 -50
- package/dest/job/epoch-proving-job.d.ts.map +0 -1
- package/dest/metrics.d.ts +0 -23
- package/dest/metrics.d.ts.map +0 -1
- package/dest/monitors/claims-monitor.d.ts +0 -24
- package/dest/monitors/claims-monitor.d.ts.map +0 -1
- package/dest/monitors/epoch-monitor.d.ts +0 -22
- package/dest/monitors/epoch-monitor.d.ts.map +0 -1
- package/dest/monitors/index.d.ts +0 -3
- package/dest/monitors/index.d.ts.map +0 -1
- package/dest/prover-coordination/config.d.ts +0 -7
- package/dest/prover-coordination/config.d.ts.map +0 -1
- package/dest/prover-coordination/factory.d.ts +0 -22
- package/dest/prover-coordination/factory.d.ts.map +0 -1
- package/dest/prover-coordination/index.d.ts +0 -3
- package/dest/prover-coordination/index.d.ts.map +0 -1
- package/dest/prover-node-publisher.d.ts +0 -67
- package/dest/prover-node-publisher.d.ts.map +0 -1
- package/dest/prover-node.d.ts +0 -107
- package/dest/prover-node.d.ts.map +0 -1
- package/dest/quote-provider/http.d.ts +0 -15
- package/dest/quote-provider/http.d.ts.map +0 -1
- package/dest/quote-provider/index.d.ts +0 -6
- package/dest/quote-provider/index.d.ts.map +0 -1
- package/dest/quote-provider/simple.d.ts +0 -9
- package/dest/quote-provider/simple.d.ts.map +0 -1
- package/dest/quote-provider/utils.d.ts +0 -4
- package/dest/quote-provider/utils.d.ts.map +0 -1
- package/dest/quote-signer.d.ts +0 -13
- package/dest/quote-signer.d.ts.map +0 -1
- package/dest/test/index.d.ts +0 -10
- package/dest/test/index.d.ts.map +0 -1
|
@@ -1,54 +1,55 @@
|
|
|
1
|
-
|
|
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
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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);
|
package/dest/monitors/index.js
CHANGED
|
@@ -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)
|
|
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
|
|
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([
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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 = {
|
|
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`, {
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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: [
|
|
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
|
|
172
|
-
|
|
173
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Zlci1ub2RlLXB1Ymxpc2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQWMsTUFBTSxvQkFBb0IsQ0FBQztBQUdyRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBd0Isa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRixPQUFPLEVBQXFDLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQW1CakQsTUFBTSxPQUFPLG1CQUFtQjtJQVk5QixZQUNFLE1BQXdDLEVBQ3hDLElBSUM7UUFqQkssdUJBQWtCLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTlDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBR2xCLFFBQUcsR0FBRyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQWMxRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sRUFBRSx3QkFBd0IsSUFBSSxLQUFNLENBQUM7UUFFOUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTO1FBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCx3REFBd0Q7SUFDakQsT0FBTztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBTTdCO1FBQ0MsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFFMUIsc0VBQXNFO1lBQ3RFLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTlDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCw0QkFBNEI7WUFDNUIsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQy9FLE1BQU0sS0FBSyxHQUF3QjtvQkFDakMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxpQkFBaUI7b0JBQ3JDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztvQkFDMUIsZUFBZSxFQUFFLFNBQVMsQ0FBQyxlQUFlO29CQUMxQyxXQUFXLEVBQUUsRUFBRyxDQUFDLFdBQVc7b0JBQzVCLFlBQVksRUFBRSxFQUFHLENBQUMsWUFBWTtvQkFDOUIsTUFBTSxFQUFFLEVBQUcsQ0FBQyxNQUFNO29CQUNsQixXQUFXLEVBQUUsRUFBRTtvQkFDZixXQUFXLEVBQUUsRUFBRTtvQkFDZixTQUFTLEVBQUUsdUJBQXVCO2lCQUNuQyxDQUFDO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsU0FBUyxDQUFDLGVBQWUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlGLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDREQUE0RCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxJQUsxQztRQUNDLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFekQscUVBQXFFO1FBQ3JFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZHLElBQUksTUFBTSxLQUFLLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxTQUFTLElBQUksT0FBTyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RyxDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsU0FBUyxJQUFJLE9BQU8sd0JBQXdCLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUcsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUNBQW1DLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FDMUcsQ0FBQztRQUNKLENBQUM7UUFDRCxtRUFBbUU7UUFDbkUsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksWUFBWSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsSCxNQUFNLElBQUksS0FBSyxDQUNiLGlDQUFpQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFFBQVEsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUN2RyxDQUFDO1FBQ0osQ0FBQztRQUVELG1FQUFtRTtRQUNuRSxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEJBQThCLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FDbkcsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25FLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuSCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDdkMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZHLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBZ0MsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzRixNQUFNLElBQUksS0FBSyxDQUNiLGlEQUFpRCxHQUFHLENBQUMsa0JBQWtCLENBQUMsY0FBYyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUM5RyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFLcEM7UUFDQyxNQUFNLFFBQVEsR0FBUSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM5RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsTUFBTSxNQUFNLEdBQUc7WUFDYjtnQkFDRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixLQUFLLEVBQUUsUUFBUTthQUNoQjtTQUNPLENBQUM7UUFFWCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7UUFDN0YsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUM7WUFDOUIsR0FBRyxFQUFFLFNBQVM7WUFDZCxZQUFZLEVBQUUsc0JBQXNCO1lBQ3BDLElBQUksRUFBRSxNQUFNO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDakUsRUFBRSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztnQkFDL0IsSUFBSTthQUNMLENBQUMsQ0FBQztZQUVILE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUM3RCxJQUFJLEVBQ0o7Z0JBQ0UsSUFBSSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ2pCLFlBQVksRUFBRSxzQkFBc0I7Z0JBQ3BDLEdBQUcsRUFBRSxTQUFTO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87YUFDckM7WUFDRCxjQUFjLENBQUMsU0FBUztZQUN4QixpQkFBaUIsQ0FBQyxFQUFFLENBQ3JCLENBQUM7WUFDRixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNyRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVPLHVCQUF1QixDQUFDLElBSy9CO1FBQ0MsT0FBTztZQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDO2dCQUNFLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtnQkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7YUFDdEM7WUFDRCxTQUFTLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQzFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDVCxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlELENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQ3pEO1lBQ0QsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQjtpQkFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7aUJBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2IsS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7U0FDdkUsQ0FBQztJQUNiLENBQUM7SUFFUyxLQUFLLENBQUMsa0JBQWtCO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGIn0=
|