这意味着我们需要在质押合同中进行跟踪的是自池子开始时,就跟踪“每流动性秒数”这个指标的accumulator: 在Unipool合约中,这个accumulator 被称为 rewardPerTokenStored。当任何人质押或解押流动性(即改变 L 时,质押合约会通过增加accumulator 到先前的值来更新Sl accumulator。(从技术上讲,在Unipool合同及其大部分的分叉中,accumulator跟踪 R/L,而不是在后面乘以奖励率。) 当某人质押流动性时,合约会检查其累计值的初始值Sl(t0)。当他们以后解押时,合约将查看accumulator的新值Sl(t1)并计算该期间的奖励: Uniswap v1和v2不需要对这些激励措施的有任何内置支持,因为这些数字(accumulator和checkpointed values)仅在涉及质押合约时才会更改。 除了为收益农耕趋势奠定基础(在此过程中它被反复分叉),这种聪明的算法还具有相当多的用途。例如,Uniswap v3使用类似的算法来跟踪单个头寸赚取的费用(还有一些其他技巧来支持集中流动性)。它在链上是最有用的(效率很高),同时对简化链下计算也很有用。UNI追溯分配是基于一个查询,该查询在SQL中重新实现了该算法。 转入正题 Uniswap v3使情况复杂化,但并非无法解决。 如白皮书中所述,Uniswap v3支持集中流动性——流动性仅在当前的价格变动(ic)处于特定范围 内时才有效。 这意味着价格变动可以改变已抵押头寸的流动性余额,而不会涉及到抵押合同。对于具有 l 流动性的给定头寸,我们现在需要计算: 这可以分解为: 我们可以将其解释为secondsPerLiquidityInside = secondsPerLiquidity– secondsPerLiquidityBelow(lowerTick) - secondsPerLiquidityAbove(upperTick)。 可以使用上述相同的全局Sl accumulator来计算第一项。在Uniswap v3合约中,该全局accumulator与价格预言机一起被跟踪,如secondsPerLiquidityX128。 为了让我们能够计算其他两个项,每经历一个时刻,Uniswap v3检查点secondsPerLiquidityOutside()就会对该时点进行计算。“外部”是指与当前价格相对的价格变动。这让我们可以随时计算secondsPerLiquidity任何一方的应计总额。例如,如果tickCurrent < i,则secondsPerLiquidityBelow(i) = secondsPerLiquidity - secondsPerLiquidityOutside(i); 如果tickCurrent >= i,则secondsPerLiquidityBelow(i) = secondsPerLiquidityOutside(i)。(这与Uniswap v3跟踪和计算某时刻前后赚取的费用非常相似。) (责任编辑:admin) |