DeFi
March 12

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

DeFi

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

Как это делается, мы расскажем в этом уроке.

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

Для этого на контракте менеджера позиций вызываем метод createAndInitializePoolIfNecessary.

Укажем значения его параметров:

  • payable - 0
  • token0 - адрес первого токена - NIFTSY
  • token1 - адрес USDT токена
  • fee - 100 - 0.01%
  • sqrtPriceX96 - стартовая цена, квадратный корень из стартовой цены, умноженный на 2 в степени 96

Цену мы вычислили по известным нам формулам в таблице. Пусть стартовая цена будет 20 NIFTSY за 1 USDT

Подписываем транзакцию. Посмотрим транзакцию. Видим, что создан контракт

Также можно проверить, что пул создан - вызываем метод getPool на фабрике, передав ему параметрами адреса токенов и значение комиссии. Посмотрим состояние контракта - на самом контракте пула вызовем метод slot0.

Видим, что есть текущая цена sqrtPriceX96 и есть значение текущего тика. Ликвидности еще никакой нет в пуле.

Контракт создан. Вносим ликвидность в этот пул.

Сначала проверим tickSpaсing нашего пула. Он равен 1. Определим индексы тикового диапазона, в рамках которого будет работать наша ликвидность. Это индексы -308000 и -305000.

Выдадим контракту менеджера позиций разрешение использовать наши токены для внесения ликвидности. Подпишем на контрактах токенов транзакции approve.

Далее вызываем метод mint на контракте NonfungiblePositionManager.

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

  • payableAmount - стами 0, мы не передаем в транзакции эфир, не вносим сейчас в пул нативные токены
  • адрес токена 0
  • адрес токена 1
  • размер комиссии пула, в который вносим ликвидность. Указываем 100, то есть 0,01%
  • tickLower и tickUpper - границы нашего ценового диапазона. Они у нас известны
  • amount0Desired, amount1Desired - сколько мы хотим внести. Мы хотим внести 0,1 USDT и 2 нифтси токена.
  • amount0Min, amount1Min - минимальное количество, которое пул должен принять от нас. Укажем 10 - также, с учетом количества знаков после запятой.
  • recipient - получатель позиции - укажем адрес кошелька, которым будем подписывать транзакцию.
  • deadline - время, до которого транзакция должна быть выполнена. Берем текущую дату из конвертера и увеличим текущее значение на 20000.

Подписываем транзакцию.

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

Проверим теперь нашу позицию по token Id созданного финансового NFT. Снова на контракте менеджера позиций вызываем метод positions и передаем ему token ID. Видим, что у нас есть позиция, указаны индесы тиков ценового диапазона, в котором будет работать наша ликвидность и видим что появилось значение у переменной liquidity. Подводя итог, мы создали новый пул и внесли в него ликвидность.

Uniswap

До!