Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Guides

Setting Up On-Chain Proof of Accredited Investor Status

A technical guide for developers to implement cryptographically verifiable proof of accredited investor status using non-transferable tokens and privacy-preserving attestations.
Chainscore © 2026
introduction
GUIDE

Setting Up On-Chain Proof of Accredited Investor Status

This guide explains how to create and verify a cryptographically secure, privacy-preserving proof of accredited investor status on-chain, enabling access to compliant DeFi and tokenized securities.

On-chain accreditation uses zero-knowledge proofs (ZKPs) to verify an investor's eligibility without revealing their sensitive personal data. Instead of submitting documents like tax returns or net worth statements to each platform, a user generates a cryptographic proof from verified credentials. This proof can be submitted to any smart contract with accreditation requirements, such as a Regulation D 506(c) offering or a permissioned DeFi pool. The core technology stack typically involves an identity oracle (like Verite or Polygon ID), a ZK proving system (such as Circom or Halo2), and a verification smart contract on a blockchain like Ethereum or Polygon.

The setup process begins off-chain. An investor must first get their accredited status verified by a qualified third-party verifier, such as a licensed broker-dealer or a specialized KYC/AML provider. This entity attests to the investor's status by issuing a verifiable credential (VC), a signed digital document containing the claim. The investor then stores this VC in a secure, self-custodied wallet. To use this credential on-chain, the investor runs a ZK circuit that takes the VC as a private input. The circuit's logic confirms the credential's valid signature and that it contains the necessary accreditation claim, outputting a proof without leaking the underlying data.

Developers integrate this by deploying a verification contract. Here's a simplified example of a Solidity verifier interface that a fundraising contract would call:

solidity
interface IAccreditationVerifier {
    function verifyProof(
        uint[2] memory a,
        uint[2][2] memory b,
        uint[2] memory c,
        uint[1] memory input
    ) external view returns (bool);
}

The input is a public hash of the verification criteria (e.g., the verifier's public key and minimum income threshold). The proof parameters (a, b, c) are generated by the user's client-side proving software. If verifyProof returns true, the main contract can grant access to mint tokens or join a pool.

Key considerations for implementation include chain selection and cost. Proof verification gas costs can be high on Ethereum Mainnet, making Layer 2s like Polygon zkEVM or zkSync Era pragmatic choices. Privacy is another critical factor; while the proof hides personal data, the act of submitting a transaction from your wallet address creates a public record. Solutions like semaphore or tornado cash (for non-sanctioned use) can provide transaction-level privacy. Furthermore, the trust model hinges on the integrity of the initial verifier and the security of the ZK circuit, which must be professionally audited.

For builders, frameworks like 0xPARC's zk-creds or iden3's circom provide libraries for constructing accreditation circuits. The verifiable credential standard is typically W3C Verifiable Credentials, ensuring interoperability. A practical workflow is: 1) User obtains VC from verifier, 2) User's wallet generates a ZK proof locally, 3) User submits proof to blockchain verifier contract, 4) Access-gated contract checks the verifier's result. This creates a reusable, portable, and private proof of compliance that can unlock the next wave of institutional-grade on-chain finance.

prerequisites
PREREQUISITES AND SETUP

Setting Up On-Chain Proof of Accredited Investor Status

This guide outlines the technical and procedural requirements for developers to implement a system for verifying and attesting to accredited investor status on-chain.

The core prerequisite is establishing a legal and technical framework for identity verification that complies with relevant securities regulations, such as Rule 501 of Regulation D in the United States. This typically involves integrating with a Know Your Customer (KYC) provider like Veriff, Persona, or Sumsub. These services handle the collection and verification of sensitive documents (e.g., tax returns, bank statements, W-2 forms) and financial information to determine accreditation status off-chain. Your application must securely transmit a user's verified identity to this provider via API and receive a cryptographically signed attestation or a unique identifier.

On the technical side, you need a smart contract capable of storing and managing verification attestations. This contract will map a user's on-chain identity (like their wallet address) to a verification status and an expiration timestamp. The attestation from the KYC provider must be verifiable on-chain. This is often achieved using verifiable credentials (VCs) or signature verification. For example, the provider can sign a message containing the user's wallet address and accreditation status, which your contract can then verify using ecrecover. Alternatively, you can use a zero-knowledge proof (ZKP) system, where the user generates a ZK proof of their verified status without revealing the underlying private data.

