Contract reference
Two contracts matter for integration: a per-service IdentityRegistry(who is verified, and the service's policy) and the RegistryFactory (deploys/indexes registries). Below is the read surface — copy the interface straight into your project.
IIdentityRegistry
interface IIdentityRegistry {
// --- gating ---
function isVerified(address wallet) external view returns (bool);
function verifiedUntil(address wallet) external view returns (uint64);
// --- policy / metadata ---
function owner() external view returns (address);
function paused() external view returns (bool);
function MAX_WALLETS_PER_CERT() external view returns (uint32);
function MIN_DISCLOSURE_MASK() external view returns (uint8);
function maxProofAge() external view returns (uint256);
// --- trust anchors ---
function caMerkleRoot() external view returns (bytes32);
function crlMerkleRoot() external view returns (bytes32);
function getCaCount() external view returns (uint256);
// --- required cert fields (bytes32(0) = unconstrained) ---
function requiredCountry() external view returns (bytes32);
function requiredOrg() external view returns (bytes32);
function requiredOrgUnit() external view returns (bytes32);
function requiredCommonName() external view returns (bytes32);
event UserRegistered(
address indexed user, bytes32 nullifier,
bytes32 country, bytes32 org, bytes32 orgUnit, bytes32 commonName
);
}View functions
isVerified(address) → boolTrue if the wallet holds a current (non-expired) verification. The one call you need for gating.
verifiedUntil(address) → uint64Verification expiry (unix seconds); 0 if never verified.
paused() → boolWhen true the registry rejects new registrations.
MAX_WALLETS_PER_CERT() → uint32How many wallets one certificate may bind.
MIN_DISCLOSURE_MASK() → uint8Bitmask of certificate fields a proof must disclose.
maxProofAge() → uint256Max age (seconds) of the signed timestamp inside a proof.
caMerkleRoot() / getCaCount()Trust anchor: the set of accepted certificate authorities.
required{Country,Org,OrgUnit,CommonName}() → bytes32Field constraints; bytes32(0) means unconstrained.
IRegistryFactory
interface IRegistryFactory {
function getRegistries() external view returns (address[] memory);
function registryInfo(address registry) external view returns (
address creator, string memory name,
uint32 maxWallets, uint8 minDisclosureMask,
uint256 maxProofAge, uint256 createdAt, uint256 vKeyVersion
);
function isRegistry(address) external view returns (bool);
event RegistryCreated(
address indexed registry, address indexed owner, string name,
uint32 maxWallets, uint8 minDisclosureMask, uint256 vKeyVersion
);
}ABIs
Human-readable ABIs are exported from zk-x509-sdk as IDENTITY_REGISTRY_ABI and REGISTRY_FACTORY_ABI, ready to drop into new ethers.Contract(addr, ABI, provider).