Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Token unlock and vesting tracker - quantify supply pressure via absorption ratio, classify cliff vs linear, and deliver one-line market reads
.claude/skills/aeonfun-unlock-monitor/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 167% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 144% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 250% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 56% | 0% |
<!-- autoresearch: variation B — sharper output via Absorption Ratio (unlock $ / avg daily volume), Cliff vs Linear classification, and a one-line market-read verdict per unlock. Replaces qualitative HIGH/MED/LOW tiers with quantitative liquidity-strain thresholds backed by Keyrock's 16k-unlock study. Folds in source-status observability (from C) and CoinGecko volume enrichment (from A) as cheap wins. -->
Read memory/MEMORY.md for context on market positions and active narratives. Read the last 7 days of memory/logs/ to dedup against any unlock already covered. Read memory/state/unlock-monitor-seen.json if present — a list of ${ticker}:${unlock_date} keys already shipped. Skip exact matches; if file is absent, treat as empty.
The original skill ranked unlocks by % of circulating supply. That's a weak proxy. The right metric is Absorption Ratio = unlock_dollar_value / 7-day avg daily volume. Keyrock's analysis of 16k+ unlocks shows that ratios above ~2.4× consistently strain liquidity and produce measurable price drawdown. Below ~0.5× the market typically yawns. This skill ranks by absorption ratio first, supply % second, and folds in cliff-vs-linear structure plus pre-unlock price action to produce a per-event verdict.
Run these WebSearches in parallel:
"token unlock schedule" "${week_of}" site:tokenomist.ai OR site:defillama.com"token unlock" "this week" cliff vesting team investor ${current_year}"upcoming unlocks" cryptorank OR dropstab ${current_year}"FTX distribution" OR "Mt. Gox" OR "Celsius" OR "creditor payout" crypto ${current_year} (court-ordered supply shocks count)"$10M" OR "$50M" OR "$100M" token unlock ${week_of} (dollar-value angle catches what supply % misses)Also fetch (WebFetch fallback if any URL fails):
https://tokenomist.ai — primary, source-verified across 500+ tokens with cliff/linear labelinghttps://defillama.com/unlocks — DeFi protocols, with $ valueshttps://cryptorank.io/token-unlock — broad coverage, recipient-category labeledhttps://dropstab.com/vesting — alternative cross-source verificationhttps://www.coingecko.com/en/highlights/incoming-token-unlocks — Tokenomist-poweredRecord which sources returned data → emit a sources: line in the log (see step 7).
For each candidate unlock, fetch from CoinGecko search results or WebFetch on https://www.coingecko.com/en/coins/${slug}:
cliff (lump-sum unlock) vs linear (gradual) vs mixed — usually labeled by tokenomist / cryptorankteam, investor, ecosystem, community, creditorIf volume data is unavailable, mark the unlock vol=unknown and tier it conservatively — do not skip it, but flag the gap in the output.
For each unlock with known volume:
absorption_ratio = unlock_usd_value / avg_daily_volume_usd_7dTier the events:
| Tier | Absorption Ratio | Meaning | |------|------------------|---------| | CRISIS | > 2.4× | Liquidity cannot absorb without significant slippage | | STRAIN | 1.0× – 2.4× | Will require multiple sessions to digest | | DIGESTIBLE | 0.3× – 1.0× | Notable but absorbable | | TRIVIAL | < 0.3× | Background noise, skip unless recipient flag elevates it |
Recipient override: a team or investor unlock with absorption ratio one tier lower than CRISIS gets bumped up one tier (cost-basis-zero sellers act differently than airdrop recipients). A community or staking-reward unlock with ratio one tier higher gets bumped down one tier.
Court-ordered distributions (FTX, Mt. Gox, Celsius) bypass the tier system — always include, label forced, note the legal timeline.
For each event, set a one-line market_read based on 30d price change and vesting type:
priced in — token is down >20% over 30d AND ratio ≤ STRAIN. Selling has already happened; unlock day may mark a bottom.market asleep — token is flat or up over 30d AND tier is STRAIN or CRISIS. Asymmetric downside; the move hasn't started.fade pump — token is up >15% over 30d AND tier is CRISIS. Classic pre-cliff bid-then-dump pattern.forced sellers — court-ordered. Different beast — legal timeline, not market-driven.absorbable — TRIVIAL or DIGESTIBLE with no recipient flag. Nothing to see here.For cliff unlocks: weakness usually starts ~30 days before; vol peaks at unlock; recovery 10–14 days later. Note this pattern explicitly when relevant.
Sort by absorption ratio descending, then by recipient flag (team/investor first), then by dollar value. Take the top 8 (drop TRIVIAL unless a court-order or recipient flag elevates them).
Deduplicate against memory/state/unlock-monitor-seen.json and the last 7 days of logs.
If the resulting list is empty, that's a real signal — output UNLOCK_MONITOR_QUIET and a one-line note explaining why (e.g. "No unlocks above 0.3× absorption ratio this week — supply side is calm").
./notify (under 4000 chars)Lead with the headline — the single most-leveraged unlock — then tiered groups, then the read.
*Unlock Monitor — week of ${date}*
This week's most leveraged: **$TOKEN** unlocks Wed at $XM (Y× daily vol). [market read]
CRISIS (> 2.4× daily vol)
- **$TOKEN** — Mon Apr 22 — X tokens (Z% supply, $YM)
cliff · investor · 3.1× vol · 30d -8% → market asleep
Note: cliff pattern — expect weakness running into the date
STRAIN (1.0×–2.4×)
- **$TOKEN** — details · 1.6× vol · 30d -25% → priced in
DIGESTIBLE (0.3×–1.0×)
- **$TOKEN** — details · 0.6× vol · linear · ecosystem → absorbable
FORCED
- **$TOKEN** — Mon — court-ordered creditor batch, $XM, no schedule discretion
*Supply read:* 2-3 sentences. Where's the real pressure, where's the noise, where's the asymmetry. Reference any cliff timing patterns. If the week is quiet, say so plainly.
sources: tokenomist=ok, defillama=ok, cryptorank=ok, dropstab=fail, coingecko=okAppend every shipped event's key (${ticker}:${unlock_date}) to memory/state/unlock-monitor-seen.json (create the file and memory/state/ directory if absent). Trim the file to the last 90 days of keys.
Log to memory/logs/${today}.md:
### unlock-monitor
- Week of: ${date}
- Shipped: N events (X CRISIS, Y STRAIN, Z DIGESTIBLE)
- Top leverage: $TOKEN at A.A× daily vol
- Verdict mix: K priced-in, L asleep, M fade-pump, N forced
- Sources: tokenomist=ok|fail, defillama=ok|fail, cryptorank=ok|fail, dropstab=ok|fail, coingecko=ok|fail
- Status: UNLOCK_MONITOR_OK | UNLOCK_MONITOR_QUIET | UNLOCK_MONITOR_DEGRADED (if 2+ sources failed) | UNLOCK_MONITOR_ERROR (if all failed)UNLOCK_MONITOR_QUIET with one sentence, don't pad.curl works — there is no network sandbox. Use WebFetch as a fallback for a flaky public GET — all data sources here are public, no auth required. If WebFetch on a specific source also fails, mark it fail in the source-status line and proceed with whatever sources returned data. Only emit UNLOCK_MONITOR_ERROR if all sources failed.
Other measured skills in the registry, with their headline benchmark lift.