Risk Scoring Guide
EarnForge computes a composite 0-10 risk score for every vault. Higher score means safer. The score is deterministic, purely data-driven, and based on 5 dimensions with fixed weights.
Score Labels
Section titled “Score Labels”| Score Range | Label | Color |
|---|---|---|
| >= 7.0 | low risk | Green |
| 4.0 - 6.9 | medium risk | Yellow |
| < 4.0 | high risk | Red |
The 5 Dimensions
Section titled “The 5 Dimensions”1. TVL Magnitude (25% weight)
Section titled “1. TVL Magnitude (25% weight)”Measures how much capital is locked in the vault. Higher TVL generally indicates more trust and lower risk of rug pulls or liquidity crises.
| TVL (USD) | Score |
|---|---|
| >= $100M | 10 |
| >= $50M | 9 |
| >= $10M | 8 |
| >= $5M | 7 |
| >= $1M | 5 |
| >= $100K | 3 |
| < $100K | 1 |
2. APY Stability (20% weight)
Section titled “2. APY Stability (20% weight)”Measures how much the current APY diverges from the 30-day (or 1-day) historical APY. Large divergence suggests volatile or unsustainable yield.
| Divergence | Score |
|---|---|
| < 5% | 10 |
| < 10% | 8 |
| < 20% | 6 |
| < 50% | 4 |
| >= 50% | 2 |
The divergence formula is:
divergence = |apy.total - ref| / max(apy.total, ref)Where ref is apy30d (preferred) or apy1d (fallback). If both are null,
the score defaults to 5 (moderate).
3. Protocol Maturity (25% weight)
Section titled “3. Protocol Maturity (25% weight)”Known protocols receive a fixed tier score based on their track record, audit history, and TVL across the DeFi ecosystem.
| Protocol | Score |
|---|---|
| aave-v3 | 9 |
| morpho-v1 | 9 |
| euler-v2 | 7 |
| pendle | 7 |
| maple | 6 |
| ethena-usde | 7 |
| ether.fi-liquid | 7 |
| ether.fi-stake | 7 |
| upshift | 5 |
| neverland | 4 |
| yo-protocol | 4 |
| Unknown | 3 |
Unknown protocols default to 3 (high risk) since there is no track record to evaluate.
4. Redeemability (15% weight)
Section titled “4. Redeemability (15% weight)”Whether the vault supports withdrawals. Non-redeemable vaults carry additional liquidity risk since you may not be able to exit your position.
| Redeemable | Score |
|---|---|
Yes (isRedeemable: true) | 10 |
No (isRedeemable: false) | 3 |
5. Asset Type (15% weight)
Section titled “5. Asset Type (15% weight)”Whether the vault holds stablecoins. Stablecoin vaults carry less price risk.
| Asset Type | Score |
|---|---|
Has stablecoin tag | 9 |
No stablecoin tag | 5 |
Weighted Formula
Section titled “Weighted Formula”The final score is a weighted average:
score = (tvl * 0.25) + (apyStability * 0.20) + (protocol * 0.25) + (redeemability * 0.15) + (assetType * 0.15)Weight rationale:
| Dimension | Weight | Rationale |
|---|---|---|
| TVL Magnitude | 25% | Strong signal of trust and liquidity |
| Protocol Maturity | 25% | Audit history and track record are the strongest safety indicators |
| APY Stability | 20% | Volatile APY suggests high risk or unsustainable incentives |
| Redeemability | 15% | Ability to exit is important but secondary |
| Asset Type | 15% | Price risk matters but is user-preference dependent |
Example Calculation
Section titled “Example Calculation”Consider an Aave V3 USDC vault on Base with:
- TVL: $120M
- APY: 5.23% (30d avg: 5.10%)
- Protocol: aave-v3
- Redeemable: true
- Tags:
['stablecoin']
| Dimension | Raw Score | Weight | Weighted |
|---|---|---|---|
| TVL ($120M >= $100M) | 10 | 0.25 | 2.50 |
| APY Stability (divergence = 2.5%) | 10 | 0.20 | 2.00 |
| Protocol (aave-v3) | 9 | 0.25 | 2.25 |
| Redeemability (true) | 10 | 0.15 | 1.50 |
| Asset Type (stablecoin) | 9 | 0.15 | 1.35 |
| Total | 9.6 |
Label: low risk (green)
import { createEarnForge } from '@earnforge/sdk';
const forge = createEarnForge();const vault = await forge.vaults.get('8453-0xbeef...');const risk = forge.riskScore(vault);
console.log(risk.score); // 9.6console.log(risk.label); // "low"console.log(risk.breakdown); // { tvl: 10, apyStability: 10, protocol: 9, redeemability: 10, assetType: 9 }earnforge risk 8453-0xbeef...import { useRiskScore } from '@earnforge/react';
function RiskDisplay({ vault }) { const { data: risk } = useRiskScore(vault); // risk.score, risk.label, risk.breakdown}Prompt: “What’s the risk score for vault 8453-0xbeef…?”
The get-vault-risk MCP tool returns the full breakdown.
Filtering by Risk
Section titled “Filtering by Risk”Use the risk-adjusted strategy preset to filter for low-risk vaults only:
const top = await forge.vaults.top({ asset: 'USDC', strategy: 'risk-adjusted', // Only vaults with risk score >= 7});Or use the suggest() engine, which inherently weights allocations by risk score:
const allocation = await forge.suggest({ amount: 10_000, asset: 'USDC',});// Higher-scoring (safer) vaults get larger allocations