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.

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.
Capital Inefficiency
Locked collateral can't be used productively. $38B in DeFi lending TVL — but zero productive credit. Pure speculation only.
Excluded Users
Retail users and small businesses can't access DeFi lending. The $10.3 trillion real-world credit market is completely locked out.
Privacy vs Effectiveness
Existing solutions force a choice: sacrifice privacy (share KYC data) or sacrifice effectiveness (use only on-chain data that's gameable).
Existing Solutions and Their Limitations
| Protocol | Approach | Critical Problem |
|---|---|---|
| Aave/Compound | Pure overcollateralization | 125–200% collateral, no credit scoring |
| Maple Finance | Institutional whitelist | KYC required, not permissionless |
| TrueFi | Reputation-based | Whale-dominated, opaque scoring |
| Goldfinch | Real-world underwriters | Centralized auditors, not scalable |
| Spectral Finance | On-chain credit score | Wallet activity only, gameable |
From Data to Loan in 5 Steps
Your financial data never leaves your device. Only cryptographic proofs of specific claims go on-chain.
Data Ingestion
Connect your bank via Account Aggregator (India), Plaid (US/EU), or upload PDFs. Data is fetched locally — never uploaded to any server.
ZK Proof Generation
Circom circuit + snarkjs generates a Groth16 proof locally on your device in <30 seconds. Only claims like 'score > 700' are proven.
On-Chain Verification
Submit the ZK proof to the Verifier contract. It verifies cryptographically — no actual data goes on-chain. An SBT credential is minted.
Credential Issued
Non-transferable SBT stores only: your address, claim hash, expiry, issuer. No scores, income values, or personal data. Ever.
Borrow at Better Rates
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
Built for Real Users
From crypto-native professionals to small business owners — ZKCreditScore serves the underserved.
Rahul
Needs $3,000 loan. DeFi requires $4,500 collateral. Bank process too slow.
Income ZK proof from DigiLocker. Borrows $3,000 USDC at 60% LTV — only $1,800 collateral.
Priya
Banks demand heavy collateral, slow process. DeFi is overcollateralized.
Business revenue ZK proof via GST returns. Gets credit line at 2x monthly revenue.
Vikram
No traditional credit history. On-chain score protocols are gameable.
Combines on-chain activity + Coinbase verification + exchange KYC into composite ZK proof.
DeFi Builder
Want to offer better rates to creditworthy users without handling data.
ZK Verifier SDK integration. Check ZKCreditScore credentials — zero data handling.
Better Credit, Better Terms
Prove your creditworthiness privately via ZK proofs. Each tier unlocks lower collateral requirements and better interest rates.
Good
Score > 700 with income proof verified
All Tiers Comparison
See Your Savings
Compare standard DeFi lending vs ZKCreditScore. See how much collateral you save with ZK-verified credit.
Live Protocol Analytics
Track ZKCreditScore's growth — TVL, credentials, loans, and capital efficiency metrics.
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
Local device — ZK proof generation
Web/Mobile lending interface
Blockchain Layer (L1)
Layer 2 of 3
Proof verification & SBT issuance
Deposit, borrow, liquidate
SBT management & queries
Solana-native price oracles
ZKC token voting & proposals
Protocol reserves & safety fund
Data Connector Layer
Layer 3 of 3
India — RBI AA framework
Credit bureau API
US/EU bank data
Core Technology Stack
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);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,
}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,
}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-chaininterest_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%
}
}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.
ZKC Token
SPL token on Solana. 1 billion total supply with carefully designed vesting schedules and utility mechanisms.
Token Allocation
Token Details
Revenue Distribution
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
| Source | Mechanism | To Protocol |
|---|---|---|
| Origination Fee | 0.5% of loan amount | 100% |
| Interest Spread | Borrow rate minus supply rate | 20% |
| Liquidation Fee | 1% of liquidated amount | 100% |
| Credential Issuance | $2 equivalent in ZKC per proof | 100% |
| Integration License | $500/month enterprise SDK | 100% |
Security & Risk Management
Comprehensive risk framework covering smart contract, credit, and privacy risks with specific mitigations for each.
Smart Contract Risk
Reentrancy attack
CriticalReentrancyGuard on all state-changing functions
Oracle manipulation
HighMulti-oracle (Chainlink + Pyth), TWAP pricing, circuit breakers
ZK proof forgery
CriticalCryptographically impossible — ZK soundness property
Governance attack
HighTimelock + security council veto + quorum requirements
Credit Risk
Stale credentials
Medium30-day expiry + auto liquidation threshold adjustment
Collateral price crash
HighConservative LTV ratios + instant oracle updates + liquidation bots
Borrower default
MediumProgressive collateral increase on tier renewal
Data source manipulation
MediumMultiple data source requirement for Premium tier
Privacy Risk
Proof data leakage
LowPublic inputs contain no personal data by design
Nullifier correlation
LowNullifiers are circuit-specific, not linkable to identity
TEE prover compromise
MediumTEE fallback optional; default is local proving
Data connector breach
HighData never stored after proof generation; delete immediately
Insurance Fund
Protocol safety net for edge cases
Regulatory Compliance
GDPR / India DPDP Act
CompliantNo personal data stored by protocol. Client-side processing. Right to erasure via SBT burn.
FATF Travel Rule
CompatibleNon-custodial protocol. ZK credentials can include AML/sanctions check proof.
India RBI
Non-NBFCNo INR deposits — pure crypto lending. Account Aggregator follows RBI AA framework.
US Regulations
StructuredNon-US entity. IP geofencing for US persons. Legal opinion from Debevoise & Plimpton.
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–6Budget: $1.2M — Team: 8 people
ZK Circuit Design + Audit
CreditScore + Income circuits
Smart Contracts v0.1 Testnet
Verifier + SBT deployed
Client App MVP
iOS + Chrome with AA integration
Lending Pool v0.1 Testnet
USDC only, single collateral
Security Audit
Trail of Bits + OpenZeppelin
Trusted Setup Ceremony
Public, verifiable ceremony
Phase 2: Mainnet Launch
Months 7–12Budget: $2.8M + ZKC community sale revenue
Mainnet Launch on Solana
Permissionless mainnet
ZKC Token Launch + Governance
Token + governance activation
Multi-Collateral Support
SOL, USDC, wBTC, mSOL
Composite Credit Score
Full tier system launch
Integration SDK v1.0
First 3 protocol integrations
$50M TVL Target
Liquidity mining program
Phase 3: Expansion
Months 13–24Scaling to $500M TVL, 100+ integrations
Eclipse L2 Deployment
Cross-chain credential portability
Plaid Integration
US/EU market entry
B2B API Launch
White-label for DeFi protocols
Under-collateralized Flash Loans
ZK Premium tier feature
Mobile-First Markets
India, Nigeria, Indonesia, Brazil
$500M TVL Target
100+ protocol integrations
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.