@caatinga/zk 3.1.2 → 3.2.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/dist/index.cjs CHANGED
@@ -31,14 +31,19 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  ZkError: () => ZkError,
34
+ assertDevCeremonyAllowed: () => assertDevCeremonyAllowed,
34
35
  buildCircuit: () => buildCircuit,
35
36
  buildStellarVerifyProofArgs: () => buildStellarVerifyProofArgs,
36
37
  invokeVerifier: () => invokeVerifier,
38
+ isProductionNetwork: () => isProductionNetwork,
37
39
  proveCircuit: () => proveCircuit,
38
40
  ptauSizeForConstraints: () => ptauSizeForConstraints,
41
+ readDevCeremonyManifest: () => readDevCeremonyManifest,
39
42
  serializeProof: () => serializeProof,
40
43
  serializePublicSignals: () => serializePublicSignals,
41
- serializeVk: () => serializeVk
44
+ serializeVk: () => serializeVk,
45
+ writeDevCeremonyManifest: () => writeDevCeremonyManifest,
46
+ zkArtifactsDir: () => zkArtifactsDir
42
47
  });
43
48
  module.exports = __toCommonJS(index_exports);
44
49
 
@@ -123,8 +128,8 @@ function serializePublicSignals(signals) {
123
128
 
124
129
  // src/build/build-circuit.ts
125
130
  var import_core2 = require("@caatinga/core");
126
- var import_node_path2 = __toESM(require("path"), 1);
127
- var import_promises3 = require("fs/promises");
131
+ var import_node_path3 = __toESM(require("path"), 1);
132
+ var import_promises4 = require("fs/promises");
128
133
  var import_node_crypto2 = require("crypto");
129
134
 
130
135
  // src/install/lazy-install-zk-tools.ts
@@ -286,6 +291,62 @@ function ptauSizeForConstraints(constraintCount) {
286
291
  return Math.min(Math.max(needed, 8), 28);
287
292
  }
288
293
 
294
+ // src/ceremony/dev-ceremony.ts
295
+ var import_promises3 = require("fs/promises");
296
+ var import_node_path2 = __toESM(require("path"), 1);
297
+ var DEV_CEREMONY_TYPE = "dev-single-party";
298
+ var CEREMONY_MANIFEST_FILE = "ceremony.json";
299
+ function isProductionNetwork(networkName) {
300
+ return networkName === "mainnet";
301
+ }
302
+ function ceremonyManifestPath(artifactsDir) {
303
+ return import_node_path2.default.join(artifactsDir, CEREMONY_MANIFEST_FILE);
304
+ }
305
+ async function writeDevCeremonyManifest(artifactsDir) {
306
+ const manifest = {
307
+ type: DEV_CEREMONY_TYPE,
308
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
309
+ };
310
+ await (0, import_promises3.writeFile)(
311
+ ceremonyManifestPath(artifactsDir),
312
+ `${JSON.stringify(manifest, null, 2)}
313
+ `,
314
+ "utf8"
315
+ );
316
+ }
317
+ async function readDevCeremonyManifest(artifactsDir) {
318
+ try {
319
+ const raw = await (0, import_promises3.readFile)(ceremonyManifestPath(artifactsDir), "utf8");
320
+ const parsed = JSON.parse(raw);
321
+ if (parsed.type !== DEV_CEREMONY_TYPE) {
322
+ return null;
323
+ }
324
+ return parsed;
325
+ } catch {
326
+ return null;
327
+ }
328
+ }
329
+ async function assertDevCeremonyAllowed(options) {
330
+ if (!isProductionNetwork(options.networkName)) {
331
+ return;
332
+ }
333
+ if (options.allowDevCeremony) {
334
+ return;
335
+ }
336
+ const manifest = await readDevCeremonyManifest(options.artifactsDir);
337
+ if (!manifest) {
338
+ return;
339
+ }
340
+ throw new ZkError(
341
+ `${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,
342
+ "ZK_DEV_CEREMONY_BLOCKED",
343
+ "Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing."
344
+ );
345
+ }
346
+ function zkArtifactsDir(circuitName) {
347
+ return `.artifacts/zk/${circuitName}`;
348
+ }
349
+
289
350
  // src/serialization/curve-bytes.ts
290
351
  function concatG1Bytes(point) {
291
352
  const bytes = new Uint8Array(point.x.length + point.y.length);
@@ -370,22 +431,22 @@ ${formatRustByteArray(ic)}
370
431
  ].join("\n");
371
432
  }
372
433
  async function writeEmbeddedVk(vkPath, verifierSrcDir) {
373
- const rawJson = await (0, import_promises3.readFile)(vkPath, "utf8");
434
+ const rawJson = await (0, import_promises4.readFile)(vkPath, "utf8");
374
435
  const rustSource = generateVkRust(vkPath, rawJson);
375
- await (0, import_promises3.writeFile)(import_node_path2.default.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
436
+ await (0, import_promises4.writeFile)(import_node_path3.default.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
376
437
  }
377
438
  async function buildCircuit(options) {
378
439
  const progress = options.progress;
379
440
  const circom = await ensureCircom(progress);
380
441
  const snarkjs = await ensureSnarkjs(progress);
381
- const circuitDir = import_node_path2.default.resolve(options.circuitPath);
382
- const outDir = import_node_path2.default.resolve(options.artifactsDir);
383
- const circuitFile = import_node_path2.default.join(circuitDir, "main.circom");
384
- const r1csPath = import_node_path2.default.join(outDir, "main.r1cs");
385
- const zkey0 = import_node_path2.default.join(outDir, "circuit_0000.zkey");
386
- const zkeyFinal = import_node_path2.default.join(outDir, "circuit_final.zkey");
387
- const vkPath = import_node_path2.default.join(outDir, "verification_key.json");
388
- await (0, import_promises3.mkdir)(outDir, { recursive: true });
442
+ const circuitDir = import_node_path3.default.resolve(options.circuitPath);
443
+ const outDir = import_node_path3.default.resolve(options.artifactsDir);
444
+ const circuitFile = import_node_path3.default.join(circuitDir, "main.circom");
445
+ const r1csPath = import_node_path3.default.join(outDir, "main.r1cs");
446
+ const zkey0 = import_node_path3.default.join(outDir, "circuit_0000.zkey");
447
+ const zkeyFinal = import_node_path3.default.join(outDir, "circuit_final.zkey");
448
+ const vkPath = import_node_path3.default.join(outDir, "verification_key.json");
449
+ await (0, import_promises4.mkdir)(outDir, { recursive: true });
389
450
  progress?.onStatus?.(`Compiling ${circuitFile}...`);
390
451
  await (0, import_core2.runCommand)(circom, [
391
452
  circuitFile,
@@ -412,29 +473,30 @@ ${entropy}
412
473
  });
413
474
  await (0, import_core2.runCommand)(snarkjs, ["zkey", "export", "verificationkey", zkeyFinal, vkPath]);
414
475
  if (options.embedVk) {
415
- const verifierSrcDir = import_node_path2.default.resolve("contracts", "verifier", "src");
476
+ const verifierSrcDir = import_node_path3.default.resolve("contracts", "verifier", "src");
416
477
  await writeEmbeddedVk(vkPath, verifierSrcDir);
417
478
  }
479
+ await writeDevCeremonyManifest(outDir);
418
480
  }
419
481
 
420
482
  // src/prove/prove-circuit.ts
421
483
  var import_core3 = require("@caatinga/core");
422
- var import_node_path3 = __toESM(require("path"), 1);
423
- var import_promises4 = require("fs/promises");
484
+ var import_node_path4 = __toESM(require("path"), 1);
485
+ var import_promises5 = require("fs/promises");
424
486
  function resolveCircuitWasmPath(artifactsDir) {
425
- return import_node_path3.default.join(artifactsDir, "main_js", "main.wasm");
487
+ return import_node_path4.default.join(artifactsDir, "main_js", "main.wasm");
426
488
  }
427
489
  async function proveCircuit(options) {
428
490
  const snarkjs = await ensureSnarkjs(options.progress);
429
- const artifactsDir = import_node_path3.default.resolve(options.artifactsDir);
491
+ const artifactsDir = import_node_path4.default.resolve(options.artifactsDir);
430
492
  const wasmPath = resolveCircuitWasmPath(artifactsDir);
431
- const zkeyPath = import_node_path3.default.join(artifactsDir, "circuit_final.zkey");
432
- const inputPath = import_node_path3.default.resolve(options.inputPath);
433
- const proofPath = import_node_path3.default.join(artifactsDir, "proof.json");
434
- const publicPath = import_node_path3.default.join(artifactsDir, "public.json");
435
- await (0, import_promises4.mkdir)(artifactsDir, { recursive: true });
493
+ const zkeyPath = import_node_path4.default.join(artifactsDir, "circuit_final.zkey");
494
+ const inputPath = import_node_path4.default.resolve(options.inputPath);
495
+ const proofPath = import_node_path4.default.join(artifactsDir, "proof.json");
496
+ const publicPath = import_node_path4.default.join(artifactsDir, "public.json");
497
+ await (0, import_promises5.mkdir)(artifactsDir, { recursive: true });
436
498
  if (options.debug) {
437
- const witnessPath = import_node_path3.default.join(artifactsDir, "witness.wtns");
499
+ const witnessPath = import_node_path4.default.join(artifactsDir, "witness.wtns");
438
500
  await (0, import_core3.runCommand)(snarkjs, ["wtns", "calculate", wasmPath, inputPath, witnessPath, "-v"]);
439
501
  await (0, import_core3.runCommand)(snarkjs, ["groth16", "prove", zkeyPath, witnessPath, proofPath, publicPath]);
440
502
  return;
@@ -448,14 +510,14 @@ async function proveCircuit(options) {
448
510
  proofPath,
449
511
  publicPath
450
512
  ]);
451
- await (0, import_promises4.access)(proofPath);
452
- await (0, import_promises4.access)(publicPath);
513
+ await (0, import_promises5.access)(proofPath);
514
+ await (0, import_promises5.access)(publicPath);
453
515
  }
454
516
 
455
517
  // src/invoke/invoke-verifier.ts
456
518
  var import_core4 = require("@caatinga/core");
457
- var import_promises5 = require("fs/promises");
458
- var import_node_path4 = __toESM(require("path"), 1);
519
+ var import_promises6 = require("fs/promises");
520
+ var import_node_path5 = __toESM(require("path"), 1);
459
521
  function buildStellarVerifyProofArgs(options) {
460
522
  const serializedProof = serializeProof(options.proof);
461
523
  const args = [];
@@ -490,12 +552,12 @@ async function invokeVerifier(options) {
490
552
  const cwd = options.cwd ?? process.cwd();
491
553
  const config = options.config ?? await (0, import_core4.loadConfig)({ cwd });
492
554
  const proof = JSON.parse(
493
- await (0, import_promises5.readFile)(import_node_path4.default.resolve(cwd, options.proofPath), "utf8")
555
+ await (0, import_promises6.readFile)(import_node_path5.default.resolve(cwd, options.proofPath), "utf8")
494
556
  );
495
557
  const publicSignals = JSON.parse(
496
- await (0, import_promises5.readFile)(import_node_path4.default.resolve(cwd, options.publicSignalsPath), "utf8")
558
+ await (0, import_promises6.readFile)(import_node_path5.default.resolve(cwd, options.publicSignalsPath), "utf8")
497
559
  );
498
- const vk = options.embedVk ? void 0 : JSON.parse(await (0, import_promises5.readFile)(import_node_path4.default.resolve(cwd, options.vkPath), "utf8"));
560
+ const vk = options.embedVk ? void 0 : JSON.parse(await (0, import_promises6.readFile)(import_node_path5.default.resolve(cwd, options.vkPath), "utf8"));
499
561
  const args = buildStellarVerifyProofArgs({
500
562
  proof,
501
563
  vk,
@@ -537,13 +599,18 @@ async function invokeVerifier(options) {
537
599
  // Annotate the CommonJS export names for ESM import in node:
538
600
  0 && (module.exports = {
539
601
  ZkError,
602
+ assertDevCeremonyAllowed,
540
603
  buildCircuit,
541
604
  buildStellarVerifyProofArgs,
542
605
  invokeVerifier,
606
+ isProductionNetwork,
543
607
  proveCircuit,
544
608
  ptauSizeForConstraints,
609
+ readDevCeremonyManifest,
545
610
  serializeProof,
546
611
  serializePublicSignals,
547
- serializeVk
612
+ serializeVk,
613
+ writeDevCeremonyManifest,
614
+ zkArtifactsDir
548
615
  });
549
616
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/serialization/bigint-helpers.ts","../src/serialization/serialize-proof.ts","../src/serialization/serialize-vk.ts","../src/serialization/serialize-public-signals.ts","../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/errors/ZkError.ts","../src/install/download-with-progress.ts","../src/build/detect-ptau-size.ts","../src/serialization/curve-bytes.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["export {\n serializeProof,\n type SerializedProof,\n type SnarkjsProof,\n} from \"./serialization/serialize-proof.js\";\nexport { serializeVk, type SerializedVk, type SnarkjsVk } from \"./serialization/serialize-vk.js\";\nexport { serializePublicSignals } from \"./serialization/serialize-public-signals.js\";\nexport { buildCircuit, type BuildCircuitOptions } from \"./build/build-circuit.js\";\nexport { proveCircuit, type ProveCircuitOptions } from \"./prove/prove-circuit.js\";\nexport {\n invokeVerifier,\n buildStellarVerifyProofArgs,\n type InvokeVerifierOptions,\n type InvokeVerifierResult,\n} from \"./invoke/invoke-verifier.js\";\nexport { ptauSizeForConstraints } from \"./build/detect-ptau-size.js\";\nexport type { ZkInstallProgress } from \"./install/install-progress.js\";\nexport { ZkError } from \"./errors/ZkError.js\";\n","/**\n * Convert a decimal string to a little-endian unsigned 32-byte array.\n */\nexport function decimalToLe32(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n\n/**\n * Convert a decimal string to a big-endian unsigned 48-byte array.\n */\nexport function decimalToBe48(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(48);\n for (let i = 47; i >= 0; i--) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\n\nexport type SerializedG1 = {\n x: Uint8Array;\n y: Uint8Array;\n};\n\nexport type SerializedG2 = {\n x: [Uint8Array, Uint8Array];\n y: [Uint8Array, Uint8Array];\n};\n\nexport type SerializedProof = {\n a: SerializedG1;\n b: SerializedG2;\n c: SerializedG1;\n};\n\nexport type SnarkjsProof = {\n pi_a: [string, string, string];\n pi_b: [[string, string], [string, string]];\n pi_c: [string, string, string];\n protocol: string;\n curve: string;\n};\n\nexport function serializeProof(proof: SnarkjsProof): SerializedProof {\n if (proof.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${proof.curve}`);\n }\n\n return {\n a: {\n x: decimalToBe48(proof.pi_a[0]),\n y: decimalToBe48(proof.pi_a[1]),\n },\n b: {\n x: [decimalToBe48(proof.pi_b[0][1]), decimalToBe48(proof.pi_b[0][0])],\n y: [decimalToBe48(proof.pi_b[1][1]), decimalToBe48(proof.pi_b[1][0])],\n },\n c: {\n x: decimalToBe48(proof.pi_c[0]),\n y: decimalToBe48(proof.pi_c[1]),\n },\n };\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\nimport type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport type SerializedVk = {\n alpha: SerializedG1;\n beta: SerializedG2;\n gamma: SerializedG2;\n delta: SerializedG2;\n ic: SerializedG1[];\n};\n\nexport type SnarkjsVk = {\n protocol: string;\n curve: string;\n vk_alpha_1: [string, string, string];\n vk_beta_2: [[string, string], [string, string], ...string[][]];\n vk_gamma_2: [[string, string], [string, string], ...string[][]];\n vk_delta_2: [[string, string], [string, string], ...string[][]];\n vk_ic?: Array<[string, string, string]>;\n IC?: Array<[string, string, string]>;\n};\n\nfunction g2FromSnarkjsExport(\n rows: [[string, string], [string, string], ...string[][]]\n): SerializedG2 {\n return g2FromSnarkjs([rows[0]!, rows[1]!]);\n}\n\nfunction g1FromSnarkjs(p: [string, string, string]): SerializedG1 {\n return {\n x: decimalToBe48(p[0]),\n y: decimalToBe48(p[1]),\n };\n}\n\nfunction g2FromSnarkjs(p: [[string, string], [string, string]]): SerializedG2 {\n return {\n x: [decimalToBe48(p[0][1]), decimalToBe48(p[0][0])],\n y: [decimalToBe48(p[1][1]), decimalToBe48(p[1][0])],\n };\n}\n\nexport function serializeVk(vk: SnarkjsVk): SerializedVk {\n if (vk.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${vk.curve}`);\n }\n\n const ic = vk.vk_ic ?? vk.IC;\n if (!ic) {\n throw new Error(\"Verification key is missing vk_ic/IC entries.\");\n }\n\n return {\n alpha: g1FromSnarkjs(vk.vk_alpha_1),\n beta: g2FromSnarkjsExport(vk.vk_beta_2),\n gamma: g2FromSnarkjsExport(vk.vk_gamma_2),\n delta: g2FromSnarkjsExport(vk.vk_delta_2),\n ic: ic.map(g1FromSnarkjs),\n };\n}\n","import { decimalToLe32 } from \"./bigint-helpers.js\";\n\nexport function serializePublicSignals(signals: string[]): Uint8Array[] {\n return signals.map((s) => decimalToLe32(s));\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n progress?: ZkInstallProgress;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(vkPath: string, verifierSrcDir: string): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n progress?.onStatus?.(`Compiling ${circuitFile}...`);\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\n\n return finalPath;\n}\n","export class ZkError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly hint?: string\n ) {\n super(message);\n this.name = \"ZkError\";\n }\n}\n","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport function concatG1Bytes(point: SerializedG1): Uint8Array {\n const bytes = new Uint8Array(point.x.length + point.y.length);\n bytes.set(point.x, 0);\n bytes.set(point.y, point.x.length);\n return bytes;\n}\n\nexport function concatG2Bytes(point: SerializedG2): Uint8Array {\n const bytes = new Uint8Array(\n point.x[0].length + point.x[1].length + point.y[0].length + point.y[1].length\n );\n let offset = 0;\n for (const chunk of [point.x[0], point.x[1], point.y[0], point.y[1]]) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n}\n\nexport function concatG1Hex(point: SerializedG1): string {\n return bytesToHex(concatG1Bytes(point));\n}\n\nexport function concatG2Hex(point: SerializedG2): string {\n return bytesToHex(concatG2Bytes(point));\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs(options.progress);\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : (JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk);\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,SAAS,cAAc,SAA6B;AACzD,MAAI,QAAQ,OAAO,OAAO;AAC1B,QAAM,MAAM,IAAI,WAAW,EAAE;AAC7B,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,QAAI,CAAC,IAAI,OAAO,QAAQ,KAAK;AAC7B,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAKO,SAAS,cAAc,SAA6B;AACzD,MAAI,QAAQ,OAAO,OAAO;AAC1B,QAAM,MAAM,IAAI,WAAW,EAAE;AAC7B,WAAS,IAAI,IAAI,KAAK,GAAG,KAAK;AAC5B,QAAI,CAAC,IAAI,OAAO,QAAQ,KAAK;AAC7B,cAAU;AAAA,EACZ;AACA,SAAO;AACT;;;ACEO,SAAS,eAAe,OAAsC;AACnE,MAAI,MAAM,UAAU,YAAY;AAC9B,UAAM,IAAI,MAAM,gCAAgC,MAAM,KAAK,EAAE;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,MACD,GAAG,cAAc,MAAM,KAAK,CAAC,CAAC;AAAA,MAC9B,GAAG,cAAc,MAAM,KAAK,CAAC,CAAC;AAAA,IAChC;AAAA,IACA,GAAG;AAAA,MACD,GAAG,CAAC,cAAc,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,MACpE,GAAG,CAAC,cAAc,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,IACtE;AAAA,IACA,GAAG;AAAA,MACD,GAAG,cAAc,MAAM,KAAK,CAAC,CAAC;AAAA,MAC9B,GAAG,cAAc,MAAM,KAAK,CAAC,CAAC;AAAA,IAChC;AAAA,EACF;AACF;;;ACvBA,SAAS,oBACP,MACc;AACd,SAAO,cAAc,CAAC,KAAK,CAAC,GAAI,KAAK,CAAC,CAAE,CAAC;AAC3C;AAEA,SAAS,cAAc,GAA2C;AAChE,SAAO;AAAA,IACL,GAAG,cAAc,EAAE,CAAC,CAAC;AAAA,IACrB,GAAG,cAAc,EAAE,CAAC,CAAC;AAAA,EACvB;AACF;AAEA,SAAS,cAAc,GAAuD;AAC5E,SAAO;AAAA,IACL,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,IAClD,GAAG,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,EACpD;AACF;AAEO,SAAS,YAAY,IAA6B;AACvD,MAAI,GAAG,UAAU,YAAY;AAC3B,UAAM,IAAI,MAAM,gCAAgC,GAAG,KAAK,EAAE;AAAA,EAC5D;AAEA,QAAM,KAAK,GAAG,SAAS,GAAG;AAC1B,MAAI,CAAC,IAAI;AACP,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,SAAO;AAAA,IACL,OAAO,cAAc,GAAG,UAAU;AAAA,IAClC,MAAM,oBAAoB,GAAG,SAAS;AAAA,IACtC,OAAO,oBAAoB,GAAG,UAAU;AAAA,IACxC,OAAO,oBAAoB,GAAG,UAAU;AAAA,IACxC,IAAI,GAAG,IAAI,aAAa;AAAA,EAC1B;AACF;;;ACzDO,SAAS,uBAAuB,SAAiC;AACtE,SAAO,QAAQ,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;AAC5C;;;ACJA,IAAAA,eAA2B;AAC3B,IAAAC,oBAAiB;AACjB,IAAAC,mBAA2C;AAC3C,IAAAC,sBAAwC;;;ACHxC,kBAA2B;AAC3B,IAAAC,mBAAgD;AAChD,uBAAiB;AACjB,qBAAe;AACf,yBAAwC;;;ACJjC,IAAM,UAAN,cAAsB,MAAM;AAAA,EACjC,YACE,SACgB,MACA,MAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAAA,EACA;AAKpB;;;ACTA,qBAAkC;AAClC,sBAAyB;AACzB,yBAAyB;AAIzB,eAAsB,qBACpB,KACA,iBACA,UACe;AACf,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,sBAAsB,GAAG,UAAU,SAAS,MAAM;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI;AAAA,MACR,sBAAsB,GAAG;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,SAAS,QAAQ,IAAI,gBAAgB;AAC3D,QAAM,QAAQ,gBAAgB,OAAO,SAAS,eAAe,EAAE,IAAI;AACnE,MAAI,SAAS;AAEb,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,aAAa,4BAAS;AAAA,KACzB,mBAAmB;AAClB,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,MAAM;AACR;AAAA,QACF;AACA,kBAAU,MAAM;AAChB,kBAAU,qBAAqB,QAAQ,KAAK;AAC5C,cAAM,OAAO,KAAK,KAAK;AAAA,MACzB;AAAA,IACF,GAAG;AAAA,EACL;AAEA,YAAM,0BAAS,gBAAY,kCAAkB,eAAe,CAAC;AAC7D,YAAU,qBAAqB;AACjC;;;AFxCA,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AAEvB,SAAS,aAAqB;AAC5B,SAAO,iBAAAC,QAAK,KAAK,QAAQ,IAAI,QAAQ,eAAAC,QAAG,QAAQ,GAAG,aAAa,UAAU;AAC5E;AAEA,SAAS,kBAA0B;AACjC,QAAM,WAAW,QAAQ;AACzB,QAAM,OAAO,QAAQ,SAAS,QAAQ,UAAU,QAAQ;AACxD,MAAI,aAAa,SAAS;AACxB,WAAO,gBAAgB,IAAI;AAAA,EAC7B;AACA,MAAI,aAAa,UAAU;AACzB,WAAO,gBAAgB,IAAI;AAAA,EAC7B;AACA,QAAM,IAAI;AAAA,IACR,sDAAsD,QAAQ;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,aAAa,UAA+C;AAChF,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,aAAa,iBAAAD,QAAK,KAAK,WAAW,GAAG,UAAU,cAAc;AACnE,QAAM,aAAa,iBAAAA,QAAK,KAAK,YAAY,KAAK;AAE9C,MAAI;AACF,cAAM,yBAAO,UAAU;AACvB,cAAU,WAAW,wBAAwB,cAAc,EAAE;AAC7D,WAAO;AAAA,EACT,QAAQ;AAAA,EAER;AAEA,QAAM,MAAM,sDAAsD,cAAc,IAAI,KAAK;AACzF,YAAM,wBAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,YAAU,WAAW,uBAAuB,cAAc,KAAK,KAAK,MAAM;AAC1E,QAAM,qBAAqB,KAAK,YAAY,QAAQ;AACpD,YAAM,wBAAM,YAAY,GAAK;AAC7B,YAAU,WAAW,2BAAsB,UAAU,EAAE;AAEvD,SAAO;AACT;AAEA,eAAsB,cAAc,UAA+C;AACjF,QAAM,aAAa,iBAAAA,QAAK,KAAK,WAAW,GAAG,WAAW,eAAe,EAAE;AACvE,QAAM,UAAU,iBAAAA,QAAK,KAAK,YAAY,gBAAgB,QAAQ,SAAS;AAEvE,MAAI;AACF,cAAM,yBAAO,OAAO;AACpB,cAAU,WAAW,yBAAyB,eAAe,EAAE;AAC/D,WAAO;AAAA,EACT,QAAQ;AACN,cAAU;AAAA,MACR,uBAAuB,eAAe,SAAS,UAAU;AAAA,IAC3D;AACA,cAAM,wBAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC3C,cAAM;AAAA,MACJ,iBAAAA,QAAK,KAAK,YAAY,cAAc;AAAA,MACpC,KAAK,UAAU,EAAE,MAAM,uBAAuB,SAAS,MAAM,SAAS,QAAQ,GAAG,MAAM,CAAC;AAAA,MACxF;AAAA,IACF;AACA,cAAM;AAAA,MACJ;AAAA,MACA,CAAC,WAAW,aAAa,sBAAsB,WAAW,eAAe,EAAE;AAAA,MAC3E;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AACA,cAAU,WAAW,4BAAuB,OAAO,EAAE;AACrD,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,WAAW,MAAc,UAA+C;AAC5F,QAAM,UAAU,iBAAAA,QAAK,KAAK,WAAW,GAAG,QAAQ,WAAW;AAC3D,QAAM,YAAY,iBAAAA,QAAK,KAAK,SAAS,MAAM,IAAI,aAAa;AAC5D,MAAI;AACF,cAAM,yBAAO,SAAS;AACtB,cAAU,WAAW,+CAA+C,IAAI,GAAG;AAC3E,WAAO;AAAA,EACT,QAAQ;AACN,cAAM,wBAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,YAAU,WAAW,iDAAiD,IAAI,MAAM;AAChF,QAAM,UAAU,MAAM,cAAc,QAAQ;AAC5C,QAAM,OAAO,iBAAAA,QAAK,KAAK,SAAS,MAAM,IAAI,YAAY;AACtD,QAAM,OAAO,iBAAAA,QAAK,KAAK,SAAS,MAAM,IAAI,YAAY;AACtD,QAAM,cAAU,+BAAW,QAAQ,EAAE,WAAO,gCAAY,EAAE,CAAC,EAAE,OAAO,KAAK;AAEzE,YAAM,wBAAW,SAAS,CAAC,eAAe,OAAO,aAAa,OAAO,IAAI,GAAG,MAAM,IAAI,CAAC;AACvF,YAAM,wBAAW,SAAS,CAAC,eAAe,cAAc,MAAM,MAAM,IAAI,GAAG;AAAA,IACzE,OAAO;AAAA,EAAiB,OAAO;AAAA;AAAA,EACjC,CAAC;AACD,YAAM,wBAAW,SAAS,CAAC,eAAe,WAAW,UAAU,MAAM,WAAW,IAAI,CAAC;AACrF,YAAU,WAAW,8BAAyB,SAAS,EAAE;AAEzD,SAAO;AACT;;;AG/GO,SAAS,uBAAuB,iBAAiC;AACtE,QAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI;AACpE,SAAO,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE;AACzC;;;ACDO,SAAS,cAAc,OAAiC;AAC7D,QAAM,QAAQ,IAAI,WAAW,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM;AAC5D,QAAM,IAAI,MAAM,GAAG,CAAC;AACpB,QAAM,IAAI,MAAM,GAAG,MAAM,EAAE,MAAM;AACjC,SAAO;AACT;AAEO,SAAS,cAAc,OAAiC;AAC7D,QAAM,QAAQ,IAAI;AAAA,IAChB,MAAM,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC,EAAE;AAAA,EACzE;AACA,MAAI,SAAS;AACb,aAAW,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG;AACpE,UAAM,IAAI,OAAO,MAAM;AACvB,cAAU,MAAM;AAAA,EAClB;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAA6B;AACvD,SAAO,WAAW,cAAc,KAAK,CAAC;AACxC;AAEO,SAAS,YAAY,OAA6B;AACvD,SAAO,WAAW,cAAc,KAAK,CAAC;AACxC;AAEA,SAAS,WAAW,OAA2B;AAC7C,SAAO,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAChF;;;ALbA,IAAM,iBAAiB;AAEvB,SAAS,oBAAoB,OAA2B;AACtD,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,gBAAgB;AACrD,UAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;AAC3D,WAAO;AAAA,MACL,aAAa,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,IACrF;AAAA,EACF;AACA,SAAO,OAAO,KAAK,IAAI;AACzB;AAEO,SAAS,eAAe,SAAiB,SAAyB;AACvE,QAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,QAAM,KAAK,YAAY,GAAG;AAE1B,QAAM,aAAa,cAAc,GAAG,KAAK;AACzC,QAAM,YAAY,cAAc,GAAG,IAAI;AACvC,QAAM,aAAa,cAAc,GAAG,KAAK;AACzC,QAAM,aAAa,cAAc,GAAG,KAAK;AACzC,QAAM,YAAY,GAAG,GAAG,IAAI,aAAa;AAEzC,QAAM,UAAU,UACb;AAAA,IACC,CAAC,IAAI,MACH;AAAA,EAA0C,oBAAoB,EAAE,CAAC;AAAA,oBAAuB,CAAC;AAAA,EAC7F,EACC,KAAK,IAAI;AAEZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,oBAAoB,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAe,gBAAgB,QAAgB,gBAAuC;AACpF,QAAM,UAAU,UAAM,2BAAS,QAAQ,MAAM;AAC7C,QAAM,aAAa,eAAe,QAAQ,OAAO;AACjD,YAAM,4BAAU,kBAAAE,QAAK,KAAK,gBAAgB,OAAO,GAAG,YAAY,MAAM;AACxE;AAEA,eAAsB,aAAa,SAA6C;AAC9E,QAAM,WAAW,QAAQ;AACzB,QAAM,SAAS,MAAM,aAAa,QAAQ;AAC1C,QAAM,UAAU,MAAM,cAAc,QAAQ;AAC5C,QAAM,aAAa,kBAAAA,QAAK,QAAQ,QAAQ,WAAW;AACnD,QAAM,SAAS,kBAAAA,QAAK,QAAQ,QAAQ,YAAY;AAChD,QAAM,cAAc,kBAAAA,QAAK,KAAK,YAAY,aAAa;AACvD,QAAM,WAAW,kBAAAA,QAAK,KAAK,QAAQ,WAAW;AAC9C,QAAM,QAAQ,kBAAAA,QAAK,KAAK,QAAQ,mBAAmB;AACnD,QAAM,YAAY,kBAAAA,QAAK,KAAK,QAAQ,oBAAoB;AACxD,QAAM,SAAS,kBAAAA,QAAK,KAAK,QAAQ,uBAAuB;AAExD,YAAM,wBAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAEvC,YAAU,WAAW,aAAa,WAAW,KAAK;AAClD,YAAM,yBAAW,QAAQ;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW,UAAM,yBAAW,SAAS,CAAC,QAAQ,QAAQ,QAAQ,CAAC;AACrE,QAAM,kBAAkB,SAAS,OAAO,MAAM,2BAA2B;AACzE,QAAM,cAAc,kBAAkB,OAAO,SAAS,gBAAgB,CAAC,GAAI,EAAE,IAAI;AACjF,QAAM,WAAW,uBAAuB,WAAW;AACnD,QAAM,WAAW,MAAM,WAAW,UAAU,QAAQ;AACpD,QAAM,cAAU,gCAAW,QAAQ,EAAE,WAAO,iCAAY,EAAE,CAAC,EAAE,OAAO,KAAK;AAEzE,YAAU,WAAW,kCAAkC;AACvD,YAAM,yBAAW,SAAS,CAAC,WAAW,SAAS,UAAU,UAAU,KAAK,CAAC;AACzE,YAAM,yBAAW,SAAS,CAAC,QAAQ,cAAc,OAAO,WAAW,IAAI,GAAG;AAAA,IACxE,OAAO;AAAA,EAAiB,OAAO;AAAA;AAAA,EACjC,CAAC;AACD,YAAM,yBAAW,SAAS,CAAC,QAAQ,UAAU,mBAAmB,WAAW,MAAM,CAAC;AAElF,MAAI,QAAQ,SAAS;AACnB,UAAM,iBAAiB,kBAAAA,QAAK,QAAQ,aAAa,YAAY,KAAK;AAClE,UAAM,gBAAgB,QAAQ,cAAc;AAAA,EAC9C;AACF;;;AMjIA,IAAAC,eAA2B;AAC3B,IAAAC,oBAAiB;AACjB,IAAAC,mBAA8B;AAavB,SAAS,uBAAuB,cAA8B;AACnE,SAAO,kBAAAC,QAAK,KAAK,cAAc,WAAW,WAAW;AACvD;AAEA,eAAsB,aAAa,SAA6C;AAC9E,QAAM,UAAU,MAAM,cAAc,QAAQ,QAAQ;AACpD,QAAM,eAAe,kBAAAA,QAAK,QAAQ,QAAQ,YAAY;AACtD,QAAM,WAAW,uBAAuB,YAAY;AACpD,QAAM,WAAW,kBAAAA,QAAK,KAAK,cAAc,oBAAoB;AAC7D,QAAM,YAAY,kBAAAA,QAAK,QAAQ,QAAQ,SAAS;AAChD,QAAM,YAAY,kBAAAA,QAAK,KAAK,cAAc,YAAY;AACtD,QAAM,aAAa,kBAAAA,QAAK,KAAK,cAAc,aAAa;AAExD,YAAM,wBAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAE7C,MAAI,QAAQ,OAAO;AACjB,UAAM,cAAc,kBAAAA,QAAK,KAAK,cAAc,cAAc;AAC1D,cAAM,yBAAW,SAAS,CAAC,QAAQ,aAAa,UAAU,WAAW,aAAa,IAAI,CAAC;AACvF,cAAM,yBAAW,SAAS,CAAC,WAAW,SAAS,UAAU,aAAa,WAAW,UAAU,CAAC;AAC5F;AAAA,EACF;AAEA,YAAM,yBAAW,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,YAAM,yBAAO,SAAS;AACtB,YAAM,yBAAO,UAAU;AACzB;;;ACjDA,IAAAC,eAA+E;AAC/E,IAAAC,mBAAyB;AACzB,IAAAC,oBAAiB;AAkBV,SAAS,4BAA4B,SAK/B;AACX,QAAM,kBAAkB,eAAe,QAAQ,KAAK;AACpD,QAAM,OAAiB,CAAC;AAExB,MAAI,CAAC,QAAQ,SAAS;AACpB,QAAI,CAAC,QAAQ,IAAI;AACf,YAAM,IAAI,QAAQ,uDAAuD,gBAAgB;AAAA,IAC3F;AAEA,UAAM,eAAe,YAAY,QAAQ,EAAE;AAC3C,SAAK;AAAA,MACH;AAAA,MACA,KAAK,UAAU;AAAA,QACb,OAAO,YAAY,aAAa,KAAK;AAAA,QACrC,MAAM,YAAY,aAAa,IAAI;AAAA,QACnC,OAAO,YAAY,aAAa,KAAK;AAAA,QACrC,OAAO,YAAY,aAAa,KAAK;AAAA,QACrC,IAAI,aAAa,GAAG,IAAI,WAAW;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,OAAK;AAAA,IACH;AAAA,IACA,KAAK,UAAU;AAAA,MACb,GAAG,YAAY,gBAAgB,CAAC;AAAA,MAChC,GAAG,YAAY,gBAAgB,CAAC;AAAA,MAChC,GAAG,YAAY,gBAAgB,CAAC;AAAA,IAClC,CAAC;AAAA,EACH;AACA,OAAK,KAAK,iBAAiB,KAAK,UAAU,QAAQ,aAAa,CAAC;AAEhE,SAAO;AACT;AAUA,eAAsB,eACpB,SAC+B;AAC/B,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,SAAS,QAAQ,UAAW,UAAM,yBAAW,EAAE,IAAI,CAAC;AAC1D,QAAM,QAAQ,KAAK;AAAA,IACjB,UAAM,2BAAS,kBAAAC,QAAK,QAAQ,KAAK,QAAQ,SAAS,GAAG,MAAM;AAAA,EAC7D;AACA,QAAM,gBAAgB,KAAK;AAAA,IACzB,UAAM,2BAAS,kBAAAA,QAAK,QAAQ,KAAK,QAAQ,iBAAiB,GAAG,MAAM;AAAA,EACrE;AAEA,QAAM,KAAK,QAAQ,UACf,SACC,KAAK,MAAM,UAAM,2BAAS,kBAAAA,QAAK,QAAQ,KAAK,QAAQ,MAAM,GAAG,MAAM,CAAC;AAEzE,QAAM,OAAO,4BAA4B;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,QAAQ;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,GAAG,QAAQ,gBAAgB;AAC1C,QAAM,SAAS,UAAM,6BAAe;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI,QAAQ,2CAA2C,kBAAkB;AAAA,EACjF;AAEA,MAAI,OAAO,OAAO,KAAK,EAAE,YAAY,MAAM,QAAQ;AACjD,UAAM,IAAI,QAAQ,qBAAqB,OAAO,OAAO,KAAK,CAAC,KAAK,kBAAkB;AAAA,EACpF;AAEA,QAAM,YAAY,UAAM,4BAAc,GAAG;AACzC,QAAM,aACJ,UAAU,SAAS,QAAQ,OAAO,GAAG,UAAU,QAAQ,gBAAgB,GAAG;AAE5E,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,mCAAmC,QAAQ,gBAAgB,SAAS,QAAQ,OAAO;AAAA,MACnF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,kBAAkB,QAAQ;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ;AACF;","names":["import_core","import_node_path","import_promises","import_node_crypto","import_promises","path","os","path","import_core","import_node_path","import_promises","path","import_core","import_promises","import_node_path","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/serialization/bigint-helpers.ts","../src/serialization/serialize-proof.ts","../src/serialization/serialize-vk.ts","../src/serialization/serialize-public-signals.ts","../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/errors/ZkError.ts","../src/install/download-with-progress.ts","../src/build/detect-ptau-size.ts","../src/ceremony/dev-ceremony.ts","../src/serialization/curve-bytes.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["export {\n serializeProof,\n type SerializedProof,\n type SnarkjsProof,\n} from \"./serialization/serialize-proof.js\";\nexport { serializeVk, type SerializedVk, type SnarkjsVk } from \"./serialization/serialize-vk.js\";\nexport { serializePublicSignals } from \"./serialization/serialize-public-signals.js\";\nexport { buildCircuit, type BuildCircuitOptions } from \"./build/build-circuit.js\";\nexport { proveCircuit, type ProveCircuitOptions } from \"./prove/prove-circuit.js\";\nexport {\n invokeVerifier,\n buildStellarVerifyProofArgs,\n type InvokeVerifierOptions,\n type InvokeVerifierResult,\n} from \"./invoke/invoke-verifier.js\";\nexport { ptauSizeForConstraints } from \"./build/detect-ptau-size.js\";\nexport {\n assertDevCeremonyAllowed,\n isProductionNetwork,\n readDevCeremonyManifest,\n writeDevCeremonyManifest,\n zkArtifactsDir,\n type AssertDevCeremonyAllowedOptions,\n type DevCeremonyManifest,\n} from \"./ceremony/dev-ceremony.js\";\nexport type { ZkInstallProgress } from \"./install/install-progress.js\";\nexport { ZkError } from \"./errors/ZkError.js\";\n","/**\n * Convert a decimal string to a little-endian unsigned 32-byte array.\n */\nexport function decimalToLe32(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n\n/**\n * Convert a decimal string to a big-endian unsigned 48-byte array.\n */\nexport function decimalToBe48(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(48);\n for (let i = 47; i >= 0; i--) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\n\nexport type SerializedG1 = {\n x: Uint8Array;\n y: Uint8Array;\n};\n\nexport type SerializedG2 = {\n x: [Uint8Array, Uint8Array];\n y: [Uint8Array, Uint8Array];\n};\n\nexport type SerializedProof = {\n a: SerializedG1;\n b: SerializedG2;\n c: SerializedG1;\n};\n\nexport type SnarkjsProof = {\n pi_a: [string, string, string];\n pi_b: [[string, string], [string, string]];\n pi_c: [string, string, string];\n protocol: string;\n curve: string;\n};\n\nexport function serializeProof(proof: SnarkjsProof): SerializedProof {\n if (proof.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${proof.curve}`);\n }\n\n return {\n a: {\n x: decimalToBe48(proof.pi_a[0]),\n y: decimalToBe48(proof.pi_a[1]),\n },\n b: {\n x: [decimalToBe48(proof.pi_b[0][1]), decimalToBe48(proof.pi_b[0][0])],\n y: [decimalToBe48(proof.pi_b[1][1]), decimalToBe48(proof.pi_b[1][0])],\n },\n c: {\n x: decimalToBe48(proof.pi_c[0]),\n y: decimalToBe48(proof.pi_c[1]),\n },\n };\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\nimport type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport type SerializedVk = {\n alpha: SerializedG1;\n beta: SerializedG2;\n gamma: SerializedG2;\n delta: SerializedG2;\n ic: SerializedG1[];\n};\n\nexport type SnarkjsVk = {\n protocol: string;\n curve: string;\n vk_alpha_1: [string, string, string];\n vk_beta_2: [[string, string], [string, string], ...string[][]];\n vk_gamma_2: [[string, string], [string, string], ...string[][]];\n vk_delta_2: [[string, string], [string, string], ...string[][]];\n vk_ic?: Array<[string, string, string]>;\n IC?: Array<[string, string, string]>;\n};\n\nfunction g2FromSnarkjsExport(\n rows: [[string, string], [string, string], ...string[][]]\n): SerializedG2 {\n return g2FromSnarkjs([rows[0]!, rows[1]!]);\n}\n\nfunction g1FromSnarkjs(p: [string, string, string]): SerializedG1 {\n return {\n x: decimalToBe48(p[0]),\n y: decimalToBe48(p[1]),\n };\n}\n\nfunction g2FromSnarkjs(p: [[string, string], [string, string]]): SerializedG2 {\n return {\n x: [decimalToBe48(p[0][1]), decimalToBe48(p[0][0])],\n y: [decimalToBe48(p[1][1]), decimalToBe48(p[1][0])],\n };\n}\n\nexport function serializeVk(vk: SnarkjsVk): SerializedVk {\n if (vk.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${vk.curve}`);\n }\n\n const ic = vk.vk_ic ?? vk.IC;\n if (!ic) {\n throw new Error(\"Verification key is missing vk_ic/IC entries.\");\n }\n\n return {\n alpha: g1FromSnarkjs(vk.vk_alpha_1),\n beta: g2FromSnarkjsExport(vk.vk_beta_2),\n gamma: g2FromSnarkjsExport(vk.vk_gamma_2),\n delta: g2FromSnarkjsExport(vk.vk_delta_2),\n ic: ic.map(g1FromSnarkjs),\n };\n}\n","import { decimalToLe32 } from \"./bigint-helpers.js\";\n\nexport function serializePublicSignals(signals: string[]): Uint8Array[] {\n return signals.map((s) => decimalToLe32(s));\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { writeDevCeremonyManifest } from \"../ceremony/dev-ceremony.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n progress?: ZkInstallProgress;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(vkPath: string, verifierSrcDir: string): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n progress?.onStatus?.(`Compiling ${circuitFile}...`);\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n\n await writeDevCeremonyManifest(outDir);\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\n\n return finalPath;\n}\n","export class ZkError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly hint?: string\n ) {\n super(message);\n this.name = \"ZkError\";\n }\n}\n","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport const DEV_CEREMONY_TYPE = \"dev-single-party\" as const;\nexport const CEREMONY_MANIFEST_FILE = \"ceremony.json\";\n\nexport type DevCeremonyManifest = {\n type: typeof DEV_CEREMONY_TYPE;\n generatedAt: string;\n};\n\nexport function isProductionNetwork(networkName: string): boolean {\n return networkName === \"mainnet\";\n}\n\nexport function ceremonyManifestPath(artifactsDir: string): string {\n return path.join(artifactsDir, CEREMONY_MANIFEST_FILE);\n}\n\nexport async function writeDevCeremonyManifest(artifactsDir: string): Promise<void> {\n const manifest: DevCeremonyManifest = {\n type: DEV_CEREMONY_TYPE,\n generatedAt: new Date().toISOString(),\n };\n await writeFile(\n ceremonyManifestPath(artifactsDir),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nexport async function readDevCeremonyManifest(\n artifactsDir: string\n): Promise<DevCeremonyManifest | null> {\n try {\n const raw = await readFile(ceremonyManifestPath(artifactsDir), \"utf8\");\n const parsed = JSON.parse(raw) as DevCeremonyManifest;\n if (parsed.type !== DEV_CEREMONY_TYPE) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport type AssertDevCeremonyAllowedOptions = {\n networkName: string;\n artifactsDir: string;\n allowDevCeremony: boolean;\n operation: string;\n};\n\nexport async function assertDevCeremonyAllowed(\n options: AssertDevCeremonyAllowedOptions\n): Promise<void> {\n if (!isProductionNetwork(options.networkName)) {\n return;\n }\n\n if (options.allowDevCeremony) {\n return;\n }\n\n const manifest = await readDevCeremonyManifest(options.artifactsDir);\n if (!manifest) {\n return;\n }\n\n throw new ZkError(\n `${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,\n \"ZK_DEV_CEREMONY_BLOCKED\",\n \"Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing.\"\n );\n}\n\nexport function zkArtifactsDir(circuitName: string): string {\n return `.artifacts/zk/${circuitName}`;\n}\n","import type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport function concatG1Bytes(point: SerializedG1): Uint8Array {\n const bytes = new Uint8Array(point.x.length + point.y.length);\n bytes.set(point.x, 0);\n bytes.set(point.y, point.x.length);\n return bytes;\n}\n\nexport function concatG2Bytes(point: SerializedG2): Uint8Array {\n const bytes = new Uint8Array(\n point.x[0].length + point.x[1].length + point.y[0].length + point.y[1].length\n );\n let offset = 0;\n for (const chunk of [point.x[0], point.x[1], point.y[0], point.y[1]]) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n}\n\nexport function concatG1Hex(point: SerializedG1): string {\n return bytesToHex(concatG1Bytes(point));\n}\n\nexport function concatG2Hex(point: SerializedG2): string {\n return bytesToHex(concatG2Bytes(point));\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs(options.progress);\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : (JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk);\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":"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","names":["import_core","import_node_path","import_promises","import_node_crypto","import_promises","path","os","import_promises","import_node_path","path","path","import_core","import_node_path","import_promises","path","import_core","import_promises","import_node_path","path"]}
package/dist/index.d.cts CHANGED
@@ -55,10 +55,27 @@ declare function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeV
55
55
 
56
56
  declare function ptauSizeForConstraints(constraintCount: number): number;
57
57
 
58
+ declare const DEV_CEREMONY_TYPE: "dev-single-party";
59
+ type DevCeremonyManifest = {
60
+ type: typeof DEV_CEREMONY_TYPE;
61
+ generatedAt: string;
62
+ };
63
+ declare function isProductionNetwork(networkName: string): boolean;
64
+ declare function writeDevCeremonyManifest(artifactsDir: string): Promise<void>;
65
+ declare function readDevCeremonyManifest(artifactsDir: string): Promise<DevCeremonyManifest | null>;
66
+ type AssertDevCeremonyAllowedOptions = {
67
+ networkName: string;
68
+ artifactsDir: string;
69
+ allowDevCeremony: boolean;
70
+ operation: string;
71
+ };
72
+ declare function assertDevCeremonyAllowed(options: AssertDevCeremonyAllowedOptions): Promise<void>;
73
+ declare function zkArtifactsDir(circuitName: string): string;
74
+
58
75
  declare class ZkError extends Error {
59
76
  readonly code: string;
60
77
  readonly hint?: string | undefined;
61
78
  constructor(message: string, code: string, hint?: string | undefined);
62
79
  }
63
80
 
64
- export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
81
+ export { type AssertDevCeremonyAllowedOptions, type BuildCircuitOptions, type DevCeremonyManifest, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, assertDevCeremonyAllowed, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, isProductionNetwork, proveCircuit, ptauSizeForConstraints, readDevCeremonyManifest, writeDevCeremonyManifest, zkArtifactsDir };
package/dist/index.d.ts CHANGED
@@ -55,10 +55,27 @@ declare function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeV
55
55
 
56
56
  declare function ptauSizeForConstraints(constraintCount: number): number;
57
57
 
58
+ declare const DEV_CEREMONY_TYPE: "dev-single-party";
59
+ type DevCeremonyManifest = {
60
+ type: typeof DEV_CEREMONY_TYPE;
61
+ generatedAt: string;
62
+ };
63
+ declare function isProductionNetwork(networkName: string): boolean;
64
+ declare function writeDevCeremonyManifest(artifactsDir: string): Promise<void>;
65
+ declare function readDevCeremonyManifest(artifactsDir: string): Promise<DevCeremonyManifest | null>;
66
+ type AssertDevCeremonyAllowedOptions = {
67
+ networkName: string;
68
+ artifactsDir: string;
69
+ allowDevCeremony: boolean;
70
+ operation: string;
71
+ };
72
+ declare function assertDevCeremonyAllowed(options: AssertDevCeremonyAllowedOptions): Promise<void>;
73
+ declare function zkArtifactsDir(circuitName: string): string;
74
+
58
75
  declare class ZkError extends Error {
59
76
  readonly code: string;
60
77
  readonly hint?: string | undefined;
61
78
  constructor(message: string, code: string, hint?: string | undefined);
62
79
  }
63
80
 
64
- export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
81
+ export { type AssertDevCeremonyAllowedOptions, type BuildCircuitOptions, type DevCeremonyManifest, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, assertDevCeremonyAllowed, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, isProductionNetwork, proveCircuit, ptauSizeForConstraints, readDevCeremonyManifest, writeDevCeremonyManifest, zkArtifactsDir };
package/dist/index.js CHANGED
@@ -11,8 +11,8 @@ import {
11
11
 
12
12
  // src/build/build-circuit.ts
13
13
  import { runCommand as runCommand2 } from "@caatinga/core";
14
- import path2 from "path";
15
- import { mkdir as mkdir2, readFile, writeFile as writeFile2 } from "fs/promises";
14
+ import path3 from "path";
15
+ import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile3 } from "fs/promises";
16
16
  import { createHash as createHash2, randomBytes as randomBytes2 } from "crypto";
17
17
 
18
18
  // src/install/lazy-install-zk-tools.ts
@@ -162,6 +162,62 @@ function ptauSizeForConstraints(constraintCount) {
162
162
  return Math.min(Math.max(needed, 8), 28);
163
163
  }
164
164
 
165
+ // src/ceremony/dev-ceremony.ts
166
+ import { readFile, writeFile as writeFile2 } from "fs/promises";
167
+ import path2 from "path";
168
+ var DEV_CEREMONY_TYPE = "dev-single-party";
169
+ var CEREMONY_MANIFEST_FILE = "ceremony.json";
170
+ function isProductionNetwork(networkName) {
171
+ return networkName === "mainnet";
172
+ }
173
+ function ceremonyManifestPath(artifactsDir) {
174
+ return path2.join(artifactsDir, CEREMONY_MANIFEST_FILE);
175
+ }
176
+ async function writeDevCeremonyManifest(artifactsDir) {
177
+ const manifest = {
178
+ type: DEV_CEREMONY_TYPE,
179
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
180
+ };
181
+ await writeFile2(
182
+ ceremonyManifestPath(artifactsDir),
183
+ `${JSON.stringify(manifest, null, 2)}
184
+ `,
185
+ "utf8"
186
+ );
187
+ }
188
+ async function readDevCeremonyManifest(artifactsDir) {
189
+ try {
190
+ const raw = await readFile(ceremonyManifestPath(artifactsDir), "utf8");
191
+ const parsed = JSON.parse(raw);
192
+ if (parsed.type !== DEV_CEREMONY_TYPE) {
193
+ return null;
194
+ }
195
+ return parsed;
196
+ } catch {
197
+ return null;
198
+ }
199
+ }
200
+ async function assertDevCeremonyAllowed(options) {
201
+ if (!isProductionNetwork(options.networkName)) {
202
+ return;
203
+ }
204
+ if (options.allowDevCeremony) {
205
+ return;
206
+ }
207
+ const manifest = await readDevCeremonyManifest(options.artifactsDir);
208
+ if (!manifest) {
209
+ return;
210
+ }
211
+ throw new ZkError(
212
+ `${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,
213
+ "ZK_DEV_CEREMONY_BLOCKED",
214
+ "Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing."
215
+ );
216
+ }
217
+ function zkArtifactsDir(circuitName) {
218
+ return `.artifacts/zk/${circuitName}`;
219
+ }
220
+
165
221
  // src/build/build-circuit.ts
166
222
  var BYTES_PER_LINE = 16;
167
223
  function formatRustByteArray(bytes) {
@@ -218,21 +274,21 @@ ${formatRustByteArray(ic)}
218
274
  ].join("\n");
219
275
  }
220
276
  async function writeEmbeddedVk(vkPath, verifierSrcDir) {
221
- const rawJson = await readFile(vkPath, "utf8");
277
+ const rawJson = await readFile2(vkPath, "utf8");
222
278
  const rustSource = generateVkRust(vkPath, rawJson);
223
- await writeFile2(path2.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
279
+ await writeFile3(path3.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
224
280
  }
225
281
  async function buildCircuit(options) {
226
282
  const progress = options.progress;
227
283
  const circom = await ensureCircom(progress);
228
284
  const snarkjs = await ensureSnarkjs(progress);
229
- const circuitDir = path2.resolve(options.circuitPath);
230
- const outDir = path2.resolve(options.artifactsDir);
231
- const circuitFile = path2.join(circuitDir, "main.circom");
232
- const r1csPath = path2.join(outDir, "main.r1cs");
233
- const zkey0 = path2.join(outDir, "circuit_0000.zkey");
234
- const zkeyFinal = path2.join(outDir, "circuit_final.zkey");
235
- const vkPath = path2.join(outDir, "verification_key.json");
285
+ const circuitDir = path3.resolve(options.circuitPath);
286
+ const outDir = path3.resolve(options.artifactsDir);
287
+ const circuitFile = path3.join(circuitDir, "main.circom");
288
+ const r1csPath = path3.join(outDir, "main.r1cs");
289
+ const zkey0 = path3.join(outDir, "circuit_0000.zkey");
290
+ const zkeyFinal = path3.join(outDir, "circuit_final.zkey");
291
+ const vkPath = path3.join(outDir, "verification_key.json");
236
292
  await mkdir2(outDir, { recursive: true });
237
293
  progress?.onStatus?.(`Compiling ${circuitFile}...`);
238
294
  await runCommand2(circom, [
@@ -260,29 +316,30 @@ ${entropy}
260
316
  });
261
317
  await runCommand2(snarkjs, ["zkey", "export", "verificationkey", zkeyFinal, vkPath]);
262
318
  if (options.embedVk) {
263
- const verifierSrcDir = path2.resolve("contracts", "verifier", "src");
319
+ const verifierSrcDir = path3.resolve("contracts", "verifier", "src");
264
320
  await writeEmbeddedVk(vkPath, verifierSrcDir);
265
321
  }
322
+ await writeDevCeremonyManifest(outDir);
266
323
  }
267
324
 
268
325
  // src/prove/prove-circuit.ts
269
326
  import { runCommand as runCommand3 } from "@caatinga/core";
270
- import path3 from "path";
327
+ import path4 from "path";
271
328
  import { access as access2, mkdir as mkdir3 } from "fs/promises";
272
329
  function resolveCircuitWasmPath(artifactsDir) {
273
- return path3.join(artifactsDir, "main_js", "main.wasm");
330
+ return path4.join(artifactsDir, "main_js", "main.wasm");
274
331
  }
275
332
  async function proveCircuit(options) {
276
333
  const snarkjs = await ensureSnarkjs(options.progress);
277
- const artifactsDir = path3.resolve(options.artifactsDir);
334
+ const artifactsDir = path4.resolve(options.artifactsDir);
278
335
  const wasmPath = resolveCircuitWasmPath(artifactsDir);
279
- const zkeyPath = path3.join(artifactsDir, "circuit_final.zkey");
280
- const inputPath = path3.resolve(options.inputPath);
281
- const proofPath = path3.join(artifactsDir, "proof.json");
282
- const publicPath = path3.join(artifactsDir, "public.json");
336
+ const zkeyPath = path4.join(artifactsDir, "circuit_final.zkey");
337
+ const inputPath = path4.resolve(options.inputPath);
338
+ const proofPath = path4.join(artifactsDir, "proof.json");
339
+ const publicPath = path4.join(artifactsDir, "public.json");
283
340
  await mkdir3(artifactsDir, { recursive: true });
284
341
  if (options.debug) {
285
- const witnessPath = path3.join(artifactsDir, "witness.wtns");
342
+ const witnessPath = path4.join(artifactsDir, "witness.wtns");
286
343
  await runCommand3(snarkjs, ["wtns", "calculate", wasmPath, inputPath, witnessPath, "-v"]);
287
344
  await runCommand3(snarkjs, ["groth16", "prove", zkeyPath, witnessPath, proofPath, publicPath]);
288
345
  return;
@@ -302,8 +359,8 @@ async function proveCircuit(options) {
302
359
 
303
360
  // src/invoke/invoke-verifier.ts
304
361
  import { invokeContract, loadConfig, readArtifacts } from "@caatinga/core";
305
- import { readFile as readFile2 } from "fs/promises";
306
- import path4 from "path";
362
+ import { readFile as readFile3 } from "fs/promises";
363
+ import path5 from "path";
307
364
  function buildStellarVerifyProofArgs(options) {
308
365
  const serializedProof = serializeProof(options.proof);
309
366
  const args = [];
@@ -338,12 +395,12 @@ async function invokeVerifier(options) {
338
395
  const cwd = options.cwd ?? process.cwd();
339
396
  const config = options.config ?? await loadConfig({ cwd });
340
397
  const proof = JSON.parse(
341
- await readFile2(path4.resolve(cwd, options.proofPath), "utf8")
398
+ await readFile3(path5.resolve(cwd, options.proofPath), "utf8")
342
399
  );
343
400
  const publicSignals = JSON.parse(
344
- await readFile2(path4.resolve(cwd, options.publicSignalsPath), "utf8")
401
+ await readFile3(path5.resolve(cwd, options.publicSignalsPath), "utf8")
345
402
  );
346
- const vk = options.embedVk ? void 0 : JSON.parse(await readFile2(path4.resolve(cwd, options.vkPath), "utf8"));
403
+ const vk = options.embedVk ? void 0 : JSON.parse(await readFile3(path5.resolve(cwd, options.vkPath), "utf8"));
347
404
  const args = buildStellarVerifyProofArgs({
348
405
  proof,
349
406
  vk,
@@ -384,13 +441,18 @@ async function invokeVerifier(options) {
384
441
  }
385
442
  export {
386
443
  ZkError,
444
+ assertDevCeremonyAllowed,
387
445
  buildCircuit,
388
446
  buildStellarVerifyProofArgs,
389
447
  invokeVerifier,
448
+ isProductionNetwork,
390
449
  proveCircuit,
391
450
  ptauSizeForConstraints,
451
+ readDevCeremonyManifest,
392
452
  serializeProof,
393
453
  serializePublicSignals,
394
- serializeVk
454
+ serializeVk,
455
+ writeDevCeremonyManifest,
456
+ zkArtifactsDir
395
457
  };
396
458
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/install/download-with-progress.ts","../src/build/detect-ptau-size.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n progress?: ZkInstallProgress;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(vkPath: string, verifierSrcDir: string): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n progress?.onStatus?.(`Compiling ${circuitFile}...`);\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\n\n return finalPath;\n}\n","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs(options.progress);\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : (JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk);\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,cAAAA,mBAAkB;AAC3B,OAAOC,WAAU;AACjB,SAAS,SAAAC,QAAO,UAAU,aAAAC,kBAAiB;AAC3C,SAAS,cAAAC,aAAY,eAAAC,oBAAmB;;;ACHxC,SAAS,kBAAkB;AAC3B,SAAS,QAAQ,OAAO,OAAO,iBAAiB;AAChD,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,YAAY,mBAAmB;;;ACJxC,SAAS,yBAAyB;AAClC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAIzB,eAAsB,qBACpB,KACA,iBACA,UACe;AACf,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,sBAAsB,GAAG,UAAU,SAAS,MAAM;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI;AAAA,MACR,sBAAsB,GAAG;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,SAAS,QAAQ,IAAI,gBAAgB;AAC3D,QAAM,QAAQ,gBAAgB,OAAO,SAAS,eAAe,EAAE,IAAI;AACnE,MAAI,SAAS;AAEb,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,aAAa,SAAS;AAAA,KACzB,mBAAmB;AAClB,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,MAAM;AACR;AAAA,QACF;AACA,kBAAU,MAAM;AAChB,kBAAU,qBAAqB,QAAQ,KAAK;AAC5C,cAAM,OAAO,KAAK,KAAK;AAAA,MACzB;AAAA,IACF,GAAG;AAAA,EACL;AAEA,QAAM,SAAS,YAAY,kBAAkB,eAAe,CAAC;AAC7D,YAAU,qBAAqB;AACjC;;;ADxCA,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AAEvB,SAAS,aAAqB;AAC5B,SAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,GAAG,aAAa,UAAU;AAC5E;AAEA,SAAS,kBAA0B;AACjC,QAAM,WAAW,QAAQ;AACzB,QAAM,OAAO,QAAQ,SAAS,QAAQ,UAAU,QAAQ;AACxD,MAAI,aAAa,SAAS;AACxB,WAAO,gBAAgB,IAAI;AAAA,EAC7B;AACA,MAAI,aAAa,UAAU;AACzB,WAAO,gBAAgB,IAAI;AAAA,EAC7B;AACA,QAAM,IAAI;AAAA,IACR,sDAAsD,QAAQ;AAAA,IAC9D;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,aAAa,UAA+C;AAChF,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,aAAa,KAAK,KAAK,WAAW,GAAG,UAAU,cAAc;AACnE,QAAM,aAAa,KAAK,KAAK,YAAY,KAAK;AAE9C,MAAI;AACF,UAAM,OAAO,UAAU;AACvB,cAAU,WAAW,wBAAwB,cAAc,EAAE;AAC7D,WAAO;AAAA,EACT,QAAQ;AAAA,EAER;AAEA,QAAM,MAAM,sDAAsD,cAAc,IAAI,KAAK;AACzF,QAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,YAAU,WAAW,uBAAuB,cAAc,KAAK,KAAK,MAAM;AAC1E,QAAM,qBAAqB,KAAK,YAAY,QAAQ;AACpD,QAAM,MAAM,YAAY,GAAK;AAC7B,YAAU,WAAW,2BAAsB,UAAU,EAAE;AAEvD,SAAO;AACT;AAEA,eAAsB,cAAc,UAA+C;AACjF,QAAM,aAAa,KAAK,KAAK,WAAW,GAAG,WAAW,eAAe,EAAE;AACvE,QAAM,UAAU,KAAK,KAAK,YAAY,gBAAgB,QAAQ,SAAS;AAEvE,MAAI;AACF,UAAM,OAAO,OAAO;AACpB,cAAU,WAAW,yBAAyB,eAAe,EAAE;AAC/D,WAAO;AAAA,EACT,QAAQ;AACN,cAAU;AAAA,MACR,uBAAuB,eAAe,SAAS,UAAU;AAAA,IAC3D;AACA,UAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC3C,UAAM;AAAA,MACJ,KAAK,KAAK,YAAY,cAAc;AAAA,MACpC,KAAK,UAAU,EAAE,MAAM,uBAAuB,SAAS,MAAM,SAAS,QAAQ,GAAG,MAAM,CAAC;AAAA,MACxF;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,MACA,CAAC,WAAW,aAAa,sBAAsB,WAAW,eAAe,EAAE;AAAA,MAC3E;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AACA,cAAU,WAAW,4BAAuB,OAAO,EAAE;AACrD,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,WAAW,MAAc,UAA+C;AAC5F,QAAM,UAAU,KAAK,KAAK,WAAW,GAAG,QAAQ,WAAW;AAC3D,QAAM,YAAY,KAAK,KAAK,SAAS,MAAM,IAAI,aAAa;AAC5D,MAAI;AACF,UAAM,OAAO,SAAS;AACtB,cAAU,WAAW,+CAA+C,IAAI,GAAG;AAC3E,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,YAAU,WAAW,iDAAiD,IAAI,MAAM;AAChF,QAAM,UAAU,MAAM,cAAc,QAAQ;AAC5C,QAAM,OAAO,KAAK,KAAK,SAAS,MAAM,IAAI,YAAY;AACtD,QAAM,OAAO,KAAK,KAAK,SAAS,MAAM,IAAI,YAAY;AACtD,QAAM,UAAU,WAAW,QAAQ,EAAE,OAAO,YAAY,EAAE,CAAC,EAAE,OAAO,KAAK;AAEzE,QAAM,WAAW,SAAS,CAAC,eAAe,OAAO,aAAa,OAAO,IAAI,GAAG,MAAM,IAAI,CAAC;AACvF,QAAM,WAAW,SAAS,CAAC,eAAe,cAAc,MAAM,MAAM,IAAI,GAAG;AAAA,IACzE,OAAO;AAAA,EAAiB,OAAO;AAAA;AAAA,EACjC,CAAC;AACD,QAAM,WAAW,SAAS,CAAC,eAAe,WAAW,UAAU,MAAM,WAAW,IAAI,CAAC;AACrF,YAAU,WAAW,8BAAyB,SAAS,EAAE;AAEzD,SAAO;AACT;;;AE/GO,SAAS,uBAAuB,iBAAiC;AACtE,QAAM,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI;AACpE,SAAO,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE;AACzC;;;AHeA,IAAM,iBAAiB;AAEvB,SAAS,oBAAoB,OAA2B;AACtD,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,gBAAgB;AACrD,UAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;AAC3D,WAAO;AAAA,MACL,aAAa,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,IACrF;AAAA,EACF;AACA,SAAO,OAAO,KAAK,IAAI;AACzB;AAEO,SAAS,eAAe,SAAiB,SAAyB;AACvE,QAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,QAAM,KAAK,YAAY,GAAG;AAE1B,QAAM,aAAa,cAAc,GAAG,KAAK;AACzC,QAAM,YAAY,cAAc,GAAG,IAAI;AACvC,QAAM,aAAa,cAAc,GAAG,KAAK;AACzC,QAAM,aAAa,cAAc,GAAG,KAAK;AACzC,QAAM,YAAY,GAAG,GAAG,IAAI,aAAa;AAEzC,QAAM,UAAU,UACb;AAAA,IACC,CAAC,IAAI,MACH;AAAA,EAA0C,oBAAoB,EAAE,CAAC;AAAA,oBAAuB,CAAC;AAAA,EAC7F,EACC,KAAK,IAAI;AAEZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,oBAAoB,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAe,gBAAgB,QAAgB,gBAAuC;AACpF,QAAM,UAAU,MAAM,SAAS,QAAQ,MAAM;AAC7C,QAAM,aAAa,eAAe,QAAQ,OAAO;AACjD,QAAMC,WAAUC,MAAK,KAAK,gBAAgB,OAAO,GAAG,YAAY,MAAM;AACxE;AAEA,eAAsB,aAAa,SAA6C;AAC9E,QAAM,WAAW,QAAQ;AACzB,QAAM,SAAS,MAAM,aAAa,QAAQ;AAC1C,QAAM,UAAU,MAAM,cAAc,QAAQ;AAC5C,QAAM,aAAaA,MAAK,QAAQ,QAAQ,WAAW;AACnD,QAAM,SAASA,MAAK,QAAQ,QAAQ,YAAY;AAChD,QAAM,cAAcA,MAAK,KAAK,YAAY,aAAa;AACvD,QAAM,WAAWA,MAAK,KAAK,QAAQ,WAAW;AAC9C,QAAM,QAAQA,MAAK,KAAK,QAAQ,mBAAmB;AACnD,QAAM,YAAYA,MAAK,KAAK,QAAQ,oBAAoB;AACxD,QAAM,SAASA,MAAK,KAAK,QAAQ,uBAAuB;AAExD,QAAMC,OAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAEvC,YAAU,WAAW,aAAa,WAAW,KAAK;AAClD,QAAMC,YAAW,QAAQ;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAMA,YAAW,SAAS,CAAC,QAAQ,QAAQ,QAAQ,CAAC;AACrE,QAAM,kBAAkB,SAAS,OAAO,MAAM,2BAA2B;AACzE,QAAM,cAAc,kBAAkB,OAAO,SAAS,gBAAgB,CAAC,GAAI,EAAE,IAAI;AACjF,QAAM,WAAW,uBAAuB,WAAW;AACnD,QAAM,WAAW,MAAM,WAAW,UAAU,QAAQ;AACpD,QAAM,UAAUC,YAAW,QAAQ,EAAE,OAAOC,aAAY,EAAE,CAAC,EAAE,OAAO,KAAK;AAEzE,YAAU,WAAW,kCAAkC;AACvD,QAAMF,YAAW,SAAS,CAAC,WAAW,SAAS,UAAU,UAAU,KAAK,CAAC;AACzE,QAAMA,YAAW,SAAS,CAAC,QAAQ,cAAc,OAAO,WAAW,IAAI,GAAG;AAAA,IACxE,OAAO;AAAA,EAAiB,OAAO;AAAA;AAAA,EACjC,CAAC;AACD,QAAMA,YAAW,SAAS,CAAC,QAAQ,UAAU,mBAAmB,WAAW,MAAM,CAAC;AAElF,MAAI,QAAQ,SAAS;AACnB,UAAM,iBAAiBF,MAAK,QAAQ,aAAa,YAAY,KAAK;AAClE,UAAM,gBAAgB,QAAQ,cAAc;AAAA,EAC9C;AACF;;;AIjIA,SAAS,cAAAK,mBAAkB;AAC3B,OAAOC,WAAU;AACjB,SAAS,UAAAC,SAAQ,SAAAC,cAAa;AAavB,SAAS,uBAAuB,cAA8B;AACnE,SAAOC,MAAK,KAAK,cAAc,WAAW,WAAW;AACvD;AAEA,eAAsB,aAAa,SAA6C;AAC9E,QAAM,UAAU,MAAM,cAAc,QAAQ,QAAQ;AACpD,QAAM,eAAeA,MAAK,QAAQ,QAAQ,YAAY;AACtD,QAAM,WAAW,uBAAuB,YAAY;AACpD,QAAM,WAAWA,MAAK,KAAK,cAAc,oBAAoB;AAC7D,QAAM,YAAYA,MAAK,QAAQ,QAAQ,SAAS;AAChD,QAAM,YAAYA,MAAK,KAAK,cAAc,YAAY;AACtD,QAAM,aAAaA,MAAK,KAAK,cAAc,aAAa;AAExD,QAAMC,OAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAE7C,MAAI,QAAQ,OAAO;AACjB,UAAM,cAAcD,MAAK,KAAK,cAAc,cAAc;AAC1D,UAAME,YAAW,SAAS,CAAC,QAAQ,aAAa,UAAU,WAAW,aAAa,IAAI,CAAC;AACvF,UAAMA,YAAW,SAAS,CAAC,WAAW,SAAS,UAAU,aAAa,WAAW,UAAU,CAAC;AAC5F;AAAA,EACF;AAEA,QAAMA,YAAW,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAMC,QAAO,SAAS;AACtB,QAAMA,QAAO,UAAU;AACzB;;;ACjDA,SAAS,gBAAgB,YAAY,qBAA0C;AAC/E,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,WAAU;AAkBV,SAAS,4BAA4B,SAK/B;AACX,QAAM,kBAAkB,eAAe,QAAQ,KAAK;AACpD,QAAM,OAAiB,CAAC;AAExB,MAAI,CAAC,QAAQ,SAAS;AACpB,QAAI,CAAC,QAAQ,IAAI;AACf,YAAM,IAAI,QAAQ,uDAAuD,gBAAgB;AAAA,IAC3F;AAEA,UAAM,eAAe,YAAY,QAAQ,EAAE;AAC3C,SAAK;AAAA,MACH;AAAA,MACA,KAAK,UAAU;AAAA,QACb,OAAO,YAAY,aAAa,KAAK;AAAA,QACrC,MAAM,YAAY,aAAa,IAAI;AAAA,QACnC,OAAO,YAAY,aAAa,KAAK;AAAA,QACrC,OAAO,YAAY,aAAa,KAAK;AAAA,QACrC,IAAI,aAAa,GAAG,IAAI,WAAW;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,OAAK;AAAA,IACH;AAAA,IACA,KAAK,UAAU;AAAA,MACb,GAAG,YAAY,gBAAgB,CAAC;AAAA,MAChC,GAAG,YAAY,gBAAgB,CAAC;AAAA,MAChC,GAAG,YAAY,gBAAgB,CAAC;AAAA,IAClC,CAAC;AAAA,EACH;AACA,OAAK,KAAK,iBAAiB,KAAK,UAAU,QAAQ,aAAa,CAAC;AAEhE,SAAO;AACT;AAUA,eAAsB,eACpB,SAC+B;AAC/B,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,SAAS,QAAQ,UAAW,MAAM,WAAW,EAAE,IAAI,CAAC;AAC1D,QAAM,QAAQ,KAAK;AAAA,IACjB,MAAMC,UAASC,MAAK,QAAQ,KAAK,QAAQ,SAAS,GAAG,MAAM;AAAA,EAC7D;AACA,QAAM,gBAAgB,KAAK;AAAA,IACzB,MAAMD,UAASC,MAAK,QAAQ,KAAK,QAAQ,iBAAiB,GAAG,MAAM;AAAA,EACrE;AAEA,QAAM,KAAK,QAAQ,UACf,SACC,KAAK,MAAM,MAAMD,UAASC,MAAK,QAAQ,KAAK,QAAQ,MAAM,GAAG,MAAM,CAAC;AAEzE,QAAM,OAAO,4BAA4B;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,QAAQ;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,GAAG,QAAQ,gBAAgB;AAC1C,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI,QAAQ,2CAA2C,kBAAkB;AAAA,EACjF;AAEA,MAAI,OAAO,OAAO,KAAK,EAAE,YAAY,MAAM,QAAQ;AACjD,UAAM,IAAI,QAAQ,qBAAqB,OAAO,OAAO,KAAK,CAAC,KAAK,kBAAkB;AAAA,EACpF;AAEA,QAAM,YAAY,MAAM,cAAc,GAAG;AACzC,QAAM,aACJ,UAAU,SAAS,QAAQ,OAAO,GAAG,UAAU,QAAQ,gBAAgB,GAAG;AAE5E,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,mCAAmC,QAAQ,gBAAgB,SAAS,QAAQ,OAAO;AAAA,MACnF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,kBAAkB,QAAQ;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ;AACF;","names":["runCommand","path","mkdir","writeFile","createHash","randomBytes","writeFile","path","mkdir","runCommand","createHash","randomBytes","runCommand","path","access","mkdir","path","mkdir","runCommand","access","readFile","path","readFile","path"]}
1
+ {"version":3,"sources":["../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/install/download-with-progress.ts","../src/build/detect-ptau-size.ts","../src/ceremony/dev-ceremony.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { writeDevCeremonyManifest } from \"../ceremony/dev-ceremony.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n progress?: ZkInstallProgress;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(vkPath: string, verifierSrcDir: string): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n progress?.onStatus?.(`Compiling ${circuitFile}...`);\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n\n await writeDevCeremonyManifest(outDir);\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\n\n return finalPath;\n}\n","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport const DEV_CEREMONY_TYPE = \"dev-single-party\" as const;\nexport const CEREMONY_MANIFEST_FILE = \"ceremony.json\";\n\nexport type DevCeremonyManifest = {\n type: typeof DEV_CEREMONY_TYPE;\n generatedAt: string;\n};\n\nexport function isProductionNetwork(networkName: string): boolean {\n return networkName === \"mainnet\";\n}\n\nexport function ceremonyManifestPath(artifactsDir: string): string {\n return path.join(artifactsDir, CEREMONY_MANIFEST_FILE);\n}\n\nexport async function writeDevCeremonyManifest(artifactsDir: string): Promise<void> {\n const manifest: DevCeremonyManifest = {\n type: DEV_CEREMONY_TYPE,\n generatedAt: new Date().toISOString(),\n };\n await writeFile(\n ceremonyManifestPath(artifactsDir),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nexport async function readDevCeremonyManifest(\n artifactsDir: string\n): Promise<DevCeremonyManifest | null> {\n try {\n const raw = await readFile(ceremonyManifestPath(artifactsDir), \"utf8\");\n const parsed = JSON.parse(raw) as DevCeremonyManifest;\n if (parsed.type !== DEV_CEREMONY_TYPE) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport type AssertDevCeremonyAllowedOptions = {\n networkName: string;\n artifactsDir: string;\n allowDevCeremony: boolean;\n operation: string;\n};\n\nexport async function assertDevCeremonyAllowed(\n options: AssertDevCeremonyAllowedOptions\n): Promise<void> {\n if (!isProductionNetwork(options.networkName)) {\n return;\n }\n\n if (options.allowDevCeremony) {\n return;\n }\n\n const manifest = await readDevCeremonyManifest(options.artifactsDir);\n if (!manifest) {\n return;\n }\n\n throw new ZkError(\n `${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,\n \"ZK_DEV_CEREMONY_BLOCKED\",\n \"Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing.\"\n );\n}\n\nexport function zkArtifactsDir(circuitName: string): string {\n return `.artifacts/zk/${circuitName}`;\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs(options.progress);\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : (JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk);\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":"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","names":["runCommand","path","mkdir","readFile","writeFile","createHash","randomBytes","writeFile","path","path","writeFile","readFile","writeFile","path","mkdir","runCommand","createHash","randomBytes","runCommand","path","access","mkdir","path","mkdir","runCommand","access","readFile","path","readFile","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caatinga/zk",
3
- "version": "3.1.2",
3
+ "version": "3.2.0",
4
4
  "description": "Zero-knowledge proof serialization bridge for Stellar/Soroban",
5
5
  "type": "module",
6
6
  "engines": {
@@ -27,7 +27,7 @@
27
27
  "LICENSE"
28
28
  ],
29
29
  "dependencies": {
30
- "@caatinga/core": "^3.1.2"
30
+ "@caatinga/core": "^3.2.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "tsup": "^8.3.5",