Your development environment must be configured to interact with both the chosen KYC provider's API and your target blockchain. You will need: a Node.js or similar backend service to orchestrate the verification flow, the provider's SDK, and a blockchain development toolkit like Hardhat, Foundry, or Truffle. Essential smart contract libraries include OpenZeppelin's for secure contract patterns. For Ethereum and EVM-compatible chains, you must manage gas costs for storing attestations. For other ecosystems like Solana, you would use the native program libraries and the Anchor framework. Ensure your contract includes functions for verifyInvestor(address, bytes signature), getStatus(address), and revokeVerification(address) for compliance.

A critical step is designing the user flow. The process begins when a user connects their wallet to your dApp's interface. Your frontend should then redirect them to the KYC provider's secure portal for document upload and verification. Upon successful off-chain verification, your backend receives a callback with the result and a proof (like a signature). Your backend then calls a function on your smart contract, passing the user's address and the proof, which mints a non-transferable Soulbound Token (SBT) or updates a mapping to attest to their status. The user's wallet now holds a verifiable, on-chain credential that other permissioned DeFi protocols or token sale contracts can query.

Finally, you must implement robust access control and security measures. Use OpenZeppelin's Ownable or AccessControl to restrict functions like status revocation to a designated admin or a decentralized oracle. Consider implementing a multi-signature scheme for sensitive actions. The contract should also handle attestation expiration and renewal processes. All sensitive data must remain off-chain; only the verification result and a proof of that result should be stored on-chain. Thoroughly test the entire flow on a testnet (like Sepolia or Goerli) using mock KYC responses before deploying to mainnet to ensure regulatory compliance and system integrity.

key-concepts
ON-CHAIN ACCREDITATION

Core Technical Concepts

Technical frameworks and tools for verifying investor accreditation status directly on the blockchain, enabling compliant access to private markets.

06

Implementation Architecture & Flow

A typical flow for integrating on-chain accreditation:

  1. Issuance: Investor completes verification with a licensed issuer or KYC provider, receiving a Verifiable Credential.
  2. Proof Generation: Investor's wallet (e.g., using SpruceID's sign-in-with-ethereum kit) generates a ZKP from the credential.
  3. On-Chain Verification: The proof is submitted to a verifier smart contract (e.g., a Semaphore contract).
  4. Access Grant: Upon successful verification, the contract grants access—minting a token, adding to an allowlist, or unlocking a function. This creates a privacy-first, reusable, and composable system for regulatory compliance.
< 2 sec
Typical ZKP Verification Time
Gas Cost
~500k gas for on-chain verification
architecture-overview
SYSTEM ARCHITECTURE OVERVIEW

Setting Up On-Chain Proof of Accredited Investor Status

This guide explains the technical architecture for verifying and storing accredited investor status on-chain, enabling compliant access to private token sales and DeFi protocols.

On-chain proof of accredited investor (AI) status is a critical infrastructure component for compliant decentralized finance (DeFi) and private capital markets. It allows protocols to programmatically gate access to specific financial instruments—like private token sales or high-yield vaults—based on verified regulatory status. The core challenge is balancing privacy-preservation with auditability, ensuring that sensitive personal financial data is not exposed on the public ledger while providing a tamper-proof verification record for regulators and issuers.

A typical architecture involves three main off-chain and on-chain components. First, a KYC/Accreditation Provider (like a licensed broker-dealer or a specialized oracle service such as Chainlink Proof of Reserve) performs the identity verification and income/net worth attestation off-chain. Second, a Verification Smart Contract on-chain receives a cryptographic proof (often a zero-knowledge proof or a verifiable credential) from the provider. Third, a Registry or Soulbound Token (SBT) mints a non-transferable credential to the user's wallet address upon successful verification, which other protocols can permissionlessly query.

The most common implementation pattern uses verifiable credentials (VCs) following the W3C standard. Here, the accreditation issuer signs a JSON-LD credential containing the user's wallet address and accreditation status. The user's wallet (acting as a holder) presents this credential to a verifier smart contract. The contract checks the issuer's decentralized identifier (DID) and the credential's cryptographic signature against a trusted registry of issuers. This method keeps the underlying data private, sharing only the proof of validity.

For developers, integrating this check is straightforward. A gated contract would include a modifier that queries the on-chain registry. For example, using an SBT standard like ERC-5192:

solidity
modifier onlyAccredited(address investor) {
    require(accreditationRegistry.isAccredited(investor), "Not accredited");
    _;
}

The accreditationRegistry could be a contract managed by a consortium of issuers or a public good like the Ethereum Attestation Service (EAS), which provides a schema for off-chain attestations with on-chain proofs.

Key considerations for this architecture include revocation mechanisms, cross-chain interoperability, and gas efficiency. Status must be revocable if an investor's circumstances change, often handled through expiring credentials or issuer-managed revocation lists. For multi-chain ecosystems, a cross-chain messaging protocol (like LayerZero or Axelar) can sync accreditation status across networks. Optimizing for gas costs is essential, which is why many implementations store only a minimal proof on-chain, like a Merkle root of accredited addresses, with users submitting Merkle proofs for verification.

Looking forward, the integration of zero-knowledge proofs (ZKPs) offers the next evolution, allowing users to prove they hold a valid credential from a trusted issuer without revealing any identifying information, even to the verifier contract. Protocols like Polygon ID and zkPass are pioneering this approach. This architecture not only ensures regulatory compliance but also enhances user privacy and security, forming a foundational layer for the future of permissioned DeFi and on-chain private markets.

TECHNICAL APPROACHES

Implementation Method Comparison

A comparison of three primary methods for implementing on-chain proof of accredited investor status, evaluating key technical and operational factors.

Feature / MetricZK-Proof AttestationVerifiable Credential RegistryDirect KYC Oracle

Privacy for User

On-Chain Verification Cost

$0.50-2.00

$0.10-0.50

$5-15

Verification Latency

< 2 sec

< 5 sec

1-5 min

Requires Trusted Issuer

Revocable Status

Smart Contract Complexity

High

Medium

Low

Gas Cost for Verification

~200k gas

~50k gas

~25k gas

Interoperability Standard

EIP-712 / ZK-SNARKs

W3C Verifiable Credentials

Custom Oracle API

privacy-zkp-implementation
TUTORIAL

Implementing Privacy with Zero-Knowledge Proofs

A technical guide to building a system for on-chain verification of accredited investor status using zero-knowledge proofs, ensuring privacy and regulatory compliance.

On-chain verification of accredited investor status presents a critical privacy challenge. Publicly revealing personal financial details like income or net worth on a blockchain is unacceptable. Zero-knowledge proofs (ZKPs) solve this by allowing a user to prove they meet specific criteria—such as having an income over $200,000—without revealing the underlying data. This creates a private, verifiable credential that can be used across DeFi platforms, private token sales, and regulatory reporting. Protocols like zk-SNARKs and zk-STARKs are the cryptographic engines that make this selective disclosure possible.

The core of the system is a circuit, a program that defines the constraints of the proof. For accredited investor verification, this circuit would encode the SEC's criteria. Using a library like Circom or Noir, you define the logic. For example, a circuit could check that (annual_income > 200000) OR (net_worth > 1000000). The user's private inputs (their actual financial data) are fed into this circuit locally to generate a witness. This witness is then used to create a succinct proof that the statement is true, without leaking the inputs.

Here's a simplified conceptual outline of the process using a Circom-like syntax. The circuit defines the public signal (the statement to be proven true) and the private signals (the secret data).

circom
pragma circom 2.0.0;
template AccreditedInvestor() {
    // Private inputs (known only to prover)
    signal input annualIncome;
    signal input netWorth;
    
    // Public output (the verified statement)
    signal output isAccredited;
    
    // SEC Criteria Constraint
    component incomeCheck = GreaterThan(200000);
    component worthCheck = GreaterThan(1000000);
    
    incomeCheck.in <== annualIncome;
    worthCheck.in <== netWorth;
    
    // Accredited if EITHER condition is true (logical OR)
    isAccredited <== incomeCheck.out + worthCheck.out - (incomeCheck.out * worthCheck.out);
}

