En el capítulo anterior, introdujimos dos conceptos nuevos: reservas reales y reservas virtuales. Las reservas reales de un segmento son la cantidad de tokens contenidos en ese segmento: tokens X, tokens Y, o ambos.
Las reservas virtuales son la cantidad de tokens que el segmento tendría si fuera parte de una curva infinita. Las reservas virtuales son necesarias porque los swaps en los segmentos de curva en Uniswap v3 se comportan exactamente igual que en Uniswap v2; es decir, como si los segmentos fueran realmente parte de una curva infinita en un pool en Uniswap v2.
También derivamos fórmulas para calcular las reservas virtuales de un segmento basadas en el precio y la liquidez, pero lo que queremos es una fórmula para calcular las reservas reales de un segmento. Este es el objetivo principal de este capítulo.
Liquidez, Precio y reservas virtuales en Uniswap v3
En Uniswap v3, la liquidez y el precio se definen de la siguiente manera:
donde e son las reservas virtuales y es el precio del token X en unidades del token X.
Como vimos en el capítulo anterior, podemos invertir estas fórmulas y derivar las reservas virtuales e a partir de y , como:
Esta información no es suficiente para derivar las reservas reales de un segmento, ya que todos los segmentos con la misma liquidez y al mismo precio tendrán las mismas reservas virtuales, independientemente de sus límites.
Esto se puede observar en la animación a continuación, que ilustra dos segmentos con la misma liquidez al mismo precio. Sus reservas virtuales son iguales, pero sus reservas reales no lo son.
Por lo tanto, no podemos derivar las reservas reales solo a partir del precio y la liquidez; también se deben tener en cuenta los límites del segmento.
Las reservas reales de un segmento
Las reservas reales de un segmento son la cantidad de tokens disponibles para ser intercambiados en el segmento hasta que el precio alcance los límites del segmento.
Considera la situación ilustrada a continuación, donde el precio está dentro del segmento (lado izquierdo). En este momento, el pool tiene reservas reales en tokens X e reservas en tokens Y.

En el lado derecho de la imagen anterior, un swap hace que el precio se mueva al tick superior, y el pool ahora mantiene reservas solo en tokens Y, y ya no en tokens X.
Esto muestra que las reservas reales de tokens X en un segmento, , son la cantidad de tokens que saldrán del segmento durante un swap que mueva el precio al tick superior.
La misma lógica se puede aplicar a las reservas reales en tokens Y, pero ahora para un swap que mueve el precio al tick inferior, como se ilustra a continuación.

Las reservas reales de , , son la cantidad de tokens que saldrán del segmento durante un swap que mueva el precio al tick inferior.
Por lo tanto, si podemos calcular cuántos tokens X salieron del pool en el primer ejemplo, y cuántos tokens Y salieron del pool en el segundo, habremos derivado una fórmula para las reservas reales.
Y podemos hacer esto, porque sabemos cómo realizar estos cálculos en Uniswap v2, y dentro de un segmento, Uniswap v3 se comporta exactamente igual que Uniswap v2.
Derivando la fórmula para las reservas reales del token X
En el contexto de una curva infinita, podemos calcular fácilmente la cantidad de tokens X que salen del pool en un swap que mueve el precio. Consideremos que el precio comienza en y se mueve a , donde es el precio en el tick superior, como se ilustra a continuación.
A la izquierda, las reservas virtuales en X están dadas por (reservas virtuales en ). A la derecha, las reservas virtuales están dadas por (reservas virtuales en ). En Uniswap v2, estas son las reservas reales, de modo que tokens saldrán del pool en este swap.
Dado que Uniswap v3 tiene el mismo comportamiento que v2, entonces tokens saldrán del pool también en Uniswap v3: estas son las reservas reales en X de este segmento, .

Por lo tanto,
Y sabemos cómo calcular las reservas virtuales basándonos en la liquidez y el precio. Recuerda que . Así que por sustitución, tenemos que
Dado que es menor o igual a , siempre será positivo o cero. Las reservas reales de X se vuelven cero cuando alcanza el tick superior , como se esperaba.
Calculando cuando el precio actual no está dentro del segmento
Consideremos los casos donde no está dentro del segmento.
Precio actual por debajo del tick inferior
Si el precio actual está por debajo del tick inferior, las reservas reales del segmento son la diferencia entre las reservas virtuales en el tick inferior, , y en el tick superior, , como se ilustra a continuación. Este es el caso porque podemos suponer que eventualmente alcanzará , y los swaps de a no interfieren con el segmento; solo necesitamos tener en cuenta el swap de a .

Al sustituir , tenemos las reservas reales como:
Precio actual por encima del tick superior
Si el precio actual es mayor que el tick superior, el segmento no tiene reservas en el token X, por lo que las reservas reales son cero.
Como puedes ver, las reservas reales en tokens X no solo dependen del precio actual y la liquidez, sino también de los ticks superior e inferior.
Derivando la fórmula para las reservas reales del token Y
Para calcular las reservas reales en tokens Y de un segmento, seguiremos la misma estrategia que usamos para los tokens X. Consideremos la ilustración a continuación. Cuando el precio está en , tenemos tokens Y en el segmento (las reservas reales en Y), como se muestra a la izquierda, y las reservas virtuales se denotan con .
Un swap que mueva el precio al tick inferior eliminará todos los tokens Y del segmento. Por lo tanto, para calcular , solo necesitamos computar la cantidad de tokens Y que salen del segmento en un swap entre y .

El swap cambiará las reservas virtuales de a , por lo que las reservas reales en este caso se calculan como . Recordando que las reservas virtuales en tokens Y están dadas por , tenemos que
Dado que es mayor o igual que , siempre será positivo o cero. Las reservas reales en Y se vuelven cero cuando alcanza el tick inferior , como se esperaba.
Calculando cuando el precio actual no está dentro del segmento
Consideremos los dos casos en los que no está en el segmento.
Precio actual por encima del tick superior
Si el precio es mayor que el tick superior, las reservas reales en tokens Y, dadas por , se ilustran a continuación, donde son las reservas virtuales en Y para el tick superior e son las reservas virtuales en Y para el tick inferior.
Para calcular , necesitamos considerar un swap del tick superior al tick inferior , el cual llevará las reservas virtuales de a .

Por lo tanto, las reservas reales en tokens Y están dadas por:
Precio actual por debajo del tick inferior
Si el precio es menor que el tick inferior, no habrá reservas reales en tokens Y, por lo que será cero.
Calculando las reservas reales entre dos precios arbitrarios
Dados dos precios arbitrarios dentro de un segmento, siempre podemos calcular las reservas reales entre ellos; en otras palabras, la cantidad de tokens que necesitan ser intercambiados para pasar de un precio al siguiente. El razonamiento es el mismo que el anterior, donde calculamos las reservas reales de un segmento, pero no nos limitamos a usar el final del segmento como punto de detención de la operación.
Las reservas reales entre dos precios también dependerán de si el precio actual es mayor o igual al precio más alto, menor o igual al precio más bajo, o si se encuentra entre los dos.
Considera el cálculo de las reservas reales entre los precios y , donde , con el precio actual y la liquidez entre estos precios dada por . Los tres casos que necesitamos considerar se ilustran a continuación.
- El precio actual está por debajo del tick inferior
- El precio actual está por encima del tick superior
- El precio actual está entre los ticks superior e inferior

Las fórmulas serán las siguientes:
1. Precio actual por debajo del tick inferior
En este caso, todas las reservas reales del segmento están en tokens X.
2. Precio actual por encima del tick superior
En este caso, todas las reservas reales del segmento están en tokens Y.
3. Precio actual entre los ticks superior e inferior
En este caso, el segmento tiene ambos tokens X e Y.
El protocolo usa estas fórmulas para calcular la cantidad de tokens X o Y presentes entre dos precios, dada una liquidez .
Usando las fórmulas anteriores en los swaps
En Uniswap v2, el protocolo no necesita preocuparse por el precio final después de un swap; el precio final no está limitado, ya que la liquidez es constante y la curva de precio es infinita.
En Uniswap v3, los segmentos son finitos y por lo tanto tienen límites. Cuando ocurre un swap dentro de un segmento, el protocolo debe calcular cuántas reservas reales tiene ese segmento para determinar si la cantidad que el usuario quiere intercambiar se puede obtener completamente en ese segmento o solo parcialmente. Esto lo hace calculando la cantidad de tokens entre el precio actual y el límite del segmento: el tick superior si el usuario está comprando tokens X, o el tick inferior si el usuario está vendiendo tokens X.
En capítulos posteriores, estudiaremos en detalle cómo funciona el swap en Uniswap v3.
Las fórmulas que derivamos anteriormente se pueden encontrar en la biblioteca SqrtPriceMath.sol. Estas se pueden encontrar en las funciones getAmount0Delta y getAmount1Delta, cuyas firmas se muestran a continuación junto con sus comentarios NatSpec.
getAmount0Delta
Esta función calcula y devuelve la cantidad de tokens X entre dos precios: un precio inferior y un precio superior. El cuadro rojo en el texto muestra la fórmula que derivamos anteriormente para las reservas reales en tokens X, .
La función toma el precio inferior (sqrtRatioAX96), el precio superior (sqrtRatioBX96), la liquidez del segmento, y una bandera indicando si la cantidad debe redondearse hacia arriba o no.

getAmount1Delta
Esta función calcula y devuelve la cantidad de tokens Y entre dos precios: un precio inferior y un precio superior. Nuevamente, el cuadro rojo en el texto muestra la fórmula que derivamos anteriormente, ahora para las reservas reales en tokens Y, .

Resumen
- Las reservas reales de un segmento dependen no solo de la liquidez y el precio actual, sino también del tick superior e inferior.
- Dados dos precios y , para , las reservas reales en tokens X entre estos dos precios están dadas por , dentro de un segmento con liquidez y si el precio actual es menor o igual a .
- Dados dos precios y , para , las reservas reales en tokens Y entre estos dos precios están dadas por , dentro de un segmento con liquidez y si el precio actual es mayor o igual a .
Ejercicios
- Supongamos que el precio actual es el tick cero y hay un segmento con liquidez definido entre los ticks -10 y 10. ¿Cuáles son las reservas reales en el token X e Y para este segmento?
- Lo mismo para el problema (1), pero ahora el precio actual está por encima del tick 10.
- Lo mismo para el problema (1), pero ahora el precio actual está por debajo del tick -10.