DeFi
January 15

Вводный курс DeFi для всех. Занятие №01. Пулы. Часть II. Обмены в AMMs

DeFi-2026

Обмен токенов

В Uniswap V3 курс между token0 и token1 определяется как цена. Пул Uniswap V3 состоит из множества "маленьких" swap-пулов, каждый из которых соответствует отдельному тику. Каждый такой "маленький" пул ведёт себя как Uniswap V2 с постоянным произведением резервов, но с важным отличием - запасы токенов в конкретном тике ограничены. У каждого тика есть максимальная и минимальная цена обмена, а также ограниченное количество token0 и token1.

Когда запасы token0 и token1 в тике полностью исчерпаны, ликвидность этого тика падает до нуля.

График этой функции представляет собой гиперболу, однако, в отличие от Uniswap V2, ликвидность пула может закончиться (когда доходим до оси абсцисс или ординат).

График: P_a и P_b - нижняя и верхняя границы ценового диапазона для данного тика

Если резервы токенов в текущем тике закончились, а обмен еще не завершён (не достигнуто желаемое количество токенов или цена), Uniswap V3 переходит к следующему активному тику и выполняет следующий "прыжок" (hop), продолжая своп. Этот процесс повторяется до тех пор, пока не будет получено нужное количество токенов или не будет достигнута целевая цена обмена.

Схема обмена

Начальное состояние пула: текущая цена (тик) определяет, где начинается своп (зелёный цвет - см. ниже). Пользователь передаёт token0 (синий) и получает token1 (жёлтый).

Если объём свопа невелик (первый ряд) и цена не выходит за пределы P_a или P_b (нижней и верхней границы текущего тика), то обмен происходит по формуле постоянного произведения.

Если же объем свопа превышает текущий тик:

  • При обмене token0token1 (движение вправо на схеме) резервы token1 (желтый) в текущем тике полностью исчерпываются, оставляя только token0 (синий).
  • Затем текущий тик переходит на следующий тик, где есть резервы token1 (тик "i+n" на схеме).
  • Своп продолжается до тех пор, пока не будет достигнут нужный объём токенов или цена.

В результате все тики слева от текущего тика содержат только token0, а тики справа - только token1.

Данные для сопоставления

tickSpacing определяет "шаг" между тиками, в которых допускается наличие ликвидности. Например, если tickSpacing установлен на 60, то ликвидность может существовать только в тиках 0, 60, -60, 120, -120 и так далее.

tickSpacing даёт создателям пулов возможность выбора: они могут сделать шаг между тиками меньше, получив более "плотный" пул (более детализированные ценовые шаги, но более дорогие кросс-тик свопы, так как своп проходит через большее количество тиков), или сделать пул более "разрежённым", где ценовые шаги будут крупнее (меньше пересечений тиков - меньше затрат на газ, но и меньшая точность для поставщиков ликвидности).

Напомню ещё раз, что тики - это единицы измерения, которые используются для определения конкретных ценовых диапазонов.

Тиковый интервал (tick-spacing) - это расстояние между двумя тиками, определяемое уровнем комиссии.

Не каждый тик может быть инициализирован (являться начальным). Вместо этого каждый пул инициализируется тиковым интервалом, который определяет расстояние между тиками.

Тиковый интервал также важен для определения того, где можно разместить или удалить ликвидность. Если есть инициализированный тик в 202910, то ликвидность может измениться максимум до первого значения, определяемого тиковым интервалом, который составляет 202910 + 10 для пула 5 с 5 базисными пунктами б.п.

На рисунке ниже показана часть распределения ликвидности для пула WETH-USDC с 5 б.п. Пунктирные черные линии указывают на возможные инициализированные тики (которые происходят каждый раз с минимальным интервалом в 10 тиков для пулов в 5 б.п.). Сплошная чёрная линия указывает на текущий тик пула.