The circuit outputs 1 (true) only if the private inputs satisfy the regulatory logic.

After compiling the circuit, you need a trusted setup to generate the proving and verification keys. For production, this often uses a multi-party ceremony (like the one for Tornado Cash) to decentralize trust. The user (prover) then uses the proving key with their private witness to generate the final proof. This proof, along with the public output (isAccredited: 1), is sent on-chain. A verifier smart contract, which has the verification key embedded, can cheaply confirm the proof's validity in a single function call, minting a non-transferable Soulbound Token (SBT) to the user's address as proof of status.

Key considerations for implementation include choosing the right proving system. zk-SNARKs require a trusted setup but have small proof sizes and fast verification, ideal for Ethereum L1. zk-STARKs are trustless but generate larger proofs. You must also design the user flow for secure private input handling, often using a client-side tool like SnarkJS. Furthermore, the system's trust model depends on the integrity of the circuit logic and the setup ceremony. Auditing the circuit code is as critical as auditing the smart contract itself.

Practical applications extend beyond initial verification. This ZKP credential can be reused across multiple platforms without re-submitting data, composing into more complex proofs of membership or reputation. Looking ahead, zk-proofs of KYC and other regulatory compliance checks are a major use case for privacy-preserving identity. By implementing this pattern, developers can build compliant DeFi primitives that don't force users to sacrifice their financial privacy on a public ledger.

revocation-mechanisms
VERIFIABLE CREDENTIALS

Setting Up On-Chain Proof of Accredited Investor Status

A technical guide to implementing and managing revocable, on-chain credentials for verifying accredited investor status using decentralized identifiers and verifiable credentials.

On-chain proof of accredited investor status uses Verifiable Credentials (VCs) and Decentralized Identifiers (DIDs) to create a tamper-proof, privacy-preserving attestation. A trusted issuer, such as a qualified broker-dealer or attorney, creates a VC containing the accreditation claim. This credential is cryptographically signed and issued to the investor's DID, which is a self-sovereign identifier stored in a user-controlled wallet. The credential itself can be stored off-chain (e.g., in the user's cloud or device) while its revocation status and the issuer's public key are anchored on a blockchain, enabling instant, permissionless verification by DeFi protocols or private investment platforms.

The core mechanism enabling revocation is a revocation registry, typically implemented as a smart contract. When issuing a credential, the issuer also records a commitment, like a cryptographic accumulator (e.g., a Merkle tree root) or a status list index, on-chain. To revoke the credential, the issuer updates this on-chain registry. Verifiers check the registry during the proof presentation process. Common standards include the W3C Verifiable Credentials Data Model and implementations like Indy's Revocation Registry or Ethereum Attestation Service (EAS) schemas, which define the structure for the status list anchor point on-chain.

To set this up, first choose a blockchain and standard. For Ethereum, you might use Ethereum Attestation Service. The issuer deploys a schema defining the credential structure (e.g., accreditedInvestor: boolean, expiry: uint256) and a linked revocation registry contract. The issuing process involves: 1) The investor shares a DID (like did:ethr:0x...). 2) The issuer creates the VC JSON-LD object, signs it, and sends it to the holder. 3) The issuer calls attest() on the EAS contract, referencing the schema and the holder's DID, which also updates the revocation status to false (not revoked). The credential ID is emitted in an event.

Here is a simplified example of a verifier's off-chain logic to check a credential's status using a hypothetical Ethereum registry:

solidity
// Pseudo-code for verification
function verifyAccreditation(
    bytes32 credentialId,
    bytes memory signature,
    address issuerDid
) public view returns (bool) {
    // 1. Recover signer from signature and credential data
    address recoveredSigner = ECDSA.recover(credentialHash, signature);
    require(recoveredSigner == issuerDid, "Invalid issuer signature");
    
    // 2. Check on-chain revocation registry
    RevocationRegistry registry = RevocationRegistry(registryAddress);
    bool isRevoked = registry.isRevoked(credentialId);
    require(!isRevoked, "Credential revoked");
    
    // 3. Check credential expiry from decoded data
    require(expiry > block.timestamp, "Credential expired");
    return true;
}

