April 26

Curve StableSwap введение

Всех приветствую! В этой стате я расскажу как работают пулы curve.fi, и почему это произвело революцию в мире defi.

Важно: под некоторыми графиками прикреплена ссылка на интерактивный график, если хотите лучше понять материал, обязательно подвигайте ползунки

Немного о Curve

Основная цель curve.fi - это предоставление возможности обмена стейблкоинов с низким проскальзыванием (далее подробнее разберем, что это такое).

Начнем по порядку разбираться, как устроены АММ алогоритмы.

Uniswap AMM

Каждый, кто хоть немного углублялся в defi встречал формулу .

x*y=k

Это упрощенное представление алгоритма, который лежит в основе Uniswap.

Это формула означает, что отношение активов (токенов) в пуле - это неизменное значение.

Пример:

Представим, что у нас есть пул USDT/ETH, и в пуле лежит 40000 USDT (это X) и 10 ETH (это Y), таким образом 40000*10=400’000 (это K).

Теперь к нам пришел условный Вася и хочет обменять свои 4000 USDT на ETH.

Давайте посчитаем как изменится количество токенов в пуле, используя нашу формулу.

После того как Вася внес 4000 USDT, в пуле стало 44000 USDT (там еще Uniswap забирает комиссию 0.3%, но мы опустим это).

Теперь на надо посчитать сколько ETH нужно отдать Васе.

Составим простое уравнение за средней школы:

44000 (наш Х) * y = 400000 (наш К)

Теперь нам надо найти сколько ETH должно быть в пуле, чтобы уравнение сошлось. Разделим обе части на 44000 (то есть X) и получим y=400000/44000. Таким образом y=9.09
Mы получили количество ETH, которое ДОЛЖНО БЫТЬ В ПУЛЕ. Теперь надо разницу отдать Васе. 10ETH - 9.09ETH = 0.91 ETH (куда делось 0.09 ETH???, читать продолжение…)

Автоматическая установка цены

Как мы могли заметить, когда Вася внес 4000 USDT, цена автоматически изменилась.

Теперь 1 ETH стоит Y/X, то есть 44000/9.09=4840 USDT.

Давайте рассмотрим, что произойдет, когда Вася захочет еще раз обменять 4000 USDT.

Произведем еще раз все вычисления:

(44000 + 4000) * y = 400000

Y = 8.33

Таким образом в пуле станет 48000 USDT, 8,33 ETH

И 1 ETH будет стоить 5762 USDT

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

извиняюсь за качество

Красный график показывает количество токенов в пуле

Синий график (производная от x*y) показывает цену токенов

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

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

В первом примере мы увидели, что изначально 1 ETH стоил 4000 USDT, но по факту Вася купил по цене 4395 USDT (4000/0.91)

От чего зависит проскальзывание?

Ответ: от ликвидности (количества токенов в пуле)

Разберемся почему:

Формула для расчета проскальзывания выглядит так:

Чтобы проще понять, как работает эта формула рассмотрим два случая

  1. Если мы захотим купить небольшое количество токенов, то δ (сколько мы купим) будет сильно меньше X (сколько в пуле) (δ << X, это для гиков выражение), и получился S = 1 - (очень близкое к 1 число), то есть проскальзываете будет стремиться к 0.
  2. Для пула, где очень много токенов X будет стремиться к бесконечности, таким образом проскальзывание тоже будет стремиться к 0.

Предположим у нас есть пул, где:

1'000'000 токенов X

5'000'000 токенов Y

K = 5 * 10^12

Рассмотрим два примера, как менялась цена (изначальная цена была 5 у.е):

Выкупаем один актив

Давайте посмотрим, что произойдет, если кто-то захочет полностью забрать один из активов в пуле.

В нашем воображаемом пуле будет

100 ETH

400'000 USDT

В нашем случае Вася будет покупать по 100 ETH на централизованной бирже и продавать в нашем пуле

Купив 100 ETH за 400000 USDT, он пришел в наш пул и продал 100 ETH

Теперь в пуле

200 ETH

200'000 USDT

Вася потратил 4000$

Если сделать так очень много раз и построить график, то получится вот такая зависимость

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

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

Чем плох Uniswap AMM?

Представим ситуацию, что у нас в пуле лежит не ETH/USDT, а пара стейблкоинов USDT/USDC

Опять рассмотрим пример, где Вася на одну и ту же сумму покупает один из активов.

У нас есть пул:

100'000 USDT

100'000 USDC

Из таблиц видно, что при маленьких суммах разница не очень большая, но когда Вася начинает менять по 10000 USDT, то на 3 сделке он теряет 500$ из-за проскальзывания, хотя меняет доллар на доллар.

Пул без проскальзывания (такое бывает ???)

