Skip to content

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 RangeLabelColor
>= 7.0low riskGreen
4.0 - 6.9medium riskYellow
< 4.0high riskRed

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
>= $100M10
>= $50M9
>= $10M8
>= $5M7
>= $1M5
>= $100K3
< $100K1

Measures how much the current APY diverges from the 30-day (or 1-day) historical APY. Large divergence suggests volatile or unsustainable yield.

DivergenceScore
< 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).

Known protocols receive a fixed tier score based on their track record, audit history, and TVL across the DeFi ecosystem.

ProtocolScore
aave-v39
morpho-v19
euler-v27
pendle7
maple6
ethena-usde7
ether.fi-liquid7
ether.fi-stake7
upshift5
neverland4
yo-protocol4
Unknown3

Unknown protocols default to 3 (high risk) since there is no track record to evaluate.

Whether the vault supports withdrawals. Non-redeemable vaults carry additional liquidity risk since you may not be able to exit your position.

RedeemableScore
Yes (isRedeemable: true)10
No (isRedeemable: false)3

Whether the vault holds stablecoins. Stablecoin vaults carry less price risk.

Asset TypeScore
Has stablecoin tag9
No stablecoin tag5

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:

DimensionWeightRationale
TVL Magnitude25%Strong signal of trust and liquidity
Protocol Maturity25%Audit history and track record are the strongest safety indicators
APY Stability20%Volatile APY suggests high risk or unsustainable incentives
Redeemability15%Ability to exit is important but secondary
Asset Type15%Price risk matters but is user-preference dependent

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']
DimensionRaw ScoreWeightWeighted
TVL ($120M >= $100M)100.252.50
APY Stability (divergence = 2.5%)100.202.00
Protocol (aave-v3)90.252.25
Redeemability (true)100.151.50
Asset Type (stablecoin)90.151.35
Total9.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.6
console.log(risk.label); // "low"
console.log(risk.breakdown); // { tvl: 10, apyStability: 10, protocol: 9, redeemability: 10, assetType: 9 }
Terminal window
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.


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