Также обратите внимание, что ликвидность постоянна между двумя пунктирными линиями, потому, что ликвидность может измениться только при пересечении тикового интервала. Между этими тиками ликвидность в диапазоне рассматривается как кривая x*y=k, как в Uniswap v2.

Подробнее о математике Uniswap v3

В Uniswap V3 "позиция" представляет собой объект, принадлежащий пользователю, содержащий определённое количество ликвидности и диапазон тиков (от tickLower до tickUpper).

Как работают свопы в Uniswap V3?

Обмен токенами в Uniswap V3 - процесс, управляемый моделью концентрированной ликвидности, которая работает в заранее определенных ценовых диапазонах, определяемых тиками.

Вот как пошагово работает процесс обмена:

Данные по обмену

Шаги:

  1. Проверка ввода или вывода. Когда пользователь инициирует своп, он указывает либо количество токенов, которое он хочет ввести (например, токен A), либо количество токенов, которое он хочет получить (например, токен B). Затем пул начинает процесс с проверки текущего тикового диапазона, который определяется ближайшими нижним и верхним тиками, окружающими текущую цену.
  2. Проверка ликвидности в текущем тиковом диапазоне. Протокол проверяет, достаточно ли ликвидности в текущем тиковом диапазоне для обработки свопа. Если ликвидность достаточна, своп начинает выполняться в текущем тиковом диапазоне.
  3. Переход на следующий тик, если ликвидность в текущем тиковом диапазоне недостаточна для завершения свопа:
  • Протокол перемещается в следующий тиковый диапазон, либо влево, либо вправо, в зависимости от направления обмена:
    • При обмене Токена A на Токен B: цена перемещается влево (уменьшается), так как p=y/x, то есть Токен A становится дешевле.
    • Если поменять Токен B на Токен A: цена движется вправо (растет), потому что Токен B становится дешевле.
  • Процесс продолжается до тех пор, пока не будет найдено достаточно ликвидности в нескольких тиковых диапазонах для завершения свопа.

4. Выполнение свопа. После обнаружения достаточного количества ликвидности в одном или нескольких тиковых диапазонах своп выполняется. Окончательная сумма вывода или ввода рассчитывается на основе имеющейся концентрированной ликвидности и кривой цен в тиковых диапазонах.

Проскальзывание

Проскальзывание цен (price slippage) происходит, когда рыночная цена смещается во время свопа из-за размера сделки по отношению к доступной ликвидности.

Проскальзывание рассчитывают в процентах от номинальной стоимости сделки. Проскальзывание может быть как положительным, так и отрицательным. Если итоговая цена заявки на покупку выше, чем ожидалось, возникает отрицательное проскальзывание.

Как считать?

Проскальзывание (%) = (Исполненная цена - Ожидаемая цена) / Ожидаемая цена) * 100

Например, текущая цена актива составляет $100. Пользователь хочет продать 20 токенов и рассчитывает получить за них $2000. Однако до исполнения ордера цена актива снижается до $98. Это приводит к потере $2 за каждый из 20 токенов. Значение проскальзывания в данном случае составляет 2% и означает убыток для трейдера в размере $40.

Причины проскальзывания:

  • Низкая ликвидность = высокое проскальзывание. Крупные (относительно ликвидности) сделки приводят к большим колебаниям цены, что означает получение меньшего количества токенов. Используйте пулы с большей ликвидностью или разделяйте свою сделку на несколько.
  • Высокая волатильность. Используйте отложенные ордера, агрегаторы или время наименьшей волатильности.

Почему проскальзывание влияет на результаты?

Потому что цена постоянно движется, поскольку ликвидность расходуется в каждом тиковом диапазоне. Если своп потребляет слишком много ликвидности, цена значительно отклоняется от начальной, что приводит к худшему курсу и меньшему количеству полученных токенов по сравнению с начальной ценой.

Поставка ликвидности

