You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解Uniswap V3 swap手续费计算、feeGrowthOutside字段及相关公式

Uniswap V3 swap手续费计算逻辑说明

Uniswap V3手续费计算的核心设计是为了适配离散的集中流动性,不需要遍历所有活跃tick就能快速计算任意区间流动性应得的手续费,所有X128后缀的变量都是Q128格式的定点数,用于提升小数计算精度避免误差。


问题1:feeGrowthOutside(0/1)X128字段含义

首先池子全局维护两个变量:feeGrowthGlobal0X128、feeGrowthGlobal1X128,分别记录池子创建以来每单位流动性累计可获得的token0、token1手续费总额,会随每笔swap完成后实时更新。

Tick结构体中的feeGrowthOutside0X128、feeGrowthOutside1X128,代表该tick与当前活跃价格相反一侧的单位流动性累计手续费:

  • 若当前池子活跃价格所在的tick > 该tick,说明价格在该tick上方,该tick的feeGrowthOutside存储的是价格低于该tick时产生的累计手续费
  • 若当前池子活跃价格所在的tick < 该tick,说明价格在该tick下方,该tick的feeGrowthOutside存储的是价格高于该tick时产生的累计手续费

对应swap跨tick时的更新逻辑:当swap过程中价格穿过某tick时,该tick相对于活跃价格的上下侧发生反转,因此直接用当前全局的feeGrowthGlobal减去该tick原有的feeGrowthOutside,即可得到反转后对应侧的累计手续费值,赋值给feeGrowthOutside即可。


问题2:tick上下方对应公式逻辑

该组公式的作用是快速计算任意tick i下方/上方的累计单位手续费:

  • 定义feeGrowthBelow(i)为价格低于tick i时产生的单位流动性累计手续费
  • 定义feeGrowthAbove(i)为价格高于tick i时产生的单位流动性累计手续费

两者满足恒等式:feeGrowthBelow(i) + feeGrowthAbove(i) = feeGrowthGlobal

公式分支逻辑完全基于当前活跃tick(记为currentTick)和tick i的位置关系推导:

  1. 当currentTick >= i时,活跃价格在tick i的上方,说明所有低于i的价格区间产生的手续费都已经记录在feeGrowthOutside(i)中,因此:
    feeGrowthBelow(i) = feeGrowthOutside(i)
    feeGrowthAbove(i) = feeGrowthGlobal - feeGrowthOutside(i)
  2. 当currentTick < i时,活跃价格在tick i的下方,说明所有低于i的价格区间产生的手续费等于全局总额减去高于i部分的手续费(也就是feeGrowthOutside(i)),因此:
    feeGrowthBelow(i) = feeGrowthGlobal - feeGrowthOutside(i)
    feeGrowthAbove(i) = feeGrowthOutside(i)

基于以上逻辑,你要计算区间[lowerTick, upperTick]内的流动性累计应得手续费,只需要计算feeGrowthBelow(upperTick) - feeGrowthBelow(lowerTick),再乘以该区间的流动性总额即可,不需要遍历区间内所有tick,计算效率极高。


内容的提问来源于stack exchange,提问作者purplecity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 01:06:08