Uniswap V3 工厂以及 Tick 间距与手续费之间的关系

本文介绍了 Uniswap V3 中 tick spacing 的概念及其与交易手续费、资产波动率之间的关系。Tick spacing 决定了流动性池中允许使用的最小价格间隔,影响交易 gas 成本和流动性提供者的流动性集中程度。文章还阐述了手续费档位与 tick spacing 之间的对应关系,以及 Uniswap 如何通过治理来调整这些参数。

在前面的章节中,我们介绍了 tick(价格跳动) 的概念,它将价格曲线离散化。一个 tick 是由公式 p(i)=1.0001i 定义的价格,其中 i 被称为 tick index(价格跳动指数)

Tick index 是 范围 [−887272,887272] 内的整数,从而在价格曲线上产生 1,774,545 个价格跳动,从 p(−887272) 到 p(887272)。

Tick 是曲线上流动性可能发生变化的点。例如,流动性提供者可以在两个价格跳动之间增加流动性,但不能在两个不是价格跳动的任意点之间增加流动性。

我们将在本章中看到,并非所有这 1,774,545 个价格跳动都可以在一个池中使用,并且可以使用的特定价格跳动取决于创建池时做出的选择。

Tick 间距

每个池定义一个称为 tick spacing(价格跳动间距) 的值,它决定了两个连续允许的 tick 之间的距离。

例如,如果池的 tick 间距设置为 10,则只有 10 的倍数的 tick index 可用,例如 -20、-10、0、10、20 等。如果 tick 间距设置为 60,则只允许 60 的倍数,例如 -120、-60、0、60、120 等,如下图所示。在这两种情况下,像 55 这样的 tick 都不能用作提供流动性的边界。

Ticks not allowed between spacing

定义池中 tick 间距的变量名为 tickSpacing,并在创建池时进行设置。实际上,tickSpacing 与池费用相关联,每个费用层级决定了一个相应的 tick 间距。

波动性、费用层级和 Tick 间距之间的关系

Tick 间距和波动性

Uniswap V3 支持不同的 tick 间距,以适应资产对的不同波动性。在一次 swap 中跨越一个 tick 会产生 gas 成本,因此在典型的交易过程中,应该尽可能减少 tick 的跨越。

波动性较大的交易对,受益于更宽的 tick 间距,以减少过多的 tick 跨越。但是,如果间距太宽,流动性提供者就无法将其流动性精确地定位在他们期望交易对市场价值所在的價格区域附近。

请看下面的动画,我们展示了两种情况。在第一种情况下,涉及一个高度波动的交易对,价格可能会发生显著变化。因此,如果我们想尝试将swap限制为仅跨越两个允许的 tick,则允许的 tick 之间的距离必须很大。在第二种情况下,涉及一个更稳定的交易对,tick 间距可以更小。

https://img.learnblockchain.cn/2025/04/26/volatility.mp4

波动性和费用

此外,还要考虑流动性提供者遭受无常损失的风险。高度波动的资产往往会导致更高的无常损失,而更稳定的资产往往会导致更低的无常损失。例如,稳定币对几乎没有无常损失的风险,而 meme 代币对则具有极高的风险。

因此,LP 将要求更高的费用,以弥补为高度波动的资产提供流动性时产生的无常损失。同样,交易者可以容忍波动性资产的更高费用,因为交易这些资产的潜在回报要高得多。

这表明交易对波动性、tick 间距和费用之间的关系应如下所示:对于具有高无常损失风险的波动性交易对,tick 间距和费用都应较高,而对于具有低无常损失风险的更稳定的交易对,两者都可以较低。

由用户决定哪些交易对更稳定或更不稳定。协议定义的是 tick 间距和费用层级之间的关系。

Uniswap V3 工厂合约提供了一些默认值,但 Uniswap 治理可以添加额外的 tick 间距-费用对。这是下一节的主题。

代码中的费用和 Tick 间距

费用和 tick 间距之间的关系包含在 UniswapV3Factory.sol 合约中的映射 feeAmountTickSpacing 中(下图中的黄色框)。工厂合约负责创建新的池。

费用和 tick 间距之间的初始关系是在部署工厂合约期间定义的,如下图中构造函数所示(绿色框)。

feeSpacingMapping code screenshot

当前的费用和 tick 间距之间的关系如下表所示。费用和 tick 间距之间没有严格的“数学”关系。确定给定 tick 间距的最佳费用由协议治理决定。

费用层级 费用层级(基点) Tick 间距
0.01% 1 1
0.05% 5 10
0.3% 30 60
1% 100 200

正如我们所看到的,0.01% 的费用对应于 1 的 tick 间距,而 0.3% 的费用对应于 60 的 tick 间距。

基点

费用以基点衡量。一个基点是 1% 的 1/100,即 0.01%。例如,5 个基点是 5 * 0.01%,即 0.05%。

费用层级可以更新

可以使用函数 enableFeeAmount 更新从费用到 tick 间距的映射,该函数只能由治理调用。

enable fee amount

1 个基点的层级(0.01% 的费用)不在构造函数中,但 Uniswap 治理 在 2022 年 3 月 5 日添加了 1 个基点的费用层级。你可以在 tally dashboard 上查看交易。

可用的费用层级在不同的链上可能会有所不同。例如,在 L2 Base 上,可以使用 2、3 和 4 个基点的费用层级。此添加由治理于 2024 年 9 月 16 日执行。

使用工厂合约创建一个新池

要创建一个新池,用户必须传入两个代币的地址和所需的费用层级。然后从 feeAmountTickSpacing 映射计算出 tick 间距。

一个池由这三个参数唯一确定。因此,可以创建具有相同代币对但费用层级不同的池。在这种情况下,市场决定了这些池中的哪个会成为“流行的”池。

通过工厂合约部署池

当池由工厂合约部署时,它会传递 feetickSpacing,并将它们设置为公共不可变变量。

create pool function

请注意,对于谁可以调用 createPool 没有限制——只要尚未创建该代币对和费用层级的池,它就是无需许可的。

这两个不可变变量(feetickSpacing)在 UniswapV3Pool.sol 中都是公共的。实际上,传递给池构造函数的所有参数都存储在公共不可变变量中:

code for fee and tick spacing

例子

让我们以 USDC/ETH 池 为例。我们可以看到费用为 5 个基点,tick 间距为 10:

fee and tickspacing variables in etherscan

这就是 该池的前端 如何知道费用层级为 0.05% 的原因。

uniswap v3 frontend displaying 0.05% fee

总结

  1. 并非池中的所有 tick 都可以使用——只允许那些是 tick 间距倍数的 tick。
  2. Tick 间距和费用之间的关系在 Factory 的映射中设置。治理可以添加更多的 tick 间距和费用选项。
  3. 频繁的 tick 跨越会导致更高的 gas 成本,我们将在研究 swap 时学习到这一点。因此,价格波动性较高和/或流动性较低的池应使用更大的 tick 间距,以最大限度地减少允许跨越的 tick 的频率。
  4. 另一方面,对于价格波动性较低和/或流动性高的交易对,tick 间距可以更小,因为流动性提供者可以更清楚地了解在哪里集中他们的流动性。

练习

浏览 Uniswap V3 池

  • 主网上 USDC/USDT 的 tick 间距是多少?由于可能存在具有相同交易对但费用不同的多个池,因此请查找过去一天交易量至少达到一百万美元的池。
  • 持有 meme 代币的交易对的 tick 间距是多少?
  • 原文链接: rareskills.io/post/unisw...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/