В узком диапазоне с двумя токенами:

  • Текущая цена (Pc): Около 2656 USDC за ETH
  • Диапазон цен:
    • Низкая (Pa): 2651,8386 USDC за ETH
    • Высокая (Pb): 2657,1473 USDC за ETH
  • Суммы депозитов:
    • 1 ETH ($2,656.24)
    • 12971,4 USDC ($12,971.40)
  • Диапазон цен относительно узкий (около 5 USDC).
  • Предоставлено значительное количество как ETH, так и USDC.
Данные пула

В этом сценарии:

  • ETH (токен X) распределяется от текущей цены (P_c) до более высокой границы цены (P_b), охватывая правую часть спектра.
  • USDC (токен Y) распределяется от текущей цены (P_c) вниз до нижнего ценового предела (P_a), охватывая левую сторону.
  • Узкий диапазон концентрирует ликвидность, что потенциально ведет к увеличению комиссии для поставщика ликвидности.

В более широком диапазоне с двумя токенами:

Данные второго пула

Данные:

  • Текущая цена (Pc): Около 2656 USDC за ETH
  • Диапазон цен:
    • Низкая (Pa) : 2651.8386 USDC за ETH
    • Высокая (Pb) : 2659.8057 USDC за ETH
  • Суммы депозитов:
    • 1 ETH ($2,656.24)
    • 3290.98 USDC ($3,290.98)
  • Ценовой диапазон шире (примерно на 8 USDC).
  • Предоставляется такое же количество ETH (1 ETH).
  • Требуется значительно меньше USDC (3290,98 против 12971,4).

Мы предоставляем то же количество ETH для более широкого диапазона, чем раньше, который распределяется на большее количество ценовых тиков. Требуется меньше USDC, потому что ликвидность на тик ниже из-за более широкого диапазона.

Одностороннее предоставление ликвидности

Uniswap V3 позволяет пользователям предоставлять ликвидность с помощью только одного токена в определенном ценовом диапазоне.

Предоставление только ETH (правая сторона текущей цены):

Данные пула

Данные:

  • Текущая цена: Около 2660 USDC за ETH
  • Низкая (Pa): 2662,4667 USDC за ETH
  • Высокая (Pb): 2670,4657 USDC за ETH
  • Ценовой диапазон установлен выше текущей рыночной цены. Для пополнения счета запрашивается только ETH (токен X).
  • Предоставление только USDC (левая сторона текущей цены)
Данные пула

Данные:

  • Текущая цена: Около 2660 USDC за ETH
  • Низкая (Pa): 2649,1882 USDC за ETH
  • Высокая (Pb): 2657.1473 USDC за ETH
  • Ценовой диапазон установлен ниже текущей рыночной цены. Для пополнения счета запрашивается только USDC (токен Y).
  • Когда больше людей покупают ETH, цена растет (движется вправо).
  • Всегда токен X (ETH) справа от текущей цены
  • Всегда токен Y (USDC) слева от текущей цены

Разрыв в ликвидности

В Uniswap V3 ликвидность не всегда непрерывна. Могут существовать разрывы между тиковыми диапазонами, особенно в пулах с волатильными активами или низким уровнем участия.

Протокол обрабатывает свопы, последовательно перемещая цену по тикам, но пустые тики не блокируют своп. Вместо этого протокол «перепрыгивает» через них (обновляя цену по пути), пока не найдет следующий диапазон с ликвидностью - если пользователь допускает проскальзывание.

Толерантность к проскальзыванию (Slippage Tolerance). Когда инициируете своп, вы задаете допуск на проскальзывание (например, 1%, 5%, 10%). Это определяет, насколько далеко может продвинуться цена, прежде чем сделка завершится неудачей. Если ликвидность существует где-либо в пределах этого диапазона проскальзывания - даже если между ними есть пустые тики - своп будет успешным.

