DeFi
January 14

Вводный курс DeFi для всех. Занятие №01. Пулы. Часть I. Виды AMM

DeFi-курс для всех

Авторство

Данный раздел создан совместно с админом канала https://t.me/web3news => TW4Ys.

Введение

Для начала уясним простую истину:

Существует два вида децентрализованных бирж (Decentralized EXchange - DEX) – на основе биржевого стакана (order book-based) и на основе пула ликвидности (liquidity pool-based).

Пулы ликвидности – это, по сути, резервы токенов в смарт-контрактах, и пользователи могут мгновенно обменивать токены, которые доступны в этих пулах.

Важно! Цена токена определяется алгоритмически.

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

Примерами DEX на основе пулов ликвидности являются Uniswap, Kyber Network, Bancor.

Uniswap – децентрализованный протокол обмена токенами, который позволяет осуществлять прямой обмен токенов (недаром его называют - AMM: автоматический маркет мейкер).

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

Например, используя торговую пару ETH-DAI с 100 ETH и 20 000 DAI в резервах ликвидности, пользователь, который хочет купить ETH за DAI, может отправить 2221,22 DAI в смарт-контракт Uniswap, чтобы получить 1 ETH взамен. После обмена в пуле ликвидности остается 99 ETH и 202 221,22 DAI.

Резервы пулов ликвидности предоставляются провайдерами ликвидности, которые делают это ради получения дохода в виде комиссии за каждый обмен токенов в Uniswap. Любой может быть провайдером ликвидности. Необходимо лишь предоставить пару токенов, по текущему обменному курсу Uniswap в соотношении 1:1 по стоимости.

Можете также изучить расширенное видео по пулам:

Пулы в DeFi

А также можете изучить инструкцию по Uniswap:

Uniswap

Механизмы AMM

AMM (Automatic Market Maker) – математическая функция для определения стоимости активов в пуле ликвидности. В настоящее время для различных стратегий ценообразования активов используется несколько формул AMM.

Маркетмейкер на основе постоянного значения произведения X*Y=K - CPMM (Constant Product Market Maker)

Такая формула была впервые популяризирована Uniswap и Bancor и стала самым популярным AMM на рынке.

Работа AMM состоит в непрерывном поддержании величины, которая называется постоянный продукт (Constant Product) и основывается на количестве ликвидности как одного, так и другого актива в пуле. Чтобы держать значение k неизменным, АММ при увеличении x уменьшает y, и наоборот.

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

Ликвидность * Ликвидность = Постоянный продукт

Примерно это выглядит так:

  • ETH (x) * DAI (y) = (k)
  • 100 * 200,000 = 20,000,000

Используя AMM, в любой момент времени постоянный продукт (k) всегда должен оставаться на уровне 20 000 000. Если кто-то покупает ETH с использованием DAI, ETH в пуле ликвидности будет становиться меньше, а DAI – больше.

Чем больше ордер, тем большая начисляется премия - дополнительная сумма DAI, необходимая для покупки 1 ETH, по сравнению с первоначальной ценой в 2000 DAI за ETH. В приведённой ниже таблице подробно описывается асимптотическое ценообразование и движение ликвидности при выполнении ордеров на покупку ETH.

Чем больше сумма ETH, которую пользователь хочет купить, тем больше будет взиматься премия. Это гарантирует, что пул ликвидности никогда не останется без ликвидности.

См. пример по таблице:

Таблица данных: Источник: Визуализация математики Uniswap v2

Ещё раз: в Uniswap (V2) ликвидность измеряется как произведение резервов x*y=k.

Могут быть разные комбинации резервов, но ликвидность остаётся прежней. Например, если есть 1 ETH и 1000 USDC, то ликвидность составляет 1 ETH × 1000 USDC = 1000. Если бы было 900 USDC и 1,1111 ETH, ликвидность оставалась бы на уровне 1000, поскольку 900 × 1,1111 = 1000.

Следующая анимация отображает увеличение ликвидности, при этом кривая отдаляется от начала координат. Чем больше резервов, тем дальше кривая отстоит от начала координат и тем выше ликвидность:

Анимация по AMM

Цена токена0 в Uniswap V2 рассчитывается по следующей формуле:

Цена0=резерв (токен1)/резерв (токен0)

