Este tutorial está diseñado para guiar a quienes desean aprender más acerca de Uniswap. Es ideal para un nivel avanzado.
Uniswap es el protocolo de intercambio descentralizado (DEX) pionero y de mayor volumen en Web3, basado en creadores de mercado automatizados (AMM). Uniswap V3 introdujo la liquidez concentrada, permitiendo a los proveedores de liquidez asignar capital en rangos de precios específicos delimitados por ticks discretos, logrando una eficiencia de capital hasta 4,000 veces superior a V2. Además, ofrece múltiples niveles de comisiones (0.01%, 0.05%, 0.3%, 1%), oráculos de precio ponderado en el tiempo (TWAP) integrados y Flash Swaps atómicos sin costo de prima de préstamo. Esta guía cubre la integración de contratos con ISwapRouter, cálculos matemáticos con Q64.96 y ejecución de arbitrajes de alta velocidad.
Contrato Solidity para ejecutar un intercambio exactInputSingle en Uniswap V3 utilizando el contrato oficial ISwapRouter.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ISwapRouter} from "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract UniswapV3SingleSwap {
ISwapRouter public immutable router;
// Uniswap V3 SwapRouter en Ethereum / L2: 0xE592427A0AEce92De3Edee1F18E0157C05861564
constructor(address _router) {
router = ISwapRouter(_router);
}
/// @notice Intercambia una cantidad exacta de tokenIn por el máximo tokenOut posible
function swapExactInputSingle(
address tokenIn,
address tokenOut,
uint24 feeTier, // ej. 3000 para 0.3% o 500 para 0.05%
uint256 amountIn,
uint256 amountOutMinimum
) external returns (uint256 amountOut) {
IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn);
IERC20(tokenIn).approve(address(router), amountIn);
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
tokenIn: tokenIn,
tokenOut: tokenOut,
fee: feeTier,
recipient: msg.sender,
deadline: block.timestamp,
amountIn: amountIn,
amountOutMinimum: amountOutMinimum,
sqrtPriceLimitX96: 0
});
amountOut = router.exactInputSingle(params);
}
}
Resultado:
Transacción completada: Se transfieren 1,000 USDC, se aprueba el SwapRouter V3, se ejecuta el swap en el pool de fee 0.05% y el usuario recibe 0.307 ETH con protección estricta contra slippage.
Familiarizarse con estos comandos es esencial para interactuar eficientemente con Uniswap:
forge install Uniswap/v3-core Uniswap/v3-periphery --no-commit
(uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, , , , ) = pool.slot0();
pool.swap(recipient, zeroForOne, amountSpecified, sqrtPriceLimitX96, abi.encode(data));
price = (uint256(sqrtPriceX96) * uint256(sqrtPriceX96) * 1e18) >> 192;
nonfungiblePositionManager.mint(INonfungiblePositionManager.MintParams({...}));
(int56[] memory tickCumulatives, ) = pool.observe(secondsAgos);
Comprender estos conceptos fundamentales te ayudará a dominar Uniswap de forma más organizada y eficiente:
Liquidez Concentrada:
Innovación de Uniswap V3 que permite a los proveedores de liquidez confinar sus fondos a rangos de precios personalizados, maximizando comisiones y profundidad de mercado.
Ticks y Ticks Spacing:
Límites discretos logarítmicos donde el precio cambia por incrementos del 0.01% (1 punto básico). El espaciado entre ticks varía según el fee tier del pool (ej. 10 para 0.05%, 60 para 0.3%).
Aritmética Q64.96:
Formato numérico de punto fijo utilizado en el core de Uniswap donde los precios se almacenan como la raíz cuadrada del precio multiplicada por 2^96 para preservar precisión matemática sin desbordamiento.
Flash Swaps:
Mecanismo que permite retirar cualquier cantidad de tokens de un pool de Uniswap sin colateral previo, siempre que se pague el balance adeudado o se devuelva el token opuesto en el mismo bloque.
Tiered Fee Pools:
Cuatro niveles estándar de comisiones (0.01% para pares estables hiper-correlacionados, 0.05% para stablecoins, 0.3% para pares tradicionales y 1.0% para activos exóticos/volátiles).
TWAP Oracles On-Chain:
Acumuladores geométricos de ticks que permiten a otros contratos inteligentes consultar precios históricos con coste cero de gas de actualización y alta resistencia a ataques de manipulación.
Algunos ejemplos de aplicaciones prácticas donde se utiliza Uniswap:
Arbitraje atómico MEV entre DEXs descentralizados:
Detección y captura de discrepancias de precio en milisegundos entre pools de Uniswap V3, SushiSwap, Balancer y Aerodrome en Ethereum y Layer 2.
Intercambio de activos en billeteras y agregadores Web3:
Ruta backend utilizada por agregadores como 1inch, ParaSwap y billeteras como MetaMask para ejecutar swaps eficientes con la menor pérdida por deslizamiento.
Provisión activa de liquidez y yield farming automatizado:
Estrategias de rebalanceo dinámico de rangos de liquidez concentrada (LP) gestionadas mediante vaults inteligentes como Arrakis Finance o Gamma.
Liquidaciones atómicas financiadas con Flash Swaps:
Obtención inmediata de fondos para saldar deudas en Aave o Compound y posterior venta del colateral embargado en un solo lote transaccional sin riesgo de capital.
Alimentación de precios resistente a manipulación (TWAP):
Uso del acumulador de observaciones de Uniswap V3 como oráculo descentralizado secundario para verificar la autenticidad de precios de tokens ERC-20.
Emisión y distribución de nuevos tokens Web3:
Creación sin permisos de pools de liquidez iniciales para proyectos descentralizados sin intermediarios ni requisitos de autorización previa.
Aquí tienes algunas recomendaciones para facilitar tus inicios en Uniswap:
Define siempre un amountOutMinimum estricto:
Nunca establezcas amountOutMinimum en 0 para evitar ataques de sándwich (MEV) en pools de liquidez descentralizada donde los bots explotan el slippage.
Utiliza el fee tier adecuado para cada par:
Para pares de stablecoins (USDC/USDT) usa 100 (0.01%) o 500 (0.05%), para pares estándar (ETH/USDC) usa 3000 (0.3%), y reserva 10000 (1%) para tokens con alta volatilidad.
Configura un deadline razonable en segundos:
Utiliza block.timestamp o sumas pequeñas (block.timestamp + 300) para evitar que transacciones pendientes se ejecuten con precios desfavorables horas después.
Calcula ticks alineados al tickSpacing:
Al proveer liquidez concentrada, asegúrate de que tickLower y tickUpper sean múltiplos exactos del tickSpacing del pool correspondiente.
Aprovecha los Flash Swaps con costo cero de comisión de préstamo:
A diferencia de protocolos de préstamo que cobran primas (0.05% - 0.09%), en Uniswap los Flash Swaps sólo pagan la comisión estándar del pool de intercambio.
Simula transacciones localmente con Foundry antes de mainnet:
Usa 'forge test --fork-url <RPC>' para simular tus swaps contra pools reales y verificar el consumo de gas antes del despliegue en producción.
Si te interesa Uniswap, también podrías explorar estas herramientas:
Amplía tus conocimientos con estos enlaces y materiales:
Continúa aprendiendo con estos contenidos relacionados: