@caatinga/zk 3.1.1 → 3.1.2

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
@@ -124,12 +124,12 @@ function serializePublicSignals(signals) {
124
124
  // src/build/build-circuit.ts
125
125
  var import_core2 = require("@caatinga/core");
126
126
  var import_node_path2 = __toESM(require("path"), 1);
127
- var import_promises2 = require("fs/promises");
127
+ var import_promises3 = require("fs/promises");
128
128
  var import_node_crypto2 = require("crypto");
129
129
 
130
130
  // src/install/lazy-install-zk-tools.ts
131
131
  var import_core = require("@caatinga/core");
132
- var import_promises = require("fs/promises");
132
+ var import_promises2 = require("fs/promises");
133
133
  var import_node_path = __toESM(require("path"), 1);
134
134
  var import_node_os = __toESM(require("os"), 1);
135
135
  var import_node_crypto = require("crypto");
@@ -146,10 +146,53 @@ var ZkError = class extends Error {
146
146
  hint;
147
147
  };
148
148
 
149
+ // src/install/download-with-progress.ts
150
+ var import_node_fs = require("fs");
151
+ var import_promises = require("stream/promises");
152
+ var import_node_stream = require("stream");
153
+ async function downloadWithProgress(url, destinationPath, progress) {
154
+ const response = await fetch(url);
155
+ if (!response.ok) {
156
+ throw new ZkError(
157
+ `Failed to download ${url}: HTTP ${response.status}`,
158
+ "ZK_DOWNLOAD_FAILED",
159
+ "Check your network connection and try again."
160
+ );
161
+ }
162
+ if (!response.body) {
163
+ throw new ZkError(
164
+ `Failed to download ${url}: empty response body`,
165
+ "ZK_DOWNLOAD_FAILED",
166
+ "Check your network connection and try again."
167
+ );
168
+ }
169
+ const contentLength = response.headers.get("content-length");
170
+ const total = contentLength ? Number.parseInt(contentLength, 10) : void 0;
171
+ let loaded = 0;
172
+ const reader = response.body.getReader();
173
+ const nodeStream = import_node_stream.Readable.from(
174
+ (async function* () {
175
+ while (true) {
176
+ const { done, value } = await reader.read();
177
+ if (done) {
178
+ break;
179
+ }
180
+ loaded += value.byteLength;
181
+ progress?.onDownloadProgress?.(loaded, total);
182
+ yield Buffer.from(value);
183
+ }
184
+ })()
185
+ );
186
+ await (0, import_promises.pipeline)(nodeStream, (0, import_node_fs.createWriteStream)(destinationPath));
187
+ progress?.onDownloadComplete?.();
188
+ }
189
+
149
190
  // 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
191
  var SNARKJS_VERSION = "0.7.5";
152
192
  var CIRCOM_VERSION = "2.1.9";
193
+ function zkCacheDir() {
194
+ return import_node_path.default.join(process.env.HOME ?? import_node_os.default.homedir(), ".caatinga", "zk-tools");
195
+ }
153
196
  function circomAssetName() {
154
197
  const platform = process.platform;
155
198
  const arch = process.arch === "x64" ? "amd64" : process.arch;
@@ -165,31 +208,37 @@ function circomAssetName() {
165
208
  "Install circom 2.x manually and ensure it is on PATH."
166
209
  );
167
210
  }
168
- async function ensureCircom() {
169
- const cached = import_node_path.default.join(ZK_CACHE_DIR, "circom", CIRCOM_VERSION, "circom");
211
+ async function ensureCircom(progress) {
212
+ const asset = circomAssetName();
213
+ const installDir = import_node_path.default.join(zkCacheDir(), "circom", CIRCOM_VERSION);
214
+ const binaryPath = import_node_path.default.join(installDir, asset);
170
215
  try {
171
- await (0, import_promises.access)(cached);
172
- return cached;
216
+ await (0, import_promises2.access)(binaryPath);
217
+ progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);
218
+ return binaryPath;
173
219
  } catch {
174
220
  }
175
- const asset = circomAssetName();
176
221
  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;
222
+ await (0, import_promises2.mkdir)(installDir, { recursive: true });
223
+ progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);
224
+ await downloadWithProgress(url, binaryPath, progress);
225
+ await (0, import_promises2.chmod)(binaryPath, 493);
226
+ progress?.onStatus?.(`circom installed \u2192 ${binaryPath}`);
227
+ return binaryPath;
183
228
  }
