@caatinga/zk 3.1.1 → 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,13 +128,13 @@ 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_promises2 = 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
131
136
  var import_core = require("@caatinga/core");
132
- var import_promises = require("fs/promises");
137
+ var import_promises2 = require("fs/promises");
133
138
  var import_node_path = __toESM(require("path"), 1);
134
139
  var import_node_os = __toESM(require("os"), 1);
135
140
  var import_node_crypto = require("crypto");
@@ -146,10 +151,53 @@ var ZkError = class extends Error {
146
151
  hint;
147
152
  };
148
153
 
154
+ // src/install/download-with-progress.ts
155
+ var import_node_fs = require("fs");
156
+ var import_promises = require("stream/promises");
157
+ var import_node_stream = require("stream");
158
+ async function downloadWithProgress(url, destinationPath, progress) {
159
+ const response = await fetch(url);
160
+ if (!response.ok) {
161
+ throw new ZkError(
162
+ `Failed to download ${url}: HTTP ${response.status}`,
163
+ "ZK_DOWNLOAD_FAILED",
164
+ "Check your network connection and try again."
165
+ );
166
+ }
167
+ if (!response.body) {
168
+ throw new ZkError(
169
+ `Failed to download ${url}: empty response body`,
170
+ "ZK_DOWNLOAD_FAILED",
171
+ "Check your network connection and try again."
172
+ );
173
+ }
174
+ const contentLength = response.headers.get("content-length");
175
+ const total = contentLength ? Number.parseInt(contentLength, 10) : void 0;
176
+ let loaded = 0;
177
+ const reader = response.body.getReader();
178
+ const nodeStream = import_node_stream.Readable.from(
179
+ (async function* () {
180
+ while (true) {
181
+ const { done, value } = await reader.read();
182
+ if (done) {
183
+ break;
184
+ }
185
+ loaded += value.byteLength;
186
+ progress?.onDownloadProgress?.(loaded, total);
187
+ yield Buffer.from(value);
188
+ }
189
+ })()
190
+ );
191
+ await (0, import_promises.pipeline)(nodeStream, (0, import_node_fs.createWriteStream)(destinationPath));
192
+ progress?.onDownloadComplete?.();
193
+ }
194
+
149
195
  // src/install/lazy-install-zk-tools.ts
150
- var ZK_CACHE_DIR = import_node_path.default.join(import_node_os.default.homedir(), ".caatinga", "zk-tools");
151
196
  var SNARKJS_VERSION = "0.7.5";
152
197
  var CIRCOM_VERSION = "2.1.9";
198
+ function zkCacheDir() {
199
+ return import_node_path.default.join(process.env.HOME ?? import_node_os.default.homedir(), ".caatinga", "zk-tools");
200
+ }
153
201
  function circomAssetName() {
154
202
  const platform = process.platform;
155
203
  const arch = process.arch === "x64" ? "amd64" : process.arch;
@@ -165,31 +213,37 @@ function circomAssetName() {
165
213
  "Install circom 2.x manually and ensure it is on PATH."
166
214
  );
167
215
  }
168
- async function ensureCircom() {
169
- const cached = import_node_path.default.join(ZK_CACHE_DIR, "circom", CIRCOM_VERSION, "circom");
216
+ async function ensureCircom(progress) {
217
+ const asset = circomAssetName();
218
+ const installDir = import_node_path.default.join(zkCacheDir(), "circom", CIRCOM_VERSION);
219
+ const binaryPath = import_node_path.default.join(installDir, asset);
170
220
  try {
171
- await (0, import_promises.access)(cached);
172
- return cached;
221
+ await (0, import_promises2.access)(binaryPath);
222
+ progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);
223
+ return binaryPath;
173
224
  } catch {
174
225
  }
175
- const asset = circomAssetName();
176
226
  const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;
177
- const installDir = import_node_path.default.join(ZK_CACHE_DIR, "circom", CIRCOM_VERSION);
178
- await (0, import_promises.mkdir)(installDir, { recursive: true });
179
- const archivePath = import_node_path.default.join(installDir, asset);
180
- await (0, import_core.runCommand)("curl", ["-fsSL", url, "-o", archivePath]);
181
- await (0, import_promises.chmod)(archivePath, 493);
182
- return archivePath;
183
- }
184
- async function ensureSnarkjs() {
185
- const installDir = import_node_path.default.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);
227
+ await (0, import_promises2.mkdir)(installDir, { recursive: true });
228
+ progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);
229
+ await downloadWithProgress(url, binaryPath, progress);
230
+ await (0, import_promises2.chmod)(binaryPath, 493);
231
+ progress?.onStatus?.(`circom installed \u2192 ${binaryPath}`);
232
+ return binaryPath;
233
+ }
234
+ async function ensureSnarkjs(progress) {
235
+ const installDir = import_node_path.default.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);
186
236
  const cliPath = import_node_path.default.join(installDir, "node_modules", ".bin", "snarkjs");
