@izi-noir/sdk 0.1.10 → 0.1.12

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.
@@ -30,6 +30,378 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  ));
31
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
32
 
33
+ // src/infra/provingSystems/R1csBuilder.ts
34
+ var R1csBuilder;
35
+ var init_R1csBuilder = __esm({
36
+ "src/infra/provingSystems/R1csBuilder.ts"() {
37
+ "use strict";
38
+ R1csBuilder = class {
39
+ constructor(parsedCircuit) {
40
+ this.parsedCircuit = parsedCircuit;
41
+ }
42
+ constraints = [];
43
+ witnessMap = /* @__PURE__ */ new Map();
44
+ nextWitnessIdx = 1;
45
+ // w_0 = 1 is reserved
46
+ publicIndices = [];
47
+ privateIndices = [];
48
+ // BN254 scalar field modulus - 1 (for representing -1)
49
+ // Fr modulus = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001
50
+ // -1 mod Fr = Fr - 1
51
+ NEG_ONE = "0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000";
52
+ /**
53
+ * Build R1CS definition from the parsed circuit
54
+ */
55
+ build() {
56
+ this.registerInputs();
57
+ for (const stmt of this.parsedCircuit.statements) {
58
+ this.processStatement(stmt);
59
+ }
60
+ return {
61
+ num_witnesses: this.nextWitnessIdx,
62
+ public_inputs: this.publicIndices,
63
+ private_inputs: this.privateIndices,
64
+ constraints: this.constraints
65
+ };
66
+ }
67
+ /**
68
+ * Get the witness index for an input parameter name
69
+ */
70
+ getWitnessIndex(name) {
71
+ return this.witnessMap.get(name);
72
+ }
73
+ /**
74
+ * Register all circuit inputs as witnesses
75
+ * IMPORTANT: Noir orders witnesses as private first, then public
76
+ * We must match this order for the witness values to align correctly
77
+ */
78
+ registerInputs() {
79
+ for (const param of this.parsedCircuit.privateParams) {
80
+ const idx = this.nextWitnessIdx++;
81
+ this.witnessMap.set(param.name, idx);
82
+ this.privateIndices.push(idx);
83
+ }
84
+ for (const param of this.parsedCircuit.publicParams) {
85
+ const idx = this.nextWitnessIdx++;
86
+ this.witnessMap.set(param.name, idx);
87
+ this.publicIndices.push(idx);
88
+ }
89
+ }
90
+ /**
91
+ * Process a single statement and generate constraints
92
+ */
93
+ processStatement(stmt) {
94
+ switch (stmt.kind) {
95
+ case "assert":
96
+ this.processAssert(stmt.condition);
97
+ break;
98
+ case "variable_declaration":
99
+ this.processVariableDecl(stmt.name, stmt.initializer);
100
+ break;
101
+ case "assignment":
102
+ this.processAssignment(stmt.target, stmt.value);
103
+ break;
104
+ case "if_statement":
105
+ for (const s of stmt.consequent) {
106
+ this.processStatement(s);
107
+ }
108
+ if (stmt.alternate) {
109
+ for (const s of stmt.alternate) {
110
+ this.processStatement(s);
111
+ }
112
+ }
113
+ break;
114
+ case "for_statement":
115
+ throw new Error(
116
+ "For loops are not yet supported in R1CS generation. Use the Barretenberg backend for complex circuits."
117
+ );
118
+ }
119
+ }
120
+ /**
121
+ * Process an assert statement
122
+ * The condition must evaluate to true for a valid proof
123
+ */
124
+ processAssert(condition) {
125
+ if (condition.kind === "binary") {
126
+ this.processBinaryAssert(condition);
127
+ } else if (condition.kind === "identifier") {
128
+ const idx = this.getOrCreateWitness(condition);
129
+ this.constraints.push({
130
+ a: [["0x1", idx]],
131
+ b: [["0x1", 0]],
132
+ // * 1
133
+ c: [["0x1", 0]]
134
+ // = 1 (w_0)
135
+ });
136
+ } else {
137
+ throw new Error(`Unsupported assert condition kind: ${condition.kind}`);
138
+ }
139
+ }
140
+ /**
141
+ * Process a binary expression in an assert
142
+ */
143
+ processBinaryAssert(expr) {
144
+ const { left, operator, right } = expr;
145
+ switch (operator) {
146
+ case "==":
147
+ this.processEquality(left, right);
148
+ break;
149
+ case "!=":
150
+ throw new Error(
151
+ "Inequality (!=) is not yet supported in R1CS. Use equality (==) instead."
152
+ );
153
+ case "+":
154
+ case "-":
155
+ case "*":
156
+ case "/":
157
+ case "%":
158
+ throw new Error(
159
+ `Arithmetic operator ${operator} must be part of an equality assertion. Use: assert(a ${operator} b == c)`
160
+ );
161
+ case "<":
162
+ case ">":
163
+ case "<=":
164
+ case ">=":
165
+ throw new Error(
166
+ `Comparison operators (${operator}) require range proofs which are not yet supported. Use the Barretenberg backend for comparison operations.`
167
+ );
168
+ case "&":
169
+ case "|":
170
+ throw new Error(
171
+ `Logical operator ${operator} is not yet supported in R1CS.`
172
+ );
173
+ default:
174
+ throw new Error(`Unsupported operator in assert: ${operator}`);
175
+ }
176
+ }
177
+ /**
178
+ * Process an equality assertion: assert(left == right)
179
+ */
180
+ processEquality(left, right) {
181
+ if (left.kind === "binary" && left.operator === "*") {
182
+ this.processMultiplicationEquality(left.left, left.right, right);
183
+ return;
184
+ }
185
+ if (right.kind === "binary" && right.operator === "*") {
186
+ this.processMultiplicationEquality(right.left, right.right, left);
187
+ return;
188
+ }
189
+ if (left.kind === "binary" && left.operator === "+") {
190
+ this.processAdditionEquality(left.left, left.right, right);
191
+ return;
192
+ }
193
+ if (right.kind === "binary" && right.operator === "+") {
194
+ this.processAdditionEquality(right.left, right.right, left);
195
+ return;
196
+ }
197
+ if (left.kind === "binary" && left.operator === "-") {
198
+ this.processSubtractionEquality(left.left, left.right, right);
199
+ return;
200
+ }
201
+ if (right.kind === "binary" && right.operator === "-") {
202
+ this.processSubtractionEquality(right.left, right.right, left);
203
+ return;
204
+ }
205
+ const leftIdx = this.getOrCreateWitness(left);
206
+ const rightIdx = this.getOrCreateWitness(right);
207
+ this.constraints.push({
208
+ a: [
209
+ ["0x1", leftIdx],
210
+ [this.NEG_ONE, rightIdx]
211
+ ],
212
+ // a - b
213
+ b: [["0x1", 0]],
214
+ // * 1 (w_0 = 1)
215
+ c: []
216
+ // = 0
217
+ });
218
+ }
219
+ /**
220
+ * Process multiplication equality: assert(a * b == c)
221
+ * R1CS: a * b = c
222
+ */
223
+ processMultiplicationEquality(left, right, result) {
224
+ const leftIdx = this.getOrCreateWitness(left);
225
+ const rightIdx = this.getOrCreateWitness(right);
226
+ const resultIdx = this.getOrCreateWitness(result);
227
+ this.constraints.push({
228
+ a: [["0x1", leftIdx]],
229
+ b: [["0x1", rightIdx]],
230
+ c: [["0x1", resultIdx]]
231
+ });
232
+ }
233
+ /**
234
+ * Process addition equality: assert(a + b == c)
235
+ * R1CS: (a + b - c) * 1 = 0
236
+ * Which is: (a + b) * 1 = c
237
+ */
238
+ processAdditionEquality(left, right, result) {
239
+ const leftIdx = this.getOrCreateWitness(left);
240
+ const rightIdx = this.getOrCreateWitness(right);
241
+ const resultIdx = this.getOrCreateWitness(result);
242
+ this.constraints.push({
243
+ a: [
244
+ ["0x1", leftIdx],
245
+ ["0x1", rightIdx]
246
+ ],
247
+ // a + b
248
+ b: [["0x1", 0]],
249
+ // * 1
250
+ c: [["0x1", resultIdx]]
251
+ // = c
252
+ });
253
+ }
254
+ /**
255
+ * Process subtraction equality: assert(a - b == c)
256
+ * R1CS: (a - b) * 1 = c
257
+ */
258
+ processSubtractionEquality(left, right, result) {
259
+ const leftIdx = this.getOrCreateWitness(left);
260
+ const rightIdx = this.getOrCreateWitness(right);
261
+ const resultIdx = this.getOrCreateWitness(result);
262
+ this.constraints.push({
263
+ a: [
264
+ ["0x1", leftIdx],
265
+ [this.NEG_ONE, rightIdx]
266
+ ],
267
+ // a - b
268
+ b: [["0x1", 0]],
269
+ // * 1
270
+ c: [["0x1", resultIdx]]
271
+ // = c
272
+ });
273
+ }
274
+ /**
275
+ * Process a variable declaration: let x = expr
276
+ * Creates a new witness for x and adds constraint if needed
277
+ */
278
+ processVariableDecl(name, initializer) {
279
+ const varIdx = this.nextWitnessIdx++;
280
+ this.witnessMap.set(name, varIdx);
281
+ if (initializer.kind === "identifier") {
282
+ const initIdx = this.getOrCreateWitness(initializer);
283
+ this.constraints.push({
284
+ a: [
285
+ ["0x1", varIdx],
286
+ [this.NEG_ONE, initIdx]
287
+ ],
288
+ b: [["0x1", 0]],
289
+ c: []
290
+ });
291
+ } else if (initializer.kind === "literal") {
292
+ } else if (initializer.kind === "binary") {
293
+ this.processVariableInitBinary(varIdx, initializer);
294
+ } else {
295
+ throw new Error(
296
+ `Unsupported initializer kind for variable declaration: ${initializer.kind}`
297
+ );
298
+ }
299
+ }
300
+ /**
301
+ * Process a binary expression as variable initializer
302
+ */
303
+ processVariableInitBinary(varIdx, expr) {
304
+ const { left, operator, right } = expr;
305
+ const leftIdx = this.getOrCreateWitness(left);
306
+ const rightIdx = this.getOrCreateWitness(right);
307
+ switch (operator) {
308
+ case "*":
309
+ this.constraints.push({
310
+ a: [["0x1", leftIdx]],
311
+ b: [["0x1", rightIdx]],
312
+ c: [["0x1", varIdx]]
313
+ });
314
+ break;
315
+ case "+":
316
+ this.constraints.push({
317
+ a: [
318
+ ["0x1", leftIdx],
319
+ ["0x1", rightIdx]
320
+ ],
321
+ b: [["0x1", 0]],
322
+ c: [["0x1", varIdx]]
323
+ });
324
+ break;
325
+ case "-":
326
+ this.constraints.push({
327
+ a: [
328
+ ["0x1", leftIdx],
329
+ [this.NEG_ONE, rightIdx]
330
+ ],
331
+ b: [["0x1", 0]],
332
+ c: [["0x1", varIdx]]
333
+ });
334
+ break;
335
+ default:
336
+ throw new Error(
337
+ `Unsupported operator in variable initializer: ${operator}`
338
+ );
339
+ }
340
+ }
341
+ /**
342
+ * Process an assignment: x = expr
343
+ * Updates the witness mapping
344
+ */
345
+ processAssignment(target, value) {
346
+ const existingIdx = this.witnessMap.get(target);
347
+ if (existingIdx === void 0) {
348
+ throw new Error(`Assignment to undeclared variable: ${target}`);
349
+ }
350
+ if (value.kind === "identifier") {
351
+ const valueIdx = this.getOrCreateWitness(value);
352
+ this.constraints.push({
353
+ a: [
354
+ ["0x1", existingIdx],
355
+ [this.NEG_ONE, valueIdx]
356
+ ],
357
+ b: [["0x1", 0]],
358
+ c: []
359
+ });
360
+ } else if (value.kind === "binary") {
361
+ this.processVariableInitBinary(existingIdx, value);
362
+ }
363
+ }
364
+ /**
365
+ * Get or create a witness index for an expression
366
+ */
367
+ getOrCreateWitness(expr) {
368
+ if (expr.kind === "identifier") {
369
+ const existing = this.witnessMap.get(expr.name);
370
+ if (existing !== void 0) {
371
+ return existing;
372
+ }
373
+ const idx = this.nextWitnessIdx++;
374
+ this.witnessMap.set(expr.name, idx);
375
+ return idx;
376
+ }
377
+ if (expr.kind === "literal") {
378
+ const idx = this.nextWitnessIdx++;
379
+ return idx;
380
+ }
381
+ if (expr.kind === "binary") {
382
+ const idx = this.nextWitnessIdx++;
383
+ this.processVariableInitBinary(idx, expr);
384
+ return idx;
385
+ }
386
+ if (expr.kind === "unary") {
387
+ const operandIdx = this.getOrCreateWitness(expr.operand);
388
+ if (expr.operator === "-") {
389
+ const idx = this.nextWitnessIdx++;
390
+ this.constraints.push({
391
+ a: [[this.NEG_ONE, operandIdx]],
392
+ b: [["0x1", 0]],
393
+ c: [["0x1", idx]]
394
+ });
395
+ return idx;
396
+ }
397
+ throw new Error(`Unsupported unary operator: ${expr.operator}`);
398
+ }
399
+ throw new Error(`Unsupported expression kind: ${expr.kind}`);
400
+ }
401
+ };
402
+ }
403
+ });
404
+
33
405
  // src/infra/provingSystems/ArkworksWasm.ts