184
- async function ensureSnarkjs() {
185
- const installDir = import_node_path.default.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);
229
+ async function ensureSnarkjs(progress) {
230
+ const installDir = import_node_path.default.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);
186
231
  const cliPath = import_node_path.default.join(installDir, "node_modules", ".bin", "snarkjs");
187
232
  try {
188
- await (0, import_promises.access)(cliPath);
233
+ await (0, import_promises2.access)(cliPath);
234
+ progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);
189
235
  return cliPath;
190
236
  } catch {
191
- await (0, import_promises.mkdir)(installDir, { recursive: true });
192
- await (0, import_promises.writeFile)(
237
+ progress?.onStatus?.(
238
+ `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`
239
+ );
240
+ await (0, import_promises2.mkdir)(installDir, { recursive: true });
241
+ await (0, import_promises2.writeFile)(
193
242
  import_node_path.default.join(installDir, "package.json"),
194
243
  JSON.stringify({ name: "caatinga-zk-snarkjs", private: true, version: "0.0.0" }, null, 2),
195
244
  "utf8"
@@ -201,19 +250,22 @@ async function ensureSnarkjs() {
201
250
  cwd: installDir
202
251
  }
203
252
  );
253
+ progress?.onStatus?.(`snarkjs installed \u2192 ${cliPath}`);
204
254
  return cliPath;
205
255
  }
206
256
  }
207
- async function ensurePtau(size) {
208
- const ptauDir = import_node_path.default.join(ZK_CACHE_DIR, "ptau", "bls12-381");
257
+ async function ensurePtau(size, progress) {
258
+ const ptauDir = import_node_path.default.join(zkCacheDir(), "ptau", "bls12-381");
209
259
  const finalPath = import_node_path.default.join(ptauDir, `pot${size}_final.ptau`);
210
260
  try {
211
- await (0, import_promises.access)(finalPath);
261
+ await (0, import_promises2.access)(finalPath);
262
+ progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);
212
263
  return finalPath;
213
264
  } catch {
214
- await (0, import_promises.mkdir)(ptauDir, { recursive: true });
265
+ await (0, import_promises2.mkdir)(ptauDir, { recursive: true });
215
266
  }
216
- const snarkjs = await ensureSnarkjs();
267
+ progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);
268
+ const snarkjs = await ensureSnarkjs(progress);
217
269
  const pot0 = import_node_path.default.join(ptauDir, `pot${size}_0000.ptau`);
218
270
  const pot1 = import_node_path.default.join(ptauDir, `pot${size}_0001.ptau`);
219
271
  const entropy = (0, import_node_crypto.createHash)("sha256").update((0, import_node_crypto.randomBytes)(32)).digest("hex");