Ниже показана обычная кривая цен. Зелёная точка на кривой представляет собой текущие запасы токена0 и токена1. По мере того как зеленая точка движется вверх и влево, цена токена0 растет, поскольку это соответствует уменьшению запасов токена0: Это соответствует закону спроса и предложения, так как чем более дефицитным является токен0, тем выше его цена:

Анимация по токенам

Любая сделка на AMM изменяет цену. Такое изменение цены называется ценовым влиянием.Чем выше ликвидность, тем меньше влияние на цену.

Примеры одной и той же сделки (покупка 1 USDC с использованием USDT) в пулах с растущим уровнем ликвидности.

Пример 1: х*у = 100

  • Предположим, что пул содержит 10 USDC (token0) и 10 USDT (token1). Поскольку xy=k, k=100$. Следовательно, ликвидность равна 100.
  • Если трейдер хочет получить 1 USDC, он должен уменьшить резерв USDC с 10 USDC до 9 USDC.
  • Затем он должны внести достаточно USDT, чтобы 9 * new_reserve_usdt = 100 (игнорируя комиссии). New_reserve_usdt будет равен 100/9 =11,11 USDT.
  • Поскольку первоначальный резерв USDT был 10, трейдер должен внести 1,11 USDT, чтобы получить 1 USDC.
  • Если мы посмотрим на цену USDC после торговли, то получим:

ЦенаUSDC=резерв (токен1)/резерв (токен0)=> 11,11/9 => 1,234 USDT

В результате покупки 1 USDC цена USDC выросла с 1 USDT до 1,234 USDT.

  • Начальная цена 1 USDT: 1 USDC .
  • Конечная цена 1,234 USDT : 1 USDC.
  • Влияние на цену составляет 0,234, или увеличение на 23,4% от первоначальной цены.

Концентрированная ликвидность

Сравнение версий Uniswap на графике цена-ликвидность.

Сравнение

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

Кривая цен

Несмотря на то, что кривые кажутся прерывистыми, цена (представленная оранжевым лучом) может плавно переходить между каждой "мини-кривой Uniswap V2". Каждая из "под-кривых" имеет вид xy=k, но с разными k. По мере увеличения ликвидности k для этого сегмента увеличивается его расстояние от начала координат.

Например, в пуле ETH/USDC, если цена ETH составляет 2000 USDC, поставщик ликвидности может выбрать размещение своей ликвидности между 1800 и 2200 USDC, чтобы получить больше комиссий в ценовом диапазоне, в котором, как он ожидает, будут торговаться активы. На иллюстрации ниже сегмент между 1800 и 2200 USDC имеет большую ликвидность по сравнению с другими сегментами.

Сегменты

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

Цена 1:1, которую ожидаем для пары стейблкоинов, соответствует 45-градусному лучу, где соотношение резервов равно 1. Следовательно, ликвидность в конечном итоге концентрируется вокруг центральной области, где соотношение резервов составляет 1 к 1.

В пуле USDC/USDT ниже мы видим высокую ликвидность около цены 1.000:

Ликвидность

На практике LP указывают ликвидность, а затем Uniswap V3 вычисляет количество Х и Y которое нужно предоставить. Для поддержки концентрированной ликвидности протокол Uniswap V3 должен моделировать изменение ликвидности вдоль ценовой кривой.

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

Чтобы значительно сократить количество проверок изменения ликвидности, в Uniswap V3 ликвидность можно корректировать только по предопределённым ценам.

Эти предопределенные ценовые точки называются тиками.

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

В Uniswap V3 тиков гораздо больше, чем изображено ниже. Кривая цены "разрезана" тиками (красными лучами от начала координат).

Цена и тики

В то время как цена актива X может меняться и принимать любое значение, тики остаются фиксированными. Несмотря на то, что кривые не "касаются друг друга", цена всё равно может плавно перемещаться между под-кривыми.

Uniswap v.3

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

Возможно, что некоторые значения k для разных сегментов могут быть одинаковыми. Также может быть, что некоторые значения k равны нулю, если в этом ценовом диапазоне не было размещено ликвидности, поскольку Uniswap V3 вознаграждает комиссией за обмен только если ликвидность фактически используется.

На записи экрана ниже видим пользовательский интерфейс Uniswap V3 LP для пула ETH/USDC.

Серая вертикальная линия - это текущая цена, а две синие линии - это нижняя и верхняя предопределенные цены, где протокол позволяет LP добавлять ликвидность. Обратите внимание, что синие линии не могут быть установлены в произвольных местах, а только по предопределенным ценам:

