- The root hash (
kycHash) - a Rescue-Prime Merkle root over per-field commitments, stored on-chain byidentity.verify. - The bundle manifest (
manifest.json) - hashes and public inputs only, used byidentity.addClaimsFromProofto derive on-chain claims.
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:
kycHash.hex, the kycHash field of manifest.json, and the kycHash column of the batch CSV.
Stub vs production manifests
Each manifest carries amode. 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 If you only stored the root hash (for example from the batch CSV), call
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.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 One transaction is sent per claim. Use
kycHash matches the on-chain identity before adding anything.selected: ['KYC'] to add a subset.3
Check the result
Which claims a proof can back
TheKYC 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.
Batch onboarding
The tool’s batch CSV maps row-for-row ontobatchVerify entries - up to 500 subjects in one on-chain transaction:
