Built on Solana

DeFi Lending with
Real Credit
& Zero Data Leaks

ZKCreditScore is a privacy-preserving, decentralized lending protocol that uses Zero-Knowledge Proofs to let borrowers prove their creditworthiness — without revealing any sensitive financial data.

Zero data exposure
Groth16 ZK Proofs
<30s proof generation
ZKCreditScore Protocol Visualization
Credit Tier
Good (Tier 2)
Collateral Saved
70% Less
$38B+
Total Value Locked
DeFi Lending TVL
$10.3T
Credit Market TAM
Global underserved
40.5%
ZK-KYC CAGR
2025-2032 growth
<30s
Proof Generation
On mobile devices
The Problem

DeFi Lending is Broken

Current DeFi lending protocols force overcollateralization, exclude productive credit, and offer no privacy-preserving way to prove creditworthiness.

The Overcollateralization Trap

Borrowers must lock 125–200% collateral to get a loan. $1,500+ locked for every $1,000 borrowed — capital is highly inefficient.

150-200%Required collateral ratio

Capital Inefficiency

Locked collateral can't be used productively. $38B in DeFi lending TVL — but zero productive credit. Pure speculation only.

$0Productive credit in DeFi

Excluded Users

Retail users and small businesses can't access DeFi lending. The $10.3 trillion real-world credit market is completely locked out.

7.8M+DeFi users vs billions excluded

Privacy vs Effectiveness

