
OatsAI
TOKEN RISK INDEX
Most token risk tools look at one thing. OatsAI looks at five - holder concentration, liquidity depth relative to market cap, how long the contract has been live, whether transfers show organic or artificial patterns, and how much supply the dev wallets still control. Each one is scored independently, then combined into a single index.
The output is a number, the oats index, and one of five grades:
INSTALL
Get started with OatsAI in seconds. Clone, install, analyze.
git clone https://github.com/OatsAIthedev/OatsAIcd OatsAIpip install -e .# Run all 138 tests across 7 filesPYTHONPATH=. pytest tests/ -vfrom oats import OatsEngine, TokenRiskSnapshot
engine = OatsEngine()
snap = TokenRiskSnapshot(
timestamp=1700000000.0,
top10_holder_pct=25.0,
liquidity_to_mcap=0.08,
contract_age_days=150.0,
transfer_pattern_score=70.0,
dev_wallet_pct=4.0,
)
result = engine.analyze(snap)
print(result.oats_index) # e.g. 74.5
print(result.grade) # e.g. SAFEdocker build -t oatsai .docker run --rm oatsaioats/engine.pymodels.pysignals.pytests/SIGNALS
Five on-chain behavior layers. Each scores 0-100. The engine weights and combines them into the oats index.
Concentration
Well-distributed supply = manipulation resistance. Top-10 whales controlling 80%+ = rug risk.
top10_holder_pct: 0-20% → 80-100, >80% → 0-5Liquidity Health
Liquidity/market cap ratio. Low ratio = easy to dump, high slippage.
score = clamp(liquidity_to_mcap / 0.10 × 100, 0, 100)Contract Maturity
Older contracts have survived longer without exit events. New = unproven.
0d → 0, 30d → 30, 90d → 60, 365d+ → 100Transfer Quality
Organic transfer patterns indicate real user adoption vs bot-inflated activity.
0 → wash trading detected, 100 → organic distributionDev Exposure
Dev wallet holdings = single point of failure. Above 20% = critical rug-pull risk.
dev_pct: 0% → 100, 20%+ → 0 (critical)TokenRiskSnapshot
↓
OatsEngine
├── ConcentrationSignal (0.30)
├── LiquidityHealthSignal (0.25)
├── ContractMaturitySignal (0.20)
├── TransferQualitySignal (0.15)
└── DevExposureSignal (0.10)
↓
OatsAnalysis
• oats_index (0-100)
• grade (OatsGrade)
• signals (list[SignalResult])
• dominant_signal
• risk_confidence