Пример:

  • Обмен ETH на USDC в условиях дефицита ликвидности
  • Пул: ETH/USDC (уровень комиссии 0,30%)
  • Текущая цена: 1 ETH = 2 000 USDC (тик -76013).
  • Интервал между тиками: 60 (каждый тик ≈ 0,30 % движения цены).
  • Действия пользователя: Обменять 100 ETH на USDC с допустимым проскальзыванием 10% (принимаются цены до 1,800 USDC/ETH).
  • Распределение ликвидности:
    • Диапазон 1: от -76020 до -76013 (2,000-2,060 USDC/ETH)
    • Своп начинается с 2 000 USDC/ETH.
    • 50 ETH обмениваются по средней цене ~1,940 USDC/ETH.
    • Получено USDC: 50 ETH × 1,940 = 97,000 USDC.
    • Оставшиеся ETH для обмена: 100 ETH - 50 ETH = 50 ETH.

Диапазон 2: Тики от -76080 до -76020 (1,940-2,000 USDC/ETH) → Можно опустошить (гэп). Преодоление разрыва (пустые тики): Цена движется от 1 940 USDC/ETH → 1 880 USDC/ETH. Здесь не используется ликвидность, но цена обновляется, отражая проскальзывание. Это разрешено, поскольку пользователь установил 10-процентный допуск (до 1 800 USDC/ETH).

Диапазон 3: от -76140 до -76080 (1,880-1,940 USDC/ETH). Своп возобновляется на уровне 1 880 USDC/ETH. По этой цене обменивается 50 ETH. Получено USDC: 50 ETH × 1,880 = 94,000 USDC. Всего получено USDC: 97,000 + 94,000 = 191,000 USDC. Эффективная цена: 191 000 USDC / 100 ETH = 1,910 USDC/ETH (проскальзывание 4,5%). Если допуск на проскальзывание 1% (максимальное падение цены до 1 980 USDC/ETH). Своп расходует 50 ETH в диапазоне 1, перемещая цену до 1 940 USDC/ETH. Чтобы продолжить работу, цена должна упасть до 1 880 USDC/ETH, что превышает допустимый уровень в 1%.

Используйте такие инструменты, как Uniswap's Pool Explorer, чтобы увидеть, где сосредоточена ликвидность. Избегайте свопов в пулах с фрагментированной ликвидностью. Если другие LP оставляют пробелы, вы можете извлечь выгоду, заполнив их, чтобы заработать больше комиссионных.

Факторы, определяющие размер дохода LP

1. Уровни комиссий (выбираемые LP при создании пула):

  • 0.05%: Для стабильных активов с минимальными колебаниями цен (например, USDC/DAI).
  • 0.30%: Уровень по умолчанию для большинства пар (например, USDC/ETH).
  • 1.00%: Для волатильных или экзотических активов (например, ETH/MEME).

2. Объём ликвидности, предоставленной в текущем диапазоне. Чем больше ваш вклад в ликвидность в активном диапазоне, тем больше комиссионных вы заработаете.

Пример:

  • Общая ликвидность в пуле: 1 000 USDC
  • Вклад LP: 250 USDC (25 %)
  • Общая комиссия от свопа: 10 USDC
  • Заработок LP: 2,5 USDC (25% от 10 USDC)

Короткие ответы.

Как часто используется ваша ликвидность? Комиссионные начисляются только тогда, когда свопы происходят в выбранном вами ценовом диапазоне. Если в вашем диапазоне низкая торговая активность, ваши комиссионные будут минимальными. Чтобы получить максимальный доход, вы можете сконцентрировать ликвидность вокруг диапазонов с высоким объемом торгов.

Каков активный диапазон? Ликвидность считается активной только тогда, когда рыночная цена находится в пределах определенного вами ценового диапазона.

В каком токене вы зарабатываете комиссионные?

В V2 комиссии автоматически добавлялись в качестве ликвидности. В V3 комиссии начисляются отдельно и должны быть востребованы вручную.

