En los capítulos anteriores, vimos que el protocolo almacena la raíz cuadrada del precio en lugar del precio en sí. Por lo tanto, es necesario relacionar los ticks con la raíz cuadrada del precio en el formato de punto fijo Q64.96.
En este capítulo, exploraremos cómo convertir entre sqrtPriceX96 y ticks.
El protocolo almacena índices de tick
Un tick es un precio discreto, dado por la fórmula , donde es llamado el índice de tick o simplemente tick. Teniendo el índice de tick, es posible determinar de manera única el precio del tick, y viceversa. Dado que almacenar índices de tick ocupa menos bits que almacenar , el protocolo almacena índices de tick en lugar de precios de tick.
En este libro, utilizaremos los términos tick (precio) e índice de tick indistintamente. En el código base, las variables llamadas tick siempre se refieren al índice de tick .
Computar el índice de tick, dado sqrtPriceX96
Comenzamos recordando la relación entre la raíz cuadrada del precio y la variable sqrtPriceX96:
Así, la relación entre el precio y sqrtPriceX96 se obtiene elevando al cuadrado ambos lados.
Dado que la relación entre el precio y el índice de tick es , tenemos que
Para determinar el índice de tick en términos de sqrtPriceX96, tomamos el logaritmo en ambos lados de la ecuación anterior.
Un logaritmo siempre se toma con respecto a una base. Por ejemplo, si , entonces (el logaritmo se toma en base b). Sin embargo, el logaritmo en la ecuación anterior se puede tomar en cualquier base. La razón de esto se explica en la última sección de este capítulo.
El índice de tick es un valor discreto
En realidad, la fórmula anterior no es del todo correcta por una razón: sqrtPriceX96 es un valor continuo, mientras que el índice de tick i es discreto (un número entero). Por lo tanto, el valor necesita ser redondeado hacia abajo.
Esto se puede ver en la ilustración de abajo, donde usamos una herramienta que se puede encontrar en nuestro artículo sobre ticks. Note que mientras el precio cambia continuamente, el tick correspondiente para ese precio siempre es el que se encuentra inmediatamente por debajo de él.
Por lo tanto, la fórmula exacta para el tick es:
donde el símbolo significa redondear hacia abajo, por ejemplo, .
Computar sqrtPriceX96 dado el índice de tick
Para calcular la raíz cuadrada del precio a partir del índice de tick, comenzamos con la fórmula
Luego, tomamos la raíz cuadrada de ambos lados y multiplicamos por ,
De ticks a precio y viceversa en el código base
La conversión entre ticks y sqrtPriceX96 en Solidity es manejada por la biblioteca TickMath, la cual será estudiada en un capítulo separado debido a la complejidad de implementar logaritmos y raíces cuadradas en Solidity.
Contiene dos funciones: getSqrtRatioAtTick y getTickAtSqrtRatio, que realizan la conversión entre sqrtPriceX96 y su correspondiente índice de tick, así como lo opuesto. Esto se puede ver a continuación.

Vimos las matemáticas de estas fórmulas en la sección anterior. En esta sección, realizaremos este cálculo usando Python.
La función getSqrtRatioAtTick
La función getSqrtRatioAtTick en Python se puede escribir como:
def getSqrtRatioAtTick(i):
return math.sqrt(1.0001 ** i) * 2**96
Como ejemplo, el valor de sqrtPriceX96 para el precio límite superior se puede calcular usando getSqrtRatioAtTick(887272), resultando en 1.4614467034780703e+48, lo que corresponde (aproximadamente) a la constante MAX_SQRT_RATIO de la biblioteca TickMath.

Usando la biblioteca Decimal
Para obtener un resultado más preciso, podemos usar la biblioteca Decimal en Python. La misma fórmula, utilizando esta biblioteca, se codifica a continuación, junto con el valor calculado para MAX_SQRT_RATIO.
import math
from decimal import Decimal, getcontext
getcontext().prec = 50
def getSqrtRatioAtTick(i):
base = Decimal("1.0001")
exponent = Decimal(i)
sqrt_value = base ** (exponent / 2)
multiplier = Decimal(2) ** 96
return sqrt_value * multiplier
print(int(getSqrtRatioAtTick(887272))) # 1461446703485210103244672773810124308346321380902
La función getTickAtSqrtRatio
La función getTickAtSqrtRatio en Python se puede escribir como:
def getTickAtSqrtRatio(sqrtPriceX96):
return math.floor(2*math.log(sqrtPriceX96/2**96)/math.log(1.0001))
Como ejemplo, el tick correspondiente al límite inferior de sqrtPriceX96, 4295128739, se puede calcular usando getTickAtSqrtRatio(4295128739), resultando en el valor -887272, lo cual es lo esperado para el límite inferior de los ticks.
getTickAtSqrtRatio(4295128739) // -887272
Cambiando la base del logaritmo
Cuando derivamos la fórmula
mencionamos que el logaritmo puede estar en cualquier base. En la implementación de la fórmula en Python, usamos el logaritmo natural, pero también podríamos usar el logaritmo en base 10 o cualquier otro, lo cual produciría el mismo resultado.
La razón es una propiedad básica de los logaritmos que relaciona logaritmos en diferentes bases,
donde y son dos bases diferentes, y es el argumento del logaritmo que queremos calcular. Por ejemplo, al convertir un logaritmo de la base natural a base 10, tenemos
El truco es que el divisor, , depende solo de las bases y no del argumento. Supongamos que tenemos una fracción:
Si queremos convertir los logaritmos a una base arbitraria b, dividimos tanto el numerador como el denominador por . Sin embargo, dividir tanto el numerador como el denominador de una fracción por el mismo valor no tiene efecto en la respuesta final porque se cancela.
Hagamos esto explícito aplicando esta relación a nuestra fórmula para el índice de tick y convirtiendo de la base natural a base 10:
Como podemos ver, el factor de transformación se cancela y el cálculo es el mismo independientemente de la base.
Resumen
- El protocolo necesita convertir entre
sqrtPriceX96y el índice de tick. Esto se hace usando las funcionesgetSqrtRatioAtTickygetTickAtSqrtRatio, las cuales se encuentran en la bibliotecaTickMath. - Para convertir de
sqrtPriceX96al índice de tick, se debe usar la siguiente fórmula:
- Para convertir del índice de tick a sqrtPriceX96, se debe usar la siguiente fórmula:
Ejercicios Prácticos
Navegue por las Uniswap V3 Pools para encontrar la dirección del pool, luego abra la dirección en un explorador de bloques. Busque la variable pública slot0 y convierta el tick a precio y viceversa.

Compruebe que su cálculo se acerque a lo que proporciona Uniswap y luego convierta el sqrtPriceX96 a dólares.
Hágalo para los siguientes pools:
- USDC/ETH en
- ETH/USDC en Base
- WBTC/USDC en mainnet
Más adelante aprenderemos por qué no es seguro que un contrato consuma directamente los datos de sqrtPriceX96 (que puede darnos el precio) y tick desde slot0; en este momento esto es solo para practicar.