Este artículo explica cómo Uniswap V3 implementa la liquidez concentrada. Asumimos que el lector ya entiende Uniswap V2.
Para entender la liquidez concentrada, primero necesitamos definir de manera precisa la liquidez, lo cual a su vez depende de entender las reservas.
Reserva
La reserva de un token es el saldo de un token negociable específico en poder de un creador de mercado automatizado (AMM). Usamos o simplemente para referirnos a la cantidad del token negociable en poder del pool, y (o a veces ) para referirnos a la cantidad del token negociable en poder del pool.
Liquidez
La liquidez, en el contexto de los AMMs, mide las reservas combinadas del par de tokens e .
Los proveedores de liquidez (LPs) proveen liquidez cuando depositan tokens en el pool con la esperanza de ganar comisiones durante los swaps. Su depósito aumenta las reservas, lo que a su vez, aumenta la liquidez.
La liquidez es una función de las reservas. A menudo es el producto, el cuadrado del producto, o alguna otra función monótonamente creciente de las reservas (una función monótonamente creciente es una función que siempre aumenta si la entrada aumenta).
En Uniswap V2, la liquidez se mide como la en (el producto de las reservas).
Puede haber diferentes combinaciones de las reservas, pero la liquidez se mantiene igual. Por ejemplo, si hay 1 ETH y 1000 USDC, entonces la liquidez es 1000 (1 ETH × 1000 USDC = 1000, ignorando los decimales).
Si hubiera 900 USDC y 1.1111 ETH, la liquidez se mantiene en 1000 porque 900 × 1.1111 = 1000.
La siguiente animación grafica , mientras hace un barrido del valor de . Nota que a medida que se hace más grande, la curva se aleja más del origen.
Cuantas más reservas haya, mayor será la distancia de la curva desde el origen, y mayor será la liquidez.
Debido a que las comisiones pagadas por los traders son absorbidas por las reservas en Uniswap V2, Uniswap V2 utiliza el invariante , no . Para mantener las matemáticas simples, ignoramos las comisiones en este artículo.
Liquidez e Impacto en el Precio
La alta liquidez es deseable porque los traders pueden obtener más cantidad de un token mediante swaps. Si un pool solo contiene 1000 USDC, es imposible que un trader extraiga más de 1000 USDC. Pero incluso si no necesitan agotar todas las reservas de un token en particular, los traders prefieren una mayor liquidez porque esta reduce el impacto en el precio.
Para definir de manera precisa el “impacto en el precio” primero necesitamos definir con precisión el “precio” en un AMM.
Precio de un activo en un AMM
El precio de token0 en Uniswap V2 se calcula utilizando la siguiente fórmula:
En Uniswap V3, los tokens X e Y también se conocen como token0 y token1. En estos capítulos, usaremos ambas notaciones indistintamente.
A continuación mostramos una curva de precio regular de . El punto verde en la curva representa las reservas actuales tanto de token0 como de token1. Recuerda que estamos usando token0 y token X para referirnos a lo mismo (y lo mismo para token1 y token Y). A medida que el punto verde se mueve hacia arriba y hacia la izquierda, el precio de token0 aumenta, ya que eso corresponde a menores reservas de token0:
Como se puede ver en el gráfico anterior y en la fórmula:
reducir la reserva de token0 hace que su precio aumente. Esto coincide con la ley de la oferta y la demanda, ya que cuanto más escaso sea token0, mayor será su precio.
El precio como el ángulo desde el origen
Podemos visualizar el “precio” como un rayo (una línea con un punto de inicio, pero sin punto final) desde el origen. El rayo representa una cierta proporción fija de las reservas, independientemente de la liquidez.
Considera que cualquier combinación de reservas que se intersecte con el rayo amarillo a continuación tiene la misma proporción. Por lo tanto, el punto de intersección en este rayo con la curva de precio representa el mismo precio, sin importar la liquidez:

