Uniswap v3手续费如何计算? 图 1
Uniswap v3手续费如何计算? · 图 1

Uniswap v3不是把全池手续费平均分给所有LP。只有当前价格位于头寸区间内时,该头寸的流动性才参与swap并累计对应代币费用。价格离开区间后,头寸停止赚取新手续费,但已有费用仍可领取。

四组变量各自表示什么

池为token0和token1分别维护全局fee growth;每个tick记录跨越该边界时的outside增长;根据当前tick与头寸上下界,可计算区间内部的feeGrowthInside;头寸再保存上次结算的inside值、流动性和tokensOwed。

概念上,本次新增费用等于“当前区间内增长减去头寸上次记录”乘以流动性,再按定点精度缩放。token0和token1必须分别计算,不能先换成美元再反推链上tokensOwed。

字段层级作用不能直接当成
feeGrowthGlobal全池累计增长某个头寸收益
feeGrowthOutsidetick边界外侧快照区间内费用本身
feeGrowthInsideLast头寸上次结算基线当前未领费用
tokensOwed已记账可领取数量全部头寸价值

为什么要看当前tick在哪边

计算下界以下、区间内部和上界以上三种状态时,outside值组合不同。直接用global减上下两个outside只在对应状态公式下成立。链上数值还使用固定宽度整数与溢出语义,自写索引器应按合约实现处理,而不是用有符号普通浮点数。

collect不会关闭头寸

collect把已经记账的token0和token1转给接收方,最多领取调用参数指定数量。它不移除流动性,也不销毁NFT头寸。若希望把最新增长计入tokensOwed,通常需要先触发头寸更新;SDK会封装流程,但数据分析必须区分“链上已记账”和“按当前池状态可推导”。

APR最容易被怎样算错

用一天手续费除以当前头寸美元价值会受到代币价格、区间宽度、是否在区间、资金增减和短期成交影响。未领取费用本身也以两种代币计价,价格变化可能让美元收益看似增加。可靠报表应保存起止区块、流动性变化、collect记录和两种代币数量,再选择一致价格源估值。

LP核验顺序

确认pool地址、token0/token1和fee tier;读取头寸tickLower、tickUpper与liquidity;固定同一块读取slot0和tick数据;分别计算两种代币fee growth;与DecreaseLiquidity和Collect事件交叉核对。界面显示值只能作为对照。

账面增长不等于已经领取

头寸NFT记录feeGrowthInside的检查点与tokensOwed。池的全局费用增长按Q128定点数累计,还需扣除当前tick区间外的增长,才能得到区间内费用;跨越tick时outside值会翻转,直接用全局差值会把不属于头寸活跃区间的费用算进去。collect只是把已记账的tokensOwed转出,若要包含最新增长,通常先触发一次position更新。

当前价格换算见Uniswap v3 tick与sqrtPriceX96,金库份额舍入风险可参考ERC-4626通胀攻击,交易日志解码见topics与data