ETH/USD

Тики - это предопределённые цены, которые рассчитываются по формуле:

p(i)=1.0001^i

где i - целое число, называемое индексом тика или просто тиком , а p(i) - "ценой тика". Допустимые индексы тика находятся в диапазоне от -887 272 до 887 272.

Примеры тиков:

  • Индекс тика 0 определяет цену 1:1, поскольку p(0) = 1,00010=1.
  • Индекс тика 1 определяет цену 1:1,0001, поскольку p(1)=1,00011 = 1,0001.

Важно! Если тиковый индекс отрицательный, это соответствует цене меньше 1. Если индекс равен нулю, то цена равна 1 (активы имеют одинаковую стоимость). Если индекс больше или равен 1, то цена будет больше единицы:

См. выше

Цена токена - его текущая цена: это точка на ценовой кривой, которая меняется во время свопов. По мере изменения цены она движется вдоль кривой и пересекает тики.

Иногда цена токена будет точно соответствовать цене данного тика, но часто цена токена не будет соответствовать ни одному из тиков. Только в местах тиков можно регулировать ликвидность. Каждый тик представляет собой ценовое движение на 0,01% (1 базисный пункт б.п. ) относительно каждого из соседних тиков.

Использование базисных пунктов выражает относительную разницу в ценах. Соотношение между тиковым интервалом и комиссией в процентах и базовых пунктах.

Таблица данных

Пример 1: Для тиков 100000 и 100001 у нас есть следующие цены:

  • p(i)=1.0001^100000=22015,45604852
  • p(i)=1.0001^100001=22017,65759413

(первые четыре цифры выделены для ясности). Мы видим, что разница составляет 2,201545604 (приблизительно 1 б.п. или 0,01% от 22015) для токена стоимостью приблизительно 22015 токенов Y.

Пример 2:

  • p(i)=1.0001^10=1,00100045
  • p(i)=1.0001^11=1,00110055

Теперь разница составляет 0,00010010 (0,0001 или приблизительно 1 базисный пункт) для токена стоимостью приблизительно 1 токен Y.

Тиковый диапазон (Tick Range)

Когда мы пишем (p _a, p _b), предполагая, что p _a и p _b - тики, мы имеем в виду ценовой диапазон между p _a и p _b, исключая границы. В этом контексте, p _a называется нижним тиком, а p _b - верхним.

Примечание: _a - соответствует индексному обозначению. Ниже делаю врезку не форматированного текста (см. выше абзац) для пояснения:
Данные по тикам

Кривая цены ​​в виде линии

Распространённым представлением ценовой кривой является линия. Ценовая кривая строится на осях x и y, в то время как на числовой прямой каждая точка представляет собой цену. На кривой растущая цена (токена X) движется вверх и влево, тогда как на линии она увеличивается слева направо:

Визуализация

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

Данные см. выше

Уровень ликвидности можно отобразить на соответствующем линейном графике следующим образом:

См. данные

Посмотрите как эти два представления показывают одну и ту же информацию. Обратите внимание, как красный луч на декартовом графике отслеживает красную точку на линейном графике:

Визуализация по v. 3

Текущий тик

Uniswap V3 отслеживает "активный тик" или "текущий тик" или иногда просто "тик". "Текущий тик" - это текущая цена, округлённая до ближайшего тика . Если цена увеличивается и становится равной или пересекает тик, то тик, который только что пересекся, становится текущим тиком. Если цена снижается и пересекает тик, то тик ниже становится новым текущим тиком.

Обратите внимание как тики (серые) становятся текущим тиком (зеленым), когда цена пересекает тик:

См. визуализацию

Переменная slot0 содержит текущий тик. Протокол сохраняет текущий тик в структуре с именем slot0. Эта переменная является публичной, поэтому любой может прочитать текущий тик пула непосредственно на Etherscan.

Пример для пула ETH/DAI на Base:

  1. Заходим на страницу контракта;
  2. Выбираем вкладку "Contract";
  3. Выбираем вкладку "Read Contract".
Данные смарт-контракта

Листаем вниз и открываем переменную 11:

См. данные по смарту дальше

Текущий тик - 76249. Пул - ETH/DAI, поэтому цена выражается как Ether в DAI. Оба токена имеют 18 знаков после запятой. Расчёт цены на тике 76249 дает цену p(76249) = 1,000176249 (ок. 2047,79 DAI). Текущий тик - это текущая цена, округленная до ближайшего тика.

