Los pools de liquidez son el núcleo de Uniswap y el enfoque principal de cada actualización. Si de V2 a V3 el cambio principal fue la liquidez concentrada, de V3 a V4 el cambio principal son los pools de liquidez. En V4, los cambios en los pools de liquidez se centran en los siguientes aspectos:

  • Cada pool de liquidez en V3 requiere el despliegue de un contrato por separado, mientras que en V4 todos los pools de liquidez están en el contrato PoolManager.

  • Las tarifas ya no están limitadas a unos pocos valores específicos, ahora se pueden establecer libremente.

  • V4 admite tarifas dinámicas, que pueden ajustarse según condiciones específicas.

A continuación, se describirán en detalle cada uno de los aspectos mejorados, explorando sus principios de implementación y su impacto.

PoolManager

En Uniswap V3, el pool de liquidez se despliega a través del contrato UniswapV3Factory, y cada pool es un contrato inteligente separado. Al mismo tiempo, cada cadena tiene un contrato Proxy (este contrato tiene la dirección 0x364484dfb8f2185b90e29fbd10ac96fca8a7e4a7 en la mayoría de las cadenas). Al agregar liquidez, los usuarios deben iniciar una transacción al contrato Proxy, que luego llama al contrato Pool. En este proceso, los fondos deben transferirse primero al contrato Proxy, luego al Pool para convertirse en liquidez, y finalmente el contrato Proxy emitirá un NFT al usuario como prueba de los derechos de liquidez. Como se puede ver, este proceso es muy complicado y consume mucho gas. Además, cuando los usuarios intercambian tokens, si utilizan transacciones de múltiples saltos, también deben cambiar entre diferentes contratos Pool, lo que también incurre en costos adicionales de gas.

Para abordar este problema, Uniswap V4 introduce un patrón Singleton, permitiendo que todos los pools sean gestionados a través del contrato PoolManager. El PoolManager tiene una variable _pools, que guarda el estado de todos los pools. Si se desea crear un nuevo pool, solo es necesario agregar un par clave-valor a la variable _pools, sin necesidad de desplegar un contrato. Durante las transacciones, los fondos no necesitan transferirse entre diferentes contratos, solo se necesita llevar un registro en el PoolManager.

Los beneficios de hacer esto son muchos; podemos hacer una analogía grosera. Por ejemplo, si necesitamos realizar una transacción de BTC a USDC, y el cálculo de la ruta descubre que la forma más económica es primero cambiar BTC por ETH y luego ETH por USDC. Entonces, nuestro camino de intercambio es BTC->ETH->USDC.

Para Uniswap V3, es como un mercado, cada puesto debe liquidarse una vez, notificando a cada ERC20 para realizar el pago, siendo necesario liquidar BTC, ETH y USDC por separado.

Mientras que Uniswap V4 es como un gran supermercado, solo necesitas recargar al entrar y retirar al salir; todas las transacciones en cada mostrador están a crédito, no se liquidan realmente. Solo se liquidan al final los activos BTC y USDC.

Los costos ahorrados en este proceso incluyen dos partes:

  1. Llamadas intercontractuales, en el mercado de V3, cada vez que se mueve un puesto (dirección del pool) se requiere un pago, mientras que en V4 solo se paga una vez.

  2. Costos de liquidación ERC20, el gran modelo de supermercado de V4 eliminó todos los costos de liquidación en la ruta de transacción.

Dada la importancia del contrato PoolManager, Uniswap también organizó una emocionante actividad de minería de direcciones [1] para elegir una dirección auspiciosa para el PoolManager, lo que también puede ahorrar gas a los usuarios. Se puede ver el nivel de atención que la oficialidad tiene hacia este contrato.

La implementación del modelo de interés simple depende de la tecnología de almacenamiento transitorio. El almacenamiento transitorio es un nuevo método de almacenamiento de datos en Ethereum, propuesto en EIP-1153 y lanzado en 2024 a través de la actualización de Cancún. Permite almacenar datos temporalmente durante la ejecución de una sola transacción y se borran automáticamente al finalizar la transacción. El almacenamiento transitorio llena el vacío de los mecanismos de almacenamiento existentes, siendo especialmente adecuado para escenarios donde los datos solo necesitan ser válidos dentro de una sola transacción y requieren lecturas y escrituras frecuentes. A continuación se presenta una comparación entre el almacenamiento transitorio (Transient Storage), almacenamiento (Storage), memoria (Memory) y datos de llamada (Calldata) (cita de Almacenamiento Transitorio: Soluciones de datos temporales eficientes en Solidity [2])