34
406
  var ArkworksWasm_exports = {};
35
407
  __export(ArkworksWasm_exports, {
@@ -163,6 +535,7 @@ var init_ArkworksWasm = __esm({
163
535
  import_noir_wasm = require("@noir-lang/noir_wasm");
164
536
  import_noir_js = require("@noir-lang/noir_js");
165
537
  import_acvm_js = require("@noir-lang/acvm_js");
538
+ init_R1csBuilder();
166
539
  import_meta = {};
167
540
  wasmModule = null;
168
541
  wasmInitPromise = null;
@@ -177,8 +550,11 @@ var init_ArkworksWasm = __esm({
177
550
  }
178
551
  /**
179
552
  * Compile Noir code to a circuit with ACIR for Groth16 proving
553
+ *
554
+ * @param noirCode - The Noir source code to compile
555
+ * @param options - Optional compilation options including ParsedCircuit for dynamic R1CS
180
556
  */
181
- async compile(noirCode) {
557
+ async compile(noirCode, options) {
182
558
  const wasm = await initWasm();
183
559
  const { basePath, cleanup } = await createTempDir();
184
560
  const fm = (0, import_noir_wasm.createFileManager)(basePath);
@@ -203,36 +579,52 @@ authors = [""]
203
579
  throw new Error("Compilation failed: no bytecode generated");
204
580
  }
205
581
  const parameters = compiled.abi.parameters;
206
- const publicR1csIndices = [];
207
- const privateR1csIndices = [];
582
+ let r1cs;
208
583
  const witnessIndexMapping = /* @__PURE__ */ new Map();
209
- parameters.forEach((p, noirIndex) => {
210
- const r1csIndex = noirIndex + 1;
211
- witnessIndexMapping.set(noirIndex, r1csIndex);
212
- if (p.visibility === "public") {
213
- publicR1csIndices.push(r1csIndex);
214
- } else if (p.visibility === "private") {
215
- privateR1csIndices.push(r1csIndex);
216
- }
217
- });
218
- const r1cs = {
219
- num_witnesses: parameters.length + 1,
220
- // +1 for w_0
221
- public_inputs: publicR1csIndices,
222
- private_inputs: privateR1csIndices,
223
- constraints: []
224
- };
225
- if (privateR1csIndices.length === 1 && publicR1csIndices.length === 1) {
226
- const privateIdx = privateR1csIndices[0];
227
- const publicIdx = publicR1csIndices[0];
228
- r1cs.constraints.push({
229
- a: [["0x1", privateIdx]],
230
- // secret
231
- b: [["0x1", privateIdx]],
232
- // secret
233
- c: [["0x1", publicIdx]]
234
- // expected
584
+ if (options?.parsedCircuit) {
585
+ const builder = new R1csBuilder(options.parsedCircuit);
586
+ r1cs = builder.build();
587
+ parameters.forEach((p, noirIndex) => {
588
+ const r1csIndex = noirIndex + 1;
589
+ witnessIndexMapping.set(noirIndex, r1csIndex);
590
+ });
591
+ console.log("=== R1CS BUILDER DEBUG ===");
592
+ console.log("ParsedCircuit publicParams:", options.parsedCircuit.publicParams);
593
+ console.log("ParsedCircuit privateParams:", options.parsedCircuit.privateParams);
594
+ console.log("ParsedCircuit statements:", JSON.stringify(options.parsedCircuit.statements, null, 2));
595
+ console.log("Generated R1CS:", JSON.stringify(r1cs, null, 2));
596
+ console.log("==========================");
597
+ } else {
598
+ const publicR1csIndices = [];
599
+ const privateR1csIndices = [];
600
+ parameters.forEach((p, noirIndex) => {
601
+ const r1csIndex = noirIndex + 1;
602
+ witnessIndexMapping.set(noirIndex, r1csIndex);
603
+ if (p.visibility === "public") {
604
+ publicR1csIndices.push(r1csIndex);
605
+ } else if (p.visibility === "private") {
606
+ privateR1csIndices.push(r1csIndex);
607
+ }
235
608
  });
609
+ r1cs = {
610
+ num_witnesses: parameters.length + 1,
611
+ public_inputs: publicR1csIndices,
612
+ private_inputs: privateR1csIndices,
613
+ constraints: []
614
+ };
615
+ if (privateR1csIndices.length === 1 && publicR1csIndices.length === 1) {
616
+ const privateIdx = privateR1csIndices[0];
617
+ const publicIdx = publicR1csIndices[0];
618
+ r1cs.constraints.push({
619
+ a: [["0x1", privateIdx]],
620
+ b: [["0x1", privateIdx]],
621
+ c: [["0x1", publicIdx]]
622
+ });
623
+ }
624
+ console.log("=== R1CS HARDCODED DEBUG ===");
625
+ console.log("Using hardcoded R1CS pattern (no ParsedCircuit provided)");
626
+ console.log("R1CS:", JSON.stringify(r1cs, null, 2));
627
+ console.log("============================");
236
628
  }
237
629
  const r1csJson = JSON.stringify(r1cs);
238
630
  let provingKey;
@@ -249,7 +641,7 @@ authors = [""]
249
641
  }
250
642
  }
251
643
  const acirJson = JSON.stringify({
252
- functions: [{ current_witness_index: parameters.length, opcodes: [], private_parameters: privateR1csIndices, public_parameters: { witnesses: publicR1csIndices }, return_values: { witnesses: [] } }]
644
+ functions: [{ current_witness_index: parameters.length, opcodes: [], private_parameters: r1cs.private_inputs, public_parameters: { witnesses: r1cs.public_inputs }, return_values: { witnesses: [] } }]
253
645
  });
254
646
  const arkworksCircuit = {
255
647
  ...compiled,
@@ -397,7 +789,9 @@ var init_Barretenberg = __esm({
397
789
  import_noir_js2 = require("@noir-lang/noir_js");
398
790
  import_bb = require("@aztec/bb.js");
399
791
  Barretenberg = class {
400
- async compile(noirCode) {
792
+ // Note: options parameter is accepted but not used - Barretenberg uses Noir's ACIR directly
793
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
794
+ async compile(noirCode, _options) {
401
795
  const { basePath, cleanup } = await createTempDir2();
402
796
  const fm = (0, import_noir_wasm2.createFileManager)(basePath);
403
797
  const nargoToml = `[package]
@@ -1071,16 +1465,20 @@ var IziNoir = class _IziNoir {
1071
1465
  * After compile(), the verifying key is available via `this.vk`.
1072
1466
  *
1073
1467
  * @param noirCode - The Noir source code to compile
1468
+ * @param options - Optional compilation options including ParsedCircuit for dynamic R1CS
1074
1469
  * @returns CompileResult with circuit and verifying key
1075
1470
  *
1076
1471
  * @example
1077
1472
  * ```typescript
1473
+ * // Basic usage
1078
1474
  * const { circuit, verifyingKey } = await izi.compile(noirCode);
1079
- * console.log('VK:', izi.vk); // Available immediately after compile
1475
+ *
1476
+ * // With ParsedCircuit for dynamic R1CS generation
1477
+ * const { circuit } = await izi.compile(noirCode, { parsedCircuit });
1080
1478
  * ```
1081
1479
  */
1082
- async compile(noirCode) {
1083
- this.compiledCircuit = await this.provingSystem.compile(noirCode);
1480
+ async compile(noirCode, options) {
1481
+ this.compiledCircuit = await this.provingSystem.compile(noirCode, options);
1084
1482
  const vk = await this.extractVerifyingKey(this.compiledCircuit);
1085
1483
  if (vk) {
1086
1484
  this._verifyingKey = vk;
@@ -1,9 +1,9 @@
1
- import { I as IProvingSystem } from '../IProvingSystem-BpI0rmve.cjs';
2
- export { C as CircuitPaths, a as IziNoirConfig, P as Provider } from '../IProvingSystem-BpI0rmve.cjs';
1
+ import { I as IProvingSystem, f as CompileOptions } from '../IProvingSystem-SfzgcbqH.cjs';
2
+ export { C as CircuitPaths, a as IziNoirConfig, P as Provider } from '../IProvingSystem-SfzgcbqH.cjs';
3
3
  import { P as ProofData } from '../types-CxkI04bP.cjs';
4
4
  import { CompiledCircuit, InputMap } from '@noir-lang/types';
5
5
  export { CompiledCircuit, InputMap } from '@noir-lang/types';
6
- export { a as IziNoir, i as initNoirWasm, b as isWasmInitialized } from '../wasmInit-D615cpte.cjs';
6
+ export { a as IziNoir, i as initNoirWasm, b as isWasmInitialized } from '../wasmInit-Wyynuk6r.cjs';
7
7
 
8
8
  /**
9
9
  * ArkworksWasm proving system.
@@ -108,8 +108,11 @@ declare class ArkworksWasm implements IProvingSystem {
108
108
  constructor(config?: ArkworksWasmConfig);
109
109
  /**
110
110
  * Compile Noir code to a circuit with ACIR for Groth16 proving
111
+ *
112
+ * @param noirCode - The Noir source code to compile
113
+ * @param options - Optional compilation options including ParsedCircuit for dynamic R1CS
111
114
  */
112
- compile(noirCode: string): Promise<CompiledCircuit>;
115
+ compile(noirCode: string, options?: CompileOptions): Promise<CompiledCircuit>;
113
116
  /**
114
117
  * Generate a Groth16 proof
115
118
  */
@@ -1,9 +1,9 @@
1
- import { I as IProvingSystem } from '../IProvingSystem-D0X9Rp3W.js';
2
- export { C as CircuitPaths, a as IziNoirConfig, P as Provider } from '../IProvingSystem-D0X9Rp3W.js';
1
+ import { I as IProvingSystem, f as CompileOptions } from '../IProvingSystem-BKgFRl27.js';
2
+ export { C as CircuitPaths, a as IziNoirConfig, P as Provider } from '../IProvingSystem-BKgFRl27.js';
3
3
  import { P as ProofData } from '../types-CxkI04bP.js';
4
4
  import { CompiledCircuit, InputMap } from '@noir-lang/types';
5
5
  export { CompiledCircuit, InputMap } from '@noir-lang/types';
6
- export { a as IziNoir, i as initNoirWasm, b as isWasmInitialized } from '../wasmInit-oOZwkgo_.js';
6
+ export { a as IziNoir, i as initNoirWasm, b as isWasmInitialized } from '../wasmInit-D3RyRKIC.js';
7
7
 
8
8
  /**
9
9
  * ArkworksWasm proving system.
@@ -108,8 +108,11 @@ declare class ArkworksWasm implements IProvingSystem {
108
108
  constructor(config?: ArkworksWasmConfig);
109
109
  /**
110
110
  * Compile Noir code to a circuit with ACIR for Groth16 proving
111
+ *
112
+ * @param noirCode - The Noir source code to compile
113
+ * @param options - Optional compilation options including ParsedCircuit for dynamic R1CS
111
114
  */
112
- compile(noirCode: string): Promise<CompiledCircuit>;
115
+ compile(noirCode: string, options?: CompileOptions): Promise<CompiledCircuit>;
113
116
  /**
114
117
  * Generate a Groth16 proof
115
118
  */