Влияние десятичных дробей на цену

Пример 2 для пула ETH/USDC на Base:

Данные по смарту

Тик теперь отрицательный со значением -199971, и цена может быть рассчитана как p(-199971)=1,0001^-199971 (ок. 2,069*10^-9).

Тик здесь отрицательный из-за разницы в десятичных знаках, так как ETH имеет 18 десятичных знаков, а USDC - только 6 десятичных знаков. Если предположить, что ETH стоит $1000, то наименьшая единица ETH будет стоить 1000/1018 (или 1/1015), в то время как наименьшая единица USDC стоит 1/106. Таким образом, хотя 1 ETH "стоит" больше, чем 1 USDC, 1 наименьшая единица USDC стоит больше, чем 1 наименьшая единица ETH.

Чтобы учесть разницу в десятичных знаках (18 для ETH против 6 для USDC), нам нужно умножить цену на 10^18-6=10^12. Таким образом, цена пула становится (2,069*10^-9)*(10^12)≈2069 что примерно соответствует стоимости пула ETH:DAI.

Несмотря на то, что кривая ликвидности прерывистая, трейдер всё равно может беспрепятственно торговать между тиками. После пересечения тика Uniswap V3 пересчитывает объём ликвидности, доступный для оставшейся части торговли.

Когда цена пересекла тик, резервы внезапно подскочили, потому что своп попал в область, где ликвидность выше, и, следовательно, резервы выше. Этот скачок резервов отражает возросший объём резервов, которые LP вложили в этот ценовой диапазон.

Данные визуализации

Итак, Uniswap V3 обеспечивает ликвидность в ограниченном ценовом диапазоне, выраженном в тиках.

Если рыночная цена выходит за пределы ценового диапазона, ликвидность ведёт себя так, как будто она была удалена из пула, а это означает, что комиссии не могут быть получены от сделок за пределами указанного диапазона. Если рыночная цена возвращается в диапазон, ликвидность снова становится активной, и поставщикам ликвидности (LP) выплачиваются комиссии. На концах ценового диапазона только актив с более низкой ценой будет существовать в соотношении 100%:

Данные по торговой паре

NFT позиция ликвидности

Новое активное управление ликвидностью в Uniswap в3 теперь обеспечивает более высокую эффективность использования капитала для провайдеров ликвидности. Побочным результатом этого является то, что провайдеры ликвидности получают неизменяемые токены (NFT) вместо взаимозаменяемых токенов ERC-20, представляющих их позиции.

Этот NFT представляет собой ваше право собственности

на вашу ликвидную позицию.

Если вы решите продать за 1 ETH свой NFT, представляющий собой ликвидную позицию стоимостью 100 ETH, то новый владелец NFT сможет воспользоваться вашей ликвидностью. Uniswap v3 - это NFT, созданные на цепочке и полученные из свойств позиции ликвидности.

Вы можете просмотреть ваш Uniswap v3 NFT в любом NFT обозревателе, на NFT-маркетплейсе и/или в самом Uniswap. Изображение NFT показывает самую важную информацию о вашей позиции ликвидности:

NFT (Uniswap v. 3)

Описание:

  • В верхней части NFT увидите символы пары.
  • Прямо под ним - выбранный комиссий .
  • Сбоку перемещаются символы токенов и адрес пула.
  • В середине можете найти кривую ликвидности. Токены на Uniswap торгуются на кривой цены, а дизайн указывает на крутизну этой кривой, которая зависит от того, где поставщики ликвидности решают установить свои диапазоны. Форма кривой зависит от концентрации ликвидности, а также от соотношения, в котором изначально были депонированы токены.
  • Цветовая схема основана на двух базовых токенах, но распределение цветов уникально для каждого идентификатора токена, поэтому каждый из них уникален, но они тематичны для каждого пула.
  • Под кривой можете найти свой NFT-идентификатор, а также минимальный и максимальный диапазон цен в тиках, установленный поставщиком ликвидности.
  • Небольшой значок в правом нижнем углу показывает позицию LP на кривой, где поставщик ликвидности активен в пуле.
  • Иногда над этим маленьким значком кривой можно увидеть небольшую искру — редкий атрибут, вероятность появления которого невелика и уменьшается по мере увеличения идентификатора токена (~10% при идентификаторе 100, ~3% при идентификаторе 100 000).

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