Продолжаем разбирать функцию свапа и сегодня поговорим о том, как Юнисвап понимает, сколько токенов было послано в пул.
За это отвечают, по сути, всего две строки (176-177):
uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
Из предыдущих постов мы помним, что переменные _reserve0 и _reserve1 не обновляются внутри функции. Они отражают баланс контракта до того, как новые токены были добавлены при свапе.
С каждым из двух токенов в паре может случится одна из ситуаций:
1. В пуле произошло чистое увеличение количества определенного токена;
2. В пуле произошло чистое уменьшение количества определенного токена или оно осталось неизменным;
То как код контракта определяет ситуацию,, можно переложить на формулу:
currentContractbalanceX > _reserveX - _amountXOut
или
currentContractBalanceX > previousContractBalanceX - _amountXOut
В случае, если зафиксировано уменьшение, то тернарный оператор возвращает ноль, в противном случае учитывается увеличение количества токенов.
amountXIn = balanceX - (_reserveX - amountXOut)
Также можно указать на то, что в любом случае _reserveX > amountXOut, так как идет проверка на строке 162:
require(amount0Out < _reserve0 && amount1Out < _reserve1, 'UniswapV2: INSUFFICIENT_LIQUIDITY');
Несколько примеров:
1. Предположим, что предыдущий баланс был равен 10, amountOut = 0, и currentBalance = 12. Это значит, что было добавлено 2 токена и amountXIn будет равен 2.
2. Или предыдущий баланс равен 10, amountOut = 7, и currentBalance = 3, поэтому amountXIn = 0.
3. Предыдущий баланс был равен 10, amountOut = 7, и currentBalance = 2. В этом случае amountXIn будет также равен 0, а не -1. Пул получает уменьшение на 8 токенов, а amountXIn не может быть негативным числом.
4. Или же предыдущий баланс равен 10, amountOut = 6. Если currentBalance равен 18, это означает, что пользователь "занял" 6 токенов и вернул 8.
В завершении можно сказать, что amount0In и amount1In отражают чистое увеличение токенов при добавлении в пул, и равняются нулю, если идет уменьшение.
#uniswap #swap