El tick más pequeño en Uniswap v3 es -887,272 y el tick más grande es 887,272. Este capítulo explica la lógica detrás de este rango, la cual se basa en encontrar el tick que corresponde al precio más alto que puede almacenarse en el protocolo.
Límite de precio
En el capítulo anterior, vimos que el protocolo almacena la raíz cuadrada del precio del token como números de punto fijo del tipo Q64.96. Este tipo de variable tiene un valor entero máximo de . En consecuencia, el precio más alto que puede almacenar es .
Esto significa que el protocolo no puede manejar precios mayores a . En otras palabras, en Uniswap v3, un token nunca puede alcanzar un precio real que exceda los . Si no se respetara este límite, el token podría alcanzar un valor de precio que el protocolo no puede almacenar.
Por lo tanto, el tick más alto debe ser el tick correspondiente al precio para ser consistente con el precio más alto.
El índice de tick más alto
Para calcular el tick correspondiente al precio , recordemos que la relación entre los precios y los ticks está dada por
Esta relación se puede invertir aplicando el logaritmo en base 1.0001 a ambos lados.
porque para cualquier base .
La fórmula anterior nos permite calcular el índice del tick dado el precio .
Ahora, necesitamos determinar el índice del tick relativo al precio de token más alto posible, que es
Usando en la fórmula anterior, tenemos que
Este cálculo se puede realizar en Python como
from math import log
log(2**128,1.0001) # log_1.0001(2**128) = 887272
Por esta razón, el índice de tick 887,272 es el más alto utilizado por el protocolo, ya que los ticks mayores a 887,272 corresponden a precios superiores al valor máximo que puede ser almacenado por la variable sqrtPriceX96.
El índice de tick más bajo
El índice de tick más bajo se establece en -887,272, que es el negativo del tick más alto posible.
Esta simetría es deseable porque el precio del token X con respecto al token Y es el inverso del precio del token Y con respecto al token X. Por lo tanto, es deseable limitar el precio mínimo del token a , lo que corresponde al tick -887272.
Valores mínimos y máximos en el código base
Los índices de tick mínimos y máximos están codificados de forma fija como MIN_TICK y MAX_TICK en la biblioteca TickMath de Uniswap v3.
Los valores mínimo y máximo que puede asumir la variable sqrtPriceX96 también están codificados de forma fija como MIN_SQRT_RATIO y MAX_SQRT_RATIO, respectivamente. Esto se puede ver en la captura de pantalla a continuación, y estos valores se calcularán en una sección posterior.

Los ticks y la raíz cuadrada del precio
En el capítulo Introducción a los ticks en Uniswap v3, vimos que los ticks se definen mediante la siguiente fórmula,
donde son los índices del tick.
Es posible trabajar con la raíz cuadrada de los precios en lugar de con los precios mismos, y calcular la raíz cuadrada del precio para un índice de tick dado.
Para hacer esto, simplemente calculamos la raíz cuadrada de la fórmula anterior:
Por ejemplo, para calcular para el tick 100, tenemos . A partir de esta información, si queremos obtener (el precio para el tick 100), solo necesitamos elevarlo al cuadrado: .
Tengamos en cuenta que descartamos la raíz cuadrada negativa, manteniendo solo la positiva, ya que los precios no pueden ser negativos. Por lo tanto, siempre podemos recuperar de manera inequívoca el precio elevando al cuadrado la raíz cuadrada del precio.
La raíz cuadrada del precio más alta y más baja en Q64.96 permitidas en el protocolo
Los valores de MIN_SQRT_RATIO y MAX_SQRT_RATIO se pueden calcular de la siguiente manera:
El índice de tick mínimo es -887,272, por lo que la raíz cuadrada del precio mínima permitida está dada por . Esto se puede calcular como
Para convertir este valor a punto fijo en formato Q64.96, se necesita multiplicarlo por . Por lo tanto,
Una pregunta que surge es: ¿deberíamos redondear este valor hacia arriba o hacia abajo? Imaginemos que redondeamos hacia abajo, lo que significa que el valor más bajo posible para la variable sqrtPriceX96 es 4295128738. En otras palabras, es posible que sqrtPriceX96 alcance el valor de 4295128738.
Este valor, 4295128738, está ligeramente por debajo del tick -887272 (recordemos que el valor asociado con el tick -887272 es 4295128738.152353). Por lo tanto, si el precio alcanza 4295128738, el tick actual será el tick más cercano, redondeado hacia abajo. En otras palabras, será -887273. Sin embargo, el tick -887273 no está permitido, porque establecimos el tick -887272 como el mínimo.
Por lo tanto, concluimos que es necesario redondear hacia arriba. Es decir, el valor más pequeño que la variable sqrtPriceX96 puede asumir es 4295128739, tal como está codificado de forma fija en el código base.

Este cálculo se puede realizar en Python de la siguiente manera:
math.ceil(1.0001**(-887272/2)*(2**96)) # 4295128739
El cálculo para MAX_SQRT_RATIO es similar, pero esta vez usamos el valor más alto posible para el índice del tick, 887,272:
Este cálculo se puede hacer en Python, pero sufrirá una pérdida de precisión. En un capítulo posterior, veremos cómo Solidity realiza este tipo de cálculo de manera exacta, sin pérdida de precisión.
Por qué se usa int24 para los índices de los ticks
El número de bits requeridos para almacenar 887,272 es . Dado que también tenemos ticks negativos, necesitamos almacenar el doble de esa cantidad de ticks. Para contener tanto los números positivos originales como sus valores negativos, nuestra variable para el tick necesita soportar 21 bits.
Como Solidity solo soporta tamaños de int que son múltiplos de 8, este tamaño más pequeño de int que contendrá todos los ticks que necesitamos es int24. Por lo tanto, Uniswap V3 utiliza un int24 para contener los índices de los ticks (enlace al código), como podemos ver a continuación.

Resumen
- El índice de tick puede variar entre -887,272 y 887,272. Estos ticks representan los precios más bajos y más altos que un token puede asumir en el protocolo, respectivamente y .
- Los valores
MIN_SQRT_RATIOyMAX_SQRT_RATIOrepresentan la raíz cuadrada de los precios más pequeña y más grande permitida en el formato Q64.96, según lo definido por el protocolo. Estos valores están codificados de forma fija en el código base.