Skip to main content
This page is for the engineer running KYC in-house who needs verified customers on-chain. After reading it you will know which two artifacts leave your infrastructure, which never do, and which claims a proof can and cannot back. Trusset never sees or hashes your customers’ KYC data. You run the trusset-kyc-zk-proofs tool on your own infrastructure, and only two artifacts from its output ever reach Trusset:
  1. The root hash (kycHash) - a Rescue-Prime Merkle root over per-field commitments, stored on-chain by identity.verify.
  2. The bundle manifest (manifest.json) - hashes and public inputs only, used by identity.addClaimsFromProof to derive on-chain claims.
Names, birth dates, and document data stay on your machine. The proofs themselves (proofs/*.bin) and the encrypted witness material (secrets.enc) are never uploaded.

Run the proof tool

The tool is a separate repository you clone and run locally. It reads subject rows from /input (JSON or CSV) and writes one proof bundle per subject. Clone and configure it:
Place your customer rows in /input, then run it:
The root hash appears in three places - they are the same value: kycHash.hex, the kycHash field of manifest.json, and the kycHash column of the batch CSV.
secrets.enc and proofs/*.bin must never leave your infrastructure. Trusset endpoints only accept the manifest (hashes and public inputs) and the root hash.

Stub vs production manifests

Each manifest carries a mode. production manifests are accepted everywhere. stub manifests (CI smoke mode, --skip-proofs) are accepted by development instances only - a production instance rejects them with STUB_NOT_ALLOWED.

From bundle to verified customer

1

Verify on-chain with the root hash

Load the bundle’s manifest.json and call verifyFromManifest. The wallet address, root hash, country, investor type, and expiry days are read straight from the manifest; pass overrides for anything you want to change.
result.kycHash equals manifest.kycHash once the root hash is on-chain. result.operation is verify for a new identity and update for an existing one.If you only stored the root hash (for example from the batch CSV), call verify directly with kycHash:
2

Add proof-backed claims

With the root hash on-chain, the manifest can back on-chain claims. The backend re-checks that the manifest’s kycHash matches the on-chain identity before adding anything.
claims.added counts what landed, and claims.claims holds one entry per claim as { claimType, status, txHash }.One transaction is sent per claim. Use selected: ['KYC'] to add a subset.
3

Check the result

status.onChain.isVerified is now true and status.onChain.kycHash matches the manifest. getClaims returns the active claims with their data hashes and expiries.

Which claims a proof can back

The KYC claim always derives from the root hash. Field-level claims derive from the manifest’s proof leaves: AML, TAX_RESIDENCY, SANCTIONS_CHECK, and PEP_CHECK are not proof-backed - add them with addClaim.

Onboard in batch

The tool’s batch CSV maps row-for-row onto batchVerify entries - up to 500 subjects in one on-chain transaction:
Addresses that are already actively verified are skipped on-chain (their existing root hash is kept); revoked identities are re-verified.

Troubleshooting