Skip to main content

Overview

Every operation that generates a Groth16 ZK proof requires a prover passed through deps. There is no hard-coded default - you must always supply one. All provers follow the same prove(inputs) → { proofA, proofB, proofC } contract. For instantiation, Web Worker setup, and remote proving backends, see ZK Provers.

IZkProverForUserRegistration

interface IZkProverForUserRegistration {
  prove(inputs: UserRegistrationCircuitInputs): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getUserRegistrationFunction deps (zkProver).

IZkProverForSelfClaimableUtxo

interface IZkProverForSelfClaimableUtxo {
  prove(inputs: SelfClaimableUtxoCircuitInputs): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getEncryptedBalanceToSelfClaimableUtxoCreatorFunction deps (zkProver). For public-balance UTXO creation, see ZkProverForSelfClaimableUtxoFromPublicBalance below.

IZkProverForReceiverClaimableUtxo

interface IZkProverForReceiverClaimableUtxo {
  prove(inputs: ReceiverClaimableUtxoCircuitInputs): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getEncryptedBalanceToReceiverClaimableUtxoCreatorFunction deps (zkProver). For public-balance UTXO creation, see ZkProverForReceiverClaimableUtxoFromPublicBalance below.

IZkProverForClaimSelfClaimableUtxoIntoEncryptedBalance

interface IZkProverForClaimSelfClaimableUtxoIntoEncryptedBalance {
  readonly maxUtxoCapacity: 1;
  prove(inputs: ClaimSelfClaimableUtxoIntoEncryptedBalanceCircuitInputs): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getSelfClaimableUtxoToEncryptedBalanceClaimerFunction deps (zkProver).

IZkProverForClaimReceiverClaimableUtxoIntoEncryptedBalance

interface IZkProverForClaimReceiverClaimableUtxoIntoEncryptedBalance {
  prove(
    inputs: ClaimReceiverClaimableUtxoIntoEncryptedBalanceCircuitInputs,
    nLeaves: ClaimBatchSize,
  ): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getReceiverClaimableUtxoToEncryptedBalanceClaimerFunction deps (zkProver). This prover accepts a batch size nLeaves (1–16) because there are 16 distinct circuits, one per batch size.

IZkProverForClaimSelfClaimableUtxoIntoPublicBalance

interface IZkProverForClaimSelfClaimableUtxoIntoPublicBalance {
  readonly maxUtxoCapacity: 1;
  prove(inputs: ClaimSelfClaimableUtxoIntoPublicBalanceCircuitInputs): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getSelfClaimableUtxoToPublicBalanceClaimerFunction deps (zkProver).

ZkProverForSelfClaimableUtxoFromPublicBalance

interface ZkProverForSelfClaimableUtxoFromPublicBalance {
  prove(inputs: SelfClaimableUtxoFromPublicBalanceCircuitInputs): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getPublicBalanceToSelfClaimableUtxoCreatorFunction deps (zkProver).

ZkProverForReceiverClaimableUtxoFromPublicBalance

interface ZkProverForReceiverClaimableUtxoFromPublicBalance {
  prove(inputs: ReceiverClaimableUtxoFromPublicBalanceCircuitInputs): Promise<{
    proofA: Groth16ProofA;
    proofB: Groth16ProofB;
    proofC: Groth16ProofC;
  }>;
}
Required by: getPublicBalanceToReceiverClaimableUtxoCreatorFunction deps (zkProver).

Unified Prover Suite

All six provers can be combined into a single object and passed wherever individual provers are expected:
interface IZkProverSuite {
  readonly registration: IZkProverForUserRegistration;
  readonly utxoSelfClaimable: IZkProverForSelfClaimableUtxo;
  readonly utxoReceiverClaimable: IZkProverForReceiverClaimableUtxo;
  readonly claimSelfClaimableIntoEncryptedBalance: IZkProverForClaimSelfClaimableUtxoIntoEncryptedBalance;
  readonly claimReceiverClaimableIntoEncryptedBalance: IZkProverForClaimReceiverClaimableUtxoIntoEncryptedBalance;
  readonly claimSelfClaimableIntoPublicBalance: IZkProverForClaimSelfClaimableUtxoIntoPublicBalance;
}

Quick Setup with @umbra-privacy/web-zk-prover

The @umbra-privacy/web-zk-prover package provides ready-made factory functions for each prover interface. It uses snarkjs Groth16 under the hood and fetches proving keys from a CDN.
import {
  getUserRegistrationProver,
  getCreateSelfClaimableUtxoFromEncryptedBalanceProver,
  getCreateReceiverClaimableUtxoFromEncryptedBalanceProver,
  getCreateSelfClaimableUtxoFromPublicBalanceProver,
  getCreateReceiverClaimableUtxoFromPublicBalanceProver,
  getClaimSelfClaimableUtxoIntoEncryptedBalanceProver,
  getClaimReceiverClaimableUtxoIntoEncryptedBalanceProver,
  getClaimSelfClaimableUtxoIntoPublicBalanceProver,
} from "@umbra-privacy/web-zk-prover";

const registrationProver = getUserRegistrationProver();
const utxoSelfClaimableProver = getCreateSelfClaimableUtxoFromEncryptedBalanceProver();
const utxoReceiverClaimableProver = getCreateReceiverClaimableUtxoFromEncryptedBalanceProver();
const utxoSelfClaimableFromPublicProver = getCreateSelfClaimableUtxoFromPublicBalanceProver();
const utxoReceiverClaimableFromPublicProver = getCreateReceiverClaimableUtxoFromPublicBalanceProver();
const claimSelfClaimableEncryptedBalanceProver = getClaimSelfClaimableUtxoIntoEncryptedBalanceProver();
const claimReceiverClaimableEncryptedBalanceProver = getClaimReceiverClaimableUtxoIntoEncryptedBalanceProver();
const claimSelfClaimablePublicBalanceProver = getClaimSelfClaimableUtxoIntoPublicBalanceProver();
Each factory accepts an optional IZkAssetProvider parameter - a simple interface with one method: getAssetUrls(type, variant?). When no provider is passed, the factories default to the CDN provider (equivalent to calling getCdnZkAssetProvider() from @umbra-privacy/web-zk-prover/cdn), which fetches proving keys from Umbra’s CDN. You can supply your own provider to customise asset resolution. See ZK Provers for Web Worker setup, custom asset providers, and remote proving backends.