187
237
  try {
188
- await (0, import_promises.access)(cliPath);
238
+ await (0, import_promises2.access)(cliPath);
239
+ progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);
189
240
  return cliPath;
190
241
  } catch {
191
- await (0, import_promises.mkdir)(installDir, { recursive: true });
192
- await (0, import_promises.writeFile)(
242
+ progress?.onStatus?.(
243
+ `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`
244
+ );
245
+ await (0, import_promises2.mkdir)(installDir, { recursive: true });
246
+ await (0, import_promises2.writeFile)(
193
247
  import_node_path.default.join(installDir, "package.json"),
194
248
  JSON.stringify({ name: "caatinga-zk-snarkjs", private: true, version: "0.0.0" }, null, 2),
195
249
  "utf8"
@@ -201,19 +255,22 @@ async function ensureSnarkjs() {
201
255
  cwd: installDir
202
256
  }
203
257
  );
258
+ progress?.onStatus?.(`snarkjs installed \u2192 ${cliPath}`);
204
259
  return cliPath;
205
260
  }
206
261
  }
207
- async function ensurePtau(size) {
208
- const ptauDir = import_node_path.default.join(ZK_CACHE_DIR, "ptau", "bls12-381");
262
+ async function ensurePtau(size, progress) {
263
+ const ptauDir = import_node_path.default.join(zkCacheDir(), "ptau", "bls12-381");
209
264
  const finalPath = import_node_path.default.join(ptauDir, `pot${size}_final.ptau`);
210
265
  try {
211
- await (0, import_promises.access)(finalPath);
266
+ await (0, import_promises2.access)(finalPath);
267
+ progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);
212
268
  return finalPath;
213
269
  } catch {
214
- await (0, import_promises.mkdir)(ptauDir, { recursive: true });
270
+ await (0, import_promises2.mkdir)(ptauDir, { recursive: true });
215
271
  }
216
- const snarkjs = await ensureSnarkjs();
272
+ progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);
273
+ const snarkjs = await ensureSnarkjs(progress);
217
274
  const pot0 = import_node_path.default.join(ptauDir, `pot${size}_0000.ptau`);
218
275
  const pot1 = import_node_path.default.join(ptauDir, `pot${size}_0001.ptau`);
219
276
  const entropy = (0, import_node_crypto.createHash)("sha256").update((0, import_node_crypto.randomBytes)(32)).digest("hex");