@@ -224,6 +276,7 @@ ${entropy}
224
276
  `
225
277
  });
226
278
  await (0, import_core.runCommand)(snarkjs, ["powersoftau", "prepare", "phase2", pot1, finalPath, "-v"]);
279
+ progress?.onStatus?.(`powers-of-tau ready \u2192 ${finalPath}`);
227
280
  return finalPath;
228
281
  }
229
282
 
@@ -317,13 +370,14 @@ ${formatRustByteArray(ic)}
317
370
  ].join("\n");
318
371
  }
319
372
  async function writeEmbeddedVk(vkPath, verifierSrcDir) {
320
- const rawJson = await (0, import_promises2.readFile)(vkPath, "utf8");
373
+ const rawJson = await (0, import_promises3.readFile)(vkPath, "utf8");
321
374
  const rustSource = generateVkRust(vkPath, rawJson);
322
- await (0, import_promises2.writeFile)(import_node_path2.default.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
375
+ await (0, import_promises3.writeFile)(import_node_path2.default.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
323
376
  }
324
377
  async function buildCircuit(options) {
325
- const circom = await ensureCircom();
326
- const snarkjs = await ensureSnarkjs();
378
+ const progress = options.progress;
379
+ const circom = await ensureCircom(progress);
380
+ const snarkjs = await ensureSnarkjs(progress);
327
381
  const circuitDir = import_node_path2.default.resolve(options.circuitPath);
328
382
  const outDir = import_node_path2.default.resolve(options.artifactsDir);
329
383
  const circuitFile = import_node_path2.default.join(circuitDir, "main.circom");
@@ -331,7 +385,8 @@ async function buildCircuit(options) {
331
385
  const zkey0 = import_node_path2.default.join(outDir, "circuit_0000.zkey");
332
386
  const zkeyFinal = import_node_path2.default.join(outDir, "circuit_final.zkey");
333
387
  const vkPath = import_node_path2.default.join(outDir, "verification_key.json");
334
- await (0, import_promises2.mkdir)(outDir, { recursive: true });
388
+ await (0, import_promises3.mkdir)(outDir, { recursive: true });
389
+ progress?.onStatus?.(`Compiling ${circuitFile}...`);
335
390
  await (0, import_core2.runCommand)(circom, [
336
391
  circuitFile,
337
392
  "--r1cs",
@@ -346,8 +401,9 @@ async function buildCircuit(options) {
346
401
  const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\s+(\d+)/);
347
402
  const constraints = constraintMatch ? Number.parseInt(constraintMatch[1], 10) : 1;
348
403
  const ptauSize = ptauSizeForConstraints(constraints);
349
- const ptauPath = await ensurePtau(ptauSize);
404
+ const ptauPath = await ensurePtau(ptauSize, progress);
350
405
  const entropy = (0, import_node_crypto2.createHash)("sha256").update((0, import_node_crypto2.randomBytes)(32)).digest("hex");
406
+ progress?.onStatus?.("Running Groth16 trusted setup...");
351
407
  await (0, import_core2.runCommand)(snarkjs, ["groth16", "setup", r1csPath, ptauPath, zkey0]);
352
408
  await (0, import_core2.runCommand)(snarkjs, ["zkey", "contribute", zkey0, zkeyFinal, "-v"], {
353
409
  input: `caatinga-dev
@@ -364,19 +420,19 @@ ${entropy}
364
420
  // src/prove/prove-circuit.ts
365
421
  var import_core3 = require("@caatinga/core");
366
422
  var import_node_path3 = __toESM(require("path"), 1);
367
- var import_promises3 = require("fs/promises");
423
+ var import_promises4 = require("fs/promises");
368
424
  function resolveCircuitWasmPath(artifactsDir) {
369
425
  return import_node_path3.default.join(artifactsDir, "main_js", "main.wasm");
370
426
  }
371
427
  async function proveCircuit(options) {
372
- const snarkjs = await ensureSnarkjs();
428
+ const snarkjs = await ensureSnarkjs(options.progress);
373
429
  const artifactsDir = import_node_path3.default.resolve(options.artifactsDir);
374
430
  const wasmPath = resolveCircuitWasmPath(artifactsDir);
375
431
  const zkeyPath = import_node_path3.default.join(artifactsDir, "circuit_final.zkey");
376
432
  const inputPath = import_node_path3.default.resolve(options.inputPath);
377
433
  const proofPath = import_node_path3.default.join(artifactsDir, "proof.json");
378
434
  const publicPath = import_node_path3.default.join(artifactsDir, "public.json");
379
- await (0, import_promises3.mkdir)(artifactsDir, { recursive: true });
435
+ await (0, import_promises4.mkdir)(artifactsDir, { recursive: true });
380
436
  if (options.debug) {
381
437
  const witnessPath = import_node_path3.default.join(artifactsDir, "witness.wtns");
382
438
  await (0, import_core3.runCommand)(snarkjs, ["wtns", "calculate", wasmPath, inputPath, witnessPath, "-v"]);
@@ -392,13 +448,13 @@ async function proveCircuit(options) {
392
448
  proofPath,
393
449
  publicPath
394
450
  ]);
395
- await (0, import_promises3.access)(proofPath);
396
- await (0, import_promises3.access)(publicPath);
451
+ await (0, import_promises4.access)(proofPath);
452
+ await (0, import_promises4.access)(publicPath);
397
453
  }
