@izi-noir/sdk 0.1.0 → 0.1.1
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 +1003 -77
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -1
- package/dist/index.d.ts +41 -1
- package/dist/index.js +1009 -79
- package/dist/index.js.map +1 -1
- package/dist/providers/arkworks.cjs +982 -36
- package/dist/providers/arkworks.cjs.map +1 -1
- package/dist/providers/arkworks.d.cts +7 -1
- package/dist/providers/arkworks.d.ts +7 -1
- package/dist/providers/arkworks.js +989 -38
- package/dist/providers/arkworks.js.map +1 -1
- package/dist/providers/barretenberg.cjs +982 -36
- package/dist/providers/barretenberg.cjs.map +1 -1
- package/dist/providers/barretenberg.js +989 -38
- package/dist/providers/barretenberg.js.map +1 -1
- package/dist/providers/solana.cjs +2 -20
- package/dist/providers/solana.cjs.map +1 -1
- package/dist/providers/solana.js +2 -20
- package/dist/providers/solana.js.map +1 -1
- package/dist/wasm/nodejs/arkworks_groth16_wasm.js +52 -0
- package/dist/wasm/nodejs/arkworks_groth16_wasm_bg.wasm +0 -0
- package/dist/wasm/web/arkworks_groth16_wasm.js +50 -0
- package/dist/wasm/web/arkworks_groth16_wasm_bg.wasm +0 -0
- package/package.json +6 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/infra/provingSystems/Barretenberg.ts","../src/infra/provingSystems/ArkworksWasm.ts","../src/infra/chainFormatters/SolanaFormatter.ts","../src/domain/types/chain.ts","../src/domain/types/provider.ts","../src/infra/wasm/wasmInit.ts","../src/IziNoir.ts","../src/index.ts","../src/infra/parser/AcornParser.ts","../src/infra/parser/operatorMaps.ts","../src/infra/parser/utils.ts","../src/infra/parser/ExpressionParser.ts","../src/infra/parser/StatementParser.ts","../src/infra/parser/ForLoopParser.ts","../src/container.ts","../src/application/services/NoirGenerator.ts","../src/application/CreateProofUseCase.ts","../src/providers/solana.ts","../src/solana/TransactionBuilder.ts","../src/deployment/VkDeploymentManager.ts","../src/registry/CircuitRegistry.ts","../src/server/OffchainVerifier.ts"],"sourcesContent":["import { compile, createFileManager } from '@noir-lang/noir_wasm';\nimport { Noir } from '@noir-lang/noir_js';\nimport { Barretenberg as BarretenbergBackend, UltraHonkBackend } from '@aztec/bb.js';\nimport type { IProvingSystem } from '../../domain/interfaces/proving/IProvingSystem.js';\nimport type { CompiledCircuit, InputMap, ProofData } from '../../domain/types.js';\n\n/**\n * Helper to create a ReadableStream from a string\n * Used to write files to the virtual filesystem (browser-compatible)\n */\nfunction stringToStream(content: string): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(content));\n controller.close();\n },\n });\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Create temp directory in Node.js, or return '/' for browser virtual fs\n */\nasync function createTempDir(): Promise<{ basePath: string; cleanup: (() => Promise<void>) | null }> {\n if (!isNodeJs()) {\n // Browser: use virtual filesystem\n return { basePath: '/', cleanup: null };\n }\n\n // Node.js: create real temp directory\n // Use dynamic import which works in both Node.js ESM and CJS\n const fs = await import('node:fs/promises');\n const os = await import('node:os');\n const path = await import('node:path');\n\n const basePath = await fs.mkdtemp(path.join(os.tmpdir(), 'noir-circuit-'));\n const cleanup = async () => {\n await fs.rm(basePath, { recursive: true, force: true });\n };\n\n return { basePath, cleanup };\n}\n\n/**\n * Barretenberg proving system using WASM.\n * Browser compatible, produces UltraHonk proofs (~16KB).\n */\nexport class Barretenberg implements IProvingSystem {\n async compile(noirCode: string): Promise<CompiledCircuit> {\n const { basePath, cleanup } = await createTempDir();\n const fm = createFileManager(basePath);\n\n const nargoToml = `[package]\nname = \"circuit\"\ntype = \"bin\"\nauthors = [\"\"]\n\n[dependencies]\n`;\n\n try {\n // Write files using ReadableStream (browser-compatible)\n // In Node.js: writeFile is async and must be awaited\n // In browser: writeFile works with virtual fs, should not await for noir_wasm compatibility\n if (isNodeJs()) {\n await fm.writeFile('./src/main.nr', stringToStream(noirCode));\n await fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n } else {\n fm.writeFile('./src/main.nr', stringToStream(noirCode));\n fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n }\n\n const result = await compile(fm);\n const compiled = (result as any).program as CompiledCircuit;\n\n if (!compiled || !compiled.bytecode) {\n throw new Error('Compilation failed: no bytecode generated');\n }\n\n return compiled;\n } finally {\n if (cleanup) {\n await cleanup();\n }\n }\n }\n\n async generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData> {\n const noir = new Noir(circuit);\n const { witness } = await noir.execute(inputs);\n\n const barretenberg = await BarretenbergBackend.new({ threads: 1 });\n const backend = new UltraHonkBackend(circuit.bytecode, barretenberg);\n\n try {\n const proofData = await backend.generateProof(witness);\n return {\n proof: proofData.proof,\n publicInputs: proofData.publicInputs || [],\n };\n } finally {\n await barretenberg.destroy();\n }\n }\n\n async verifyProof(\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: string[]\n ): Promise<boolean> {\n const barretenberg = await BarretenbergBackend.new({ threads: 1 });\n const backend = new UltraHonkBackend(circuit.bytecode, barretenberg);\n\n try {\n return await backend.verifyProof({ proof, publicInputs });\n } finally {\n await barretenberg.destroy();\n }\n }\n}\n","/**\n * ArkworksWasm proving system.\n *\n * 100% browser-compatible Groth16 prover using arkworks compiled to WASM.\n * Produces proofs compatible with gnark-verifier-solana for on-chain verification.\n *\n * Features:\n * - Runs entirely in the browser (no CLI dependencies)\n * - Generates compact Groth16 proofs (~256 bytes)\n * - Compatible with gnark-verifier-solana\n * - Uses BN254 curve\n */\n\nimport { compile, createFileManager } from '@noir-lang/noir_wasm';\nimport { Noir } from '@noir-lang/noir_js';\nimport type { IProvingSystem } from '../../domain/interfaces/proving/IProvingSystem.js';\nimport type { CompiledCircuit, InputMap, ProofData } from '../../domain/types.js';\n\n/**\n * Helper to create a ReadableStream from a string\n * Used to write files to the virtual filesystem (browser-compatible)\n */\nfunction stringToStream(content: string): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(content));\n controller.close();\n },\n });\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Create temp directory in Node.js, or return '/' for browser virtual fs\n */\nasync function createTempDir(): Promise<{ basePath: string; cleanup: (() => Promise<void>) | null }> {\n if (!isNodeJs()) {\n // Browser: use virtual filesystem\n return { basePath: '/', cleanup: null };\n }\n\n // Node.js: create real temp directory\n // Use dynamic import which works in both Node.js ESM and CJS\n const fs = await import('node:fs/promises');\n const os = await import('node:os');\n const path = await import('node:path');\n\n const basePath = await fs.mkdtemp(path.join(os.tmpdir(), 'arkworks-circuit-'));\n const cleanup = async () => {\n await fs.rm(basePath, { recursive: true, force: true });\n };\n\n return { basePath, cleanup };\n}\n\n/**\n * Result of Groth16 setup from arkworks WASM module\n */\nexport interface ArkworksSetupResult {\n /** Base64-encoded proving key */\n proving_key: string;\n /** Base64-encoded verifying key (arkworks format) */\n verifying_key: string;\n /** Base64-encoded verifying key (gnark format for Solana) */\n verifying_key_gnark: string;\n}\n\n/**\n * Result of Groth16 proof generation from arkworks WASM module\n */\nexport interface ArkworksProofResult {\n /** Base64-encoded proof (arkworks format) */\n proof: string;\n /** Base64-encoded proof (gnark format, 256 bytes) */\n proof_gnark: string;\n /** Public inputs as hex strings */\n public_inputs: string[];\n /** Base64-encoded public inputs (gnark format) */\n public_inputs_gnark: string;\n}\n\n/**\n * Interface for the arkworks-groth16-wasm WASM module\n */\nexport interface ArkworksWasmModule {\n setup(acirJson: string): ArkworksSetupResult;\n prove(provingKeyB64: string, acirJson: string, witnessJson: string): ArkworksProofResult;\n verify(verifyingKeyB64: string, proofB64: string, publicInputsJson: string): boolean;\n verify_gnark(\n verifyingKeyGnarkB64: string,\n proofGnarkB64: string,\n publicInputsGnarkB64: string,\n numPublicInputs: number\n ): boolean;\n acir_to_r1cs_info(acirJson: string): {\n num_witnesses: number;\n num_constraints: number;\n public_inputs: number[];\n private_inputs: number[];\n return_values: number[];\n };\n version(): string;\n}\n\n/**\n * Configuration for ArkworksWasm prover\n */\nexport interface ArkworksWasmConfig {\n /** Keep intermediate artifacts for debugging */\n keepArtifacts?: boolean;\n /** Cache proving/verifying keys for repeated proofs */\n cacheKeys?: boolean;\n}\n\n/**\n * Extended CompiledCircuit for ArkworksWasm backend\n */\nexport interface ArkworksCompiledCircuit extends CompiledCircuit {\n /** Marker to identify ArkworksWasm circuits */\n __arkworks: true;\n /** ACIR program as JSON string (used for setup/prove) */\n acirJson: string;\n /** Cached proving key (base64) if cacheKeys is enabled */\n provingKey?: string;\n /** Cached verifying key (base64) if cacheKeys is enabled */\n verifyingKey?: string;\n /** Cached verifying key in gnark format (base64) */\n verifyingKeyGnark?: string;\n}\n\n/**\n * Type guard to check if a circuit is an ArkworksWasm circuit\n */\nexport function isArkworksCircuit(circuit: CompiledCircuit): circuit is ArkworksCompiledCircuit {\n return '__arkworks' in circuit && (circuit as ArkworksCompiledCircuit).__arkworks === true;\n}\n\n// WASM module singleton\nlet wasmModule: ArkworksWasmModule | null = null;\nlet wasmInitPromise: Promise<ArkworksWasmModule> | null = null;\n\n/**\n * Initialize the arkworks WASM module\n * Automatically detects Node.js vs browser and uses the appropriate WASM target.\n */\nasync function initWasm(): Promise<ArkworksWasmModule> {\n if (wasmModule) {\n return wasmModule;\n }\n\n if (wasmInitPromise) {\n return wasmInitPromise;\n }\n\n wasmInitPromise = (async () => {\n try {\n if (isNodeJs()) {\n // Node.js: use the nodejs target which doesn't require fetch\n // Path resolves to dist/wasm/nodejs/ after bundling\n // @ts-ignore - Dynamic import path resolved at runtime\n const module = await import('../wasm/nodejs/arkworks_groth16_wasm.js');\n wasmModule = module as unknown as ArkworksWasmModule;\n } else {\n // Browser: use the web target with init function\n // Path resolves to dist/wasm/web/ after bundling\n // @ts-ignore - Dynamic import path resolved at runtime\n const module = await import('../wasm/web/arkworks_groth16_wasm.js');\n // Initialize WASM (wasm-pack generates an init function for web target)\n if (typeof module.default === 'function') {\n await module.default();\n }\n wasmModule = module as unknown as ArkworksWasmModule;\n }\n return wasmModule;\n } catch (error) {\n wasmInitPromise = null;\n throw new Error(\n `Failed to initialize arkworks-groth16-wasm: ${error instanceof Error ? error.message : String(error)}\\n` +\n 'Make sure the WASM module is built: cd packages/arkworks-groth16-wasm && npm run build'\n );\n }\n })();\n\n return wasmInitPromise;\n}\n\n/**\n * ArkworksWasm proving system using arkworks Groth16 compiled to WASM.\n *\n * This proving system:\n * - Compiles Noir code using @noir-lang/noir_wasm\n * - Generates witness using @noir-lang/noir_js\n * - Performs Groth16 setup/prove/verify using arkworks-groth16-wasm\n *\n * All operations run in the browser with no external dependencies.\n */\nexport class ArkworksWasm implements IProvingSystem {\n private readonly config: ArkworksWasmConfig;\n\n constructor(config: ArkworksWasmConfig = {}) {\n this.config = {\n keepArtifacts: false,\n cacheKeys: true,\n ...config,\n };\n }\n\n /**\n * Compile Noir code to a circuit with ACIR for Groth16 proving\n */\n async compile(noirCode: string): Promise<CompiledCircuit> {\n const wasm = await initWasm();\n const { basePath, cleanup } = await createTempDir();\n const fm = createFileManager(basePath);\n\n const nargoToml = `[package]\nname = \"circuit\"\ntype = \"bin\"\nauthors = [\"\"]\n\n[dependencies]\n`;\n\n try {\n // Write files using ReadableStream (browser-compatible)\n // In Node.js: writeFile is async and must be awaited\n // In browser: writeFile works with virtual fs, should not await for noir_wasm compatibility\n if (isNodeJs()) {\n await fm.writeFile('./src/main.nr', stringToStream(noirCode));\n await fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n } else {\n fm.writeFile('./src/main.nr', stringToStream(noirCode));\n fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n }\n\n // Compile using noir_wasm\n const result = await compile(fm);\n const compiled = (result as any).program as CompiledCircuit;\n\n if (!compiled || !compiled.bytecode) {\n throw new Error('Compilation failed: no bytecode generated');\n }\n\n // Store the ACIR JSON for setup/prove\n // The bytecode is base64-gzipped ACIR\n const acirJson = JSON.stringify({\n functions: [\n {\n current_witness_index: compiled.abi.parameters.length + 1,\n opcodes: [], // Will be extracted from bytecode during prove\n private_parameters: compiled.abi.parameters\n .filter((p) => p.visibility === 'private')\n .map((_, i) => i + 1),\n public_parameters: {\n witnesses: compiled.abi.parameters\n .filter((p) => p.visibility === 'public')\n .map((_, i) => i + 1),\n },\n return_values: { witnesses: [] },\n },\n ],\n });\n\n // Perform setup if caching is enabled\n let provingKey: string | undefined;\n let verifyingKey: string | undefined;\n let verifyingKeyGnark: string | undefined;\n\n if (this.config.cacheKeys) {\n try {\n // Note: For real ACIR, we need to decode the bytecode first\n // This is a placeholder - actual implementation needs to decode\n // the base64-gzipped bytecode to get the ACIR JSON\n const setupResult = wasm.setup(acirJson);\n provingKey = setupResult.proving_key;\n verifyingKey = setupResult.verifying_key;\n verifyingKeyGnark = setupResult.verifying_key_gnark;\n } catch (error) {\n // Setup might fail if ACIR is complex - we'll do it lazily during prove\n console.warn('Deferred setup: will run during proof generation');\n }\n }\n\n const arkworksCircuit: ArkworksCompiledCircuit = {\n ...compiled,\n __arkworks: true,\n acirJson,\n provingKey,\n verifyingKey,\n verifyingKeyGnark,\n };\n\n return arkworksCircuit;\n } finally {\n if (cleanup) {\n await cleanup();\n }\n }\n }\n\n /**\n * Generate a Groth16 proof\n */\n async generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error(\n 'ArkworksWasm.generateProof requires an ArkworksCompiledCircuit. Use ArkworksWasm.compile() first.'\n );\n }\n\n // Execute the circuit to generate witness using noir_js\n const noir = new Noir(circuit);\n const { witness } = await noir.execute(inputs);\n\n // Convert witness to the format expected by arkworks-groth16-wasm\n // Witness is a Map<number, string> where values are hex field elements\n const witnessMap: Record<string, string> = {};\n for (const [index, value] of witness.entries()) {\n witnessMap[index.toString()] = String(value);\n }\n const witnessJson = JSON.stringify(witnessMap);\n\n // Ensure we have a proving key\n let provingKey = circuit.provingKey;\n if (!provingKey) {\n const setupResult = wasm.setup(circuit.acirJson);\n provingKey = setupResult.proving_key;\n // Cache for future use\n circuit.provingKey = provingKey;\n circuit.verifyingKey = setupResult.verifying_key;\n circuit.verifyingKeyGnark = setupResult.verifying_key_gnark;\n }\n\n // Generate proof\n const proofResult = wasm.prove(provingKey, circuit.acirJson, witnessJson);\n\n // Return proof in gnark format for Solana compatibility\n const proofBytes = base64ToUint8Array(proofResult.proof_gnark);\n\n return {\n proof: proofBytes,\n publicInputs: proofResult.public_inputs,\n };\n }\n\n /**\n * Verify a Groth16 proof\n */\n async verifyProof(\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: string[]\n ): Promise<boolean> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error(\n 'ArkworksWasm.verifyProof requires an ArkworksCompiledCircuit. Use ArkworksWasm.compile() first.'\n );\n }\n\n // Ensure we have a verifying key\n let verifyingKeyGnark = circuit.verifyingKeyGnark;\n if (!verifyingKeyGnark) {\n const setupResult = wasm.setup(circuit.acirJson);\n circuit.provingKey = setupResult.proving_key;\n circuit.verifyingKey = setupResult.verifying_key;\n verifyingKeyGnark = setupResult.verifying_key_gnark;\n circuit.verifyingKeyGnark = verifyingKeyGnark;\n }\n\n // Convert proof to base64\n const proofB64 = uint8ArrayToBase64(proof);\n\n // Convert public inputs to gnark format\n const publicInputsGnarkB64 = publicInputsToGnarkBase64(publicInputs);\n\n // Verify using gnark format\n return wasm.verify_gnark(\n verifyingKeyGnark,\n proofB64,\n publicInputsGnarkB64,\n publicInputs.length\n );\n }\n\n /**\n * Get the verifying key in gnark format for on-chain deployment\n */\n async getVerifyingKeyGnark(circuit: CompiledCircuit): Promise<Uint8Array> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error('getVerifyingKeyGnark requires an ArkworksCompiledCircuit');\n }\n\n if (!circuit.verifyingKeyGnark) {\n const setupResult = wasm.setup(circuit.acirJson);\n circuit.provingKey = setupResult.proving_key;\n circuit.verifyingKey = setupResult.verifying_key;\n circuit.verifyingKeyGnark = setupResult.verifying_key_gnark;\n }\n\n return base64ToUint8Array(circuit.verifyingKeyGnark);\n }\n}\n\n// Utility functions\n\nfunction base64ToUint8Array(b64: string): Uint8Array {\n const binaryString = atob(b64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Convert public inputs (hex strings) to gnark format (32 bytes each, big-endian)\n * Returns base64-encoded result\n */\nfunction publicInputsToGnarkBase64(publicInputs: string[]): string {\n const FIELD_SIZE = 32;\n const bytes = new Uint8Array(publicInputs.length * FIELD_SIZE);\n\n for (let i = 0; i < publicInputs.length; i++) {\n const input = publicInputs[i];\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n const inputBytes = hexToBytes(hex.padStart(64, '0'));\n\n // Copy big-endian bytes\n bytes.set(inputBytes, i * FIELD_SIZE);\n }\n\n return uint8ArrayToBase64(bytes);\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return bytes;\n}\n","import type { IChainFormatter } from '../../domain/interfaces/chain/IChainFormatter';\nimport type { ProofData, SolanaProofData, CompiledCircuit } from '../../domain/types';\nimport type { CircuitMetadata, SolanaChainMetadata } from '../../domain/types/chain';\nimport type { ArkworksWasm } from '../provingSystems/ArkworksWasm';\n\n// Constants for VK account sizing\nconst G1_SIZE = 64;\nconst G2_SIZE = 128;\n\n/**\n * Formatter for Solana-compatible proof data.\n *\n * Converts generic ProofData into SolanaProofData format with:\n * - Verifying key in gnark format (compatible with gnark-verifier-solana)\n * - Proof bytes (256 bytes Groth16)\n * - Public inputs as 32-byte arrays\n * - VK account size and rent estimates\n *\n * @example\n * ```typescript\n * const formatter = new SolanaFormatter(arkworksProvider);\n * const solanaProof = await formatter.formatProof(proofData, circuit, metadata);\n * ```\n */\nexport class SolanaFormatter implements IChainFormatter<'solana'> {\n readonly chainId = 'solana' as const;\n\n constructor(private arkworksProvider: ArkworksWasm) {}\n\n /**\n * Format a generic proof for Solana on-chain verification.\n *\n * @param proofData - Generic proof data from Arkworks\n * @param circuit - The compiled circuit (must be Arkworks circuit)\n * @param metadata - Circuit metadata with public input count\n * @returns SolanaProofData ready for on-chain verification\n */\n async formatProof(\n proofData: ProofData,\n circuit: CompiledCircuit,\n metadata: CircuitMetadata\n ): Promise<SolanaProofData> {\n // Get verifying key in gnark format\n const vkBytes = await this.arkworksProvider.getVerifyingKeyGnark(circuit);\n const vkBase64 = this.uint8ArrayToBase64(vkBytes);\n\n // Number of public inputs\n const nrPublicInputs = metadata.numPublicInputs;\n\n // Convert public inputs to 32-byte arrays\n const publicInputsBytes = proofData.publicInputs.map((input) => {\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n return this.hexToBytes(hex.padStart(64, '0'));\n });\n\n // Calculate account size and rent\n const { accountSize, estimatedRent } = this.getChainMetadata(nrPublicInputs);\n\n return {\n verifyingKey: {\n base64: vkBase64,\n bytes: vkBytes,\n nrPublicInputs,\n },\n proof: {\n base64: this.uint8ArrayToBase64(proofData.proof),\n bytes: proofData.proof,\n },\n publicInputs: {\n hex: proofData.publicInputs,\n bytes: publicInputsBytes,\n },\n accountSize,\n estimatedRent,\n };\n }\n\n /**\n * Get Solana-specific metadata for a circuit.\n *\n * @param publicInputCount - Number of public inputs in the circuit\n * @returns Solana metadata with account size and rent estimates\n */\n getChainMetadata(publicInputCount: number): SolanaChainMetadata {\n const accountSize = this.calculateVkAccountSize(publicInputCount);\n const estimatedRent = this.calculateVkAccountRent(publicInputCount);\n\n return {\n chainId: 'solana',\n accountSize,\n estimatedRent,\n };\n }\n\n /**\n * Calculate the size of a VK account for a given number of public inputs.\n * Matches the Rust `vk_account_size` function in the Solana program.\n */\n private calculateVkAccountSize(nrPublicInputs: number): number {\n // discriminator (8) + authority (32) + nr_pubinputs (1) + alpha_g1 (64) +\n // beta_g2 (128) + gamma_g2 (128) + delta_g2 (128) + vec_len (4) + k elements\n const fixedSize = 8 + 32 + 1 + G1_SIZE + G2_SIZE * 3 + 4;\n return fixedSize + (nrPublicInputs + 1) * G1_SIZE;\n }\n\n /**\n * Calculate the minimum rent for a VK account.\n */\n private calculateVkAccountRent(\n nrPublicInputs: number,\n rentExemptionPerByte: number = 6960 // approximate lamports per byte\n ): number {\n const size = this.calculateVkAccountSize(nrPublicInputs);\n return size * rentExemptionPerByte;\n }\n\n /**\n * Convert Uint8Array to base64 string.\n */\n private uint8ArrayToBase64(bytes: Uint8Array): string {\n // Browser-compatible\n if (typeof btoa === 'function') {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n // Node.js fallback\n return Buffer.from(bytes).toString('base64');\n }\n\n /**\n * Convert hex string to Uint8Array.\n */\n private hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n }\n}\n","/**\n * Chain types for multi-chain proof formatting\n */\n\n/**\n * Supported blockchain targets for proof verification\n */\nexport type ChainId = 'solana' | 'ethereum';\n\n/**\n * Chain enum for IziNoir initialization.\n * Use undefined (don't pass chain) for offchain mode.\n */\nexport enum Chain {\n /** Solana blockchain - uses Groth16 proofs with gnark format VK */\n Solana = 'solana',\n /** Ethereum blockchain - uses Groth16 proofs (future support) */\n Ethereum = 'ethereum',\n}\n\n/**\n * Metadata about the compiled circuit\n */\nexport interface CircuitMetadata {\n /** Number of public inputs in the circuit */\n numPublicInputs: number;\n /** Optional circuit name for identification */\n circuitName?: string;\n}\n\n/**\n * Base interface for chain-specific metadata\n */\nexport interface ChainMetadata {\n chainId: ChainId;\n}\n\n/**\n * Solana-specific metadata for VK account sizing and rent\n */\nexport interface SolanaChainMetadata extends ChainMetadata {\n chainId: 'solana';\n /** Size of the VK account in bytes */\n accountSize: number;\n /** Estimated rent-exempt balance in lamports */\n estimatedRent: number;\n}\n\n/**\n * Ethereum-specific metadata (future)\n */\nexport interface EthereumChainMetadata extends ChainMetadata {\n chainId: 'ethereum';\n /** Estimated gas for verification */\n estimatedGas: bigint;\n}\n\n/**\n * Type helper to get chain-specific metadata\n */\nexport type ChainMetadataFor<T extends ChainId> = T extends 'solana'\n ? SolanaChainMetadata\n : T extends 'ethereum'\n ? EthereumChainMetadata\n : ChainMetadata;\n","import { Chain } from './chain.js';\n\n/**\n * Available proving system providers\n */\nexport enum Provider {\n /** Barretenberg backend - browser compatible, UltraHonk proofs (~16KB) */\n Barretenberg = 'barretenberg',\n /** Arkworks WASM backend - browser compatible, Groth16 proofs (~256 bytes) */\n Arkworks = 'arkworks',\n /** Sunspot CLI backend - Node.js only, Groth16 proofs (~256 bytes) */\n Sunspot = 'sunspot',\n}\n\n/**\n * Configuration for circuit paths (required for Sunspot)\n */\nexport interface CircuitPaths {\n /** Path to the proving key file */\n pkPath: string;\n /** Path to the verification key file */\n vkPath: string;\n /** Path to the compiled circuit JSON file */\n circuitPath: string;\n}\n\n/**\n * Configuration for IziNoir initialization\n */\nexport interface IziNoirConfig {\n /** The proving system provider to use */\n provider: Provider;\n /**\n * Target blockchain for proof formatting.\n * If omitted, operates in offchain mode (raw proofs, no chain formatting).\n */\n chain?: Chain;\n /** Circuit paths - required for Sunspot provider */\n circuitPaths?: CircuitPaths;\n}\n\n// Re-export Chain for convenience\nexport { Chain };\n","let wasmInitPromise: Promise<void> | null = null;\nlet wasmInitialized = false;\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Initialize WASM modules for Noir compilation and execution.\n * Automatically detects Node.js vs browser and uses the appropriate WASM target.\n *\n * Uses lazy loading with singleton pattern - safe to call multiple times.\n * Only initializes once, subsequent calls return immediately.\n */\nexport async function initNoirWasm(): Promise<void> {\n if (wasmInitialized) return;\n\n if (!wasmInitPromise) {\n wasmInitPromise = initWasmInternal();\n }\n\n await wasmInitPromise;\n wasmInitialized = true;\n}\n\nasync function initWasmInternal(): Promise<void> {\n if (isNodeJs()) {\n // Node.js: use the nodejs target which doesn't require fetch\n // The nodejs target auto-initializes when imported\n await import('@noir-lang/acvm_js/nodejs/acvm_js.js');\n await import('@noir-lang/noirc_abi/nodejs/noirc_abi_wasm.js');\n } else {\n // Browser: use the web target with default initialization\n // Note: For Vite/bundlers, external initialization with WASM URLs is preferred\n // Use markWasmInitialized() after initializing externally\n const [{ default: initACVM }, { default: initNoirC }] = await Promise.all([\n import('@noir-lang/acvm_js'),\n import('@noir-lang/noirc_abi'),\n ]);\n await Promise.all([initACVM(), initNoirC()]);\n }\n}\n\n/**\n * Check if WASM modules are already initialized\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Mark WASM as already initialized externally.\n * Use this when WASM has been initialized outside the SDK (e.g., with Vite URL imports).\n *\n * @example\n * ```typescript\n * // In Vite/browser environment\n * import initNoirC from \"@noir-lang/noirc_abi\";\n * import initACVM from \"@noir-lang/acvm_js\";\n * import acvm from \"@noir-lang/acvm_js/web/acvm_js_bg.wasm?url\";\n * import noirc from \"@noir-lang/noirc_abi/web/noirc_abi_wasm_bg.wasm?url\";\n * import { markWasmInitialized } from \"@izi-noir/sdk\";\n *\n * await Promise.all([initACVM(fetch(acvm)), initNoirC(fetch(noirc))]);\n * markWasmInitialized();\n * ```\n */\nexport function markWasmInitialized(): void {\n wasmInitialized = true;\n}\n\n/**\n * Reset WASM initialization state (for testing purposes)\n * @internal\n */\nexport function resetWasmInit(): void {\n wasmInitPromise = null;\n wasmInitialized = false;\n}\n","import {\n Provider,\n Chain,\n type IziNoirConfig,\n type CircuitPaths,\n} from './domain/types/provider.js';\nimport type { IProvingSystem } from './domain/interfaces/proving/IProvingSystem.js';\nimport type {\n CompiledCircuit,\n InputMap,\n ProofData,\n SolanaProofData,\n VerifyingKeyData,\n} from './domain/types.js';\nimport type { IChainFormatter } from './domain/interfaces/chain/IChainFormatter.js';\nimport type { ChainId, CircuitMetadata } from './domain/types/chain.js';\nimport { initNoirWasm } from './infra/wasm/wasmInit.js';\n\n/**\n * Data needed to deploy a verifying key to Solana.\n * Use with SolanaTransactionBuilder or your own transaction logic.\n */\nexport interface SolanaDeployData {\n /** The proof data with VK and public inputs */\n proofData: SolanaProofData;\n /** Program ID to use */\n programId: string;\n /** Compute units for the transaction */\n computeUnits: number;\n}\n\n/**\n * Main class for ZK proof generation with multiple backend providers.\n *\n * @example\n * ```typescript\n * import { IziNoir, Provider, Chain } from '@izi-noir/sdk';\n *\n * // On-chain mode: Initialize with chain for blockchain-specific formatting\n * const izi = await IziNoir.init({\n * provider: Provider.Arkworks,\n * chain: Chain.Solana\n * });\n *\n * await izi.compile(noirCode);\n * const proof = await izi.prove(inputs); // Returns SolanaProofData\n * console.log(izi.vk); // Verifying key available\n *\n * // Offchain mode: No chain specified\n * const iziOffchain = await IziNoir.init({ provider: Provider.Arkworks });\n * const rawProof = await iziOffchain.prove(inputs); // Returns ProofData\n * const verified = await iziOffchain.verify(rawProof.proof, rawProof.publicInputs);\n * ```\n */\nexport class IziNoir {\n private provingSystem: IProvingSystem;\n private compiledCircuit: CompiledCircuit | null = null;\n private chainFormatters: Map<string, IChainFormatter> = new Map();\n private readonly chain?: Chain;\n private _verifyingKey?: VerifyingKeyData;\n private _lastProof?: SolanaProofData | ProofData;\n\n private constructor(provingSystem: IProvingSystem, chain?: Chain) {\n this.provingSystem = provingSystem;\n this.chain = chain;\n }\n\n /**\n * Get the verifying key from the last proof generation.\n * Only available after calling prove() with a chain configured.\n */\n get vk(): VerifyingKeyData | undefined {\n return this._verifyingKey;\n }\n\n /**\n * Get the configured chain, if any.\n */\n get targetChain(): Chain | undefined {\n return this.chain;\n }\n\n /**\n * Check if operating in offchain mode (no chain configured).\n */\n get isOffchain(): boolean {\n return this.chain === undefined;\n }\n\n /**\n * Register a chain formatter for chain-specific proof formatting.\n *\n * @param formatter - The chain formatter to register\n */\n registerChainFormatter<T extends ChainId>(formatter: IChainFormatter<T>): void {\n this.chainFormatters.set(formatter.chainId, formatter);\n }\n\n /**\n * Get a registered chain formatter.\n *\n * @param chainId - The chain ID to get the formatter for\n * @returns The formatter or undefined if not registered\n */\n getChainFormatter<T extends ChainId>(chainId: T): IChainFormatter<T> | undefined {\n return this.chainFormatters.get(chainId) as IChainFormatter<T> | undefined;\n }\n\n /**\n * Initialize IziNoir with the specified provider and optional chain.\n *\n * @param config - Configuration specifying the provider, chain, and optional circuit paths\n * @returns Initialized IziNoir instance\n *\n * @example\n * ```typescript\n * // On-chain mode (Solana)\n * const izi = await IziNoir.init({\n * provider: Provider.Arkworks,\n * chain: Chain.Solana\n * });\n *\n * // Offchain mode (no chain formatting)\n * const iziOffchain = await IziNoir.init({\n * provider: Provider.Arkworks\n * });\n *\n * // Barretenberg (browser-compatible, ~16KB proofs, offchain only)\n * const bb = await IziNoir.init({ provider: Provider.Barretenberg });\n * ```\n */\n static async init(config: IziNoirConfig): Promise<IziNoir> {\n // Initialize WASM (no-op if already initialized)\n await initNoirWasm();\n\n let provingSystem: IProvingSystem;\n\n switch (config.provider) {\n case Provider.Barretenberg: {\n if (config.chain) {\n throw new Error(\n 'Barretenberg provider does not support chain formatting. ' +\n 'Use Provider.Arkworks for on-chain proofs.'\n );\n }\n const { Barretenberg } = await import('./infra/provingSystems/Barretenberg.js');\n provingSystem = new Barretenberg();\n return new IziNoir(provingSystem);\n }\n case Provider.Arkworks: {\n const { ArkworksWasm } = await import('./infra/provingSystems/ArkworksWasm.js');\n const arkworksInstance = new ArkworksWasm();\n provingSystem = arkworksInstance;\n\n const instance = new IziNoir(provingSystem, config.chain);\n\n // Auto-register SolanaFormatter if chain is Solana or for backwards compatibility\n if (config.chain === Chain.Solana || !config.chain) {\n const { SolanaFormatter } = await import('./infra/chainFormatters/SolanaFormatter.js');\n instance.registerChainFormatter(new SolanaFormatter(arkworksInstance));\n }\n\n return instance;\n }\n case Provider.Sunspot: {\n throw new Error(\n 'Sunspot is not available in the main entry point. ' +\n 'Import from \"@izi-noir/sdk/sunspot\" for Sunspot support.'\n );\n }\n default:\n throw new Error(`Unknown provider: ${config.provider}`);\n }\n }\n\n /**\n * Get the underlying proving system instance.\n * Useful for advanced use cases.\n */\n getProvingSystem(): IProvingSystem {\n return this.provingSystem;\n }\n\n /**\n * Get the currently compiled circuit, if any.\n */\n getCompiledCircuit(): CompiledCircuit | null {\n return this.compiledCircuit;\n }\n\n /**\n * Compile Noir code into a circuit.\n *\n * @param noirCode - The Noir source code to compile\n * @returns The compiled circuit\n */\n async compile(noirCode: string): Promise<CompiledCircuit> {\n this.compiledCircuit = await this.provingSystem.compile(noirCode);\n return this.compiledCircuit;\n }\n\n /**\n * Generate a proof for the given inputs.\n *\n * If a chain is configured, returns chain-formatted proof data and stores\n * the verifying key in `this.vk`. Otherwise, returns raw proof data.\n *\n * @param inputs - The inputs (both public and private) for the circuit\n * @param circuit - Optional circuit to use (defaults to last compiled circuit)\n * @returns The proof data - type depends on configured chain\n * @throws Error if no circuit is available\n *\n * @example\n * ```typescript\n * // With chain configured - returns SolanaProofData\n * const izi = await IziNoir.init({ provider: Provider.Arkworks, chain: Chain.Solana });\n * await izi.compile(noirCode);\n * const proof = await izi.prove({ expected: '100', secret: '10' });\n * // proof is SolanaProofData, izi.vk is available\n *\n * // Offchain mode - returns ProofData\n * const iziOffchain = await IziNoir.init({ provider: Provider.Arkworks });\n * await iziOffchain.compile(noirCode);\n * const rawProof = await iziOffchain.prove({ expected: '100', secret: '10' });\n * // rawProof is ProofData, iziOffchain.vk is undefined\n * ```\n */\n async prove(inputs: InputMap, circuit?: CompiledCircuit): Promise<ProofData | SolanaProofData> {\n const circuitToUse = circuit || this.compiledCircuit;\n if (!circuitToUse) {\n throw new Error('No circuit available. Call compile() first or provide a circuit.');\n }\n\n // Generate raw proof\n const rawProof = await this.provingSystem.generateProof(circuitToUse, inputs);\n\n // If no chain configured, return raw proof (offchain mode)\n if (!this.chain) {\n this._lastProof = rawProof;\n return rawProof;\n }\n\n // Get formatter for the configured chain\n const formatter = this.chainFormatters.get(this.chain);\n if (!formatter) {\n throw new Error(\n `No formatter registered for chain: ${this.chain}. ` +\n 'This is an internal error - please report it.'\n );\n }\n\n // Build circuit metadata\n const metadata: CircuitMetadata = {\n numPublicInputs: rawProof.publicInputs.length,\n };\n\n // Format for target chain\n const formattedProof = await formatter.formatProof(rawProof, circuitToUse, metadata);\n const chainProof = formattedProof as unknown as SolanaProofData;\n\n // Store VK on instance\n this._verifyingKey = chainProof.verifyingKey;\n this._lastProof = chainProof;\n\n return chainProof;\n }\n\n /**\n * Verify a proof.\n * Available in both on-chain and offchain modes.\n *\n * @param proof - The proof bytes to verify\n * @param publicInputs - The public inputs that were used\n * @param circuit - Optional circuit to use (defaults to last compiled circuit)\n * @returns true if the proof is valid, false otherwise\n * @throws Error if no circuit is available\n */\n async verify(\n proof: Uint8Array,\n publicInputs: string[],\n circuit?: CompiledCircuit\n ): Promise<boolean> {\n const circuitToUse = circuit || this.compiledCircuit;\n if (!circuitToUse) {\n throw new Error('No circuit available. Call compile() first or provide a circuit.');\n }\n return this.provingSystem.verifyProof(circuitToUse, proof, publicInputs);\n }\n\n /**\n * Convenience method: compile, prove, and verify in one call.\n *\n * @param noirCode - The Noir source code to compile\n * @param inputs - The inputs (both public and private) for the circuit\n * @returns Object containing proof data and verification result\n *\n * @example\n * ```typescript\n * const { proof, verified } = await izi.createProof(noirCode, {\n * x: '100',\n * y: '10',\n * });\n * console.log(`Verified: ${verified}`);\n * ```\n */\n async createProof(\n noirCode: string,\n inputs: InputMap\n ): Promise<{ proof: ProofData | SolanaProofData; verified: boolean }> {\n const circuit = await this.compile(noirCode);\n const proof = await this.prove(inputs, circuit);\n\n // For verification, extract raw proof bytes\n const proofBytes =\n 'proof' in proof && proof.proof instanceof Uint8Array\n ? proof.proof\n : (proof as SolanaProofData).proof.bytes;\n const pubInputs = Array.isArray(proof.publicInputs)\n ? (proof.publicInputs as string[])\n : (proof as SolanaProofData).publicInputs.hex;\n\n const verified = await this.verify(proofBytes, pubInputs, circuit);\n return { proof, verified };\n }\n\n /**\n * Get deployment data for the verifying key.\n * Returns the data needed to deploy to the configured blockchain.\n * Use with SolanaTransactionBuilder to build and send the transaction.\n *\n * @param options - Optional configuration\n * @returns Deployment data that can be used with SolanaTransactionBuilder\n * @throws Error if no chain is configured (offchain mode)\n * @throws Error if prove() hasn't been called yet\n *\n * @example\n * ```typescript\n * const izi = await IziNoir.init({ provider: Provider.Arkworks, chain: Chain.Solana });\n * await izi.compile(noirCode);\n * await izi.prove(inputs);\n *\n * // Get deployment data\n * const deployData = izi.getDeployData();\n *\n * // Use with SolanaTransactionBuilder in your frontend\n * const builder = new SolanaTransactionBuilder({ programId: deployData.programId });\n * const { initVk, rentLamports, accountSize } = builder.buildInitAndVerifyInstructions(\n * deployData.proofData,\n * vkAccountPubkey,\n * authority,\n * payer\n * );\n * ```\n */\n getDeployData(options?: { programId?: string; computeUnits?: number }): SolanaDeployData {\n if (!this.chain) {\n throw new Error('Cannot deploy in offchain mode. Initialize with a chain parameter.');\n }\n\n if (!this._verifyingKey || !this._lastProof) {\n throw new Error('Must call prove() before getDeployData().');\n }\n\n if (this.chain !== Chain.Solana) {\n throw new Error(`Deployment for ${this.chain} is not yet supported.`);\n }\n\n return {\n proofData: this._lastProof as SolanaProofData,\n programId: options?.programId ?? 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS',\n computeUnits: options?.computeUnits ?? 400_000,\n };\n }\n}\n\n// Re-export Provider, Chain and types for convenience\nexport { Provider, Chain, type IziNoirConfig, type CircuitPaths };\nexport type { SolanaProofData, VerifyingKeyData } from './domain/types.js';\nexport type {\n ChainId,\n CircuitMetadata,\n ChainMetadata,\n SolanaChainMetadata,\n EthereumChainMetadata,\n ChainMetadataFor,\n} from './domain/types/chain.js';\nexport type {\n IChainFormatter,\n ChainProofDataFor,\n} from './domain/interfaces/chain/IChainFormatter.js';\n","// =============================================================================\n// Main API - Unified IziNoir class\n// =============================================================================\n\nexport {\n IziNoir,\n Provider,\n Chain,\n type IziNoirConfig,\n type CircuitPaths,\n type SolanaDeployData,\n} from './IziNoir.js';\n\n// Chain formatting types\nexport type {\n ChainId,\n CircuitMetadata,\n ChainMetadata,\n SolanaChainMetadata,\n EthereumChainMetadata,\n ChainMetadataFor,\n} from './IziNoir.js';\nexport type { IChainFormatter, ChainProofDataFor } from './IziNoir.js';\n\n// Chain formatters (for advanced users)\nexport { SolanaFormatter } from './infra/chainFormatters/SolanaFormatter.js';\n\n// =============================================================================\n// WASM Initialization (for advanced users)\n// =============================================================================\n\nexport { initNoirWasm, isWasmInitialized, markWasmInitialized } from './infra/wasm/wasmInit.js';\n\n// =============================================================================\n// Proving Systems (direct use)\n// =============================================================================\n\n// Browser-compatible providers\nexport { Barretenberg } from './infra/provingSystems/Barretenberg.js';\nexport { ArkworksWasm, isArkworksCircuit } from './infra/provingSystems/ArkworksWasm.js';\nexport type {\n ArkworksWasmConfig,\n ArkworksCompiledCircuit,\n ArkworksWasmModule,\n ArkworksSetupResult,\n ArkworksProofResult,\n} from './infra/provingSystems/ArkworksWasm.js';\n\n// Note: Sunspot is Node.js only and NOT exported from the main entry point.\n// Import from '@izi-noir/sdk/sunspot' for Sunspot support.\n\n// =============================================================================\n// Interfaces\n// =============================================================================\n\nexport type {\n IProvingSystem,\n ICompiler,\n IProver,\n IVerifier,\n} from './domain/interfaces/proving/index.js';\nexport type { IParser } from './domain/interfaces/parsing/index.js';\n// Note: IChainFormatter and ChainProofDataFor are exported from IziNoir.js above\n\n// =============================================================================\n// Domain Types\n// =============================================================================\n\nexport type {\n ProofResult,\n ProofTimings,\n ProofData,\n CircuitFunction,\n InputValue,\n CompiledCircuit,\n InputMap,\n ProverOptions,\n VerifierOptions,\n VerifyingKeyData,\n} from './domain/types.js';\n\nexport type {\n ParsedCircuit,\n CircuitParam,\n Expr,\n BinaryExpr,\n IdentifierExpr,\n LiteralExpr,\n MemberExpr,\n BinaryOperator,\n Statement,\n AssertStatement,\n} from './domain/entities/circuit.js';\n\n// =============================================================================\n// Legacy API (backwards compatibility - deprecated)\n// =============================================================================\n\n// Container factories (deprecated - use IziNoir.init() instead)\nexport { createDefaultContainer, createArkworksWasmContainer } from './container.js';\n\n// For DI users\nexport { CreateProofUseCase } from './application/CreateProofUseCase.js';\nexport type { CreateProofDependencies } from './application/CreateProofUseCase.js';\n\n// Parser implementation\nexport { AcornParser } from './infra/parser/AcornParser.js';\n\n// Services\nexport { generateNoir } from './application/services/NoirGenerator.js';\n\n// =============================================================================\n// Solana Utilities\n// =============================================================================\n\nexport { SolanaTransactionBuilder } from './solana/TransactionBuilder.js';\nexport type {\n TransactionBuilderConfig,\n InstructionData,\n InitVkAccounts,\n VerifyProofAccounts,\n CloseVkAccounts,\n InitAndVerifyInstructions,\n} from './solana/TransactionBuilder.js';\n\n// Solana proof data helpers (from providers/solana.ts)\nexport {\n IZI_NOIR_PROGRAM_ID,\n parseVerifyingKey,\n parseProof,\n parsePublicInputs,\n calculateVkAccountSize,\n calculateVkAccountRent,\n buildInitVkFromBytesData,\n buildVerifyProofData,\n} from './providers/solana.js';\nexport type { SolanaProofData } from './domain/types.js';\n\n// VK Deployment Manager\nexport {\n VkDeploymentManager,\n createNodeVkDeploymentManager,\n NETWORK_ENDPOINTS,\n} from './deployment/VkDeploymentManager.js';\nexport type {\n VkDeploymentManagerConfig,\n VkDeployment,\n EnsureDeployedOptions,\n DeploymentResult,\n DeploymentsState,\n SolanaNetwork,\n SignerInfo,\n} from './deployment/VkDeploymentManager.js';\n\n// =============================================================================\n// Circuit Registry\n// =============================================================================\n\nexport {\n CircuitRegistry,\n getGlobalRegistry,\n defineCircuit,\n} from './registry/CircuitRegistry.js';\nexport type {\n CircuitDefinition,\n CircuitInputDef,\n RegisteredCircuit,\n GetCircuitOptions,\n CircuitRegistryExport,\n CircuitExportEntry,\n} from './registry/CircuitRegistry.js';\n\n// =============================================================================\n// Off-Chain Verifier\n// =============================================================================\n\nexport {\n OffchainVerifier,\n createVerifierMiddleware,\n createVerificationEndpoint,\n batchVerify,\n} from './server/OffchainVerifier.js';\nexport type {\n OffchainVerifierConfig,\n OffchainCircuitConfig,\n VerifyRequest,\n VerifyResult,\n VerificationEndpointOptions,\n BatchVerifyResult,\n} from './server/OffchainVerifier.js';\n","import * as acorn from 'acorn';\nimport * as walk from 'acorn-walk';\nimport type { IParser } from '../../domain/interfaces/parsing/IParser.js';\nimport type {\n ParsedCircuit,\n CircuitParam,\n Statement,\n} from '../../domain/entities/circuit.js';\nimport type { CircuitFunction, InputValue } from '../../domain/types.js';\nimport type { AcornNode } from './types.js';\nimport { ExpressionParser } from './ExpressionParser.js';\nimport { StatementParser } from './StatementParser.js';\nimport { ForLoopParser } from './ForLoopParser.js';\n\n/**\n * Parses JavaScript circuit functions into a structured representation.\n *\n * The AcornParser is the main orchestrator that:\n * 1. Parses JS source using Acorn\n * 2. Extracts parameters from ([public], [private]) => {} pattern\n * 3. Delegates statement/expression parsing to specialized parsers\n *\n * Architecture:\n * - ExpressionParser: Handles all expression types\n * - StatementParser: Handles statements (vars, if, assert, assignments)\n * - ForLoopParser: Handles for loop validation and parsing\n */\nexport class AcornParser implements IParser {\n private exprParser = new ExpressionParser();\n private forLoopParser = new ForLoopParser(this.exprParser);\n private stmtParser = new StatementParser(this.exprParser, this.forLoopParser);\n\n /**\n * Parses a circuit function into public/private parameters and statements.\n *\n * @param fn The circuit function with signature ([public], [private]) => { ... }\n * @param _publicInputs Public input values (used for validation, not parsing)\n * @param _privateInputs Private input values (used for validation, not parsing)\n */\n parse(\n fn: CircuitFunction,\n _publicInputs: InputValue[],\n _privateInputs: InputValue[]\n ): ParsedCircuit {\n const fnSource = fn.toString();\n\n // Parse as expression (arrow function)\n const ast = acorn.parse(`(${fnSource})`, {\n ecmaVersion: 2022,\n sourceType: 'module',\n }) as AcornNode;\n\n // Find the function node\n const fnNode = this.findFunctionNode(ast);\n\n // Extract parameters\n const { publicParams, privateParams } = this.extractParameters(fnNode);\n\n // Parse body statements\n const statements = this.parseBody(fnNode);\n\n return { publicParams, privateParams, statements };\n }\n\n /**\n * Finds the arrow function or function expression in the AST.\n */\n private findFunctionNode(ast: AcornNode): AcornNode {\n let fnNode: AcornNode | null = null;\n\n walk.simple(ast, {\n ArrowFunctionExpression(node: AcornNode) {\n fnNode = node;\n },\n FunctionExpression(node: AcornNode) {\n fnNode = node;\n },\n });\n\n if (!fnNode) {\n throw new Error('Could not find function in source');\n }\n\n return fnNode;\n }\n\n /**\n * Extracts public and private parameters from the function signature.\n * Expects pattern: ([pub1, pub2], [priv1, priv2]) => { ... }\n */\n private extractParameters(fnNode: AcornNode): {\n publicParams: CircuitParam[];\n privateParams: CircuitParam[];\n } {\n const params = fnNode.params as AcornNode[];\n\n if (params.length !== 2) {\n throw new Error(\n 'Circuit function must have exactly 2 parameters: (publicArgs, privateArgs)'\n );\n }\n\n const publicParams: CircuitParam[] = [];\n const privateParams: CircuitParam[] = [];\n\n // Parse public params (first array pattern)\n const pubParam = params[0];\n if (pubParam.type === 'ArrayPattern') {\n pubParam.elements.forEach((elem: AcornNode, idx: number) => {\n if (elem && elem.type === 'Identifier') {\n publicParams.push({ name: elem.name, index: idx });\n }\n });\n }\n\n // Parse private params (second array pattern)\n const privParam = params[1];\n if (privParam.type === 'ArrayPattern') {\n privParam.elements.forEach((elem: AcornNode, idx: number) => {\n if (elem && elem.type === 'Identifier') {\n privateParams.push({ name: elem.name, index: idx });\n }\n });\n }\n\n return { publicParams, privateParams };\n }\n\n /**\n * Parses the function body into statements.\n */\n private parseBody(fnNode: AcornNode): Statement[] {\n const body = fnNode.body as AcornNode;\n const statements: Statement[] = [];\n\n if (body.type === 'BlockStatement') {\n for (const stmt of body.body) {\n const parsed = this.stmtParser.parse(stmt);\n if (parsed) {\n statements.push(parsed);\n }\n }\n } else {\n // Single expression body - wrap in assert if it's a condition\n const expr = this.exprParser.parse(body);\n if (expr) {\n statements.push({ kind: 'assert', condition: expr });\n }\n }\n\n return statements;\n }\n}\n","import type {\n BinaryOperator,\n UnaryOperator,\n} from '../../domain/entities/circuit.js';\n\n/**\n * Maps JavaScript binary operators to their Noir equivalents.\n *\n * Notable conversions:\n * - `===` → `==` (Noir has no strict equality)\n * - `!==` → `!=` (Noir has no strict inequality)\n * - `&&` → `&` (Noir uses bitwise AND for logical AND)\n * - `||` → `|` (Noir uses bitwise OR for logical OR)\n */\nexport const BINARY_OPERATOR_MAP: Record<string, BinaryOperator> = {\n // Equality\n '==': '==',\n '===': '==',\n '!=': '!=',\n '!==': '!=',\n // Arithmetic\n '+': '+',\n '-': '-',\n '*': '*',\n '/': '/',\n '%': '%',\n // Comparison\n '<': '<',\n '>': '>',\n '<=': '<=',\n '>=': '>=',\n // Logical (JS && and || map to Noir & and |)\n '&&': '&',\n '||': '|',\n};\n\n/**\n * Maps JavaScript unary operators to their Noir equivalents.\n */\nexport const UNARY_OPERATOR_MAP: Record<string, UnaryOperator> = {\n '!': '!',\n '-': '-',\n};\n\n/**\n * Maps a JavaScript binary operator to its Noir equivalent.\n * @throws Error if the operator is not supported.\n */\nexport function mapBinaryOperator(op: string): BinaryOperator {\n const noirOp = BINARY_OPERATOR_MAP[op];\n if (!noirOp) {\n throw new Error(`Unsupported binary operator: ${op}`);\n }\n return noirOp;\n}\n\n/**\n * Maps a JavaScript unary operator to its Noir equivalent.\n * @throws Error if the operator is not supported.\n */\nexport function mapUnaryOperator(op: string): UnaryOperator {\n const noirOp = UNARY_OPERATOR_MAP[op];\n if (!noirOp) {\n throw new Error(`Unsupported unary operator: ${op}`);\n }\n return noirOp;\n}\n","/**\n * Prefix used to indicate mutable variables in JS source.\n * Variables named `mut_foo` will become `let mut foo` in Noir.\n */\nconst MUT_PREFIX = 'mut_';\n\n/**\n * Strips the `mut_` prefix from a variable name if present.\n *\n * @example\n * stripMutPrefix('mut_counter') // 'counter'\n * stripMutPrefix('total') // 'total'\n */\nexport function stripMutPrefix(name: string): string {\n return name.startsWith(MUT_PREFIX) ? name.slice(MUT_PREFIX.length) : name;\n}\n\n/**\n * Checks if a variable name indicates mutability (has `mut_` prefix).\n *\n * @example\n * isMutable('mut_counter') // true\n * isMutable('total') // false\n */\nexport function isMutable(name: string): boolean {\n return name.startsWith(MUT_PREFIX);\n}\n","import type { Expr } from '../../domain/entities/circuit.js';\nimport type { AcornNode } from './types.js';\nimport { BINARY_OPERATOR_MAP, UNARY_OPERATOR_MAP } from './operatorMaps.js';\nimport { stripMutPrefix } from './utils.js';\n\n/**\n * Parses JavaScript AST expression nodes into circuit Expr types.\n *\n * Handles:\n * - Identifiers\n * - Literals (number, string, bigint)\n * - Binary expressions (arithmetic, comparison, logical)\n * - Unary expressions (!, -)\n * - Member expressions (array indexing, .length)\n * - Array literals\n * - Call expressions\n * - Conditional (ternary) expressions\n */\nexport class ExpressionParser {\n /**\n * Parses an AST node into a circuit expression.\n * @returns The parsed expression, or null if the node type is not recognized.\n */\n parse(node: AcornNode): Expr | null {\n switch (node.type) {\n case 'Identifier':\n return this.parseIdentifier(node);\n\n case 'Literal':\n return this.parseLiteral(node);\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n return this.parseBinaryExpression(node);\n\n case 'MemberExpression':\n return this.parseMemberExpression(node);\n\n case 'ArrayExpression':\n return this.parseArrayExpression(node);\n\n case 'CallExpression':\n return this.parseCallExpression(node);\n\n case 'UnaryExpression':\n return this.parseUnaryExpression(node);\n\n case 'ConditionalExpression':\n return this.parseConditionalExpression(node);\n\n default:\n return null;\n }\n }\n\n private parseIdentifier(node: AcornNode): Expr {\n // Strip mut_ prefix for consistency with variable declarations\n const name = node.name as string;\n return { kind: 'identifier', name: stripMutPrefix(name) };\n }\n\n private parseLiteral(node: AcornNode): Expr {\n return { kind: 'literal', value: node.value as number | string | bigint };\n }\n\n private parseBinaryExpression(node: AcornNode): Expr {\n const operator = BINARY_OPERATOR_MAP[node.operator];\n if (!operator) {\n throw new Error(`Unsupported operator: ${node.operator}`);\n }\n\n const left = this.parse(node.left as AcornNode);\n const right = this.parse(node.right as AcornNode);\n\n if (!left || !right) {\n throw new Error('Could not parse binary expression operands');\n }\n\n return { kind: 'binary', left, operator, right };\n }\n\n private parseMemberExpression(node: AcornNode): Expr | null {\n const obj = node.object as AcornNode;\n const prop = node.property as AcornNode;\n\n // Handle computed property access: arr[i] or arr[0]\n if (node.computed) {\n const object = this.parse(obj);\n const index = this.parse(prop);\n\n if (!object || !index) {\n throw new Error('Could not parse member expression');\n }\n\n return {\n kind: 'member',\n object,\n index,\n };\n }\n\n // Handle property access: arr.length → special case for .length\n if (prop.type === 'Identifier' && prop.name === 'length') {\n const object = this.parse(obj);\n if (!object) {\n throw new Error('Could not parse object for .length');\n }\n\n // Transform arr.length → arr.len() call\n return {\n kind: 'call',\n callee: object,\n method: 'len',\n args: [],\n };\n }\n\n return null;\n }\n\n private parseArrayExpression(node: AcornNode): Expr {\n const elements: Expr[] = [];\n for (const elem of node.elements) {\n if (elem) {\n const parsed = this.parse(elem as AcornNode);\n if (parsed) {\n elements.push(parsed);\n }\n }\n }\n return {\n kind: 'array_literal',\n elements,\n };\n }\n\n private parseCallExpression(node: AcornNode): Expr | null {\n const callee = node.callee as AcornNode;\n const args: Expr[] = [];\n\n for (const arg of node.arguments) {\n const parsed = this.parse(arg as AcornNode);\n if (parsed) {\n args.push(parsed);\n }\n }\n\n // Check for method call: obj.method()\n if (callee.type === 'MemberExpression' && !callee.computed) {\n const obj = this.parse(callee.object as AcornNode);\n const method = (callee.property as AcornNode).name as string;\n\n if (obj) {\n return {\n kind: 'call',\n callee: obj,\n method,\n args,\n };\n }\n }\n\n // Regular function call\n const calleeExpr = this.parse(callee);\n if (calleeExpr) {\n return {\n kind: 'call',\n callee: calleeExpr,\n args,\n };\n }\n\n return null;\n }\n\n private parseUnaryExpression(node: AcornNode): Expr {\n const unaryOp = UNARY_OPERATOR_MAP[node.operator];\n if (!unaryOp) {\n throw new Error(`Unsupported unary operator: ${node.operator}`);\n }\n\n // Optimize: fold negative literals into a single literal node\n if (node.operator === '-' && node.argument.type === 'Literal') {\n const val = node.argument.value;\n if (typeof val === 'number' || typeof val === 'bigint') {\n return { kind: 'literal', value: -val };\n }\n }\n\n const operand = this.parse(node.argument as AcornNode);\n if (!operand) {\n throw new Error('Could not parse unary expression operand');\n }\n\n return { kind: 'unary', operator: unaryOp, operand };\n }\n\n private parseConditionalExpression(node: AcornNode): Expr {\n // Ternary: condition ? consequent : alternate → if expression in Noir\n const condition = this.parse(node.test as AcornNode);\n const consequent = this.parse(node.consequent as AcornNode);\n const alternate = this.parse(node.alternate as AcornNode);\n\n if (!condition || !consequent || !alternate) {\n throw new Error('Could not parse ternary expression');\n }\n\n return {\n kind: 'if_expr',\n condition,\n consequent,\n alternate,\n };\n }\n}\n","import type { Statement } from '../../domain/entities/circuit.js';\nimport type { AcornNode } from './types.js';\nimport { ExpressionParser } from './ExpressionParser.js';\nimport { ForLoopParser } from './ForLoopParser.js';\nimport { stripMutPrefix, isMutable } from './utils.js';\n\n/**\n * Parses JavaScript AST statement nodes into circuit Statement types.\n *\n * Handles:\n * - Variable declarations (let, const)\n * - Expression statements (assert calls, assignments)\n * - If statements\n * - For statements\n */\nexport class StatementParser {\n constructor(\n private exprParser: ExpressionParser,\n private forLoopParser: ForLoopParser\n ) {}\n\n /**\n * Parses a statement AST node.\n * @returns The parsed statement, or null if the node type is not recognized.\n */\n parse(node: AcornNode): Statement | null {\n switch (node.type) {\n case 'VariableDeclaration':\n return this.parseVariableDeclaration(node);\n\n case 'ExpressionStatement':\n return this.parseExpressionStatement(node);\n\n case 'IfStatement':\n return this.parseIfStatement(node);\n\n case 'ForStatement':\n return this.forLoopParser.parse(node, (n) => this.parseBlock(n));\n\n default:\n return null;\n }\n }\n\n /**\n * Parses a block or single statement into an array of statements.\n */\n parseBlock(node: AcornNode): Statement[] {\n if (node.type === 'BlockStatement') {\n const statements: Statement[] = [];\n for (const stmt of node.body) {\n const parsed = this.parse(stmt);\n if (parsed) {\n statements.push(parsed);\n }\n }\n return statements;\n } else {\n // Single statement (no braces)\n const parsed = this.parse(node);\n return parsed ? [parsed] : [];\n }\n }\n\n /**\n * Parses variable declarations: let x = 5; const y = 10;\n * Uses mut_ prefix convention for mutable variables.\n */\n private parseVariableDeclaration(node: AcornNode): Statement {\n const declaration = node.declarations[0] as AcornNode;\n if (!declaration || declaration.type !== 'VariableDeclarator') {\n throw new Error('Invalid variable declaration');\n }\n\n const id = declaration.id as AcornNode;\n if (id.type !== 'Identifier') {\n throw new Error('Variable declaration must have a simple identifier');\n }\n\n const init = declaration.init as AcornNode | null;\n if (!init) {\n throw new Error('Variable declaration must have an initializer');\n }\n\n const initializer = this.exprParser.parse(init);\n if (!initializer) {\n throw new Error('Could not parse variable initializer');\n }\n\n const name = id.name as string;\n\n return {\n kind: 'variable_declaration',\n name: stripMutPrefix(name),\n mutable: isMutable(name),\n initializer,\n };\n }\n\n /**\n * Parses expression statements: assert(), assignments.\n */\n private parseExpressionStatement(node: AcornNode): Statement | null {\n const expr = node.expression as AcornNode;\n\n // Check for assert() call\n if (expr.type === 'CallExpression') {\n const callee = expr.callee as AcornNode;\n\n if (callee.type === 'Identifier' && callee.name === 'assert') {\n return this.parseAssertCall(expr);\n }\n }\n\n // Check for assignment: x = 5;\n if (expr.type === 'AssignmentExpression') {\n return this.parseAssignment(expr);\n }\n\n return null;\n }\n\n /**\n * Parses assert() function calls.\n */\n private parseAssertCall(expr: AcornNode): Statement {\n const args = expr.arguments as AcornNode[];\n\n if (args.length === 0) {\n throw new Error('assert() requires at least one argument');\n }\n\n const condition = this.exprParser.parse(args[0]);\n if (!condition) {\n throw new Error('Could not parse assert condition');\n }\n\n const message =\n args.length > 1 && args[1].type === 'Literal'\n ? String(args[1].value)\n : undefined;\n\n return { kind: 'assert', condition, message };\n }\n\n /**\n * Parses assignment expressions: x = 5;\n */\n private parseAssignment(expr: AcornNode): Statement {\n const left = expr.left as AcornNode;\n const right = expr.right as AcornNode;\n\n if (left.type !== 'Identifier') {\n throw new Error('Assignment target must be an identifier');\n }\n\n const value = this.exprParser.parse(right);\n if (!value) {\n throw new Error('Could not parse assignment value');\n }\n\n // Strip mut_ prefix if present (for consistency)\n const name = left.name as string;\n\n return {\n kind: 'assignment',\n target: stripMutPrefix(name),\n value,\n };\n }\n\n /**\n * Parses if statements: if (condition) { ... } else { ... }\n */\n private parseIfStatement(node: AcornNode): Statement {\n const condition = this.exprParser.parse(node.test as AcornNode);\n if (!condition) {\n throw new Error('Could not parse if condition');\n }\n\n const consequent = this.parseBlock(node.consequent as AcornNode);\n const alternate = node.alternate\n ? this.parseBlock(node.alternate as AcornNode)\n : undefined;\n\n return {\n kind: 'if_statement',\n condition,\n consequent,\n alternate,\n };\n }\n}\n","import type { Statement, Expr } from '../../domain/entities/circuit.js';\nimport type { AcornNode } from './types.js';\nimport { ExpressionParser } from './ExpressionParser.js';\n\n/**\n * Parses and validates JavaScript for loops for Noir conversion.\n *\n * Supports:\n * - `for (let i = start; i < end; i++)` → `for i in start..end`\n * - `for (let i = start; i <= end; i++)` → `for i in start..=end`\n *\n * Validates:\n * - Init must be a variable declaration\n * - Test must compare loop variable with < or <=\n * - Update must be simple increment (i++, ++i, or i = i + 1)\n */\nexport class ForLoopParser {\n constructor(private exprParser: ExpressionParser) {}\n\n /**\n * Parses a for statement into a circuit for_statement.\n * @param node The ForStatement AST node\n * @param parseBlock Function to parse the loop body\n */\n parse(\n node: AcornNode,\n parseBlock: (n: AcornNode) => Statement[]\n ): Statement {\n // Validate and extract init\n const { variable, start } = this.validateInit(node.init as AcornNode | null);\n\n // Validate and extract test\n const { end, inclusive } = this.validateTest(node.test as AcornNode | null, variable);\n\n // Validate update\n this.validateUpdate(node.update as AcornNode | null, variable);\n\n // Parse body\n const body = parseBlock(node.body as AcornNode);\n\n return {\n kind: 'for_statement',\n variable,\n start,\n end,\n inclusive,\n body,\n };\n }\n\n /**\n * Validates the for loop initializer.\n * Must be: `let i = start`\n */\n private validateInit(init: AcornNode | null): { variable: string; start: Expr } {\n if (!init || init.type !== 'VariableDeclaration') {\n throw new Error('For loop init must be a variable declaration (let i = start)');\n }\n\n const declaration = init.declarations[0] as AcornNode;\n if (!declaration || declaration.id.type !== 'Identifier') {\n throw new Error('For loop must declare a simple variable');\n }\n\n const variable = declaration.id.name as string;\n const startInit = declaration.init as AcornNode | null;\n if (!startInit) {\n throw new Error('For loop variable must have an initializer');\n }\n\n const start = this.exprParser.parse(startInit);\n if (!start) {\n throw new Error('Could not parse for loop start value');\n }\n\n return { variable, start };\n }\n\n /**\n * Validates the for loop test condition.\n * Must be: `i < end` or `i <= end`\n */\n private validateTest(\n test: AcornNode | null,\n variable: string\n ): { end: Expr; inclusive: boolean } {\n if (!test || test.type !== 'BinaryExpression') {\n throw new Error('For loop test must be a comparison (i < end or i <= end)');\n }\n\n const testLeft = test.left as AcornNode;\n if (testLeft.type !== 'Identifier' || testLeft.name !== variable) {\n throw new Error('For loop test must compare the loop variable');\n }\n\n const operator = test.operator as string;\n if (operator !== '<' && operator !== '<=') {\n throw new Error('For loop test must use < or <= operator');\n }\n\n const end = this.exprParser.parse(test.right as AcornNode);\n if (!end) {\n throw new Error('Could not parse for loop end value');\n }\n\n return { end, inclusive: operator === '<=' };\n }\n\n /**\n * Validates the for loop update expression.\n * Must be: `i++`, `++i`, or `i = i + 1`\n */\n private validateUpdate(update: AcornNode | null, variable: string): void {\n if (!update) {\n throw new Error('For loop must have an update expression');\n }\n\n if (!this.isSimpleIncrement(update, variable)) {\n throw new Error('For loop update must be i++ or i = i + 1 or ++i');\n }\n }\n\n /**\n * Checks if an expression is a simple increment of the variable.\n * Accepts: i++, ++i, i = i + 1\n */\n private isSimpleIncrement(node: AcornNode, variable: string): boolean {\n // i++ or ++i\n if (node.type === 'UpdateExpression') {\n const arg = node.argument as AcornNode;\n return (\n node.operator === '++' &&\n arg.type === 'Identifier' &&\n arg.name === variable\n );\n }\n\n // i = i + 1\n if (node.type === 'AssignmentExpression') {\n const left = node.left as AcornNode;\n const right = node.right as AcornNode;\n\n if (left.type !== 'Identifier' || left.name !== variable) {\n return false;\n }\n\n if (right.type === 'BinaryExpression') {\n const binLeft = right.left as AcornNode;\n const binRight = right.right as AcornNode;\n\n return (\n right.operator === '+' &&\n binLeft.type === 'Identifier' &&\n binLeft.name === variable &&\n binRight.type === 'Literal' &&\n binRight.value === 1\n );\n }\n }\n\n return false;\n }\n}\n","import { AcornParser } from './infra/parser/AcornParser.js';\nimport { Barretenberg } from './infra/provingSystems/Barretenberg.js';\nimport { ArkworksWasm } from './infra/provingSystems/ArkworksWasm.js';\nimport type { CreateProofDependencies } from './application/CreateProofUseCase.js';\nimport type { ArkworksWasmConfig } from './infra/provingSystems/ArkworksWasm.js';\n\n/**\n * Create default container with Barretenberg backend\n *\n * @deprecated Use IziNoir.init({ provider: Provider.Barretenberg }) instead\n */\nexport function createDefaultContainer(): CreateProofDependencies {\n return {\n parser: new AcornParser(),\n provingSystem: new Barretenberg(),\n };\n}\n\n/**\n * Create container with ArkworksWasm backend (Groth16 for Solana, 100% browser)\n *\n * @deprecated Use IziNoir.init({ provider: Provider.Arkworks }) instead\n *\n * @example\n * ```ts\n * // Preferred:\n * const izi = await IziNoir.init({ provider: Provider.Arkworks });\n * await izi.compile(noirCode);\n * const proof = await izi.proveForChain('solana', inputs);\n * ```\n */\nexport function createArkworksWasmContainer(config?: ArkworksWasmConfig): CreateProofDependencies {\n return {\n parser: new AcornParser(),\n provingSystem: new ArkworksWasm(config),\n };\n}\n","import type { ParsedCircuit, Expr, Statement } from '../../domain/entities/circuit.js';\n\nexport function generateNoir(circuit: ParsedCircuit): string {\n const params = generateParams(circuit);\n const body = generateBody(circuit.statements);\n\n return `fn main(${params}) {\\n${body}\\n}\\n`;\n}\n\nfunction generateParams(circuit: ParsedCircuit): string {\n const allParams: string[] = [];\n\n // Private params first (no pub modifier)\n for (const param of circuit.privateParams) {\n allParams.push(`${param.name}: Field`);\n }\n\n // Public params with pub modifier\n for (const param of circuit.publicParams) {\n allParams.push(`${param.name}: pub Field`);\n }\n\n return allParams.join(', ');\n}\n\nfunction generateBody(statements: Statement[], indent: number = 1): string {\n const lines: string[] = [];\n const indentStr = ' '.repeat(indent);\n\n for (const stmt of statements) {\n const generated = generateStatement(stmt, indent);\n // Handle multi-line statements (like if blocks)\n if (generated.includes('\\n')) {\n lines.push(generated);\n } else {\n lines.push(`${indentStr}${generated}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction generateStatement(stmt: Statement, indent: number = 1): string {\n const indentStr = ' '.repeat(indent);\n\n switch (stmt.kind) {\n case 'assert': {\n const condition = generateExpr(stmt.condition);\n if (stmt.message) {\n return `assert(${condition}, \"${stmt.message}\");`;\n }\n return `assert(${condition});`;\n }\n\n case 'variable_declaration': {\n const init = generateExpr(stmt.initializer);\n const mutKeyword = stmt.mutable ? 'let mut' : 'let';\n\n // Infer type from initializer\n const typeStr = inferType(stmt.initializer);\n return `${mutKeyword} ${stmt.name}: ${typeStr} = ${init};`;\n }\n\n case 'assignment': {\n const value = generateExpr(stmt.value);\n return `${stmt.target} = ${value};`;\n }\n\n case 'if_statement': {\n const condition = generateExpr(stmt.condition);\n const consequentBody = generateBody(stmt.consequent, indent + 1);\n\n let result = `${indentStr}if ${condition} {\\n${consequentBody}\\n${indentStr}}`;\n\n if (stmt.alternate && stmt.alternate.length > 0) {\n const alternateBody = generateBody(stmt.alternate, indent + 1);\n result += ` else {\\n${alternateBody}\\n${indentStr}}`;\n }\n\n return result;\n }\n\n case 'for_statement': {\n const start = generateExpr(stmt.start);\n const end = generateExpr(stmt.end);\n const rangeOp = stmt.inclusive ? '..=' : '..';\n const bodyContent = generateBody(stmt.body, indent + 1);\n\n return `${indentStr}for ${stmt.variable} in ${start}${rangeOp}${end} {\\n${bodyContent}\\n${indentStr}}`;\n }\n }\n}\n\nfunction generateExpr(expr: Expr): string {\n switch (expr.kind) {\n case 'identifier':\n return expr.name;\n\n case 'literal':\n return formatLiteral(expr.value);\n\n case 'binary': {\n const left = generateExpr(expr.left);\n const right = generateExpr(expr.right);\n return `${left} ${expr.operator} ${right}`;\n }\n\n case 'unary': {\n const operand = generateExpr(expr.operand);\n // For unary operators, we may need parens if operand is complex\n if (expr.operand.kind === 'binary') {\n return `${expr.operator}(${operand})`;\n }\n return `${expr.operator}${operand}`;\n }\n\n case 'member': {\n const object = generateExpr(expr.object);\n const index = generateExpr(expr.index);\n return `${object}[${index}]`;\n }\n\n case 'array_literal': {\n const elements = expr.elements.map(e => generateExpr(e)).join(', ');\n return `[${elements}]`;\n }\n\n case 'call': {\n const args = expr.args.map(a => generateExpr(a)).join(', ');\n if (expr.method) {\n // Method call: arr.len()\n const callee = generateExpr(expr.callee);\n return `${callee}.${expr.method}(${args})`;\n }\n // Regular function call\n const callee = generateExpr(expr.callee);\n return `${callee}(${args})`;\n }\n\n case 'if_expr': {\n const condition = generateExpr(expr.condition);\n const consequent = generateExpr(expr.consequent);\n const alternate = generateExpr(expr.alternate);\n return `if ${condition} { ${consequent} } else { ${alternate} }`;\n }\n }\n}\n\nfunction formatLiteral(value: number | string | bigint): string {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (typeof value === 'number') {\n return value.toString();\n }\n // String values - could be hex\n if (typeof value === 'string' && value.startsWith('0x')) {\n return value;\n }\n return `\"${value}\"`;\n}\n\nfunction inferType(expr: Expr): string {\n switch (expr.kind) {\n case 'array_literal':\n // For arrays, infer element type from first element or default to Field\n const elementType = expr.elements.length > 0\n ? inferType(expr.elements[0])\n : 'Field';\n return `[${elementType}; ${expr.elements.length}]`;\n\n case 'literal':\n // Check for boolean literals\n if (typeof expr.value === 'boolean') {\n return 'bool';\n }\n return 'Field';\n\n case 'if_expr':\n // If expression returns the type of its branches\n return inferType(expr.consequent);\n\n default:\n // Default to Field for most expressions\n return 'Field';\n }\n}\n","import type { IParser } from '../domain/interfaces/parsing/IParser.js';\nimport type { IProvingSystem } from '../domain/interfaces/proving/IProvingSystem.js';\nimport type { CircuitFunction, InputValue, ProofResult, InputMap } from '../domain/types.js';\nimport type { InputValue as NoirInputValue } from '@noir-lang/types';\nimport { generateNoir } from './services/NoirGenerator.js';\n\nexport interface CreateProofDependencies {\n parser: IParser;\n provingSystem: IProvingSystem;\n}\n\nexport class CreateProofUseCase {\n constructor(private readonly deps: CreateProofDependencies) {}\n\n async execute(\n publicInputs: InputValue[],\n privateInputs: InputValue[],\n circuitFn: CircuitFunction\n ): Promise<ProofResult> {\n const totalStart = performance.now();\n const timings = {\n parseMs: 0,\n generateMs: 0,\n compileMs: 0,\n witnessMs: 0,\n proofMs: 0,\n verifyMs: 0,\n totalMs: 0,\n };\n\n // 1. Parse JS function\n const parseStart = performance.now();\n const parsed = this.deps.parser.parse(circuitFn, publicInputs, privateInputs);\n timings.parseMs = performance.now() - parseStart;\n\n // 2. Generate Noir code\n const generateStart = performance.now();\n const noirCode = generateNoir(parsed);\n timings.generateMs = performance.now() - generateStart;\n\n // 3. Compile Noir to bytecode\n const compileStart = performance.now();\n const circuit = await this.deps.provingSystem.compile(noirCode);\n timings.compileMs = performance.now() - compileStart;\n\n // 4. Build inputs object for witness generation\n const toNoirInput = (val: InputValue): NoirInputValue =>\n typeof val === 'bigint' ? val.toString() : val;\n\n const inputs: InputMap = {};\n\n // Add private inputs first (order matters for Noir)\n for (const param of parsed.privateParams) {\n inputs[param.name] = toNoirInput(privateInputs[param.index]);\n }\n\n // Add public inputs\n for (const param of parsed.publicParams) {\n inputs[param.name] = toNoirInput(publicInputs[param.index]);\n }\n\n // 5. Generate witness and proof\n const witnessStart = performance.now();\n const { proof, publicInputs: proofPublicInputs } = await this.deps.provingSystem.generateProof(circuit, inputs);\n const proofEnd = performance.now();\n\n // Split timing: witness is typically faster, proof takes most time\n const proveTime = proofEnd - witnessStart;\n timings.witnessMs = proveTime * 0.1;\n timings.proofMs = proveTime * 0.9;\n\n // 6. Verify proof\n const verifyStart = performance.now();\n const verified = await this.deps.provingSystem.verifyProof(circuit, proof, proofPublicInputs);\n timings.verifyMs = performance.now() - verifyStart;\n\n timings.totalMs = performance.now() - totalStart;\n\n return {\n proof,\n publicInputs: proofPublicInputs,\n verified,\n noirCode,\n timings,\n };\n }\n}\n","/**\n * Solana on-chain verification provider for IZI-NOIR.\n *\n * This module provides functionality to verify Groth16 proofs on-chain using\n * the IZI-NOIR Solana program. It's compatible with proofs generated by the\n * Arkworks provider.\n *\n * @example Basic usage\n * ```typescript\n * import { SolanaVerifier } from '@izi-noir/sdk/solana';\n * import { Connection, Keypair } from '@solana/web3.js';\n *\n * const connection = new Connection('https://api.devnet.solana.com');\n * const wallet = Keypair.generate(); // In practice, use a real wallet\n *\n * const verifier = new SolanaVerifier({\n * connection,\n * wallet,\n * programId: 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS',\n * });\n *\n * // Initialize a VK account from base64-encoded VK\n * const vkAccount = await verifier.initVkFromBase64(vkGnarkBase64, nrPubinputs);\n *\n * // Verify a proof on-chain\n * const txSig = await verifier.verifyProof(\n * vkAccount,\n * proofGnarkBase64,\n * publicInputsHex\n * );\n * ```\n *\n * @module @izi-noir/sdk/solana\n */\n\n// Constants matching the Solana program\nexport const G1_SIZE = 64;\nexport const G2_SIZE = 128;\nexport const FIELD_SIZE = 32;\nexport const PROOF_SIZE = 256;\nexport const MAX_PUBLIC_INPUTS = 16;\n\n// Program ID - deployed on devnet\nexport const IZI_NOIR_PROGRAM_ID = 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS';\n\n/**\n * Configuration for the SolanaVerifier.\n */\nexport interface SolanaVerifierConfig {\n /**\n * Solana RPC connection.\n * Must be compatible with @solana/web3.js Connection.\n */\n connection: unknown;\n\n /**\n * Wallet for signing transactions.\n * Can be a Keypair or any wallet adapter compatible signer.\n */\n wallet: unknown;\n\n /**\n * Program ID of the deployed IZI-NOIR verifier program.\n * Defaults to the placeholder ID.\n */\n programId?: string;\n}\n\n/**\n * Result from initializing a VK account.\n */\nexport interface InitVkResult {\n /** The public key of the created VK account */\n vkAccount: string;\n /** The transaction signature */\n txSignature: string;\n}\n\n/**\n * Result from verifying a proof on-chain.\n */\nexport interface VerifyResult {\n /** Whether the proof was verified successfully */\n success: boolean;\n /** The transaction signature */\n txSignature: string;\n /** Error message if verification failed */\n error?: string;\n}\n\n/**\n * Parses a base64-encoded verifying key into its components.\n *\n * The VK format from arkworks gnark_compat is:\n * | alpha_g1 (64) | beta_g2 (128) | gamma_g2 (128) | delta_g2 (128) | k[0..n+1] (64 each) |\n *\n * @param vkBase64 - Base64-encoded verifying key\n * @param nrPubinputs - Number of public inputs\n * @returns Parsed VK components\n */\nexport function parseVerifyingKey(vkBase64: string, nrPubinputs: number): {\n alphaG1: Uint8Array;\n betaG2: Uint8Array;\n gammaG2: Uint8Array;\n deltaG2: Uint8Array;\n k: Uint8Array[];\n} {\n const vkBytes = base64ToBytes(vkBase64);\n const expectedLen = G1_SIZE + G2_SIZE * 3 + G1_SIZE * (nrPubinputs + 1);\n\n if (vkBytes.length !== expectedLen) {\n throw new Error(\n `Invalid VK size: expected ${expectedLen} bytes for ${nrPubinputs} public inputs, got ${vkBytes.length}`\n );\n }\n\n let offset = 0;\n\n const alphaG1 = vkBytes.slice(offset, offset + G1_SIZE);\n offset += G1_SIZE;\n\n const betaG2 = vkBytes.slice(offset, offset + G2_SIZE);\n offset += G2_SIZE;\n\n const gammaG2 = vkBytes.slice(offset, offset + G2_SIZE);\n offset += G2_SIZE;\n\n const deltaG2 = vkBytes.slice(offset, offset + G2_SIZE);\n offset += G2_SIZE;\n\n const k: Uint8Array[] = [];\n for (let i = 0; i <= nrPubinputs; i++) {\n k.push(vkBytes.slice(offset, offset + G1_SIZE));\n offset += G1_SIZE;\n }\n\n return { alphaG1, betaG2, gammaG2, deltaG2, k };\n}\n\n/**\n * Parses a base64-encoded proof into its components.\n *\n * The proof format is: A (G1, 64) || B (G2, 128) || C (G1, 64) = 256 bytes\n *\n * @param proofBase64 - Base64-encoded proof\n * @returns Parsed proof components\n */\nexport function parseProof(proofBase64: string): {\n a: Uint8Array;\n b: Uint8Array;\n c: Uint8Array;\n} {\n const proofBytes = base64ToBytes(proofBase64);\n\n if (proofBytes.length !== PROOF_SIZE) {\n throw new Error(`Invalid proof size: expected ${PROOF_SIZE} bytes, got ${proofBytes.length}`);\n }\n\n return {\n a: proofBytes.slice(0, G1_SIZE),\n b: proofBytes.slice(G1_SIZE, G1_SIZE + G2_SIZE),\n c: proofBytes.slice(G1_SIZE + G2_SIZE, PROOF_SIZE),\n };\n}\n\n/**\n * Parses public inputs from hex or decimal string format to 32-byte arrays.\n *\n * @param inputs - Array of public inputs as hex (0x...) or decimal strings\n * @returns Array of 32-byte big-endian field elements\n */\nexport function parsePublicInputs(inputs: string[]): Uint8Array[] {\n return inputs.map((input) => {\n // Handle hex strings\n if (input.startsWith('0x')) {\n const hex = input.slice(2).padStart(64, '0');\n return hexToBytes(hex);\n }\n\n // Handle decimal strings - convert to big-endian bytes\n const num = BigInt(input);\n const hex = num.toString(16).padStart(64, '0');\n return hexToBytes(hex);\n });\n}\n\n/**\n * Calculates the size of a VK account for a given number of public inputs.\n *\n * This matches the Rust `vk_account_size` function.\n *\n * @param nrPubinputs - Number of public inputs\n * @returns Account size in bytes\n */\nexport function calculateVkAccountSize(nrPubinputs: number): number {\n // discriminator (8) + authority (32) + nr_pubinputs (1) + alpha_g1 (64) +\n // beta_g2 (128) + gamma_g2 (128) + delta_g2 (128) + vec_len (4) + k elements\n const fixedSize = 8 + 32 + 1 + G1_SIZE + G2_SIZE * 3 + 4;\n return fixedSize + (nrPubinputs + 1) * G1_SIZE;\n}\n\n/**\n * Calculates the minimum rent for a VK account.\n *\n * @param nrPubinputs - Number of public inputs\n * @param rentExemptionPerByte - Rent per byte (default Solana rate)\n * @returns Rent in lamports\n */\nexport function calculateVkAccountRent(\n nrPubinputs: number,\n rentExemptionPerByte: number = 6960 // approximate lamports per byte\n): number {\n const size = calculateVkAccountSize(nrPubinputs);\n return size * rentExemptionPerByte;\n}\n\n// ========== Helper Functions ==========\n\n/**\n * Converts a base64 string to a Uint8Array.\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n // Browser-compatible base64 decoding\n if (typeof atob === 'function') {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n // Node.js fallback\n return new Uint8Array(Buffer.from(base64, 'base64'));\n}\n\n/**\n * Converts a Uint8Array to a base64 string.\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n // Browser-compatible base64 encoding\n if (typeof btoa === 'function') {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n // Node.js fallback\n return Buffer.from(bytes).toString('base64');\n}\n\n/**\n * Converts a hex string to Uint8Array.\n */\nfunction hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Converts a Uint8Array to hex string.\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n// ========== Instruction Data Builders ==========\n\n/**\n * Builds the instruction data for `init_vk_from_bytes`.\n *\n * Note: This is a simplified version. In practice, you'd use Anchor's IDL\n * and instruction builders from the generated types.\n *\n * @param nrPubinputs - Number of public inputs\n * @param vkBytes - Raw VK bytes\n * @returns Instruction data\n */\nexport function buildInitVkFromBytesData(nrPubinputs: number, vkBytes: Uint8Array): Uint8Array {\n // Anchor instruction discriminator for \"init_vk_from_bytes\"\n // This is sha256(\"global:init_vk_from_bytes\")[0..8]\n const discriminator = new Uint8Array([\n 0xa6, 0x3a, 0x52, 0xf7, 0x13, 0x81, 0x8a, 0x3b\n ]);\n\n // Build instruction data: discriminator + nr_pubinputs (u8) + vk_bytes (Vec<u8>)\n const vkLen = new Uint8Array(4);\n new DataView(vkLen.buffer).setUint32(0, vkBytes.length, true); // little-endian\n\n const data = new Uint8Array(discriminator.length + 1 + 4 + vkBytes.length);\n let offset = 0;\n\n data.set(discriminator, offset);\n offset += discriminator.length;\n\n data[offset] = nrPubinputs;\n offset += 1;\n\n data.set(vkLen, offset);\n offset += 4;\n\n data.set(vkBytes, offset);\n\n return data;\n}\n\n/**\n * Builds the instruction data for `verify_proof`.\n *\n * @param proofBytes - 256-byte proof\n * @param publicInputs - Array of 32-byte field elements\n * @returns Instruction data\n */\nexport function buildVerifyProofData(\n proofBytes: Uint8Array,\n publicInputs: Uint8Array[]\n): Uint8Array {\n // Anchor instruction discriminator for \"verify_proof\"\n // This is sha256(\"global:verify_proof\")[0..8]\n const discriminator = new Uint8Array([\n 0x1e, 0x08, 0xf2, 0x36, 0x44, 0x9a, 0x4b, 0x5c\n ]);\n\n // Validate proof size\n if (proofBytes.length !== PROOF_SIZE) {\n throw new Error(`Invalid proof size: expected ${PROOF_SIZE}, got ${proofBytes.length}`);\n }\n\n // Calculate total size\n const proofVecLen = 4 + proofBytes.length;\n const inputsVecLen = 4 + publicInputs.length * FIELD_SIZE;\n const totalSize = discriminator.length + proofVecLen + inputsVecLen;\n\n const data = new Uint8Array(totalSize);\n let offset = 0;\n\n // Discriminator\n data.set(discriminator, offset);\n offset += discriminator.length;\n\n // proof_bytes as Vec<u8>\n new DataView(data.buffer).setUint32(offset, proofBytes.length, true);\n offset += 4;\n data.set(proofBytes, offset);\n offset += proofBytes.length;\n\n // public_inputs as Vec<[u8; 32]>\n new DataView(data.buffer).setUint32(offset, publicInputs.length, true);\n offset += 4;\n for (const input of publicInputs) {\n if (input.length !== FIELD_SIZE) {\n throw new Error(`Invalid public input size: expected ${FIELD_SIZE}, got ${input.length}`);\n }\n data.set(input, offset);\n offset += FIELD_SIZE;\n }\n\n return data;\n}\n\n/**\n * Type definition for the Anchor IDL accounts structure.\n * This helps with type safety when building transactions.\n */\nexport interface IziNoirAccounts {\n initVk: {\n vkAccount: string;\n authority: string;\n payer: string;\n systemProgram: string;\n };\n verifyProof: {\n vkAccount: string;\n };\n closeVk: {\n vkAccount: string;\n authority: string;\n };\n}\n\n/**\n * Placeholder class for SolanaVerifier.\n *\n * This class provides the interface for on-chain verification but requires\n * @solana/web3.js and @coral-xyz/anchor to be installed as peer dependencies.\n *\n * For full functionality, install the required dependencies:\n * ```bash\n * npm install @solana/web3.js @coral-xyz/anchor\n * ```\n *\n * Then use the generated Anchor client from the solana-contracts package.\n */\nexport class SolanaVerifier {\n private config: SolanaVerifierConfig;\n\n constructor(config: SolanaVerifierConfig) {\n this.config = config;\n }\n\n /**\n * Initializes a VK account from base64-encoded verifying key.\n *\n * Note: This is a placeholder. Use the generated Anchor client for\n * actual transaction building and submission.\n */\n async initVkFromBase64(vkBase64: string, nrPubinputs: number): Promise<InitVkResult> {\n // Parse and validate VK\n const vkBytes = base64ToBytes(vkBase64);\n const expectedLen = G1_SIZE + G2_SIZE * 3 + G1_SIZE * (nrPubinputs + 1);\n\n if (vkBytes.length !== expectedLen) {\n throw new Error(\n `Invalid VK size: expected ${expectedLen} bytes for ${nrPubinputs} public inputs, got ${vkBytes.length}`\n );\n }\n\n // This is a placeholder - actual implementation would use Anchor client\n throw new Error(\n 'SolanaVerifier.initVkFromBase64 requires @solana/web3.js and @coral-xyz/anchor. ' +\n 'Use the generated Anchor client from solana-contracts package.'\n );\n }\n\n /**\n * Verifies a proof on-chain.\n *\n * Note: This is a placeholder. Use the generated Anchor client for\n * actual transaction building and submission.\n */\n async verifyProof(\n vkAccount: string,\n proofBase64: string,\n publicInputs: string[]\n ): Promise<VerifyResult> {\n // Parse and validate proof\n const proofBytes = base64ToBytes(proofBase64);\n if (proofBytes.length !== PROOF_SIZE) {\n throw new Error(`Invalid proof size: expected ${PROOF_SIZE}, got ${proofBytes.length}`);\n }\n\n // This is a placeholder - actual implementation would use Anchor client\n throw new Error(\n 'SolanaVerifier.verifyProof requires @solana/web3.js and @coral-xyz/anchor. ' +\n 'Use the generated Anchor client from solana-contracts package.'\n );\n }\n\n /**\n * Closes a VK account and reclaims rent.\n *\n * Note: This is a placeholder. Use the generated Anchor client for\n * actual transaction building and submission.\n */\n async closeVk(vkAccount: string): Promise<string> {\n throw new Error(\n 'SolanaVerifier.closeVk requires @solana/web3.js and @coral-xyz/anchor. ' +\n 'Use the generated Anchor client from solana-contracts package.'\n );\n }\n}\n\n// Re-export common types\nexport type { CompiledCircuit, InputMap, ProofData } from '../domain/types.js';\n","/**\n * Transaction builder for IZI-NOIR Solana program.\n *\n * Provides a high-level API for building Solana transactions without\n * requiring Anchor or deep knowledge of instruction formats.\n *\n * @example\n * ```typescript\n * import { SolanaTransactionBuilder } from '@izi-noir/sdk';\n *\n * const builder = new SolanaTransactionBuilder({\n * computeUnits: 400_000,\n * programId: 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS',\n * });\n *\n * // Build init VK transaction\n * const initData = builder.buildInitVkInstructionData(solanaProofData);\n *\n * // Build verify proof transaction\n * const verifyData = builder.buildVerifyProofInstructionData(\n * solanaProofData.proof.bytes,\n * solanaProofData.publicInputs.bytes\n * );\n * ```\n *\n * @module @izi-noir/sdk/solana\n */\n\nimport type { SolanaProofData } from '../domain/types.js';\nimport {\n IZI_NOIR_PROGRAM_ID,\n PROOF_SIZE,\n FIELD_SIZE,\n G1_SIZE,\n G2_SIZE,\n buildInitVkFromBytesData,\n buildVerifyProofData,\n calculateVkAccountSize,\n calculateVkAccountRent,\n} from '../providers/solana.js';\n\n// Re-export for convenience\nexport { IZI_NOIR_PROGRAM_ID, calculateVkAccountSize, calculateVkAccountRent };\n\n/**\n * Configuration for the transaction builder.\n */\nexport interface TransactionBuilderConfig {\n /**\n * Program ID of the IZI-NOIR verifier program.\n * Defaults to the deployed devnet program.\n */\n programId?: string;\n\n /**\n * Compute units to request for transactions.\n * Default: 400,000 (sufficient for most proof verifications)\n */\n computeUnits?: number;\n\n /**\n * Priority fee in microLamports per compute unit.\n * Default: 0 (no priority fee)\n */\n priorityFee?: number;\n}\n\n/**\n * Account configuration for init_vk instruction.\n */\nexport interface InitVkAccounts {\n /** Public key of the VK account (as base58 string) */\n vkAccount: string;\n /** Public key of the authority (as base58 string) */\n authority: string;\n /** Public key of the payer (as base58 string) */\n payer: string;\n}\n\n/**\n * Account configuration for verify_proof instruction.\n */\nexport interface VerifyProofAccounts {\n /** Public key of the VK account (as base58 string) */\n vkAccount: string;\n}\n\n/**\n * Account configuration for close_vk instruction.\n */\nexport interface CloseVkAccounts {\n /** Public key of the VK account (as base58 string) */\n vkAccount: string;\n /** Public key of the authority (as base58 string) */\n authority: string;\n}\n\n/**\n * Instruction data and accounts for a Solana instruction.\n */\nexport interface InstructionData {\n /** Raw instruction data bytes */\n data: Uint8Array;\n /** Program ID (base58) */\n programId: string;\n /** Account keys with metadata */\n keys: Array<{\n pubkey: string;\n isSigner: boolean;\n isWritable: boolean;\n }>;\n}\n\n/**\n * Result of building init and verify transactions together.\n */\nexport interface InitAndVerifyInstructions {\n /** Init VK instruction */\n initVk: InstructionData;\n /** Verify proof instruction */\n verifyProof: InstructionData;\n /** Compute budget instruction (set compute units) */\n computeBudget?: InstructionData;\n /** Priority fee instruction (if configured) */\n priorityFee?: InstructionData;\n /** Required rent for VK account in lamports */\n rentLamports: number;\n /** Size of VK account in bytes */\n accountSize: number;\n}\n\n// System program ID\nconst SYSTEM_PROGRAM_ID = '11111111111111111111111111111111';\n// Compute Budget program ID\nconst COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111';\n\n/**\n * Transaction builder for IZI-NOIR Solana program.\n *\n * This class provides methods to build instruction data for the IZI-NOIR\n * Solana program without requiring Anchor or @solana/web3.js dependencies.\n *\n * The returned instruction data can be used with any Solana library:\n * - @solana/web3.js\n * - @solana/kit (new)\n * - Anchor\n * - Mobile wallet adapters\n */\nexport class SolanaTransactionBuilder {\n private programId: string;\n private computeUnits: number;\n private priorityFee: number;\n\n constructor(config: TransactionBuilderConfig = {}) {\n this.programId = config.programId ?? IZI_NOIR_PROGRAM_ID;\n this.computeUnits = config.computeUnits ?? 400_000;\n this.priorityFee = config.priorityFee ?? 0;\n }\n\n /**\n * Builds the instruction data for initializing a VK account.\n *\n * @param solanaProofData - Proof data from `izi.proveForSolana()`\n * @param accounts - Account public keys\n * @returns Instruction data ready for transaction building\n *\n * @example\n * ```typescript\n * const initInstruction = builder.buildInitVkInstruction(solanaProofData, {\n * vkAccount: vkKeypair.publicKey.toBase58(),\n * authority: wallet.publicKey.toBase58(),\n * payer: wallet.publicKey.toBase58(),\n * });\n * ```\n */\n buildInitVkInstruction(\n solanaProofData: SolanaProofData,\n accounts: InitVkAccounts\n ): InstructionData {\n const data = buildInitVkFromBytesData(\n solanaProofData.verifyingKey.nrPublicInputs,\n solanaProofData.verifyingKey.bytes\n );\n\n return {\n data,\n programId: this.programId,\n keys: [\n { pubkey: accounts.vkAccount, isSigner: true, isWritable: true },\n { pubkey: accounts.authority, isSigner: true, isWritable: false },\n { pubkey: accounts.payer, isSigner: true, isWritable: true },\n { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n };\n }\n\n /**\n * Builds the instruction data for verifying a proof.\n *\n * @param proofBytes - 256-byte Groth16 proof\n * @param publicInputs - Array of 32-byte public inputs\n * @param accounts - Account public keys\n * @returns Instruction data ready for transaction building\n *\n * @example\n * ```typescript\n * const verifyInstruction = builder.buildVerifyProofInstruction(\n * solanaProofData.proof.bytes,\n * solanaProofData.publicInputs.bytes,\n * { vkAccount: vkAccountPubkey.toBase58() }\n * );\n * ```\n */\n buildVerifyProofInstruction(\n proofBytes: Uint8Array,\n publicInputs: Uint8Array[],\n accounts: VerifyProofAccounts\n ): InstructionData {\n const data = buildVerifyProofData(proofBytes, publicInputs);\n\n return {\n data,\n programId: this.programId,\n keys: [\n { pubkey: accounts.vkAccount, isSigner: false, isWritable: false },\n ],\n };\n }\n\n /**\n * Builds the instruction data for closing a VK account.\n *\n * @param accounts - Account public keys\n * @returns Instruction data ready for transaction building\n */\n buildCloseVkInstruction(accounts: CloseVkAccounts): InstructionData {\n // Anchor discriminator for \"close_vk\"\n const discriminator = new Uint8Array([\n 0x9a, 0x47, 0x02, 0x2b, 0x87, 0x97, 0x84, 0x4a\n ]);\n\n return {\n data: discriminator,\n programId: this.programId,\n keys: [\n { pubkey: accounts.vkAccount, isSigner: false, isWritable: true },\n { pubkey: accounts.authority, isSigner: true, isWritable: true },\n ],\n };\n }\n\n /**\n * Builds a compute budget instruction to set compute unit limit.\n *\n * @param units - Number of compute units (default: configured value)\n * @returns Instruction data\n */\n buildSetComputeUnitLimitInstruction(units?: number): InstructionData {\n const cu = units ?? this.computeUnits;\n const data = new Uint8Array(5);\n data[0] = 2; // SetComputeUnitLimit instruction\n new DataView(data.buffer).setUint32(1, cu, true);\n\n return {\n data,\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n };\n }\n\n /**\n * Builds a compute budget instruction to set priority fee.\n *\n * @param microLamports - Priority fee in microLamports per CU\n * @returns Instruction data\n */\n buildSetComputeUnitPriceInstruction(microLamports?: number): InstructionData {\n const fee = microLamports ?? this.priorityFee;\n const data = new Uint8Array(9);\n data[0] = 3; // SetComputeUnitPrice instruction\n // 8-byte little-endian u64\n const view = new DataView(data.buffer);\n view.setBigUint64(1, BigInt(fee), true);\n\n return {\n data,\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n };\n }\n\n /**\n * Builds all instructions needed to initialize a VK and verify a proof.\n *\n * This is a convenience method that combines:\n * - Compute budget instructions (if configured)\n * - Init VK instruction\n * - Verify proof instruction\n *\n * @param solanaProofData - Proof data from `izi.proveForSolana()`\n * @param vkAccountPubkey - Public key for the new VK account\n * @param authorityPubkey - Authority for the VK account\n * @param payerPubkey - Payer for the transaction\n * @returns All instruction data and metadata\n *\n * @example\n * ```typescript\n * const result = builder.buildInitAndVerifyInstructions(\n * solanaProofData,\n * vkKeypair.publicKey.toBase58(),\n * wallet.publicKey.toBase58(),\n * wallet.publicKey.toBase58()\n * );\n *\n * // Use with @solana/web3.js:\n * const transaction = new Transaction();\n * if (result.computeBudget) {\n * transaction.add(toTransactionInstruction(result.computeBudget));\n * }\n * transaction.add(toTransactionInstruction(result.initVk));\n * // ... sign and send\n * ```\n */\n buildInitAndVerifyInstructions(\n solanaProofData: SolanaProofData,\n vkAccountPubkey: string,\n authorityPubkey: string,\n payerPubkey: string\n ): InitAndVerifyInstructions {\n const result: InitAndVerifyInstructions = {\n initVk: this.buildInitVkInstruction(solanaProofData, {\n vkAccount: vkAccountPubkey,\n authority: authorityPubkey,\n payer: payerPubkey,\n }),\n verifyProof: this.buildVerifyProofInstruction(\n solanaProofData.proof.bytes,\n solanaProofData.publicInputs.bytes,\n { vkAccount: vkAccountPubkey }\n ),\n rentLamports: solanaProofData.estimatedRent,\n accountSize: solanaProofData.accountSize,\n };\n\n // Add compute budget if configured\n if (this.computeUnits > 0) {\n result.computeBudget = this.buildSetComputeUnitLimitInstruction();\n }\n\n // Add priority fee if configured\n if (this.priorityFee > 0) {\n result.priorityFee = this.buildSetComputeUnitPriceInstruction();\n }\n\n return result;\n }\n\n /**\n * Validates that SolanaProofData has the correct format.\n *\n * @param data - Proof data to validate\n * @throws Error if validation fails\n */\n validateSolanaProofData(data: SolanaProofData): void {\n // Validate proof size\n if (data.proof.bytes.length !== PROOF_SIZE) {\n throw new Error(\n `Invalid proof size: expected ${PROOF_SIZE} bytes, got ${data.proof.bytes.length}`\n );\n }\n\n // Validate VK size\n const expectedVkSize = G1_SIZE + G2_SIZE * 3 + G1_SIZE * (data.verifyingKey.nrPublicInputs + 1);\n if (data.verifyingKey.bytes.length !== expectedVkSize) {\n throw new Error(\n `Invalid VK size: expected ${expectedVkSize} bytes for ${data.verifyingKey.nrPublicInputs} public inputs, got ${data.verifyingKey.bytes.length}`\n );\n }\n\n // Validate public inputs\n for (let i = 0; i < data.publicInputs.bytes.length; i++) {\n if (data.publicInputs.bytes[i].length !== FIELD_SIZE) {\n throw new Error(\n `Invalid public input ${i} size: expected ${FIELD_SIZE} bytes, got ${data.publicInputs.bytes[i].length}`\n );\n }\n }\n\n // Validate public inputs count matches VK\n if (data.publicInputs.bytes.length !== data.verifyingKey.nrPublicInputs) {\n throw new Error(\n `Public inputs count mismatch: VK expects ${data.verifyingKey.nrPublicInputs}, got ${data.publicInputs.bytes.length}`\n );\n }\n }\n\n /**\n * Gets the program ID being used.\n */\n getProgramId(): string {\n return this.programId;\n }\n\n /**\n * Gets the configured compute units.\n */\n getComputeUnits(): number {\n return this.computeUnits;\n }\n\n /**\n * Gets the configured priority fee.\n */\n getPriorityFee(): number {\n return this.priorityFee;\n }\n}\n\n/**\n * Helper to convert InstructionData to a format compatible with @solana/web3.js.\n *\n * This is a type definition only - actual conversion requires @solana/web3.js.\n *\n * @example\n * ```typescript\n * import { PublicKey, TransactionInstruction } from '@solana/web3.js';\n *\n * function toTransactionInstruction(data: InstructionData): TransactionInstruction {\n * return new TransactionInstruction({\n * programId: new PublicKey(data.programId),\n * keys: data.keys.map(k => ({\n * pubkey: new PublicKey(k.pubkey),\n * isSigner: k.isSigner,\n * isWritable: k.isWritable,\n * })),\n * data: Buffer.from(data.data),\n * });\n * }\n * ```\n */\nexport type Web3JsInstructionConverter = (data: InstructionData) => unknown;\n","/**\n * VK Deployment Manager for IZI-NOIR.\n *\n * Provides idempotent deployment of verifying keys to Solana with\n * local persistence for tracking deployed circuits.\n *\n * @example\n * ```typescript\n * import { VkDeploymentManager } from '@izi-noir/sdk';\n *\n * const manager = new VkDeploymentManager({\n * network: 'devnet',\n * configDir: './.izi-noir', // optional, defaults to .izi-noir\n * });\n *\n * // Deploy (idempotent - won't redeploy if already deployed)\n * const deployment = await manager.ensureDeployed({\n * circuitName: 'balance-check',\n * solanaProofData,\n * sendTransaction: async (tx) => {\n * // Sign and send using your wallet adapter\n * return await wallet.sendTransaction(tx, connection);\n * },\n * });\n *\n * console.log(`VK at: ${deployment.vkAccount}`);\n *\n * // Save deployment state\n * await manager.save();\n * ```\n *\n * @module @izi-noir/sdk/deployment\n */\n\nimport type { SolanaProofData } from '../domain/types.js';\nimport { SolanaTransactionBuilder } from '../solana/TransactionBuilder.js';\nimport type { InstructionData } from '../solana/TransactionBuilder.js';\n\n/**\n * Supported Solana networks.\n */\nexport type SolanaNetwork = 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet';\n\n/**\n * Network RPC endpoints.\n */\nexport const NETWORK_ENDPOINTS: Record<SolanaNetwork, string> = {\n 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n devnet: 'https://api.devnet.solana.com',\n testnet: 'https://api.testnet.solana.com',\n localnet: 'http://localhost:8899',\n};\n\n/**\n * Configuration for VK Deployment Manager.\n */\nexport interface VkDeploymentManagerConfig {\n /**\n * Solana network to deploy to.\n */\n network: SolanaNetwork;\n\n /**\n * Custom RPC endpoint. Overrides network default.\n */\n rpcEndpoint?: string;\n\n /**\n * Directory to store deployment config. Default: '.izi-noir'\n */\n configDir?: string;\n\n /**\n * Program ID override.\n */\n programId?: string;\n\n /**\n * Compute units for transactions. Default: 400,000\n */\n computeUnits?: number;\n}\n\n/**\n * Record of a deployed VK.\n */\nexport interface VkDeployment {\n /** Circuit identifier (name or hash) */\n circuitId: string;\n /** VK account public key (base58) */\n vkAccount: string;\n /** Authority public key (base58) */\n authority: string;\n /** Deployment timestamp */\n deployedAt: string;\n /** Transaction signature */\n txSignature: string;\n /** Network deployed to */\n network: SolanaNetwork;\n /** Hash of the VK bytes for deduplication */\n vkHash: string;\n /** Number of public inputs */\n nrPublicInputs: number;\n}\n\n/**\n * Options for ensureDeployed method.\n */\nexport interface EnsureDeployedOptions {\n /**\n * Identifier for the circuit (used for lookup).\n */\n circuitName: string;\n\n /**\n * Proof data containing VK bytes.\n */\n solanaProofData: SolanaProofData;\n\n /**\n * Function to send a transaction.\n * Should return the transaction signature.\n */\n sendTransaction: (instructions: InstructionData[], signers: SignerInfo[]) => Promise<string>;\n\n /**\n * Authority public key (base58).\n */\n authority: string;\n\n /**\n * Payer public key (base58).\n */\n payer: string;\n\n /**\n * Force redeploy even if already exists.\n */\n forceRedeploy?: boolean;\n}\n\n/**\n * Information about required signers.\n */\nexport interface SignerInfo {\n /** Public key of the signer (base58) */\n pubkey: string;\n /** Whether this is a new keypair that needs to be generated */\n isNewKeypair: boolean;\n /** Description of the signer role */\n role: 'vkAccount' | 'authority' | 'payer';\n}\n\n/**\n * Result of deployment operation.\n */\nexport interface DeploymentResult {\n /** Whether deployment was performed (false if already deployed) */\n deployed: boolean;\n /** VK account address */\n vkAccount: string;\n /** Transaction signature (if deployed) */\n txSignature?: string;\n /** Full deployment record */\n deployment: VkDeployment;\n}\n\n/**\n * Deployments state file structure.\n */\nexport interface DeploymentsState {\n version: '1.0';\n deployments: VkDeployment[];\n}\n\n/**\n * VK Deployment Manager.\n *\n * Manages deployment of verifying keys to Solana with:\n * - Idempotent deployments (skip if already deployed)\n * - Local persistence of deployment records\n * - Network-aware configuration\n */\nexport class VkDeploymentManager {\n private config: Required<VkDeploymentManagerConfig>;\n private deployments: Map<string, VkDeployment>;\n private builder: SolanaTransactionBuilder;\n private dirty: boolean = false;\n\n constructor(config: VkDeploymentManagerConfig) {\n this.config = {\n network: config.network,\n rpcEndpoint: config.rpcEndpoint ?? NETWORK_ENDPOINTS[config.network],\n configDir: config.configDir ?? '.izi-noir',\n programId: config.programId ?? '',\n computeUnits: config.computeUnits ?? 400_000,\n };\n this.deployments = new Map();\n this.builder = new SolanaTransactionBuilder({\n programId: this.config.programId || undefined,\n computeUnits: this.config.computeUnits,\n });\n }\n\n /**\n * Loads deployment state from disk.\n *\n * In browser environments, this is a no-op.\n * In Node.js, reads from {configDir}/deployments.json\n */\n async load(): Promise<void> {\n // This is a placeholder - actual file I/O depends on environment\n // Node.js implementation would use fs.readFile\n // Browser could use localStorage or IndexedDB\n\n // For now, we provide a method signature that implementations can override\n // or users can call loadFromJson with their own loading logic\n }\n\n /**\n * Loads deployment state from a JSON object.\n */\n loadFromJson(state: DeploymentsState): void {\n this.deployments.clear();\n for (const deployment of state.deployments) {\n // Only load deployments for current network\n if (deployment.network === this.config.network) {\n const key = this.makeDeploymentKey(deployment.circuitId, deployment.vkHash);\n this.deployments.set(key, deployment);\n }\n }\n this.dirty = false;\n }\n\n /**\n * Saves deployment state.\n *\n * Returns the state object for custom persistence.\n */\n async save(): Promise<DeploymentsState> {\n const state = this.toJson();\n this.dirty = false;\n // Actual file I/O would be environment-specific\n return state;\n }\n\n /**\n * Exports deployment state to JSON.\n */\n toJson(): DeploymentsState {\n return {\n version: '1.0',\n deployments: Array.from(this.deployments.values()),\n };\n }\n\n /**\n * Ensures a VK is deployed, skipping if already exists.\n *\n * @returns Deployment result with VK account address\n */\n async ensureDeployed(options: EnsureDeployedOptions): Promise<DeploymentResult> {\n const { circuitName, solanaProofData, authority, payer, forceRedeploy } = options;\n\n // Calculate VK hash for deduplication\n const vkHash = await this.hashVkBytes(solanaProofData.verifyingKey.bytes);\n const deploymentKey = this.makeDeploymentKey(circuitName, vkHash);\n\n // Check if already deployed\n const existing = this.deployments.get(deploymentKey);\n if (existing && !forceRedeploy) {\n return {\n deployed: false,\n vkAccount: existing.vkAccount,\n deployment: existing,\n };\n }\n\n // Generate VK account keypair placeholder\n // The actual keypair generation is done by the caller\n const vkAccountPubkey = this.generateVkAccountPlaceholder();\n\n // Build instructions\n const instructions: InstructionData[] = [];\n\n // Add compute budget\n instructions.push(this.builder.buildSetComputeUnitLimitInstruction());\n\n // Add init VK instruction\n const initVk = this.builder.buildInitVkInstruction(solanaProofData, {\n vkAccount: vkAccountPubkey,\n authority,\n payer,\n });\n instructions.push(initVk);\n\n // Define signers needed\n const signers: SignerInfo[] = [\n { pubkey: vkAccountPubkey, isNewKeypair: true, role: 'vkAccount' },\n { pubkey: authority, isNewKeypair: false, role: 'authority' },\n ];\n if (payer !== authority) {\n signers.push({ pubkey: payer, isNewKeypair: false, role: 'payer' });\n }\n\n // Send transaction\n const txSignature = await options.sendTransaction(instructions, signers);\n\n // Record deployment\n const deployment: VkDeployment = {\n circuitId: circuitName,\n vkAccount: vkAccountPubkey,\n authority,\n deployedAt: new Date().toISOString(),\n txSignature,\n network: this.config.network,\n vkHash,\n nrPublicInputs: solanaProofData.verifyingKey.nrPublicInputs,\n };\n\n this.deployments.set(deploymentKey, deployment);\n this.dirty = true;\n\n return {\n deployed: true,\n vkAccount: vkAccountPubkey,\n txSignature,\n deployment,\n };\n }\n\n /**\n * Gets deployment by circuit name.\n */\n getDeployment(circuitName: string): VkDeployment | undefined {\n // Search by circuit ID (partial match without hash)\n for (const [key, deployment] of this.deployments) {\n if (deployment.circuitId === circuitName) {\n return deployment;\n }\n }\n return undefined;\n }\n\n /**\n * Gets deployment by VK hash.\n */\n getDeploymentByVkHash(vkHash: string): VkDeployment | undefined {\n for (const deployment of this.deployments.values()) {\n if (deployment.vkHash === vkHash) {\n return deployment;\n }\n }\n return undefined;\n }\n\n /**\n * Gets all deployments.\n */\n getAllDeployments(): VkDeployment[] {\n return Array.from(this.deployments.values());\n }\n\n /**\n * Checks if there are unsaved changes.\n */\n isDirty(): boolean {\n return this.dirty;\n }\n\n /**\n * Gets the RPC endpoint.\n */\n getRpcEndpoint(): string {\n return this.config.rpcEndpoint;\n }\n\n /**\n * Gets the network.\n */\n getNetwork(): SolanaNetwork {\n return this.config.network;\n }\n\n /**\n * Prepares instructions for deployment without sending.\n *\n * Useful when you need to combine with other instructions\n * or use a specific signing flow.\n */\n prepareDeployment(\n solanaProofData: SolanaProofData,\n accounts: {\n vkAccount: string;\n authority: string;\n payer: string;\n }\n ): {\n instructions: InstructionData[];\n signers: SignerInfo[];\n rentLamports: number;\n } {\n const instructions: InstructionData[] = [];\n\n // Compute budget\n instructions.push(this.builder.buildSetComputeUnitLimitInstruction());\n\n // Init VK\n instructions.push(\n this.builder.buildInitVkInstruction(solanaProofData, {\n vkAccount: accounts.vkAccount,\n authority: accounts.authority,\n payer: accounts.payer,\n })\n );\n\n const signers: SignerInfo[] = [\n { pubkey: accounts.vkAccount, isNewKeypair: true, role: 'vkAccount' },\n { pubkey: accounts.authority, isNewKeypair: false, role: 'authority' },\n ];\n if (accounts.payer !== accounts.authority) {\n signers.push({ pubkey: accounts.payer, isNewKeypair: false, role: 'payer' });\n }\n\n return {\n instructions,\n signers,\n rentLamports: solanaProofData.estimatedRent,\n };\n }\n\n /**\n * Records an external deployment (made outside this manager).\n */\n recordDeployment(deployment: VkDeployment): void {\n const key = this.makeDeploymentKey(deployment.circuitId, deployment.vkHash);\n this.deployments.set(key, deployment);\n this.dirty = true;\n }\n\n /**\n * Removes a deployment record.\n */\n removeDeployment(circuitName: string): boolean {\n for (const [key, deployment] of this.deployments) {\n if (deployment.circuitId === circuitName) {\n this.deployments.delete(key);\n this.dirty = true;\n return true;\n }\n }\n return false;\n }\n\n // Private helpers\n\n private makeDeploymentKey(circuitId: string, vkHash: string): string {\n return `${circuitId}:${vkHash.slice(0, 16)}`;\n }\n\n private async hashVkBytes(bytes: Uint8Array): Promise<string> {\n // Use SubtleCrypto for hashing (works in browser and Node.js 15+)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Fallback: simple hash (not cryptographically secure, but deterministic)\n let hash = 0;\n for (let i = 0; i < bytes.length; i++) {\n hash = ((hash << 5) - hash + bytes[i]) | 0;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n private generateVkAccountPlaceholder(): string {\n // This is a placeholder that signals to the caller\n // that they need to generate a real keypair\n // In practice, the sendTransaction callback receives SignerInfo\n // which indicates isNewKeypair: true for the VK account\n return 'PENDING_VK_ACCOUNT_KEYPAIR';\n }\n}\n\n/**\n * Creates a VK Deployment Manager with Node.js file persistence.\n *\n * @example\n * ```typescript\n * const manager = await createNodeVkDeploymentManager({\n * network: 'devnet',\n * configDir: './.izi-noir',\n * });\n *\n * // Automatically loads existing deployments\n * // and saves on manager.save()\n * ```\n */\nexport async function createNodeVkDeploymentManager(\n config: VkDeploymentManagerConfig\n): Promise<VkDeploymentManager> {\n const manager = new VkDeploymentManager(config);\n // In Node.js, we'd load from disk here\n // This is a stub - actual implementation would use fs\n await manager.load();\n return manager;\n}\n","/**\n * Circuit Registry for IZI-NOIR.\n *\n * Provides naming, versioning, and metadata management for JS circuits.\n * Enables circuit reuse and documentation generation.\n *\n * @example\n * ```typescript\n * import { CircuitRegistry } from '@izi-noir/sdk';\n *\n * const registry = new CircuitRegistry();\n *\n * // Register a circuit\n * registry.register({\n * name: 'balance-check',\n * version: '1.0.0',\n * description: 'Proves balance >= minimum without revealing actual balance',\n * jsCircuit: ([minimum], [balance]) => {\n * assert(balance >= minimum);\n * },\n * publicInputs: [{ name: 'minimum', type: 'Field', description: 'Minimum required balance' }],\n * privateInputs: [{ name: 'balance', type: 'Field', description: 'Actual balance (kept private)' }],\n * tags: ['finance', 'privacy'],\n * });\n *\n * // Use the circuit\n * const circuit = registry.get('balance-check');\n * const result = await izi.createProof(circuit.jsCircuit, [100], [250]);\n * ```\n *\n * @module @izi-noir/sdk/registry\n */\n\nimport type { CircuitFunction } from '../domain/types.js';\n\n/**\n * Input field definition with metadata.\n */\nexport interface CircuitInputDef {\n /** Name of the input */\n name: string;\n /** Type in Noir (Field, u8, u32, etc.) */\n type: 'Field' | 'u8' | 'u16' | 'u32' | 'u64' | 'bool' | string;\n /** Human-readable description */\n description?: string;\n /** Optional constraint or validation info */\n constraints?: string;\n}\n\n/**\n * Circuit definition with metadata.\n */\nexport interface CircuitDefinition {\n /** Unique identifier for the circuit */\n name: string;\n /** Semantic version (e.g., '1.0.0') */\n version: string;\n /** Human-readable description */\n description?: string;\n /** The JavaScript circuit function */\n jsCircuit: CircuitFunction;\n /** Public inputs metadata */\n publicInputs: CircuitInputDef[];\n /** Private inputs metadata */\n privateInputs: CircuitInputDef[];\n /** Optional tags for categorization */\n tags?: string[];\n /** Optional author information */\n author?: string;\n /** Optional license */\n license?: string;\n}\n\n/**\n * Registered circuit with computed metadata.\n */\nexport interface RegisteredCircuit extends CircuitDefinition {\n /** When the circuit was registered */\n registeredAt: Date;\n /** Unique identifier combining name and version */\n id: string;\n /** Hash of the circuit function for change detection */\n functionHash: string;\n}\n\n/**\n * Options for circuit lookup.\n */\nexport interface GetCircuitOptions {\n /** Specific version to get (default: latest) */\n version?: string;\n}\n\n/**\n * Circuit Registry.\n *\n * A registry for managing named, versioned circuits with rich metadata.\n * Provides features for:\n * - Semantic versioning\n * - Input/output documentation\n * - Tag-based categorization\n * - Change detection\n */\nexport class CircuitRegistry {\n private circuits: Map<string, RegisteredCircuit[]> = new Map();\n\n /**\n * Registers a new circuit.\n *\n * @param definition - Circuit definition with metadata\n * @returns The registered circuit with computed fields\n * @throws Error if circuit with same name and version exists\n */\n register(definition: CircuitDefinition): RegisteredCircuit {\n const { name, version } = definition;\n\n // Validate semver format (basic check)\n if (!/^\\d+\\.\\d+\\.\\d+/.test(version)) {\n throw new Error(\n `Invalid version format: ${version}. Use semantic versioning (e.g., '1.0.0')`\n );\n }\n\n // Validate circuit function\n if (typeof definition.jsCircuit !== 'function') {\n throw new Error('jsCircuit must be a function');\n }\n\n // Check for existing version\n const existing = this.circuits.get(name) ?? [];\n if (existing.some((c) => c.version === version)) {\n throw new Error(\n `Circuit '${name}' version ${version} already registered. Use a new version.`\n );\n }\n\n // Compute function hash for change detection\n const functionHash = this.hashFunction(definition.jsCircuit);\n\n // Create registered circuit\n const registered: RegisteredCircuit = {\n ...definition,\n registeredAt: new Date(),\n id: `${name}@${version}`,\n functionHash,\n };\n\n // Store sorted by version (newest first)\n existing.push(registered);\n existing.sort((a, b) => this.compareVersions(b.version, a.version));\n this.circuits.set(name, existing);\n\n return registered;\n }\n\n /**\n * Gets a circuit by name.\n *\n * @param name - Circuit name\n * @param options - Lookup options (version, etc.)\n * @returns The circuit or undefined if not found\n */\n get(name: string, options?: GetCircuitOptions): RegisteredCircuit | undefined {\n const versions = this.circuits.get(name);\n if (!versions || versions.length === 0) {\n return undefined;\n }\n\n if (options?.version) {\n return versions.find((c) => c.version === options.version);\n }\n\n // Return latest version (first in sorted array)\n return versions[0];\n }\n\n /**\n * Gets all versions of a circuit.\n *\n * @param name - Circuit name\n * @returns Array of all registered versions\n */\n getVersions(name: string): RegisteredCircuit[] {\n return this.circuits.get(name) ?? [];\n }\n\n /**\n * Checks if a circuit exists.\n *\n * @param name - Circuit name\n * @param version - Optional specific version\n */\n has(name: string, version?: string): boolean {\n const circuit = this.get(name, version ? { version } : undefined);\n return circuit !== undefined;\n }\n\n /**\n * Gets all registered circuit names.\n */\n names(): string[] {\n return Array.from(this.circuits.keys());\n }\n\n /**\n * Gets all registered circuits.\n */\n all(): RegisteredCircuit[] {\n const result: RegisteredCircuit[] = [];\n for (const versions of this.circuits.values()) {\n result.push(...versions);\n }\n return result;\n }\n\n /**\n * Searches circuits by tag.\n *\n * @param tag - Tag to search for\n * @returns Circuits with matching tag\n */\n findByTag(tag: string): RegisteredCircuit[] {\n const result: RegisteredCircuit[] = [];\n for (const versions of this.circuits.values()) {\n for (const circuit of versions) {\n if (circuit.tags?.includes(tag)) {\n result.push(circuit);\n }\n }\n }\n return result;\n }\n\n /**\n * Removes a circuit from the registry.\n *\n * @param name - Circuit name\n * @param version - Optional specific version (removes all if not specified)\n * @returns true if circuit was removed\n */\n remove(name: string, version?: string): boolean {\n if (!version) {\n return this.circuits.delete(name);\n }\n\n const versions = this.circuits.get(name);\n if (!versions) return false;\n\n const index = versions.findIndex((c) => c.version === version);\n if (index === -1) return false;\n\n versions.splice(index, 1);\n if (versions.length === 0) {\n this.circuits.delete(name);\n }\n return true;\n }\n\n /**\n * Exports the registry to a serializable format.\n */\n export(): CircuitRegistryExport {\n const circuits: CircuitExportEntry[] = [];\n\n for (const [name, versions] of this.circuits) {\n for (const circuit of versions) {\n circuits.push({\n name: circuit.name,\n version: circuit.version,\n description: circuit.description,\n publicInputs: circuit.publicInputs,\n privateInputs: circuit.privateInputs,\n tags: circuit.tags,\n author: circuit.author,\n license: circuit.license,\n registeredAt: circuit.registeredAt.toISOString(),\n functionHash: circuit.functionHash,\n // Note: jsCircuit is not serializable\n });\n }\n }\n\n return {\n version: '1.0',\n exportedAt: new Date().toISOString(),\n circuits,\n };\n }\n\n /**\n * Generates documentation for a circuit.\n *\n * @param name - Circuit name\n * @returns Markdown documentation\n */\n generateDocs(name: string): string {\n const circuit = this.get(name);\n if (!circuit) {\n return `Circuit '${name}' not found.`;\n }\n\n const lines: string[] = [\n `# ${circuit.name}`,\n '',\n `**Version:** ${circuit.version}`,\n ];\n\n if (circuit.description) {\n lines.push('', circuit.description);\n }\n\n if (circuit.author) {\n lines.push('', `**Author:** ${circuit.author}`);\n }\n\n if (circuit.license) {\n lines.push(`**License:** ${circuit.license}`);\n }\n\n if (circuit.tags && circuit.tags.length > 0) {\n lines.push('', `**Tags:** ${circuit.tags.join(', ')}`);\n }\n\n lines.push('', '## Public Inputs', '');\n if (circuit.publicInputs.length === 0) {\n lines.push('None');\n } else {\n lines.push('| Name | Type | Description |', '|------|------|-------------|');\n for (const input of circuit.publicInputs) {\n lines.push(`| ${input.name} | ${input.type} | ${input.description ?? '-'} |`);\n }\n }\n\n lines.push('', '## Private Inputs', '');\n if (circuit.privateInputs.length === 0) {\n lines.push('None');\n } else {\n lines.push('| Name | Type | Description |', '|------|------|-------------|');\n for (const input of circuit.privateInputs) {\n lines.push(`| ${input.name} | ${input.type} | ${input.description ?? '-'} |`);\n }\n }\n\n lines.push('', '## Circuit Function', '', '```javascript', circuit.jsCircuit.toString(), '```');\n\n return lines.join('\\n');\n }\n\n /**\n * Validates circuit inputs against the definition.\n *\n * @param name - Circuit name\n * @param publicInputs - Public inputs to validate\n * @param privateInputs - Private inputs to validate\n * @throws Error if validation fails\n */\n validateInputs(\n name: string,\n publicInputs: unknown[],\n privateInputs: unknown[]\n ): void {\n const circuit = this.get(name);\n if (!circuit) {\n throw new Error(`Circuit '${name}' not found`);\n }\n\n if (publicInputs.length !== circuit.publicInputs.length) {\n throw new Error(\n `Expected ${circuit.publicInputs.length} public inputs, got ${publicInputs.length}`\n );\n }\n\n if (privateInputs.length !== circuit.privateInputs.length) {\n throw new Error(\n `Expected ${circuit.privateInputs.length} private inputs, got ${privateInputs.length}`\n );\n }\n\n // Type validation based on input definitions\n for (let i = 0; i < publicInputs.length; i++) {\n this.validateInput(\n publicInputs[i],\n circuit.publicInputs[i],\n `public input '${circuit.publicInputs[i].name}'`\n );\n }\n\n for (let i = 0; i < privateInputs.length; i++) {\n this.validateInput(\n privateInputs[i],\n circuit.privateInputs[i],\n `private input '${circuit.privateInputs[i].name}'`\n );\n }\n }\n\n // Private helpers\n\n private hashFunction(fn: CircuitFunction): string {\n const str = fn.toString();\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n private compareVersions(a: string, b: string): number {\n const partsA = a.split('.').map((n) => parseInt(n, 10));\n const partsB = b.split('.').map((n) => parseInt(n, 10));\n\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const numA = partsA[i] ?? 0;\n const numB = partsB[i] ?? 0;\n if (numA > numB) return 1;\n if (numA < numB) return -1;\n }\n return 0;\n }\n\n private validateInput(\n value: unknown,\n def: CircuitInputDef,\n location: string\n ): void {\n switch (def.type) {\n case 'bool':\n if (typeof value !== 'boolean' && value !== 0 && value !== 1) {\n throw new Error(`${location}: expected boolean, got ${typeof value}`);\n }\n break;\n case 'Field':\n case 'u8':\n case 'u16':\n case 'u32':\n case 'u64':\n if (typeof value !== 'number' && typeof value !== 'bigint') {\n throw new Error(`${location}: expected number/bigint, got ${typeof value}`);\n }\n break;\n default:\n // Unknown type, skip validation\n break;\n }\n }\n}\n\n/**\n * Serializable circuit entry (without the function).\n */\nexport interface CircuitExportEntry {\n name: string;\n version: string;\n description?: string;\n publicInputs: CircuitInputDef[];\n privateInputs: CircuitInputDef[];\n tags?: string[];\n author?: string;\n license?: string;\n registeredAt: string;\n functionHash: string;\n}\n\n/**\n * Serializable registry export.\n */\nexport interface CircuitRegistryExport {\n version: '1.0';\n exportedAt: string;\n circuits: CircuitExportEntry[];\n}\n\n/**\n * Creates a global registry singleton.\n */\nlet globalRegistry: CircuitRegistry | null = null;\n\nexport function getGlobalRegistry(): CircuitRegistry {\n if (!globalRegistry) {\n globalRegistry = new CircuitRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Decorator-style function to register a circuit with minimal boilerplate.\n *\n * @example\n * ```typescript\n * const balanceCheck = defineCircuit({\n * name: 'balance-check',\n * version: '1.0.0',\n * publicInputs: [{ name: 'minimum', type: 'Field' }],\n * privateInputs: [{ name: 'balance', type: 'Field' }],\n * }, ([minimum], [balance]) => {\n * assert(balance >= minimum);\n * });\n *\n * // balanceCheck is now registered and contains the full definition\n * ```\n */\nexport function defineCircuit(\n metadata: Omit<CircuitDefinition, 'jsCircuit'>,\n jsCircuit: CircuitFunction\n): RegisteredCircuit {\n const registry = getGlobalRegistry();\n return registry.register({ ...metadata, jsCircuit });\n}\n","/**\n * Off-Chain Verifier for IZI-NOIR.\n *\n * Provides ZK proof verification without on-chain transactions.\n * Useful for API authentication, backend validation, and testing.\n *\n * @example\n * ```typescript\n * import { OffchainVerifier, createVerifierMiddleware } from '@izi-noir/sdk';\n * import express from 'express';\n *\n * // Create verifier with compiled circuits\n * const verifier = new OffchainVerifier();\n *\n * // Register circuits for verification\n * await verifier.registerCircuit('age-check', {\n * jsCircuit: ([minAge], [birthYear]) => {\n * assert(2024 - birthYear >= minAge);\n * }\n * });\n *\n * // Use as Express middleware\n * const app = express();\n * app.post('/api/verify', createVerifierMiddleware(verifier));\n *\n * // Or verify directly\n * const result = await verifier.verify({\n * circuitName: 'age-check',\n * proof: proofBytes,\n * publicInputs: [18],\n * });\n *\n * if (result.verified) {\n * console.log('Proof valid!');\n * }\n * ```\n *\n * @module @izi-noir/sdk/server\n */\n\nimport type { CircuitFunction, CompiledCircuit, ProofResult } from '../domain/types.js';\n\n/**\n * Circuit configuration for offchain verification.\n */\nexport interface OffchainCircuitConfig {\n /** JavaScript circuit function */\n jsCircuit: CircuitFunction;\n /** Pre-compiled circuit (optional, will compile if not provided) */\n compiledCircuit?: CompiledCircuit;\n /** Expected number of public inputs */\n publicInputCount?: number;\n}\n\n/**\n * Verification request.\n */\nexport interface VerifyRequest {\n /** Circuit name to verify against */\n circuitName: string;\n /** Proof bytes (hex string or Uint8Array) */\n proof: string | Uint8Array;\n /** Public inputs (numbers or hex strings) */\n publicInputs: Array<number | bigint | string>;\n}\n\n/**\n * Verification result.\n */\nexport interface VerifyResult {\n /** Whether the proof is valid */\n verified: boolean;\n /** Circuit name */\n circuitName: string;\n /** Verification time in milliseconds */\n verificationTimeMs: number;\n /** Error message if verification failed */\n error?: string;\n /** Public inputs that were verified */\n publicInputs: Array<number | bigint | string>;\n}\n\n/**\n * Configuration for OffchainVerifier.\n */\nexport interface OffchainVerifierConfig {\n /**\n * Callback to compile a circuit.\n * Required if registering circuits by jsCircuit without pre-compiled circuit.\n */\n compiler?: (jsCircuit: CircuitFunction) => Promise<CompiledCircuit>;\n\n /**\n * Callback to verify a proof against a compiled circuit.\n */\n verifier?: (\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: Uint8Array[]\n ) => Promise<boolean>;\n}\n\n/**\n * Express-like request interface.\n */\ninterface ExpressRequest {\n body: {\n circuitName?: string;\n proof?: string | Uint8Array;\n publicInputs?: Array<number | bigint | string>;\n };\n}\n\n/**\n * Express-like response interface.\n */\ninterface ExpressResponse {\n status(code: number): ExpressResponse;\n json(body: unknown): ExpressResponse;\n}\n\n/**\n * Express-like next function.\n */\ntype ExpressNext = (err?: Error) => void;\n\n/**\n * Off-chain ZK proof verifier.\n *\n * Manages registered circuits and provides proof verification\n * without requiring blockchain transactions.\n */\nexport class OffchainVerifier {\n private circuits: Map<string, OffchainCircuitConfig> = new Map();\n private compiledCircuits: Map<string, CompiledCircuit> = new Map();\n private config: OffchainVerifierConfig;\n\n constructor(config: OffchainVerifierConfig = {}) {\n this.config = config;\n }\n\n /**\n * Registers a circuit for verification.\n *\n * @param name - Unique name for the circuit\n * @param config - Circuit configuration\n */\n async registerCircuit(name: string, config: OffchainCircuitConfig): Promise<void> {\n this.circuits.set(name, config);\n\n // If pre-compiled circuit provided, use it\n if (config.compiledCircuit) {\n this.compiledCircuits.set(name, config.compiledCircuit);\n return;\n }\n\n // Otherwise, compile using provided compiler\n if (this.config.compiler) {\n const compiled = await this.config.compiler(config.jsCircuit);\n this.compiledCircuits.set(name, compiled);\n }\n }\n\n /**\n * Registers a pre-compiled circuit.\n *\n * @param name - Unique name for the circuit\n * @param compiled - Pre-compiled circuit\n */\n registerCompiledCircuit(name: string, compiled: CompiledCircuit): void {\n this.compiledCircuits.set(name, compiled);\n }\n\n /**\n * Verifies a ZK proof.\n *\n * @param request - Verification request with circuit name, proof, and public inputs\n * @returns Verification result\n */\n async verify(request: VerifyRequest): Promise<VerifyResult> {\n const startTime = performance.now();\n const { circuitName, proof, publicInputs } = request;\n\n // Get compiled circuit\n const compiled = this.compiledCircuits.get(circuitName);\n if (!compiled) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: `Circuit '${circuitName}' not registered`,\n publicInputs,\n };\n }\n\n // Validate public inputs count\n const config = this.circuits.get(circuitName);\n if (config?.publicInputCount !== undefined) {\n if (publicInputs.length !== config.publicInputCount) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: `Expected ${config.publicInputCount} public inputs, got ${publicInputs.length}`,\n publicInputs,\n };\n }\n }\n\n try {\n // Convert proof to Uint8Array\n const proofBytes = this.toUint8Array(proof);\n\n // Convert public inputs to Uint8Array[]\n const publicInputBytes = publicInputs.map((input) =>\n this.publicInputToBytes(input)\n );\n\n // Verify using provided verifier\n if (!this.config.verifier) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: 'No verifier configured. Provide a verifier in the config.',\n publicInputs,\n };\n }\n\n const verified = await this.config.verifier(\n compiled,\n proofBytes,\n publicInputBytes\n );\n\n return {\n verified,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n publicInputs,\n };\n } catch (error) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown verification error',\n publicInputs,\n };\n }\n }\n\n /**\n * Checks if a circuit is registered.\n *\n * @param name - Circuit name\n */\n hasCircuit(name: string): boolean {\n return this.compiledCircuits.has(name);\n }\n\n /**\n * Gets all registered circuit names.\n */\n getCircuitNames(): string[] {\n return Array.from(this.compiledCircuits.keys());\n }\n\n /**\n * Removes a circuit from the verifier.\n *\n * @param name - Circuit name to remove\n */\n removeCircuit(name: string): boolean {\n this.circuits.delete(name);\n return this.compiledCircuits.delete(name);\n }\n\n // Private helpers\n\n private toUint8Array(input: string | Uint8Array): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n\n // Handle hex string\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n }\n\n private publicInputToBytes(input: number | bigint | string): Uint8Array {\n let value: bigint;\n\n if (typeof input === 'string') {\n // Handle hex string or decimal string\n value = input.startsWith('0x')\n ? BigInt(input)\n : BigInt(input);\n } else if (typeof input === 'bigint') {\n value = input;\n } else {\n value = BigInt(input);\n }\n\n // Convert to 32-byte big-endian array (Field element)\n const bytes = new Uint8Array(32);\n for (let i = 31; i >= 0; i--) {\n bytes[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return bytes;\n }\n}\n\n/**\n * Creates an Express middleware for proof verification.\n *\n * @param verifier - The OffchainVerifier instance\n * @returns Express middleware function\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { OffchainVerifier, createVerifierMiddleware } from '@izi-noir/sdk';\n *\n * const app = express();\n * const verifier = new OffchainVerifier({ ... });\n *\n * // Register your circuits\n * await verifier.registerCircuit('my-circuit', { ... });\n *\n * // Add middleware\n * app.use(express.json());\n * app.post('/verify', createVerifierMiddleware(verifier));\n *\n * // Client sends:\n * // POST /verify\n * // { \"circuitName\": \"my-circuit\", \"proof\": \"0x...\", \"publicInputs\": [123, 456] }\n *\n * // Server responds:\n * // { \"verified\": true, \"circuitName\": \"my-circuit\", \"verificationTimeMs\": 42 }\n * ```\n */\nexport function createVerifierMiddleware(\n verifier: OffchainVerifier\n): (req: ExpressRequest, res: ExpressResponse, next: ExpressNext) => Promise<void> {\n return async (req, res, next) => {\n try {\n const { circuitName, proof, publicInputs } = req.body;\n\n // Validate request\n if (!circuitName || typeof circuitName !== 'string') {\n res.status(400).json({\n error: 'Missing or invalid circuitName',\n });\n return;\n }\n\n if (!proof) {\n res.status(400).json({\n error: 'Missing proof',\n });\n return;\n }\n\n if (!Array.isArray(publicInputs)) {\n res.status(400).json({\n error: 'Missing or invalid publicInputs (expected array)',\n });\n return;\n }\n\n // Check if circuit exists\n if (!verifier.hasCircuit(circuitName)) {\n res.status(404).json({\n error: `Circuit '${circuitName}' not found`,\n });\n return;\n }\n\n // Verify the proof\n const result = await verifier.verify({\n circuitName,\n proof,\n publicInputs,\n });\n\n // Return result\n if (result.verified) {\n res.status(200).json(result);\n } else {\n res.status(400).json(result);\n }\n } catch (error) {\n next(error instanceof Error ? error : new Error(String(error)));\n }\n };\n}\n\n/**\n * Options for verification endpoint.\n */\nexport interface VerificationEndpointOptions {\n /** Custom path for the endpoint (default: '/verify') */\n path?: string;\n /** Rate limiting (requests per minute, 0 = unlimited) */\n rateLimit?: number;\n /** Required API key header */\n apiKeyHeader?: string;\n /** Allowed circuit names (empty = all) */\n allowedCircuits?: string[];\n}\n\n/**\n * Creates a verification endpoint configuration.\n *\n * This is a helper for setting up verification endpoints with\n * common options like rate limiting and API key authentication.\n *\n * @example\n * ```typescript\n * const config = createVerificationEndpoint(verifier, {\n * path: '/api/v1/verify',\n * rateLimit: 100,\n * apiKeyHeader: 'X-API-Key',\n * allowedCircuits: ['balance-check', 'age-verify'],\n * });\n *\n * // Use with Express\n * app.post(config.path, config.middleware);\n * ```\n */\nexport function createVerificationEndpoint(\n verifier: OffchainVerifier,\n options: VerificationEndpointOptions = {}\n): {\n path: string;\n middleware: (req: ExpressRequest, res: ExpressResponse, next: ExpressNext) => Promise<void>;\n} {\n const baseMiddleware = createVerifierMiddleware(verifier);\n\n const wrappedMiddleware = async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: ExpressNext\n ) => {\n // Check allowed circuits\n if (\n options.allowedCircuits &&\n options.allowedCircuits.length > 0 &&\n req.body.circuitName\n ) {\n if (!options.allowedCircuits.includes(req.body.circuitName)) {\n res.status(403).json({\n error: `Circuit '${req.body.circuitName}' not allowed`,\n });\n return;\n }\n }\n\n // Delegate to base middleware\n await baseMiddleware(req, res, next);\n };\n\n return {\n path: options.path ?? '/verify',\n middleware: wrappedMiddleware,\n };\n}\n\n/**\n * Verification result for batch operations.\n */\nexport interface BatchVerifyResult {\n /** Results for each verification */\n results: VerifyResult[];\n /** Total time for all verifications */\n totalTimeMs: number;\n /** Number of verified proofs */\n verifiedCount: number;\n /** Number of failed verifications */\n failedCount: number;\n}\n\n/**\n * Batch verification extension for OffchainVerifier.\n *\n * @example\n * ```typescript\n * const results = await batchVerify(verifier, [\n * { circuitName: 'age-check', proof: proof1, publicInputs: [18] },\n * { circuitName: 'balance-check', proof: proof2, publicInputs: [100] },\n * ]);\n *\n * console.log(`Verified: ${results.verifiedCount}/${results.results.length}`);\n * ```\n */\nexport async function batchVerify(\n verifier: OffchainVerifier,\n requests: VerifyRequest[]\n): Promise<BatchVerifyResult> {\n const startTime = performance.now();\n\n // Run all verifications in parallel\n const results = await Promise.all(\n requests.map((request) => verifier.verify(request))\n );\n\n const verifiedCount = results.filter((r) => r.verified).length;\n\n return {\n results,\n totalTimeMs: performance.now() - startTime,\n verifiedCount,\n failedCount: results.length - verifiedCount,\n };\n}\n"],"mappings":"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","names":["isNodeJs","compile","createFileManager","Noir","stringToStream","isNodeJs","createTempDir","wasmInitPromise","FIELD_SIZE","Chain","Provider","Barretenberg","ArkworksWasm","SolanaFormatter","callee","G1_SIZE","G2_SIZE","G1_SIZE","G2_SIZE","hex","hexToBytes","hexToBytes","G1_SIZE","G2_SIZE"]}
|
|
1
|
+
{"version":3,"sources":["../src/infra/provingSystems/Barretenberg.ts","../src/wasm/nodejs/arkworks_groth16_wasm.js","../src/wasm/web/arkworks_groth16_wasm.js","../src/infra/provingSystems/ArkworksWasm.ts","../src/infra/chainFormatters/SolanaFormatter.ts","../src/domain/types/chain.ts","../src/domain/types/provider.ts","../src/infra/wasm/wasmInit.ts","../src/IziNoir.ts","../src/index.ts","../src/infra/parser/AcornParser.ts","../src/infra/parser/operatorMaps.ts","../src/infra/parser/utils.ts","../src/infra/parser/ExpressionParser.ts","../src/infra/parser/StatementParser.ts","../src/infra/parser/ForLoopParser.ts","../src/container.ts","../src/application/services/NoirGenerator.ts","../src/application/CreateProofUseCase.ts","../src/providers/solana.ts","../src/solana/TransactionBuilder.ts","../src/deployment/VkDeploymentManager.ts","../src/registry/CircuitRegistry.ts","../src/server/OffchainVerifier.ts","../src/config/defineConfig.ts"],"sourcesContent":["import { compile, createFileManager } from '@noir-lang/noir_wasm';\nimport { Noir } from '@noir-lang/noir_js';\nimport { Barretenberg as BarretenbergBackend, UltraHonkBackend } from '@aztec/bb.js';\nimport type { IProvingSystem } from '../../domain/interfaces/proving/IProvingSystem.js';\nimport type { CompiledCircuit, InputMap, ProofData } from '../../domain/types.js';\n\n/**\n * Helper to create a ReadableStream from a string\n * Used to write files to the virtual filesystem (browser-compatible)\n */\nfunction stringToStream(content: string): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(content));\n controller.close();\n },\n });\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Create temp directory in Node.js, or return '/' for browser virtual fs\n */\nasync function createTempDir(): Promise<{ basePath: string; cleanup: (() => Promise<void>) | null }> {\n if (!isNodeJs()) {\n // Browser: use virtual filesystem\n return { basePath: '/', cleanup: null };\n }\n\n // Node.js: create real temp directory\n // Use dynamic import which works in both Node.js ESM and CJS\n const fs = await import('node:fs/promises');\n const os = await import('node:os');\n const path = await import('node:path');\n\n const basePath = await fs.mkdtemp(path.join(os.tmpdir(), 'noir-circuit-'));\n const cleanup = async () => {\n await fs.rm(basePath, { recursive: true, force: true });\n };\n\n return { basePath, cleanup };\n}\n\n/**\n * Barretenberg proving system using WASM.\n * Browser compatible, produces UltraHonk proofs (~16KB).\n */\nexport class Barretenberg implements IProvingSystem {\n async compile(noirCode: string): Promise<CompiledCircuit> {\n const { basePath, cleanup } = await createTempDir();\n const fm = createFileManager(basePath);\n\n const nargoToml = `[package]\nname = \"circuit\"\ntype = \"bin\"\nauthors = [\"\"]\n\n[dependencies]\n`;\n\n try {\n // Write files using ReadableStream (browser-compatible)\n // In Node.js: writeFile is async and must be awaited\n // In browser: writeFile works with virtual fs, should not await for noir_wasm compatibility\n if (isNodeJs()) {\n await fm.writeFile('./src/main.nr', stringToStream(noirCode));\n await fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n } else {\n fm.writeFile('./src/main.nr', stringToStream(noirCode));\n fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n }\n\n const result = await compile(fm);\n const compiled = (result as any).program as CompiledCircuit;\n\n if (!compiled || !compiled.bytecode) {\n throw new Error('Compilation failed: no bytecode generated');\n }\n\n return compiled;\n } finally {\n if (cleanup) {\n await cleanup();\n }\n }\n }\n\n async generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData> {\n const noir = new Noir(circuit);\n const { witness } = await noir.execute(inputs);\n\n const barretenberg = await BarretenbergBackend.new({ threads: 1 });\n const backend = new UltraHonkBackend(circuit.bytecode, barretenberg);\n\n try {\n const proofData = await backend.generateProof(witness);\n return {\n proof: proofData.proof,\n publicInputs: proofData.publicInputs || [],\n };\n } finally {\n await barretenberg.destroy();\n }\n }\n\n async verifyProof(\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: string[]\n ): Promise<boolean> {\n const barretenberg = await BarretenbergBackend.new({ threads: 1 });\n const backend = new UltraHonkBackend(circuit.bytecode, barretenberg);\n\n try {\n return await backend.verifyProof({ proof, publicInputs });\n } finally {\n await barretenberg.destroy();\n }\n }\n}\n","/* @ts-self-types=\"./arkworks_groth16_wasm.d.ts\" */\n\n/**\n * Convert ACIR JSON to R1CS information (for debugging)\n * @param {string} acir_json\n * @returns {any}\n */\nfunction acir_to_r1cs_info(acir_json) {\n const ptr0 = passStringToWasm0(acir_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.acir_to_r1cs_info(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\nexports.acir_to_r1cs_info = acir_to_r1cs_info;\n\nfunction init_panic_hook() {\n wasm.init_panic_hook();\n}\nexports.init_panic_hook = init_panic_hook;\n\n/**\n * Generate a Groth16 proof\n *\n * # Arguments\n * * `proving_key_b64` - Base64-encoded proving key from setup\n * * `acir_json` - JSON string of the ACIR program\n * * `witness_json` - JSON object mapping witness indices to hex values\n *\n * # Returns\n * * `JsProofResult` with proof and public inputs\n * @param {string} proving_key_b64\n * @param {string} acir_json\n * @param {string} witness_json\n * @returns {any}\n */\nfunction prove(proving_key_b64, acir_json, witness_json) {\n const ptr0 = passStringToWasm0(proving_key_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(acir_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(witness_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.prove(ptr0, len0, ptr1, len1, ptr2, len2);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\nexports.prove = prove;\n\n/**\n * Generate a Groth16 proof from R1CS definition\n *\n * # Arguments\n * * `proving_key_b64` - Base64-encoded proving key from setup\n * * `r1cs_json` - JSON string of R1CS definition\n * * `witness_json` - JSON object mapping witness indices to hex values\n *\n * # Returns\n * * `JsProofResult` with proof and public inputs\n * @param {string} proving_key_b64\n * @param {string} r1cs_json\n * @param {string} witness_json\n * @returns {any}\n */\nfunction prove_from_r1cs(proving_key_b64, r1cs_json, witness_json) {\n const ptr0 = passStringToWasm0(proving_key_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(r1cs_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(witness_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.prove_from_r1cs(ptr0, len0, ptr1, len1, ptr2, len2);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\nexports.prove_from_r1cs = prove_from_r1cs;\n\n/**\n * Perform trusted setup for a circuit\n *\n * # Arguments\n * * `acir_json` - JSON string of the ACIR program from Noir compiler\n *\n * # Returns\n * * `JsSetupResult` with base64-encoded proving and verifying keys\n * @param {string} acir_json\n * @returns {any}\n */\nfunction setup(acir_json) {\n const ptr0 = passStringToWasm0(acir_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.setup(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\nexports.setup = setup;\n\n/**\n * Perform trusted setup from R1CS definition\n *\n * # Arguments\n * * `r1cs_json` - JSON string of R1CS definition\n *\n * # Returns\n * * `JsSetupResult` with base64-encoded proving and verifying keys\n * @param {string} r1cs_json\n * @returns {any}\n */\nfunction setup_from_r1cs(r1cs_json) {\n const ptr0 = passStringToWasm0(r1cs_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.setup_from_r1cs(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\nexports.setup_from_r1cs = setup_from_r1cs;\n\n/**\n * Verify a Groth16 proof\n *\n * # Arguments\n * * `verifying_key_b64` - Base64-encoded verifying key from setup\n * * `proof_b64` - Base64-encoded proof (arkworks format)\n * * `public_inputs_json` - JSON array of public inputs as hex strings\n *\n * # Returns\n * * `true` if proof is valid, `false` otherwise\n * @param {string} verifying_key_b64\n * @param {string} proof_b64\n * @param {string} public_inputs_json\n * @returns {boolean}\n */\nfunction verify(verifying_key_b64, proof_b64, public_inputs_json) {\n const ptr0 = passStringToWasm0(verifying_key_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(proof_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(public_inputs_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.verify(ptr0, len0, ptr1, len1, ptr2, len2);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n}\nexports.verify = verify;\n\n/**\n * Verify a Groth16 proof in gnark format\n *\n * # Arguments\n * * `verifying_key_gnark_b64` - Base64-encoded verifying key (gnark format)\n * * `proof_gnark_b64` - Base64-encoded proof (gnark format, 256 bytes)\n * * `public_inputs_gnark_b64` - Base64-encoded public inputs (gnark format)\n * * `num_public_inputs` - Number of public inputs\n *\n * # Returns\n * * `true` if proof is valid, `false` otherwise\n * @param {string} verifying_key_gnark_b64\n * @param {string} proof_gnark_b64\n * @param {string} public_inputs_gnark_b64\n * @param {number} num_public_inputs\n * @returns {boolean}\n */\nfunction verify_gnark(verifying_key_gnark_b64, proof_gnark_b64, public_inputs_gnark_b64, num_public_inputs) {\n const ptr0 = passStringToWasm0(verifying_key_gnark_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(proof_gnark_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(public_inputs_gnark_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.verify_gnark(ptr0, len0, ptr1, len1, ptr2, len2, num_public_inputs);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n}\nexports.verify_gnark = verify_gnark;\n\n/**\n * Get library version\n * @returns {string}\n */\nfunction version() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.version();\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n}\nexports.version = version;\n\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg_Error_8c4e43fe74559d73: function(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_String_8f0eb39a4a4c2f66: function(arg0, arg1) {\n const ret = String(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_is_function_0095a73b8b156f76: function(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n },\n __wbg___wbindgen_is_object_5ae8e5880f2c1fbd: function(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n },\n __wbg___wbindgen_is_string_cd444516edc5b180: function(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n },\n __wbg___wbindgen_is_undefined_9e4d92534c42d778: function(arg0) {\n const ret = arg0 === undefined;\n return ret;\n },\n __wbg___wbindgen_throw_be289d5034ed271b: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_call_389efe28435a9388: function() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n }, arguments); },\n __wbg_call_4708e0c13bdc8e95: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = arg0.call(arg1, arg2);\n return ret;\n }, arguments); },\n __wbg_crypto_86f2631e91b51511: function(arg0) {\n const ret = arg0.crypto;\n return ret;\n },\n __wbg_error_7534b8e9a36f1ab4: function(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);\n }\n },\n __wbg_getRandomValues_b3f15fcbfabb0f8b: function() { return handleError(function (arg0, arg1) {\n arg0.getRandomValues(arg1);\n }, arguments); },\n __wbg_length_32ed9a279acd054c: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_msCrypto_d562bbe83e0d4b91: function(arg0) {\n const ret = arg0.msCrypto;\n return ret;\n },\n __wbg_new_361308b2356cecd0: function() {\n const ret = new Object();\n return ret;\n },\n __wbg_new_3eb36ae241fe6f44: function() {\n const ret = new Array();\n return ret;\n },\n __wbg_new_8a6f238a6ece86ea: function() {\n const ret = new Error();\n return ret;\n },\n __wbg_new_no_args_1c7c842f08d00ebb: function(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_new_with_length_a2c39cbe88fd8ff1: function(arg0) {\n const ret = new Uint8Array(arg0 >>> 0);\n return ret;\n },\n __wbg_node_e1f24f89a7336c2e: function(arg0) {\n const ret = arg0.node;\n return ret;\n },\n __wbg_process_3975fd6c72f520aa: function(arg0) {\n const ret = arg0.process;\n return ret;\n },\n __wbg_prototypesetcall_bdcdcc5842e4d77d: function(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);\n },\n __wbg_randomFillSync_f8c153b79f285817: function() { return handleError(function (arg0, arg1) {\n arg0.randomFillSync(arg1);\n }, arguments); },\n __wbg_require_b74f47fc2d022fd6: function() { return handleError(function () {\n const ret = module.require;\n return ret;\n }, arguments); },\n __wbg_set_3f1d0b984ed272ed: function(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n },\n __wbg_set_f43e577aea94465b: function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n },\n __wbg_stack_0ed75d68575b0f3c: function(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_static_accessor_GLOBAL_12837167ad935116: function() {\n const ret = typeof global === 'undefined' ? null : global;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f: function() {\n const ret = typeof globalThis === 'undefined' ? null : globalThis;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_SELF_a621d3dfbb60d0ce: function() {\n const ret = typeof self === 'undefined' ? null : self;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_WINDOW_f8727f0cf888e0bd: function() {\n const ret = typeof window === 'undefined' ? null : window;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_subarray_a96e1fef17ed23cb: function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n },\n __wbg_versions_4e31226f5e8dc909: function(arg0) {\n const ret = arg0.versions;\n return ret;\n },\n __wbindgen_cast_0000000000000001: function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n },\n __wbindgen_cast_0000000000000002: function(arg0, arg1) {\n // Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref(\"Uint8Array\")`.\n const ret = getArrayU8FromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000003: function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000004: function(arg0) {\n // Cast intrinsic for `U64 -> Externref`.\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n },\n __wbindgen_init_externref_table: function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n },\n };\n return {\n __proto__: null,\n \"./arkworks_groth16_wasm_bg.js\": import0,\n };\n}\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_externrefs.set(idx, obj);\n return idx;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nfunction decodeText(ptr, len) {\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst wasmPath = `${__dirname}/arkworks_groth16_wasm_bg.wasm`;\nconst wasmBytes = require('fs').readFileSync(wasmPath);\nconst wasmModule = new WebAssembly.Module(wasmBytes);\nconst wasm = new WebAssembly.Instance(wasmModule, __wbg_get_imports()).exports;\nwasm.__wbindgen_start();\n","/* @ts-self-types=\"./arkworks_groth16_wasm.d.ts\" */\n\n/**\n * Convert ACIR JSON to R1CS information (for debugging)\n * @param {string} acir_json\n * @returns {any}\n */\nexport function acir_to_r1cs_info(acir_json) {\n const ptr0 = passStringToWasm0(acir_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.acir_to_r1cs_info(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\nexport function init_panic_hook() {\n wasm.init_panic_hook();\n}\n\n/**\n * Generate a Groth16 proof\n *\n * # Arguments\n * * `proving_key_b64` - Base64-encoded proving key from setup\n * * `acir_json` - JSON string of the ACIR program\n * * `witness_json` - JSON object mapping witness indices to hex values\n *\n * # Returns\n * * `JsProofResult` with proof and public inputs\n * @param {string} proving_key_b64\n * @param {string} acir_json\n * @param {string} witness_json\n * @returns {any}\n */\nexport function prove(proving_key_b64, acir_json, witness_json) {\n const ptr0 = passStringToWasm0(proving_key_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(acir_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(witness_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.prove(ptr0, len0, ptr1, len1, ptr2, len2);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Generate a Groth16 proof from R1CS definition\n *\n * # Arguments\n * * `proving_key_b64` - Base64-encoded proving key from setup\n * * `r1cs_json` - JSON string of R1CS definition\n * * `witness_json` - JSON object mapping witness indices to hex values\n *\n * # Returns\n * * `JsProofResult` with proof and public inputs\n * @param {string} proving_key_b64\n * @param {string} r1cs_json\n * @param {string} witness_json\n * @returns {any}\n */\nexport function prove_from_r1cs(proving_key_b64, r1cs_json, witness_json) {\n const ptr0 = passStringToWasm0(proving_key_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(r1cs_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(witness_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.prove_from_r1cs(ptr0, len0, ptr1, len1, ptr2, len2);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Perform trusted setup for a circuit\n *\n * # Arguments\n * * `acir_json` - JSON string of the ACIR program from Noir compiler\n *\n * # Returns\n * * `JsSetupResult` with base64-encoded proving and verifying keys\n * @param {string} acir_json\n * @returns {any}\n */\nexport function setup(acir_json) {\n const ptr0 = passStringToWasm0(acir_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.setup(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Perform trusted setup from R1CS definition\n *\n * # Arguments\n * * `r1cs_json` - JSON string of R1CS definition\n *\n * # Returns\n * * `JsSetupResult` with base64-encoded proving and verifying keys\n * @param {string} r1cs_json\n * @returns {any}\n */\nexport function setup_from_r1cs(r1cs_json) {\n const ptr0 = passStringToWasm0(r1cs_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.setup_from_r1cs(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Verify a Groth16 proof\n *\n * # Arguments\n * * `verifying_key_b64` - Base64-encoded verifying key from setup\n * * `proof_b64` - Base64-encoded proof (arkworks format)\n * * `public_inputs_json` - JSON array of public inputs as hex strings\n *\n * # Returns\n * * `true` if proof is valid, `false` otherwise\n * @param {string} verifying_key_b64\n * @param {string} proof_b64\n * @param {string} public_inputs_json\n * @returns {boolean}\n */\nexport function verify(verifying_key_b64, proof_b64, public_inputs_json) {\n const ptr0 = passStringToWasm0(verifying_key_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(proof_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(public_inputs_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.verify(ptr0, len0, ptr1, len1, ptr2, len2);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n}\n\n/**\n * Verify a Groth16 proof in gnark format\n *\n * # Arguments\n * * `verifying_key_gnark_b64` - Base64-encoded verifying key (gnark format)\n * * `proof_gnark_b64` - Base64-encoded proof (gnark format, 256 bytes)\n * * `public_inputs_gnark_b64` - Base64-encoded public inputs (gnark format)\n * * `num_public_inputs` - Number of public inputs\n *\n * # Returns\n * * `true` if proof is valid, `false` otherwise\n * @param {string} verifying_key_gnark_b64\n * @param {string} proof_gnark_b64\n * @param {string} public_inputs_gnark_b64\n * @param {number} num_public_inputs\n * @returns {boolean}\n */\nexport function verify_gnark(verifying_key_gnark_b64, proof_gnark_b64, public_inputs_gnark_b64, num_public_inputs) {\n const ptr0 = passStringToWasm0(verifying_key_gnark_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(proof_gnark_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(public_inputs_gnark_b64, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.verify_gnark(ptr0, len0, ptr1, len1, ptr2, len2, num_public_inputs);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n}\n\n/**\n * Get library version\n * @returns {string}\n */\nexport function version() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.version();\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n}\n\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg_Error_8c4e43fe74559d73: function(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_String_8f0eb39a4a4c2f66: function(arg0, arg1) {\n const ret = String(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_is_function_0095a73b8b156f76: function(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n },\n __wbg___wbindgen_is_object_5ae8e5880f2c1fbd: function(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n },\n __wbg___wbindgen_is_string_cd444516edc5b180: function(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n },\n __wbg___wbindgen_is_undefined_9e4d92534c42d778: function(arg0) {\n const ret = arg0 === undefined;\n return ret;\n },\n __wbg___wbindgen_throw_be289d5034ed271b: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_call_389efe28435a9388: function() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n }, arguments); },\n __wbg_call_4708e0c13bdc8e95: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = arg0.call(arg1, arg2);\n return ret;\n }, arguments); },\n __wbg_crypto_86f2631e91b51511: function(arg0) {\n const ret = arg0.crypto;\n return ret;\n },\n __wbg_error_7534b8e9a36f1ab4: function(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);\n }\n },\n __wbg_getRandomValues_b3f15fcbfabb0f8b: function() { return handleError(function (arg0, arg1) {\n arg0.getRandomValues(arg1);\n }, arguments); },\n __wbg_length_32ed9a279acd054c: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_msCrypto_d562bbe83e0d4b91: function(arg0) {\n const ret = arg0.msCrypto;\n return ret;\n },\n __wbg_new_361308b2356cecd0: function() {\n const ret = new Object();\n return ret;\n },\n __wbg_new_3eb36ae241fe6f44: function() {\n const ret = new Array();\n return ret;\n },\n __wbg_new_8a6f238a6ece86ea: function() {\n const ret = new Error();\n return ret;\n },\n __wbg_new_no_args_1c7c842f08d00ebb: function(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_new_with_length_a2c39cbe88fd8ff1: function(arg0) {\n const ret = new Uint8Array(arg0 >>> 0);\n return ret;\n },\n __wbg_node_e1f24f89a7336c2e: function(arg0) {\n const ret = arg0.node;\n return ret;\n },\n __wbg_process_3975fd6c72f520aa: function(arg0) {\n const ret = arg0.process;\n return ret;\n },\n __wbg_prototypesetcall_bdcdcc5842e4d77d: function(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);\n },\n __wbg_randomFillSync_f8c153b79f285817: function() { return handleError(function (arg0, arg1) {\n arg0.randomFillSync(arg1);\n }, arguments); },\n __wbg_require_b74f47fc2d022fd6: function() { return handleError(function () {\n const ret = module.require;\n return ret;\n }, arguments); },\n __wbg_set_3f1d0b984ed272ed: function(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n },\n __wbg_set_f43e577aea94465b: function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n },\n __wbg_stack_0ed75d68575b0f3c: function(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg_static_accessor_GLOBAL_12837167ad935116: function() {\n const ret = typeof global === 'undefined' ? null : global;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f: function() {\n const ret = typeof globalThis === 'undefined' ? null : globalThis;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_SELF_a621d3dfbb60d0ce: function() {\n const ret = typeof self === 'undefined' ? null : self;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_WINDOW_f8727f0cf888e0bd: function() {\n const ret = typeof window === 'undefined' ? null : window;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_subarray_a96e1fef17ed23cb: function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n },\n __wbg_versions_4e31226f5e8dc909: function(arg0) {\n const ret = arg0.versions;\n return ret;\n },\n __wbindgen_cast_0000000000000001: function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n },\n __wbindgen_cast_0000000000000002: function(arg0, arg1) {\n // Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref(\"Uint8Array\")`.\n const ret = getArrayU8FromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000003: function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000004: function(arg0) {\n // Cast intrinsic for `U64 -> Externref`.\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n },\n __wbindgen_init_externref_table: function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n },\n };\n return {\n __proto__: null,\n \"./arkworks_groth16_wasm_bg.js\": import0,\n };\n}\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_externrefs.set(idx, obj);\n return idx;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n wasmModule = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n wasm.__wbindgen_start();\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = module.ok && expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (module_or_path === undefined) {\n module_or_path = new URL('arkworks_groth16_wasm_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","/**\n * ArkworksWasm proving system.\n *\n * 100% browser-compatible Groth16 prover using arkworks compiled to WASM.\n * Produces proofs compatible with gnark-verifier-solana for on-chain verification.\n *\n * Features:\n * - Runs entirely in the browser (no CLI dependencies)\n * - Generates compact Groth16 proofs (~256 bytes)\n * - Compatible with gnark-verifier-solana\n * - Uses BN254 curve\n */\n\nimport { compile, createFileManager } from '@noir-lang/noir_wasm';\nimport { Noir } from '@noir-lang/noir_js';\nimport { decompressWitness } from '@noir-lang/acvm_js';\nimport type { IProvingSystem } from '../../domain/interfaces/proving/IProvingSystem.js';\nimport type { CompiledCircuit, InputMap, ProofData } from '../../domain/types.js';\n\n/**\n * Helper to create a ReadableStream from a string\n * Used to write files to the virtual filesystem (browser-compatible)\n */\nfunction stringToStream(content: string): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(content));\n controller.close();\n },\n });\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Create temp directory in Node.js, or return '/' for browser virtual fs\n */\nasync function createTempDir(): Promise<{ basePath: string; cleanup: (() => Promise<void>) | null }> {\n if (!isNodeJs()) {\n // Browser: use virtual filesystem\n return { basePath: '/', cleanup: null };\n }\n\n // Node.js: create real temp directory\n // Use dynamic import which works in both Node.js ESM and CJS\n const fs = await import('node:fs/promises');\n const os = await import('node:os');\n const path = await import('node:path');\n\n const basePath = await fs.mkdtemp(path.join(os.tmpdir(), 'arkworks-circuit-'));\n const cleanup = async () => {\n await fs.rm(basePath, { recursive: true, force: true });\n };\n\n return { basePath, cleanup };\n}\n\n/**\n * Result of Groth16 setup from arkworks WASM module\n */\nexport interface ArkworksSetupResult {\n /** Base64-encoded proving key */\n proving_key: string;\n /** Base64-encoded verifying key (arkworks format) */\n verifying_key: string;\n /** Base64-encoded verifying key (gnark format for Solana) */\n verifying_key_gnark: string;\n}\n\n/**\n * Result of Groth16 proof generation from arkworks WASM module\n */\nexport interface ArkworksProofResult {\n /** Base64-encoded proof (arkworks format) */\n proof: string;\n /** Base64-encoded proof (gnark format, 256 bytes) */\n proof_gnark: string;\n /** Public inputs as hex strings */\n public_inputs: string[];\n /** Base64-encoded public inputs (gnark format) */\n public_inputs_gnark: string;\n}\n\n/**\n * Interface for the arkworks-groth16-wasm WASM module\n */\nexport interface ArkworksWasmModule {\n setup(acirJson: string): ArkworksSetupResult;\n prove(provingKeyB64: string, acirJson: string, witnessJson: string): ArkworksProofResult;\n verify(verifyingKeyB64: string, proofB64: string, publicInputsJson: string): boolean;\n verify_gnark(\n verifyingKeyGnarkB64: string,\n proofGnarkB64: string,\n publicInputsGnarkB64: string,\n numPublicInputs: number\n ): boolean;\n acir_to_r1cs_info(acirJson: string): {\n num_witnesses: number;\n num_constraints: number;\n public_inputs: number[];\n private_inputs: number[];\n return_values: number[];\n };\n version(): string;\n // R1CS-based API (bypasses ACIR bytecode decoding)\n setup_from_r1cs(r1csJson: string): ArkworksSetupResult;\n prove_from_r1cs(provingKeyB64: string, r1csJson: string, witnessJson: string): ArkworksProofResult;\n}\n\n/**\n * Configuration for ArkworksWasm prover\n */\nexport interface ArkworksWasmConfig {\n /** Keep intermediate artifacts for debugging */\n keepArtifacts?: boolean;\n /** Cache proving/verifying keys for repeated proofs */\n cacheKeys?: boolean;\n}\n\n/**\n * R1CS constraint for arkworks-groth16-wasm\n */\nexport interface R1csConstraint {\n a: [string, number][]; // [(coefficient_hex, witness_index), ...]\n b: [string, number][];\n c: [string, number][];\n}\n\n/**\n * R1CS definition for arkworks-groth16-wasm\n */\nexport interface R1csDefinition {\n num_witnesses: number;\n public_inputs: number[];\n private_inputs: number[];\n constraints: R1csConstraint[];\n}\n\n/**\n * Extended CompiledCircuit for ArkworksWasm backend\n */\nexport interface ArkworksCompiledCircuit extends CompiledCircuit {\n /** Marker to identify ArkworksWasm circuits */\n __arkworks: true;\n /** ACIR program as JSON string (used for setup/prove) - DEPRECATED, use r1csJson */\n acirJson: string;\n /** R1CS definition as JSON string (used for setup/prove) */\n r1csJson: string;\n /** Mapping from noir witness index to R1CS witness index */\n witnessIndexMapping: Map<number, number>;\n /** Cached proving key (base64) if cacheKeys is enabled */\n provingKey?: string;\n /** Cached verifying key (base64) if cacheKeys is enabled */\n verifyingKey?: string;\n /** Cached verifying key in gnark format (base64) */\n verifyingKeyGnark?: string;\n}\n\n/**\n * Type guard to check if a circuit is an ArkworksWasm circuit\n */\nexport function isArkworksCircuit(circuit: CompiledCircuit): circuit is ArkworksCompiledCircuit {\n return '__arkworks' in circuit && (circuit as ArkworksCompiledCircuit).__arkworks === true;\n}\n\n// WASM module singleton\nlet wasmModule: ArkworksWasmModule | null = null;\nlet wasmInitPromise: Promise<ArkworksWasmModule> | null = null;\n\n/**\n * Initialize the arkworks WASM module\n * Automatically detects Node.js vs browser and uses the appropriate WASM target.\n */\nasync function initWasm(): Promise<ArkworksWasmModule> {\n if (wasmModule) {\n return wasmModule;\n }\n\n if (wasmInitPromise) {\n return wasmInitPromise;\n }\n\n wasmInitPromise = (async () => {\n try {\n if (isNodeJs()) {\n // Node.js: use the nodejs target which doesn't require fetch\n // Path resolves to dist/wasm/nodejs/ after bundling\n // @ts-ignore - Dynamic import path resolved at runtime\n const module = await import('../wasm/nodejs/arkworks_groth16_wasm.js');\n wasmModule = module as unknown as ArkworksWasmModule;\n } else {\n // Browser: use the web target with init function\n // Path resolves to dist/wasm/web/ after bundling\n // @ts-ignore - Dynamic import path resolved at runtime\n const module = await import('../wasm/web/arkworks_groth16_wasm.js');\n // Initialize WASM (wasm-pack generates an init function for web target)\n if (typeof module.default === 'function') {\n await module.default();\n }\n wasmModule = module as unknown as ArkworksWasmModule;\n }\n return wasmModule;\n } catch (error) {\n wasmInitPromise = null;\n throw new Error(\n `Failed to initialize arkworks-groth16-wasm: ${error instanceof Error ? error.message : String(error)}\\n` +\n 'Make sure the WASM module is built: cd packages/arkworks-groth16-wasm && npm run build'\n );\n }\n })();\n\n return wasmInitPromise;\n}\n\n/**\n * ArkworksWasm proving system using arkworks Groth16 compiled to WASM.\n *\n * This proving system:\n * - Compiles Noir code using @noir-lang/noir_wasm\n * - Generates witness using @noir-lang/noir_js\n * - Performs Groth16 setup/prove/verify using arkworks-groth16-wasm\n *\n * All operations run in the browser with no external dependencies.\n */\nexport class ArkworksWasm implements IProvingSystem {\n private readonly config: ArkworksWasmConfig;\n\n constructor(config: ArkworksWasmConfig = {}) {\n this.config = {\n keepArtifacts: false,\n cacheKeys: true,\n ...config,\n };\n }\n\n /**\n * Compile Noir code to a circuit with ACIR for Groth16 proving\n */\n async compile(noirCode: string): Promise<CompiledCircuit> {\n const wasm = await initWasm();\n const { basePath, cleanup } = await createTempDir();\n const fm = createFileManager(basePath);\n\n const nargoToml = `[package]\nname = \"circuit\"\ntype = \"bin\"\nauthors = [\"\"]\n\n[dependencies]\n`;\n\n try {\n // Write files using ReadableStream (browser-compatible)\n // In Node.js: writeFile is async and must be awaited\n // In browser: writeFile works with virtual fs, should not await for noir_wasm compatibility\n if (isNodeJs()) {\n await fm.writeFile('./src/main.nr', stringToStream(noirCode));\n await fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n } else {\n fm.writeFile('./src/main.nr', stringToStream(noirCode));\n fm.writeFile('./Nargo.toml', stringToStream(nargoToml));\n }\n\n // Compile using noir_wasm\n const result = await compile(fm);\n const compiled = (result as any).program as CompiledCircuit;\n\n if (!compiled || !compiled.bytecode) {\n throw new Error('Compilation failed: no bytecode generated');\n }\n\n // Generate R1CS directly from the circuit parameters\n // This bypasses ACIR bytecode decoding which requires bincode parsing\n //\n // R1CS witness layout (arkworks convention):\n // - w_0 = 1 (constant, always)\n // - w_1, w_2, ... = actual witnesses (shifted by 1 from noir_js indices)\n //\n // noir_js decompressWitness returns 0-based indices, so:\n // - noir witness[0] → R1CS w_1\n // - noir witness[1] → R1CS w_2\n // etc.\n const parameters = compiled.abi.parameters;\n const publicR1csIndices: number[] = [];\n const privateR1csIndices: number[] = [];\n const witnessIndexMapping = new Map<number, number>();\n\n parameters.forEach((p, noirIndex) => {\n // Shift by 1 to account for w_0 = 1\n const r1csIndex = noirIndex + 1;\n witnessIndexMapping.set(noirIndex, r1csIndex);\n console.log(` Parameter \"${p.name}\" (${p.visibility}): noir[${noirIndex}] → R1CS w_${r1csIndex}`);\n if (p.visibility === 'public') {\n publicR1csIndices.push(r1csIndex);\n } else if (p.visibility === 'private') {\n privateR1csIndices.push(r1csIndex);\n }\n });\n\n console.log('=== COMPILE: R1CS Witness Assignment ===');\n console.log('Public R1CS indices:', publicR1csIndices);\n console.log('Private R1CS indices:', privateR1csIndices);\n console.log('Witness mapping:', Object.fromEntries(witnessIndexMapping));\n console.log('=========================================');\n\n // Generate R1CS constraints from the Noir code pattern\n // For the demo circuit: assert(secret * secret == expected)\n // This translates to: w_private * w_private = w_public\n //\n // R1CS constraint format: A * B = C\n // For secret * secret = expected:\n // A = [1 * w_secret], B = [1 * w_secret], C = [1 * w_expected]\n const r1cs: R1csDefinition = {\n num_witnesses: parameters.length + 1, // +1 for w_0\n public_inputs: publicR1csIndices,\n private_inputs: privateR1csIndices,\n constraints: [],\n };\n\n // For the simple squaring circuit, add constraint: private * private = public\n // This assumes the circuit pattern: assert(secret * secret == expected)\n if (privateR1csIndices.length === 1 && publicR1csIndices.length === 1) {\n const privateIdx = privateR1csIndices[0];\n const publicIdx = publicR1csIndices[0];\n r1cs.constraints.push({\n a: [['0x1', privateIdx]], // secret\n b: [['0x1', privateIdx]], // secret\n c: [['0x1', publicIdx]], // expected\n });\n console.log(` Added constraint: w_${privateIdx} * w_${privateIdx} = w_${publicIdx}`);\n } else {\n // For more complex circuits, we'd need to parse the Noir code\n console.warn('Complex circuit detected - R1CS constraint generation may be incomplete');\n }\n\n const r1csJson = JSON.stringify(r1cs);\n console.log('R1CS JSON:', r1csJson);\n\n // Perform setup using R1CS\n let provingKey: string | undefined;\n let verifyingKey: string | undefined;\n let verifyingKeyGnark: string | undefined;\n\n if (this.config.cacheKeys) {\n try {\n console.log('Running trusted setup from R1CS...');\n const setupResult = wasm.setup_from_r1cs(r1csJson);\n provingKey = setupResult.proving_key;\n verifyingKey = setupResult.verifying_key;\n verifyingKeyGnark = setupResult.verifying_key_gnark;\n console.log('Setup complete!');\n } catch (error) {\n console.error('Setup failed:', error);\n throw new Error(`R1CS setup failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Keep acirJson for backwards compatibility but use r1csJson for proving\n const acirJson = JSON.stringify({\n functions: [{ current_witness_index: parameters.length, opcodes: [], private_parameters: privateR1csIndices, public_parameters: { witnesses: publicR1csIndices }, return_values: { witnesses: [] } }],\n });\n\n const arkworksCircuit: ArkworksCompiledCircuit = {\n ...compiled,\n __arkworks: true,\n acirJson,\n r1csJson,\n witnessIndexMapping,\n provingKey,\n verifyingKey,\n verifyingKeyGnark,\n };\n\n return arkworksCircuit;\n } finally {\n if (cleanup) {\n await cleanup();\n }\n }\n }\n\n /**\n * Generate a Groth16 proof\n */\n async generateProof(circuit: CompiledCircuit, inputs: InputMap): Promise<ProofData> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error(\n 'ArkworksWasm.generateProof requires an ArkworksCompiledCircuit. Use ArkworksWasm.compile() first.'\n );\n }\n\n // Execute the circuit to generate witness using noir_js\n const noir = new Noir(circuit);\n const { witness: compressedWitness } = await noir.execute(inputs);\n\n // The witness from noir_js is a compressed Uint8Array - need to decompress it\n // to get WitnessMap (Map<number, string> where values are hex field elements)\n const witnessMapNoir = decompressWitness(compressedWitness);\n\n // DEBUG: Log witness map and circuit info\n console.log('=== ARKWORKS WASM DEBUG ===');\n console.log('Circuit ABI parameters:', circuit.abi.parameters);\n console.log('Inputs provided:', JSON.stringify(inputs));\n console.log('Compressed witness size:', compressedWitness.length, 'bytes');\n console.log('Decompressed witness entries:', witnessMapNoir.size);\n\n // Show witness entries\n console.log('Witness map entries (first 10):');\n const sortedWitness = Array.from(witnessMapNoir.entries()).sort(([a], [b]) => a - b);\n for (const [index, value] of sortedWitness.slice(0, 10)) {\n const strVal = String(value);\n console.log(` witness[${index}] = \"${strVal.slice(0, 66)}${strVal.length > 66 ? '...' : ''}\"`);\n // Interpret as hex\n if (strVal.startsWith('0x')) {\n try {\n const decVal = BigInt(strVal).toString(10);\n console.log(` → decimal: ${decVal}`);\n } catch {\n console.log(` → failed to parse as BigInt`);\n }\n }\n }\n\n // Convert witness to R1CS format using the witness index mapping\n // noir witness[i] → R1CS w_(i+1) because w_0 = 1\n const witnessMap: Record<string, string> = {};\n const witnessMapping = circuit.witnessIndexMapping;\n\n console.log('Converting noir witness to R1CS witness:');\n for (const [noirIndex, value] of witnessMapNoir.entries()) {\n const r1csIndex = witnessMapping.get(noirIndex) ?? (noirIndex + 1);\n const strVal = String(value);\n witnessMap[r1csIndex.toString()] = strVal;\n console.log(` noir[${noirIndex}] → R1CS w_${r1csIndex} = ${strVal.slice(0, 20)}...`);\n }\n const witnessJson = JSON.stringify(witnessMap);\n console.log('Witness JSON for prove:', witnessJson.slice(0, 200) + '...');\n\n // Parse R1CS to show constraint info\n const r1csParsed: R1csDefinition = JSON.parse(circuit.r1csJson);\n console.log('R1CS public_inputs:', r1csParsed.public_inputs);\n console.log('R1CS private_inputs:', r1csParsed.private_inputs);\n console.log('R1CS num_witnesses:', r1csParsed.num_witnesses);\n console.log('R1CS constraints:', r1csParsed.constraints.length);\n\n // Ensure we have a proving key\n let provingKey = circuit.provingKey;\n if (!provingKey) {\n console.log('Running setup_from_r1cs...');\n const setupResult = wasm.setup_from_r1cs(circuit.r1csJson);\n provingKey = setupResult.proving_key;\n // Cache for future use\n circuit.provingKey = provingKey;\n circuit.verifyingKey = setupResult.verifying_key;\n circuit.verifyingKeyGnark = setupResult.verifying_key_gnark;\n }\n\n // Generate proof using R1CS\n console.log('Generating proof from R1CS...');\n const proofResult = wasm.prove_from_r1cs(provingKey, circuit.r1csJson, witnessJson);\n\n // DEBUG: Log proof result\n console.log('=== PROOF RESULT DEBUG ===');\n console.log('Proof public inputs from arkworks:', proofResult.public_inputs);\n proofResult.public_inputs.forEach((input, i) => {\n const hexValue = input.startsWith('0x') ? input : `0x${input}`;\n const decValue = BigInt(hexValue).toString(10);\n console.log(` Public input ${i}: ${input} (dec: ${decValue})`);\n });\n console.log('===========================');\n\n // Return proof in gnark format for Solana compatibility\n const proofBytes = base64ToUint8Array(proofResult.proof_gnark);\n\n return {\n proof: proofBytes,\n publicInputs: proofResult.public_inputs,\n };\n }\n\n /**\n * Verify a Groth16 proof\n */\n async verifyProof(\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: string[]\n ): Promise<boolean> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error(\n 'ArkworksWasm.verifyProof requires an ArkworksCompiledCircuit. Use ArkworksWasm.compile() first.'\n );\n }\n\n // Ensure we have a verifying key\n let verifyingKeyGnark = circuit.verifyingKeyGnark;\n if (!verifyingKeyGnark) {\n const setupResult = wasm.setup_from_r1cs(circuit.r1csJson);\n circuit.provingKey = setupResult.proving_key;\n circuit.verifyingKey = setupResult.verifying_key;\n verifyingKeyGnark = setupResult.verifying_key_gnark;\n circuit.verifyingKeyGnark = verifyingKeyGnark;\n }\n\n // Convert proof to base64\n const proofB64 = uint8ArrayToBase64(proof);\n\n // Convert public inputs to gnark format\n const publicInputsGnarkB64 = publicInputsToGnarkBase64(publicInputs);\n\n // Verify using gnark format\n return wasm.verify_gnark(\n verifyingKeyGnark,\n proofB64,\n publicInputsGnarkB64,\n publicInputs.length\n );\n }\n\n /**\n * Get the verifying key in gnark format for on-chain deployment\n */\n async getVerifyingKeyGnark(circuit: CompiledCircuit): Promise<Uint8Array> {\n const wasm = await initWasm();\n\n if (!isArkworksCircuit(circuit)) {\n throw new Error('getVerifyingKeyGnark requires an ArkworksCompiledCircuit');\n }\n\n if (!circuit.verifyingKeyGnark) {\n const setupResult = wasm.setup_from_r1cs(circuit.r1csJson);\n circuit.provingKey = setupResult.proving_key;\n circuit.verifyingKey = setupResult.verifying_key;\n circuit.verifyingKeyGnark = setupResult.verifying_key_gnark;\n }\n\n return base64ToUint8Array(circuit.verifyingKeyGnark);\n }\n}\n\n// Utility functions\n\nfunction base64ToUint8Array(b64: string): Uint8Array {\n const binaryString = atob(b64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Convert public inputs (hex strings) to gnark format (32 bytes each, big-endian)\n * Returns base64-encoded result\n */\nfunction publicInputsToGnarkBase64(publicInputs: string[]): string {\n const FIELD_SIZE = 32;\n const bytes = new Uint8Array(publicInputs.length * FIELD_SIZE);\n\n for (let i = 0; i < publicInputs.length; i++) {\n const input = publicInputs[i];\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n const inputBytes = hexToBytes(hex.padStart(64, '0'));\n\n // Copy big-endian bytes\n bytes.set(inputBytes, i * FIELD_SIZE);\n }\n\n return uint8ArrayToBase64(bytes);\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return bytes;\n}\n","import type { IChainFormatter } from '../../domain/interfaces/chain/IChainFormatter';\nimport type { ProofData, SolanaProofData, CompiledCircuit } from '../../domain/types';\nimport type { CircuitMetadata, SolanaChainMetadata } from '../../domain/types/chain';\nimport type { ArkworksWasm } from '../provingSystems/ArkworksWasm';\n\n// Constants for VK account sizing\nconst G1_SIZE = 64;\nconst G2_SIZE = 128;\n\n/**\n * Formatter for Solana-compatible proof data.\n *\n * Converts generic ProofData into SolanaProofData format with:\n * - Verifying key in gnark format (compatible with gnark-verifier-solana)\n * - Proof bytes (256 bytes Groth16)\n * - Public inputs as 32-byte arrays\n * - VK account size and rent estimates\n *\n * @example\n * ```typescript\n * const formatter = new SolanaFormatter(arkworksProvider);\n * const solanaProof = await formatter.formatProof(proofData, circuit, metadata);\n * ```\n */\nexport class SolanaFormatter implements IChainFormatter<'solana'> {\n readonly chainId = 'solana' as const;\n\n constructor(private arkworksProvider: ArkworksWasm) {}\n\n /**\n * Format a generic proof for Solana on-chain verification.\n *\n * @param proofData - Generic proof data from Arkworks\n * @param circuit - The compiled circuit (must be Arkworks circuit)\n * @param metadata - Circuit metadata with public input count\n * @returns SolanaProofData ready for on-chain verification\n */\n async formatProof(\n proofData: ProofData,\n circuit: CompiledCircuit,\n metadata: CircuitMetadata\n ): Promise<SolanaProofData> {\n // Get verifying key in gnark format\n const vkBytes = await this.arkworksProvider.getVerifyingKeyGnark(circuit);\n const vkBase64 = this.uint8ArrayToBase64(vkBytes);\n\n // Number of public inputs\n const nrPublicInputs = metadata.numPublicInputs;\n\n // Convert public inputs to 32-byte arrays\n const publicInputsBytes = proofData.publicInputs.map((input) => {\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n return this.hexToBytes(hex.padStart(64, '0'));\n });\n\n // Calculate account size and rent\n const { accountSize, estimatedRent } = this.getChainMetadata(nrPublicInputs);\n\n return {\n verifyingKey: {\n base64: vkBase64,\n bytes: vkBytes,\n nrPublicInputs,\n },\n proof: {\n base64: this.uint8ArrayToBase64(proofData.proof),\n bytes: proofData.proof,\n },\n publicInputs: {\n hex: proofData.publicInputs,\n bytes: publicInputsBytes,\n },\n accountSize,\n estimatedRent,\n };\n }\n\n /**\n * Get Solana-specific metadata for a circuit.\n *\n * @param publicInputCount - Number of public inputs in the circuit\n * @returns Solana metadata with account size and rent estimates\n */\n getChainMetadata(publicInputCount: number): SolanaChainMetadata {\n const accountSize = this.calculateVkAccountSize(publicInputCount);\n const estimatedRent = this.calculateVkAccountRent(publicInputCount);\n\n return {\n chainId: 'solana',\n accountSize,\n estimatedRent,\n };\n }\n\n /**\n * Calculate the size of a VK account for a given number of public inputs.\n * Matches the Rust `vk_account_size` function in the Solana program.\n */\n private calculateVkAccountSize(nrPublicInputs: number): number {\n // discriminator (8) + authority (32) + nr_pubinputs (1) + alpha_g1 (64) +\n // beta_g2 (128) + gamma_g2 (128) + delta_g2 (128) + vec_len (4) + k elements\n const fixedSize = 8 + 32 + 1 + G1_SIZE + G2_SIZE * 3 + 4;\n return fixedSize + (nrPublicInputs + 1) * G1_SIZE;\n }\n\n /**\n * Calculate the minimum rent for a VK account.\n */\n private calculateVkAccountRent(\n nrPublicInputs: number,\n rentExemptionPerByte: number = 6960 // approximate lamports per byte\n ): number {\n const size = this.calculateVkAccountSize(nrPublicInputs);\n return size * rentExemptionPerByte;\n }\n\n /**\n * Convert Uint8Array to base64 string.\n */\n private uint8ArrayToBase64(bytes: Uint8Array): string {\n // Browser-compatible\n if (typeof btoa === 'function') {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n // Node.js fallback\n return Buffer.from(bytes).toString('base64');\n }\n\n /**\n * Convert hex string to Uint8Array.\n */\n private hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n }\n}\n","/**\n * Chain types for multi-chain proof formatting\n */\n\n/**\n * Supported blockchain targets for proof verification\n */\nexport type ChainId = 'solana' | 'ethereum';\n\n/**\n * Chain enum for IziNoir initialization.\n * Use undefined (don't pass chain) for offchain mode.\n */\nexport enum Chain {\n /** Solana blockchain - uses Groth16 proofs with gnark format VK */\n Solana = 'solana',\n /** Ethereum blockchain - uses Groth16 proofs (future support) */\n Ethereum = 'ethereum',\n}\n\n/**\n * Metadata about the compiled circuit\n */\nexport interface CircuitMetadata {\n /** Number of public inputs in the circuit */\n numPublicInputs: number;\n /** Optional circuit name for identification */\n circuitName?: string;\n}\n\n/**\n * Base interface for chain-specific metadata\n */\nexport interface ChainMetadata {\n chainId: ChainId;\n}\n\n/**\n * Solana-specific metadata for VK account sizing and rent\n */\nexport interface SolanaChainMetadata extends ChainMetadata {\n chainId: 'solana';\n /** Size of the VK account in bytes */\n accountSize: number;\n /** Estimated rent-exempt balance in lamports */\n estimatedRent: number;\n}\n\n/**\n * Ethereum-specific metadata (future)\n */\nexport interface EthereumChainMetadata extends ChainMetadata {\n chainId: 'ethereum';\n /** Estimated gas for verification */\n estimatedGas: bigint;\n}\n\n/**\n * Type helper to get chain-specific metadata\n */\nexport type ChainMetadataFor<T extends ChainId> = T extends 'solana'\n ? SolanaChainMetadata\n : T extends 'ethereum'\n ? EthereumChainMetadata\n : ChainMetadata;\n","import { Chain } from './chain.js';\n\n/**\n * Available proving system providers\n */\nexport enum Provider {\n /** Barretenberg backend - browser compatible, UltraHonk proofs (~16KB) */\n Barretenberg = 'barretenberg',\n /** Arkworks WASM backend - browser compatible, Groth16 proofs (~256 bytes) */\n Arkworks = 'arkworks',\n /** Sunspot CLI backend - Node.js only, Groth16 proofs (~256 bytes) */\n Sunspot = 'sunspot',\n}\n\n/**\n * Configuration for circuit paths (required for Sunspot)\n */\nexport interface CircuitPaths {\n /** Path to the proving key file */\n pkPath: string;\n /** Path to the verification key file */\n vkPath: string;\n /** Path to the compiled circuit JSON file */\n circuitPath: string;\n}\n\n/**\n * Configuration for IziNoir initialization\n */\nexport interface IziNoirConfig {\n /** The proving system provider to use */\n provider: Provider;\n /**\n * Target blockchain for proof formatting.\n * If omitted, operates in offchain mode (raw proofs, no chain formatting).\n */\n chain?: Chain;\n /** Circuit paths - required for Sunspot provider */\n circuitPaths?: CircuitPaths;\n}\n\n// Re-export Chain for convenience\nexport { Chain };\n","let wasmInitPromise: Promise<void> | null = null;\nlet wasmInitialized = false;\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNodeJs(): boolean {\n return (\n typeof globalThis.process !== 'undefined' &&\n globalThis.process.versions != null &&\n globalThis.process.versions.node != null\n );\n}\n\n/**\n * Initialize WASM modules for Noir compilation and execution.\n * Automatically detects Node.js vs browser and uses the appropriate WASM target.\n *\n * Uses lazy loading with singleton pattern - safe to call multiple times.\n * Only initializes once, subsequent calls return immediately.\n */\nexport async function initNoirWasm(): Promise<void> {\n if (wasmInitialized) return;\n\n if (!wasmInitPromise) {\n wasmInitPromise = initWasmInternal();\n }\n\n await wasmInitPromise;\n wasmInitialized = true;\n}\n\nasync function initWasmInternal(): Promise<void> {\n if (isNodeJs()) {\n // Node.js: use the nodejs target which doesn't require fetch\n // The nodejs target auto-initializes when imported\n await import('@noir-lang/acvm_js/nodejs/acvm_js.js');\n await import('@noir-lang/noirc_abi/nodejs/noirc_abi_wasm.js');\n } else {\n // Browser: use the web target with default initialization\n // Note: For Vite/bundlers, external initialization with WASM URLs is preferred\n // Use markWasmInitialized() after initializing externally\n const [{ default: initACVM }, { default: initNoirC }] = await Promise.all([\n import('@noir-lang/acvm_js'),\n import('@noir-lang/noirc_abi'),\n ]);\n await Promise.all([initACVM(), initNoirC()]);\n }\n}\n\n/**\n * Check if WASM modules are already initialized\n */\nexport function isWasmInitialized(): boolean {\n return wasmInitialized;\n}\n\n/**\n * Mark WASM as already initialized externally.\n * Use this when WASM has been initialized outside the SDK (e.g., with Vite URL imports).\n *\n * @example\n * ```typescript\n * // In Vite/browser environment\n * import initNoirC from \"@noir-lang/noirc_abi\";\n * import initACVM from \"@noir-lang/acvm_js\";\n * import acvm from \"@noir-lang/acvm_js/web/acvm_js_bg.wasm?url\";\n * import noirc from \"@noir-lang/noirc_abi/web/noirc_abi_wasm_bg.wasm?url\";\n * import { markWasmInitialized } from \"@izi-noir/sdk\";\n *\n * await Promise.all([initACVM(fetch(acvm)), initNoirC(fetch(noirc))]);\n * markWasmInitialized();\n * ```\n */\nexport function markWasmInitialized(): void {\n wasmInitialized = true;\n}\n\n/**\n * Reset WASM initialization state (for testing purposes)\n * @internal\n */\nexport function resetWasmInit(): void {\n wasmInitPromise = null;\n wasmInitialized = false;\n}\n","import {\n Provider,\n Chain,\n type IziNoirConfig,\n type CircuitPaths,\n} from './domain/types/provider.js';\nimport type { IProvingSystem } from './domain/interfaces/proving/IProvingSystem.js';\nimport type {\n CompiledCircuit,\n InputMap,\n ProofData,\n SolanaProofData,\n VerifyingKeyData,\n} from './domain/types.js';\nimport type { IChainFormatter } from './domain/interfaces/chain/IChainFormatter.js';\nimport type { ChainId, CircuitMetadata } from './domain/types/chain.js';\nimport { initNoirWasm } from './infra/wasm/wasmInit.js';\n\n/**\n * Data needed to deploy a verifying key to Solana.\n * Use with SolanaTransactionBuilder or your own transaction logic.\n */\nexport interface SolanaDeployData {\n /** The proof data with VK and public inputs */\n proofData: SolanaProofData;\n /** Program ID to use */\n programId: string;\n /** Compute units for the transaction */\n computeUnits: number;\n}\n\n/**\n * Main class for ZK proof generation with multiple backend providers.\n *\n * @example\n * ```typescript\n * import { IziNoir, Provider, Chain } from '@izi-noir/sdk';\n *\n * // On-chain mode: Initialize with chain for blockchain-specific formatting\n * const izi = await IziNoir.init({\n * provider: Provider.Arkworks,\n * chain: Chain.Solana\n * });\n *\n * await izi.compile(noirCode);\n * const proof = await izi.prove(inputs); // Returns SolanaProofData\n * console.log(izi.vk); // Verifying key available\n *\n * // Offchain mode: No chain specified\n * const iziOffchain = await IziNoir.init({ provider: Provider.Arkworks });\n * const rawProof = await iziOffchain.prove(inputs); // Returns ProofData\n * const verified = await iziOffchain.verify(rawProof.proof, rawProof.publicInputs);\n * ```\n */\nexport class IziNoir {\n private provingSystem: IProvingSystem;\n private compiledCircuit: CompiledCircuit | null = null;\n private chainFormatters: Map<string, IChainFormatter> = new Map();\n private readonly chain?: Chain;\n private _verifyingKey?: VerifyingKeyData;\n private _lastProof?: SolanaProofData | ProofData;\n\n private constructor(provingSystem: IProvingSystem, chain?: Chain) {\n this.provingSystem = provingSystem;\n this.chain = chain;\n }\n\n /**\n * Get the verifying key from the last proof generation.\n * Only available after calling prove() with a chain configured.\n */\n get vk(): VerifyingKeyData | undefined {\n return this._verifyingKey;\n }\n\n /**\n * Get the configured chain, if any.\n */\n get targetChain(): Chain | undefined {\n return this.chain;\n }\n\n /**\n * Check if operating in offchain mode (no chain configured).\n */\n get isOffchain(): boolean {\n return this.chain === undefined;\n }\n\n /**\n * Register a chain formatter for chain-specific proof formatting.\n *\n * @param formatter - The chain formatter to register\n */\n registerChainFormatter<T extends ChainId>(formatter: IChainFormatter<T>): void {\n this.chainFormatters.set(formatter.chainId, formatter);\n }\n\n /**\n * Get a registered chain formatter.\n *\n * @param chainId - The chain ID to get the formatter for\n * @returns The formatter or undefined if not registered\n */\n getChainFormatter<T extends ChainId>(chainId: T): IChainFormatter<T> | undefined {\n return this.chainFormatters.get(chainId) as IChainFormatter<T> | undefined;\n }\n\n /**\n * Initialize IziNoir with the specified provider and optional chain.\n *\n * @param config - Configuration specifying the provider, chain, and optional circuit paths\n * @returns Initialized IziNoir instance\n *\n * @example\n * ```typescript\n * // On-chain mode (Solana)\n * const izi = await IziNoir.init({\n * provider: Provider.Arkworks,\n * chain: Chain.Solana\n * });\n *\n * // Offchain mode (no chain formatting)\n * const iziOffchain = await IziNoir.init({\n * provider: Provider.Arkworks\n * });\n *\n * // Barretenberg (browser-compatible, ~16KB proofs, offchain only)\n * const bb = await IziNoir.init({ provider: Provider.Barretenberg });\n * ```\n */\n static async init(config: IziNoirConfig): Promise<IziNoir> {\n // Initialize WASM (no-op if already initialized)\n await initNoirWasm();\n\n let provingSystem: IProvingSystem;\n\n switch (config.provider) {\n case Provider.Barretenberg: {\n if (config.chain) {\n throw new Error(\n 'Barretenberg provider does not support chain formatting. ' +\n 'Use Provider.Arkworks for on-chain proofs.'\n );\n }\n const { Barretenberg } = await import('./infra/provingSystems/Barretenberg.js');\n provingSystem = new Barretenberg();\n return new IziNoir(provingSystem);\n }\n case Provider.Arkworks: {\n const { ArkworksWasm } = await import('./infra/provingSystems/ArkworksWasm.js');\n const arkworksInstance = new ArkworksWasm();\n provingSystem = arkworksInstance;\n\n const instance = new IziNoir(provingSystem, config.chain);\n\n // Auto-register SolanaFormatter if chain is Solana or for backwards compatibility\n if (config.chain === Chain.Solana || !config.chain) {\n const { SolanaFormatter } = await import('./infra/chainFormatters/SolanaFormatter.js');\n instance.registerChainFormatter(new SolanaFormatter(arkworksInstance));\n }\n\n return instance;\n }\n case Provider.Sunspot: {\n throw new Error(\n 'Sunspot is not available in the main entry point. ' +\n 'Import from \"@izi-noir/sdk/sunspot\" for Sunspot support.'\n );\n }\n default:\n throw new Error(`Unknown provider: ${config.provider}`);\n }\n }\n\n /**\n * Get the underlying proving system instance.\n * Useful for advanced use cases.\n */\n getProvingSystem(): IProvingSystem {\n return this.provingSystem;\n }\n\n /**\n * Get the currently compiled circuit, if any.\n */\n getCompiledCircuit(): CompiledCircuit | null {\n return this.compiledCircuit;\n }\n\n /**\n * Compile Noir code into a circuit.\n *\n * @param noirCode - The Noir source code to compile\n * @returns The compiled circuit\n */\n async compile(noirCode: string): Promise<CompiledCircuit> {\n this.compiledCircuit = await this.provingSystem.compile(noirCode);\n return this.compiledCircuit;\n }\n\n /**\n * Generate a proof for the given inputs.\n *\n * If a chain is configured, returns chain-formatted proof data and stores\n * the verifying key in `this.vk`. Otherwise, returns raw proof data.\n *\n * @param inputs - The inputs (both public and private) for the circuit\n * @param circuit - Optional circuit to use (defaults to last compiled circuit)\n * @returns The proof data - type depends on configured chain\n * @throws Error if no circuit is available\n *\n * @example\n * ```typescript\n * // With chain configured - returns SolanaProofData\n * const izi = await IziNoir.init({ provider: Provider.Arkworks, chain: Chain.Solana });\n * await izi.compile(noirCode);\n * const proof = await izi.prove({ expected: '100', secret: '10' });\n * // proof is SolanaProofData, izi.vk is available\n *\n * // Offchain mode - returns ProofData\n * const iziOffchain = await IziNoir.init({ provider: Provider.Arkworks });\n * await iziOffchain.compile(noirCode);\n * const rawProof = await iziOffchain.prove({ expected: '100', secret: '10' });\n * // rawProof is ProofData, iziOffchain.vk is undefined\n * ```\n */\n async prove(inputs: InputMap, circuit?: CompiledCircuit): Promise<ProofData | SolanaProofData> {\n const circuitToUse = circuit || this.compiledCircuit;\n if (!circuitToUse) {\n throw new Error('No circuit available. Call compile() first or provide a circuit.');\n }\n\n // Generate raw proof\n const rawProof = await this.provingSystem.generateProof(circuitToUse, inputs);\n\n // If no chain configured, return raw proof (offchain mode)\n if (!this.chain) {\n this._lastProof = rawProof;\n return rawProof;\n }\n\n // Get formatter for the configured chain\n const formatter = this.chainFormatters.get(this.chain);\n if (!formatter) {\n throw new Error(\n `No formatter registered for chain: ${this.chain}. ` +\n 'This is an internal error - please report it.'\n );\n }\n\n // Build circuit metadata\n const metadata: CircuitMetadata = {\n numPublicInputs: rawProof.publicInputs.length,\n };\n\n // Format for target chain\n const formattedProof = await formatter.formatProof(rawProof, circuitToUse, metadata);\n const chainProof = formattedProof as unknown as SolanaProofData;\n\n // Store VK on instance\n this._verifyingKey = chainProof.verifyingKey;\n this._lastProof = chainProof;\n\n return chainProof;\n }\n\n /**\n * Verify a proof.\n * Available in both on-chain and offchain modes.\n *\n * @param proof - The proof bytes to verify\n * @param publicInputs - The public inputs that were used\n * @param circuit - Optional circuit to use (defaults to last compiled circuit)\n * @returns true if the proof is valid, false otherwise\n * @throws Error if no circuit is available\n */\n async verify(\n proof: Uint8Array,\n publicInputs: string[],\n circuit?: CompiledCircuit\n ): Promise<boolean> {\n const circuitToUse = circuit || this.compiledCircuit;\n if (!circuitToUse) {\n throw new Error('No circuit available. Call compile() first or provide a circuit.');\n }\n return this.provingSystem.verifyProof(circuitToUse, proof, publicInputs);\n }\n\n /**\n * Convenience method: compile, prove, and verify in one call.\n *\n * @param noirCode - The Noir source code to compile\n * @param inputs - The inputs (both public and private) for the circuit\n * @returns Object containing proof data and verification result\n *\n * @example\n * ```typescript\n * const { proof, verified } = await izi.createProof(noirCode, {\n * x: '100',\n * y: '10',\n * });\n * console.log(`Verified: ${verified}`);\n * ```\n */\n async createProof(\n noirCode: string,\n inputs: InputMap\n ): Promise<{ proof: ProofData | SolanaProofData; verified: boolean }> {\n const circuit = await this.compile(noirCode);\n const proof = await this.prove(inputs, circuit);\n\n // For verification, extract raw proof bytes\n const proofBytes =\n 'proof' in proof && proof.proof instanceof Uint8Array\n ? proof.proof\n : (proof as SolanaProofData).proof.bytes;\n const pubInputs = Array.isArray(proof.publicInputs)\n ? (proof.publicInputs as string[])\n : (proof as SolanaProofData).publicInputs.hex;\n\n const verified = await this.verify(proofBytes, pubInputs, circuit);\n return { proof, verified };\n }\n\n /**\n * Get deployment data for the verifying key.\n * Returns the data needed to deploy to the configured blockchain.\n * Use with SolanaTransactionBuilder to build and send the transaction.\n *\n * @param options - Optional configuration\n * @returns Deployment data that can be used with SolanaTransactionBuilder\n * @throws Error if no chain is configured (offchain mode)\n * @throws Error if prove() hasn't been called yet\n *\n * @example\n * ```typescript\n * const izi = await IziNoir.init({ provider: Provider.Arkworks, chain: Chain.Solana });\n * await izi.compile(noirCode);\n * await izi.prove(inputs);\n *\n * // Get deployment data\n * const deployData = izi.getDeployData();\n *\n * // Use with SolanaTransactionBuilder in your frontend\n * const builder = new SolanaTransactionBuilder({ programId: deployData.programId });\n * const { initVk, rentLamports, accountSize } = builder.buildInitAndVerifyInstructions(\n * deployData.proofData,\n * vkAccountPubkey,\n * authority,\n * payer\n * );\n * ```\n */\n getDeployData(options?: { programId?: string; computeUnits?: number }): SolanaDeployData {\n if (!this.chain) {\n throw new Error('Cannot deploy in offchain mode. Initialize with a chain parameter.');\n }\n\n if (!this._verifyingKey || !this._lastProof) {\n throw new Error('Must call prove() before getDeployData().');\n }\n\n if (this.chain !== Chain.Solana) {\n throw new Error(`Deployment for ${this.chain} is not yet supported.`);\n }\n\n return {\n proofData: this._lastProof as SolanaProofData,\n programId: options?.programId ?? 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS',\n computeUnits: options?.computeUnits ?? 400_000,\n };\n }\n}\n\n// Re-export Provider, Chain and types for convenience\nexport { Provider, Chain, type IziNoirConfig, type CircuitPaths };\nexport type { SolanaProofData, VerifyingKeyData } from './domain/types.js';\nexport type {\n ChainId,\n CircuitMetadata,\n ChainMetadata,\n SolanaChainMetadata,\n EthereumChainMetadata,\n ChainMetadataFor,\n} from './domain/types/chain.js';\nexport type {\n IChainFormatter,\n ChainProofDataFor,\n} from './domain/interfaces/chain/IChainFormatter.js';\n","// =============================================================================\n// Main API - Unified IziNoir class\n// =============================================================================\n\nexport {\n IziNoir,\n Provider,\n Chain,\n type IziNoirConfig,\n type CircuitPaths,\n type SolanaDeployData,\n} from './IziNoir.js';\n\n// Chain formatting types\nexport type {\n ChainId,\n CircuitMetadata,\n ChainMetadata,\n SolanaChainMetadata,\n EthereumChainMetadata,\n ChainMetadataFor,\n} from './IziNoir.js';\nexport type { IChainFormatter, ChainProofDataFor } from './IziNoir.js';\n\n// Chain formatters (for advanced users)\nexport { SolanaFormatter } from './infra/chainFormatters/SolanaFormatter.js';\n\n// =============================================================================\n// WASM Initialization (for advanced users)\n// =============================================================================\n\nexport { initNoirWasm, isWasmInitialized, markWasmInitialized } from './infra/wasm/wasmInit.js';\n\n// =============================================================================\n// Proving Systems (direct use)\n// =============================================================================\n\n// Browser-compatible providers\nexport { Barretenberg } from './infra/provingSystems/Barretenberg.js';\nexport { ArkworksWasm, isArkworksCircuit } from './infra/provingSystems/ArkworksWasm.js';\nexport type {\n ArkworksWasmConfig,\n ArkworksCompiledCircuit,\n ArkworksWasmModule,\n ArkworksSetupResult,\n ArkworksProofResult,\n} from './infra/provingSystems/ArkworksWasm.js';\n\n// Note: Sunspot is Node.js only and NOT exported from the main entry point.\n// Import from '@izi-noir/sdk/sunspot' for Sunspot support.\n\n// =============================================================================\n// Interfaces\n// =============================================================================\n\nexport type {\n IProvingSystem,\n ICompiler,\n IProver,\n IVerifier,\n} from './domain/interfaces/proving/index.js';\nexport type { IParser } from './domain/interfaces/parsing/index.js';\n// Note: IChainFormatter and ChainProofDataFor are exported from IziNoir.js above\n\n// =============================================================================\n// Domain Types\n// =============================================================================\n\nexport type {\n ProofResult,\n ProofTimings,\n ProofData,\n CircuitFunction,\n InputValue,\n CompiledCircuit,\n InputMap,\n ProverOptions,\n VerifierOptions,\n VerifyingKeyData,\n} from './domain/types.js';\n\nexport type {\n ParsedCircuit,\n CircuitParam,\n Expr,\n BinaryExpr,\n IdentifierExpr,\n LiteralExpr,\n MemberExpr,\n BinaryOperator,\n Statement,\n AssertStatement,\n} from './domain/entities/circuit.js';\n\n// =============================================================================\n// Legacy API (backwards compatibility - deprecated)\n// =============================================================================\n\n// Container factories (deprecated - use IziNoir.init() instead)\nexport { createDefaultContainer, createArkworksWasmContainer } from './container.js';\n\n// For DI users\nexport { CreateProofUseCase } from './application/CreateProofUseCase.js';\nexport type { CreateProofDependencies } from './application/CreateProofUseCase.js';\n\n// Parser implementation\nexport { AcornParser } from './infra/parser/AcornParser.js';\n\n// Services\nexport { generateNoir } from './application/services/NoirGenerator.js';\n\n// =============================================================================\n// Solana Utilities\n// =============================================================================\n\nexport { SolanaTransactionBuilder } from './solana/TransactionBuilder.js';\nexport type {\n TransactionBuilderConfig,\n InstructionData,\n InitVkAccounts,\n VerifyProofAccounts,\n CloseVkAccounts,\n InitAndVerifyInstructions,\n} from './solana/TransactionBuilder.js';\n\n// Solana proof data helpers (from providers/solana.ts)\nexport {\n IZI_NOIR_PROGRAM_ID,\n parseVerifyingKey,\n parseProof,\n parsePublicInputs,\n calculateVkAccountSize,\n calculateVkAccountRent,\n buildInitVkFromBytesData,\n buildVerifyProofData,\n} from './providers/solana.js';\nexport type { SolanaProofData } from './domain/types.js';\n\n// VK Deployment Manager\nexport {\n VkDeploymentManager,\n createNodeVkDeploymentManager,\n NETWORK_ENDPOINTS,\n} from './deployment/VkDeploymentManager.js';\nexport type {\n VkDeploymentManagerConfig,\n VkDeployment,\n EnsureDeployedOptions,\n DeploymentResult,\n DeploymentsState,\n SolanaNetwork,\n SignerInfo,\n} from './deployment/VkDeploymentManager.js';\n\n// =============================================================================\n// Circuit Registry\n// =============================================================================\n\nexport {\n CircuitRegistry,\n getGlobalRegistry,\n defineCircuit,\n} from './registry/CircuitRegistry.js';\nexport type {\n CircuitDefinition,\n CircuitInputDef,\n RegisteredCircuit,\n GetCircuitOptions,\n CircuitRegistryExport,\n CircuitExportEntry,\n} from './registry/CircuitRegistry.js';\n\n// =============================================================================\n// Off-Chain Verifier\n// =============================================================================\n\nexport {\n OffchainVerifier,\n createVerifierMiddleware,\n createVerificationEndpoint,\n batchVerify,\n} from './server/OffchainVerifier.js';\nexport type {\n OffchainVerifierConfig,\n OffchainCircuitConfig,\n VerifyRequest,\n VerifyResult,\n VerificationEndpointOptions,\n BatchVerifyResult,\n} from './server/OffchainVerifier.js';\n\n// =============================================================================\n// Build Configuration\n// =============================================================================\n\nexport { defineConfig } from './config/defineConfig.js';\nexport type { IziNoirBuildConfig } from './config/defineConfig.js';\n","import * as acorn from 'acorn';\nimport * as walk from 'acorn-walk';\nimport type { IParser } from '../../domain/interfaces/parsing/IParser.js';\nimport type {\n ParsedCircuit,\n CircuitParam,\n Statement,\n} from '../../domain/entities/circuit.js';\nimport type { CircuitFunction, InputValue } from '../../domain/types.js';\nimport type { AcornNode } from './types.js';\nimport { ExpressionParser } from './ExpressionParser.js';\nimport { StatementParser } from './StatementParser.js';\nimport { ForLoopParser } from './ForLoopParser.js';\n\n/**\n * Parses JavaScript circuit functions into a structured representation.\n *\n * The AcornParser is the main orchestrator that:\n * 1. Parses JS source using Acorn\n * 2. Extracts parameters from ([public], [private]) => {} pattern\n * 3. Delegates statement/expression parsing to specialized parsers\n *\n * Architecture:\n * - ExpressionParser: Handles all expression types\n * - StatementParser: Handles statements (vars, if, assert, assignments)\n * - ForLoopParser: Handles for loop validation and parsing\n */\nexport class AcornParser implements IParser {\n private exprParser = new ExpressionParser();\n private forLoopParser = new ForLoopParser(this.exprParser);\n private stmtParser = new StatementParser(this.exprParser, this.forLoopParser);\n\n /**\n * Parses a circuit function into public/private parameters and statements.\n *\n * @param fn The circuit function with signature ([public], [private]) => { ... }\n * @param _publicInputs Public input values (used for validation, not parsing)\n * @param _privateInputs Private input values (used for validation, not parsing)\n */\n parse(\n fn: CircuitFunction,\n _publicInputs: InputValue[],\n _privateInputs: InputValue[]\n ): ParsedCircuit {\n const fnSource = fn.toString();\n\n // Parse as expression (arrow function)\n const ast = acorn.parse(`(${fnSource})`, {\n ecmaVersion: 2022,\n sourceType: 'module',\n }) as AcornNode;\n\n // Find the function node\n const fnNode = this.findFunctionNode(ast);\n\n // Extract parameters\n const { publicParams, privateParams } = this.extractParameters(fnNode);\n\n // Parse body statements\n const statements = this.parseBody(fnNode);\n\n return { publicParams, privateParams, statements };\n }\n\n /**\n * Finds the arrow function or function expression in the AST.\n */\n private findFunctionNode(ast: AcornNode): AcornNode {\n let fnNode: AcornNode | null = null;\n\n walk.simple(ast, {\n ArrowFunctionExpression(node: AcornNode) {\n fnNode = node;\n },\n FunctionExpression(node: AcornNode) {\n fnNode = node;\n },\n });\n\n if (!fnNode) {\n throw new Error('Could not find function in source');\n }\n\n return fnNode;\n }\n\n /**\n * Extracts public and private parameters from the function signature.\n * Expects pattern: ([pub1, pub2], [priv1, priv2]) => { ... }\n */\n private extractParameters(fnNode: AcornNode): {\n publicParams: CircuitParam[];\n privateParams: CircuitParam[];\n } {\n const params = fnNode.params as AcornNode[];\n\n if (params.length !== 2) {\n throw new Error(\n 'Circuit function must have exactly 2 parameters: (publicArgs, privateArgs)'\n );\n }\n\n const publicParams: CircuitParam[] = [];\n const privateParams: CircuitParam[] = [];\n\n // Parse public params (first array pattern)\n const pubParam = params[0];\n if (pubParam.type === 'ArrayPattern') {\n pubParam.elements.forEach((elem: AcornNode, idx: number) => {\n if (elem && elem.type === 'Identifier') {\n publicParams.push({ name: elem.name, index: idx });\n }\n });\n }\n\n // Parse private params (second array pattern)\n const privParam = params[1];\n if (privParam.type === 'ArrayPattern') {\n privParam.elements.forEach((elem: AcornNode, idx: number) => {\n if (elem && elem.type === 'Identifier') {\n privateParams.push({ name: elem.name, index: idx });\n }\n });\n }\n\n return { publicParams, privateParams };\n }\n\n /**\n * Parses the function body into statements.\n */\n private parseBody(fnNode: AcornNode): Statement[] {\n const body = fnNode.body as AcornNode;\n const statements: Statement[] = [];\n\n if (body.type === 'BlockStatement') {\n for (const stmt of body.body) {\n const parsed = this.stmtParser.parse(stmt);\n if (parsed) {\n statements.push(parsed);\n }\n }\n } else {\n // Single expression body - wrap in assert if it's a condition\n const expr = this.exprParser.parse(body);\n if (expr) {\n statements.push({ kind: 'assert', condition: expr });\n }\n }\n\n return statements;\n }\n}\n","import type {\n BinaryOperator,\n UnaryOperator,\n} from '../../domain/entities/circuit.js';\n\n/**\n * Maps JavaScript binary operators to their Noir equivalents.\n *\n * Notable conversions:\n * - `===` → `==` (Noir has no strict equality)\n * - `!==` → `!=` (Noir has no strict inequality)\n * - `&&` → `&` (Noir uses bitwise AND for logical AND)\n * - `||` → `|` (Noir uses bitwise OR for logical OR)\n */\nexport const BINARY_OPERATOR_MAP: Record<string, BinaryOperator> = {\n // Equality\n '==': '==',\n '===': '==',\n '!=': '!=',\n '!==': '!=',\n // Arithmetic\n '+': '+',\n '-': '-',\n '*': '*',\n '/': '/',\n '%': '%',\n // Comparison\n '<': '<',\n '>': '>',\n '<=': '<=',\n '>=': '>=',\n // Logical (JS && and || map to Noir & and |)\n '&&': '&',\n '||': '|',\n};\n\n/**\n * Maps JavaScript unary operators to their Noir equivalents.\n */\nexport const UNARY_OPERATOR_MAP: Record<string, UnaryOperator> = {\n '!': '!',\n '-': '-',\n};\n\n/**\n * Maps a JavaScript binary operator to its Noir equivalent.\n * @throws Error if the operator is not supported.\n */\nexport function mapBinaryOperator(op: string): BinaryOperator {\n const noirOp = BINARY_OPERATOR_MAP[op];\n if (!noirOp) {\n throw new Error(`Unsupported binary operator: ${op}`);\n }\n return noirOp;\n}\n\n/**\n * Maps a JavaScript unary operator to its Noir equivalent.\n * @throws Error if the operator is not supported.\n */\nexport function mapUnaryOperator(op: string): UnaryOperator {\n const noirOp = UNARY_OPERATOR_MAP[op];\n if (!noirOp) {\n throw new Error(`Unsupported unary operator: ${op}`);\n }\n return noirOp;\n}\n","/**\n * Prefix used to indicate mutable variables in JS source.\n * Variables named `mut_foo` will become `let mut foo` in Noir.\n */\nconst MUT_PREFIX = 'mut_';\n\n/**\n * Strips the `mut_` prefix from a variable name if present.\n *\n * @example\n * stripMutPrefix('mut_counter') // 'counter'\n * stripMutPrefix('total') // 'total'\n */\nexport function stripMutPrefix(name: string): string {\n return name.startsWith(MUT_PREFIX) ? name.slice(MUT_PREFIX.length) : name;\n}\n\n/**\n * Checks if a variable name indicates mutability (has `mut_` prefix).\n *\n * @example\n * isMutable('mut_counter') // true\n * isMutable('total') // false\n */\nexport function isMutable(name: string): boolean {\n return name.startsWith(MUT_PREFIX);\n}\n","import type { Expr } from '../../domain/entities/circuit.js';\nimport type { AcornNode } from './types.js';\nimport { BINARY_OPERATOR_MAP, UNARY_OPERATOR_MAP } from './operatorMaps.js';\nimport { stripMutPrefix } from './utils.js';\n\n/**\n * Parses JavaScript AST expression nodes into circuit Expr types.\n *\n * Handles:\n * - Identifiers\n * - Literals (number, string, bigint)\n * - Binary expressions (arithmetic, comparison, logical)\n * - Unary expressions (!, -)\n * - Member expressions (array indexing, .length)\n * - Array literals\n * - Call expressions\n * - Conditional (ternary) expressions\n */\nexport class ExpressionParser {\n /**\n * Parses an AST node into a circuit expression.\n * @returns The parsed expression, or null if the node type is not recognized.\n */\n parse(node: AcornNode): Expr | null {\n switch (node.type) {\n case 'Identifier':\n return this.parseIdentifier(node);\n\n case 'Literal':\n return this.parseLiteral(node);\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n return this.parseBinaryExpression(node);\n\n case 'MemberExpression':\n return this.parseMemberExpression(node);\n\n case 'ArrayExpression':\n return this.parseArrayExpression(node);\n\n case 'CallExpression':\n return this.parseCallExpression(node);\n\n case 'UnaryExpression':\n return this.parseUnaryExpression(node);\n\n case 'ConditionalExpression':\n return this.parseConditionalExpression(node);\n\n default:\n return null;\n }\n }\n\n private parseIdentifier(node: AcornNode): Expr {\n // Strip mut_ prefix for consistency with variable declarations\n const name = node.name as string;\n return { kind: 'identifier', name: stripMutPrefix(name) };\n }\n\n private parseLiteral(node: AcornNode): Expr {\n return { kind: 'literal', value: node.value as number | string | bigint };\n }\n\n private parseBinaryExpression(node: AcornNode): Expr {\n const operator = BINARY_OPERATOR_MAP[node.operator];\n if (!operator) {\n throw new Error(`Unsupported operator: ${node.operator}`);\n }\n\n const left = this.parse(node.left as AcornNode);\n const right = this.parse(node.right as AcornNode);\n\n if (!left || !right) {\n throw new Error('Could not parse binary expression operands');\n }\n\n return { kind: 'binary', left, operator, right };\n }\n\n private parseMemberExpression(node: AcornNode): Expr | null {\n const obj = node.object as AcornNode;\n const prop = node.property as AcornNode;\n\n // Handle computed property access: arr[i] or arr[0]\n if (node.computed) {\n const object = this.parse(obj);\n const index = this.parse(prop);\n\n if (!object || !index) {\n throw new Error('Could not parse member expression');\n }\n\n return {\n kind: 'member',\n object,\n index,\n };\n }\n\n // Handle property access: arr.length → special case for .length\n if (prop.type === 'Identifier' && prop.name === 'length') {\n const object = this.parse(obj);\n if (!object) {\n throw new Error('Could not parse object for .length');\n }\n\n // Transform arr.length → arr.len() call\n return {\n kind: 'call',\n callee: object,\n method: 'len',\n args: [],\n };\n }\n\n return null;\n }\n\n private parseArrayExpression(node: AcornNode): Expr {\n const elements: Expr[] = [];\n for (const elem of node.elements) {\n if (elem) {\n const parsed = this.parse(elem as AcornNode);\n if (parsed) {\n elements.push(parsed);\n }\n }\n }\n return {\n kind: 'array_literal',\n elements,\n };\n }\n\n private parseCallExpression(node: AcornNode): Expr | null {\n const callee = node.callee as AcornNode;\n const args: Expr[] = [];\n\n for (const arg of node.arguments) {\n const parsed = this.parse(arg as AcornNode);\n if (parsed) {\n args.push(parsed);\n }\n }\n\n // Check for method call: obj.method()\n if (callee.type === 'MemberExpression' && !callee.computed) {\n const obj = this.parse(callee.object as AcornNode);\n const method = (callee.property as AcornNode).name as string;\n\n if (obj) {\n return {\n kind: 'call',\n callee: obj,\n method,\n args,\n };\n }\n }\n\n // Regular function call\n const calleeExpr = this.parse(callee);\n if (calleeExpr) {\n return {\n kind: 'call',\n callee: calleeExpr,\n args,\n };\n }\n\n return null;\n }\n\n private parseUnaryExpression(node: AcornNode): Expr {\n const unaryOp = UNARY_OPERATOR_MAP[node.operator];\n if (!unaryOp) {\n throw new Error(`Unsupported unary operator: ${node.operator}`);\n }\n\n // Optimize: fold negative literals into a single literal node\n if (node.operator === '-' && node.argument.type === 'Literal') {\n const val = node.argument.value;\n if (typeof val === 'number' || typeof val === 'bigint') {\n return { kind: 'literal', value: -val };\n }\n }\n\n const operand = this.parse(node.argument as AcornNode);\n if (!operand) {\n throw new Error('Could not parse unary expression operand');\n }\n\n return { kind: 'unary', operator: unaryOp, operand };\n }\n\n private parseConditionalExpression(node: AcornNode): Expr {\n // Ternary: condition ? consequent : alternate → if expression in Noir\n const condition = this.parse(node.test as AcornNode);\n const consequent = this.parse(node.consequent as AcornNode);\n const alternate = this.parse(node.alternate as AcornNode);\n\n if (!condition || !consequent || !alternate) {\n throw new Error('Could not parse ternary expression');\n }\n\n return {\n kind: 'if_expr',\n condition,\n consequent,\n alternate,\n };\n }\n}\n","import type { Statement } from '../../domain/entities/circuit.js';\nimport type { AcornNode } from './types.js';\nimport { ExpressionParser } from './ExpressionParser.js';\nimport { ForLoopParser } from './ForLoopParser.js';\nimport { stripMutPrefix, isMutable } from './utils.js';\n\n/**\n * Parses JavaScript AST statement nodes into circuit Statement types.\n *\n * Handles:\n * - Variable declarations (let, const)\n * - Expression statements (assert calls, assignments)\n * - If statements\n * - For statements\n */\nexport class StatementParser {\n constructor(\n private exprParser: ExpressionParser,\n private forLoopParser: ForLoopParser\n ) {}\n\n /**\n * Parses a statement AST node.\n * @returns The parsed statement, or null if the node type is not recognized.\n */\n parse(node: AcornNode): Statement | null {\n switch (node.type) {\n case 'VariableDeclaration':\n return this.parseVariableDeclaration(node);\n\n case 'ExpressionStatement':\n return this.parseExpressionStatement(node);\n\n case 'IfStatement':\n return this.parseIfStatement(node);\n\n case 'ForStatement':\n return this.forLoopParser.parse(node, (n) => this.parseBlock(n));\n\n default:\n return null;\n }\n }\n\n /**\n * Parses a block or single statement into an array of statements.\n */\n parseBlock(node: AcornNode): Statement[] {\n if (node.type === 'BlockStatement') {\n const statements: Statement[] = [];\n for (const stmt of node.body) {\n const parsed = this.parse(stmt);\n if (parsed) {\n statements.push(parsed);\n }\n }\n return statements;\n } else {\n // Single statement (no braces)\n const parsed = this.parse(node);\n return parsed ? [parsed] : [];\n }\n }\n\n /**\n * Parses variable declarations: let x = 5; const y = 10;\n * Uses mut_ prefix convention for mutable variables.\n */\n private parseVariableDeclaration(node: AcornNode): Statement {\n const declaration = node.declarations[0] as AcornNode;\n if (!declaration || declaration.type !== 'VariableDeclarator') {\n throw new Error('Invalid variable declaration');\n }\n\n const id = declaration.id as AcornNode;\n if (id.type !== 'Identifier') {\n throw new Error('Variable declaration must have a simple identifier');\n }\n\n const init = declaration.init as AcornNode | null;\n if (!init) {\n throw new Error('Variable declaration must have an initializer');\n }\n\n const initializer = this.exprParser.parse(init);\n if (!initializer) {\n throw new Error('Could not parse variable initializer');\n }\n\n const name = id.name as string;\n\n return {\n kind: 'variable_declaration',\n name: stripMutPrefix(name),\n mutable: isMutable(name),\n initializer,\n };\n }\n\n /**\n * Parses expression statements: assert(), assignments.\n */\n private parseExpressionStatement(node: AcornNode): Statement | null {\n const expr = node.expression as AcornNode;\n\n // Check for assert() call\n if (expr.type === 'CallExpression') {\n const callee = expr.callee as AcornNode;\n\n if (callee.type === 'Identifier' && callee.name === 'assert') {\n return this.parseAssertCall(expr);\n }\n }\n\n // Check for assignment: x = 5;\n if (expr.type === 'AssignmentExpression') {\n return this.parseAssignment(expr);\n }\n\n return null;\n }\n\n /**\n * Parses assert() function calls.\n */\n private parseAssertCall(expr: AcornNode): Statement {\n const args = expr.arguments as AcornNode[];\n\n if (args.length === 0) {\n throw new Error('assert() requires at least one argument');\n }\n\n const condition = this.exprParser.parse(args[0]);\n if (!condition) {\n throw new Error('Could not parse assert condition');\n }\n\n const message =\n args.length > 1 && args[1].type === 'Literal'\n ? String(args[1].value)\n : undefined;\n\n return { kind: 'assert', condition, message };\n }\n\n /**\n * Parses assignment expressions: x = 5;\n */\n private parseAssignment(expr: AcornNode): Statement {\n const left = expr.left as AcornNode;\n const right = expr.right as AcornNode;\n\n if (left.type !== 'Identifier') {\n throw new Error('Assignment target must be an identifier');\n }\n\n const value = this.exprParser.parse(right);\n if (!value) {\n throw new Error('Could not parse assignment value');\n }\n\n // Strip mut_ prefix if present (for consistency)\n const name = left.name as string;\n\n return {\n kind: 'assignment',\n target: stripMutPrefix(name),\n value,\n };\n }\n\n /**\n * Parses if statements: if (condition) { ... } else { ... }\n */\n private parseIfStatement(node: AcornNode): Statement {\n const condition = this.exprParser.parse(node.test as AcornNode);\n if (!condition) {\n throw new Error('Could not parse if condition');\n }\n\n const consequent = this.parseBlock(node.consequent as AcornNode);\n const alternate = node.alternate\n ? this.parseBlock(node.alternate as AcornNode)\n : undefined;\n\n return {\n kind: 'if_statement',\n condition,\n consequent,\n alternate,\n };\n }\n}\n","import type { Statement, Expr } from '../../domain/entities/circuit.js';\nimport type { AcornNode } from './types.js';\nimport { ExpressionParser } from './ExpressionParser.js';\n\n/**\n * Parses and validates JavaScript for loops for Noir conversion.\n *\n * Supports:\n * - `for (let i = start; i < end; i++)` → `for i in start..end`\n * - `for (let i = start; i <= end; i++)` → `for i in start..=end`\n *\n * Validates:\n * - Init must be a variable declaration\n * - Test must compare loop variable with < or <=\n * - Update must be simple increment (i++, ++i, or i = i + 1)\n */\nexport class ForLoopParser {\n constructor(private exprParser: ExpressionParser) {}\n\n /**\n * Parses a for statement into a circuit for_statement.\n * @param node The ForStatement AST node\n * @param parseBlock Function to parse the loop body\n */\n parse(\n node: AcornNode,\n parseBlock: (n: AcornNode) => Statement[]\n ): Statement {\n // Validate and extract init\n const { variable, start } = this.validateInit(node.init as AcornNode | null);\n\n // Validate and extract test\n const { end, inclusive } = this.validateTest(node.test as AcornNode | null, variable);\n\n // Validate update\n this.validateUpdate(node.update as AcornNode | null, variable);\n\n // Parse body\n const body = parseBlock(node.body as AcornNode);\n\n return {\n kind: 'for_statement',\n variable,\n start,\n end,\n inclusive,\n body,\n };\n }\n\n /**\n * Validates the for loop initializer.\n * Must be: `let i = start`\n */\n private validateInit(init: AcornNode | null): { variable: string; start: Expr } {\n if (!init || init.type !== 'VariableDeclaration') {\n throw new Error('For loop init must be a variable declaration (let i = start)');\n }\n\n const declaration = init.declarations[0] as AcornNode;\n if (!declaration || declaration.id.type !== 'Identifier') {\n throw new Error('For loop must declare a simple variable');\n }\n\n const variable = declaration.id.name as string;\n const startInit = declaration.init as AcornNode | null;\n if (!startInit) {\n throw new Error('For loop variable must have an initializer');\n }\n\n const start = this.exprParser.parse(startInit);\n if (!start) {\n throw new Error('Could not parse for loop start value');\n }\n\n return { variable, start };\n }\n\n /**\n * Validates the for loop test condition.\n * Must be: `i < end` or `i <= end`\n */\n private validateTest(\n test: AcornNode | null,\n variable: string\n ): { end: Expr; inclusive: boolean } {\n if (!test || test.type !== 'BinaryExpression') {\n throw new Error('For loop test must be a comparison (i < end or i <= end)');\n }\n\n const testLeft = test.left as AcornNode;\n if (testLeft.type !== 'Identifier' || testLeft.name !== variable) {\n throw new Error('For loop test must compare the loop variable');\n }\n\n const operator = test.operator as string;\n if (operator !== '<' && operator !== '<=') {\n throw new Error('For loop test must use < or <= operator');\n }\n\n const end = this.exprParser.parse(test.right as AcornNode);\n if (!end) {\n throw new Error('Could not parse for loop end value');\n }\n\n return { end, inclusive: operator === '<=' };\n }\n\n /**\n * Validates the for loop update expression.\n * Must be: `i++`, `++i`, or `i = i + 1`\n */\n private validateUpdate(update: AcornNode | null, variable: string): void {\n if (!update) {\n throw new Error('For loop must have an update expression');\n }\n\n if (!this.isSimpleIncrement(update, variable)) {\n throw new Error('For loop update must be i++ or i = i + 1 or ++i');\n }\n }\n\n /**\n * Checks if an expression is a simple increment of the variable.\n * Accepts: i++, ++i, i = i + 1\n */\n private isSimpleIncrement(node: AcornNode, variable: string): boolean {\n // i++ or ++i\n if (node.type === 'UpdateExpression') {\n const arg = node.argument as AcornNode;\n return (\n node.operator === '++' &&\n arg.type === 'Identifier' &&\n arg.name === variable\n );\n }\n\n // i = i + 1\n if (node.type === 'AssignmentExpression') {\n const left = node.left as AcornNode;\n const right = node.right as AcornNode;\n\n if (left.type !== 'Identifier' || left.name !== variable) {\n return false;\n }\n\n if (right.type === 'BinaryExpression') {\n const binLeft = right.left as AcornNode;\n const binRight = right.right as AcornNode;\n\n return (\n right.operator === '+' &&\n binLeft.type === 'Identifier' &&\n binLeft.name === variable &&\n binRight.type === 'Literal' &&\n binRight.value === 1\n );\n }\n }\n\n return false;\n }\n}\n","import { AcornParser } from './infra/parser/AcornParser.js';\nimport { Barretenberg } from './infra/provingSystems/Barretenberg.js';\nimport { ArkworksWasm } from './infra/provingSystems/ArkworksWasm.js';\nimport type { CreateProofDependencies } from './application/CreateProofUseCase.js';\nimport type { ArkworksWasmConfig } from './infra/provingSystems/ArkworksWasm.js';\n\n/**\n * Create default container with Barretenberg backend\n *\n * @deprecated Use IziNoir.init({ provider: Provider.Barretenberg }) instead\n */\nexport function createDefaultContainer(): CreateProofDependencies {\n return {\n parser: new AcornParser(),\n provingSystem: new Barretenberg(),\n };\n}\n\n/**\n * Create container with ArkworksWasm backend (Groth16 for Solana, 100% browser)\n *\n * @deprecated Use IziNoir.init({ provider: Provider.Arkworks }) instead\n *\n * @example\n * ```ts\n * // Preferred:\n * const izi = await IziNoir.init({ provider: Provider.Arkworks });\n * await izi.compile(noirCode);\n * const proof = await izi.proveForChain('solana', inputs);\n * ```\n */\nexport function createArkworksWasmContainer(config?: ArkworksWasmConfig): CreateProofDependencies {\n return {\n parser: new AcornParser(),\n provingSystem: new ArkworksWasm(config),\n };\n}\n","import type { ParsedCircuit, Expr, Statement } from '../../domain/entities/circuit.js';\n\nexport function generateNoir(circuit: ParsedCircuit): string {\n const params = generateParams(circuit);\n const body = generateBody(circuit.statements);\n\n return `fn main(${params}) {\\n${body}\\n}\\n`;\n}\n\nfunction generateParams(circuit: ParsedCircuit): string {\n const allParams: string[] = [];\n\n // Private params first (no pub modifier)\n for (const param of circuit.privateParams) {\n allParams.push(`${param.name}: Field`);\n }\n\n // Public params with pub modifier\n for (const param of circuit.publicParams) {\n allParams.push(`${param.name}: pub Field`);\n }\n\n return allParams.join(', ');\n}\n\nfunction generateBody(statements: Statement[], indent: number = 1): string {\n const lines: string[] = [];\n const indentStr = ' '.repeat(indent);\n\n for (const stmt of statements) {\n const generated = generateStatement(stmt, indent);\n // Handle multi-line statements (like if blocks)\n if (generated.includes('\\n')) {\n lines.push(generated);\n } else {\n lines.push(`${indentStr}${generated}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction generateStatement(stmt: Statement, indent: number = 1): string {\n const indentStr = ' '.repeat(indent);\n\n switch (stmt.kind) {\n case 'assert': {\n const condition = generateExpr(stmt.condition);\n if (stmt.message) {\n return `assert(${condition}, \"${stmt.message}\");`;\n }\n return `assert(${condition});`;\n }\n\n case 'variable_declaration': {\n const init = generateExpr(stmt.initializer);\n const mutKeyword = stmt.mutable ? 'let mut' : 'let';\n\n // Infer type from initializer\n const typeStr = inferType(stmt.initializer);\n return `${mutKeyword} ${stmt.name}: ${typeStr} = ${init};`;\n }\n\n case 'assignment': {\n const value = generateExpr(stmt.value);\n return `${stmt.target} = ${value};`;\n }\n\n case 'if_statement': {\n const condition = generateExpr(stmt.condition);\n const consequentBody = generateBody(stmt.consequent, indent + 1);\n\n let result = `${indentStr}if ${condition} {\\n${consequentBody}\\n${indentStr}}`;\n\n if (stmt.alternate && stmt.alternate.length > 0) {\n const alternateBody = generateBody(stmt.alternate, indent + 1);\n result += ` else {\\n${alternateBody}\\n${indentStr}}`;\n }\n\n return result;\n }\n\n case 'for_statement': {\n const start = generateExpr(stmt.start);\n const end = generateExpr(stmt.end);\n const rangeOp = stmt.inclusive ? '..=' : '..';\n const bodyContent = generateBody(stmt.body, indent + 1);\n\n return `${indentStr}for ${stmt.variable} in ${start}${rangeOp}${end} {\\n${bodyContent}\\n${indentStr}}`;\n }\n }\n}\n\nfunction generateExpr(expr: Expr): string {\n switch (expr.kind) {\n case 'identifier':\n return expr.name;\n\n case 'literal':\n return formatLiteral(expr.value);\n\n case 'binary': {\n const left = generateExpr(expr.left);\n const right = generateExpr(expr.right);\n return `${left} ${expr.operator} ${right}`;\n }\n\n case 'unary': {\n const operand = generateExpr(expr.operand);\n // For unary operators, we may need parens if operand is complex\n if (expr.operand.kind === 'binary') {\n return `${expr.operator}(${operand})`;\n }\n return `${expr.operator}${operand}`;\n }\n\n case 'member': {\n const object = generateExpr(expr.object);\n const index = generateExpr(expr.index);\n return `${object}[${index}]`;\n }\n\n case 'array_literal': {\n const elements = expr.elements.map(e => generateExpr(e)).join(', ');\n return `[${elements}]`;\n }\n\n case 'call': {\n const args = expr.args.map(a => generateExpr(a)).join(', ');\n if (expr.method) {\n // Method call: arr.len()\n const callee = generateExpr(expr.callee);\n return `${callee}.${expr.method}(${args})`;\n }\n // Regular function call\n const callee = generateExpr(expr.callee);\n return `${callee}(${args})`;\n }\n\n case 'if_expr': {\n const condition = generateExpr(expr.condition);\n const consequent = generateExpr(expr.consequent);\n const alternate = generateExpr(expr.alternate);\n return `if ${condition} { ${consequent} } else { ${alternate} }`;\n }\n }\n}\n\nfunction formatLiteral(value: number | string | bigint): string {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n if (typeof value === 'number') {\n return value.toString();\n }\n // String values - could be hex\n if (typeof value === 'string' && value.startsWith('0x')) {\n return value;\n }\n return `\"${value}\"`;\n}\n\nfunction inferType(expr: Expr): string {\n switch (expr.kind) {\n case 'array_literal':\n // For arrays, infer element type from first element or default to Field\n const elementType = expr.elements.length > 0\n ? inferType(expr.elements[0])\n : 'Field';\n return `[${elementType}; ${expr.elements.length}]`;\n\n case 'literal':\n // Check for boolean literals\n if (typeof expr.value === 'boolean') {\n return 'bool';\n }\n return 'Field';\n\n case 'if_expr':\n // If expression returns the type of its branches\n return inferType(expr.consequent);\n\n default:\n // Default to Field for most expressions\n return 'Field';\n }\n}\n","import type { IParser } from '../domain/interfaces/parsing/IParser.js';\nimport type { IProvingSystem } from '../domain/interfaces/proving/IProvingSystem.js';\nimport type { CircuitFunction, InputValue, ProofResult, InputMap } from '../domain/types.js';\nimport type { InputValue as NoirInputValue } from '@noir-lang/types';\nimport { generateNoir } from './services/NoirGenerator.js';\n\nexport interface CreateProofDependencies {\n parser: IParser;\n provingSystem: IProvingSystem;\n}\n\nexport class CreateProofUseCase {\n constructor(private readonly deps: CreateProofDependencies) {}\n\n async execute(\n publicInputs: InputValue[],\n privateInputs: InputValue[],\n circuitFn: CircuitFunction\n ): Promise<ProofResult> {\n const totalStart = performance.now();\n const timings = {\n parseMs: 0,\n generateMs: 0,\n compileMs: 0,\n witnessMs: 0,\n proofMs: 0,\n verifyMs: 0,\n totalMs: 0,\n };\n\n // 1. Parse JS function\n const parseStart = performance.now();\n const parsed = this.deps.parser.parse(circuitFn, publicInputs, privateInputs);\n timings.parseMs = performance.now() - parseStart;\n\n // 2. Generate Noir code\n const generateStart = performance.now();\n const noirCode = generateNoir(parsed);\n timings.generateMs = performance.now() - generateStart;\n\n // 3. Compile Noir to bytecode\n const compileStart = performance.now();\n const circuit = await this.deps.provingSystem.compile(noirCode);\n timings.compileMs = performance.now() - compileStart;\n\n // 4. Build inputs object for witness generation\n const toNoirInput = (val: InputValue): NoirInputValue =>\n typeof val === 'bigint' ? val.toString() : val;\n\n const inputs: InputMap = {};\n\n // Add private inputs first (order matters for Noir)\n for (const param of parsed.privateParams) {\n inputs[param.name] = toNoirInput(privateInputs[param.index]);\n }\n\n // Add public inputs\n for (const param of parsed.publicParams) {\n inputs[param.name] = toNoirInput(publicInputs[param.index]);\n }\n\n // 5. Generate witness and proof\n const witnessStart = performance.now();\n const { proof, publicInputs: proofPublicInputs } = await this.deps.provingSystem.generateProof(circuit, inputs);\n const proofEnd = performance.now();\n\n // Split timing: witness is typically faster, proof takes most time\n const proveTime = proofEnd - witnessStart;\n timings.witnessMs = proveTime * 0.1;\n timings.proofMs = proveTime * 0.9;\n\n // 6. Verify proof\n const verifyStart = performance.now();\n const verified = await this.deps.provingSystem.verifyProof(circuit, proof, proofPublicInputs);\n timings.verifyMs = performance.now() - verifyStart;\n\n timings.totalMs = performance.now() - totalStart;\n\n return {\n proof,\n publicInputs: proofPublicInputs,\n verified,\n noirCode,\n timings,\n };\n }\n}\n","/**\n * Solana on-chain verification provider for IZI-NOIR.\n *\n * This module provides functionality to verify Groth16 proofs on-chain using\n * the IZI-NOIR Solana program. It's compatible with proofs generated by the\n * Arkworks provider.\n *\n * @example Basic usage\n * ```typescript\n * import { SolanaVerifier } from '@izi-noir/sdk/solana';\n * import { Connection, Keypair } from '@solana/web3.js';\n *\n * const connection = new Connection('https://api.devnet.solana.com');\n * const wallet = Keypair.generate(); // In practice, use a real wallet\n *\n * const verifier = new SolanaVerifier({\n * connection,\n * wallet,\n * programId: 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS',\n * });\n *\n * // Initialize a VK account from base64-encoded VK\n * const vkAccount = await verifier.initVkFromBase64(vkGnarkBase64, nrPubinputs);\n *\n * // Verify a proof on-chain\n * const txSig = await verifier.verifyProof(\n * vkAccount,\n * proofGnarkBase64,\n * publicInputsHex\n * );\n * ```\n *\n * @module @izi-noir/sdk/solana\n */\n\n// Constants matching the Solana program\nexport const G1_SIZE = 64;\nexport const G2_SIZE = 128;\nexport const FIELD_SIZE = 32;\nexport const PROOF_SIZE = 256;\nexport const MAX_PUBLIC_INPUTS = 16;\n\n// Program ID - deployed on devnet\nexport const IZI_NOIR_PROGRAM_ID = 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS';\n\n/**\n * Configuration for the SolanaVerifier.\n */\nexport interface SolanaVerifierConfig {\n /**\n * Solana RPC connection.\n * Must be compatible with @solana/web3.js Connection.\n */\n connection: unknown;\n\n /**\n * Wallet for signing transactions.\n * Can be a Keypair or any wallet adapter compatible signer.\n */\n wallet: unknown;\n\n /**\n * Program ID of the deployed IZI-NOIR verifier program.\n * Defaults to the placeholder ID.\n */\n programId?: string;\n}\n\n/**\n * Result from initializing a VK account.\n */\nexport interface InitVkResult {\n /** The public key of the created VK account */\n vkAccount: string;\n /** The transaction signature */\n txSignature: string;\n}\n\n/**\n * Result from verifying a proof on-chain.\n */\nexport interface VerifyResult {\n /** Whether the proof was verified successfully */\n success: boolean;\n /** The transaction signature */\n txSignature: string;\n /** Error message if verification failed */\n error?: string;\n}\n\n/**\n * Parses a base64-encoded verifying key into its components.\n *\n * The VK format from arkworks gnark_compat is:\n * | alpha_g1 (64) | beta_g2 (128) | gamma_g2 (128) | delta_g2 (128) | k[0..n+1] (64 each) |\n *\n * @param vkBase64 - Base64-encoded verifying key\n * @param nrPubinputs - Number of public inputs\n * @returns Parsed VK components\n */\nexport function parseVerifyingKey(vkBase64: string, nrPubinputs: number): {\n alphaG1: Uint8Array;\n betaG2: Uint8Array;\n gammaG2: Uint8Array;\n deltaG2: Uint8Array;\n k: Uint8Array[];\n} {\n const vkBytes = base64ToBytes(vkBase64);\n const expectedLen = G1_SIZE + G2_SIZE * 3 + G1_SIZE * (nrPubinputs + 1);\n\n if (vkBytes.length !== expectedLen) {\n throw new Error(\n `Invalid VK size: expected ${expectedLen} bytes for ${nrPubinputs} public inputs, got ${vkBytes.length}`\n );\n }\n\n let offset = 0;\n\n const alphaG1 = vkBytes.slice(offset, offset + G1_SIZE);\n offset += G1_SIZE;\n\n const betaG2 = vkBytes.slice(offset, offset + G2_SIZE);\n offset += G2_SIZE;\n\n const gammaG2 = vkBytes.slice(offset, offset + G2_SIZE);\n offset += G2_SIZE;\n\n const deltaG2 = vkBytes.slice(offset, offset + G2_SIZE);\n offset += G2_SIZE;\n\n const k: Uint8Array[] = [];\n for (let i = 0; i <= nrPubinputs; i++) {\n k.push(vkBytes.slice(offset, offset + G1_SIZE));\n offset += G1_SIZE;\n }\n\n return { alphaG1, betaG2, gammaG2, deltaG2, k };\n}\n\n/**\n * Parses a base64-encoded proof into its components.\n *\n * The proof format is: A (G1, 64) || B (G2, 128) || C (G1, 64) = 256 bytes\n *\n * @param proofBase64 - Base64-encoded proof\n * @returns Parsed proof components\n */\nexport function parseProof(proofBase64: string): {\n a: Uint8Array;\n b: Uint8Array;\n c: Uint8Array;\n} {\n const proofBytes = base64ToBytes(proofBase64);\n\n if (proofBytes.length !== PROOF_SIZE) {\n throw new Error(`Invalid proof size: expected ${PROOF_SIZE} bytes, got ${proofBytes.length}`);\n }\n\n return {\n a: proofBytes.slice(0, G1_SIZE),\n b: proofBytes.slice(G1_SIZE, G1_SIZE + G2_SIZE),\n c: proofBytes.slice(G1_SIZE + G2_SIZE, PROOF_SIZE),\n };\n}\n\n/**\n * Parses public inputs from hex or decimal string format to 32-byte arrays.\n *\n * @param inputs - Array of public inputs as hex (0x...) or decimal strings\n * @returns Array of 32-byte big-endian field elements\n */\nexport function parsePublicInputs(inputs: string[]): Uint8Array[] {\n return inputs.map((input) => {\n // Handle hex strings\n if (input.startsWith('0x')) {\n const hex = input.slice(2).padStart(64, '0');\n return hexToBytes(hex);\n }\n\n // Handle decimal strings - convert to big-endian bytes\n const num = BigInt(input);\n const hex = num.toString(16).padStart(64, '0');\n return hexToBytes(hex);\n });\n}\n\n/**\n * Calculates the size of a VK account for a given number of public inputs.\n *\n * This matches the Rust `vk_account_size` function.\n *\n * @param nrPubinputs - Number of public inputs\n * @returns Account size in bytes\n */\nexport function calculateVkAccountSize(nrPubinputs: number): number {\n // discriminator (8) + authority (32) + nr_pubinputs (1) + alpha_g1 (64) +\n // beta_g2 (128) + gamma_g2 (128) + delta_g2 (128) + vec_len (4) + k elements\n const fixedSize = 8 + 32 + 1 + G1_SIZE + G2_SIZE * 3 + 4;\n return fixedSize + (nrPubinputs + 1) * G1_SIZE;\n}\n\n/**\n * Calculates the minimum rent for a VK account.\n *\n * @param nrPubinputs - Number of public inputs\n * @param rentExemptionPerByte - Rent per byte (default Solana rate)\n * @returns Rent in lamports\n */\nexport function calculateVkAccountRent(\n nrPubinputs: number,\n rentExemptionPerByte: number = 6960 // approximate lamports per byte\n): number {\n const size = calculateVkAccountSize(nrPubinputs);\n return size * rentExemptionPerByte;\n}\n\n// ========== Helper Functions ==========\n\n/**\n * Converts a base64 string to a Uint8Array.\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n // Browser-compatible base64 decoding\n if (typeof atob === 'function') {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n // Node.js fallback\n return new Uint8Array(Buffer.from(base64, 'base64'));\n}\n\n/**\n * Converts a Uint8Array to a base64 string.\n */\nexport function bytesToBase64(bytes: Uint8Array): string {\n // Browser-compatible base64 encoding\n if (typeof btoa === 'function') {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n // Node.js fallback\n return Buffer.from(bytes).toString('base64');\n}\n\n/**\n * Converts a hex string to Uint8Array.\n */\nfunction hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Converts a Uint8Array to hex string.\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n// ========== Instruction Data Builders ==========\n\n/**\n * Builds the instruction data for `init_vk_from_bytes`.\n *\n * Note: This is a simplified version. In practice, you'd use Anchor's IDL\n * and instruction builders from the generated types.\n *\n * @param nrPubinputs - Number of public inputs\n * @param vkBytes - Raw VK bytes\n * @returns Instruction data\n */\nexport function buildInitVkFromBytesData(nrPubinputs: number, vkBytes: Uint8Array): Uint8Array {\n // Anchor instruction discriminator for \"init_vk_from_bytes\"\n // From IDL: [103, 78, 249, 70, 245, 176, 87, 56]\n const discriminator = new Uint8Array([103, 78, 249, 70, 245, 176, 87, 56]);\n\n // Build instruction data: discriminator + nr_pubinputs (u8) + vk_bytes (Vec<u8>)\n const vkLen = new Uint8Array(4);\n new DataView(vkLen.buffer).setUint32(0, vkBytes.length, true); // little-endian\n\n const data = new Uint8Array(discriminator.length + 1 + 4 + vkBytes.length);\n let offset = 0;\n\n data.set(discriminator, offset);\n offset += discriminator.length;\n\n data[offset] = nrPubinputs;\n offset += 1;\n\n data.set(vkLen, offset);\n offset += 4;\n\n data.set(vkBytes, offset);\n\n return data;\n}\n\n/**\n * Builds the instruction data for `verify_proof`.\n *\n * @param proofBytes - 256-byte proof\n * @param publicInputs - Array of 32-byte field elements\n * @returns Instruction data\n */\nexport function buildVerifyProofData(\n proofBytes: Uint8Array,\n publicInputs: Uint8Array[]\n): Uint8Array {\n // Anchor instruction discriminator for \"verify_proof\"\n // From IDL: [217, 211, 191, 110, 144, 13, 186, 98]\n const discriminator = new Uint8Array([217, 211, 191, 110, 144, 13, 186, 98]);\n\n // Validate proof size\n if (proofBytes.length !== PROOF_SIZE) {\n throw new Error(`Invalid proof size: expected ${PROOF_SIZE}, got ${proofBytes.length}`);\n }\n\n // Calculate total size\n const proofVecLen = 4 + proofBytes.length;\n const inputsVecLen = 4 + publicInputs.length * FIELD_SIZE;\n const totalSize = discriminator.length + proofVecLen + inputsVecLen;\n\n const data = new Uint8Array(totalSize);\n let offset = 0;\n\n // Discriminator\n data.set(discriminator, offset);\n offset += discriminator.length;\n\n // proof_bytes as Vec<u8>\n new DataView(data.buffer).setUint32(offset, proofBytes.length, true);\n offset += 4;\n data.set(proofBytes, offset);\n offset += proofBytes.length;\n\n // public_inputs as Vec<[u8; 32]>\n new DataView(data.buffer).setUint32(offset, publicInputs.length, true);\n offset += 4;\n for (const input of publicInputs) {\n if (input.length !== FIELD_SIZE) {\n throw new Error(`Invalid public input size: expected ${FIELD_SIZE}, got ${input.length}`);\n }\n data.set(input, offset);\n offset += FIELD_SIZE;\n }\n\n return data;\n}\n\n/**\n * Type definition for the Anchor IDL accounts structure.\n * This helps with type safety when building transactions.\n */\nexport interface IziNoirAccounts {\n initVk: {\n vkAccount: string;\n authority: string;\n payer: string;\n systemProgram: string;\n };\n verifyProof: {\n vkAccount: string;\n };\n closeVk: {\n vkAccount: string;\n authority: string;\n };\n}\n\n/**\n * Placeholder class for SolanaVerifier.\n *\n * This class provides the interface for on-chain verification but requires\n * @solana/web3.js and @coral-xyz/anchor to be installed as peer dependencies.\n *\n * For full functionality, install the required dependencies:\n * ```bash\n * npm install @solana/web3.js @coral-xyz/anchor\n * ```\n *\n * Then use the generated Anchor client from the solana-contracts package.\n */\nexport class SolanaVerifier {\n private config: SolanaVerifierConfig;\n\n constructor(config: SolanaVerifierConfig) {\n this.config = config;\n }\n\n /**\n * Initializes a VK account from base64-encoded verifying key.\n *\n * Note: This is a placeholder. Use the generated Anchor client for\n * actual transaction building and submission.\n */\n async initVkFromBase64(vkBase64: string, nrPubinputs: number): Promise<InitVkResult> {\n // Parse and validate VK\n const vkBytes = base64ToBytes(vkBase64);\n const expectedLen = G1_SIZE + G2_SIZE * 3 + G1_SIZE * (nrPubinputs + 1);\n\n if (vkBytes.length !== expectedLen) {\n throw new Error(\n `Invalid VK size: expected ${expectedLen} bytes for ${nrPubinputs} public inputs, got ${vkBytes.length}`\n );\n }\n\n // This is a placeholder - actual implementation would use Anchor client\n throw new Error(\n 'SolanaVerifier.initVkFromBase64 requires @solana/web3.js and @coral-xyz/anchor. ' +\n 'Use the generated Anchor client from solana-contracts package.'\n );\n }\n\n /**\n * Verifies a proof on-chain.\n *\n * Note: This is a placeholder. Use the generated Anchor client for\n * actual transaction building and submission.\n */\n async verifyProof(\n vkAccount: string,\n proofBase64: string,\n publicInputs: string[]\n ): Promise<VerifyResult> {\n // Parse and validate proof\n const proofBytes = base64ToBytes(proofBase64);\n if (proofBytes.length !== PROOF_SIZE) {\n throw new Error(`Invalid proof size: expected ${PROOF_SIZE}, got ${proofBytes.length}`);\n }\n\n // This is a placeholder - actual implementation would use Anchor client\n throw new Error(\n 'SolanaVerifier.verifyProof requires @solana/web3.js and @coral-xyz/anchor. ' +\n 'Use the generated Anchor client from solana-contracts package.'\n );\n }\n\n /**\n * Closes a VK account and reclaims rent.\n *\n * Note: This is a placeholder. Use the generated Anchor client for\n * actual transaction building and submission.\n */\n async closeVk(vkAccount: string): Promise<string> {\n throw new Error(\n 'SolanaVerifier.closeVk requires @solana/web3.js and @coral-xyz/anchor. ' +\n 'Use the generated Anchor client from solana-contracts package.'\n );\n }\n}\n\n// Re-export common types\nexport type { CompiledCircuit, InputMap, ProofData } from '../domain/types.js';\n","/**\n * Transaction builder for IZI-NOIR Solana program.\n *\n * Provides a high-level API for building Solana transactions without\n * requiring Anchor or deep knowledge of instruction formats.\n *\n * @example\n * ```typescript\n * import { SolanaTransactionBuilder } from '@izi-noir/sdk';\n *\n * const builder = new SolanaTransactionBuilder({\n * computeUnits: 400_000,\n * programId: 'EYhRED7EuMyyVjx57aDXUD9h6ArnEKng64qtz8999KrS',\n * });\n *\n * // Build init VK transaction\n * const initData = builder.buildInitVkInstructionData(solanaProofData);\n *\n * // Build verify proof transaction\n * const verifyData = builder.buildVerifyProofInstructionData(\n * solanaProofData.proof.bytes,\n * solanaProofData.publicInputs.bytes\n * );\n * ```\n *\n * @module @izi-noir/sdk/solana\n */\n\nimport type { SolanaProofData } from '../domain/types.js';\nimport {\n IZI_NOIR_PROGRAM_ID,\n PROOF_SIZE,\n FIELD_SIZE,\n G1_SIZE,\n G2_SIZE,\n buildInitVkFromBytesData,\n buildVerifyProofData,\n calculateVkAccountSize,\n calculateVkAccountRent,\n} from '../providers/solana.js';\n\n// Re-export for convenience\nexport { IZI_NOIR_PROGRAM_ID, calculateVkAccountSize, calculateVkAccountRent };\n\n/**\n * Configuration for the transaction builder.\n */\nexport interface TransactionBuilderConfig {\n /**\n * Program ID of the IZI-NOIR verifier program.\n * Defaults to the deployed devnet program.\n */\n programId?: string;\n\n /**\n * Compute units to request for transactions.\n * Default: 400,000 (sufficient for most proof verifications)\n */\n computeUnits?: number;\n\n /**\n * Priority fee in microLamports per compute unit.\n * Default: 0 (no priority fee)\n */\n priorityFee?: number;\n}\n\n/**\n * Account configuration for init_vk instruction.\n */\nexport interface InitVkAccounts {\n /** Public key of the VK account (as base58 string) */\n vkAccount: string;\n /** Public key of the authority (as base58 string) */\n authority: string;\n /** Public key of the payer (as base58 string) */\n payer: string;\n}\n\n/**\n * Account configuration for verify_proof instruction.\n */\nexport interface VerifyProofAccounts {\n /** Public key of the VK account (as base58 string) */\n vkAccount: string;\n}\n\n/**\n * Account configuration for close_vk instruction.\n */\nexport interface CloseVkAccounts {\n /** Public key of the VK account (as base58 string) */\n vkAccount: string;\n /** Public key of the authority (as base58 string) */\n authority: string;\n}\n\n/**\n * Instruction data and accounts for a Solana instruction.\n */\nexport interface InstructionData {\n /** Raw instruction data bytes */\n data: Uint8Array;\n /** Program ID (base58) */\n programId: string;\n /** Account keys with metadata */\n keys: Array<{\n pubkey: string;\n isSigner: boolean;\n isWritable: boolean;\n }>;\n}\n\n/**\n * Result of building init and verify transactions together.\n */\nexport interface InitAndVerifyInstructions {\n /** Init VK instruction */\n initVk: InstructionData;\n /** Verify proof instruction */\n verifyProof: InstructionData;\n /** Compute budget instruction (set compute units) */\n computeBudget?: InstructionData;\n /** Priority fee instruction (if configured) */\n priorityFee?: InstructionData;\n /** Required rent for VK account in lamports */\n rentLamports: number;\n /** Size of VK account in bytes */\n accountSize: number;\n}\n\n// System program ID\nconst SYSTEM_PROGRAM_ID = '11111111111111111111111111111111';\n// Compute Budget program ID\nconst COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111';\n\n/**\n * Transaction builder for IZI-NOIR Solana program.\n *\n * This class provides methods to build instruction data for the IZI-NOIR\n * Solana program without requiring Anchor or @solana/web3.js dependencies.\n *\n * The returned instruction data can be used with any Solana library:\n * - @solana/web3.js\n * - @solana/kit (new)\n * - Anchor\n * - Mobile wallet adapters\n */\nexport class SolanaTransactionBuilder {\n private programId: string;\n private computeUnits: number;\n private priorityFee: number;\n\n constructor(config: TransactionBuilderConfig = {}) {\n this.programId = config.programId ?? IZI_NOIR_PROGRAM_ID;\n this.computeUnits = config.computeUnits ?? 400_000;\n this.priorityFee = config.priorityFee ?? 0;\n }\n\n /**\n * Builds the instruction data for initializing a VK account.\n *\n * @param solanaProofData - Proof data from `izi.proveForSolana()`\n * @param accounts - Account public keys\n * @returns Instruction data ready for transaction building\n *\n * @example\n * ```typescript\n * const initInstruction = builder.buildInitVkInstruction(solanaProofData, {\n * vkAccount: vkKeypair.publicKey.toBase58(),\n * authority: wallet.publicKey.toBase58(),\n * payer: wallet.publicKey.toBase58(),\n * });\n * ```\n */\n buildInitVkInstruction(\n solanaProofData: SolanaProofData,\n accounts: InitVkAccounts\n ): InstructionData {\n const data = buildInitVkFromBytesData(\n solanaProofData.verifyingKey.nrPublicInputs,\n solanaProofData.verifyingKey.bytes\n );\n\n return {\n data,\n programId: this.programId,\n keys: [\n { pubkey: accounts.vkAccount, isSigner: true, isWritable: true },\n { pubkey: accounts.authority, isSigner: true, isWritable: false },\n { pubkey: accounts.payer, isSigner: true, isWritable: true },\n { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n };\n }\n\n /**\n * Builds the instruction data for verifying a proof.\n *\n * @param proofBytes - 256-byte Groth16 proof\n * @param publicInputs - Array of 32-byte public inputs\n * @param accounts - Account public keys\n * @returns Instruction data ready for transaction building\n *\n * @example\n * ```typescript\n * const verifyInstruction = builder.buildVerifyProofInstruction(\n * solanaProofData.proof.bytes,\n * solanaProofData.publicInputs.bytes,\n * { vkAccount: vkAccountPubkey.toBase58() }\n * );\n * ```\n */\n buildVerifyProofInstruction(\n proofBytes: Uint8Array,\n publicInputs: Uint8Array[],\n accounts: VerifyProofAccounts\n ): InstructionData {\n const data = buildVerifyProofData(proofBytes, publicInputs);\n\n return {\n data,\n programId: this.programId,\n keys: [\n { pubkey: accounts.vkAccount, isSigner: false, isWritable: false },\n ],\n };\n }\n\n /**\n * Builds the instruction data for closing a VK account.\n *\n * @param accounts - Account public keys\n * @returns Instruction data ready for transaction building\n */\n buildCloseVkInstruction(accounts: CloseVkAccounts): InstructionData {\n // Anchor discriminator for \"close_vk\"\n // From IDL: [82, 29, 77, 141, 76, 53, 205, 244]\n const discriminator = new Uint8Array([82, 29, 77, 141, 76, 53, 205, 244]);\n\n return {\n data: discriminator,\n programId: this.programId,\n keys: [\n { pubkey: accounts.vkAccount, isSigner: false, isWritable: true },\n { pubkey: accounts.authority, isSigner: true, isWritable: true },\n ],\n };\n }\n\n /**\n * Builds a compute budget instruction to set compute unit limit.\n *\n * @param units - Number of compute units (default: configured value)\n * @returns Instruction data\n */\n buildSetComputeUnitLimitInstruction(units?: number): InstructionData {\n const cu = units ?? this.computeUnits;\n const data = new Uint8Array(5);\n data[0] = 2; // SetComputeUnitLimit instruction\n new DataView(data.buffer).setUint32(1, cu, true);\n\n return {\n data,\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n };\n }\n\n /**\n * Builds a compute budget instruction to set priority fee.\n *\n * @param microLamports - Priority fee in microLamports per CU\n * @returns Instruction data\n */\n buildSetComputeUnitPriceInstruction(microLamports?: number): InstructionData {\n const fee = microLamports ?? this.priorityFee;\n const data = new Uint8Array(9);\n data[0] = 3; // SetComputeUnitPrice instruction\n // 8-byte little-endian u64\n const view = new DataView(data.buffer);\n view.setBigUint64(1, BigInt(fee), true);\n\n return {\n data,\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n };\n }\n\n /**\n * Builds all instructions needed to initialize a VK and verify a proof.\n *\n * This is a convenience method that combines:\n * - Compute budget instructions (if configured)\n * - Init VK instruction\n * - Verify proof instruction\n *\n * @param solanaProofData - Proof data from `izi.proveForSolana()`\n * @param vkAccountPubkey - Public key for the new VK account\n * @param authorityPubkey - Authority for the VK account\n * @param payerPubkey - Payer for the transaction\n * @returns All instruction data and metadata\n *\n * @example\n * ```typescript\n * const result = builder.buildInitAndVerifyInstructions(\n * solanaProofData,\n * vkKeypair.publicKey.toBase58(),\n * wallet.publicKey.toBase58(),\n * wallet.publicKey.toBase58()\n * );\n *\n * // Use with @solana/web3.js:\n * const transaction = new Transaction();\n * if (result.computeBudget) {\n * transaction.add(toTransactionInstruction(result.computeBudget));\n * }\n * transaction.add(toTransactionInstruction(result.initVk));\n * // ... sign and send\n * ```\n */\n buildInitAndVerifyInstructions(\n solanaProofData: SolanaProofData,\n vkAccountPubkey: string,\n authorityPubkey: string,\n payerPubkey: string\n ): InitAndVerifyInstructions {\n const result: InitAndVerifyInstructions = {\n initVk: this.buildInitVkInstruction(solanaProofData, {\n vkAccount: vkAccountPubkey,\n authority: authorityPubkey,\n payer: payerPubkey,\n }),\n verifyProof: this.buildVerifyProofInstruction(\n solanaProofData.proof.bytes,\n solanaProofData.publicInputs.bytes,\n { vkAccount: vkAccountPubkey }\n ),\n rentLamports: solanaProofData.estimatedRent,\n accountSize: solanaProofData.accountSize,\n };\n\n // Add compute budget if configured\n if (this.computeUnits > 0) {\n result.computeBudget = this.buildSetComputeUnitLimitInstruction();\n }\n\n // Add priority fee if configured\n if (this.priorityFee > 0) {\n result.priorityFee = this.buildSetComputeUnitPriceInstruction();\n }\n\n return result;\n }\n\n /**\n * Validates that SolanaProofData has the correct format.\n *\n * @param data - Proof data to validate\n * @throws Error if validation fails\n */\n validateSolanaProofData(data: SolanaProofData): void {\n // Validate proof size\n if (data.proof.bytes.length !== PROOF_SIZE) {\n throw new Error(\n `Invalid proof size: expected ${PROOF_SIZE} bytes, got ${data.proof.bytes.length}`\n );\n }\n\n // Validate VK size\n const expectedVkSize = G1_SIZE + G2_SIZE * 3 + G1_SIZE * (data.verifyingKey.nrPublicInputs + 1);\n if (data.verifyingKey.bytes.length !== expectedVkSize) {\n throw new Error(\n `Invalid VK size: expected ${expectedVkSize} bytes for ${data.verifyingKey.nrPublicInputs} public inputs, got ${data.verifyingKey.bytes.length}`\n );\n }\n\n // Validate public inputs\n for (let i = 0; i < data.publicInputs.bytes.length; i++) {\n if (data.publicInputs.bytes[i].length !== FIELD_SIZE) {\n throw new Error(\n `Invalid public input ${i} size: expected ${FIELD_SIZE} bytes, got ${data.publicInputs.bytes[i].length}`\n );\n }\n }\n\n // Validate public inputs count matches VK\n if (data.publicInputs.bytes.length !== data.verifyingKey.nrPublicInputs) {\n throw new Error(\n `Public inputs count mismatch: VK expects ${data.verifyingKey.nrPublicInputs}, got ${data.publicInputs.bytes.length}`\n );\n }\n }\n\n /**\n * Gets the program ID being used.\n */\n getProgramId(): string {\n return this.programId;\n }\n\n /**\n * Gets the configured compute units.\n */\n getComputeUnits(): number {\n return this.computeUnits;\n }\n\n /**\n * Gets the configured priority fee.\n */\n getPriorityFee(): number {\n return this.priorityFee;\n }\n}\n\n/**\n * Helper to convert InstructionData to a format compatible with @solana/web3.js.\n *\n * This is a type definition only - actual conversion requires @solana/web3.js.\n *\n * @example\n * ```typescript\n * import { PublicKey, TransactionInstruction } from '@solana/web3.js';\n *\n * function toTransactionInstruction(data: InstructionData): TransactionInstruction {\n * return new TransactionInstruction({\n * programId: new PublicKey(data.programId),\n * keys: data.keys.map(k => ({\n * pubkey: new PublicKey(k.pubkey),\n * isSigner: k.isSigner,\n * isWritable: k.isWritable,\n * })),\n * data: Buffer.from(data.data),\n * });\n * }\n * ```\n */\nexport type Web3JsInstructionConverter = (data: InstructionData) => unknown;\n","/**\n * VK Deployment Manager for IZI-NOIR.\n *\n * Provides idempotent deployment of verifying keys to Solana with\n * local persistence for tracking deployed circuits.\n *\n * @example\n * ```typescript\n * import { VkDeploymentManager } from '@izi-noir/sdk';\n *\n * const manager = new VkDeploymentManager({\n * network: 'devnet',\n * configDir: './.izi-noir', // optional, defaults to .izi-noir\n * });\n *\n * // Deploy (idempotent - won't redeploy if already deployed)\n * const deployment = await manager.ensureDeployed({\n * circuitName: 'balance-check',\n * solanaProofData,\n * sendTransaction: async (tx) => {\n * // Sign and send using your wallet adapter\n * return await wallet.sendTransaction(tx, connection);\n * },\n * });\n *\n * console.log(`VK at: ${deployment.vkAccount}`);\n *\n * // Save deployment state\n * await manager.save();\n * ```\n *\n * @module @izi-noir/sdk/deployment\n */\n\nimport type { SolanaProofData } from '../domain/types.js';\nimport { SolanaTransactionBuilder } from '../solana/TransactionBuilder.js';\nimport type { InstructionData } from '../solana/TransactionBuilder.js';\n\n/**\n * Supported Solana networks.\n */\nexport type SolanaNetwork = 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet';\n\n/**\n * Network RPC endpoints.\n */\nexport const NETWORK_ENDPOINTS: Record<SolanaNetwork, string> = {\n 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n devnet: 'https://api.devnet.solana.com',\n testnet: 'https://api.testnet.solana.com',\n localnet: 'http://localhost:8899',\n};\n\n/**\n * Configuration for VK Deployment Manager.\n */\nexport interface VkDeploymentManagerConfig {\n /**\n * Solana network to deploy to.\n */\n network: SolanaNetwork;\n\n /**\n * Custom RPC endpoint. Overrides network default.\n */\n rpcEndpoint?: string;\n\n /**\n * Directory to store deployment config. Default: '.izi-noir'\n */\n configDir?: string;\n\n /**\n * Program ID override.\n */\n programId?: string;\n\n /**\n * Compute units for transactions. Default: 400,000\n */\n computeUnits?: number;\n}\n\n/**\n * Record of a deployed VK.\n */\nexport interface VkDeployment {\n /** Circuit identifier (name or hash) */\n circuitId: string;\n /** VK account public key (base58) */\n vkAccount: string;\n /** Authority public key (base58) */\n authority: string;\n /** Deployment timestamp */\n deployedAt: string;\n /** Transaction signature */\n txSignature: string;\n /** Network deployed to */\n network: SolanaNetwork;\n /** Hash of the VK bytes for deduplication */\n vkHash: string;\n /** Number of public inputs */\n nrPublicInputs: number;\n}\n\n/**\n * Options for ensureDeployed method.\n */\nexport interface EnsureDeployedOptions {\n /**\n * Identifier for the circuit (used for lookup).\n */\n circuitName: string;\n\n /**\n * Proof data containing VK bytes.\n */\n solanaProofData: SolanaProofData;\n\n /**\n * Function to send a transaction.\n * Should return the transaction signature.\n */\n sendTransaction: (instructions: InstructionData[], signers: SignerInfo[]) => Promise<string>;\n\n /**\n * Authority public key (base58).\n */\n authority: string;\n\n /**\n * Payer public key (base58).\n */\n payer: string;\n\n /**\n * Force redeploy even if already exists.\n */\n forceRedeploy?: boolean;\n}\n\n/**\n * Information about required signers.\n */\nexport interface SignerInfo {\n /** Public key of the signer (base58) */\n pubkey: string;\n /** Whether this is a new keypair that needs to be generated */\n isNewKeypair: boolean;\n /** Description of the signer role */\n role: 'vkAccount' | 'authority' | 'payer';\n}\n\n/**\n * Result of deployment operation.\n */\nexport interface DeploymentResult {\n /** Whether deployment was performed (false if already deployed) */\n deployed: boolean;\n /** VK account address */\n vkAccount: string;\n /** Transaction signature (if deployed) */\n txSignature?: string;\n /** Full deployment record */\n deployment: VkDeployment;\n}\n\n/**\n * Deployments state file structure.\n */\nexport interface DeploymentsState {\n version: '1.0';\n deployments: VkDeployment[];\n}\n\n/**\n * VK Deployment Manager.\n *\n * Manages deployment of verifying keys to Solana with:\n * - Idempotent deployments (skip if already deployed)\n * - Local persistence of deployment records\n * - Network-aware configuration\n */\nexport class VkDeploymentManager {\n private config: Required<VkDeploymentManagerConfig>;\n private deployments: Map<string, VkDeployment>;\n private builder: SolanaTransactionBuilder;\n private dirty: boolean = false;\n\n constructor(config: VkDeploymentManagerConfig) {\n this.config = {\n network: config.network,\n rpcEndpoint: config.rpcEndpoint ?? NETWORK_ENDPOINTS[config.network],\n configDir: config.configDir ?? '.izi-noir',\n programId: config.programId ?? '',\n computeUnits: config.computeUnits ?? 400_000,\n };\n this.deployments = new Map();\n this.builder = new SolanaTransactionBuilder({\n programId: this.config.programId || undefined,\n computeUnits: this.config.computeUnits,\n });\n }\n\n /**\n * Loads deployment state from disk.\n *\n * In browser environments, this is a no-op.\n * In Node.js, reads from {configDir}/deployments.json\n */\n async load(): Promise<void> {\n // This is a placeholder - actual file I/O depends on environment\n // Node.js implementation would use fs.readFile\n // Browser could use localStorage or IndexedDB\n\n // For now, we provide a method signature that implementations can override\n // or users can call loadFromJson with their own loading logic\n }\n\n /**\n * Loads deployment state from a JSON object.\n */\n loadFromJson(state: DeploymentsState): void {\n this.deployments.clear();\n for (const deployment of state.deployments) {\n // Only load deployments for current network\n if (deployment.network === this.config.network) {\n const key = this.makeDeploymentKey(deployment.circuitId, deployment.vkHash);\n this.deployments.set(key, deployment);\n }\n }\n this.dirty = false;\n }\n\n /**\n * Saves deployment state.\n *\n * Returns the state object for custom persistence.\n */\n async save(): Promise<DeploymentsState> {\n const state = this.toJson();\n this.dirty = false;\n // Actual file I/O would be environment-specific\n return state;\n }\n\n /**\n * Exports deployment state to JSON.\n */\n toJson(): DeploymentsState {\n return {\n version: '1.0',\n deployments: Array.from(this.deployments.values()),\n };\n }\n\n /**\n * Ensures a VK is deployed, skipping if already exists.\n *\n * @returns Deployment result with VK account address\n */\n async ensureDeployed(options: EnsureDeployedOptions): Promise<DeploymentResult> {\n const { circuitName, solanaProofData, authority, payer, forceRedeploy } = options;\n\n // Calculate VK hash for deduplication\n const vkHash = await this.hashVkBytes(solanaProofData.verifyingKey.bytes);\n const deploymentKey = this.makeDeploymentKey(circuitName, vkHash);\n\n // Check if already deployed\n const existing = this.deployments.get(deploymentKey);\n if (existing && !forceRedeploy) {\n return {\n deployed: false,\n vkAccount: existing.vkAccount,\n deployment: existing,\n };\n }\n\n // Generate VK account keypair placeholder\n // The actual keypair generation is done by the caller\n const vkAccountPubkey = this.generateVkAccountPlaceholder();\n\n // Build instructions\n const instructions: InstructionData[] = [];\n\n // Add compute budget\n instructions.push(this.builder.buildSetComputeUnitLimitInstruction());\n\n // Add init VK instruction\n const initVk = this.builder.buildInitVkInstruction(solanaProofData, {\n vkAccount: vkAccountPubkey,\n authority,\n payer,\n });\n instructions.push(initVk);\n\n // Define signers needed\n const signers: SignerInfo[] = [\n { pubkey: vkAccountPubkey, isNewKeypair: true, role: 'vkAccount' },\n { pubkey: authority, isNewKeypair: false, role: 'authority' },\n ];\n if (payer !== authority) {\n signers.push({ pubkey: payer, isNewKeypair: false, role: 'payer' });\n }\n\n // Send transaction\n const txSignature = await options.sendTransaction(instructions, signers);\n\n // Record deployment\n const deployment: VkDeployment = {\n circuitId: circuitName,\n vkAccount: vkAccountPubkey,\n authority,\n deployedAt: new Date().toISOString(),\n txSignature,\n network: this.config.network,\n vkHash,\n nrPublicInputs: solanaProofData.verifyingKey.nrPublicInputs,\n };\n\n this.deployments.set(deploymentKey, deployment);\n this.dirty = true;\n\n return {\n deployed: true,\n vkAccount: vkAccountPubkey,\n txSignature,\n deployment,\n };\n }\n\n /**\n * Gets deployment by circuit name.\n */\n getDeployment(circuitName: string): VkDeployment | undefined {\n // Search by circuit ID (partial match without hash)\n for (const [key, deployment] of this.deployments) {\n if (deployment.circuitId === circuitName) {\n return deployment;\n }\n }\n return undefined;\n }\n\n /**\n * Gets deployment by VK hash.\n */\n getDeploymentByVkHash(vkHash: string): VkDeployment | undefined {\n for (const deployment of this.deployments.values()) {\n if (deployment.vkHash === vkHash) {\n return deployment;\n }\n }\n return undefined;\n }\n\n /**\n * Gets all deployments.\n */\n getAllDeployments(): VkDeployment[] {\n return Array.from(this.deployments.values());\n }\n\n /**\n * Checks if there are unsaved changes.\n */\n isDirty(): boolean {\n return this.dirty;\n }\n\n /**\n * Gets the RPC endpoint.\n */\n getRpcEndpoint(): string {\n return this.config.rpcEndpoint;\n }\n\n /**\n * Gets the network.\n */\n getNetwork(): SolanaNetwork {\n return this.config.network;\n }\n\n /**\n * Prepares instructions for deployment without sending.\n *\n * Useful when you need to combine with other instructions\n * or use a specific signing flow.\n */\n prepareDeployment(\n solanaProofData: SolanaProofData,\n accounts: {\n vkAccount: string;\n authority: string;\n payer: string;\n }\n ): {\n instructions: InstructionData[];\n signers: SignerInfo[];\n rentLamports: number;\n } {\n const instructions: InstructionData[] = [];\n\n // Compute budget\n instructions.push(this.builder.buildSetComputeUnitLimitInstruction());\n\n // Init VK\n instructions.push(\n this.builder.buildInitVkInstruction(solanaProofData, {\n vkAccount: accounts.vkAccount,\n authority: accounts.authority,\n payer: accounts.payer,\n })\n );\n\n const signers: SignerInfo[] = [\n { pubkey: accounts.vkAccount, isNewKeypair: true, role: 'vkAccount' },\n { pubkey: accounts.authority, isNewKeypair: false, role: 'authority' },\n ];\n if (accounts.payer !== accounts.authority) {\n signers.push({ pubkey: accounts.payer, isNewKeypair: false, role: 'payer' });\n }\n\n return {\n instructions,\n signers,\n rentLamports: solanaProofData.estimatedRent,\n };\n }\n\n /**\n * Records an external deployment (made outside this manager).\n */\n recordDeployment(deployment: VkDeployment): void {\n const key = this.makeDeploymentKey(deployment.circuitId, deployment.vkHash);\n this.deployments.set(key, deployment);\n this.dirty = true;\n }\n\n /**\n * Removes a deployment record.\n */\n removeDeployment(circuitName: string): boolean {\n for (const [key, deployment] of this.deployments) {\n if (deployment.circuitId === circuitName) {\n this.deployments.delete(key);\n this.dirty = true;\n return true;\n }\n }\n return false;\n }\n\n // Private helpers\n\n private makeDeploymentKey(circuitId: string, vkHash: string): string {\n return `${circuitId}:${vkHash.slice(0, 16)}`;\n }\n\n private async hashVkBytes(bytes: Uint8Array): Promise<string> {\n // Use SubtleCrypto for hashing (works in browser and Node.js 15+)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Fallback: simple hash (not cryptographically secure, but deterministic)\n let hash = 0;\n for (let i = 0; i < bytes.length; i++) {\n hash = ((hash << 5) - hash + bytes[i]) | 0;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n private generateVkAccountPlaceholder(): string {\n // This is a placeholder that signals to the caller\n // that they need to generate a real keypair\n // In practice, the sendTransaction callback receives SignerInfo\n // which indicates isNewKeypair: true for the VK account\n return 'PENDING_VK_ACCOUNT_KEYPAIR';\n }\n}\n\n/**\n * Creates a VK Deployment Manager with Node.js file persistence.\n *\n * @example\n * ```typescript\n * const manager = await createNodeVkDeploymentManager({\n * network: 'devnet',\n * configDir: './.izi-noir',\n * });\n *\n * // Automatically loads existing deployments\n * // and saves on manager.save()\n * ```\n */\nexport async function createNodeVkDeploymentManager(\n config: VkDeploymentManagerConfig\n): Promise<VkDeploymentManager> {\n const manager = new VkDeploymentManager(config);\n // In Node.js, we'd load from disk here\n // This is a stub - actual implementation would use fs\n await manager.load();\n return manager;\n}\n","/**\n * Circuit Registry for IZI-NOIR.\n *\n * Provides naming, versioning, and metadata management for JS circuits.\n * Enables circuit reuse and documentation generation.\n *\n * @example\n * ```typescript\n * import { CircuitRegistry } from '@izi-noir/sdk';\n *\n * const registry = new CircuitRegistry();\n *\n * // Register a circuit\n * registry.register({\n * name: 'balance-check',\n * version: '1.0.0',\n * description: 'Proves balance >= minimum without revealing actual balance',\n * jsCircuit: ([minimum], [balance]) => {\n * assert(balance >= minimum);\n * },\n * publicInputs: [{ name: 'minimum', type: 'Field', description: 'Minimum required balance' }],\n * privateInputs: [{ name: 'balance', type: 'Field', description: 'Actual balance (kept private)' }],\n * tags: ['finance', 'privacy'],\n * });\n *\n * // Use the circuit\n * const circuit = registry.get('balance-check');\n * const result = await izi.createProof(circuit.jsCircuit, [100], [250]);\n * ```\n *\n * @module @izi-noir/sdk/registry\n */\n\nimport type { CircuitFunction } from '../domain/types.js';\n\n/**\n * Input field definition with metadata.\n */\nexport interface CircuitInputDef {\n /** Name of the input */\n name: string;\n /** Type in Noir (Field, u8, u32, etc.) */\n type: 'Field' | 'u8' | 'u16' | 'u32' | 'u64' | 'bool' | string;\n /** Human-readable description */\n description?: string;\n /** Optional constraint or validation info */\n constraints?: string;\n}\n\n/**\n * Circuit definition with metadata.\n */\nexport interface CircuitDefinition {\n /** Unique identifier for the circuit */\n name: string;\n /** Semantic version (e.g., '1.0.0') */\n version: string;\n /** Human-readable description */\n description?: string;\n /** The JavaScript circuit function */\n jsCircuit: CircuitFunction;\n /** Public inputs metadata */\n publicInputs: CircuitInputDef[];\n /** Private inputs metadata */\n privateInputs: CircuitInputDef[];\n /** Optional tags for categorization */\n tags?: string[];\n /** Optional author information */\n author?: string;\n /** Optional license */\n license?: string;\n}\n\n/**\n * Registered circuit with computed metadata.\n */\nexport interface RegisteredCircuit extends CircuitDefinition {\n /** When the circuit was registered */\n registeredAt: Date;\n /** Unique identifier combining name and version */\n id: string;\n /** Hash of the circuit function for change detection */\n functionHash: string;\n}\n\n/**\n * Options for circuit lookup.\n */\nexport interface GetCircuitOptions {\n /** Specific version to get (default: latest) */\n version?: string;\n}\n\n/**\n * Circuit Registry.\n *\n * A registry for managing named, versioned circuits with rich metadata.\n * Provides features for:\n * - Semantic versioning\n * - Input/output documentation\n * - Tag-based categorization\n * - Change detection\n */\nexport class CircuitRegistry {\n private circuits: Map<string, RegisteredCircuit[]> = new Map();\n\n /**\n * Registers a new circuit.\n *\n * @param definition - Circuit definition with metadata\n * @returns The registered circuit with computed fields\n * @throws Error if circuit with same name and version exists\n */\n register(definition: CircuitDefinition): RegisteredCircuit {\n const { name, version } = definition;\n\n // Validate semver format (basic check)\n if (!/^\\d+\\.\\d+\\.\\d+/.test(version)) {\n throw new Error(\n `Invalid version format: ${version}. Use semantic versioning (e.g., '1.0.0')`\n );\n }\n\n // Validate circuit function\n if (typeof definition.jsCircuit !== 'function') {\n throw new Error('jsCircuit must be a function');\n }\n\n // Check for existing version\n const existing = this.circuits.get(name) ?? [];\n if (existing.some((c) => c.version === version)) {\n throw new Error(\n `Circuit '${name}' version ${version} already registered. Use a new version.`\n );\n }\n\n // Compute function hash for change detection\n const functionHash = this.hashFunction(definition.jsCircuit);\n\n // Create registered circuit\n const registered: RegisteredCircuit = {\n ...definition,\n registeredAt: new Date(),\n id: `${name}@${version}`,\n functionHash,\n };\n\n // Store sorted by version (newest first)\n existing.push(registered);\n existing.sort((a, b) => this.compareVersions(b.version, a.version));\n this.circuits.set(name, existing);\n\n return registered;\n }\n\n /**\n * Gets a circuit by name.\n *\n * @param name - Circuit name\n * @param options - Lookup options (version, etc.)\n * @returns The circuit or undefined if not found\n */\n get(name: string, options?: GetCircuitOptions): RegisteredCircuit | undefined {\n const versions = this.circuits.get(name);\n if (!versions || versions.length === 0) {\n return undefined;\n }\n\n if (options?.version) {\n return versions.find((c) => c.version === options.version);\n }\n\n // Return latest version (first in sorted array)\n return versions[0];\n }\n\n /**\n * Gets all versions of a circuit.\n *\n * @param name - Circuit name\n * @returns Array of all registered versions\n */\n getVersions(name: string): RegisteredCircuit[] {\n return this.circuits.get(name) ?? [];\n }\n\n /**\n * Checks if a circuit exists.\n *\n * @param name - Circuit name\n * @param version - Optional specific version\n */\n has(name: string, version?: string): boolean {\n const circuit = this.get(name, version ? { version } : undefined);\n return circuit !== undefined;\n }\n\n /**\n * Gets all registered circuit names.\n */\n names(): string[] {\n return Array.from(this.circuits.keys());\n }\n\n /**\n * Gets all registered circuits.\n */\n all(): RegisteredCircuit[] {\n const result: RegisteredCircuit[] = [];\n for (const versions of this.circuits.values()) {\n result.push(...versions);\n }\n return result;\n }\n\n /**\n * Searches circuits by tag.\n *\n * @param tag - Tag to search for\n * @returns Circuits with matching tag\n */\n findByTag(tag: string): RegisteredCircuit[] {\n const result: RegisteredCircuit[] = [];\n for (const versions of this.circuits.values()) {\n for (const circuit of versions) {\n if (circuit.tags?.includes(tag)) {\n result.push(circuit);\n }\n }\n }\n return result;\n }\n\n /**\n * Removes a circuit from the registry.\n *\n * @param name - Circuit name\n * @param version - Optional specific version (removes all if not specified)\n * @returns true if circuit was removed\n */\n remove(name: string, version?: string): boolean {\n if (!version) {\n return this.circuits.delete(name);\n }\n\n const versions = this.circuits.get(name);\n if (!versions) return false;\n\n const index = versions.findIndex((c) => c.version === version);\n if (index === -1) return false;\n\n versions.splice(index, 1);\n if (versions.length === 0) {\n this.circuits.delete(name);\n }\n return true;\n }\n\n /**\n * Exports the registry to a serializable format.\n */\n export(): CircuitRegistryExport {\n const circuits: CircuitExportEntry[] = [];\n\n for (const [name, versions] of this.circuits) {\n for (const circuit of versions) {\n circuits.push({\n name: circuit.name,\n version: circuit.version,\n description: circuit.description,\n publicInputs: circuit.publicInputs,\n privateInputs: circuit.privateInputs,\n tags: circuit.tags,\n author: circuit.author,\n license: circuit.license,\n registeredAt: circuit.registeredAt.toISOString(),\n functionHash: circuit.functionHash,\n // Note: jsCircuit is not serializable\n });\n }\n }\n\n return {\n version: '1.0',\n exportedAt: new Date().toISOString(),\n circuits,\n };\n }\n\n /**\n * Generates documentation for a circuit.\n *\n * @param name - Circuit name\n * @returns Markdown documentation\n */\n generateDocs(name: string): string {\n const circuit = this.get(name);\n if (!circuit) {\n return `Circuit '${name}' not found.`;\n }\n\n const lines: string[] = [\n `# ${circuit.name}`,\n '',\n `**Version:** ${circuit.version}`,\n ];\n\n if (circuit.description) {\n lines.push('', circuit.description);\n }\n\n if (circuit.author) {\n lines.push('', `**Author:** ${circuit.author}`);\n }\n\n if (circuit.license) {\n lines.push(`**License:** ${circuit.license}`);\n }\n\n if (circuit.tags && circuit.tags.length > 0) {\n lines.push('', `**Tags:** ${circuit.tags.join(', ')}`);\n }\n\n lines.push('', '## Public Inputs', '');\n if (circuit.publicInputs.length === 0) {\n lines.push('None');\n } else {\n lines.push('| Name | Type | Description |', '|------|------|-------------|');\n for (const input of circuit.publicInputs) {\n lines.push(`| ${input.name} | ${input.type} | ${input.description ?? '-'} |`);\n }\n }\n\n lines.push('', '## Private Inputs', '');\n if (circuit.privateInputs.length === 0) {\n lines.push('None');\n } else {\n lines.push('| Name | Type | Description |', '|------|------|-------------|');\n for (const input of circuit.privateInputs) {\n lines.push(`| ${input.name} | ${input.type} | ${input.description ?? '-'} |`);\n }\n }\n\n lines.push('', '## Circuit Function', '', '```javascript', circuit.jsCircuit.toString(), '```');\n\n return lines.join('\\n');\n }\n\n /**\n * Validates circuit inputs against the definition.\n *\n * @param name - Circuit name\n * @param publicInputs - Public inputs to validate\n * @param privateInputs - Private inputs to validate\n * @throws Error if validation fails\n */\n validateInputs(\n name: string,\n publicInputs: unknown[],\n privateInputs: unknown[]\n ): void {\n const circuit = this.get(name);\n if (!circuit) {\n throw new Error(`Circuit '${name}' not found`);\n }\n\n if (publicInputs.length !== circuit.publicInputs.length) {\n throw new Error(\n `Expected ${circuit.publicInputs.length} public inputs, got ${publicInputs.length}`\n );\n }\n\n if (privateInputs.length !== circuit.privateInputs.length) {\n throw new Error(\n `Expected ${circuit.privateInputs.length} private inputs, got ${privateInputs.length}`\n );\n }\n\n // Type validation based on input definitions\n for (let i = 0; i < publicInputs.length; i++) {\n this.validateInput(\n publicInputs[i],\n circuit.publicInputs[i],\n `public input '${circuit.publicInputs[i].name}'`\n );\n }\n\n for (let i = 0; i < privateInputs.length; i++) {\n this.validateInput(\n privateInputs[i],\n circuit.privateInputs[i],\n `private input '${circuit.privateInputs[i].name}'`\n );\n }\n }\n\n // Private helpers\n\n private hashFunction(fn: CircuitFunction): string {\n const str = fn.toString();\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n private compareVersions(a: string, b: string): number {\n const partsA = a.split('.').map((n) => parseInt(n, 10));\n const partsB = b.split('.').map((n) => parseInt(n, 10));\n\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const numA = partsA[i] ?? 0;\n const numB = partsB[i] ?? 0;\n if (numA > numB) return 1;\n if (numA < numB) return -1;\n }\n return 0;\n }\n\n private validateInput(\n value: unknown,\n def: CircuitInputDef,\n location: string\n ): void {\n switch (def.type) {\n case 'bool':\n if (typeof value !== 'boolean' && value !== 0 && value !== 1) {\n throw new Error(`${location}: expected boolean, got ${typeof value}`);\n }\n break;\n case 'Field':\n case 'u8':\n case 'u16':\n case 'u32':\n case 'u64':\n if (typeof value !== 'number' && typeof value !== 'bigint') {\n throw new Error(`${location}: expected number/bigint, got ${typeof value}`);\n }\n break;\n default:\n // Unknown type, skip validation\n break;\n }\n }\n}\n\n/**\n * Serializable circuit entry (without the function).\n */\nexport interface CircuitExportEntry {\n name: string;\n version: string;\n description?: string;\n publicInputs: CircuitInputDef[];\n privateInputs: CircuitInputDef[];\n tags?: string[];\n author?: string;\n license?: string;\n registeredAt: string;\n functionHash: string;\n}\n\n/**\n * Serializable registry export.\n */\nexport interface CircuitRegistryExport {\n version: '1.0';\n exportedAt: string;\n circuits: CircuitExportEntry[];\n}\n\n/**\n * Creates a global registry singleton.\n */\nlet globalRegistry: CircuitRegistry | null = null;\n\nexport function getGlobalRegistry(): CircuitRegistry {\n if (!globalRegistry) {\n globalRegistry = new CircuitRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Decorator-style function to register a circuit with minimal boilerplate.\n *\n * @example\n * ```typescript\n * const balanceCheck = defineCircuit({\n * name: 'balance-check',\n * version: '1.0.0',\n * publicInputs: [{ name: 'minimum', type: 'Field' }],\n * privateInputs: [{ name: 'balance', type: 'Field' }],\n * }, ([minimum], [balance]) => {\n * assert(balance >= minimum);\n * });\n *\n * // balanceCheck is now registered and contains the full definition\n * ```\n */\nexport function defineCircuit(\n metadata: Omit<CircuitDefinition, 'jsCircuit'>,\n jsCircuit: CircuitFunction\n): RegisteredCircuit {\n const registry = getGlobalRegistry();\n return registry.register({ ...metadata, jsCircuit });\n}\n","/**\n * Off-Chain Verifier for IZI-NOIR.\n *\n * Provides ZK proof verification without on-chain transactions.\n * Useful for API authentication, backend validation, and testing.\n *\n * @example\n * ```typescript\n * import { OffchainVerifier, createVerifierMiddleware } from '@izi-noir/sdk';\n * import express from 'express';\n *\n * // Create verifier with compiled circuits\n * const verifier = new OffchainVerifier();\n *\n * // Register circuits for verification\n * await verifier.registerCircuit('age-check', {\n * jsCircuit: ([minAge], [birthYear]) => {\n * assert(2024 - birthYear >= minAge);\n * }\n * });\n *\n * // Use as Express middleware\n * const app = express();\n * app.post('/api/verify', createVerifierMiddleware(verifier));\n *\n * // Or verify directly\n * const result = await verifier.verify({\n * circuitName: 'age-check',\n * proof: proofBytes,\n * publicInputs: [18],\n * });\n *\n * if (result.verified) {\n * console.log('Proof valid!');\n * }\n * ```\n *\n * @module @izi-noir/sdk/server\n */\n\nimport type { CircuitFunction, CompiledCircuit, ProofResult } from '../domain/types.js';\n\n/**\n * Circuit configuration for offchain verification.\n */\nexport interface OffchainCircuitConfig {\n /** JavaScript circuit function */\n jsCircuit: CircuitFunction;\n /** Pre-compiled circuit (optional, will compile if not provided) */\n compiledCircuit?: CompiledCircuit;\n /** Expected number of public inputs */\n publicInputCount?: number;\n}\n\n/**\n * Verification request.\n */\nexport interface VerifyRequest {\n /** Circuit name to verify against */\n circuitName: string;\n /** Proof bytes (hex string or Uint8Array) */\n proof: string | Uint8Array;\n /** Public inputs (numbers or hex strings) */\n publicInputs: Array<number | bigint | string>;\n}\n\n/**\n * Verification result.\n */\nexport interface VerifyResult {\n /** Whether the proof is valid */\n verified: boolean;\n /** Circuit name */\n circuitName: string;\n /** Verification time in milliseconds */\n verificationTimeMs: number;\n /** Error message if verification failed */\n error?: string;\n /** Public inputs that were verified */\n publicInputs: Array<number | bigint | string>;\n}\n\n/**\n * Configuration for OffchainVerifier.\n */\nexport interface OffchainVerifierConfig {\n /**\n * Callback to compile a circuit.\n * Required if registering circuits by jsCircuit without pre-compiled circuit.\n */\n compiler?: (jsCircuit: CircuitFunction) => Promise<CompiledCircuit>;\n\n /**\n * Callback to verify a proof against a compiled circuit.\n */\n verifier?: (\n circuit: CompiledCircuit,\n proof: Uint8Array,\n publicInputs: Uint8Array[]\n ) => Promise<boolean>;\n}\n\n/**\n * Express-like request interface.\n */\ninterface ExpressRequest {\n body: {\n circuitName?: string;\n proof?: string | Uint8Array;\n publicInputs?: Array<number | bigint | string>;\n };\n}\n\n/**\n * Express-like response interface.\n */\ninterface ExpressResponse {\n status(code: number): ExpressResponse;\n json(body: unknown): ExpressResponse;\n}\n\n/**\n * Express-like next function.\n */\ntype ExpressNext = (err?: Error) => void;\n\n/**\n * Off-chain ZK proof verifier.\n *\n * Manages registered circuits and provides proof verification\n * without requiring blockchain transactions.\n */\nexport class OffchainVerifier {\n private circuits: Map<string, OffchainCircuitConfig> = new Map();\n private compiledCircuits: Map<string, CompiledCircuit> = new Map();\n private config: OffchainVerifierConfig;\n\n constructor(config: OffchainVerifierConfig = {}) {\n this.config = config;\n }\n\n /**\n * Registers a circuit for verification.\n *\n * @param name - Unique name for the circuit\n * @param config - Circuit configuration\n */\n async registerCircuit(name: string, config: OffchainCircuitConfig): Promise<void> {\n this.circuits.set(name, config);\n\n // If pre-compiled circuit provided, use it\n if (config.compiledCircuit) {\n this.compiledCircuits.set(name, config.compiledCircuit);\n return;\n }\n\n // Otherwise, compile using provided compiler\n if (this.config.compiler) {\n const compiled = await this.config.compiler(config.jsCircuit);\n this.compiledCircuits.set(name, compiled);\n }\n }\n\n /**\n * Registers a pre-compiled circuit.\n *\n * @param name - Unique name for the circuit\n * @param compiled - Pre-compiled circuit\n */\n registerCompiledCircuit(name: string, compiled: CompiledCircuit): void {\n this.compiledCircuits.set(name, compiled);\n }\n\n /**\n * Verifies a ZK proof.\n *\n * @param request - Verification request with circuit name, proof, and public inputs\n * @returns Verification result\n */\n async verify(request: VerifyRequest): Promise<VerifyResult> {\n const startTime = performance.now();\n const { circuitName, proof, publicInputs } = request;\n\n // Get compiled circuit\n const compiled = this.compiledCircuits.get(circuitName);\n if (!compiled) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: `Circuit '${circuitName}' not registered`,\n publicInputs,\n };\n }\n\n // Validate public inputs count\n const config = this.circuits.get(circuitName);\n if (config?.publicInputCount !== undefined) {\n if (publicInputs.length !== config.publicInputCount) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: `Expected ${config.publicInputCount} public inputs, got ${publicInputs.length}`,\n publicInputs,\n };\n }\n }\n\n try {\n // Convert proof to Uint8Array\n const proofBytes = this.toUint8Array(proof);\n\n // Convert public inputs to Uint8Array[]\n const publicInputBytes = publicInputs.map((input) =>\n this.publicInputToBytes(input)\n );\n\n // Verify using provided verifier\n if (!this.config.verifier) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: 'No verifier configured. Provide a verifier in the config.',\n publicInputs,\n };\n }\n\n const verified = await this.config.verifier(\n compiled,\n proofBytes,\n publicInputBytes\n );\n\n return {\n verified,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n publicInputs,\n };\n } catch (error) {\n return {\n verified: false,\n circuitName,\n verificationTimeMs: performance.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown verification error',\n publicInputs,\n };\n }\n }\n\n /**\n * Checks if a circuit is registered.\n *\n * @param name - Circuit name\n */\n hasCircuit(name: string): boolean {\n return this.compiledCircuits.has(name);\n }\n\n /**\n * Gets all registered circuit names.\n */\n getCircuitNames(): string[] {\n return Array.from(this.compiledCircuits.keys());\n }\n\n /**\n * Removes a circuit from the verifier.\n *\n * @param name - Circuit name to remove\n */\n removeCircuit(name: string): boolean {\n this.circuits.delete(name);\n return this.compiledCircuits.delete(name);\n }\n\n // Private helpers\n\n private toUint8Array(input: string | Uint8Array): Uint8Array {\n if (input instanceof Uint8Array) {\n return input;\n }\n\n // Handle hex string\n const hex = input.startsWith('0x') ? input.slice(2) : input;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n }\n\n private publicInputToBytes(input: number | bigint | string): Uint8Array {\n let value: bigint;\n\n if (typeof input === 'string') {\n // Handle hex string or decimal string\n value = input.startsWith('0x')\n ? BigInt(input)\n : BigInt(input);\n } else if (typeof input === 'bigint') {\n value = input;\n } else {\n value = BigInt(input);\n }\n\n // Convert to 32-byte big-endian array (Field element)\n const bytes = new Uint8Array(32);\n for (let i = 31; i >= 0; i--) {\n bytes[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return bytes;\n }\n}\n\n/**\n * Creates an Express middleware for proof verification.\n *\n * @param verifier - The OffchainVerifier instance\n * @returns Express middleware function\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { OffchainVerifier, createVerifierMiddleware } from '@izi-noir/sdk';\n *\n * const app = express();\n * const verifier = new OffchainVerifier({ ... });\n *\n * // Register your circuits\n * await verifier.registerCircuit('my-circuit', { ... });\n *\n * // Add middleware\n * app.use(express.json());\n * app.post('/verify', createVerifierMiddleware(verifier));\n *\n * // Client sends:\n * // POST /verify\n * // { \"circuitName\": \"my-circuit\", \"proof\": \"0x...\", \"publicInputs\": [123, 456] }\n *\n * // Server responds:\n * // { \"verified\": true, \"circuitName\": \"my-circuit\", \"verificationTimeMs\": 42 }\n * ```\n */\nexport function createVerifierMiddleware(\n verifier: OffchainVerifier\n): (req: ExpressRequest, res: ExpressResponse, next: ExpressNext) => Promise<void> {\n return async (req, res, next) => {\n try {\n const { circuitName, proof, publicInputs } = req.body;\n\n // Validate request\n if (!circuitName || typeof circuitName !== 'string') {\n res.status(400).json({\n error: 'Missing or invalid circuitName',\n });\n return;\n }\n\n if (!proof) {\n res.status(400).json({\n error: 'Missing proof',\n });\n return;\n }\n\n if (!Array.isArray(publicInputs)) {\n res.status(400).json({\n error: 'Missing or invalid publicInputs (expected array)',\n });\n return;\n }\n\n // Check if circuit exists\n if (!verifier.hasCircuit(circuitName)) {\n res.status(404).json({\n error: `Circuit '${circuitName}' not found`,\n });\n return;\n }\n\n // Verify the proof\n const result = await verifier.verify({\n circuitName,\n proof,\n publicInputs,\n });\n\n // Return result\n if (result.verified) {\n res.status(200).json(result);\n } else {\n res.status(400).json(result);\n }\n } catch (error) {\n next(error instanceof Error ? error : new Error(String(error)));\n }\n };\n}\n\n/**\n * Options for verification endpoint.\n */\nexport interface VerificationEndpointOptions {\n /** Custom path for the endpoint (default: '/verify') */\n path?: string;\n /** Rate limiting (requests per minute, 0 = unlimited) */\n rateLimit?: number;\n /** Required API key header */\n apiKeyHeader?: string;\n /** Allowed circuit names (empty = all) */\n allowedCircuits?: string[];\n}\n\n/**\n * Creates a verification endpoint configuration.\n *\n * This is a helper for setting up verification endpoints with\n * common options like rate limiting and API key authentication.\n *\n * @example\n * ```typescript\n * const config = createVerificationEndpoint(verifier, {\n * path: '/api/v1/verify',\n * rateLimit: 100,\n * apiKeyHeader: 'X-API-Key',\n * allowedCircuits: ['balance-check', 'age-verify'],\n * });\n *\n * // Use with Express\n * app.post(config.path, config.middleware);\n * ```\n */\nexport function createVerificationEndpoint(\n verifier: OffchainVerifier,\n options: VerificationEndpointOptions = {}\n): {\n path: string;\n middleware: (req: ExpressRequest, res: ExpressResponse, next: ExpressNext) => Promise<void>;\n} {\n const baseMiddleware = createVerifierMiddleware(verifier);\n\n const wrappedMiddleware = async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: ExpressNext\n ) => {\n // Check allowed circuits\n if (\n options.allowedCircuits &&\n options.allowedCircuits.length > 0 &&\n req.body.circuitName\n ) {\n if (!options.allowedCircuits.includes(req.body.circuitName)) {\n res.status(403).json({\n error: `Circuit '${req.body.circuitName}' not allowed`,\n });\n return;\n }\n }\n\n // Delegate to base middleware\n await baseMiddleware(req, res, next);\n };\n\n return {\n path: options.path ?? '/verify',\n middleware: wrappedMiddleware,\n };\n}\n\n/**\n * Verification result for batch operations.\n */\nexport interface BatchVerifyResult {\n /** Results for each verification */\n results: VerifyResult[];\n /** Total time for all verifications */\n totalTimeMs: number;\n /** Number of verified proofs */\n verifiedCount: number;\n /** Number of failed verifications */\n failedCount: number;\n}\n\n/**\n * Batch verification extension for OffchainVerifier.\n *\n * @example\n * ```typescript\n * const results = await batchVerify(verifier, [\n * { circuitName: 'age-check', proof: proof1, publicInputs: [18] },\n * { circuitName: 'balance-check', proof: proof2, publicInputs: [100] },\n * ]);\n *\n * console.log(`Verified: ${results.verifiedCount}/${results.results.length}`);\n * ```\n */\nexport async function batchVerify(\n verifier: OffchainVerifier,\n requests: VerifyRequest[]\n): Promise<BatchVerifyResult> {\n const startTime = performance.now();\n\n // Run all verifications in parallel\n const results = await Promise.all(\n requests.map((request) => verifier.verify(request))\n );\n\n const verifiedCount = results.filter((r) => r.verified).length;\n\n return {\n results,\n totalTimeMs: performance.now() - startTime,\n verifiedCount,\n failedCount: results.length - verifiedCount,\n };\n}\n","/**\n * Configuration for IZI-NOIR project build\n */\nexport interface IziNoirBuildConfig {\n /** Directory containing circuit files */\n circuitsDir: string;\n\n /** Output directory for compiled circuits */\n outDir: string;\n\n /** Proving provider to use */\n provider: 'arkworks' | 'barretenberg';\n\n /** Watch mode configuration */\n watch?: {\n /** Debounce time for file changes in milliseconds */\n debounce?: number;\n };\n\n /** Advanced options */\n advanced?: {\n /** Enable debug output */\n debug?: boolean;\n /** Parallel compilation */\n parallel?: boolean;\n };\n}\n\n/**\n * Helper function to define IZI-NOIR configuration with type safety.\n *\n * @example\n * ```typescript\n * // izi-noir.config.ts\n * import { defineConfig } from '@izi-noir/sdk';\n *\n * export default defineConfig({\n * circuitsDir: './circuits',\n * outDir: './generated',\n * provider: 'arkworks',\n * });\n * ```\n */\nexport function defineConfig(config: IziNoirBuildConfig): IziNoirBuildConfig {\n return config;\n}\n"],"mappings":"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","names":["isNodeJs","ptr","arkworks_groth16_wasm_exports","acir_to_r1cs_info","init_panic_hook","prove","prove_from_r1cs","setup","setup_from_r1cs","verify","verify_gnark","version","passStringToWasm0","wasm","WASM_VECTOR_LEN","takeFromExternrefTable0","getStringFromWasm0","__wbg_get_imports","getDataViewMemory0","handleError","getArrayU8FromWasm0","isLikeNone","addToExternrefTable0","getUint8ArrayMemory0","cachedDataViewMemory0","decodeText","cachedUint8ArrayMemory0","cachedTextEncoder","ptr","cachedTextDecoder","module","wasmModule","init_arkworks_groth16_wasm","compile","createFileManager","Noir","stringToStream","isNodeJs","createTempDir","wasmModule","wasmInitPromise","module","FIELD_SIZE","wasm","Chain","Provider","Barretenberg","ArkworksWasm","SolanaFormatter","callee","G1_SIZE","G2_SIZE","G1_SIZE","G2_SIZE","hex","hexToBytes","hexToBytes","G1_SIZE","G2_SIZE","version"]}
|