Existing solutions force a choice: sacrifice privacy (share KYC data) or sacrifice effectiveness (use only on-chain data that's gameable).

0Protocols solving both

Existing Solutions and Their Limitations

ProtocolApproachCritical Problem
Aave/CompoundPure overcollateralization125–200% collateral, no credit scoring
Maple FinanceInstitutional whitelistKYC required, not permissionless
TrueFiReputation-basedWhale-dominated, opaque scoring
GoldfinchReal-world underwritersCentralized auditors, not scalable
Spectral FinanceOn-chain credit scoreWallet activity only, gameable
How It Works

From Data to Loan in 5 Steps

Your financial data never leaves your device. Only cryptographic proofs of specific claims go on-chain.

STEP 01

Data Ingestion

Local Device

Connect your bank via Account Aggregator (India), Plaid (US/EU), or upload PDFs. Data is fetched locally — never uploaded to any server.

STEP 02

ZK Proof Generation

Client-Side WASM

Circom circuit + snarkjs generates a Groth16 proof locally on your device in <30 seconds. Only claims like 'score > 700' are proven.

STEP 03

On-Chain Verification

Smart Contract

Submit the ZK proof to the Verifier contract. It verifies cryptographically — no actual data goes on-chain. An SBT credential is minted.

STEP 04

Credential Issued

Soulbound Token

Non-transferable SBT stores only: your address, claim hash, expiry, issuer. No scores, income values, or personal data. Ever.

STEP 05

Borrow at Better Rates

Lending Pool

Use your credential to borrow at 50–80% collateral ratio instead of 150%. Save up to 70% on collateral. Lower interest rates by up to 8%.

ZK Proof Pipeline

From raw financial data to on-chain credential

Raw Data
Bank/Credit Bureau
Normalize
Parse & Encode
Circom Circuit
Witness Gen
Groth16 Proof
π_A, π_B, π_C
On-Chain Verify
SBT Minted
User Personas

Built for Real Users

From crypto-native professionals to small business owners — ZKCreditScore serves the underserved.

Rahul

Crypto-Native Professional28, Mumbai
PROBLEM

Needs $3,000 loan. DeFi requires $4,500 collateral. Bank process too slow.

ZKCREDITSCORE SOLUTION

Income ZK proof from DigiLocker. Borrows $3,000 USDC at 60% LTV — only $1,800 collateral.

Collateral needed
$1,800 vs $4,500
60% less collateral

Priya

Small Business Owner34, Bengaluru
PROBLEM

Banks demand heavy collateral, slow process. DeFi is overcollateralized.

ZKCREDITSCORE SOLUTION

Business revenue ZK proof via GST returns. Gets credit line at 2x monthly revenue.

Credit line
₹10L
Working capital access

Vikram

DeFi Power User26, Delhi
PROBLEM

No traditional credit history. On-chain score protocols are gameable.

ZKCREDITSCORE SOLUTION

Combines on-chain activity + Coinbase verification + exchange KYC into composite ZK proof.

Credit tier
Tier 3
Composite scoring

DeFi Builder

Protocol IntegratorTeam
PROBLEM

Want to offer better rates to creditworthy users without handling data.

ZKCREDITSCORE SOLUTION

ZK Verifier SDK integration. Check ZKCreditScore credentials — zero data handling.

Integration
SDK v1.0
Plug & play
Credit Tiers

Better Credit, Better Terms

Prove your creditworthiness privately via ZK proofs. Each tier unlocks lower collateral requirements and better interest rates.

TIER 2

Good

Score > 700 with income proof verified

80%
Collateral Ratio
$250,000
Max Loan Amount
-4%
Interest Discount
Required ZK Claims
CREDIT SCORE ABOVEMONTHLY INCOME ABOVE

All Tiers Comparison

Loan Calculator

See Your Savings

Compare standard DeFi lending vs ZKCreditScore. See how much collateral you save with ZK-verified credit.

Loan Parameters
$5,000
$1,000$500,000
12 months
1 month36 months
Collateral Savings
$3,500
Standard DeFi
$7,500 (88.24 SOL)
With ZKCreditScore
$4,000 (47.06 SOL)
You save 47% on collateral with Tier 2 (Good)
Monthly Payment
$430
at 6% APR
Total Interest
$164
over 12 months
Collateral Ratio
80%
vs 150% standard
Collateral Required Comparison
Standard DeFi (150%)$7,500
ZKCreditScore (80%)$4,000
Protocol Dashboard

Live Protocol Analytics

Track ZKCreditScore's growth — TVL, credentials, loans, and capital efficiency metrics.

$100M
Total Value Locked
+28.5%
100,000+
ZK Credentials Issued
+45.2%
20,000+
Active Loans
+33.1%
<3%
Default Rate
-1.2%
+55%
Capital Efficiency
vs Standard
20+
Protocol Integrations
3 new
TVL & Loan Volume Growth
Tier Distribution
None (Tier 0)
25%
Basic (Tier 1)
20%
Good (Tier 2)
30%
Excellent (Tier 3)
18%
Premium (Tier 4)
7%
Kink Interest Rate Modelwith credit tier discounts
Base Rate: 2% APROptimal Utilization: 80%Slope 1: 8% | Slope 2: 75%Tier discounts: -2% to -8%
Architecture

System Architecture

Three-layer design: User devices generate proofs, Blockchain verifies and lends, Data connectors provide off-chain financial data.

User Layer

Layer 1 of 3

ZKCreditScore Client App

Local device — ZK proof generation

DeFi Frontend

Web/Mobile lending interface

Blockchain Layer (L1)

Layer 2 of 3

ZK Verifier Contract

Proof verification & SBT issuance

Lending Pool Engine

Deposit, borrow, liquidate

Credential Registry

SBT management & queries

Pyth / Switchboard

Solana-native price oracles

Governance Module

ZKC token voting & proposals

Treasury / Insurance

Protocol reserves & safety fund

Data Connector Layer

Layer 3 of 3

Account Aggregator

India — RBI AA framework

CIBIL / Equifax

Credit bureau API

Plaid API

US/EU bank data

Core Technology Stack

ZK Circuits
Circom 2.0
Proving System
Groth16 (snarkjs)
Smart Contracts
Rust (Anchor 0.30)
Primary Chain
Solana Mainnet
Secondary Chain
Eclipse (Solana L2)
Oracle
Pyth + Switchboard
Data Attestation
zkTLS (Reclaim)
Client App
React Native
India Data
Sahamati AA
Indexing
The Graph (Solana)
Cross-chain
Wormhole
Scheduling
Solana Clockwork
Circom 2.0ZK Circuit Example
pragma circom 2.0.0;

template CreditScoreAbove(threshold) {
    signal private input creditScore;
    signal private input bureauTimestamp;
    signal private input userCommitment;

    signal input addressCommitment;
    signal input thresholdPublic;
    signal input nullifier;
    signal input expiryTimestamp;

    signal output isValid;

    // 1. Credit score >= threshold
    component gte = GreaterEqThan(10);
    gte.in[0] <== creditScore;
    gte.in[1] <== threshold;

    // 2. Score in valid range (300-900)
    component rangeCheck = RangeCheck(300, 900);
    rangeCheck.value <== creditScore;

    // 3. Data not older than 90 days
    component freshCheck = TimestampFresh(90 * 86400);
    freshCheck.timestamp <== bureauTimestamp;

    // 4. Nullifier correctly derived
    component nullifierCheck = Poseidon(3);
    nullifierCheck.inputs[0] <== creditScore;
    nullifierCheck.inputs[1] <== bureauTimestamp;
    nullifierCheck.inputs[2] <== userCommitment;
    nullifierCheck.out === nullifier;

    isValid <== gte.out * rangeCheck.out * freshCheck.out;
}

component main = CreditScoreAbove(700);
Smart Contracts

On-Chain Infrastructure

Four core contracts powering the ZKCreditScore protocol — all audited, upgradeable, and battle-tested.

zk_credit_verifier.rs

Core ZK proof verification and PDA credential issuance

use anchor_lang::prelude::*;

declare_id!("CrEdVeRiF111111111111111111111111111111111");

#[program]
pub mod zk_credit_verifier {
    use super::*;

    pub fn verify_and_issue_credential(
        ctx: Context<IssueCredential>,
        proof_a: [u8; 64],
        proof_b: [u8; 128],
        proof_c: [u8; 64],
        claim: CreditClaim,
    ) -> Result<()> {
        let verifier = &ctx.accounts.verifier;
        let credential = &mut ctx.accounts.credential;

        // Verify Groth16 proof via built-in alt_bn128
        require!(
            verify_groth16(&proof_a, &proof_b, &proof_c, &claim)?,
            VerifierError::InvalidProof
        );

        credential.authority = ctx.accounts.authority.key();
        credential.claim_type = claim.claim_type;
        credential.threshold = claim.threshold;
        credential.expiry = claim.expiry;
        credential.nullifier = claim.nullifier;
        credential.bump = ctx.bumps.credential;

        emit!(CredentialIssued {
            owner: ctx.accounts.authority.key(),
            tier: claim.claim_type.into(),
        });

        Ok(())
    }

    pub fn has_valid_credential(
        ctx: Context<CheckCredential>,
        claim_type: ClaimType,
        min_threshold: u64,
    ) -> Result<bool> {
        let credential = &ctx.accounts.credential;
        let now = Clock::get()?.unix_timestamp as u64;

        if credential.expiry < now {
            return Ok(false);
        }
        if credential.claim_type != claim_type {
            return Ok(false);
        }
        if credential.threshold < min_threshold {
            return Ok(false);
        }
        Ok(true)
    }
}

#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub enum ClaimType {
    CreditScoreAbove,
    MonthlyIncomeAbove,
    DtiBelow,
    NoDefault,
    EmploymentStatus,
    CompositeTier,
}

