Uniswap v3 utiliza dos tipos de reservas: reservas reales y reservas virtuales.
Las reservas reales representan la cantidad real de tokens presentes en un segmento.
Cada segmento tiene un par de reservas reales: las reservas reales en el token X, denotadas por , y las reservas reales en el token Y, denotadas por . Las reservas para uno de los tokens pueden ser cero, pero no para ambos — de lo contrario, no hay liquidez en el segmento.
Las reservas virtuales representan la cantidad de tokens que un segmento tendría si formara parte de una curva infinita — en otras palabras, si el segmento se extendiera hasta el infinito, como en Uniswap v2.
Comenzaremos este capítulo estudiando las reservas reales con más detalle, para luego pasar a las reservas virtuales.
Las reservas reales
Consideremos la siguiente ilustración, que muestra un solo segmento. El precio actual está representado por el rayo rojo. Este segmento tiene reservas reales en el token X e reservas reales en el token Y, como se muestra geométricamente en la ilustración.

La reserva real del token X es la distancia entre la coordenada x del precio y la coordenada x del tick superior. Lo mismo aplica para el token Y, pero ahora es la distancia en y hasta el tick inferior.
La razón de esta definición es que estamos tratando con un segmento de curva. Si la curva fuera infinita, los valores e serían iguales a e , respectivamente.
Una diferencia importante entre las reservas en un segmento —usadas en Uniswap v3— y en una curva infinita —usadas en Uniswap v2— es que, en un segmento, un token puede agotarse por completo.
Imagina que, a través de un swap, el precio se mueve a la posición mostrada en la imagen de abajo. En este caso, todos los tokens X serán retirados del segmento, y las reservas reales consistirán únicamente en tokens Y.

Otra posibilidad es que el precio se mueva completamente hasta el tick inferior, como se ilustra a continuación. En este caso, las reservas reales del segmento consistirán enteramente en el token X, y el segmento estará completamente agotado del token Y.

Tales agotamientos no son posibles en Uniswap v2 porque la curva es infinita, por lo que no hay ningún “límite” que alcanzar.
Un pool en un escenario del mundo real está compuesto por más de un segmento. Considera el escenario ilustrado a continuación: en este caso, el precio puede caer por debajo del segmento azul, entrando en el segmento violeta.

El segmento azul ya no tiene token Y para vender — sus reservas reales están únicamente en el token X —, mientras que el segmento violeta sí. Siempre que el precio actual se mantenga dentro de los límites de un segmento, dicho segmento contiene ambos tokens y pueden ocurrir swaps dentro de él.
La cantidad de tokens X en el segmento azul se mantiene en siempre que el precio siga siendo inferior al tick inferior.
Como se puede observar, las reservas reales de un segmento dependen del precio actual. La regla es la siguiente:
- Si el precio actual es mayor o igual al tick superior del segmento, las reservas reales estarán completamente en el token Y.
- Si el precio actual es menor o igual al tick inferior del segmento, las reservas reales estarán completamente en el token X.
- Si el precio actual está entre los ticks inferior y superior, habrá reservas reales en ambos tokens X e Y.
Cada segmento tiene sus reservas reales
Las reservas reales existen para cada segmento — es decir, cada segmento tiene un par de valores, e , uno de los cuales puede ser cero pero no ambos. Si ambos son cero, no hay liquidez y podemos descartar el segmento.
Considera la ilustración de abajo, que muestra tres segmentos: gris, morado y naranja (no se muestran otros segmentos posibles). El precio actual está indicado por el rayo rojo. Cada segmento tiene una cantidad para sus reservas reales.
- El segmento gris tiene reservas reales en el token X y no tiene reservas reales en el token Y.
- El segmento morado tiene reservas reales en el token X e reservas reales en el token Y.
- El segmento naranja tiene reservas reales en el token Y y no tiene reservas reales en el token X.

Si el precio actual se encuentra fuera de un segmento con liquidez, ese segmento necesariamente contiene un solo activo. Cualquier cambio de precio que no entre en el segmento en cuestión no afectará a las reservas reales de ese segmento.
Cuando el precio se mueve dentro de un segmento, los tokens X e Y se intercambian a través de swaps. Por lo tanto, cada segmento funciona como Uniswap v2 cuando el precio está dentro de él, pero se vuelve inactivo cuando el precio está fuera de él.
Pero las matemáticas de Uniswap v2 funcionan cuando el segmento es en realidad una curva infinita. Para poder tratar a cada segmento como si fuera una curva infinita —y por tanto que se comporte como Uniswap v2— introducimos el concepto de reservas virtuales.
Reservas virtuales
Las reservas virtuales son las reservas que tendría un segmento si formara parte de una curva infinita en lugar de ser solo un segmento. Para ilustrar esto, dibujemos una curva infinita, marcando con líneas punteadas las partes que quedan fuera del segmento.

Las reservas virtuales son las reservas como si estuviéramos en Uniswap v2 — en ese caso, serían las reservas del pool. Las reservas también son el punto donde el precio actual toca la curva.
La siguiente ilustración muestra tanto las reservas virtuales como las reales para el segmento.

La animación a continuación muestra que, a medida que el segmento de la curva crece, las reservas reales del segmento se acercan a las reservas virtuales. Si la curva se extiende hasta el infinito —como en Uniswap v2— las reservas virtuales y reales pasan a ser las mismas.
¿Por qué no necesitamos reservas virtuales y reales en Uniswap v2?
En Uniswap v2, dado que solo hay una única curva de precios infinita —y no varios segmentos de curva— las reservas reales y las reservas virtuales son iguales. Por lo tanto, las coordenadas representan tanto las reservas virtuales como las reales. No necesitamos distinguir entre ellas y podemos referirnos a ellas simplemente como reservas.
Los swaps en los segmentos ocurren de la misma manera que en Uniswap v2
Aunque las reservas virtuales no representan una cantidad real de tokens para un segmento —o para el pool—, son importantes porque, dentro de un segmento, queremos usar las mismas matemáticas de Uniswap v2. En otras palabras, queremos que cada segmento se comporte como si estuviéramos en una curva infinita —que es exactamente lo que proporcionan las reservas virtuales—. Podemos hacer esta simplificación siempre que un intercambio no provoque que el precio se mueva fuera del segmento.
Considera el swap ilustrado a continuación, en Uniswap v2. A la izquierda, el pool contiene tokens X e tokens Y, por lo que el precio es y la liquidez es .
Después de un swap (a la derecha), el precio pasa a ser ; las reservas en el token X cambian a y las reservas en el token Y cambian a . Por lo tanto, tokens X salen del pool e tokens Y entran al pool.

Ahora consideremos el mismo swap, pero esta vez en Uniswap v3, como se ilustra a continuación. Ya no tenemos una curva infinita —solo segmentos, como los tres mostrados: gris, violeta y naranja—. Supongamos que el swap ocurre en el segmento violeta, que tiene la misma liquidez que el ejemplo anterior.
Nota que todo sucede de la misma manera, ¡como si el segmento violeta fuera una curva infinita! El precio se mueve de a ; tokens X salen del pool, e tokens Y entran al pool.

Dentro de un segmento con liquidez , los swaps ocurren exactamente como si estuviéramos en una curva infinita con liquidez constante , al igual que en Uniswap v2. Las únicas dos diferencias son:
- Cuando el precio alcanza los límites del segmento, los swaps ya no pueden ocurrir en ese segmento —deben ocurrir en el siguiente segmento.
- Los valores e del segmento no representan la cantidad real de tokens en ese segmento —son las reservas virtuales del segmento.
Aparte de eso, seguimos usando las mismas definiciones que en Uniswap v2. El precio de un token está definido por , y la liquidez sigue la fórmula de producto constante .
La única diferencia es que reemplazamos por y definimos la liquidez como . La razón de esto quedará clara en una sección posterior.
Precio y liquidez en Uniswap v3
En Uniswap v3, definimos el precio como la proporción entre las reservas virtuales,
donde el precio siempre es el precio del token X.
La liquidez de un segmento está definida por la fórmula
Una herramienta interactiva para reservas reales y virtuales
A continuación se muestra una herramienta interactiva donde puedes ver las reservas reales y las reservas virtuales para un segmento determinado. Desliza el precio para ver cómo cambian las reservas a medida que se mueve el precio. También puedes ajustar la liquidez de los segmentos cambiando k1–k4 a continuación.
Calculando las reservas reales de un segmento
En las primeras secciones de este capítulo, vimos una representación visual de las reservas reales de un segmento. Ahora, queremos una fórmula para calcular las reservas reales cuantitativamente.
En Uniswap v2, las reservas dependen solo del precio y la liquidez. En Uniswap v3, este no puede ser el caso. Observemos la siguiente ilustración. Ambos segmentos, a la izquierda y a la derecha, tienen la misma liquidez, y estamos considerando el mismo precio, pero claramente, las reservas reales de la izquierda son mayores que las de la derecha.

En Uniswap v3, las reservas reales de un segmento dependen de la liquidez del segmento, del precio actual y de los límites del segmento —sus ticks superior e inferior—. Pospondremos la derivación de la fórmula para las reservas reales de un segmento hasta el próximo capítulo.
A continuación, mostraremos cómo calcular las reservas virtuales basándonos en la liquidez y el precio. Este paso es necesario antes de que podamos explicar más adelante cómo calcular las reservas reales.
Derivando las reservas virtuales a partir del precio y la liquidez
Ahora aprenderemos cómo calcular las reservas virtuales basándonos en el precio actual y la liquidez.
Derivando la reserva virtual
Comenzamos con las definiciones y , donde e son las reservas virtuales, es el precio y la liquidez.
Primero, dividamos por para derivar en función de y :
Derivando la reserva virtual
Multiplicando por , podemos encontrar la reserva de la siguiente forma:
Las fórmulas para las reservas virtuales
Derivamos las dos fórmulas que necesitamos: las reservas virtuales calculadas a partir de y :
¿Por qué utilizamos en lugar de al definir la liquidez?
Si hubiéramos definido la liquidez como en lugar de , las ecuaciones anteriores para e habrían dependido de en lugar de Esto se puede ver en la siguiente derivación, donde usamos en lugar de .
Uniswap v3 usa en lugar de para evitar la costosa operación de calcular la raíz cuadrada on-chain.
Motivación detrás de rastrear la raíz cuadrada del precio en lugar del precio
Usar nos permite evitar sacar la raíz cuadrada de para calcular e , y sería conveniente si pudiéramos hacer lo mismo para . Es decir, sería conveniente si pudiéramos calcular e a partir de y , en lugar de y .
Desafortunadamente, esto no es posible, ya que no queremos cambiar cómo se define el precio —queremos mantener la misma fórmula que en v2—. Por lo tanto, las reservas virtuales deben calcularse usando las fórmulas e .
Esto nos deja con dos opciones: o bien rastrear en el protocolo y sacar su raíz cuadrada on-chain para calcular las reservas, o rastrear directamente la raíz cuadrada de . La segunda opción es mucho más eficiente en cuanto a gas.
Por lo tanto, en lugar de rastrear el precio , el protocolo rastrea el valor como la variable sqrtPriceX96, evitando así la necesidad de calcular la raíz cuadrada del precio.
Resumen
- Uniswap v3 tiene dos tipos de reservas: reservas virtuales y reservas reales.
- Las reservas reales se definen por segmento e indican la cantidad de tokens que contiene ese segmento. Un segmento puede contener reservas reales de tokens X, de tokens Y, o de ambos.
- La cantidad de tokens en un segmento depende del precio actual. Si el precio actual es mayor o igual al tick superior, habrá reservas reales solo en tokens Y. Si es menor o igual al tick inferior, habrá reservas reales solo en tokens X. Si se encuentra entre los ticks superior e inferior, habrá reservas reales en ambos tokens.
- Las reservas virtuales son la cantidad de tokens que tendría un segmento si fuera una curva infinita —al igual que en Uniswap v2—. Utilizando las reservas virtuales, podemos aplicar las mismas matemáticas de Uniswap v2 en cada segmento de Uniswap v3.
- Uniswap v3 utiliza la fórmula en lugar de para evitar tener que calcular la raíz cuadrada de on-chain.
- Las reservas virtuales en función de y están dadas por e .