> ## Documentation Index
> Fetch the complete documentation index at: https://docs.krokoswap.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Tick 和范围

> V3 如何将价格离散化为 Tick 以实现集中流动性

# Tick 和范围

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

## Tick

Tick `i` 通过以下公式映射到价格：

$$
p(i) = 1.0001^i
$$

每个 Tick 代表相邻 Tick 之间 **0.01%（1 个基点）** 的价格变化。Tick 是从 `-887272` 到 `887272` 的整数。

| Tick   | 价格      |
| ------ | ------- |
| 0      | 1.0     |
| 1      | 1.0001  |
| 100    | 1.01005 |
| 10000  | 2.71828 |
| -10000 | 0.36788 |

## Tick 间距

并非每个 Tick 都可用 — 头寸必须对齐到由池费率等级决定的 **Tick 间距**边界：

| 费率等级  | Tick 间距 | 价格精度    |
| ----- | ------- | ------- |
| 0.01% | 1       | 每 0.01% |
| 0.05% | 10      | 每 0.10% |
| 0.3%  | 60      | 每 0.60% |
| 1%    | 200     | 每 2.02% |

创建头寸时，`tickLower` 和 `tickUpper` 必须是池 Tick 间距的整数倍。

## sqrtPriceX96

在链上，价格以 **sqrtPriceX96** 格式存储 — 价格的平方根乘以 2^96：

$$
\text{sqrtPriceX96} = \sqrt{p} \times 2^{96}
$$

这种编码方式可以在不使用浮点运算的情况下实现高效的定点算术。转换回可读价格：

$$
p = \left(\frac{\text{sqrtPriceX96}}{2^{96}}\right)^2
$$

## 价格范围

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

```mermaid theme={null}
flowchart LR
    A["tickLower"] --- B["◀ 头寸在此范围内赚取手续费 ▶"]
    B --- C["tickUpper"]
    D(("currentTick"))

    style A fill:#f59e0b,color:#fff
    style C fill:#f59e0b,color:#fff
    style B fill:#10b981,color:#fff
    style D fill:#ef4444,color:#fff
```

### 价格与 Tick 之间的转换

**价格转 Tick**：

$$
i = \lfloor \log_{1.0001}(p) \rfloor
$$

然后四舍五入到最近的可用 Tick（Tick 间距的整数倍）。

**Tick 转价格**：

$$
p = 1.0001^i
$$

### Token0 和 Token1

V3 将价格定义为 **token1 per token0**（`price = 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 会自动处理此转换。
