Разработка системы токенизированного индекса
Токенизированный индекс — это ERC-20 токен, который представляет корзину on-chain активов в заданных пропорциях. Пользователь минтит индекс-токен, внося базовые активы (или ETH), и получает диверсифицированную экспозицию без необходимости держать каждый токен отдельно. Index Coop's DPI (DeFi Pulse Index) и Bankless BED Index — самые известные примеры. Реализовать похожую систему с правильной математикой ребалансинга и защитой от манипуляций — задача не тривиальная.
Где ломается математика индекса
NAV calculation и oracle dependency
Net Asset Value индекса — это сумма price_i * quantity_i для каждого компонента. Sounds simple. Но цены откуда? Если берёшь spot с Uniswap v3 TWAP — манипулируется через low-liquidity атаку. Если Chainlink — не все токены имеют Chainlink feed. Если кастомный агрегатор — нужно обслуживать.
На практике: гибридный подход. Chainlink для топ-токенов (ETH, BTC, LINK, UNI), Uniswap v3 TWAP с периодом ≥30 минут для остальных, с санитарной проверкой на deviation. Если TWAP отклоняется от Chainlink более чем на 5% — транзакция реверсируется, пока не стабилизируется. Это убирает flash loan манипуляцию через пулы с низкой ликвидностью.
Rebalancing: откуда берутся токены
При ребалансинге (раз в месяц или по trigger — выход компонента за пределы целевого веса ±5%) нужно продать переаллоцированные токены и купить недоаллоцированные. В on-chain системе это означает свапы через DEX. Два варианта:
Push rebalancing — контракт сам инициирует свапы через Uniswap/1inch при вызове rebalance(). Проблема: MEV. Все видят крупный ребалансинг в мемпуле, боты фронтранят каждый свап. Для индекса с $10M TVL это реальные потери.
Pull rebalancing (через arbitrage incentive) — контракт устанавливает target weights и предлагает арбитражерам mint/redeem по NAV ± небольшая премия. Арбитражеры сами ребалансируют портфель через внешние DEX, зарабатывая на спреде. Механика схожа с ETF creation/redemption. Это подход Set Protocol. Ценовое давление распределяется через рынок, а не концентрируется в одной транзакции.
Dilution при минтинге
Если mint() принимает только один токен (например, USDC) и конвертирует его в компоненты внутри, это создаёт risk: пока транзакция в мемпуле, цены компонентов меняются. Пользователь получит меньше индекс-токенов, чем ожидал.
Решение: proportional mint — пользователь вносит все компоненты в правильных пропорциях. Нет внутренних свапов, нет slippage risk. Минус — UX сложнее. Компромисс: accept single-token deposit через Uniswap router как опциональный путь с явным предупреждением о slippage.
Архитектура системы
Контракты
IndexToken (ERC-20) — сам индекс-токен. Реализует mint(uint256[] amounts) и redeem(uint256 shares). При mint проверяет пропорции входных активов, чеканит shares пропорционально NAV. При redeem сжигает shares, отправляет пропорциональную долю каждого компонента.
ComponentRegistry — список компонентов с целевыми весами. Owner (Gnosis Safe + timelock) может добавлять/удалять компоненты через governance proposal. При удалении компонента контракт переходит в режим redeem-only для этого актива.
NAVOracle — агрегирует цены через Chainlink + Uniswap TWAP, возвращает актуальный NAV. Критическая зависимость — мониторим staleness каждого feed (Chainlink heartbeat 1-24 часа в зависимости от токена).
RebalancingModule — логика ребалансинга. Считает deviation от target weights, публикует RebalancingOpportunity событие для арбитражеров, принимает rebalanceTrade(address[] sellTokens, address[] buyTokens, uint256[] amounts) от авторизованных rebalancer.
| Параметр | Типичное значение | Почему важно |
|---|---|---|
| Rebalancing threshold | ±5% от target weight | Слишком часто — газ, слишком редко — drift |
| TWAP period | 30-60 минут | Баланс между актуальностью и manipulation resistance |
| Max component count | 10-20 токенов | Газ на redeem O(n), mint O(n) |
| Mint/redeem fee | 0.1-0.3% | Покрывает operational costs |
Stacking: протокольная интеграция
Компоненты индекса могут быть не просто ERC-20, а yield-bearing токены: aWETH (Aave), stETH (Lido), cUSDC (Compound). Тогда индекс автоматически аккумулирует yield без дополнительной логики — NAV растёт за счёт accrual.
Но: при liquidation в Aave, balanceOf aWETH меняется мгновенно. NAV пересчитывается на следующий запрос. Если кто-то mintит в момент непоследовательного состояния — возможна dilution. Слушаем ReserveDataUpdated от Aave и блокируем mint/redeem в период резких изменений reserve index.
Процесс работы
Аналитика (2-3 дня). Определяем состав корзины, стратегию ребалансинга, oracle-инфраструктуру. Анализируем ликвидность каждого компонента — если токен торгуется только на одном DEX с $500k liquidity, он не подходит для on-chain индекса.
Проектирование (3-5 дней). Storage layout, интерфейсы модулей, governance схема для изменения состава.
Разработка (1-2 недели). Контракты + fork-тесты с реальными oracle данными. Симуляция ребалансинга на исторических данных.
Аудит и деплой. Акцент на NAV manipulation vectors и reentrancy в mint/redeem. Деплой с cap на TVL первые 30 дней.
Ориентиры по срокам
Базовый индекс с proportional mint/redeem и Chainlink oracle — 1-2 недели. Полная система с yield-bearing компонентами, арбитражным ребалансингом и governance — 4-6 недель.
Стоимость рассчитывается после анализа состава корзины и требований к oracle-инфраструктуре.