@@ -224,6 +281,7 @@ ${entropy}
224
281
  `
225
282
  });
226
283
  await (0, import_core.runCommand)(snarkjs, ["powersoftau", "prepare", "phase2", pot1, finalPath, "-v"]);
284
+ progress?.onStatus?.(`powers-of-tau ready \u2192 ${finalPath}`);
227
285
  return finalPath;
228
286
  }
229
287
 
@@ -233,6 +291,62 @@ function ptauSizeForConstraints(constraintCount) {
233
291
  return Math.min(Math.max(needed, 8), 28);
234
292
  }
235
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
+
236
350
  // src/serialization/curve-bytes.ts
237
351
  function concatG1Bytes(point) {
238
352
  const bytes = new Uint8Array(point.x.length + point.y.length);
@@ -317,21 +431,23 @@ ${formatRustByteArray(ic)}
317
431
  ].join("\n");
318
432
  }
319
433
  async function writeEmbeddedVk(vkPath, verifierSrcDir) {
320
- const rawJson = await (0, import_promises2.readFile)(vkPath, "utf8");
434
+ const rawJson = await (0, import_promises4.readFile)(vkPath, "utf8");
321
435
  const rustSource = generateVkRust(vkPath, rawJson);
322
- await (0, import_promises2.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");
323
437
  }
324
438
  async function buildCircuit(options) {
325
- const circom = await ensureCircom();
326
- const snarkjs = await ensureSnarkjs();
327
- const circuitDir = import_node_path2.default.resolve(options.circuitPath);
328
- const outDir = import_node_path2.default.resolve(options.artifactsDir);
329
- const circuitFile = import_node_path2.default.join(circuitDir, "main.circom");
330
- const r1csPath = import_node_path2.default.join(outDir, "main.r1cs");
331
- const zkey0 = import_node_path2.default.join(outDir, "circuit_0000.zkey");
332
- const zkeyFinal = import_node_path2.default.join(outDir, "circuit_final.zkey");
333
- const vkPath = import_node_path2.default.join(outDir, "verification_key.json");
334
- await (0, import_promises2.mkdir)(outDir, { recursive: true });
439
+ const progress = options.progress;
440
+ const circom = await ensureCircom(progress);
441
+ const snarkjs = await ensureSnarkjs(progress);
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 });
450
+ progress?.onStatus?.(`Compiling ${circuitFile}...`);
335
451
  await (0, import_core2.runCommand)(circom, [
336
452
  circuitFile,
337
453
  "--r1cs",
@@ -346,8 +462,9 @@ async function buildCircuit(options) {
346
462
  const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\s+(\d+)/);
347
463
  const constraints = constraintMatch ? Number.parseInt(constraintMatch[1], 10) : 1;
348
464
  const ptauSize = ptauSizeForConstraints(constraints);
349
- const ptauPath = await ensurePtau(ptauSize);
465
+ const ptauPath = await ensurePtau(ptauSize, progress);
350
466
  const entropy = (0, import_node_crypto2.createHash)("sha256").update((0, import_node_crypto2.randomBytes)(32)).digest("hex");
467
+ progress?.onStatus?.("Running Groth16 trusted setup...");
351
468
  await (0, import_core2.runCommand)(snarkjs, ["groth16", "setup", r1csPath, ptauPath, zkey0]);
352
469
  await (0, import_core2.runCommand)(snarkjs, ["zkey", "contribute", zkey0, zkeyFinal, "-v"], {
353
470
  input: `caatinga-dev
@@ -356,29 +473,30 @@ ${entropy}
356
473
  });
357
474
  await (0, import_core2.runCommand)(snarkjs, ["zkey", "export", "verificationkey", zkeyFinal, vkPath]);
358
475
  if (options.embedVk) {
359
- const verifierSrcDir = import_node_path2.default.resolve("contracts", "verifier", "src");
476
+ const verifierSrcDir = import_node_path3.default.resolve("contracts", "verifier", "src");
360
477
  await writeEmbeddedVk(vkPath, verifierSrcDir);
361
478
  }
479
+ await writeDevCeremonyManifest(outDir);
362
480
  }
363
481
 
364
482
  // src/prove/prove-circuit.ts
365
483
  var import_core3 = require("@caatinga/core");
366
- var import_node_path3 = __toESM(require("path"), 1);
367
- var import_promises3 = require("fs/promises");
484
+ var import_node_path4 = __toESM(require("path"), 1);
485
+ var import_promises5 = require("fs/promises");
368
486
  function resolveCircuitWasmPath(artifactsDir) {
369
- return import_node_path3.default.join(artifactsDir, "main_js", "main.wasm");
487
+ return import_node_path4.default.join(artifactsDir, "main_js", "main.wasm");
370
488
  }
371
489
  async function proveCircuit(options) {
372
- const snarkjs = await ensureSnarkjs();
373
- const artifactsDir = import_node_path3.default.resolve(options.artifactsDir);
490
+ const snarkjs = await ensureSnarkjs(options.progress);
491
+ const artifactsDir = import_node_path4.default.resolve(options.artifactsDir);
374
492
  const wasmPath = resolveCircuitWasmPath(artifactsDir);
375
- const zkeyPath = import_node_path3.default.join(artifactsDir, "circuit_final.zkey");
376
- const inputPath = import_node_path3.default.resolve(options.inputPath);
377
- const proofPath = import_node_path3.default.join(artifactsDir, "proof.json");
378
- const publicPath = import_node_path3.default.join(artifactsDir, "public.json");
379
- await (0, import_promises3.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 });
380
498
  if (options.debug) {
381
- const witnessPath = import_node_path3.default.join(artifactsDir, "witness.wtns");
499
+ const witnessPath = import_node_path4.default.join(artifactsDir, "witness.wtns");
382
500
  await (0, import_core3.runCommand)(snarkjs, ["wtns", "calculate", wasmPath, inputPath, witnessPath, "-v"]);
383
501
  await (0, import_core3.runCommand)(snarkjs, ["groth16", "prove", zkeyPath, witnessPath, proofPath, publicPath]);
384
502
  return;
@@ -392,14 +510,14 @@ async function proveCircuit(options) {
392
510
  proofPath,
393
511
  publicPath
394
512
  ]);