Заработанные комиссии в V3 не считаются частью предоставленной вами ликвидности, даже если комиссии находятся в указанном вами диапазоне, они не считаются частью предоставленной вами ликвидности и не могут быть использованы трейдерами автоматически.

Токен, в котором зарабатываете комиссионные, зависит от направления свопа:

  • Если трейдер обменивает ETH на DAI, вы будете получать комиссионные в ETH (если вы предоставили DAI в текущем диапазоне).
  • Если трейдер обменивает DAI на ETH, вы получаете комиссионные в DAI (если вы предоставили ETH в текущем диапазоне).

По сути, вы получаете комиссионные в токене, который меняет трейдер, поскольку этот токен добавляется к ликвидности пула.

Удаление ликвидности

Рассмотрим предоставление ликвидности и результирующие токены при удалении ликвидности в определенных ценовых точках.

Предоставление ликвидности в пуле ETH/USDC (уровень комиссии 0,30%). Ниже в примерах не учтены комиссии, зависящие от времени нахождения ликвидности в пуле и объемов торгов:

  • Начальная цена (Pc): 2000 USDC/ETH
  • Верхняя цена (Pb): 2500 USDC/ETH
  • Нижняя цена (Pa) : 1500 USDC/ETH
  • X = 2 ETH и Y = 5073,53 USDC

Подсчитаем, сколько ликвидности (L) мы обеспечили:

Формула

Шаг 1: Вычисляем квадратные корни из цен: √Pc=√2000=44,72; √Pb=√2500=50; √Pa=√1500=38,73.

Подставляем значения в формулу:

Формула

Теперь рассчитаем токены при движении текущей цены с помощью свопов и сколько токенов можно вывести при различных сценариях.

Сценарий 1: Цена выше или равна верхнему диапазону

2 500 USDC/ETH (P_c ≥ P_b). Рассчитаем, сколько токенов получим, если снять 100 % ликвидности.

Шаг 1: Рассчитать ETH (x′):

Формула

По верхней цене все ETH в позиции конвертируются в USDC.

Шаг 2: Рассчитать USDC (y′):

Формула

Сценарий 2: Цена ниже или равна нижнему диапазону

1500 USDC/ETH до снятия ликвидности (P_c ≤ P_a). Посчитаем, сколько токенов получим, если снять 100% ликвидности.

Формула

При более низкой цене все USDC в позиции конвертируются в ETH.

Непостоянная потеря (Impermanent Loss)

Непостоянные потери происходят, когда стоимость ваших активов в пуле ликвидности становится меньше, чем если бы вы просто держали эти активы в своем кошельке. Это происходит из-за изменения цен и автоматической ребалансировки пула.

Сценарий 1: Цена движется к верхней границе (2500 USDC/ETH)

Данные:

  • Начальная стоимость позиции: 2 ETH + 5073,53 USDC = общая стоимость
  • Цена на верхней границе: Все конвертируется в 9545.69 USDC
  • Если держать отдельно: 2 ETH * 2500 + 5073.53 USDC = 10,073.53 USDC
  • Непостоянный убыток = 10 073,53-9 545,69 = 527,84 USDC (5,24% убытка)

Сценарий 2: Цена движется к нижней границе (1500 USDC/ETH)

Данные:

  • Начальная стоимость позиции: 2 ETH + 5073,53 USDC = общая стоимость
  • Цена на нижней границе: 4.93 ETH + 0 USDC
  • Если держать отдельно: 2 ETH * 1500 + 5073.53 USDC = 8,073.53 USDC
  • Непостоянный убыток = 8 073,53 - (4,93 * 1500) = 8 073,53-7 395 = 678,53 USDC (8,40% убытка)

Расчёты не включают торговые сборы.

Хотя комиссии могут помочь, вы все равно будете нести эти виртуальные убытки (если вы их не зафиксируете - выйдите из позиции), когда цены уйдут далеко от первоначального диапазона.

[Продолжение следует...]