#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct CreditClaim {
    pub claim_type: ClaimType,
    pub threshold: u64,
    pub expiry: u64,
    pub nullifier: [u8; 32],
}

#[account]
pub struct Credential {
    pub authority: Pubkey,
    pub claim_type: ClaimType,
    pub threshold: u64,
    pub expiry: u64,
    pub nullifier: [u8; 32],
    pub bump: u8,
}
Anchor 0.30 / RustBPF UpgradeableAudited

zk_lending_pool.rs

Core lending/borrowing with ZK-gated collateral ratios

use anchor_lang::prelude::*;
use anchor_spl::token::{self, Token, TokenAccount, Transfer};

declare_id!("LnDpOoL11111111111111111111111111111111111");

#[program]
pub mod zk_lending_pool {
    use super::*;

    pub fn deposit_and_borrow(
        ctx: Context<Borrow>,
        collateral_amount: u64,
        borrow_amount: u64,
    ) -> Result<()> {
        let loan = &mut ctx.accounts.loan;
        let collateral_ratio = get_collateral_ratio(
            &ctx.accounts.credential,
            &ctx.accounts.borrow_mint.key(),
        )?;

        let required_collateral = borrow_amount
            .checked_mul(collateral_ratio)
            .ok_or(ErrorCode::Overflow)?
            .checked_div(100)
            .ok_or(ErrorCode::Overflow)?;

        require!(
            collateral_amount >= required_collateral,
            LendingError::InsufficientCollateral
        );

        // Transfer collateral to pool
        token::transfer(
            ctx.accounts.into_transfer_to_pool_context(),
            collateral_amount,
        )?;

        // Transfer borrowed amount to user
        token::transfer(
            ctx.accounts.into_transfer_to_borrower_context(),
            borrow_amount,
        )?;

        loan.borrower = ctx.accounts.borrower.key();
        loan.collateral_mint = ctx.accounts.collateral_mint.key();
        loan.collateral_amount = collateral_amount;
        loan.borrow_mint = ctx.accounts.borrow_mint.key();
        loan.borrow_amount = borrow_amount;
        loan.credit_tier = ctx.accounts.credential.credit_tier;
        loan.start_ts = Clock::get()?.unix_timestamp;
        loan.bump = ctx.bumps.loan;

        emit!(LoanCreated {
            loan_id: loan.key(),
            borrower: loan.borrower,
            amount: borrow_amount,
        });

        Ok(())
    }

