Gate your dApp in 4 steps

The core integration is a single view call — isVerified(wallet). Pick a registry, read it on-chain or off-chain, and point users to verification.

1

Deploy your registry

Each service gets its own registry. Deploy one via the factory with your CA trust anchors and certificate-field constraints. (The Sepolia Users registry 0x3cF6…ada3 belongs to the zkScatter service — use it only to try the checker below, not to gate your app.)
2

Read verification — on-chain

Call isVerified from your contract. The onlyVerified modifier is all most integrations need:
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IIdentityRegistry {
    function isVerified(address wallet) external view returns (bool);
}

contract Gated {
    IIdentityRegistry public immutable registry;

    constructor(address registry_) {
        registry = IIdentityRegistry(registry_);
    }

    modifier onlyVerified() {
        require(registry.isVerified(msg.sender), "zk-x509: not verified");
        _;
    }

    function protectedAction() external onlyVerified {
        // ...only verified identities reach here
    }
}
3

…or off-chain (TypeScript)

With the SDK:
typescript
import { ethers } from "ethers";
import { ZkX509Client } from "zk-x509-sdk";

const provider = new ethers.JsonRpcProvider(rpcUrl); // or a wallet BrowserProvider
const zk = new ZkX509Client(provider, { network: "sepolia" });

// your service's registry (deploy via the factory).
// 0x3cF6… below is zkScatter's, shown only as a runnable example.
const REGISTRY = "0x3cF6A96f1970053ffDf957074F988aD53D13ada3";
if (await zk.isVerified(REGISTRY, userAddress)) {
  // ...grant access
}
Or with plain ethers, no dependency:
typescript
import { ethers } from "ethers";

const ABI = ["function isVerified(address) view returns (bool)"];
const registry = new ethers.Contract(REGISTRY_ADDRESS, ABI, provider);
const ok = await registry.isVerified(userAddress);
4

Send users to get verified

Direct unverified users to your registry's verification page (they generate a ZK proof of their certificate locally). Once verified, the reads above flip to true.

Try it — check a wallet

Sepolia · read-only

Default is zkScatter's example registry — swap in your own.