Разработка дашборда влияния token unlock на цену
Token unlock — один из самых предсказуемых ценовых катализаторов в крипто. Scheduled vesting cliffs публичны on-chain или через документацию проекта, но агрегировать эти данные и показать их в контексте рыночной капитализации, liquidity и исторических паттернов — нетривиальная задача. Именно это делает unlock dashboard ценным инструментом.
Источники данных об unlock событиях
On-chain vesting контракты
Многие проекты деплоят стандартные vesting контракты — их можно читать напрямую:
import { publicClient } from './client'
import { parseAbi } from 'viem'
const vestingAbi = parseAbi([
'function vestingSchedules(address beneficiary) view returns (uint256 start, uint256 cliff, uint256 duration, uint256 amountTotal, uint256 released)',
'function VestingScheduleCreated(address indexed beneficiary, uint256 amount) event',
])
// Все бенефициары из событий
const events = await publicClient.getLogs({
address: vestingContractAddress,
event: parseAbi(['event VestingScheduleCreated(address indexed beneficiary, uint256 amount)'])[0],
fromBlock: deployBlock,
toBlock: 'latest',
})
Популярные контракты: OpenZeppelin VestingWallet, Sablier v2 (streaming vesting), TokenVesting от различных аудиторов. Каждый имеет свой ABI.
Sablier v2 заслуживает отдельного внимания — это protocol-level streaming, где unlock происходит непрерывно, не по клиффам. Для дашборда нужно вычислять unlocked amount на момент времени T через streamedAmountOf(streamId).
Off-chain источники
Не все проекты используют on-chain vesting. Многие держат токены на multisig и переводят вручную по расписанию. Источники данных:
- TokenUnlocks.app API — агрегирует данные по крупным проектам
- Messari — исторические unlock события
- Vesting документация проекта — парсинг публичных документов (Notion, Gitbook)
- CoinGecko — tokenomics данные для части проектов
Для MVP: комбинация on-chain парсинга + ручной ввод для крупных проектов + интеграция с одним-двумя API.
Расчёт влияния на цену
Supply shock ratio
Базовая метрика: сколько токенов разблокируется относительно текущего circulating supply и 30-дневного объёма торгов:
interface UnlockEvent {
date: Date
amount: bigint // в токен единицах
category: 'team' | 'investors' | 'ecosystem' | 'public'
vestingContract: string
}
function calculatePriceImpact(unlock: UnlockEvent, marketData: MarketData) {
const unlockUsd = Number(formatUnits(unlock.amount, 18)) * marketData.tokenPrice
// % от circulating supply
const supplyImpact = unlockUsd / marketData.marketCap * 100
// Отношение к среднедневному объёму
const volumeRatio = unlockUsd / (marketData.volume30d / 30)
// Исторический паттерн: инвесторы/команда продают агрессивнее
const sellPressureMultiplier = {
team: 0.3, // ~30% обычно продаётся
investors: 0.5, // ~50% продаётся (особенно ранние раунды)
ecosystem: 0.1, // grants редко продаются сразу
public: 0.15,
}[unlock.category]
const estimatedSellPressure = unlockUsd * sellPressureMultiplier
return {
supplyImpactPercent: supplyImpact,
volumeRatio,
estimatedSellPressureUsd: estimatedSellPressure,
severity: volumeRatio > 1 ? 'high' : volumeRatio > 0.3 ? 'medium' : 'low',
}
}
Исторический backtesting
Для каждого прошлого unlock события рассчитываем фактическое изменение цены за [-7d, 0, +1d, +7d, +30d]:
-- Пример запроса для исторического анализа
SELECT
u.unlock_date,
u.amount_usd,
u.category,
p.price_7d_before,
p.price_at_unlock,
p.price_7d_after,
(p.price_7d_after - p.price_at_unlock) / p.price_at_unlock * 100 as pct_change_7d
FROM unlock_events u
JOIN price_snapshots p ON p.token_id = u.token_id
AND p.date BETWEEN u.unlock_date - interval '7 days'
AND u.unlock_date + interval '30 days'
WHERE u.token_id = $1
ORDER BY u.unlock_date DESC
Этот анализ показывает историческую корреляцию между размером unlock и движением цены для конкретного токена — ценнее, чем усреднённые по рынку цифры.
Визуализация
Timeline chart
Основной компонент: горизонтальная временная шкала с событиями разблокировки. TradingView Lightweight Charts с кастомными markers:
import { createChart, IChartApi } from 'lightweight-charts'
// Ценовой chart + unlock markers
const markers = unlockEvents.map(event => ({
time: event.date.getTime() / 1000,
position: 'belowBar' as const,
color: event.severity === 'high' ? '#ef4444' : '#f59e0b',
shape: 'arrowUp' as const,
text: `$${(event.amountUsd / 1e6).toFixed(1)}M unlock`,
size: Math.min(event.severity === 'high' ? 2 : 1, 3),
}))
Unlock calendar
Календарное представление будущих событий — shadcn/ui Calendar с custom day renderer, отображающим сумму unlock за день.
Supply breakdown
Pie/donut chart текущего распределения supply по категориям (locked/unlocked/circulating) + stacked bar с прогнозом разблокировки по месяцам.
Стек и данные
| Компонент | Технология |
|---|---|
| Price data | CoinGecko API / CryptoCompare |
| On-chain reads | viem + Alchemy/QuickNode |
| Historical data | PostgreSQL + TimescaleDB |
| Charts | TradingView Lightweight Charts |
| Frontend | Next.js + Tailwind |
| Cron jobs | Vercel Cron / Railway |
Дашборд для одного токена можно сделать за 3 дня. Мультитокенная платформа с историческим анализом, on-chain парсингом нескольких vesting стандартов и автоматическим обновлением данных — 4–5 дней.