Es precisamente a través de la introducción del mecanismo de almacenamiento transitorio (Transient Storage) que Uniswap V4 puede almacenar el estado de la transacción a un costo extremadamente bajo durante una única transacción, sin necesidad de escribir permanentemente variables intermedias en el almacenamiento de la blockchain. Este diseño no solo reduce el consumo de gas en cada transacción, sino que también mejora la eficiencia de las transacciones en V4.

Tarifas

Además del patrón Singleton, otro gran cambio son las tarifas. En comparación con V3, los pools de liquidez en V4 pueden establecer libremente la tasa de comisión, ya no limitándose a unos pocos valores específicos. Para entender esto visualmente, se puede observar los parámetros de creación del pool. En V3, los parámetros para crear un pool son los siguientes:

  • dirección token0: El primer token del pool

  • dirección token1: El segundo token del pool, que generalmente se clasifica por dirección entre el primero y el segundo

  • uint24 fee: La tasa de comisión del pool, que solo puede elegirse entre 1%, 0.3%, 0.05% y 0.01%

En V4, los parámetros de creación se encapsulan en un objeto PoolKey. Los campos de este objeto incluyen:

  • Moneda currency0: token 0. (El tipo Currency es un alias del tipo dirección)

  • Moneda currency1: token 1.

  • uint24 fee: La tasa de comisión del pool, que puede establecerse en un valor no superior al 100%; si se establece en 0x800000, significa que el pool utiliza tarifas dinámicas.

  • int24 tickSpacing: El tick spacing de la liquidez. Se puede especificar libremente, desde 2 hasta 32766.

  • IHooks hooks: El hook del pool; para más detalles, puedes consultar el artículo anterior [3].

A partir de estos parámetros, se puede observar que los parámetros de inicialización del pool incluyen principalmente dos partes: tokens y tarifas.

La configuración de tarifas de V4 tiene dos parámetros, fee y tickSpacing, mientras que V3 solo tiene fee. En cuanto a tarifas, V3 solo puede establecer cuatro valores (1%, 0.3%, 0.05%, 0.01%), en comparación con V2 que solo podía establecer 0.3%, ya ha habido algunos avances. Sin embargo, en V4, la tasa de comisión puede seleccionarse arbitrariamente entre números menores al 100%, lo que otorga una mayor libertad en la creación de pools, permitiendo establecer tarifas más precisas según las características de los tokens.

tickSpacing es la granularidad de la liquidez. Valores más pequeños pueden aumentar la precisión de los precios; sin embargo, valores más pequeños harán que las transacciones swap crucen ticks más frecuentemente, lo que resulta en mayores costos de gas. En V3, el tick spacing está determinado por la tasa de comisión, cuya relación es la siguiente:

V4 eliminó esta relación de vinculación, por lo que la tarifa y el tick spacing se convirtieron en dos parámetros configurables por separado; en V4, el tick spacing puede ser cualquier número entero entre 2 y 32766. En cuanto a si este valor debe ser grande o pequeño, se debe sopesar la precisión de precios y la frecuencia de transacciones. Por ejemplo, para stablecoins, el tick spacing debe ser lo más pequeño posible, mientras que para tokens como BTC, cuyo precio se acerca a los cien mil, el tick spacing puede ser un poco mayor para ahorrar gas. Desvincular la tarifa y el tick spacing equivale a eliminar la relación de vinculación entre el precio del token y la precisión, lo que beneficiará a las monedas de alto precio.

Este ajuste arbitrario presenta un problema. Para el mismo par de transacciones, cada tarifa y cada tick spacing es un nuevo pool, por lo que la cantidad de pools aumentará considerablemente. Por ejemplo, en V3, el pool USDC-ETH tiene tres pools activos de 0.05%, 0.3% y 1%, y todos están entre los 50 primeros en términos de liquidez. En V4, debido a que hay 1,000,000 posibles tarifas, el pool USDC-ETH en V4 podría tener fácilmente más de cien pools. Si se considera que diferentes Hooks también cuentan como nuevos pools, el número de pools en el futuro será aún mayor. Esto inevitablemente dispersará la liquidez de cada pool.

