Вводный курс DeFi для всех. Работа с dAPPs через смарт-контракты. Uniswap. Часть VIII
Если нет пула для торговой пары с конкретной комиссией за обмен, то его можно создать.
Как это делается, мы расскажем в этом уроке.
Для начала на контракте фабрики пулов протокола вызовем метод 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. Подводя итог, мы создали новый пул и внесли в него ликвидность.