Al crear un nuevo contrato de par a través del contrato UniswapV2Factory , el autor de la llamada no puede establecer arbitrariamente el orden en que se asignan los tokens en el almacenamiento (es decir, the token0
y token1
vars) :
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
¿Qué hace tokenA < tokenB
en Solidity? Los vars son address
tipos.
Es fácil ver lo que hace esa comparación con un enfoque práctico en Remix :
pragma solidity =0.5.16;
contract AddressComparison {
function cmp(address token0, address token1) external pure returns (bool) {
return token0 < token1;
}
}
Digamos que está pasando las siguientes dos direcciones como entradas:
La función devuelve true
:
Parece que Solidity compara el valor numérico de las direcciones (es decir, sus valores hexadecimales). Dado que token1
el primer dígito de es mayor en valor que el token0
dígito de ( 0xA
versus 0x2
), la comparación da como resultado true
.
Veamos otro ejemplo para aclarar el punto:
Esta vez, la función devuelve false
:
Probablemente puedas adivinar por qué: 0xC
es más grande que 0xA
.
Lo más probable es que Uniswap haya hecho esto para reducir los costos de integración. Si todo el mundo sabe que los tokens siempre se ordenan por su valor hexadecimal en un par Uniswap v2, los clientes no tienen que consultar la cadena de bloques para averiguar el orden de los tokens en el grupo, siempre que conozcan las direcciones de los tokens.
darthjedi