Daily DeFi read — regime verdict, biggest movers with "why it matters", sustainable vs incentive yields, fees fundamentals
Scanned 6/6/2026
Install to Claude Code
npx -y skills add anajuliabit/aeon --skill defi-overview --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Defi Overview?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/anajuliabit-defi-overview)More formats (shields.io, HTML) on the badges page.
---
name: DeFi Overview
description: Daily DeFi read — regime verdict, biggest movers with "why it matters", sustainable vs incentive yields, fees fundamentals
var: ""
tags: [crypto]
---
<!-- autoresearch: variation B — sharper output via regime verdict + sustainable-vs-incentive yield split + fees fundamentals + per-mover "why it matters" -->
> **${var}** — Chain or protocol to focus on (e.g. `solana`, `aave`, `arbitrum`). If empty, full market overview.
Read `memory/MEMORY.md` for context. Read the last 2 days of `memory/logs/` to avoid repeating numbers and to cite yesterday's figure when flagging today's change.
## Thesis
The original produced a table of numbers. This version produces a **read of the market**: one verdict line at the top, then only items that *changed* or *matter*, each with a one-line reason a reader should care. TVL alone is lagging and emission-subsidized — we pair it with fees/revenue (real fundamentals) and split yields into sustainable (`apyBase`) vs incentive-driven (`apyReward`) so readers stop chasing scam-tier APYs.
## Focus mode
- `var` empty → full market overview.
- `var` matches a chain name in `/v2/chains` (case-insensitive) → chain focus: scope DEX volume, fees, and yields to that chain; keep a 2-line market header for context.
- `var` matches a protocol slug in `/protocols` → protocol focus: pull `/protocol/{slug}`, `/summary/fees/{slug}`, `/summary/dexs/{slug}` if DEX; compare against its chain and its 30-day self.
- `var` matches neither → proceed as full overview and note `var unresolved: ${var}` in the footer.
## Steps
### 1. Fetch (public, no auth — use WebFetch if curl fails)
```bash
# TVL
curl -fsS "https://api.llama.fi/v2/chains" > .tmp/chains.json
curl -fsS "https://api.llama.fi/protocols" > .tmp/protocols.json
# Volumes & fundamentals (these are the endpoints the old version was missing)
curl -fsS "https://api.llama.fi/overview/dexs?excludeTotalDataChart=true&excludeTotalDataChartBreakdown=true" > .tmp/dexs.json
curl -fsS "https://api.llama.fi/overview/fees?excludeTotalDataChart=true&excludeTotalDataChartBreakdown=true" > .tmp/fees.json
# Stablecoins
curl -fsS "https://stablecoins.llama.fi/stablecoins?includePrices=false" > .tmp/stables.json
# Yields
curl -fsS "https://yields.llama.fi/pools" > .tmp/pools.json
```
For each endpoint, if curl fails or returns non-JSON, retry once with **WebFetch** against the same URL. Mark the source `ok` or `fail` — carry this into the footer. Never block the whole run on a single source.
`/protocols` and `/v2/chains` already include `change_1d` / `change_7d` / `tvl` — use these directly, do not diff manually. `/overview/dexs` and `/overview/fees` return `total24h`, `total7d`, `change_1d`, `change_7d`, `change_1m`, `protocols[]`.
If `var` is a chain, additionally fetch `/overview/dexs/{chain}` and `/overview/fees/{chain}` and filter pools by `chain == var`.
### 2. Compute the verdict (ONE line, leads the message)
Score three dimensions from the last 24h:
- `tvl_d = overall TVL change_1d` (sum across `/v2/chains`)
- `vol_d = DEX volume change_1d` (from `/overview/dexs`)
- `stable_d = stablecoin supply change_1d` (sum from `/stablecoins`)
Verdict rules (pick the first that matches):
- All three > +2% → **Risk-on** — capital flowing in across TVL, volume, and stables.
- Two of three < −2% → **Risk-off** — capital unwinding.
- `|tvl_d| < 1% AND |vol_d| < 5%` → **Sideways** — no conviction; grind day.
- Otherwise → **Mixed** — describe the split in ≤12 words (e.g. "TVL drifting up on steady volume, stables flat").
### 3. Pick what goes in the message
Each section caps at 3 items. **Drop any section whose best item fails its inclusion rule** — don't pad.
**Top chains** (3 items): rank by TVL; show `change_1d` only if `|change_1d| >= 1%`, otherwise suppress the delta.
**Movers — chains** (1 up, 1 down): filter `|change_1d| >= 5% AND tvl >= $500M`. Require a ≤15-word "why" grounded in what you observed (unlock, points program, bridge activity, depeg, exploit, launch). If you can't name a cause from the data or memory, write `"no obvious catalyst"` — do not invent one.
**Movers — protocols** (1 up, 1 down): filter `|change_1d| >= 10% AND tvl >= $100M`. Same "why" rule.
**Fundamentals — fees leaders** (top 3 by 24h fees from `/overview/fees`): include `change_1d` in fees vs 7d average. This replaces the old "top protocols by TVL" padding — fees > TVL for real demand.
**Fundamentals — fees-beating-TVL** (up to 2): protocols where `fees change_7d > +20% AND TVL change_7d < +5%`. These are where real demand is outpacing emission-subsidized capital. Skip section if none.
**DEX volume**: 24h total + top 3 DEXes with `change_1d`.
**Stablecoins**: total supply + any single stablecoin with `|change_1d| >= 1%` (usually only notable shifts survive).
**Yields** — split into two sub-sections, **each with a hard filter**:
- **Real yield (sustainable)** — 3 pools max. Filter:
`apyBase > 0 AND apyReward_share < 0.5 AND outlier == false AND predictions.binnedConfidence >= 2 AND apyMean30d >= apy * 0.5 AND tvlUsd >= $10M`.
Rank by `apyBase` descending.
- **Incentive yield (points / emissions)** — 2 pools max. Filter:
`apyReward > 0 AND outlier == false AND tvlUsd >= $25M`. Tag with the reward token symbol. Rank by `apy` descending.
If zero pools survive either filter, omit that sub-section and note it in the footer (`real_yield=0` etc.) — this is itself a signal.
### 4. Compare against yesterday's log
Read `memory/logs/${yesterday}.md`. If a mover appears today whose direction flipped (e.g. chain was top gainer yesterday, now top loser), prepend `↔` and note the reversal in its "why" line. If a yield pool from yesterday's Real-yield list is missing today, check whether it failed a filter (outlier flipped, APY collapsed) — this is worth one line under Yields.
### 5. Notify
Send via `./notify` (single call, under 4000 chars, plain markdown). Template:
```
*DeFi — ${today}* — <Verdict>: <≤12-word regime read>
*TVL:* $X.XXT (+X.X% 24h, +X.X% 7d)
*Top chains*
1. Ethereum — $XXXB (+X.X%)
2. Solana — $XXB (+X.X%)
3. Tron — $XXB
*Movers*
↑ Sui +12% ($1.8B → $2.0B) — <≤15-word why>
↓ Base −7% ($9.2B → $8.6B) — <≤15-word why>
↑ Pendle +18% ($4.0B → $4.7B) — <≤15-word why>
↓ Ethena −11% ($5.1B → $4.5B) — <≤15-word why>
*Fees leaders (24h)*
1. Tether — $XXM (+X% vs 7d avg)
2. Circle — $XXM (flat)
3. Uniswap — $XXM (−X%)
*Fees beating TVL*
• Hyperliquid — fees +42% / TVL +3% (7d) — demand outrunning deposits
• <second if any>
*DEX vol (24h):* $X.XB (+X%) top: Uniswap $XB, PancakeSwap $XB, Jupiter $XB
*Stables:* $XXXB (+0.X%) — USDe +1.2% only notable single-issuer move
*Real yield (sustainable, ≥$10M, filtered)*
• stETH (Lido, ETH) — 3.2% apyBase ($21B TVL)
• sUSDS (Sky, ETH) — 6.1% apyBase ($2.1B TVL)
• GHO savings (Aave, ETH) — 7.0% apyBase ($400M TVL)
*Incentive yield (points / emissions, ≥$25M)*
• <pool> — 18% apy via $XYZ rewards ($80M TVL)
• <pool> — 14% apy via $ABC rewards ($60M TVL)
_sources: llama_tvl=ok llama_dex=ok llama_fees=ok llama_stables=ok llama_yields=ok | var: ${var:-none}_
```
Edit rules before sending:
- Any mover with `"no obvious catalyst"` stays — do not invent causes.
- Drop any section whose filter produced no items, except write one line explaining (e.g. `_no real-yield pools cleared filter today — apyMean30d gates tightened_`).
- If ≥2 sources are `fail`, prefix the title with `[DEGRADED]` and note which in the footer.
- If all sources fail, send a single line `DEFI_OVERVIEW_ERROR: all DeFiLlama endpoints failed` and stop.
### 6. Log
Append to `memory/logs/${today}.md`:
```
### defi-overview
- Var: ${var:-none}
- Verdict: <Risk-on|Risk-off|Sideways|Mixed> — <regime read>
- TVL: $X.XXT (+X.X% 24h)
- Top mover up: <chain/protocol> +X%
- Top mover down: <chain/protocol> −X%
- Fees leader: <protocol> $XXM
- Real-yield count: N Incentive-yield count: N
- Sources: tvl=ok dex=ok fees=ok stables=ok yields=ok
```
## Sandbox note
The sandbox may block outbound curl for `*.llama.fi`. For every endpoint, if curl fails or returns a non-JSON body, retry once with **WebFetch** against the same URL before marking the source `fail`. All DeFiLlama endpoints used here are public and unauthenticated — no pre-fetch/post-process needed.
## Constraints
- Never invent a catalyst in the "why" line. `"no obvious catalyst"` is a valid answer.
- Never show an APY without its filter verdict (real vs incentive). No unlabeled yields.
- Drop empty sections rather than padding with low-conviction items.
- Keep the notification under 4000 chars — trim lowest-signal sections first (in order: Stablecoins, DEX top-3, Top chains #3).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!