Uniswap v3不是把全池手续费平均分给所有LP。只有当前价格位于头寸区间内时,该头寸的流动性才参与swap并累计对应代币费用。价格离开区间后,头寸停止赚取新手续费,但已有费用仍可领取。
四组变量各自表示什么
池为token0和token1分别维护全局fee growth;每个tick记录跨越该边界时的outside增长;根据当前tick与头寸上下界,可计算区间内部的feeGrowthInside;头寸再保存上次结算的inside值、流动性和tokensOwed。
概念上,本次新增费用等于“当前区间内增长减去头寸上次记录”乘以流动性,再按定点精度缩放。token0和token1必须分别计算,不能先换成美元再反推链上tokensOwed。
| 字段层级 | 作用 | 不能直接当成 |
|---|---|---|
| feeGrowthGlobal | 全池累计增长 | 某个头寸收益 |
| feeGrowthOutside | tick边界外侧快照 | 区间内费用本身 |
| 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。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。