Розробка системи взвешування активів в індексі
Крипто-індекс без продуманої методології взвешування — це не індекс, а довільна кошик токенів. TokenSets, Index Coop, Alongside — у кожного протоколу своя математика. Вибір методології безпосередньо впливає на дохідність, концентрацію ризику та ребалансувальні витрати. Неправильний вибір коштує дорого: ETH домінує в market cap індексі з 60–70% ваги, що робить індекс майже еквівалентним прямому холдингу ETH.
Методології взвешування: порівняння на практиці
Market Cap Weighting (MCW)
Класика: вага активу пропорційна його ринковій капіталізації. BTC + ETH = 70–80% у будь-якому MCW індексі. Наслідок — низька диверсифікація, експозиція на mega-cap за рахунок small/mid-cap.
Реалізація на Solidity: в кожному циклі ребалансування запитуємо ціни через Chainlink для кожного активу, множимо на circulating supply (зберігається off-chain та передається через оракул), розраховуємо ваги, виконуємо свопи для вирівнювання.
Проблема: circulating supply неможливо надійно отримати on-chain. Більшість MCW індексів зберігають дані про пропозицію в оновлюваному маппінгу та довіряють мультисигу оновлення. Це вектор маніпуляції.
Square Root Market Cap (SQRT MCW)
Застосовуємо корінь квадратний до market cap перед нормалізацією. Вага = sqrt(mcap_i) / sum(sqrt(mcap_j)). ETH у тому ж складі падає з 65% на ~40%. Small-cap отримує помітну вагу. Index Coop використовує варіацію цього підходу в DPI (DeFi Pulse Index).
Математика проста, реалізація on-chain sqrt — немає стандартної функції у Solidity, використовуємо метод Babylonian або FixedPointMathLib з Solmate:
function sqrt(uint256 x) internal pure returns (uint256) {
if (x == 0) return 0;
uint256 z = (x + 1) / 2;
uint256 y = x;
while (z < y) { y = z; z = (x / z + z) / 2; }
return y;
}
Equal Weight (EW)
Всі активи мають однакову вагу. Максимальна диверсифікація, максимальні ребалансувальні витрати: при 20 активах кожен рух ціни створює дрейф ваги. EW індекс з щоденним ребалансуванням на Ethereum mainnet — гарантований збиток на газ. Реалістично для L2 (Arbitrum, Base) з газом у сотих частках цента.
Volatility-Adjusted Weighting
Вага обернено пропорційна волатильності активу: менш нестійкий актив отримує більшу вагу. Мета — мінімізація загальної волатильності портфеля (підхід мінімальної дисперсії).
Розрахунок on-chain: потрібні історичні ціни для обчислення реалізованої волатильності. Або історичні дані Chainlink (дорого), або кастомний оракул цін з rolling window сховищем. На 20 активах з 30-денним вікном — зберігання 600 ціновим точок. Оновлення кожні 24 години — помірне навантаження.
| Методологія | Диверсифікація | Газ ребалансу | Складність оракула |
|---|---|---|---|
| Market Cap | Низька | Низький | Висока (пропозиція) |
| SQRT Market Cap | Середня | Низький | Висока (пропозиція) |
| Equal Weight | Висока | Високий | Тільки ціни |
| Volatility-Adj | Висока | Середній | Ціни + історія |
| Fundamental | Середня | Низький | TVL/Volume дані |
On-chain реалізація розрахунку ваги
Fixed-point арифметика для точності
Всі розрахунки ваг у Solidity в integer з 18-знаковою точністю (WAD = 1e18). Приклад нормалізації ваг:
// rawWeights[i] — ненормалізовані ваги (наприклад sqrt від market cap)
uint256 totalWeight = 0;
for (uint i = 0; i < n; i++) {
totalWeight += rawWeights[i];
}
// normalizedWeights[i] в WAD (сума = 1e18)
for (uint i = 0; i < n; i++) {
normalizedWeights[i] = rawWeights[i] * 1e18 / totalWeight;
}
Аудит: перевірити переповнення при великих rawWeights, перевірити що sum(normalizedWeights) == 1e18 ± 1 (помилка округлення).
Тригер ребалансування
Два підходи: часовий (кожні N блоків) та дрейф-базований (коли будь-який актив відхиляється від цільового ваги більше ніж на поріг, наприклад 5%).
Дрейф-базований ефективніший по газу: при стабільному ринку ребалансування рідкісні. Реалізація через Chainlink Automation: checkUpkeep повертає true якщо abs(currentWeight - targetWeight) > threshold для хоча б одного активу.
Поріг = 5% означає: при 20 активах з EW 5% target, актив з вагою 5.25% не тригерить ребаланс. Тільки при 5.26% — ребаланс. Це скорочує кількість ребалансувань в 3–5 разів порівняно з щоденним.
Інтеграція свопу при ребалансуванні
При ребалансуванні контракт продає overweight активи та купує underweight. Оптимальний маршрут — через DEX-агрегатор (1inch, Paraswap API) або прямо через Uniswap v3 Universal Router. Для індексу важлива атомарна ребалансування: або всі свопи вдалися, або ні. Якщо ребалансування ревертується в середині — індекс застрягає в незбалансованому стані.
Рішення: batch swap в одній транзакції через multicall або кастомний rebalancer контракт з откатом через try/catch.
Процес та таймлайн
Дизайн методології (1 день): вибір підходу до взвешування, джерела даних, тригер ребалансування.
Розробка контракту (2–3 дні): WeightCalculator з обраною методологією, логіка ребалансування, інтеграція з оракулом.
Оракул та off-chain дані (1 день): якщо потрібні дані про пропозицію або історичні ціни — off-chain сервіс оновлення.
Тестування (1 день): unit-тесты розрахунків ваг з відомими значеннями, fork-тесты ребалансування.
Всього: 3–5 днів для реалізації з однією методологією. Мультиметодологічні системи з governance-перемиканням — 1–2 тижні. Вартість розраховується індивідуально.







