Разработка автоматического менеджера LP-позиций (Uniswap v3)
Uniswap v3 сделал провайдеров ликвидности значительно эффективнее по капиталу — и значительно более требовательными к активному управлению. Позиция в диапазоне $1800-$2200 за ETH приносит комиссии только пока цена ETH внутри этого диапазона. Как только цена уходит за границу — позиция перестаёт зарабатывать и превращается в держание одного из двух токенов. Без автоматического ребалансировщика большинство LP-позиций в v3 работают неэффективно.
Механика концентрированной ликвидности
Как считается fee в v3
В Uniswap v3 ликвидность добавляется в конкретный диапазон тиков. Tick — дискретная единица цены, каждый тик = изменение цены на ~0.01%. Диапазон [tickLower, tickUpper] определяет, при каких ценах позиция активна.
Накопленные комиссии хранятся через глобальные переменные feeGrowthGlobal0X128 и feeGrowthGlobal1X128. Для конкретной позиции — разница между текущими значениями и снапшотом в момент создания позиции, скорректированная на тики вне диапазона. Это O(1) расчёт — нет итерации по всем позициям.
Сбор комиссий: NonfungiblePositionManager.collect() переводит накопленные fee0 и fee1 на адрес владельца. Вызов collect без закрытия позиции — нормальная операция, обычно выгодна при накопленных комиссиях > gas cost.
Impermanent loss в v3
В v2 impermanent loss функция от соотношения цен. В v3 — функция от соотношения цен и от выбранного диапазона. Узкий диапазон даёт больше комиссий при нахождении в диапазоне, но экспоненциально растущий IL при выходе из него. Широкий диапазон — меньше комиссий, меньше IL.
Оптимальная ширина диапазона зависит от волатильности конкретной пары. Для пары USDC/USDT на тике 1 — диапазон в несколько тиков. Для ETH/USDC с дневной волатильностью 3-5% — нужен диапазон ±20-30% от текущей цены чтобы не ребалансировать слишком часто.
Архитектура автоматического менеджера
Стратегия ребалансировки
Есть несколько подходов:
Fixed-width rebalance — самое простое. При выходе цены из диапазона создать новую позицию вокруг текущей цены с той же шириной. Проблема: частый ребаланс при боковом движении вблизи границы — каждый ребаланс стоит газ и платит slippage при свопе для выравнивания соотношения.
Bollinger Bands — динамическая ширина диапазона на основе 20-дневного стандартного отклонения цены. При высокой волатильности — широкий диапазон, при низкой — узкий. Реализуется off-chain: keeper-бот рассчитывает оптимальный диапазон по историческим данным и вызывает ребаланс только когда текущий диапазон значительно хуже оптимального.
Asymmetric ranges — если есть view на направление рынка, можно делать несимметричный диапазон. Bullish — больше диапазона вверх. Но это уже активная торговая стратегия, не просто менеджмент ликвидности.
On-chain компоненты
Смарт-контракт менеджера реализует:
interface ILPManager {
// Создание позиции
function mint(
address token0, address token1, uint24 fee,
int24 tickLower, int24 tickUpper,
uint256 amount0Desired, uint256 amount1Desired
) external returns (uint256 tokenId);
// Сбор комиссий
function collectFees(uint256 tokenId) external returns (uint256 amount0, uint256 amount1);
// Ребалансировка
function rebalance(
uint256 tokenId,
int24 newTickLower, int24 newTickUpper,
uint256 swapAmountIn, bytes calldata swapData
) external;
}
swapData в rebalance() — calldata для свопа через Uniswap v3 Router или 1inch для выравнивания соотношения токенов перед созданием новой позиции. Конкретный маршрут рассчитывается off-chain и передаётся в транзакцию.
ERC-721 ownership: NFT позиции Uniswap v3 могут находиться либо у пользователя напрямую, либо у контракта менеджера. Если у менеджера — нужна система учёта «кто владеет чем». Если у пользователя — нужен approve на менеджер для управления. Второй подход проще аудируется.
Off-chain keeper
TypeScript-бот мониторит позиции каждые N блоков:
- Получить текущую цену через
slot0()пула - Для каждой managed позиции — проверить находится ли цена в диапазоне
- Если вне диапазона — рассчитать новый оптимальный диапазон
- Рассчитать необходимый своп для выравнивания соотношения токенов
- Оценить cost/benefit: gas + IL на своп vs ожидаемые комиссии в новом диапазоне
- Если profitable — вызвать
rebalance()
Важно: сравнивать expectedAnnualizedFees - rebalanceCost > holdCost. Нет смысла ребалансировать позицию на $1000 если газ $50 и своп теряет ещё $30.
Сбор и реинвестирование комиссий
Автоматическое reinvesting — auto-compound: collect fees, добавить их обратно в позицию. Это увеличивает ликвидность и будущие комиссии. Но каждый compound — транзакция с газом. Оптимально compound при накопленных комиссиях > gas_cost * 10.
Протоколы типа Arrakis Finance и Gamma автоматизируют это поведение и берут % от комиссий как fee. При разработке собственного менеджера — нужно решить: брать management fee (% TVL ежегодно) или performance fee (% от комиссий)?
Ориентиры по срокам
Смарт-контракт менеджера с базовой стратегией ребалансировки — 1-2 недели. Keeper-бот + мониторинг + UI для управления позициями — добавляет 1-2 недели. Продвинутая стратегия с Bollinger Bands и symulation — от 4 недель.
Стоимость рассчитывается после обсуждения стратегии и требований.







