Разбор Uniswap V2: Router контракты
Мы продолжаем изучать код протокола Uniswap версии V2, и на этой неделе поговорим про контракт Router и его основные функции.
Итак, этот контракт отвечает за:
1. Безопасный майнинг и сжигание токенов LP (добавление и удаление ликвидности)
2. Безопасный своп токенов;
3. Возможный обмен Эфира при помощи его ERC-20 версии - WETH;
4. Проверки проскальзывания при работе с основным контрактом;
5 Поддержка fee on transfer токенов;
Вообще, если мы зайдем по ссылке репо, то увидим, что там два контакта Router:
UniswapV2Router01.sol
UniswapV2Router02.sol
Вот второй, как раз и добавляет поддержку fee on transfer токенов. Если мы заглянем в него, то увидим, что он наследует от первого контракта и добавляет уникальные функции, например:
function removeLiquidityETHSupportingFeeOnTransferTokens(...) ) public virtual override ensure(deadline) returns (uint amountETH) {}
Теперь о самих функциях.
swapExactTokensForTokens и swapTokensForExactTokens
Обе эти функции используются при свапе токенов, с одной разницей:
1. В swapExactTokensForTokens означает, что количество входного токена, который вы обмениваете, фиксировано.
2. В swapTokensForExactTokens - количество выходного токена, который вы получите, фиксировано.
Если пользователь обменивает только два токена, то он передаст этим функциям массив address[] calldata path [address(tokenIn), address(tokenOut)]. Если пользователь обменивается между пулами, то он укажет [address(tokenIn), address(intermediateToken), ..., address(tokenOut)].
swapExactTokensForTokens
В случае с swapExactTokensForTokens пользователь указывает точное количество первого токена, который он собирается внести, и минимальное количество выходного токена, которое он примет.
Например, предположим, что мы хотим обменять 25 токенов_0 на 50 токенов_1. Если это точная цена в текущем состоянии, это не оставляет никаких шансов на то, что цена изменится до подтверждения нашей транзакции, что приведет к реверту. Поэтому вместо этого мы указываем минимальную цену 49,5 токена_1, неявно оставляя проскальзывание в 1 %.
swapTokensForExactTokens
В этом случае мы указываем, что нам нужно ровно 50 токенов_1, но мы готовы обменять до 25,5 токенов_0, чтобы получить их.
Какую функцию использовать?
Большинство пользователей, использующих EOA, скорее всего, предпочтут использовать функцию swapExactTokensForTokens, поскольку им необходим этап подтверждения, и сделка не состоится, если им придется заплатить больше, чем они хотели.
Однако смарт-контракты, интернирующиеся с Uniswap, могут иметь более сложные требования, поэтому маршрутизатор дает им возможность использовать оба варианта.
Как работает своп токенов
Если входные данные точные (swapExactTokensForTokens), функция предсказывает ожидаемый выход для одного свопа или цепочки свопов. Если полученный результат ниже заданной пользователем суммы, функция откатится.
И наоборот, для точного выхода: она вычисляет требуемый вход и возвращается, если он выше заданного пользователем порога.
Затем обе функции передают токены пользователя в контракт пары (мы же помним, что Uniswap V2 Pair требует, чтобы токены были отправлены на сам контракт до вызова функции swap).
Наконец, они вызывают внутреннюю функцию _swap, о которой пойдет речь далее.
#uniswap #router
Post #1043
805
- ❤ 1