v6 live · 74 tests · real Sumsub + ZK freshness

The default compliance layer for
regulated apps on HashKey Chain.

Verify once with a trusted issuer. Privately prove KYC, accreditation, or jurisdiction to any HashKey Chain dApp. Reveal nothing on-chain.

We're not replacing HashKey's compliance stack — we're making it reusable and private across the ecosystem.

hskpassport.gudman.xyz/composer
Live preview of the Compliance Policy Composer generating Solidity, React, and Hardhat test code from one-click presets
5
Credential types
KYC · accredited · HK/SG/AE
16
Contracts live
HashKey testnet, v5 + IKycSBT + v6 freshness
74
Passing tests
security invariants + expiry + slashing + ZK freshness
0
Bytes PII on-chain
by design
Built on open standards — compatible with
W3C Verifiable Credentials·Semaphore v4·Groth16 ZK·Sumsub KYC·HashKey Chain·HashKey DID·OpenZeppelin Timelock
For developers

One require line.
Full compliance.

Paste one call into your contract. Users prove KYC, accreditation, or jurisdiction via zero-knowledge proofs that cost ~241k gas and reveal nothing.

  • Caller-bound proofs prevent front-running
  • Per-action nullifiers prevent sybil attacks
  • Revocable, expirable, governance-controlled
MyRWAToken.sol
// Gate any function behind a ZK credential check
contract MyRWAToken {
    function mint(SemaphoreProof calldata proof) external {
        require(
            proof.message == uint256(uint160(msg.sender)),
            "proof must be bound to caller"
        );
        require(
            passport.verifyCredential(25, proof),
            "KYC required"
        );
        _mint(msg.sender, 100e18);
    }
}
Architecture

How it works

01

Issuer verifies off-chain

Sumsub (same KYC provider HashKey Exchange uses) runs iBeta-L2 liveness, document authenticity, and face dedup. On GREEN, the issuer wallet adds the user's Semaphore commitment to an on-chain group.

02

User proves in-browser

The user's browser generates a Groth16 ZK proof in WASM. The proof demonstrates group membership without revealing which member. Bound to msg.sender to prevent front-running.

03

dApp verifies on-chain

Any contract calls verifyCredential(). Returns true/false in ~241k gas. The dApp learns nothing beyond eligibility. Nullifiers are scoped per action for sybil resistance.

Three things every regulated dApp on HashKey needs. We built them.

A KYC provider that actually gates access. An identity bridge to HashKey's own SBTs. Per-prover ZK expiry. Running today on testnet.