Unlock Monitor
GitHub追踪代币解锁与归属,通过吸收比率量化供应压力,区分悬崖或线性释放,结合流动性数据生成市场影响研判,替代传统百分比评级。
Trigger Scenarios
Install
npx skills add aaronjmars/aeon --skill Unlock Monitor -g -y
SKILL.md
Frontmatter
{
"name": "Unlock Monitor",
"tags": [
"crypto"
],
"type": "Skill",
"commits": true,
"category": "crypto",
"schedule": "0 10 * * 1",
"description": "Token unlock and vesting tracker — quantify supply pressure via absorption ratio, classify cliff vs linear, deliver one-line market reads",
"permissions": [
"contents:write"
]
}
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.
Core thesis
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.
Steps
1. Gather candidate unlocks
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-powered
Record which sources returned data → emit a sources: line in the log (see step 7).
2. Enrich each candidate with volume + structure
For each candidate unlock, fetch from CoinGecko search results or WebFetch on https://www.coingecko.com/en/coins/${slug}:
- 7-day average daily volume (USD) — denominator for the absorption ratio
- Spot price at fetch time
- 30-day price change % — input to the market-read verdict
- Vesting structure:
cliff(lump-sum unlock) vslinear(gradual) vsmixed— usually labeled by tokenomist / cryptorank - Recipient category:
team,investor,ecosystem,community,creditor
If volume data is unavailable, mark the unlock vol=unknown and tier it conservatively — do not skip it, but flag the gap in the output.
3. Compute Absorption Ratio and tier
For each unlock with known volume:
absorption_ratio = unlock_usd_value / avg_daily_volume_usd_7d
Tier 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.
4. Classify pre-unlock market read
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.
5. Rank and select
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").
6. Send via ./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=ok
7. Persist state and log
Append 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)
Guidelines
- The Absorption Ratio is the headline metric. % of circulating supply is secondary — useful for context but not for ranking.
- Team and investor unlocks at low cost basis are the strongest sell signals. Bias the recipient override toward overstating their impact, not understating.
- Linear unlocks rarely produce single-day shocks — say so explicitly when one shows up high in the list. The danger from linear is cumulative, not pointwise.
- Cliff unlocks have a recognizable pattern: weakness ~30 days prior, peak vol on the date, recovery 10–14 days later. Reference this pattern when timing matters.
- Pre-unlock price action is the cheapest signal of whether the market has done its work already. A token bleeding for 30 days into a known unlock is priced in. A token ripping into a known cliff is a fade pump.
- Court-ordered distributions are unique — forced liquidation under legal timelines, no strategic discretion. Tier them separately.
- Be direct. "this one's priced in", "market's asleep on this", "fade the pump" — say it plainly. No hedging.
- A quiet week on supply is a signal too. Ship
UNLOCK_MONITOR_QUIETwith one sentence, don't pad. - Cross-reference active narratives in MEMORY.md — unlocks during a fading narrative hit harder; unlocks into a hot narrative get absorbed.
Sandbox note
The sandbox may block outbound curl. Use WebFetch as a fallback for any URL fetch — 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.
Environment Variables Required
- None (uses WebSearch + WebFetch only)
- Notification channels configured via repo secrets (see CLAUDE.md)
Version History
- fb16753 Current 2026-07-05 12:08