Tarifas dinámicas

Las tarifas dinámicas son el mayor cambio en V4 además de los Hooks, y su significado es igual al de la liquidez concentrada en V3. Lo que se conoce como 'tarifas dinámicas' significa que la tarifa del pool de liquidez ya no se fija en un valor específico, sino que puede ajustarse en cualquier momento según las condiciones específicas del mercado. Esta flexibilidad permite que las tarifas dinámicas generen múltiples escenarios de uso, trayendo más aplicaciones e innovaciones a Uniswap, mejorando así la eficiencia y adaptabilidad del protocolo en su conjunto. A continuación se presentan algunos posibles escenarios de ajuste de tarifas dinámicas:

  1. Ajustar según el precio del mercado en este modo, el ajuste de la tarifa se vincula a las fluctuaciones del precio del mercado. Por ejemplo, cuando el precio de un activo sube, la tarifa también aumenta, y viceversa. Esta forma de ajuste puede ayudar a Uniswap a adaptarse mejor a los cambios en el entorno del mercado, especialmente en períodos de gran volatilidad de precios, donde aumentar la tarifa puede compensar efectivamente el riesgo del proveedor de liquidez.

  2. Ajustar según el volumen de transacciones en períodos de alto volumen, las tarifas pueden ofrecer descuentos o incentivos. Este modo es adecuado para transacciones grandes, atrayendo a comerciantes de alta frecuencia para reducir sus costos de transacción y también incentivando a los proveedores de liquidez a ofrecer más liquidez, especialmente en mercados de alto volumen y baja volatilidad de precios. Mediante la optimización de la estructura de tarifas, se puede lograr un equilibrio entre la demanda del mercado y los ingresos de los proveedores de liquidez.

  3. Ajustar según las tarifas de gas de la red este mecanismo vincula las tarifas a la congestión de la red blockchain. Cuando las tarifas de gas en la red son altas, el pool de liquidez puede aumentar automáticamente la tarifa, controlando la velocidad de cambio de la liquidez; mientras que cuando la red está bastante libre, las tarifas pueden disminuir adecuadamente. Este modo de ajuste ayuda a la eficiencia operativa del pool de liquidez y también permite a los usuarios disfrutar de costos de transacción más bajos cuando las tarifas de la red son bajas.

  4. Ajustar según precios externos (como oráculos) a través de la combinación con oráculos externos o fuentes de datos del mercado, Uniswap puede ajustar dinámicamente las tarifas según precios externos precisos. Este mecanismo de ajuste puede asegurar que las tarifas del pool de liquidez siempre coincidan con la situación real del mercado, proporcionando así un mecanismo de precios más justo y preciso. Por ejemplo, cuando la volatilidad de mercado de un activo aumenta, la tarifa puede incrementarse para reflejar su riesgo.

  5. Ajustar en momentos específicos esta estrategia permite ajustar la tasa de comisión en ciertos momentos específicos (como anualmente, trimestralmente o semanalmente). Este modo es adecuado para escenarios que requieren una revisión periódica del entorno del mercado o ajustes según la demanda estacional. Por ejemplo, cada año se pueden realizar ajustes según el desempeño del mercado del año anterior y la demanda de liquidez, para mantener el desarrollo saludable a largo plazo del sistema.

Como se puede ver en el ejemplo anterior, la introducción de tarifas dinámicas no solo proporciona más flexibilidad a los pools de liquidez, sino que también ofrece diferentes oportunidades de ingresos y ahorros para proveedores de liquidez y usuarios. Para los proveedores de liquidez, las tarifas dinámicas pueden ofrecer mayores rendimientos durante períodos de alta volatilidad del mercado, incentivándolos a proporcionar más liquidez en tiempos de alto riesgo; mientras que para los usuarios comunes, el ajuste dinámico de las tarifas puede optimizarse según el período de transacción, la situación del mercado o el nivel de congestión de la red, lo que reduce los costos de transacción y mejora la experiencia de transacción y la atracción general de la plataforma.

En resumen, las tarifas dinámicas introducen un enfoque de gestión de tarifas más flexible e inteligente para Uniswap, que no solo mejora la adaptabilidad del mercado, sino que también ofrece a los proveedores de liquidez y a los usuarios más opciones y oportunidades, impulsando el desarrollo continuo de protocolos de intercambio descentralizados en un entorno de mercado cada vez más complejo.