Давайте представим пул, в котором цена активов будет постоянной, то есть я в любой момент смогу обменять 1000 USDT на 1000 USDC 1:1, звучит как решение для нашей проблемы с обменом стейблкоинов.

Но не так все просто и вот почему...

Если описывать такой пул, то это будет пул с линейной зависимостью (как на алгебре в 9 классе y=kx+b).

Например у нас есть пул, и в нем:

1000 USDC

1000 USDT

Выражение описывающее пул будет следующим:

X + Y = C

X - количество токена #1

Y - количество токена #2

C - сумма токенов

в нашем примере мы получим X + Y = 2000

Вот как это будет выглядеть, если мы построим график зависимости количества токенов в пуле.

Если к нам придет Вася и захочет внести пул 100 USDC, то путь вычислений будет следующий:

(1000+100) + y = 2000

y = 900

значит Васе надо отправить 1000 - 900 = 100 USDT,

Отлично! Вася только что обменял 100 USDT на 100 USDT, не потеряв ничего из-за проскальзывания, как это было в примере с юнисвапом

Но есть одна проблема

Если Вася продолжит менять USDT на USDT, то в пуле закончатся USDT, а это плохо

Что же делать?

Curve AMM

Curve решил это проблему, создав пул, который объединяет в себе прелести двух подходов, которые мы рассмотрели ранее.

Как же у них это получилось?

Основная задача состояла в том, чтобы создать пул, который будет иметь вид X+Y=C, когда цена будет находиться в районе 1$, и принимать вид X*Y=C, когда цена будет сильно отклоняться

На графике видно, что цена при сильном отклонении от 1$ начинает вести себя как в пуле x*y=c

Чтобы получить такую кривую, нам надо сложить выражение для пула x+y=c и x*y=c

Для этого давайте сначала запишем выражения для обоих пулов в общем виде:

Слева для пула с линейной зависимостью, справа для пула с постоянным произведением.

D - это суммарное количество токенов, при условии, что они имеют одинаковую цену

D = 10M USDT + 10M USDC = 20M (при условии, что USDT = USDC)

Давайте теперь посмотрим, как будет выглядеть наш график, если мы построим его для пула USDC/USDT.

В нашем воображаемом пуле будет:

1'500'000 USDC

1'500'000 USDT

Давайте теперь построим график нашего выражения.
Вот так он будет выглядеть:

https://www.desmos.com/calculator/ripcngywnj

На графике видно, что x+y+x*y несильно отличается от Uniswap AMM, чтобы исправить ситуацию нам нужно, сделать его более "плоским" в зоне, где я обвел черненьким.

Давайте умножим выражение для пула без проскальзывания на какое-то число (chi) и посмотри, что произойдет.

Вот так теперь выглядит наше уравнение (3).
Давайте построим график и поиграемся с ним.

https://www.desmos.com/calculator/8vn3ptit9m

Тут я увеличиваю значение chi, и чем больше оно становиться, тем более "плоский" становиться график.

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

Когда chi увеличивается: уменьшается проскальзывание и график становится похож на x+y (красный график)

Когда chi уменьшается: увеличивается проскальзывание и график становится похож на x*y (синий график)

Как выбрать параметры?

Как же нам понять как выбрать chi? Поскольку мы имеем дело с обменом стейблкоинами, нам нужно, чтобы цена возвращалась к 1, когда в пуле USDT = 15M, USDC = 15M, и вела себя как в Uniswap AMM, когда соотношение токенов в пуле не сбалансировано.

Чтобы добиться такого эффекта, chi должно зависеть от количества токенов х и y в пуле. При несбалансированном (USDT > USDC) количестве токенов в пуле, chi должно уменьшаться, чтобы график принимал вид x*y, а при сбалансированном (USDT = USDC) количестве увеличиваться, чтобы график принял вид x+y.

Также важно, чтобы суммарное количество токенов не влияло на наш параметр.

Давайте просто умножим наше выражения для графика x+y в этот раз уже на D:

Для вычисления chi выберем следующее выражение:

Давайте подставим все, что у нас есть в одно выражение:

А теперь построим график и поиграем со значениями.

https://www.desmos.com/calculator/opzbo93gss

Мы можем заметить, что при изменении параметра А, график становиться плоским

Значение этого параметра определяет Curve DAO, а нам самим его можно посмотреть перейдя в пул на Curve.fi и открыв вкладку "Advanced"

Таким образом мы получили выражение, которое позволит пользователем обменивать стейблкоины с минимальной разницей в цене aka проскальзыванием.

Curve whitepaper - https://docs.curve.fi/assets/pdf/stableswap-paper.pdf

Надеюсь статья была полезной

Спасибо за прочтение!

Мой телеграм - https://t.me/chpotldev