🎯 Overview
Transform your protocol's risk management with comprehensive on-chain credit scoring. zPass enables you to assess user creditworthiness, prevent bad debt, and optimize lending decisions using proven Web3 behavioral data.
Perfect for : DeFi lending protocols, insurance platforms, high-value transaction systems, collateral management
📊 The Risk Assessment Challenge
Traditional Web3 Lending Problems
🔍 Blind Lending : No credit history for anonymous wallets
💸 High Default Rates : 15-25% liquidation rates in volatile markets
⚖️ Over-Collateralization : 150-200% collateral requirements limit accessibility
🤖 Bot Exploitation : Automated accounts gaming lending protocols
📉 Cascade Failures : Correlated liquidations during market stress
The zPass Solution
zPass provides comprehensive risk intelligence by analyzing:
Transaction History : Patterns indicating financial responsibility
DeFi Behavior : Lending, borrowing, and liquidation track record
Protocol Loyalty : Long-term engagement vs. yield farming
Risk Indicators : Suspicious activities and red flags
Cross-Platform Data : Holistic view across all Web3 activities
🏗️ Implementation Guide
Step 1: Basic Risk Scoring
Start with simple risk classification for new borrowers:
Copy async function assessBorrowerRisk(walletAddress) {
const score = await zpass.getScore(walletAddress);
const riskProfile = {
address: walletAddress,
zscore: score.zscore,
riskLevel: score.risk_level,
percentile: score.percentile,
recommendation: getRiskRecommendation(score)
};
return riskProfile;
}
function getRiskRecommendation(score) {
if (score.zscore >= 700) {
return {
decision: 'approve',
ltv: 0.8,
interestRate: 'prime',
monitoring: 'standard'
};
} else if (score.zscore >= 400) {
return {
decision: 'approve',
ltv: 0.6,
interestRate: 'standard',
monitoring: 'enhanced'
};
} else if (score.zscore >= 200) {
return {
decision: 'conditional',
ltv: 0.4,
interestRate: 'high',
monitoring: 'intensive'
};
} else {
return {
decision: 'decline',
reason: 'Insufficient credit history or high risk indicators'
};
}
}
Step 2: Advanced Risk Analytics
Implement comprehensive risk assessment with detailed analytics:
Copy async function comprehensiveRiskAssessment(walletAddress, loanAmount, collateralValue) {
// Get comprehensive wallet analytics
const analytics = await zpass.getWalletAnalytics(walletAddress);
// Calculate risk metrics
const riskMetrics = {
creditScore: analytics.zscore,
liquidationHistory: analytics.liquidation_count,
avgPositionSize: analytics.avg_position_size,
protocolDiversity: analytics.protocols_used.length,
accountAge: analytics.account_age_days,
activityLevel: analytics.transaction_frequency
};
// Advanced risk calculation
const riskAssessment = calculateAdvancedRisk(riskMetrics, loanAmount, collateralValue);
return {
...riskMetrics,
recommendation: riskAssessment,
monitoring_level: getMonitoringLevel(riskAssessment.risk_score),
suggested_terms: getLoanTerms(riskAssessment)
};
}
function calculateAdvancedRisk(metrics, loanAmount, collateralValue) {
let riskScore = 100; // Start with base risk
// Credit score impact (most important factor)
riskScore -= (metrics.creditScore / 10);
// Liquidation history penalty
riskScore += (metrics.liquidationHistory * 15);
// Account age bonus (older accounts are more stable)
if (metrics.accountAge > 365) riskScore -= 10;
if (metrics.accountAge > 730) riskScore -= 5;
// Protocol diversity bonus (diversified users are less risky)
if (metrics.protocolDiversity > 5) riskScore -= 5;
if (metrics.protocolDiversity > 10) riskScore -= 5;
// Loan-to-collateral ratio impact
const ltv = loanAmount / collateralValue;
if (ltv > 0.8) riskScore += 20;
if (ltv > 0.6) riskScore += 10;
return {
risk_score: Math.max(0, Math.min(100, riskScore)),
risk_category: getRiskCategory(riskScore),
confidence: calculateConfidence(metrics)
};
}
Step 3: Dynamic Risk Monitoring
Implement real-time risk monitoring for active loans:
Copy class LoanRiskMonitor {
constructor(zpassClient) {
this.zpass = zpassClient;
this.activeLoans = new Map();
}
async monitorLoan(loanId, borrowerAddress, loanDetails) {
// Initial risk assessment
const initialRisk = await this.assessCurrentRisk(borrowerAddress);
this.activeLoans.set(loanId, {
borrower: borrowerAddress,
initialRisk: initialRisk.risk_score,
currentRisk: initialRisk.risk_score,
lastUpdate: Date.now(),
...loanDetails
});
// Set up periodic monitoring
this.scheduleRiskUpdate(loanId);
}
async assessCurrentRisk(walletAddress) {
const currentScore = await this.zpass.getScore(walletAddress);
const recentActivity = await this.zpass.getRecentActivity(walletAddress, 7); // Last 7 days
let riskAdjustment = 0;
// Check for concerning recent activity
if (recentActivity.large_withdrawals > 0) riskAdjustment += 10;
if (recentActivity.new_liquidations > 0) riskAdjustment += 20;
if (recentActivity.suspicious_transactions > 0) riskAdjustment += 15;
return {
base_score: currentScore.zscore,
risk_score: Math.max(0, 100 - currentScore.zscore + riskAdjustment),
risk_factors: recentActivity,
timestamp: Date.now()
};
}
async scheduleRiskUpdate(loanId) {
setInterval(async () => {
const loan = this.activeLoans.get(loanId);
if (!loan) return;
const currentRisk = await this.assessCurrentRisk(loan.borrower);
const riskIncrease = currentRisk.risk_score - loan.currentRisk;
// Update loan risk
loan.currentRisk = currentRisk.risk_score;
loan.lastUpdate = Date.now();
// Trigger alerts if risk increased significantly
if (riskIncrease > 20) {
await this.triggerRiskAlert(loanId, 'high', currentRisk);
} else if (riskIncrease > 10) {
await this.triggerRiskAlert(loanId, 'medium', currentRisk);
}
}, 60000 * 60); // Check every hour
}
async triggerRiskAlert(loanId, severity, riskData) {
const alert = {
loanId,
severity,
timestamp: Date.now(),
riskScore: riskData.risk_score,
riskFactors: riskData.risk_factors,
recommendedAction: this.getRecommendedAction(severity, riskData)
};
// Send alert to risk management system
await this.sendAlert(alert);
}
getRecommendedAction(severity, riskData) {
switch(severity) {
case 'high':
return {
action: 'immediate_review',
description: 'Consider margin call or position reduction',
urgency: 'immediate'
};
case 'medium':
return {
action: 'enhanced_monitoring',
description: 'Increase monitoring frequency and prepare for potential action',
urgency: 'within_24h'
};
default:
return {
action: 'continue_monitoring',
description: 'Continue standard monitoring procedures',
urgency: 'routine'
};
}
}
}
📊 Risk Categories & Scoring
zScore Risk Mapping
zScore Range
Risk Level
Default Rate
Recommended LTV
Interest Rate
Risk Factors Analysis
Positive Indicators (Lower Risk)
Long Account History : 2+ years of activity
Diverse Protocol Usage : Active across 5+ protocols
No Liquidation History : Clean borrowing record
Stable Holdings : Long-term asset holding patterns
DAO Participation : Active governance involvement
Negative Indicators (Higher Risk)
Recent Liquidations : Liquidated within last 6 months
Bot-like Behavior : Automated transaction patterns
Yield Farming Only : No long-term protocol engagement
High Leverage History : Consistently high-risk positions
Suspicious Activity : Flagged transactions or addresses
🎯 Real-World Applications
DeFi Lending Protocol Example
Copy // Complete lending decision workflow
async function processLoanApplication(application) {
const { borrower, loanAmount, collateralAsset, collateralAmount } = application;
// Step 1: Basic eligibility check
const basicScore = await zpass.getScore(borrower);
if (basicScore.zscore < 200) {
return { approved: false, reason: 'Insufficient credit score' };
}
// Step 2: Comprehensive risk assessment
const riskAssessment = await comprehensiveRiskAssessment(
borrower,
loanAmount,
collateralAmount
);
// Step 3: Calculate loan terms
const loanTerms = {
approved: true,
loanAmount: loanAmount,
interestRate: calculateInterestRate(riskAssessment),
ltv: calculateMaxLTV(riskAssessment),
duration: calculateLoanDuration(riskAssessment),
monitoring: getMonitoringLevel(riskAssessment)
};
// Step 4: Set up monitoring
if (loanTerms.approved) {
await loanMonitor.monitorLoan(
generateLoanId(),
borrower,
loanTerms
);
}
return loanTerms;
}
Insurance Protocol Risk Pricing
Copy // Dynamic insurance premium calculation
async function calculateInsurancePremium(walletAddress, coverageAmount, protocol) {
const riskProfile = await zpass.getWalletAnalytics(walletAddress);
// Base premium calculation
let premiumRate = 0.05; // 5% base rate
// Adjust based on user risk score
if (riskProfile.zscore > 700) premiumRate *= 0.7; // 30% discount
else if (riskProfile.zscore < 400) premiumRate *= 1.5; // 50% premium
// Protocol-specific adjustments
const protocolRisk = await getProtocolRiskMultiplier(protocol);
premiumRate *= protocolRisk;
// User's history with this protocol
const protocolHistory = riskProfile.protocols_used.find(p => p.name === protocol);
if (protocolHistory && protocolHistory.liquidations === 0) {
premiumRate *= 0.9; // 10% discount for clean history
}
return {
coverageAmount,
premiumRate,
annualPremium: coverageAmount * premiumRate,
riskFactors: extractRiskFactors(riskProfile)
};
}
📈 Success Metrics & ROI
Proven Results
Aave Integration Analysis
Based on analysis of 4,410 liquidated addresses
75% of liquidations came from wallets scoring <300
Only 5% of liquidations from wallets scoring >400
Potential 30% reduction in liquidations with zPass filtering
Risk-Adjusted Lending Benefits
25% reduction in bad debt through better risk assessment
40% increase in lending volume via optimized LTV ratios
15% improvement in borrower retention through fair pricing
$2M+ prevented losses in first year of implementation
Implementation ROI
Metric
Before zPass
After zPass
Improvement
🚀 Getting Started
Quick Implementation
Get API Keys and configure authentication
Start Simple : Implement basic risk scoring for new loans
Add Monitoring : Set up real-time risk monitoring for active positions
Optimize : Use data insights to refine your risk models
Best Practices
Start Conservative : Begin with lower LTV ratios and gradually optimize
Monitor Continuously : Risk profiles change - update assessments regularly
Combine Signals : Use zPass data alongside your existing risk factors
Test Thoroughly : Validate risk models with historical data before going live
🤝 Support & Resources
Technical Support
💬 Discord : Real-time developer community
Risk Management Consultation
📞 Expert Consultation : Schedule a call with our risk specialists
🎯 Custom Models : Develop protocol-specific risk algorithms
📊 Data Analysis : Historical analysis of your user base