398
454
 
399
455
  // src/invoke/invoke-verifier.ts
400
456
  var import_core4 = require("@caatinga/core");
401
- var import_promises4 = require("fs/promises");
457
+ var import_promises5 = require("fs/promises");
402
458
  var import_node_path4 = __toESM(require("path"), 1);
403
459
  function buildStellarVerifyProofArgs(options) {
404
460
  const serializedProof = serializeProof(options.proof);
@@ -434,12 +490,12 @@ async function invokeVerifier(options) {
434
490
  const cwd = options.cwd ?? process.cwd();
435
491
  const config = options.config ?? await (0, import_core4.loadConfig)({ cwd });
436
492
  const proof = JSON.parse(
437
- await (0, import_promises4.readFile)(import_node_path4.default.resolve(cwd, options.proofPath), "utf8")
493
+ await (0, import_promises5.readFile)(import_node_path4.default.resolve(cwd, options.proofPath), "utf8")
438
494
  );
439
495
  const publicSignals = JSON.parse(
440
- await (0, import_promises4.readFile)(import_node_path4.default.resolve(cwd, options.publicSignalsPath), "utf8")
496
+ await (0, import_promises5.readFile)(import_node_path4.default.resolve(cwd, options.publicSignalsPath), "utf8")
441
497
  );
442
- const vk = options.embedVk ? void 0 : JSON.parse(await (0, import_promises4.readFile)(import_node_path4.default.resolve(cwd, options.vkPath), "utf8"));
498
+ const vk = options.embedVk ? void 0 : JSON.parse(await (0, import_promises5.readFile)(import_node_path4.default.resolve(cwd, options.vkPath), "utf8"));
443
499
  const args = buildStellarVerifyProofArgs({
444
500
  proof,
445
501
  vk,
@@ -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/serialization/curve-bytes.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["export {\n serializeProof,\n type SerializedProof,\n type SnarkjsProof,\n} from \"./serialization/serialize-proof.js\";\nexport { serializeVk, type SerializedVk, type SnarkjsVk } from \"./serialization/serialize-vk.js\";\nexport { serializePublicSignals } from \"./serialization/serialize-public-signals.js\";\nexport { buildCircuit, type BuildCircuitOptions } from \"./build/build-circuit.js\";\nexport { proveCircuit, type ProveCircuitOptions } from \"./prove/prove-circuit.js\";\nexport {\n invokeVerifier,\n buildStellarVerifyProofArgs,\n type InvokeVerifierOptions,\n type InvokeVerifierResult,\n} from \"./invoke/invoke-verifier.js\";\nexport { ptauSizeForConstraints } from \"./build/detect-ptau-size.js\";\nexport type { ZkInstallProgress } from \"./install/install-progress.js\";\nexport { ZkError } from \"./errors/ZkError.js\";\n","/**\n * Convert a decimal string to a little-endian unsigned 32-byte array.\n */\nexport function decimalToLe32(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n\n/**\n * Convert a decimal string to a big-endian unsigned 48-byte array.\n */\nexport function decimalToBe48(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(48);\n for (let i = 47; i >= 0; i--) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\n\nexport type SerializedG1 = {\n x: Uint8Array;\n y: Uint8Array;\n};\n\nexport type SerializedG2 = {\n x: [Uint8Array, Uint8Array];\n y: [Uint8Array, Uint8Array];\n};\n\nexport type SerializedProof = {\n a: SerializedG1;\n b: SerializedG2;\n c: SerializedG1;\n};\n\nexport type SnarkjsProof = {\n pi_a: [string, string, string];\n pi_b: [[string, string], [string, string]];\n pi_c: [string, string, string];\n protocol: string;\n curve: string;\n};\n\nexport function serializeProof(proof: SnarkjsProof): SerializedProof {\n if (proof.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${proof.curve}`);\n }\n\n return {\n a: {\n x: decimalToBe48(proof.pi_a[0]),\n y: decimalToBe48(proof.pi_a[1]),\n },\n b: {\n x: [decimalToBe48(proof.pi_b[0][1]), decimalToBe48(proof.pi_b[0][0])],\n y: [decimalToBe48(proof.pi_b[1][1]), decimalToBe48(proof.pi_b[1][0])],\n },\n c: {\n x: decimalToBe48(proof.pi_c[0]),\n y: decimalToBe48(proof.pi_c[1]),\n },\n };\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\nimport type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport type SerializedVk = {\n alpha: SerializedG1;\n beta: SerializedG2;\n gamma: SerializedG2;\n delta: SerializedG2;\n ic: SerializedG1[];\n};\n\nexport type SnarkjsVk = {\n protocol: string;\n curve: string;\n vk_alpha_1: [string, string, string];\n vk_beta_2: [[string, string], [string, string], ...string[][]];\n vk_gamma_2: [[string, string], [string, string], ...string[][]];\n vk_delta_2: [[string, string], [string, string], ...string[][]];\n vk_ic?: Array<[string, string, string]>;\n IC?: Array<[string, string, string]>;\n};\n\nfunction g2FromSnarkjsExport(\n rows: [[string, string], [string, string], ...string[][]]\n): SerializedG2 {\n return g2FromSnarkjs([rows[0]!, rows[1]!]);\n}\n\nfunction g1FromSnarkjs(p: [string, string, string]): SerializedG1 {\n return {\n x: decimalToBe48(p[0]),\n y: decimalToBe48(p[1]),\n };\n}\n\nfunction g2FromSnarkjs(p: [[string, string], [string, string]]): SerializedG2 {\n return {\n x: [decimalToBe48(p[0][1]), decimalToBe48(p[0][0])],\n y: [decimalToBe48(p[1][1]), decimalToBe48(p[1][0])],\n };\n}\n\nexport function serializeVk(vk: SnarkjsVk): SerializedVk {\n if (vk.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${vk.curve}`);\n }\n\n const ic = vk.vk_ic ?? vk.IC;\n if (!ic) {\n throw new Error(\"Verification key is missing vk_ic/IC entries.\");\n }\n\n return {\n alpha: g1FromSnarkjs(vk.vk_alpha_1),\n beta: g2FromSnarkjsExport(vk.vk_beta_2),\n gamma: g2FromSnarkjsExport(vk.vk_gamma_2),\n delta: g2FromSnarkjsExport(vk.vk_delta_2),\n ic: ic.map(g1FromSnarkjs),\n };\n}\n","import { decimalToLe32 } from \"./bigint-helpers.js\";\n\nexport function serializePublicSignals(signals: string[]): Uint8Array[] {\n return signals.map((s) => decimalToLe32(s));\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n progress?: ZkInstallProgress;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(vkPath: string, verifierSrcDir: string): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n progress?.onStatus?.(`Compiling ${circuitFile}...`);\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\n\n return finalPath;\n}\n","export class ZkError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly hint?: string\n ) {\n super(message);\n this.name = \"ZkError\";\n }\n}\n","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport function concatG1Bytes(point: SerializedG1): Uint8Array {\n const bytes = new Uint8Array(point.x.length + point.y.length);\n bytes.set(point.x, 0);\n bytes.set(point.y, point.x.length);\n return bytes;\n}\n\nexport function concatG2Bytes(point: SerializedG2): Uint8Array {\n const bytes = new Uint8Array(\n point.x[0].length + point.x[1].length + point.y[0].length + point.y[1].length\n );\n let offset = 0;\n for (const chunk of [point.x[0], point.x[1], point.y[0], point.y[1]]) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n}\n\nexport function concatG1Hex(point: SerializedG1): string {\n return bytesToHex(concatG1Bytes(point));\n}\n\nexport function concatG2Hex(point: SerializedG2): string {\n return bytesToHex(concatG2Bytes(point));\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs(options.progress);\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : (JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk);\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":"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","names":["import_core","import_node_path","import_promises","import_node_crypto","import_promises","path","os","path","import_core","import_node_path","import_promises","path","import_core","import_promises","import_node_path","path"]}
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
 
@@ -53,4 +61,4 @@ declare class ZkError extends Error {
53
61
  constructor(message: string, code: string, hint?: string | undefined);
54
62
  }
55
63
 
56
- export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
64
+ export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
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
 
@@ -53,4 +61,4 @@ declare class ZkError extends Error {
53
61
  constructor(message: string, code: string, hint?: string | undefined);
54
62
  }
55
63
 
56
- export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
64
+ export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
package/dist/index.js CHANGED
@@ -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
 
@@ -168,8 +223,9 @@ async function writeEmbeddedVk(vkPath, verifierSrcDir) {
168
223
  await writeFile2(path2.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
169
224
  }
170
225
  async function buildCircuit(options) {
171
- const circom = await ensureCircom();
172
- const snarkjs = await ensureSnarkjs();
226
+ const progress = options.progress;
227
+ const circom = await ensureCircom(progress);
228
+ const snarkjs = await ensureSnarkjs(progress);
173
229
  const circuitDir = path2.resolve(options.circuitPath);
174
230
  const outDir = path2.resolve(options.artifactsDir);
175
231
  const circuitFile = path2.join(circuitDir, "main.circom");
@@ -178,6 +234,7 @@ async function buildCircuit(options) {
178
234
  const zkeyFinal = path2.join(outDir, "circuit_final.zkey");
179
235
  const vkPath = path2.join(outDir, "verification_key.json");
180
236
  await mkdir2(outDir, { recursive: true });
237
+ progress?.onStatus?.(`Compiling ${circuitFile}...`);
181
238
  await runCommand2(circom, [
182
239
  circuitFile,
183
240
  "--r1cs",
@@ -192,8 +249,9 @@ async function buildCircuit(options) {
192
249
  const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\s+(\d+)/);
193
250
  const constraints = constraintMatch ? Number.parseInt(constraintMatch[1], 10) : 1;
194
251
  const ptauSize = ptauSizeForConstraints(constraints);
195
- const ptauPath = await ensurePtau(ptauSize);
252
+ const ptauPath = await ensurePtau(ptauSize, progress);
196
253
  const entropy = createHash2("sha256").update(randomBytes2(32)).digest("hex");
254
+ progress?.onStatus?.("Running Groth16 trusted setup...");
197
255
  await runCommand2(snarkjs, ["groth16", "setup", r1csPath, ptauPath, zkey0]);
198
256
  await runCommand2(snarkjs, ["zkey", "contribute", zkey0, zkeyFinal, "-v"], {
199
257
  input: `caatinga-dev
@@ -215,7 +273,7 @@ function resolveCircuitWasmPath(artifactsDir) {
215
273
  return path3.join(artifactsDir, "main_js", "main.wasm");
216
274
  }
217
275
  async function proveCircuit(options) {
218
- const snarkjs = await ensureSnarkjs();
276
+ const snarkjs = await ensureSnarkjs(options.progress);
219
277
  const artifactsDir = path3.resolve(options.artifactsDir);
220
278
  const wasmPath = resolveCircuitWasmPath(artifactsDir);
221
279
  const zkeyPath = path3.join(artifactsDir, "circuit_final.zkey");
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/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n progress?: ZkInstallProgress;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(vkPath: string, verifierSrcDir: string): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n progress?.onStatus?.(`Compiling ${circuitFile}...`);\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\n\n return finalPath;\n}\n","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs(options.progress);\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : (JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk);\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":"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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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caatinga/zk",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
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.1.2"
31
31
  },
32
32
  "devDependencies": {
33
33
  "tsup": "^8.3.5",