看了多遍文章,把自己的理解梳理了下重新描述了一遍
V2 中手续费的提取很直接:根据 LP 提供者手中的 LP token 在总量的占比,提取出池子中对应比例的两种代币,这时候获得代币总量中包含了手续费和开始时投入的代币(忽略无常损失)。
在 V3 中采用了自选区间,通过头寸进行记录流动性,通过计算区间内每单位流动性获得手续费和用户流动性得到应该获得的手续费。
想要计算区间内单位手续费,首先需要知道的是当前区间有多少流动性,因此 V3 在tick
上设置了两个变量liquidityGross
、liquidityNet
(计算区间内流动性就是计算两个tick
间的流动性)。
liquidityGross
:当该tick
被设置为区间上限或下限时就会增加,当其为 0 时,表示该tick
没有人设置区间(计算区间流动性时忽略,当这个tick
不存在)。liquidityNet
:记录流动性的变化量,即一个$\Delta$值,每当穿过这个tick
值时需要改变的当前激活流动性大小(从tick
右边穿过加,反之减)。
liquidityNet
计算方法:
- 注入流动性,tick 是价格下限,
liquidityNet
减少l
- 注入流动性,tick 是价格上限,
liquidityNet
增加l
- 移除流动性,tick 是价格下限,
liquidityNet
增加l
- 移除流动性,tick 是价格上限,
liquidityNet
减少l
通过上述变量,我们便获得了当前区间的激活流动性,根据交易中产生的手续费,我们可以得到因为这笔交易产生的每单位流动性手的续费收益。
那么后续如何做呢?如果直接记录到各个提供者账上,那么需要遍历该区间所有提供者(可想而知这会产生多少gas
,没人会想承担这个成本的),这个思路没了。
无需遍历的方法便是:新产生的手续费收益会修改的只有全局总收益(所有区间相加的手续费收益总和),而想计算当前交易区间内收益:全局收益 - 区间外收益(每次交易不会影响这个值)。
当然上述只是一个思路,那么具体一点如何设计呢?
V3 中设置了一个变量feeGrowthGlobal
记录全局单位手续费收益,利用每个tick
记录该tick
外的手续费feeGrowthOutside
。这样一来我们就能得到范围内的手续费:feeGrowthInside = feeGrowthGlobal - feeGrowthOutside
。
这里又有两个问题:如何为不同时间投入流动性的用户计算各自的收益?tick
如何记录外部手续费收益(怎么定义外部)?
首先是时间问题,投入流动性时,头寸记录当前区块手续费收益feeGrowthInside
,因为这是一个累加值,当取出时和当时的feeGrowthInside
比较增量,就知道该段时间内的收益了。
其次是外部收益记录问题,这里抛去了绝对的外部的定义(不再区分点的左边是外部还是右边是外部),而是通过当前价格点来调整这个外部值。假设当前价格点在tick
左边,tick
中记录了一个外部值,此时外部就是tick
的右边,里面的值就是tick
右边的收益。
当价格点穿过tick
时,tick
的左边就变为外部,tick
所记录的外部收益怎么算呢?feeGrowthOutside(新的) = feeGrowthGlobal - feeGrowthOutside(旧的)
。
把手续费收益看作图形面积,全局就是总面积,原本的就是点右边的图形总面积,相减后就是左边的总面积,而这左面积就包含了这期间交易产生的新的手续费收益。
关于tick
添加流动性时初始化,没找到相关资料,等以后看看白皮书再补充。
对于 LP 提供者提供的流动性是怎么定量计算的呢?
首先时原本的恒定乘积公式:$x * y = k = L^2$
用户指定区间,实际相当于讲这条曲线向左下方移动,使得 $x_1、y_1$ 作为与坐标轴相交的一段曲线 图片参考:Understand UniswapV3 whitepaper的图二图三
这就变成了一个新的公式(根据左加右减,上加下减):$(x + x1) * (y + y1) = L^2$
我们根据公式 $y = p x(p 为价格)$联合 $x y = L^2$ 得到 $x = L / \sqrt{p}\space;\space y = L \sqrt{p}$,所以 $x1 = L / \sqrt{p{upper}}\space;\space y_1 = L \sqrt{p_{lower}}$,所以我们可以得到
$$ (x + \frac{L} {\sqrt{p{upper}}}) (y + \frac{L} \sqrt{p{lower}}) = L^2 \ \space \ \space \ L = \sqrt{(x + \frac{L} {\sqrt{p{upper}}}) (y + \frac{L} \sqrt{p{lower}})} $$
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!