395
- await (0, import_promises3.access)(proofPath);
396
- await (0, import_promises3.access)(publicPath);
513
+ await (0, import_promises5.access)(proofPath);
514
+ await (0, import_promises5.access)(publicPath);
397
515
  }
398
516
 
399
517
  // src/invoke/invoke-verifier.ts
400
518
  var import_core4 = require("@caatinga/core");
401
- var import_promises4 = require("fs/promises");
402
- var import_node_path4 = __toESM(require("path"), 1);
519
+ var import_promises6 = require("fs/promises");
520
+ var import_node_path5 = __toESM(require("path"), 1);
403
521
  function buildStellarVerifyProofArgs(options) {
404
522
  const serializedProof = serializeProof(options.proof);
405
523
  const args = [];
@@ -434,12 +552,12 @@ async function invokeVerifier(options) {
434
552
  const cwd = options.cwd ?? process.cwd();
435
553
  const config = options.config ?? await (0, import_core4.loadConfig)({ cwd });
436
554
  const proof = JSON.parse(
437
- await (0, import_promises4.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")
438
556
  );
439
557
  const publicSignals = JSON.parse(
440
- await (0, import_promises4.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")
441
559
  );
442
- const vk = options.embedVk ? void 0 : JSON.parse(await (0, import_promises4.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"));
443
561
  const args = buildStellarVerifyProofArgs({
444
562
  proof,
445
563
  vk,
@@ -481,13 +599,18 @@ async function invokeVerifier(options) {
481
599
  // Annotate the CommonJS export names for ESM import in node:
482
600
  0 && (module.exports = {
483
601
  ZkError,
602
+ assertDevCeremonyAllowed,
484
603
  buildCircuit,
485
604
  buildStellarVerifyProofArgs,
486
605
  invokeVerifier,
606
+ isProductionNetwork,
487
607
  proveCircuit,
488
608
  ptauSizeForConstraints,
609
+ readDevCeremonyManifest,
489
610
  serializeProof,
490
611
  serializePublicSignals,
491
- serializeVk
612
+ serializeVk,
613
+ writeDevCeremonyManifest,
614
+ zkArtifactsDir
492
615
  });
493
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/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 { 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 { 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};\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 circom = await ensureCircom();\n const snarkjs = await ensureSnarkjs();\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 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);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\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\";\n\nconst ZK_CACHE_DIR = path.join(os.homedir(), \".caatinga\", \"zk-tools\");\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\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(): Promise<string> {\n const cached = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION, \"circom\");\n try {\n await access(cached);\n return cached;\n } catch {\n // Fall through to download.\n }\n\n const asset = circomAssetName();\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n const installDir = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION);\n await mkdir(installDir, { recursive: true });\n\n const archivePath = path.join(installDir, asset);\n await runCommand(\"curl\", [\"-fsSL\", url, \"-o\", archivePath]);\n await chmod(archivePath, 0o755);\n\n return archivePath;\n}\n\nexport async function ensureSnarkjs(): Promise<string> {\n const installDir = path.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n return cliPath;\n } catch {\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 return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number): Promise<string> {\n const ptauDir = path.join(ZK_CACHE_DIR, \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n const snarkjs = await ensureSnarkjs();\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\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","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\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\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();\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","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
@@ -2,11 +2,18 @@ import { b as SnarkjsProof, c as SnarkjsVk } from './serialize-public-signals-Cu
2
2
  export { d as SerializedProof, e as SerializedVk, s as serializeProof, f as serializePublicSignals, g as serializeVk } from './serialize-public-signals-Cu4-2Uv0.cjs';
3
3
  import { CaatingaConfig } from '@caatinga/core';
4
4
 
5
+ type ZkInstallProgress = {
6
+ onStatus?: (message: string) => void;
7
+ onDownloadProgress?: (loaded: number, total?: number) => void;
8
+ onDownloadComplete?: () => void;
9
+ };
10
+
5
11
  type BuildCircuitOptions = {
6
12
  circuitName: string;
7
13
  circuitPath: string;
8
14
  artifactsDir: string;
9
15
  embedVk: boolean;
16
+ progress?: ZkInstallProgress;
10
17
  };
11
18
  declare function buildCircuit(options: BuildCircuitOptions): Promise<void>;
12
19
 
@@ -16,6 +23,7 @@ type ProveCircuitOptions = {
16
23
  artifactsDir: string;
17
24
  inputPath: string;
18
25
  debug: boolean;
26
+ progress?: ZkInstallProgress;
19
27
  };
20
28
  declare function proveCircuit(options: ProveCircuitOptions): Promise<void>;
21
29
 
@@ -47,10 +55,27 @@ declare function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeV
47
55
 
48
56
  declare function ptauSizeForConstraints(constraintCount: number): number;
49
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
+
50
75
  declare class ZkError extends Error {
51
76
  readonly code: string;
52
77
  readonly hint?: string | undefined;
53
78
  constructor(message: string, code: string, hint?: string | undefined);
54
79
  }
55
80
 
56
- export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, 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
@@ -2,11 +2,18 @@ import { b as SnarkjsProof, c as SnarkjsVk } from './serialize-public-signals-Cu
2
2
  export { d as SerializedProof, e as SerializedVk, s as serializeProof, f as serializePublicSignals, g as serializeVk } from './serialize-public-signals-Cu4-2Uv0.js';
3
3
  import { CaatingaConfig } from '@caatinga/core';
4
4
 
5
+ type ZkInstallProgress = {
6
+ onStatus?: (message: string) => void;
7
+ onDownloadProgress?: (loaded: number, total?: number) => void;
8
+ onDownloadComplete?: () => void;
9
+ };
10
+
5
11
  type BuildCircuitOptions = {
6
12
  circuitName: string;
7
13
  circuitPath: string;
8
14
  artifactsDir: string;
9
15
  embedVk: boolean;
16
+ progress?: ZkInstallProgress;
10
17
  };
11
18
  declare function buildCircuit(options: BuildCircuitOptions): Promise<void>;
12
19
 
@@ -16,6 +23,7 @@ type ProveCircuitOptions = {
16
23
  artifactsDir: string;
17
24
  inputPath: string;
18
25
  debug: boolean;
26
+ progress?: ZkInstallProgress;
19
27
  };
20
28
  declare function proveCircuit(options: ProveCircuitOptions): Promise<void>;
21
29
 
@@ -47,10 +55,27 @@ declare function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeV
47
55
 
48
56
  declare function ptauSizeForConstraints(constraintCount: number): number;
49
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
+
50
75
  declare class ZkError extends Error {
51
76
  readonly code: string;
52
77
  readonly hint?: string | undefined;
53
78
  constructor(message: string, code: string, hint?: string | undefined);
54
79
  }
55
80
 
56
- export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, 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
@@ -21,9 +21,54 @@ import { access, chmod, mkdir, writeFile } from "fs/promises";
21
21
  import path from "path";
22
22
  import os from "os";
23
23
  import { createHash, randomBytes } from "crypto";
24
- var ZK_CACHE_DIR = path.join(os.homedir(), ".caatinga", "zk-tools");
24
+
25
+ // src/install/download-with-progress.ts
26
+ import { createWriteStream } from "fs";
27
+ import { pipeline } from "stream/promises";
28
+ import { Readable } from "stream";
29
+ async function downloadWithProgress(url, destinationPath, progress) {
30
+ const response = await fetch(url);
31
+ if (!response.ok) {
32
+ throw new ZkError(
33
+ `Failed to download ${url}: HTTP ${response.status}`,
34
+ "ZK_DOWNLOAD_FAILED",
35
+ "Check your network connection and try again."
36
+ );
37
+ }
38
+ if (!response.body) {
39
+ throw new ZkError(
40
+ `Failed to download ${url}: empty response body`,
41
+ "ZK_DOWNLOAD_FAILED",
42
+ "Check your network connection and try again."
43
+ );
44
+ }
45
+ const contentLength = response.headers.get("content-length");
46
+ const total = contentLength ? Number.parseInt(contentLength, 10) : void 0;
47
+ let loaded = 0;
48
+ const reader = response.body.getReader();
49
+ const nodeStream = Readable.from(
50
+ (async function* () {
51
+ while (true) {
52
+ const { done, value } = await reader.read();
53
+ if (done) {
54
+ break;
55
+ }
56
+ loaded += value.byteLength;
57
+ progress?.onDownloadProgress?.(loaded, total);
58
+ yield Buffer.from(value);
59
+ }
60
+ })()
61
+ );
62
+ await pipeline(nodeStream, createWriteStream(destinationPath));
63
+ progress?.onDownloadComplete?.();
64
+ }
65
+
66
+ // src/install/lazy-install-zk-tools.ts
25
67
  var SNARKJS_VERSION = "0.7.5";
26
68
  var CIRCOM_VERSION = "2.1.9";
69
+ function zkCacheDir() {
70
+ return path.join(process.env.HOME ?? os.homedir(), ".caatinga", "zk-tools");
71
+ }
27
72
  function circomAssetName() {
28
73
  const platform = process.platform;
29
74
  const arch = process.arch === "x64" ? "amd64" : process.arch;
@@ -39,29 +84,35 @@ function circomAssetName() {
39
84
  "Install circom 2.x manually and ensure it is on PATH."
40
85
  );
41
86
  }
42
- async function ensureCircom() {
43
- const cached = path.join(ZK_CACHE_DIR, "circom", CIRCOM_VERSION, "circom");
87
+ async function ensureCircom(progress) {
88
+ const asset = circomAssetName();
89
+ const installDir = path.join(zkCacheDir(), "circom", CIRCOM_VERSION);
90
+ const binaryPath = path.join(installDir, asset);
44
91
  try {
45
- await access(cached);
46
- return cached;
92
+ await access(binaryPath);
93
+ progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);
94
+ return binaryPath;
47
95
  } catch {
48
96
  }
49
- const asset = circomAssetName();
50
97
  const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;
51
- const installDir = path.join(ZK_CACHE_DIR, "circom", CIRCOM_VERSION);
52
98
  await mkdir(installDir, { recursive: true });
53
- const archivePath = path.join(installDir, asset);
54
- await runCommand("curl", ["-fsSL", url, "-o", archivePath]);
55
- await chmod(archivePath, 493);
56
- return archivePath;
99
+ progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);
100
+ await downloadWithProgress(url, binaryPath, progress);
101
+ await chmod(binaryPath, 493);
102
+ progress?.onStatus?.(`circom installed \u2192 ${binaryPath}`);
103
+ return binaryPath;
57
104
  }
58
- async function ensureSnarkjs() {
59
- const installDir = path.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);
105
+ async function ensureSnarkjs(progress) {
106
+ const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);
60
107
  const cliPath = path.join(installDir, "node_modules", ".bin", "snarkjs");
61
108
  try {
62
109
  await access(cliPath);
110
+ progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);
63
111
  return cliPath;
64
112
  } catch {
113
+ progress?.onStatus?.(
114
+ `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`
115
+ );
65
116
  await mkdir(installDir, { recursive: true });
66
117
  await writeFile(
67
118
  path.join(installDir, "package.json"),
@@ -75,19 +126,22 @@ async function ensureSnarkjs() {
75
126
  cwd: installDir
76
127
  }
77
128
  );
129
+ progress?.onStatus?.(`snarkjs installed \u2192 ${cliPath}`);
78
130
  return cliPath;
79
131
  }
80
132
  }
81
- async function ensurePtau(size) {
82
- const ptauDir = path.join(ZK_CACHE_DIR, "ptau", "bls12-381");
133
+ async function ensurePtau(size, progress) {
134
+ const ptauDir = path.join(zkCacheDir(), "ptau", "bls12-381");
83
135
  const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);
84
136
  try {
85
137
  await access(finalPath);
138
+ progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);
86
139
  return finalPath;
87
140
  } catch {
88
141
  await mkdir(ptauDir, { recursive: true });
89
142
  }
90
- const snarkjs = await ensureSnarkjs();
143
+ progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);
144
+ const snarkjs = await ensureSnarkjs(progress);
91
145
  const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);
92
146
  const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);
93
147
  const entropy = createHash("sha256").update(randomBytes(32)).digest("hex");
@@ -98,6 +152,7 @@ ${entropy}
98
152
  `
99
153
  });
100
154
  await runCommand(snarkjs, ["powersoftau", "prepare", "phase2", pot1, finalPath, "-v"]);
155
+ progress?.onStatus?.(`powers-of-tau ready \u2192 ${finalPath}`);
101
156
  return finalPath;
102
157
  }
103
158
 
@@ -107,6 +162,62 @@ function ptauSizeForConstraints(constraintCount) {
107
162
  return Math.min(Math.max(needed, 8), 28);
108
163
  }
109
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
+
110
221
  // src/build/build-circuit.ts
111
222
  var BYTES_PER_LINE = 16;
112
223
  function formatRustByteArray(bytes) {
@@ -163,21 +274,23 @@ ${formatRustByteArray(ic)}
163
274
  ].join("\n");
164
275
  }
165
276
  async function writeEmbeddedVk(vkPath, verifierSrcDir) {
166
- const rawJson = await readFile(vkPath, "utf8");
277
+ const rawJson = await readFile2(vkPath, "utf8");
167
278
  const rustSource = generateVkRust(vkPath, rawJson);
168
- await writeFile2(path2.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
279
+ await writeFile3(path3.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
169
280
  }
170
281
  async function buildCircuit(options) {
171
- const circom = await ensureCircom();
172
- const snarkjs = await ensureSnarkjs();
173
- const circuitDir = path2.resolve(options.circuitPath);
174
- const outDir = path2.resolve(options.artifactsDir);
175
- const circuitFile = path2.join(circuitDir, "main.circom");
176
- const r1csPath = path2.join(outDir, "main.r1cs");
177
- const zkey0 = path2.join(outDir, "circuit_0000.zkey");
178
- const zkeyFinal = path2.join(outDir, "circuit_final.zkey");
179
- const vkPath = path2.join(outDir, "verification_key.json");
282
+ const progress = options.progress;
283
+ const circom = await ensureCircom(progress);
284
+ const snarkjs = await ensureSnarkjs(progress);
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");
180
292
  await mkdir2(outDir, { recursive: true });
293
+ progress?.onStatus?.(`Compiling ${circuitFile}...`);
181
294
  await runCommand2(circom, [
182
295
  circuitFile,
183
296
  "--r1cs",
@@ -192,8 +305,9 @@ async function buildCircuit(options) {
192
305
  const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\s+(\d+)/);
193
306
  const constraints = constraintMatch ? Number.parseInt(constraintMatch[1], 10) : 1;
194
307
  const ptauSize = ptauSizeForConstraints(constraints);
195
- const ptauPath = await ensurePtau(ptauSize);
308
+ const ptauPath = await ensurePtau(ptauSize, progress);
196
309
  const entropy = createHash2("sha256").update(randomBytes2(32)).digest("hex");
310
+ progress?.onStatus?.("Running Groth16 trusted setup...");
197
311
  await runCommand2(snarkjs, ["groth16", "setup", r1csPath, ptauPath, zkey0]);
198
312
  await runCommand2(snarkjs, ["zkey", "contribute", zkey0, zkeyFinal, "-v"], {
199
313
  input: `caatinga-dev
@@ -202,29 +316,30 @@ ${entropy}
202
316
  });
203
317
  await runCommand2(snarkjs, ["zkey", "export", "verificationkey", zkeyFinal, vkPath]);
204
318
  if (options.embedVk) {
205
- const verifierSrcDir = path2.resolve("contracts", "verifier", "src");
319
+ const verifierSrcDir = path3.resolve("contracts", "verifier", "src");
206
320
  await writeEmbeddedVk(vkPath, verifierSrcDir);
207
321
  }
322
+ await writeDevCeremonyManifest(outDir);
208
323
  }
