При создании нового парного контракта с помощью контракта UniswapV2Factory порядок, в котором токены назначаются в хранилище (то есть переменные token0
и token1
) , не может быть произвольно установлен вызывающей стороной:
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
Что tokenA < tokenB
делает в Solidity? Вары — это address
типы.
Легко увидеть, что делает это сравнение при практическом подходе к Remix :
pragma solidity =0.5.16;
contract AddressComparison {
function cmp(address token0, address token1) external pure returns (bool) {
return token0 < token1;
}
}
Скажем, вы передаете следующие два адреса в качестве входных данных:
Функция возвращает true
:
Похоже, Solidity сравнивает числовое значение адресов (то есть их шестнадцатеричные значения). Поскольку token1
первая цифра 's больше по значению, чем token0
цифра 's ( 0xA
по сравнению с 0x2
), сравнение дает true
.
Давайте посмотрим на другой пример, чтобы донести мысль:
На этот раз функция возвращает false
:
Вы, наверное, догадались, почему: 0xC
больше, чем 0xA
.
Скорее всего, Uniswap сделал это, чтобы удешевить интеграцию. Если все знают, что токены всегда упорядочены по их шестнадцатеричному значению в паре Uniswap v2, клиентам не нужно запрашивать блокчейн, чтобы узнать порядок токенов в пуле, если они знают адреса токенов.
ДартДжедай