@aztec/prover-node 0.56.0 → 0.57.0
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.d.ts +22 -0
- package/dest/bond/bond-manager.d.ts.map +1 -0
- package/dest/bond/bond-manager.js +42 -0
- package/dest/bond/config.d.ts +8 -0
- package/dest/bond/config.d.ts.map +1 -0
- package/dest/bond/config.js +17 -0
- package/dest/bond/escrow-contract.d.ts +22 -0
- package/dest/bond/escrow-contract.d.ts.map +1 -0
- package/dest/bond/escrow-contract.js +32 -0
- package/dest/bond/factory.d.ts +9 -0
- package/dest/bond/factory.d.ts.map +1 -0
- package/dest/bond/factory.js +18 -0
- package/dest/bond/index.d.ts +3 -0
- package/dest/bond/index.d.ts.map +1 -0
- package/dest/bond/index.js +3 -0
- package/dest/bond/token-contract.d.ts +29 -0
- package/dest/bond/token-contract.d.ts.map +1 -0
- package/dest/bond/token-contract.js +58 -0
- package/dest/config.d.ts +10 -4
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +30 -9
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +39 -9
- package/dest/job/{block-proving-job.d.ts → epoch-proving-job.d.ts} +13 -9
- package/dest/job/epoch-proving-job.d.ts.map +1 -0
- package/dest/job/epoch-proving-job.js +119 -0
- package/dest/monitors/claims-monitor.d.ts +22 -0
- package/dest/monitors/claims-monitor.d.ts.map +1 -0
- package/dest/monitors/claims-monitor.js +37 -0
- package/dest/monitors/epoch-monitor.d.ts +20 -0
- package/dest/monitors/epoch-monitor.d.ts.map +1 -0
- package/dest/monitors/epoch-monitor.js +34 -0
- package/dest/monitors/index.d.ts +3 -0
- package/dest/monitors/index.d.ts.map +1 -0
- package/dest/monitors/index.js +3 -0
- package/dest/prover-coordination/config.d.ts +7 -0
- package/dest/prover-coordination/config.d.ts.map +1 -0
- package/dest/prover-coordination/config.js +12 -0
- package/dest/prover-coordination/factory.d.ts +4 -0
- package/dest/prover-coordination/factory.d.ts.map +1 -0
- package/dest/prover-coordination/factory.js +10 -0
- package/dest/prover-coordination/index.d.ts +3 -0
- package/dest/prover-coordination/index.d.ts.map +1 -0
- package/dest/prover-coordination/index.js +3 -0
- package/dest/prover-node.d.ts +56 -32
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +124 -70
- package/dest/quote-provider/http.d.ts +15 -0
- package/dest/quote-provider/http.d.ts.map +1 -0
- package/dest/quote-provider/http.js +32 -0
- package/dest/quote-provider/index.d.ts +6 -0
- package/dest/quote-provider/index.d.ts.map +1 -0
- package/dest/quote-provider/index.js +2 -0
- package/dest/quote-provider/simple.d.ts +9 -0
- package/dest/quote-provider/simple.d.ts.map +1 -0
- package/dest/quote-provider/simple.js +11 -0
- package/dest/quote-provider/utils.d.ts +4 -0
- package/dest/quote-provider/utils.d.ts.map +1 -0
- package/dest/quote-provider/utils.js +8 -0
- package/dest/quote-signer.d.ts +13 -0
- package/dest/quote-signer.d.ts.map +1 -0
- package/dest/quote-signer.js +18 -0
- package/package.json +19 -13
- package/src/bond/bond-manager.ts +48 -0
- package/src/bond/config.ts +25 -0
- package/src/bond/escrow-contract.ts +63 -0
- package/src/bond/factory.ts +47 -0
- package/src/bond/index.ts +2 -0
- package/src/bond/token-contract.ts +85 -0
- package/src/config.ts +47 -12
- package/src/factory.ts +51 -10
- package/src/job/{block-proving-job.ts → epoch-proving-job.ts} +46 -56
- package/src/monitors/claims-monitor.ts +52 -0
- package/src/monitors/epoch-monitor.ts +48 -0
- package/src/monitors/index.ts +2 -0
- package/src/prover-coordination/config.ts +17 -0
- package/src/prover-coordination/factory.ts +11 -0
- package/src/{tx-provider → prover-coordination}/index.ts +1 -2
- package/src/prover-node.ts +163 -90
- package/src/quote-provider/http.ts +47 -0
- package/src/quote-provider/index.ts +8 -0
- package/src/quote-provider/simple.ts +15 -0
- package/src/quote-provider/utils.ts +10 -0
- package/src/quote-signer.ts +24 -0
- package/dest/job/block-proving-job.d.ts.map +0 -1
- package/dest/job/block-proving-job.js +0 -120
- package/dest/tx-provider/aztec-node-tx-provider.d.ts +0 -8
- package/dest/tx-provider/aztec-node-tx-provider.d.ts.map +0 -1
- package/dest/tx-provider/aztec-node-tx-provider.js +0 -10
- package/dest/tx-provider/config.d.ts +0 -7
- package/dest/tx-provider/config.d.ts.map +0 -1
- package/dest/tx-provider/config.js +0 -12
- package/dest/tx-provider/factory.d.ts +0 -4
- package/dest/tx-provider/factory.d.ts.map +0 -1
- package/dest/tx-provider/factory.js +0 -12
- package/dest/tx-provider/index.d.ts +0 -4
- package/dest/tx-provider/index.d.ts.map +0 -1
- package/dest/tx-provider/index.js +0 -4
- package/src/tx-provider/aztec-node-tx-provider.ts +0 -10
- package/src/tx-provider/config.ts +0 -17
- package/src/tx-provider/factory.ts +0 -13
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config';
|
|
2
|
+
|
|
3
|
+
export type ProverCoordinationConfig = {
|
|
4
|
+
proverCoordinationNodeUrl: string | undefined;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export const proverCoordinationConfigMappings: ConfigMappingsType<ProverCoordinationConfig> = {
|
|
8
|
+
proverCoordinationNodeUrl: {
|
|
9
|
+
env: 'PROVER_COORDINATION_NODE_URL',
|
|
10
|
+
description: 'The URL of the tx provider node',
|
|
11
|
+
parseEnv: (val: string) => val,
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function getTxProviderConfigFromEnv(): ProverCoordinationConfig {
|
|
16
|
+
return getConfigFromMappings<ProverCoordinationConfig>(proverCoordinationConfigMappings);
|
|
17
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ProverCoordination, createAztecNodeClient } from '@aztec/circuit-types';
|
|
2
|
+
|
|
3
|
+
import { type ProverCoordinationConfig } from './config.js';
|
|
4
|
+
|
|
5
|
+
export function createProverCoordination(config: ProverCoordinationConfig): ProverCoordination {
|
|
6
|
+
if (config.proverCoordinationNodeUrl) {
|
|
7
|
+
return createAztecNodeClient(config.proverCoordinationNodeUrl);
|
|
8
|
+
} else {
|
|
9
|
+
throw new Error(`Aztec Node URL for Tx Provider is not set.`);
|
|
10
|
+
}
|
|
11
|
+
}
|
package/src/prover-node.ts
CHANGED
|
@@ -1,64 +1,160 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type EpochProofClaim,
|
|
3
|
+
type EpochProofQuote,
|
|
4
|
+
EpochProofQuotePayload,
|
|
5
|
+
type EpochProverManager,
|
|
2
6
|
type L1ToL2MessageSource,
|
|
7
|
+
type L2Block,
|
|
3
8
|
type L2BlockSource,
|
|
4
9
|
type MerkleTreeOperations,
|
|
5
|
-
type
|
|
6
|
-
type TxProvider,
|
|
10
|
+
type ProverCoordination,
|
|
7
11
|
type WorldStateSynchronizer,
|
|
8
12
|
} from '@aztec/circuit-types';
|
|
13
|
+
import { compact } from '@aztec/foundation/collection';
|
|
9
14
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
10
|
-
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
11
15
|
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
12
16
|
import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator';
|
|
13
17
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
14
18
|
import { type ContractDataSource } from '@aztec/types/contracts';
|
|
15
19
|
|
|
16
|
-
import {
|
|
20
|
+
import { type BondManager } from './bond/bond-manager.js';
|
|
21
|
+
import { EpochProvingJob, type EpochProvingJobState } from './job/epoch-proving-job.js';
|
|
17
22
|
import { ProverNodeMetrics } from './metrics.js';
|
|
23
|
+
import { type ClaimsMonitor, type ClaimsMonitorHandler } from './monitors/claims-monitor.js';
|
|
24
|
+
import { type EpochMonitor, type EpochMonitorHandler } from './monitors/epoch-monitor.js';
|
|
25
|
+
import { type QuoteProvider } from './quote-provider/index.js';
|
|
26
|
+
import { type QuoteSigner } from './quote-signer.js';
|
|
27
|
+
|
|
28
|
+
export type ProverNodeOptions = {
|
|
29
|
+
pollingIntervalMs: number;
|
|
30
|
+
maxPendingJobs: number;
|
|
31
|
+
};
|
|
18
32
|
|
|
19
33
|
/**
|
|
20
34
|
* An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks,
|
|
21
|
-
*
|
|
22
|
-
*
|
|
35
|
+
* submits bids for proving them, and monitors if they are accepted. If so, the prover node fetches the txs
|
|
36
|
+
* from a tx source in the p2p network or an external node, re-executes their public functions, creates a rollup
|
|
37
|
+
* proof for the epoch, and submits it to L1.
|
|
23
38
|
*/
|
|
24
|
-
export class ProverNode {
|
|
39
|
+
export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler {
|
|
25
40
|
private log = createDebugLogger('aztec:prover-node');
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
private jobs: Map<string,
|
|
29
|
-
private options:
|
|
41
|
+
|
|
42
|
+
private latestEpochWeAreProving: bigint | undefined;
|
|
43
|
+
private jobs: Map<string, EpochProvingJob> = new Map();
|
|
44
|
+
private options: ProverNodeOptions;
|
|
30
45
|
private metrics: ProverNodeMetrics;
|
|
31
46
|
|
|
32
47
|
constructor(
|
|
33
|
-
private prover:
|
|
34
|
-
private publisher: L1Publisher,
|
|
35
|
-
private l2BlockSource: L2BlockSource,
|
|
36
|
-
private l1ToL2MessageSource: L1ToL2MessageSource,
|
|
37
|
-
private contractDataSource: ContractDataSource,
|
|
38
|
-
private worldState: WorldStateSynchronizer,
|
|
39
|
-
private
|
|
40
|
-
private simulator: SimulationProvider,
|
|
41
|
-
private
|
|
42
|
-
|
|
48
|
+
private readonly prover: EpochProverManager,
|
|
49
|
+
private readonly publisher: L1Publisher,
|
|
50
|
+
private readonly l2BlockSource: L2BlockSource,
|
|
51
|
+
private readonly l1ToL2MessageSource: L1ToL2MessageSource,
|
|
52
|
+
private readonly contractDataSource: ContractDataSource,
|
|
53
|
+
private readonly worldState: WorldStateSynchronizer,
|
|
54
|
+
private readonly coordination: ProverCoordination,
|
|
55
|
+
private readonly simulator: SimulationProvider,
|
|
56
|
+
private readonly quoteProvider: QuoteProvider,
|
|
57
|
+
private readonly quoteSigner: QuoteSigner,
|
|
58
|
+
private readonly claimsMonitor: ClaimsMonitor,
|
|
59
|
+
private readonly epochsMonitor: EpochMonitor,
|
|
60
|
+
private readonly bondManager: BondManager,
|
|
61
|
+
private readonly telemetryClient: TelemetryClient,
|
|
62
|
+
options: Partial<ProverNodeOptions> = {},
|
|
43
63
|
) {
|
|
44
64
|
this.options = {
|
|
45
65
|
pollingIntervalMs: 1_000,
|
|
46
|
-
disableAutomaticProving: false,
|
|
47
66
|
maxPendingJobs: 100,
|
|
48
|
-
...options,
|
|
67
|
+
...compact(options),
|
|
49
68
|
};
|
|
50
69
|
|
|
51
70
|
this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode');
|
|
52
71
|
}
|
|
53
72
|
|
|
73
|
+
async handleClaim(proofClaim: EpochProofClaim): Promise<void> {
|
|
74
|
+
if (proofClaim.epochToProve === this.latestEpochWeAreProving) {
|
|
75
|
+
this.log.verbose(`Already proving claim for epoch ${proofClaim.epochToProve}`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
await this.startProof(proofClaim.epochToProve);
|
|
81
|
+
this.latestEpochWeAreProving = proofClaim.epochToProve;
|
|
82
|
+
} catch (err) {
|
|
83
|
+
this.log.error(`Error handling claim for epoch ${proofClaim.epochToProve}`, err);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
// Staked amounts are lowered after a claim, so this is a good time for doing a top-up if needed
|
|
88
|
+
await this.bondManager.ensureBond();
|
|
89
|
+
} catch (err) {
|
|
90
|
+
this.log.error(`Error ensuring prover bond after handling claim for epoch ${proofClaim.epochToProve}`, err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Handles the epoch number to prove when the prover node starts by checking if there
|
|
96
|
+
* is an existing claim for it. If not, it creates and sends a quote for it.
|
|
97
|
+
* @param epochNumber - The epoch immediately before the current one when the prover node starts.
|
|
98
|
+
*/
|
|
99
|
+
async handleInitialEpochSync(epochNumber: bigint): Promise<void> {
|
|
100
|
+
try {
|
|
101
|
+
const claim = await this.publisher.getProofClaim();
|
|
102
|
+
if (!claim || claim.epochToProve < epochNumber) {
|
|
103
|
+
await this.handleEpochCompleted(epochNumber);
|
|
104
|
+
} else if (claim && claim.bondProvider.equals(this.publisher.getSenderAddress())) {
|
|
105
|
+
const lastEpochProven = await this.l2BlockSource.getProvenL2EpochNumber();
|
|
106
|
+
if (lastEpochProven === undefined || lastEpochProven < claim.epochToProve) {
|
|
107
|
+
await this.handleClaim(claim);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
} catch (err) {
|
|
111
|
+
this.log.error(`Error handling initial epoch sync`, err);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Handles an epoch being completed by sending a quote for proving it.
|
|
117
|
+
* @param epochNumber - The epoch number that was just completed.
|
|
118
|
+
*/
|
|
119
|
+
async handleEpochCompleted(epochNumber: bigint): Promise<void> {
|
|
120
|
+
try {
|
|
121
|
+
// Construct a quote for the epoch
|
|
122
|
+
const blocks = await this.l2BlockSource.getBlocksForEpoch(epochNumber);
|
|
123
|
+
const partialQuote = await this.quoteProvider.getQuote(Number(epochNumber), blocks);
|
|
124
|
+
if (!partialQuote) {
|
|
125
|
+
this.log.verbose(`No quote produced for epoch ${epochNumber}`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Ensure we have deposited enough funds for sending this quote
|
|
130
|
+
await this.bondManager.ensureBond(partialQuote.bondAmount);
|
|
131
|
+
|
|
132
|
+
// Assemble and sign full quote
|
|
133
|
+
const quote = EpochProofQuotePayload.from({
|
|
134
|
+
...partialQuote,
|
|
135
|
+
epochToProve: BigInt(epochNumber),
|
|
136
|
+
prover: this.publisher.getSenderAddress(),
|
|
137
|
+
validUntilSlot: partialQuote.validUntilSlot ?? BigInt(Number.MAX_SAFE_INTEGER), // Should we constrain this?
|
|
138
|
+
});
|
|
139
|
+
const signed = await this.quoteSigner.sign(quote);
|
|
140
|
+
|
|
141
|
+
// Send it to the coordinator
|
|
142
|
+
await this.sendEpochProofQuote(signed);
|
|
143
|
+
} catch (err) {
|
|
144
|
+
this.log.error(`Error handling epoch completed`, err);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
54
148
|
/**
|
|
55
|
-
* Starts the prover node so it periodically checks for unproven
|
|
56
|
-
*
|
|
149
|
+
* Starts the prover node so it periodically checks for unproven epochs in the unfinalised chain from L1 and sends
|
|
150
|
+
* quotes for them, as well as monitors the claims for the epochs it has sent quotes for and starts proving jobs.
|
|
151
|
+
* This method returns once the prover node has deposited an initial bond into the escrow contract.
|
|
57
152
|
*/
|
|
58
|
-
start() {
|
|
59
|
-
|
|
60
|
-
this.
|
|
61
|
-
this.
|
|
153
|
+
async start() {
|
|
154
|
+
await this.bondManager.ensureBond();
|
|
155
|
+
this.epochsMonitor.start(this);
|
|
156
|
+
this.claimsMonitor.start(this);
|
|
157
|
+
this.log.info('Started ProverNode', this.options);
|
|
62
158
|
}
|
|
63
159
|
|
|
64
160
|
/**
|
|
@@ -66,7 +162,8 @@ export class ProverNode {
|
|
|
66
162
|
*/
|
|
67
163
|
async stop() {
|
|
68
164
|
this.log.info('Stopping ProverNode');
|
|
69
|
-
await this.
|
|
165
|
+
await this.epochsMonitor.stop();
|
|
166
|
+
await this.claimsMonitor.stop();
|
|
70
167
|
await this.prover.stop();
|
|
71
168
|
await this.l2BlockSource.stop();
|
|
72
169
|
this.publisher.interrupt();
|
|
@@ -76,69 +173,27 @@ export class ProverNode {
|
|
|
76
173
|
}
|
|
77
174
|
|
|
78
175
|
/**
|
|
79
|
-
*
|
|
80
|
-
* Checks whether there are new blocks to prove, proves them, and submits them.
|
|
176
|
+
* Sends an epoch proof quote to the coordinator.
|
|
81
177
|
*/
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (!this.checkMaximumPendingJobs()) {
|
|
89
|
-
this.log.debug(`Maximum pending proving jobs reached. Skipping work.`, {
|
|
90
|
-
maxPendingJobs: this.options.maxPendingJobs,
|
|
91
|
-
pendingJobs: this.jobs.size,
|
|
92
|
-
});
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([
|
|
97
|
-
this.l2BlockSource.getBlockNumber(),
|
|
98
|
-
this.l2BlockSource.getProvenBlockNumber(),
|
|
99
|
-
]);
|
|
100
|
-
|
|
101
|
-
// Consider both the latest block we are proving and the last block proven on the chain
|
|
102
|
-
const latestBlockBeingProven = this.latestBlockWeAreProving ?? 0;
|
|
103
|
-
const latestProven = Math.max(latestBlockBeingProven, latestProvenBlockNumber);
|
|
104
|
-
if (latestProven >= latestBlockNumber) {
|
|
105
|
-
this.log.debug(`No new blocks to prove`, {
|
|
106
|
-
latestBlockNumber,
|
|
107
|
-
latestProvenBlockNumber,
|
|
108
|
-
latestBlockBeingProven,
|
|
109
|
-
});
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const fromBlock = latestProven + 1;
|
|
114
|
-
const toBlock = fromBlock; // We only prove one block at a time for now
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
await this.startProof(fromBlock, toBlock);
|
|
118
|
-
} finally {
|
|
119
|
-
// If we fail to create a proving job for the given block, skip it instead of getting stuck on it.
|
|
120
|
-
this.log.verbose(`Setting ${toBlock} as latest block we are proving`);
|
|
121
|
-
this.latestBlockWeAreProving = toBlock;
|
|
122
|
-
}
|
|
123
|
-
} catch (err) {
|
|
124
|
-
this.log.error(`Error in prover node work`, err);
|
|
125
|
-
}
|
|
178
|
+
public sendEpochProofQuote(quote: EpochProofQuote): Promise<void> {
|
|
179
|
+
this.log.info(`Sending quote for epoch`, quote.toViemArgs().quote);
|
|
180
|
+
return this.coordination.addEpochProofQuote(quote);
|
|
126
181
|
}
|
|
127
182
|
|
|
128
183
|
/**
|
|
129
184
|
* Creates a proof for a block range. Returns once the proof has been submitted to L1.
|
|
130
185
|
*/
|
|
131
|
-
public async prove(
|
|
132
|
-
const job = await this.createProvingJob(
|
|
133
|
-
return job.run(
|
|
186
|
+
public async prove(epochNumber: number | bigint) {
|
|
187
|
+
const job = await this.createProvingJob(BigInt(epochNumber));
|
|
188
|
+
return job.run();
|
|
134
189
|
}
|
|
135
190
|
|
|
136
191
|
/**
|
|
137
192
|
* Starts a proving process and returns immediately.
|
|
138
193
|
*/
|
|
139
|
-
public async startProof(
|
|
140
|
-
const job = await this.createProvingJob(
|
|
141
|
-
void job.run(
|
|
194
|
+
public async startProof(epochNumber: number | bigint) {
|
|
195
|
+
const job = await this.createProvingJob(BigInt(epochNumber));
|
|
196
|
+
void job.run().catch(err => this.log.error(`Error proving epoch ${epochNumber}`, err));
|
|
142
197
|
}
|
|
143
198
|
|
|
144
199
|
/**
|
|
@@ -151,7 +206,7 @@ export class ProverNode {
|
|
|
151
206
|
/**
|
|
152
207
|
* Returns an array of jobs being processed.
|
|
153
208
|
*/
|
|
154
|
-
public getJobs(): { uuid: string; status:
|
|
209
|
+
public getJobs(): { uuid: string; status: EpochProvingJobState }[] {
|
|
155
210
|
return Array.from(this.jobs.entries()).map(([uuid, job]) => ({ uuid, status: job.getState() }));
|
|
156
211
|
}
|
|
157
212
|
|
|
@@ -160,17 +215,25 @@ export class ProverNode {
|
|
|
160
215
|
return maxPendingJobs === 0 || this.jobs.size < maxPendingJobs;
|
|
161
216
|
}
|
|
162
217
|
|
|
163
|
-
private async createProvingJob(
|
|
218
|
+
private async createProvingJob(epochNumber: bigint) {
|
|
164
219
|
if (!this.checkMaximumPendingJobs()) {
|
|
165
220
|
throw new Error(`Maximum pending proving jobs ${this.options.maxPendingJobs} reached. Cannot create new job.`);
|
|
166
221
|
}
|
|
167
222
|
|
|
223
|
+
// Gather blocks for this epoch
|
|
224
|
+
const blocks = await this.l2BlockSource.getBlocksForEpoch(epochNumber);
|
|
225
|
+
if (blocks.length === 0) {
|
|
226
|
+
throw new Error(`No blocks found for epoch ${epochNumber}`);
|
|
227
|
+
}
|
|
228
|
+
const fromBlock = blocks[0].number;
|
|
229
|
+
const toBlock = blocks.at(-1)!.number;
|
|
230
|
+
|
|
168
231
|
if ((await this.worldState.status()).syncedToL2Block >= fromBlock) {
|
|
169
232
|
throw new Error(`Cannot create proving job for block ${fromBlock} as it is behind the current world state`);
|
|
170
233
|
}
|
|
171
234
|
|
|
172
235
|
// Fast forward world state to right before the target block and get a fork
|
|
173
|
-
this.log.verbose(`Creating proving job for block ${fromBlock}`);
|
|
236
|
+
this.log.verbose(`Creating proving job for epoch ${epochNumber} for block range ${fromBlock} to ${toBlock}`);
|
|
174
237
|
const db = await this.worldState.syncImmediateAndFork(fromBlock - 1, true);
|
|
175
238
|
|
|
176
239
|
// Create a processor using the forked world state
|
|
@@ -186,26 +249,36 @@ export class ProverNode {
|
|
|
186
249
|
this.jobs.delete(job.getId());
|
|
187
250
|
};
|
|
188
251
|
|
|
189
|
-
const job = this.
|
|
252
|
+
const job = this.doCreateEpochProvingJob(epochNumber, blocks, db, publicProcessorFactory, cleanUp);
|
|
190
253
|
this.jobs.set(job.getId(), job);
|
|
191
254
|
return job;
|
|
192
255
|
}
|
|
193
256
|
|
|
194
257
|
/** Extracted for testing purposes. */
|
|
195
|
-
protected
|
|
258
|
+
protected doCreateEpochProvingJob(
|
|
259
|
+
epochNumber: bigint,
|
|
260
|
+
blocks: L2Block[],
|
|
196
261
|
db: MerkleTreeOperations,
|
|
197
262
|
publicProcessorFactory: PublicProcessorFactory,
|
|
198
263
|
cleanUp: () => Promise<void>,
|
|
199
264
|
) {
|
|
200
|
-
return new
|
|
201
|
-
|
|
265
|
+
return new EpochProvingJob(
|
|
266
|
+
epochNumber,
|
|
267
|
+
blocks,
|
|
268
|
+
this.prover.createEpochProver(db),
|
|
202
269
|
publicProcessorFactory,
|
|
203
270
|
this.publisher,
|
|
204
271
|
this.l2BlockSource,
|
|
205
272
|
this.l1ToL2MessageSource,
|
|
206
|
-
this.
|
|
273
|
+
this.coordination,
|
|
207
274
|
this.metrics,
|
|
208
275
|
cleanUp,
|
|
209
276
|
);
|
|
210
277
|
}
|
|
278
|
+
|
|
279
|
+
/** Extracted for testing purposes. */
|
|
280
|
+
protected async triggerMonitors() {
|
|
281
|
+
await this.epochsMonitor.work();
|
|
282
|
+
await this.claimsMonitor.work();
|
|
283
|
+
}
|
|
211
284
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type L2Block } from '@aztec/circuit-types';
|
|
2
|
+
|
|
3
|
+
import { type QuoteProvider, type QuoteProviderResult } from './index.js';
|
|
4
|
+
import { getTotalFees, getTxCount } from './utils.js';
|
|
5
|
+
|
|
6
|
+
export class HttpQuoteProvider implements QuoteProvider {
|
|
7
|
+
constructor(private readonly url: string) {}
|
|
8
|
+
|
|
9
|
+
public async getQuote(epochNumber: number, epoch: L2Block[]): Promise<QuoteProviderResult | undefined> {
|
|
10
|
+
const payload: HttpQuoteRequestPayload = {
|
|
11
|
+
epochNumber,
|
|
12
|
+
fromBlock: epoch[0].number,
|
|
13
|
+
toBlock: epoch.at(-1)!.number,
|
|
14
|
+
totalFees: getTotalFees(epoch).toString(),
|
|
15
|
+
txCount: getTxCount(epoch),
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const response = await fetch(this.url, {
|
|
19
|
+
method: 'POST',
|
|
20
|
+
body: JSON.stringify(payload),
|
|
21
|
+
headers: { 'content-type': 'application/json' },
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
throw new Error(`Failed to fetch quote: ${response.statusText}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const data = await response.json();
|
|
29
|
+
if (!data.basisPointFee || !data.bondAmount) {
|
|
30
|
+
throw new Error(`Missing required fields in response: ${JSON.stringify(data)}`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const basisPointFee = Number(data.basisPointFee);
|
|
34
|
+
const bondAmount = BigInt(data.bondAmount);
|
|
35
|
+
const validUntilSlot = data.validUntilSlot ? BigInt(data.validUntilSlot) : undefined;
|
|
36
|
+
|
|
37
|
+
return { basisPointFee, bondAmount, validUntilSlot };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type HttpQuoteRequestPayload = {
|
|
42
|
+
epochNumber: number;
|
|
43
|
+
fromBlock: number;
|
|
44
|
+
toBlock: number;
|
|
45
|
+
totalFees: string;
|
|
46
|
+
txCount: number;
|
|
47
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type EpochProofQuotePayload, type L2Block } from '@aztec/circuit-types';
|
|
2
|
+
|
|
3
|
+
export type QuoteProviderResult = Pick<EpochProofQuotePayload, 'basisPointFee' | 'bondAmount'> &
|
|
4
|
+
Partial<Pick<EpochProofQuotePayload, 'validUntilSlot'>>;
|
|
5
|
+
|
|
6
|
+
export interface QuoteProvider {
|
|
7
|
+
getQuote(epochNumber: number, epoch: L2Block[]): Promise<QuoteProviderResult | undefined>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type EpochProofQuotePayload, type L2Block } from '@aztec/circuit-types';
|
|
2
|
+
|
|
3
|
+
import { type QuoteProvider } from './index.js';
|
|
4
|
+
|
|
5
|
+
export class SimpleQuoteProvider implements QuoteProvider {
|
|
6
|
+
constructor(public readonly basisPointFee: number, public readonly bondAmount: bigint) {}
|
|
7
|
+
|
|
8
|
+
getQuote(
|
|
9
|
+
_epochNumber: number,
|
|
10
|
+
_epoch: L2Block[],
|
|
11
|
+
): Promise<Pick<EpochProofQuotePayload, 'basisPointFee' | 'bondAmount'>> {
|
|
12
|
+
const { basisPointFee, bondAmount } = this;
|
|
13
|
+
return Promise.resolve({ basisPointFee, bondAmount });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type L2Block } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/circuits.js';
|
|
3
|
+
|
|
4
|
+
export function getTotalFees(epoch: L2Block[]) {
|
|
5
|
+
return epoch.reduce((total, block) => total.add(block.header.totalFees), Fr.ZERO).toBigInt();
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function getTxCount(epoch: L2Block[]) {
|
|
9
|
+
return epoch.reduce((total, block) => total + block.body.txEffects.length, 0);
|
|
10
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EpochProofQuote, type EpochProofQuotePayload } from '@aztec/circuit-types';
|
|
2
|
+
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
3
|
+
import { Secp256k1Signer } from '@aztec/foundation/crypto';
|
|
4
|
+
import { type RollupAbi } from '@aztec/l1-artifacts';
|
|
5
|
+
|
|
6
|
+
import { type GetContractReturnType, type PublicClient } from 'viem';
|
|
7
|
+
|
|
8
|
+
export class QuoteSigner {
|
|
9
|
+
constructor(
|
|
10
|
+
private readonly signer: Secp256k1Signer,
|
|
11
|
+
private readonly quoteToDigest: (payload: EpochProofQuotePayload) => Promise<Buffer32>,
|
|
12
|
+
) {}
|
|
13
|
+
|
|
14
|
+
static new(privateKey: Buffer32, rollupContract: GetContractReturnType<typeof RollupAbi, PublicClient>): QuoteSigner {
|
|
15
|
+
const quoteToDigest = (payload: EpochProofQuotePayload) =>
|
|
16
|
+
rollupContract.read.quoteToDigest([payload.toViemArgs()]).then(Buffer32.fromString);
|
|
17
|
+
return new QuoteSigner(new Secp256k1Signer(privateKey), quoteToDigest);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async sign(payload: EpochProofQuotePayload) {
|
|
21
|
+
const digest = await this.quoteToDigest(payload);
|
|
22
|
+
return EpochProofQuote.new(digest, payload, this.signer);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"block-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/block-proving-job.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,mBAAmB,EAExB,KAAK,aAAa,EAKlB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAwB,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAIrF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,eAAe;IAMxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IAZjB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAgD;IAC3D,OAAO,CAAC,IAAI,CAAS;gBAGX,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,WAAW,EACtB,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAA2B;IAK7E,KAAK,IAAI,MAAM;IAIf,QAAQ,IAAI,oBAAoB;IAI1B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IA8E5C,IAAI;YAIG,QAAQ;YAQR,MAAM;IAWpB,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAoBzB;AAED,MAAM,MAAM,oBAAoB,GAC5B,aAAa,GACb,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,WAAW,GACX,QAAQ,CAAC"}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { EmptyTxValidator, PROVING_STATUS, } from '@aztec/circuit-types';
|
|
2
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { Timer } from '@aztec/foundation/timer';
|
|
4
|
-
import * as crypto from 'node:crypto';
|
|
5
|
-
/**
|
|
6
|
-
* Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
|
|
7
|
-
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
8
|
-
* world state as part of public call execution via the public processor.
|
|
9
|
-
*/
|
|
10
|
-
export class BlockProvingJob {
|
|
11
|
-
constructor(prover, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, txProvider, metrics, cleanUp = () => Promise.resolve()) {
|
|
12
|
-
this.prover = prover;
|
|
13
|
-
this.publicProcessorFactory = publicProcessorFactory;
|
|
14
|
-
this.publisher = publisher;
|
|
15
|
-
this.l2BlockSource = l2BlockSource;
|
|
16
|
-
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
17
|
-
this.txProvider = txProvider;
|
|
18
|
-
this.metrics = metrics;
|
|
19
|
-
this.cleanUp = cleanUp;
|
|
20
|
-
this.state = 'initialized';
|
|
21
|
-
this.log = createDebugLogger('aztec:block-proving-job');
|
|
22
|
-
this.uuid = crypto.randomUUID();
|
|
23
|
-
}
|
|
24
|
-
getId() {
|
|
25
|
-
return this.uuid;
|
|
26
|
-
}
|
|
27
|
-
getState() {
|
|
28
|
-
return this.state;
|
|
29
|
-
}
|
|
30
|
-
async run(fromBlock, toBlock) {
|
|
31
|
-
if (fromBlock !== toBlock) {
|
|
32
|
-
throw new Error(`Block ranges are not yet supported`);
|
|
33
|
-
}
|
|
34
|
-
this.log.info(`Starting block proving job`, { fromBlock, toBlock, uuid: this.uuid });
|
|
35
|
-
this.state = 'processing';
|
|
36
|
-
const timer = new Timer();
|
|
37
|
-
try {
|
|
38
|
-
let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
|
|
39
|
-
for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
|
|
40
|
-
const block = await this.getBlock(blockNumber);
|
|
41
|
-
const globalVariables = block.header.globalVariables;
|
|
42
|
-
const txHashes = block.body.txEffects.map(tx => tx.txHash);
|
|
43
|
-
const txCount = block.body.numberOfTxsIncludingPadded;
|
|
44
|
-
const l1ToL2Messages = await this.getL1ToL2Messages(block);
|
|
45
|
-
this.log.verbose(`Starting block processing`, {
|
|
46
|
-
number: block.number,
|
|
47
|
-
blockHash: block.hash().toString(),
|
|
48
|
-
lastArchive: block.header.lastArchive.root,
|
|
49
|
-
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
50
|
-
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
51
|
-
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
52
|
-
historicalHeader: historicalHeader?.hash(),
|
|
53
|
-
uuid: this.uuid,
|
|
54
|
-
...globalVariables,
|
|
55
|
-
});
|
|
56
|
-
// When we move to proving epochs, this should change into a startNewEpoch and be lifted outside the loop.
|
|
57
|
-
const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
|
|
58
|
-
const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables);
|
|
59
|
-
const txs = await this.getTxs(txHashes);
|
|
60
|
-
await this.processTxs(publicProcessor, txs, txCount);
|
|
61
|
-
this.log.verbose(`Processed all txs for block`, {
|
|
62
|
-
blockNumber: block.number,
|
|
63
|
-
blockHash: block.hash().toString(),
|
|
64
|
-
uuid: this.uuid,
|
|
65
|
-
});
|
|
66
|
-
await this.prover.setBlockCompleted();
|
|
67
|
-
// This should be moved outside the loop to match the creation of the proving ticket when we move to epochs.
|
|
68
|
-
this.state = 'awaiting-prover';
|
|
69
|
-
const result = await provingTicket.provingPromise;
|
|
70
|
-
if (result.status === PROVING_STATUS.FAILURE) {
|
|
71
|
-
throw new Error(`Block proving failed: ${result.reason}`);
|
|
72
|
-
}
|
|
73
|
-
historicalHeader = block.header;
|
|
74
|
-
}
|
|
75
|
-
const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
|
|
76
|
-
this.log.info(`Finalised proof for block range`, { fromBlock, toBlock, uuid: this.uuid });
|
|
77
|
-
this.state = 'publishing-proof';
|
|
78
|
-
await this.publisher.submitProof(block.header, block.archive.root, this.prover.getProverId(), aggregationObject, proof);
|
|
79
|
-
this.log.info(`Submitted proof for block range`, { fromBlock, toBlock, uuid: this.uuid });
|
|
80
|
-
this.state = 'completed';
|
|
81
|
-
this.metrics.recordProvingJob(timer);
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
this.log.error(`Error running block prover job`, err, { uuid: this.uuid });
|
|
85
|
-
this.state = 'failed';
|
|
86
|
-
}
|
|
87
|
-
finally {
|
|
88
|
-
await this.cleanUp(this);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
stop() {
|
|
92
|
-
this.prover.cancel();
|
|
93
|
-
}
|
|
94
|
-
async getBlock(blockNumber) {
|
|
95
|
-
const block = await this.l2BlockSource.getBlock(blockNumber);
|
|
96
|
-
if (!block) {
|
|
97
|
-
throw new Error(`Block ${blockNumber} not found in L2 block source`);
|
|
98
|
-
}
|
|
99
|
-
return block;
|
|
100
|
-
}
|
|
101
|
-
async getTxs(txHashes) {
|
|
102
|
-
const txs = await Promise.all(txHashes.map(txHash => this.txProvider.getTxByHash(txHash).then(tx => [txHash, tx])));
|
|
103
|
-
const notFound = txs.filter(([_, tx]) => !tx);
|
|
104
|
-
if (notFound.length) {
|
|
105
|
-
throw new Error(`Txs not found: ${notFound.map(([txHash]) => txHash.toString()).join(', ')}`);
|
|
106
|
-
}
|
|
107
|
-
return txs.map(([_, tx]) => tx);
|
|
108
|
-
}
|
|
109
|
-
getL1ToL2Messages(block) {
|
|
110
|
-
return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
|
|
111
|
-
}
|
|
112
|
-
async processTxs(publicProcessor, txs, totalNumberOfTxs) {
|
|
113
|
-
const [processedTxs, failedTxs] = await publicProcessor.process(txs, totalNumberOfTxs, this.prover, new EmptyTxValidator());
|
|
114
|
-
if (failedTxs.length) {
|
|
115
|
-
throw new Error(`Failed to process txs: ${failedTxs.map(({ tx, error }) => `${tx.getTxHash()} (${error})`).join(', ')}`);
|
|
116
|
-
}
|
|
117
|
-
return processedTxs;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stcHJvdmluZy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL2Jsb2NrLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFJaEIsY0FBYyxHQUtmLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSWhELE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBSXRDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUsxQixZQUNVLE1BQW1CLEVBQ25CLHNCQUE4QyxFQUM5QyxTQUFzQixFQUN0QixhQUE0QixFQUM1QixtQkFBd0MsRUFDeEMsVUFBc0IsRUFDdEIsT0FBMEIsRUFDMUIsVUFBbUQsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtRQVAxRSxXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBbUU7UUFaNUUsVUFBSyxHQUF5QixhQUFhLENBQUM7UUFDNUMsUUFBRyxHQUFHLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFhekQsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUs7UUFDVixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVNLFFBQVE7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
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type AztecNode, type Tx, type TxHash, type TxProvider } from '@aztec/circuit-types';
|
|
2
|
-
/** Implements TxProvider by querying an Aztec node for the txs. */
|
|
3
|
-
export declare class AztecNodeTxProvider implements TxProvider {
|
|
4
|
-
private node;
|
|
5
|
-
constructor(node: AztecNode);
|
|
6
|
-
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=aztec-node-tx-provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aztec-node-tx-provider.d.ts","sourceRoot":"","sources":["../../src/tx-provider/aztec-node-tx-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7F,mEAAmE;AACnE,qBAAa,mBAAoB,YAAW,UAAU;IACxC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,SAAS;IAEnC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;CAGrD"}
|