UniswapV2Library
La Uniswap V2 Library simplifica algunas interacciones con los contratos de pares y es muy utilizada por los contratos Router. Contiene ocho funciones que no modifican el estado. También son útiles para integrar Uniswap V2 desde un contrato inteligente.
getAmountOut() y getAmountIn()
Si queremos predecir la cantidad de token y que obtendremos si suministramos una cantidad fija de token x, entonces podemos derivar la cantidad de salida usando la siguiente secuencia (ignorando las comisiones por simplicidad). Sea x el token entrante, y el token saliente, Δx la cantidad que entra y Δy la cantidad que sale
Con esto en mente, la función para getAmountOut() en UniswapV2Library.sol debería explicarse por sí misma. Ten en cuenta que los números se escalan por 1,000 para contabilizar la comisión del 0.3%. La derivación de getAmountIn() con comisiones es un ejercicio para el lector.

Encadenamiento de getAmountOut() a getAmountsOut() para saltos entre pares
getAmountsOut() y getAmountsIn()
Si un trader suministra una secuencia de pares, (A, B), (B, C), (C, D) y llama iterativamente a getAmountOut comenzando con una cierta cantidad de A, entonces se puede predecir la cantidad del token D que se recibirá.
La dirección del contrato de par de UniswapV2 para cada (A, B), (B, C), etc. se deriva de manera determinista a partir de las direcciones de los tokens y la dirección de la fábrica que desplegó el par utilizando la función create2. Dados dos tokens (A, B) y una address de la fábrica, pairFor() deriva la dirección del contrato del pool del par de UniswapV2 para ese par, utilizando sortTokens() como función auxiliar.

Ahora que conocemos las direcciones de todos los pares, podemos obtener las reservas de cada uno y predecir cuántos tokens recibiremos al final de la cadena de intercambios. A continuación se muestra el código de getAmountsOut() (haciendo énfasis en “Amounts” en lugar de “Amount”). La función getAmountsIn() simplemente hace lo mismo a la inversa, por lo que no la mostraremos aquí.
Ten en cuenta un par de cosas:
- El contrato inteligente no descubre la secuencia óptima de pares por sí solo, se le debe proporcionar la lista de pares sobre la cual calcular la cadena de intercambios. Esto se hace mejor fuera de la cadena (off-chain).
- No solo devuelve el
amountOutfinal del token en la cadena, sino la cantidad de salida en cada paso.

getReserves()
La función getReserves es simplemente un envoltorio alrededor de la función getReserves del contrato de par de Uniswap V2, excepto que también elimina el registro de tiempo (timestamp) de la última actualización del precio. También se muestra la función getReserves del contrato del par para facilitar la comparación (comentarios en color púrpura).

Función principal:

quote()
Recuerda que el precio de un activo sigue la siguiente fórmula:
Esta función devuelve el precio de foo denominado en bar según la última actualización. Esta función debe utilizarse con cuidado, ya que es vulnerable a ataques de préstamos relámpago (flash loan attacks).

Uso de UniswapV2Library
Si quieres predecir cuánto invertir o cuánto esperar de una operación, o de una secuencia de operaciones a través de pares, la UniswapV2Library es la herramienta a utilizar.
Práctica
Prueba DamnVulnerableDefi Puppet V2. A estas alturas debería resultarte fácil identificar el problema de seguridad.
Aprende más con RareSkills
Este material es parte de nuestro Solidity Bootcamp avanzado. Por favor, consulta el programa para obtener más información.
Publicado originalmente el 6 de noviembre de 2023