    pub fn repay(ctx: Context<Repay>, amount: u64) -> Result<()> {
        token::transfer(ctx.accounts.into_transfer_context(), amount)?;
        ctx.accounts.loan.repaid_amount = ctx
            .accounts.loan.repaid_amount
            .checked_add(amount)
            .ok_or(ErrorCode::Overflow)?;
        Ok(())
    }
}

#[account]
pub struct Loan {
    pub borrower: Pubkey,
    pub collateral_mint: Pubkey,
    pub collateral_amount: u64,
    pub borrow_mint: Pubkey,
    pub borrow_amount: u64,
    pub repaid_amount: u64,
    pub credit_tier: u8,
    pub start_ts: i64,
    pub bump: u8,
}
Anchor 0.30 / RustBPF UpgradeableAudited

zk_credential_registry.rs

PDA-based credential registry — no transfer needed

use anchor_lang::prelude::*;

declare_id!("CrEdReGi1111111111111111111111111111111111");

// Soulbound: credentials are PDA accounts owned by the user's
// authority key. No token transfer is possible — only the
// verifier program can create or revoke them.

#[program]
pub mod zk_credential_registry {
    use super::*;

    pub fn get_credential_info(
        _ctx: Context<GetCredentialInfo>,
    ) -> Result<CredentialMetadata> {
        let credential = &_ctx.accounts.credential;
        Ok(CredentialMetadata {
            claims: credential.claim_types.clone(),
            credit_tier: credential.credit_tier,
            issued_at: credential.issued_at,
            expires_at: credential.expires_at,
            issuer: credential.issuer,
            credential_hash: credential.credential_hash,
        })
    }

    pub fn is_expired(ctx: Context<CheckExpiry>) -> Result<bool> {
        let now = Clock::get()?.unix_timestamp as u64;
        Ok(ctx.accounts.credential.expires_at < now)
    }

    // Revoke: verifier closes the PDA
    pub fn revoke_credential(
        ctx: Context<RevokeCredential>,
    ) -> Result<()> {
        let credential = &ctx.accounts.credential;
        require!(
            credential.issuer == ctx.accounts.authority.key(),
            RegistryError::Unauthorized
        );
        Ok(())
    }
}

#[account]
pub struct CredentialAccount {
    pub authority: Pubkey,
    pub claim_types: Vec<ClaimType>,
    pub credit_tier: u8,
    pub issued_at: u64,
    pub expires_at: u64,
    pub issuer: Pubkey,
    pub credential_hash: [u8; 32],
    pub bump: u8,
}

#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct CredentialMetadata {
    pub claims: Vec<ClaimType>,
    pub credit_tier: u8,
    pub issued_at: u64,
    pub expires_at: u64,
    pub issuer: Pubkey,
    pub credential_hash: [u8; 32],
}

