Uniswap V3未领取奖励计算结果偏差问题排查求助
Uniswap V3未领取奖励计算偏差问题排查
你的计算逻辑核心错误出在CalculateCurrentFeeGrowthInside函数,没有按照Uniswap V3合约的实际规则分三种情况处理当前tick的位置,导致feeGrowthInsideCurrent计算错误,最终奖励数值偏差。
问题分析
Uniswap V3中,feeGrowthInside的计算需要根据当前pool的tick与仓位的tickLower、tickUpper的相对位置分三种场景:
- 当前tick ≥ tickUpper:仓位不在活跃区间,feeGrowthInside等于tickLower的外部增长减去tickUpper的外部增长
- 当前tick < tickLower:同样不在活跃区间,feeGrowthInside等于tickUpper的外部增长减去tickLower的外部增长
- 当前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
相关产品推荐
相关产品推荐

