DeFi
March 3

Вводный курс DeFi для всех. Работа с dAPPs через смарт-контракты. Uniswap. Часть II

DeFi: смарт-контракты

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

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

[ p_a, p_b], где p_a- нижняя, p_b - верхняя выставленная цена провайдером ликвидности.

В протоколе такая ограниченная по цене использования ликвидность называется позицией.

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

Ещё одно важное понятие протокола - тики.

Разработчики протокола разделили весь ценовой диапазон на тики (ticks). Каждый тик представляет собой ценовое движение относительно соседнего тика на 0.01% (базисный пункт).

Формула

Каждый диапазон цен может быть задан в виде пары тиков с целочисленными индексами любого знака:

Пояснение

Каждому тику соответствует какая-то цена одного токена пула в пересчете на другой токен пула. Провайдеры ликвидности, когда вносят свои токены в пул, должны сообщить протоколу именно тик lower и тик upper.

Сделаем важное уточнение: провайдер может указать пулу не любые тики. А те, чей индекс кратен tickSpacing. Протокол, когда создается контракты пулов, присваивает им значение tickSpacing и у каждого контракта пула есть публичная переменная tickSpacing. Посмотрим на нее у реального контракта пула, например, пары USDT/WETH. Он равен 60.

Значения tickSpacing разработчики описали в документации, и они зависят от размера комиссии в пуле.

docs.uniswap.org/contracts/v4/quickstart/create-pool#1-configure-the-pool

Например, если tickSpacing = 2, то мы можем передать при создании позиции в пуле тики с индексами [..., -4,-2,0,2,4,...].

Еще одно важное понятие в протоколе sqrtPriceX96. - корень из цены токенов, который хранится в протоколе особым образом - умноженный на 2 в степени 96.

Формула

Либо обратная формула для нахождения pi через значение sqrtPriceX96 будет такой:

Формула

В WhitePaper протокола версии 3 есть формула определения индекса тика по для конкретного значения цены. Скопируем её себе, она нам в будущем пригодится.

Формула

Из нее можно вывести, чему равняется цена, если мы знаем индекс тика.

Формула

Это основные понятия, термины и формулы, которые нам понадобятся в работе.

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

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

Чтобы получить их значения, нужно на контракте пула вызвать метод чтения slot0.

Сделаем это на контракте пары USDT/WETH с комиссией пула 0,3%.

Мы видим текущие значения:

Видео-пояснение

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

До!