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

Uniswap V3未领取奖励计算结果偏差问题排查求助

Uniswap V3未领取奖励计算偏差问题排查

你的计算逻辑核心错误出在CalculateCurrentFeeGrowthInside函数,没有按照Uniswap V3合约的实际规则分三种情况处理当前tick的位置,导致feeGrowthInsideCurrent计算错误,最终奖励数值偏差。

问题分析

Uniswap V3中,feeGrowthInside的计算需要根据当前pool的tick与仓位的tickLower、tickUpper的相对位置分三种场景:

  1. 当前tick ≥ tickUpper:仓位不在活跃区间,feeGrowthInside等于tickLower的外部增长减去tickUpper的外部增长
  2. 当前tick < tickLower:同样不在活跃区间,feeGrowthInside等于tickUpper的外部增长减去tickLower的外部增长
  3. 当前tick在[tickLower, tickUpper)之间:仓位在活跃区间,feeGrowthInside等于全局增长减去两个tick的外部增长之和

你的现有代码只处理了第三种场景,忽略了前两种情况,这是导致计算结果与平台/合约不一致的关键原因。

修正后的C#代码

private BigRational CalculateCurrentFeeGrowthInside(
    BigRational feeGrowthGlobal,
    BigRational feeGrowthOutsideUpperTick,
    BigRational feeGrowthOutsideLowerTick,
    int tickUpper,
    int tickLower,
    int tick)
{
    if (tick >= tickUpper)
    {
        // 当前tick高于上边界,仓位不活跃
        return feeGrowthOutsideLowerTick - feeGrowthOutsideUpperTick;
    }
    else if (tick < tickLower)
    {
        // 当前tick低于下边界,仓位不活跃
        return feeGrowthOutsideUpperTick - feeGrowthOutsideLowerTick;
    }
    else
    {
        // 当前tick在仓位区间内,仓位活跃
        return feeGrowthGlobal - feeGrowthOutsideLowerTick - feeGrowthOutsideUpperTick;
    }
}

额外检查点

  • 确保计算USDT奖励时,正确使用feeGrowthGlobal1X128、feeGrowthOutside1X128等对应token1的参数,不要和token0的参数混淆
  • 验证BigRational.Parse对X128格式大整数的解析精度,避免因数值溢出或截断导致的偏差
  • 确认GraphQL查询返回的liquidity、各个feeGrowth值都是最新的链上数据,没有使用过时的缓存数据

内容的提问来源于stack exchange,提问作者Bart van der Vliet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:17:03