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
Or with plain ethers, no dependency: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
}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-onlyDefault is zkScatter's example registry — swap in your own.