Sea el ángulo del rayo desde el origen hasta el precio actual en la curva de precio. Cuanto mayor sea el ángulo de , mayor será el precio:
Ahora que tenemos una definición rigurosa y una visualización del precio, podemos definir e ilustrar el impacto en el precio. Vincularemos el impacto en el precio nuevamente a la liquidez más adelante.
Impacto en el Precio
Cualquier trade (operación) en un AMM hace que el precio se mueva en contra del trader.
Si un trader intenta entregar token1 al pool para extraer token0, entonces token0 se volverá más caro.
Como se vio anteriormente, los AMMs ajustan los precios en función de la oferta (reserva) de tokens en el pool. Esto asegura que el precio siempre se mueva en respuesta a una orden de compra o venta. El aumento en el precio refleja el aumento en la demanda.
Ahora podemos examinar cómo cambia el precio en respuesta a un trade.
Impacto en el precio de una orden pequeña
Digamos que colocas la orden más pequeña posible para comprar un poco de token0 pagando token1 al pool. Esto hace que la reserva de token0 baje ligeramente y la reserva de token1 suba ligeramente. Como resultado, el precio de token0 debe subir (una pequeña cantidad).
En otras palabras, sea el precio antes del trade:
y después del trade:
donde es la cantidad de token1 que el trader pagó al pool y es la cantidad de token0 que el trader obtuvo del pool.
Las cantidades y , y su efecto en el precio, se muestran visualmente a continuación:
Independientemente de lo pequeños que sean y (siempre que no sean cero), se debe dar el caso de que
Por lo tanto, cualquier trade en un AMM, por pequeño que sea, cambia el precio.
Llamamos al cambio en el precio como resultado de un trade el impacto en el precio.
Un gran impacto en el precio significa que el precio cambió significativamente y un pequeño impacto en el precio significa que el precio cambió en una cantidad mínima.
Ejemplos de impacto en el precio para diferentes niveles de liquidez
Para un trade de tamaño fijo, cuanto mayor sea la liquidez, menor será el impacto en el precio.
Esta sección muestra tres ejemplos del mismo trade (comprar 1 USDC usando USDT) en pools con niveles de liquidez crecientes.
Ejemplo 1: xy = 100
Supongamos que un pool contiene 10 USDC (token0) y 10 USDT (token1). Dado que , . Por lo tanto, la liquidez es 100.
Si un trader desea obtener 1 USDC, debe disminuir la reserva de USDC de 10 USDC a 9 USDC.
Entonces debe introducir suficientes USDT para que 9 * new_reserve_usdt = 100 (ignorando comisiones). Resolviendo para new_reserve_usdt, obtenemos 11.11. Como la reserva original de USDT era 10, el trader debe introducir 1.11 USDT para obtener 1 USDC. Si miramos el precio de USDC después del trade, obtenemos:
Como resultado de comprar 1 USDC, el precio de USDC pasó de 1 USDT a 1.234 USDT.
Llamemos al precio inicial de 1USDT : 1USDC el precio inicial.
El precio final es 1.234USDT : 1USDC. El impacto en el precio es de 0.234, o un aumento del 23.4% del precio original.
Visualizamos el impacto en el precio de este trade a continuación.
El precio comienza en la intersección entre el rayo verde punteado y la curva de precio azul. El rayo verde se grafica con , ya que los activos comienzan al mismo precio. El precio final se encuentra donde el rayo rojo se intersecta con la curva de precio azul. El impacto en el precio es bastante visible aquí (el gráfico está a escala):

(Asumimos que ambos tokens tienen la misma cantidad de decimales, por lo que los decimales pueden ser ignorados).
Ejemplo 2: xy = 10,000
Ahora, supongamos que el pool contiene 100 USDC y 100 USDT. Dado que , . La liquidez aumentó 10 veces en comparación al ejemplo anterior.
Si un trader desea obtener 1 USDC, debe disminuir la reserva de USDC de 100 USDC a 99 USDC. Entonces debe introducir suficientes USDT para que 99 * new_reserve_usdt = 10_000. Resolviendo para new_reserve_usdt, obtenemos 101.01. Como la reserva original de USDT era 100, el trader debe introducir 1.01 USDT para obtener 1 USDC. Si miramos el precio de USDC después del trade, obtenemos:
Como resultado de comprar 1 USDC (cuando las reservas comenzaron en 100 USDC y 100 USDT), el precio de USDC pasó de 1 USDT a 1.02 USDT, resultando en un aumento del 2% en el precio.
En este ejemplo y en el anterior, el trader obtuvo 1 USDC. Sin embargo, el impacto en el precio en este ejemplo es mucho menor (23 centavos antes vs 2 centavos aquí). Como consecuencia adicional, el precio que el trader pagó por 1 USDC es menor, 1.01 USDT, comparado con 1.11 USDT en el primer ejemplo.
Cuando la liquidez del AMM aumenta, el impacto en el precio disminuye.
El impacto en el precio en este ejemplo es notablemente menor:

Ejemplo 3: xy = 1 trillón
Para dejar el punto claro, supongamos que las reservas son de mil millones de USDC y mil millones de USDT, y la liquidez es de 1 trillón ().
Sugerimos al lector que intente resolver el impacto en el precio antes de leer el cálculo a continuación.
Si un trader desea obtener 1 USDC, debe disminuir la reserva de USDC de mil millones de USDC a 999,999,999 USDC. Entonces debe introducir suficientes USDT para que 999,999,999 * new_reserve_usdt = 1 trillón (mil millones mil millones). Resolviendo para new_reserve_usdt, obtenemos 1,000,000,001.000000001. Como la reserva original de USDT era de mil millones, el trader debe introducir 1.000000001 USDT para obtener 1 USDC. Si miramos el precio de USDC después del trade, obtenemos:
El precio de USDC en términos de USDT aumentó, pero en una cantidad muy pequeña.
Por lo tanto, cuando la liquidez es extremadamente grande en relación con el tamaño del trade, el impacto en el precio es apenas perceptible.
Liquidez Eficiente en Capital
Los traders prefieren tener un pequeño impacto en el precio, pero los proveedores de liquidez no quieren proveer una gran suma de dos mil millones de dólares para lograrlo.
Queremos lograr una alta liquidez sin una demanda de capital tan alta.
Queremos que nuestra liquidez sea eficiente en capital.
Para hacer que nuestra liquidez sea eficiente en capital, explotamos el hecho de que conocemos el precio “esperado” del trade. Específicamente, tanto USDC como USDT están vinculados al Dólar Estadounidense, por lo que se espera que se intercambien a 1:1.
Sin embargo, debido al impacto en el precio, USDC y USDT no se intercambian a 1:1 — este es el problema que estamos intentando minimizar. Pero queremos minimizar el impacto en el precio al mismo tiempo que suministramos mucho menos que dos mil millones de dólares en reservas.
Dado que esperamos que el precio de trade sea 1:1 o cercano a este, esperamos que la mayoría de los trades ocurran en la región donde las reservas son iguales entre sí, como se visualiza a continuación. Si el precio sale de esta región, entonces los arbitrajistas comprarán la stablecoin más barata y la venderán en un exchange. Por lo tanto, podemos esperar que la mayoría de los trades ocurran en la región roja a continuación:

Liquidez desperdiciada
Tal como se modela en la curva anterior, Uniswap V2 soporta trades en el rango de precios de esencialmente 0 a infinito. Distribuir la liquidez en un rango de precios tan amplio desperdicia liquidez porque la mayor parte de ella no se utilizará, especialmente en el caso de un par de stablecoins.
Sería mejor eliminar la capacidad de permitir el trading a precios extremos a cambio de una mejor liquidez en la región donde esperamos que ocurran los trades.
Concentrando la liquidez
¿Qué pasaría si pudiéramos “eliminar” la liquidez de las regiones donde no esperamos que ocurra el trading y agregar la liquidez a la región esperada?
Para usar números concretos como ejemplo, supongamos que queremos que nuestro AMM tenga alta liquidez por encima del precio de 0.99:1 (99 centavos de Tether por un USDC) y por debajo del precio de 1.01:1 (1.01 Tether por un USDC). Recuerda que el precio aumenta a medida que nuestra ubicación en la curva se mueve hacia arriba y a la izquierda.
Si ponemos una declaración if en esos límites de precio, podríamos hacer que la curva de nuestro AMM se vea como la siguiente función a trozos (piecewise function):
Si graficamos la ecuación a trozos anterior, obtenemos lo siguiente:
Dado que tenemos una liquidez mucho mayor en el rango de precios donde esperamos que se operen las stablecoins, esperamos un cambio de precio significativamente reducido en esa región. Redujimos el impacto en el precio para la mayoría de los trades sin requerir más capital.
Por supuesto, nada es gratis. Si el precio se desvía fuera del límite [0.99, 1.01], entonces la liquidez cae estrepitosamente. Para crear un pool competitivo, necesitamos establecer los límites de manera óptima. Tampoco es obvio que 0.99 y 1.01 sean los límites óptimos. Ni es obvio que multiplicar y dividir la liquidez por un factor de 10 sea la escala correcta.
Cómo implementa Uniswap V3 la Liquidez Concentrada
Para hacer las cosas flexibles al permitir que los LPs decidan los límites ideales y la cantidad para ubicar la liquidez, Uniswap V3 no usa un factor de escala en absoluto. Dentro de ciertos límites de precio, será la liquidez que los LPs proporcionen allí. Es decir, los proveedores de liquidez pueden elegir entre una variedad de regiones de precios donde pueden proveer liquidez.
Señalamos al principio de este artículo que la liquidez es proporcional a la distancia de la curva de precio desde el origen.
Por lo tanto, dado que la liquidez varía para diferentes rangos de precios, la curva de precio de un pool de Uniswap V3 podría verse como el siguiente gráfico.
Aunque las curvas parecen ser discontinuas, el precio (representado con el rayo naranja) puede hacer una transición suave entre cada “mini curva de Uniswap V2”. Cada una de las “subcurvas” tiene la forma , pero es diferente para cada subcurva. El valor de para una subcurva dependerá completamente de cuánta liquidez hayan colocado los LPs allí. A medida que la liquidez para ese segmento aumenta, su distancia desde el origen aumenta. Dado que las curvas tienen diferentes liquideces, sus distancias desde el origen varían.
Aumentar significa que el proveedor de liquidez proporcionó la combinación correcta de token y token para empujar la curva hacia afuera. En la práctica, los LPs especifican una liquidez, y luego Uniswap V3 calcula la cantidad de y que el LP necesita proveer. La cantidad de y que contenga ese segmento variará dependiendo de los swaps que ocurran en esa región. Por ahora no tenemos que preocuparnos por las cantidades de y para cada subcurva, solo de que su producto es . Esto se discutirá más a fondo en los siguientes capítulos.
Para mantener la contabilidad simple, los LPs no pueden proveer liquidez en límites de precios arbitrarios, sino en precios predefinidos llamados ticks. Recuerda que el precio es proporcional al ángulo de un rayo desde el origen hasta el punto de precio en la curva. Por lo tanto, podemos visualizar los ticks como lugares donde la curva de precio se intersecta con rayos predefinidos desde el origen:

Cómo se eligen y se espacian estos ticks es el tema de un capítulo posterior.
El invariante de Uniswap V3
Uniswap V3 puede conceptualizarse usando el siguiente invariante:
Ese invariante permite a los LPs proveer diferente liquidez entre varios ticks. Por ende, los valores varían en diferentes puntos de la curva.
La siguiente herramienta interactiva muestra cómo cambiar para diferentes segmentos cambia la distancia de ese segmento desde el origen. A pesar de que las curvas no se “tocan entre sí”, el precio aún puede moverse suavemente entre subcurvas (a menos que para un segmento en particular, en cuyo caso ese segmento se omite). En la práctica, los segmentos son mucho más pequeños de lo que se muestra en la herramienta a continuación:
La fórmula a trozos es solo ilustrativa
En la práctica, no es eficiente en gas comprobar el precio contra tantos casos potenciales como lo hacemos en la fórmula anterior. De manera similar, llevar el registro de tantos valores de es costoso.
Por lo tanto, Uniswap V3 logra la fórmula a trozos anterior utilizando un mecanismo alternativo que es tan complejo que es el tema de aproximadamente la mitad de este libro. El mecanismo será revisado en capítulos posteriores.
Sin embargo, si visualizamos la curva de Uniswap V3, se ve como la curva mostrada arriba.
Ejercicio: Mueve los controles deslizantes en la imagen para que todos tengan el mismo valor de . Nota que esto produce una curva que es idéntica a una curva de Uniswap V2, excepto que la curva no se extiende al infinito y a 0.
Cómo se distribuye la liquidez en la práctica
Es posible que algunos valores de para diferentes segmentos sean los mismos. Por ejemplo, podría darse el caso de que . También podría darse el caso de que algunos de los valores de sean cero si no se colocó liquidez en ese rango de precios.
Cada depende completamente de dónde los LPs eligieron agregar liquidez.
Sin embargo, los LPs tenderán a colocar liquidez alrededor de donde esperan que ocurran los trades, porque Uniswap V3 solo recompensa a los LPs con comisiones de swap si su liquidez es realmente utilizada (cómo se contabiliza esto se discute en un capítulo posterior).
En la grabación de pantalla a continuación, vemos la interfaz de usuario para LPs de Uniswap V3 del pool ETH/USDC V3 en Base. La línea vertical gris es el precio actual, y las dos líneas azules son el precio predefinido inferior y superior donde Uniswap V3 permite a los LPs agregar liquidez. Nota que las líneas azules no pueden establecerse en ubicaciones arbitrarias, sino solo en precios predefinidos.
Aquí hay un gráfico que muestra cómo podría verse una curva de Uniswap V3 para un pool de dos stablecoins.

Un precio de 1:1, que esperamos para un par de stablecoins, corresponde al rayo de 45 grados donde la proporción de las reservas es igual a 1. Por lo tanto, la liquidez termina concentrada alrededor de la región central donde la proporción de reservas es de 1 a 1:
A continuación hay una captura de pantalla de cómo Uniswap V3 visualiza la liquidez concentrada. En el pool de USDC / USDT a continuación, vemos que hay alta liquidez alrededor del precio 1.000, que es donde los LPs esperan que ocurran los trades:

(El gráfico anterior se puede encontrar yendo al pool USDC/USDT en mainnet, y luego haciendo clic en “Add Liquidity”)
Para un pool donde token0 es más caro que token1, la liquidez tenderá a estar más concentrada alrededor de ese precio:

Si el precio de mercado cambia significativamente, entonces los proveedores de liquidez retirarán su liquidez y la colocarán alrededor del nuevo precio para capturar las comisiones de los swaps.
Cruzar ticks no causa interrupciones
Aunque la curva es discontinua, un trader todavía puede operar sin problemas entre los ticks. Una vez que se cruza un tick, Uniswap V3 recalcula la cantidad de liquidez disponible para el resto del trade como muestra la siguiente animación:
Cuando el precio cruzó el tick, las reservas saltaron repentinamente hacia arriba porque el swap entra en una región donde la liquidez es mayor, y por lo tanto, las reservas son mayores. Este salto en las reservas refleja la cantidad incrementada de reservas que los LPs pusieron previamente en ese rango de precios.
Conclusión
A pesar de lo intimidante que pueda parecer el código base de Uniswap V3, el mecanismo resultante es muy simple a un alto nivel.
Uniswap V3 tiene los mismos mecanismos fundamentales que Uniswap V2:
- Los LPs pueden agregar y retirar liquidez, aunque en la V3 tienen más opciones sobre dónde proveer la liquidez.
- Los swappers pueden intercambiar un token por otro.
- Ambos protocolos proporcionan un oráculo para rastrear y recuperar precios anteriores.
La curva de Uniswap V3 es una curva de Uniswap V2 donde la liquidez potencialmente cambia en precios preestablecidos (ticks), dependiendo de cómo los LPs colocaron su liquidez.
Dicho diseño permite a los LPs concentrar su liquidez alrededor de lo que creen que es el precio de mercado del activo. Con mayor liquidez, los traders obtendrán un menor impacto en el precio, lo que hace de ese pool una opción más competitiva para los traders.