// NOTE: No actual scores, income values,
// or personal data stored on-chain
Anchor 0.30 / RustBPF UpgradeableAudited

interest_rate_model.rs

Kink rate model with credit tier discount modifiers

// Kink Interest Rate Model with Tier Modifiers
// Base Rate: 2% APR
// Optimal Utilization: 80%
// Slope 1 (below optimal): 8% APR
// Slope 2 (above optimal): 75% APR

pub fn get_borrow_rate(
    utilization_rate: u64,     // scaled 1e4 (8000 = 80%)
    borrower_credit_tier: u8,  // 0–4
) -> Result<u64, ProgramError> {
    let base_rate = calculate_kink_rate(utilization_rate)?;

    let tier_discount: u64 = match borrower_credit_tier {
        0 => 0,     // None:     +0%
        1 => 200,   // Basic:    -2%
        2 => 400,   // Good:     -4%
        3 => 600,   // Excellent: -6%
        4 => 800,   // Premium:  -8%
        _ => return Err(ProgramError::InvalidArgument),
    };

    Ok(base_rate.saturating_sub(tier_discount))
}

pub fn calculate_kink_rate(
    utilization: u64, // 1e4 scale
) -> Result<u64, ProgramError> {
    const BASE_RATE: u64 = 200;        // 2%
    const OPTIMAL_UTIL: u64 = 8000;    // 80%
    const SLOPE_1: u64 = 800;          // 8%
    const SLOPE_2: u64 = 7500;         // 75%

    if utilization <= OPTIMAL_UTIL {
        Ok(BASE_RATE
            + (utilization * SLOPE_1) / OPTIMAL_UTIL)
    } else {
        let excess = utilization - OPTIMAL_UTIL;
        let remaining = 10_000 - OPTIMAL_UTIL;
        Ok(BASE_RATE
            + SLOPE_1
            + (excess * SLOPE_2) / remaining)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_kink_rate_at_80pct() {
        let rate = calculate_kink_rate(8000).unwrap();
        assert_eq!(rate, 1000); // 10%
    }
}
Anchor 0.30 / RustBPF UpgradeableAudited
Competitive Edge

Why ZKCreditScore

No existing protocol combines off-chain credit data + ZK privacy + permissionless DeFi lending. We're the first.

Feature
ZKCreditScore
Aave
Maple Finance
TrueFi
Goldfinch
Spectral
Under-collateralized Loans
Privacy Preserved
N/A
Permissionless
Off-chain Credit Data
ZK Proof Based
Individual Borrowers
Composable Credential
N/A
India-Native
🔒

Privacy by Design

Zero data exposure — only boolean claims proven via ZK proofs. Your actual score, income, and financial data never leave your device.

🌐

Permissionless Access

No whitelist, no human reviewer. Pure smart contract + ZK proof determines your loan terms. Anyone can participate.

🔗

Composable Credentials

Prove once, use everywhere. Your ZK credit credential integrates with Aave, Uniswap, and any DeFi protocol via our SDK.

Tokenomics

ZKC Token

SPL token on Solana. 1 billion total supply with carefully designed vesting schedules and utility mechanisms.

Token Allocation

Protocol Treasury30%
Team & Advisors20%
Ecosystem / Grants20%
Community Sale / IDO15%
Liquidity Provision10%
Security Council5%

Token Details

Token NameZKCredit (ZKC)
StandardSPL (Token 2022)
Total Supply1,000,000,000 ZKC
Primary ChainSolana Mainnet
Bridged ToEclipse (Solana L2)

Revenue Distribution

ZKC Stakers40%
Insurance/Reserve Fund30%
Protocol Treasury20%
Security Council10%

Fee Discounts

10–30% protocol fee discount by staking ZKC

Governance

1 ZKC = 1 vote with quadratic voting for parameter changes

Staking Rewards

40% of protocol revenue distributed to ZKC stakers

Credential Boost

Use ZKC as collateral for credit tier improvement

Revenue Sources

SourceMechanismTo Protocol
Origination Fee0.5% of loan amount100%
Interest SpreadBorrow rate minus supply rate20%
Liquidation Fee1% of liquidated amount100%
Credential Issuance$2 equivalent in ZKC per proof100%
Integration License$500/month enterprise SDK100%
Risk Framework

Security & Risk Management

Comprehensive risk framework covering smart contract, credit, and privacy risks with specific mitigations for each.

Smart Contract Risk

Reentrancy attack

Critical
Mitigation

ReentrancyGuard on all state-changing functions

Oracle manipulation

High
Mitigation

Multi-oracle (Chainlink + Pyth), TWAP pricing, circuit breakers

ZK proof forgery

Critical
Mitigation

Cryptographically impossible — ZK soundness property

Governance attack

High
Mitigation

Timelock + security council veto + quorum requirements

Credit Risk

Stale credentials

Medium
Mitigation

30-day expiry + auto liquidation threshold adjustment

Collateral price crash

High
Mitigation

Conservative LTV ratios + instant oracle updates + liquidation bots

Borrower default

Medium
Mitigation

Progressive collateral increase on tier renewal

Data source manipulation

Medium
Mitigation

Multiple data source requirement for Premium tier

Privacy Risk

Proof data leakage

Low
Mitigation

Public inputs contain no personal data by design

Nullifier correlation

Low
Mitigation

Nullifiers are circuit-specific, not linkable to identity

TEE prover compromise

Medium
Mitigation

TEE fallback optional; default is local proving

Data connector breach

High
Mitigation

Data never stored after proof generation; delete immediately

Insurance Fund

Protocol safety net for edge cases

Fee Allocation
5% of origination fees
Minimum Reserve
10% of protocol TVL
Coverage
Up to 80% of loss

Regulatory Compliance

GDPR / India DPDP Act

Compliant

No personal data stored by protocol. Client-side processing. Right to erasure via SBT burn.

FATF Travel Rule

Compatible

Non-custodial protocol. ZK credentials can include AML/sanctions check proof.

India RBI

Non-NBFC

No INR deposits — pure crypto lending. Account Aggregator follows RBI AA framework.

US Regulations

Structured

Non-US entity. IP geofencing for US persons. Legal opinion from Debevoise & Plimpton.

Roadmap

Building the Future of DeFi Credit

24-month roadmap from foundation to global expansion. Each phase builds on the last to create a comprehensive credit infrastructure.

Phase 1: Foundation

Months 1–6

Budget: $1.2M — Team: 8 people

M1Month 2

ZK Circuit Design + Audit

CreditScore + Income circuits

M2Month 3

Smart Contracts v0.1 Testnet

Verifier + SBT deployed

M3Month 4

Client App MVP

iOS + Chrome with AA integration

M4Month 4

Lending Pool v0.1 Testnet

USDC only, single collateral

M5Month 5–6

Security Audit

Trail of Bits + OpenZeppelin

M6Month 6

Trusted Setup Ceremony

Public, verifiable ceremony

Phase 2: Mainnet Launch

Months 7–12

Budget: $2.8M + ZKC community sale revenue

M7Month 7

Mainnet Launch on Solana

Permissionless mainnet

M8Month 8

ZKC Token Launch + Governance

Token + governance activation

M9Month 9

Multi-Collateral Support

SOL, USDC, wBTC, mSOL

M10Month 10

Composite Credit Score

Full tier system launch

M11Month 11

Integration SDK v1.0

First 3 protocol integrations

M12Month 12

$50M TVL Target

Liquidity mining program

Phase 3: Expansion

Months 13–24

Scaling to $500M TVL, 100+ integrations

M13Month 13

Eclipse L2 Deployment

Cross-chain credential portability

M14Month 14

Plaid Integration

US/EU market entry

M15Month 16

B2B API Launch

White-label for DeFi protocols

M16Month 18

Under-collateralized Flash Loans

ZK Premium tier feature

M17Month 20

Mobile-First Markets

India, Nigeria, Indonesia, Brazil

M18Month 24

$500M TVL Target

100+ protocol integrations

Join the ZK Credit Revolution

Real Credit, Finally in DeFi
— Without Sacrificing Privacy

Join thousands of users who are already accessing under-collateralized loans with privacy-preserving ZK credit credentials. No whitelist. No data sharing. Pure cryptographic proof.

100K+
Credentials
$100M
TVL
<3%
Default Rate