La siguiente cita proviene de la declaración oficial de Uniswap, que describe el escenario de tarifas dinámicas desde su perspectiva:

  • Mejorar la fijación de precios de la volatilidad: ajustar las tarifas según la volatilidad del mercado, similar a cómo las bolsas tradicionales ajustan los márgenes de compra y venta.

  • Según el precio del pedido: precios más precisos para diferentes tipos de transacciones (por ejemplo, transacciones de arbitraje frente a transacciones no informativas).

  • Mejorar la eficiencia y estabilidad del mercado: Las tarifas pueden ajustarse según las condiciones del mercado en tiempo real, optimizando los intereses de los proveedores de liquidez y los comerciantes. Las tarifas dinámicas ayudan a mitigar las fluctuaciones extremas del mercado mediante ajustes en tiempo real de los incentivos.

  • Mejorar la eficiencia del capital y los retornos para los proveedores de liquidez: mediante la optimización de las tarifas, el pool puede atraer más liquidez y facilitar transacciones más eficientes. Una fijación de tarifas más precisa puede resultar en mejores retornos, atrayendo así más capital al pool.

  • Mejor gestión del riesgo: en períodos de alta volatilidad, las tarifas pueden aumentar para proteger a los proveedores de liquidez de pérdidas temporales.

  • Estrategias personalizables: proporcionar estrategias de tarifas complejas para pares de tokens específicos o segmentación de mercado.

La implementación de tarifas dinámicas depende del Hook del pool de liquidez. El Hook es un nuevo concepto en V4, es un contrato separado que puede agregar lógica adicional al pool de liquidez. A través del Hook, el pool de liquidez puede insertar algunas funciones personalizadas antes y después de la transacción, en las que se pueden cambiar las tarifas. Por lo tanto, la forma de cambiar las tarifas es muy flexible, como al agregar o quitar liquidez, o calcular nuevas tarifas antes y después del swap, y cambiar en tiempo real la tasa de comisión del pool.

Para permitir que el pool de liquidez use tarifas dinámicas, durante la creación del pool, se debe establecer la tarifa en 0x80000, o sea LPFeeLibrary.DYNAMIC_FEE_FLAG.

Hay dos maneras de cambiar la tasa de comisión dinámica. Una es llamar a IPoolManager.updateDynamicLPFee(key, newValue) en el Hook, lo que cambia permanentemente la tasa de comisión del pool. Esta función se puede llamar en cualquier punto de enganche del Hook. Por ejemplo, en el siguiente caso:

Nota: Después de crear el pool, la tarifa predeterminada es 0, por lo que se debe establecer un valor inicial para la tarifa en el afterInitialize del Hook.

La otra forma es cambiar temporalmente la tarifa. En el beforeSwap del Hook, se puede devolver una tarifa, y esta transacción swap usará esta nueva tarifa. La tasa de comisión del pool no cambiará y otras transacciones no se verán afectadas.

Sin embargo, hay dos conceptos confusos respecto a las tarifas dinámicas. En el Hook también se puede cobrar una parte adicional de tarifas, que no entra en conflicto con la tarifa del pool, y ambas se pueden cobrar juntas. De hecho, la tarifa del pool de liquidez generalmente se llama LP fee, mientras que la tarifa cobrada por el Hook se llama Hook fee. Generalmente, cuando se menciona tarifas dinámicas, se refiere a la tarifa del pool de liquidez.

Resumen

Como el principal protocolo AMM, la actualización de los pools de liquidez de Uniswap V4 destaca nuevamente su innovación y liderazgo en el ámbito de los protocolos de intercambio descentralizados. Esta serie de cambios no solo aumenta la flexibilidad y escalabilidad del protocolo, sino que también mejora significativamente su competitividad en el mercado, permitiendo a Uniswap V4 distanciarse de sus competidores en muchos aspectos y continuar manteniendo su posición dominante en el ecosistema DeFi.

Referencias [1]

La emocionante actividad de minería de direcciones: https://v4-address.uniswap.org/

[2] Almacenamiento transitorio: Soluciones de datos temporales eficientes en Solidity: https://learnblockchain.cn/article/9847

[3] Artículo anterior: https://github.com/antalpha-labs/zelos

Autor: Steven Sun, Zelos