跳转到主要内容

Tick 和范围

V3 使用 Tick 系统将连续的价格空间离散化。每个 Tick 代表一个特定的价格点,流动性头寸由一个 Tick 范围定义。

Tick

Tick i 通过以下公式映射到价格: p(i)=1.0001ip(i) = 1.0001^i 每个 Tick 代表相邻 Tick 之间 0.01%(1 个基点) 的价格变化。Tick 是从 -887272887272 的整数。
Tick价格
01.0
11.0001
1001.01005
100002.71828
-100000.36788

Tick 间距

并非每个 Tick 都可用 — 头寸必须对齐到由池费率等级决定的 Tick 间距边界:
费率等级Tick 间距价格精度
0.01%1每 0.01%
0.05%10每 0.10%
0.3%60每 0.60%
1%200每 2.02%
创建头寸时,tickLowertickUpper 必须是池 Tick 间距的整数倍。

sqrtPriceX96

在链上,价格以 sqrtPriceX96 格式存储 — 价格的平方根乘以 2^96: sqrtPriceX96=p×296\text{sqrtPriceX96} = \sqrt{p} \times 2^{96} 这种编码方式可以在不使用浮点运算的情况下实现高效的定点算术。转换回可读价格: p=(sqrtPriceX96296)2p = \left(\frac{\text{sqrtPriceX96}}{2^{96}}\right)^2

价格范围

流动性头寸由 [tickLower, tickUpper] 定义:

价格与 Tick 之间的转换

价格转 Tick i=log1.0001(p)i = \lfloor \log_{1.0001}(p) \rfloor 然后四舍五入到最近的可用 Tick(Tick 间距的整数倍)。 Tick 转价格 p=1.0001ip = 1.0001^i

Token0 和 Token1

V3 将价格定义为 token1 per token0price = token1/token0)。地址较小的代币始终为 token0。 对于 KAS/USDC 池,其中 KAS 为 token0:
  • price = 0.05 表示 1 KAS = 0.05 USDC
  • tick ≈ -29959

最近可用 Tick

指定价格范围时,精确的 Tick 可能与池的 Tick 间距不对齐。使用最近可用 Tick
nearestUsableTick = round(tick / tickSpacing) × tickSpacing
API 和 SDK 会自动处理此转换。