209
324
 
210
325
  // src/prove/prove-circuit.ts
211
326
  import { runCommand as runCommand3 } from "@caatinga/core";
212
- import path3 from "path";
327
+ import path4 from "path";
213
328
  import { access as access2, mkdir as mkdir3 } from "fs/promises";
214
329
  function resolveCircuitWasmPath(artifactsDir) {
215
- return path3.join(artifactsDir, "main_js", "main.wasm");
330
+ return path4.join(artifactsDir, "main_js", "main.wasm");
216
331
  }
217
332
  async function proveCircuit(options) {
218
- const snarkjs = await ensureSnarkjs();
219
- const artifactsDir = path3.resolve(options.artifactsDir);
333
+ const snarkjs = await ensureSnarkjs(options.progress);
334
+ const artifactsDir = path4.resolve(options.artifactsDir);
220
335
  const wasmPath = resolveCircuitWasmPath(artifactsDir);
221
- const zkeyPath = path3.join(artifactsDir, "circuit_final.zkey");
222
- const inputPath = path3.resolve(options.inputPath);
223
- const proofPath = path3.join(artifactsDir, "proof.json");
224
- 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");
225
340
  await mkdir3(artifactsDir, { recursive: true });
226
341
  if (options.debug) {
227
- const witnessPath = path3.join(artifactsDir, "witness.wtns");
342
+ const witnessPath = path4.join(artifactsDir, "witness.wtns");
228
343
  await runCommand3(snarkjs, ["wtns", "calculate", wasmPath, inputPath, witnessPath, "-v"]);
229
344
  await runCommand3(snarkjs, ["groth16", "prove", zkeyPath, witnessPath, proofPath, publicPath]);
230
345
  return;
@@ -244,8 +359,8 @@ async function proveCircuit(options) {
244
359
 
245
360
  // src/invoke/invoke-verifier.ts
246
361
  import { invokeContract, loadConfig, readArtifacts } from "@caatinga/core";
247
- import { readFile as readFile2 } from "fs/promises";
248
- import path4 from "path";
362
+ import { readFile as readFile3 } from "fs/promises";
363
+ import path5 from "path";
249
364
  function buildStellarVerifyProofArgs(options) {
250
365
  const serializedProof = serializeProof(options.proof);
251
366
  const args = [];
@@ -280,12 +395,12 @@ async function invokeVerifier(options) {
280
395
  const cwd = options.cwd ?? process.cwd();
281
396
  const config = options.config ?? await loadConfig({ cwd });
282
397
  const proof = JSON.parse(
283
- await readFile2(path4.resolve(cwd, options.proofPath), "utf8")
398
+ await readFile3(path5.resolve(cwd, options.proofPath), "utf8")
284
399
  );
285
400
  const publicSignals = JSON.parse(
286
- await readFile2(path4.resolve(cwd, options.publicSignalsPath), "utf8")
401
+ await readFile3(path5.resolve(cwd, options.publicSignalsPath), "utf8")
287
402
  );
288
- 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"));
289
404
  const args = buildStellarVerifyProofArgs({
290
405
  proof,
291
406
  vk,
@@ -326,13 +441,18 @@ async function invokeVerifier(options) {
326
441
  }
327
442
  export {
328
443
  ZkError,
444
+ assertDevCeremonyAllowed,
329
445
  buildCircuit,
330
446
  buildStellarVerifyProofArgs,
331
447
  invokeVerifier,
448
+ isProductionNetwork,
332
449
  proveCircuit,
333
450
  ptauSizeForConstraints,
451
+ readDevCeremonyManifest,
334
452
  serializeProof,
335
453
  serializePublicSignals,
336
- serializeVk
454
+ serializeVk,
455
+ writeDevCeremonyManifest,
456
+ zkArtifactsDir
337
457
  };
338
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/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 { 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};\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 circom = await ensureCircom();\n const snarkjs = await ensureSnarkjs();\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 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);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\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\";\n\nconst ZK_CACHE_DIR = path.join(os.homedir(), \".caatinga\", \"zk-tools\");\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\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(): Promise<string> {\n const cached = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION, \"circom\");\n try {\n await access(cached);\n return cached;\n } catch {\n // Fall through to download.\n }\n\n const asset = circomAssetName();\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n const installDir = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION);\n await mkdir(installDir, { recursive: true });\n\n const archivePath = path.join(installDir, asset);\n await runCommand(\"curl\", [\"-fsSL\", url, \"-o\", archivePath]);\n await chmod(archivePath, 0o755);\n\n return archivePath;\n}\n\nexport async function ensureSnarkjs(): Promise<string> {\n const installDir = path.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n return cliPath;\n } catch {\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 return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number): Promise<string> {\n const ptauDir = path.join(ZK_CACHE_DIR, \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n const snarkjs = await ensureSnarkjs();\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\n return finalPath;\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\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\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();\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","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.1",
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.1"
30
+ "@caatinga/core": "^3.2.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "tsup": "^8.3.5",