@fluxpointstudios/orynq-sdk-midnight-prover 0.1.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/LICENSE +21 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/linking/cardano-anchor-link.d.ts +250 -0
- package/dist/linking/cardano-anchor-link.d.ts.map +1 -0
- package/dist/linking/cardano-anchor-link.js +447 -0
- package/dist/linking/cardano-anchor-link.js.map +1 -0
- package/dist/linking/index.d.ts +33 -0
- package/dist/linking/index.d.ts.map +1 -0
- package/dist/linking/index.js +31 -0
- package/dist/linking/index.js.map +1 -0
- package/dist/linking/proof-publication.d.ts +217 -0
- package/dist/linking/proof-publication.d.ts.map +1 -0
- package/dist/linking/proof-publication.js +385 -0
- package/dist/linking/proof-publication.js.map +1 -0
- package/dist/midnight/index.d.ts +30 -0
- package/dist/midnight/index.d.ts.map +1 -0
- package/dist/midnight/index.js +27 -0
- package/dist/midnight/index.js.map +1 -0
- package/dist/midnight/proof-server-client.d.ts +236 -0
- package/dist/midnight/proof-server-client.d.ts.map +1 -0
- package/dist/midnight/proof-server-client.js +422 -0
- package/dist/midnight/proof-server-client.js.map +1 -0
- package/dist/midnight/public-inputs.d.ts +134 -0
- package/dist/midnight/public-inputs.d.ts.map +1 -0
- package/dist/midnight/public-inputs.js +338 -0
- package/dist/midnight/public-inputs.js.map +1 -0
- package/dist/midnight/witness-builder.d.ts +119 -0
- package/dist/midnight/witness-builder.d.ts.map +1 -0
- package/dist/midnight/witness-builder.js +238 -0
- package/dist/midnight/witness-builder.js.map +1 -0
- package/dist/proofs/hash-chain-proof.d.ts +171 -0
- package/dist/proofs/hash-chain-proof.d.ts.map +1 -0
- package/dist/proofs/hash-chain-proof.js +437 -0
- package/dist/proofs/hash-chain-proof.js.map +1 -0
- package/dist/proofs/index.d.ts +35 -0
- package/dist/proofs/index.d.ts.map +1 -0
- package/dist/proofs/index.js +34 -0
- package/dist/proofs/index.js.map +1 -0
- package/dist/proofs/policy-compliance-proof.d.ts +165 -0
- package/dist/proofs/policy-compliance-proof.d.ts.map +1 -0
- package/dist/proofs/policy-compliance-proof.js +514 -0
- package/dist/proofs/policy-compliance-proof.js.map +1 -0
- package/dist/proofs/selective-disclosure.d.ts +213 -0
- package/dist/proofs/selective-disclosure.d.ts.map +1 -0
- package/dist/proofs/selective-disclosure.js +629 -0
- package/dist/proofs/selective-disclosure.js.map +1 -0
- package/dist/prover-interface.d.ts +288 -0
- package/dist/prover-interface.d.ts.map +1 -0
- package/dist/prover-interface.js +114 -0
- package/dist/prover-interface.js.map +1 -0
- package/dist/prover.d.ts +163 -0
- package/dist/prover.d.ts.map +1 -0
- package/dist/prover.js +417 -0
- package/dist/prover.js.map +1 -0
- package/dist/types.d.ts +410 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +128 -0
- package/dist/types.js.map +1 -0
- package/package.json +59 -0
- package/src/__tests__/hash-chain-proof.test.ts +709 -0
- package/src/__tests__/midnight-prover.test.ts +716 -0
- package/src/__tests__/policy-compliance.test.ts +567 -0
- package/src/__tests__/proof-publication.test.ts +644 -0
- package/src/__tests__/selective-disclosure.test.ts +921 -0
- package/src/index.ts +260 -0
- package/src/linking/cardano-anchor-link.ts +682 -0
- package/src/linking/index.ts +58 -0
- package/src/linking/proof-publication.ts +557 -0
- package/src/midnight/index.ts +73 -0
- package/src/midnight/proof-server-client.ts +595 -0
- package/src/midnight/public-inputs.ts +590 -0
- package/src/midnight/witness-builder.ts +341 -0
- package/src/proofs/hash-chain-proof.ts +610 -0
- package/src/proofs/index.ts +77 -0
- package/src/proofs/policy-compliance-proof.ts +717 -0
- package/src/proofs/selective-disclosure.ts +839 -0
- package/src/prover-interface.ts +410 -0
- package/src/prover.ts +537 -0
- package/src/types.ts +551 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MidnightProver interface definition.
|
|
3
|
+
*
|
|
4
|
+
* Location: packages/midnight-prover/src/prover-interface.ts
|
|
5
|
+
*
|
|
6
|
+
* Summary:
|
|
7
|
+
* This file defines the abstract interface for ZK proof generation using the Midnight network.
|
|
8
|
+
* Implementations will connect to the Midnight proof server and generate various types of
|
|
9
|
+
* zero-knowledge proofs for PoI trace verification.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* The MidnightProver interface is implemented by concrete prover classes that connect to
|
|
13
|
+
* the Midnight proof server. It integrates with:
|
|
14
|
+
* - poi-process-trace: For TraceEvent and TraceBundle data
|
|
15
|
+
* - poi-attestor: For AttestationBundle verification in ZK
|
|
16
|
+
* - poi-anchors-cardano: For cross-chain binding to Cardano L1 anchors
|
|
17
|
+
*
|
|
18
|
+
* The prover is used after a trace is recorded and anchored on Cardano,
|
|
19
|
+
* enabling privacy-preserving verification of trace properties.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type {
|
|
23
|
+
ProofServerConfig,
|
|
24
|
+
HashChainInput,
|
|
25
|
+
HashChainProof,
|
|
26
|
+
PolicyInput,
|
|
27
|
+
PolicyProof,
|
|
28
|
+
AttestationInput,
|
|
29
|
+
AttestationProof,
|
|
30
|
+
DisclosureInput,
|
|
31
|
+
DisclosureProof,
|
|
32
|
+
InferenceInput,
|
|
33
|
+
InferenceProof,
|
|
34
|
+
AnyProof,
|
|
35
|
+
PublicationResult,
|
|
36
|
+
ProofVerificationResult,
|
|
37
|
+
} from "./types.js";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Abstract interface for Midnight ZK prover.
|
|
41
|
+
*
|
|
42
|
+
* The MidnightProver provides methods to:
|
|
43
|
+
* 1. Connect to a Midnight proof server
|
|
44
|
+
* 2. Generate various types of ZK proofs
|
|
45
|
+
* 3. Publish proofs to the Midnight network
|
|
46
|
+
* 4. Verify existing proofs
|
|
47
|
+
*
|
|
48
|
+
* All proofs are bound to a Cardano anchor transaction, creating a
|
|
49
|
+
* cross-chain link between the PoI trace on Cardano and the ZK proof on Midnight.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* import { MidnightProver, createMidnightProver } from '@fluxpointstudios/orynq-sdk-midnight-prover';
|
|
54
|
+
*
|
|
55
|
+
* const prover = createMidnightProver();
|
|
56
|
+
* await prover.connect({ proofServerUrl: 'https://proof.midnight.network', timeout: 300000, retries: 3 });
|
|
57
|
+
*
|
|
58
|
+
* // Generate hash chain proof
|
|
59
|
+
* const proof = await prover.proveHashChain({
|
|
60
|
+
* events: traceBundle.privateRun.events,
|
|
61
|
+
* genesisHash: '0x00...00',
|
|
62
|
+
* expectedRootHash: traceBundle.rootHash,
|
|
63
|
+
* cardanoAnchorTxHash: 'abc123...',
|
|
64
|
+
* });
|
|
65
|
+
*
|
|
66
|
+
* // Publish to Midnight
|
|
67
|
+
* const result = await prover.publish(proof);
|
|
68
|
+
* console.log('Published:', result.midnightTxHash);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export interface MidnightProver {
|
|
72
|
+
// ===========================================================================
|
|
73
|
+
// CONNECTION
|
|
74
|
+
// ===========================================================================
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Connect to the Midnight proof server.
|
|
78
|
+
* Must be called before generating proofs.
|
|
79
|
+
*
|
|
80
|
+
* @param config - Proof server configuration
|
|
81
|
+
* @throws MidnightProverException on connection failure
|
|
82
|
+
*/
|
|
83
|
+
connect(config: ProofServerConfig): Promise<void>;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Disconnect from the proof server.
|
|
87
|
+
* Releases any held resources.
|
|
88
|
+
*/
|
|
89
|
+
disconnect(): Promise<void>;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Check if connected to the proof server.
|
|
93
|
+
*/
|
|
94
|
+
isConnected(): boolean;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Get the current connection configuration.
|
|
98
|
+
* Returns undefined if not connected.
|
|
99
|
+
*/
|
|
100
|
+
getConfig(): ProofServerConfig | undefined;
|
|
101
|
+
|
|
102
|
+
// ===========================================================================
|
|
103
|
+
// PROOF GENERATION
|
|
104
|
+
// ===========================================================================
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Generate a hash chain validity proof.
|
|
108
|
+
*
|
|
109
|
+
* Proves that a sequence of events produces the expected rolling hash
|
|
110
|
+
* without revealing the event contents. This is the most common proof type.
|
|
111
|
+
*
|
|
112
|
+
* @param input - Hash chain input with events and expected hash
|
|
113
|
+
* @returns Hash chain proof with public inputs
|
|
114
|
+
* @throws MidnightProverException on failure
|
|
115
|
+
*/
|
|
116
|
+
proveHashChain(input: HashChainInput): Promise<HashChainProof>;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Generate a policy compliance proof.
|
|
120
|
+
*
|
|
121
|
+
* Proves that content passed a specified policy without revealing
|
|
122
|
+
* the actual content. Useful for demonstrating compliance with
|
|
123
|
+
* content moderation or safety policies.
|
|
124
|
+
*
|
|
125
|
+
* @param input - Policy input with content hashes and policy definition
|
|
126
|
+
* @returns Policy compliance proof
|
|
127
|
+
* @throws MidnightProverException on failure
|
|
128
|
+
*/
|
|
129
|
+
provePolicyCompliance(input: PolicyInput): Promise<PolicyProof>;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Generate an attestation validity proof.
|
|
133
|
+
*
|
|
134
|
+
* Proves that a TEE attestation is valid and binds to the expected
|
|
135
|
+
* hash, without revealing the full attestation evidence. This allows
|
|
136
|
+
* verifying authenticity without exposing TEE-specific details.
|
|
137
|
+
*
|
|
138
|
+
* @param input - Attestation input with bundle and policy
|
|
139
|
+
* @returns Attestation validity proof
|
|
140
|
+
* @throws MidnightProverException on failure
|
|
141
|
+
*/
|
|
142
|
+
proveAttestation(input: AttestationInput): Promise<AttestationProof>;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Generate a selective disclosure proof.
|
|
146
|
+
*
|
|
147
|
+
* Proves that a specific span exists in a trace bundle (via Merkle
|
|
148
|
+
* membership) without revealing other spans. Optionally includes
|
|
149
|
+
* the span data for full disclosure.
|
|
150
|
+
*
|
|
151
|
+
* @param input - Disclosure input with bundle and span ID
|
|
152
|
+
* @returns Selective disclosure proof with optional span data
|
|
153
|
+
* @throws MidnightProverException on failure
|
|
154
|
+
*/
|
|
155
|
+
proveSelectiveDisclosure(input: DisclosureInput): Promise<DisclosureProof>;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Generate a zkML inference proof.
|
|
159
|
+
*
|
|
160
|
+
* WARNING: This is extremely expensive. Only use for high-stakes scenarios.
|
|
161
|
+
*
|
|
162
|
+
* Proves that a model produced a specific output for a given input,
|
|
163
|
+
* demonstrating correctness of inference. Limited to small models
|
|
164
|
+
* due to circuit constraints.
|
|
165
|
+
*
|
|
166
|
+
* @param input - Inference input with model and token data
|
|
167
|
+
* @returns Inference proof with metrics
|
|
168
|
+
* @throws MidnightProverException on failure (may be unsupported)
|
|
169
|
+
*/
|
|
170
|
+
proveInference?(input: InferenceInput): Promise<InferenceProof>;
|
|
171
|
+
|
|
172
|
+
// ===========================================================================
|
|
173
|
+
// PUBLICATION
|
|
174
|
+
// ===========================================================================
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Publish a proof to the Midnight network.
|
|
178
|
+
*
|
|
179
|
+
* The proof is recorded on-chain and linked to the Cardano anchor
|
|
180
|
+
* specified in the proof's public inputs.
|
|
181
|
+
*
|
|
182
|
+
* @param proof - Any proof type to publish
|
|
183
|
+
* @returns Publication result with Midnight transaction hash
|
|
184
|
+
* @throws MidnightProverException on failure
|
|
185
|
+
*/
|
|
186
|
+
publish(proof: AnyProof): Promise<PublicationResult>;
|
|
187
|
+
|
|
188
|
+
// ===========================================================================
|
|
189
|
+
// VERIFICATION
|
|
190
|
+
// ===========================================================================
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Verify a proof locally (without on-chain verification).
|
|
194
|
+
*
|
|
195
|
+
* This checks the proof's cryptographic validity but does not
|
|
196
|
+
* verify on-chain publication or Cardano anchor linkage.
|
|
197
|
+
*
|
|
198
|
+
* @param proof - Proof to verify
|
|
199
|
+
* @returns Verification result
|
|
200
|
+
*/
|
|
201
|
+
verify(proof: AnyProof): Promise<ProofVerificationResult>;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Fetch a proof from the Midnight network by ID.
|
|
205
|
+
*
|
|
206
|
+
* @param proofId - Unique proof identifier
|
|
207
|
+
* @returns The proof if found, undefined otherwise
|
|
208
|
+
*/
|
|
209
|
+
fetchProof(proofId: string): Promise<AnyProof | undefined>;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Check if a proof has been published to Midnight.
|
|
213
|
+
*
|
|
214
|
+
* @param proofId - Unique proof identifier
|
|
215
|
+
* @returns True if the proof exists on-chain
|
|
216
|
+
*/
|
|
217
|
+
isPublished(proofId: string): Promise<boolean>;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Factory function type for creating MidnightProver instances.
|
|
222
|
+
*/
|
|
223
|
+
export type MidnightProverFactory = () => MidnightProver;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Options for creating a MidnightProver.
|
|
227
|
+
*/
|
|
228
|
+
export interface CreateMidnightProverOptions {
|
|
229
|
+
/**
|
|
230
|
+
* Enable debug logging.
|
|
231
|
+
*/
|
|
232
|
+
debug?: boolean;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Custom circuit definitions directory.
|
|
236
|
+
*/
|
|
237
|
+
circuitsDir?: string;
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Enable zkML inference proofs (experimental).
|
|
241
|
+
*/
|
|
242
|
+
enableInference?: boolean;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// =============================================================================
|
|
246
|
+
// ABSTRACT BASE CLASS
|
|
247
|
+
// =============================================================================
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Abstract base class for MidnightProver implementations.
|
|
251
|
+
* Provides common functionality and state management.
|
|
252
|
+
*/
|
|
253
|
+
export abstract class AbstractMidnightProver implements MidnightProver {
|
|
254
|
+
protected config: ProofServerConfig | undefined;
|
|
255
|
+
protected connected = false;
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Connect to the proof server.
|
|
259
|
+
*/
|
|
260
|
+
async connect(config: ProofServerConfig): Promise<void> {
|
|
261
|
+
this.config = config;
|
|
262
|
+
await this.doConnect(config);
|
|
263
|
+
this.connected = true;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Disconnect from the proof server.
|
|
268
|
+
*/
|
|
269
|
+
async disconnect(): Promise<void> {
|
|
270
|
+
if (this.connected) {
|
|
271
|
+
await this.doDisconnect();
|
|
272
|
+
this.connected = false;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Check connection status.
|
|
278
|
+
*/
|
|
279
|
+
isConnected(): boolean {
|
|
280
|
+
return this.connected;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Get current configuration.
|
|
285
|
+
*/
|
|
286
|
+
getConfig(): ProofServerConfig | undefined {
|
|
287
|
+
return this.config;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Ensure connected before operations.
|
|
292
|
+
* @throws MidnightProverException if not connected
|
|
293
|
+
*/
|
|
294
|
+
protected ensureConnected(): void {
|
|
295
|
+
if (!this.connected) {
|
|
296
|
+
throw new Error("Not connected to proof server. Call connect() first.");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Abstract methods for subclasses to implement
|
|
301
|
+
protected abstract doConnect(config: ProofServerConfig): Promise<void>;
|
|
302
|
+
protected abstract doDisconnect(): Promise<void>;
|
|
303
|
+
|
|
304
|
+
abstract proveHashChain(input: HashChainInput): Promise<HashChainProof>;
|
|
305
|
+
abstract provePolicyCompliance(input: PolicyInput): Promise<PolicyProof>;
|
|
306
|
+
abstract proveAttestation(input: AttestationInput): Promise<AttestationProof>;
|
|
307
|
+
abstract proveSelectiveDisclosure(input: DisclosureInput): Promise<DisclosureProof>;
|
|
308
|
+
abstract proveInference?(input: InferenceInput): Promise<InferenceProof>;
|
|
309
|
+
abstract publish(proof: AnyProof): Promise<PublicationResult>;
|
|
310
|
+
abstract verify(proof: AnyProof): Promise<ProofVerificationResult>;
|
|
311
|
+
abstract fetchProof(proofId: string): Promise<AnyProof | undefined>;
|
|
312
|
+
abstract isPublished(proofId: string): Promise<boolean>;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// =============================================================================
|
|
316
|
+
// REGISTRY
|
|
317
|
+
// =============================================================================
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Registry for MidnightProver implementations.
|
|
321
|
+
* Allows pluggable prover backends.
|
|
322
|
+
*/
|
|
323
|
+
export interface MidnightProverRegistry {
|
|
324
|
+
/**
|
|
325
|
+
* Register a prover factory.
|
|
326
|
+
*
|
|
327
|
+
* @param name - Unique name for this prover backend
|
|
328
|
+
* @param factory - Factory function to create the prover
|
|
329
|
+
*/
|
|
330
|
+
register(name: string, factory: MidnightProverFactory): void;
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Get a prover by name.
|
|
334
|
+
*
|
|
335
|
+
* @param name - Name of the registered prover
|
|
336
|
+
* @returns Prover instance or undefined if not found
|
|
337
|
+
*/
|
|
338
|
+
get(name: string): MidnightProver | undefined;
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Get the default prover.
|
|
342
|
+
*
|
|
343
|
+
* @returns Default prover instance
|
|
344
|
+
* @throws Error if no default is registered
|
|
345
|
+
*/
|
|
346
|
+
getDefault(): MidnightProver;
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* List registered prover names.
|
|
350
|
+
*/
|
|
351
|
+
listProvers(): string[];
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Set the default prover name.
|
|
355
|
+
*
|
|
356
|
+
* @param name - Name of the prover to use as default
|
|
357
|
+
*/
|
|
358
|
+
setDefault(name: string): void;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Default implementation of MidnightProverRegistry.
|
|
363
|
+
*/
|
|
364
|
+
export class DefaultMidnightProverRegistry implements MidnightProverRegistry {
|
|
365
|
+
private factories = new Map<string, MidnightProverFactory>();
|
|
366
|
+
private defaultName: string | undefined;
|
|
367
|
+
|
|
368
|
+
register(name: string, factory: MidnightProverFactory): void {
|
|
369
|
+
this.factories.set(name, factory);
|
|
370
|
+
// First registered becomes default
|
|
371
|
+
if (this.defaultName === undefined) {
|
|
372
|
+
this.defaultName = name;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
get(name: string): MidnightProver | undefined {
|
|
377
|
+
const factory = this.factories.get(name);
|
|
378
|
+
if (factory === undefined) {
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
return factory();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
getDefault(): MidnightProver {
|
|
385
|
+
if (this.defaultName === undefined) {
|
|
386
|
+
throw new Error("No prover registered");
|
|
387
|
+
}
|
|
388
|
+
const prover = this.get(this.defaultName);
|
|
389
|
+
if (prover === undefined) {
|
|
390
|
+
throw new Error(`Default prover '${this.defaultName}' not found`);
|
|
391
|
+
}
|
|
392
|
+
return prover;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
listProvers(): string[] {
|
|
396
|
+
return Array.from(this.factories.keys());
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
setDefault(name: string): void {
|
|
400
|
+
if (!this.factories.has(name)) {
|
|
401
|
+
throw new Error(`Prover '${name}' not registered`);
|
|
402
|
+
}
|
|
403
|
+
this.defaultName = name;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Global prover registry instance.
|
|
409
|
+
*/
|
|
410
|
+
export const proverRegistry = new DefaultMidnightProverRegistry();
|