This function checks the cryptographic signature, queries the on-chain revocation status, and validates the expiry.

Managing revocation involves key issuer actions. To revoke, the issuer calls a function like revoke(credentialId) on the registry contract, which sets the status to true. This change is permanent for that credential ID. Best practices include: - Using incremental Merkle trees for privacy, where only a non-revocation proof is shared. - Implementing time-based expiry to auto-invalidate credentials. - Securing issuer keys with hardware modules. - Providing clear off-boarding for users. Auditing the issuer's revocation authority is critical, as a compromised issuer key can unjustly revoke all credentials. Frameworks like Hyperledger AnonCreds offer sophisticated selective disclosure and revocation without revealing the credential ID.

Integrating this proof into a DeFi or fundraising platform requires a verifier smart contract. When an investor interacts with a private pool or security token offering (STO), they present a Verifiable Presentation—a package containing the VC and a proof. Your platform's contract calls the verification logic, often relying on zero-knowledge proofs (ZKPs) for privacy, such as proving membership in a non-revoked set without revealing the investor's identity or credential details. This on-chain check becomes a gate for require statements, enabling compliant, automated access to exclusive financial opportunities based on a resilient, user-centric credential system.

ON-CHAIN ACCREDITATION

Frequently Asked Questions

Common technical questions and troubleshooting for developers implementing on-chain proof of accredited investor status using the Chainscore protocol.

On-chain proof of accredited investor status is a verifiable credential, represented as a non-transferable soulbound token (SBT) or a verifiable credential (VC), that attests to an investor's accredited status without revealing their underlying identity. The Chainscore protocol enables off-chain verification by licensed third-party providers (e.g., Accredify, Parallel Markets) who then issue a signed attestation to a user's wallet. This attestation can be presented to DeFi protocols, DAOs, or private sale platforms to gate access, replacing manual KYC/AML forms with a reusable, privacy-preserving, and programmable credential.

Key components:

  • Issuer: A licensed accreditation verifier.
  • Subject: The investor's wallet address.
  • Verifier: The smart contract or protocol checking the credential.
  • Credential: The SBT or signed EIP-712 message stored on-chain.
conclusion-next-steps
IMPLEMENTATION SUMMARY

Conclusion and Next Steps

You have successfully explored the architecture and implementation steps for on-chain proof of accredited investor status. This guide covered the core components, from legal attestation to smart contract verification.

Implementing on-chain accreditation involves several key technical decisions. You must choose between a custodial attestation model, where a trusted entity signs claims, and a zero-knowledge proof (ZKP) model, which offers greater privacy. The smart contract logic for verifying signed messages from an attestor's address is relatively straightforward using ecrecover. However, integrating with a KYC/AML provider like Chainalysis KYT or Trulioo for the initial verification is a prerequisite for the attestor. Always store only the verification result and a commitment (like a hash) on-chain, never the raw investor data.

For next steps, consider these practical actions to advance your implementation:

  1. Prototype the Attestation Flow: Use a testnet like Sepolia or Mumbai to deploy a simple verifier contract and simulate the signature process from a backend service.
  2. Evaluate Privacy Trade-offs: If investor privacy is critical, research ZK-proof systems like zk-SNARKs (using Circom or Halo2) to prove accreditation without revealing the accreditor's identity or the specific criteria met.
  3. Review Compliance Scope: Consult legal counsel to ensure your on-chain proof mechanism aligns with regulations in your target jurisdictions, such as the SEC's Rule 506(c) in the U.S.

The future of on-chain credentials is moving toward interoperable standards. Monitor developments with Verifiable Credentials (W3C VC) and how they map to decentralized identifiers (DIDs). Projects like Ethereum Attestation Service (EAS) provide a schema registry and a generic framework for making trust-minimized attestations on-chain, which could be adapted for this use case. As the ecosystem matures, cross-chain verification and the composability of these credentials will become essential for a seamless DeFi and institutional onboarding experience.