加粗 为自己添加的内容
配套课程视频:【01 区块链金融课程简介】- B站
课程实验以及讲义:liangpeili/defi-practices - Github
完成的实验代码:
github.com/DestinyWei/…
github.com/DestinyWei/…
若有任何问题或错误,可在Notion评论或直接评论
完整笔记请查看 Notion 链接:dune-marten-78b.notion.site/85b1d29c863…
个人博客:Howe的个人博客
Uniswap V3
Uniswap V3 的改进
提高资金利用率**(集中流动性,即只针对某一个范围做流动性,而不是从无穷小到无穷大都做流动性)**,增加 LP 深度
增强价格预言机的方便性和准确性
灵活的手续费收取机制(0.05% / 0.3% / 1%)
Uniswap V2 的资金利用率
在 V2 中,当我们想要做流动性时需要添加 x 和 y 数量的代币才能实现,但实际参与点到池子流动性的代币数量只有 x r e a l x_{real} x re a l 和 y r e a l y_{real} y re a l ,除去这两个部分的资金部分一直都没有被使用到,因此在 V2 当中资金利用率不算很高
示例
假设当前处于 c 点的位置,x 表示 ETH,y 表示 DAI,两者的价格在 a 到 b 的范围内波动,在 V2 当中我们需要在 c 点投入 10 ETH 和 200 DAI,而在 V3 当中我们只需要在 c 点投入 x r e a l x_{real} x re a l 和 y r e a l y_{real} y re a l 数量即 5 ETH 和 100 DAI,此时资金的利用率翻了一倍
流动性提供的方式
在 V2 中提供流动性是可以从 0 到无穷进行提供,但代币的价格从 0 到无穷大的范围内波动的概率很低,一般只会在一个小的范围内波动。所以 V3 允许用户只在某一个小范围区间提供流动性,如图Ⅱ。当多个用户都在自己设定的小范围区间提供流动性时,系统的流动性会变成图Ⅲ
提供 LP 作为限价订单
我们可以像在中心化交易所那样通过做 LP 来做限价订单,区别在于中心化交易所的限价订单的价格是固定的,而 Uniswap 则需要你提供一个小范围
还是以前面的图为例,比如当前 ETH 价格在 c 点,我们预测 ETH 会跌即向 a 点移动,此时我们只需要提供 y r e a l y_{real} y re a l 数量的 DAI,而不用提供 x r e a l x_{real} x re a l 数量的 ETH。当 ETH 跌到超过 a 点的位置,我们投入的 DAI 便会全部换成 ETH,但如果 ETH 的价格又回到了超过了 a 点的位置,那么我们手里的 ETH 会全部换回 DAI
应用场景
稳定币的兑换(0.99 — 1.01)
Interest-bearing ASSET:xSushi/Sushi 等
固定收益债券
IDO
保险
影响
波动比例大 (Δ x x \frac{\Delta x}{x} x Δ x 和 Δ y y \frac{\Delta y}{y} y Δ y ,我们在 Uniswap V3 中提供的 x 和 y 都比较小,所以波动比例大)
无常损失高
LP 挖矿实现机制的更改
手续费计算复杂
LP Token:ERC20 → ERC721
Virtual Reserves
Virtual Reserves 其实就是前面我们所提到的在 V2 当中没有被利用到的资金量即 x v x_v x v 和 y v y_v y v
由上图我们可以推导出
x ∗ y = k = L 2 ⇒ L = k x = x r e a l + x v y = y r e a l + y v \begin{align}
&x*y=k=L^2 \Rightarrow L=\sqrt{k} \\
&x=x_{real}+x_v \\
&y=y_{real}+y_v
\end{align} x ∗ y = k = L 2 ⇒ L = k x = x re a l + x v y = y re a l + y v
给定 a,b,L 的情况下,求 x v x_v x v 和 y v y_v y v ,此时我们已经得知
{ x ∗ y = L 2 P = y x ⇒ { x = L P y = L ∗ P \left\{
\begin{aligned}
& x*y=L^2 \\
& P=\frac{y}{x}
\end{aligned}
\right.
\Rightarrow
\left\{
\begin{aligned}
& x=\frac{L}{\sqrt{P}} \\
& y=L*\sqrt{P}
\end{aligned}
\right. ⎩ ⎨ ⎧ x ∗ y = L 2 P = x y ⇒ ⎩ ⎨ ⎧ x = P L y = L ∗ P
在 b 点,其为范围的上限,此时 x r e a l = 0 x_{real}=0 x re a l = 0 ,所以
x = x r e a l + x v = L P b ⇒ x v = L P b x=x_{real}+x_v=\frac{L}{\sqrt{P_b}} \Rightarrow x_v=\frac{L}{\sqrt{P_b}} x = x re a l + x v = P b L ⇒ x v = P b L
在 a 点,其为范围的下限,此时 y r e a l = 0 y_{real}=0 y re a l = 0 ,所以
y = y r e a l + y v = L ∗ P a ⇒ y v = L ∗ P a y=y_{real}+y_v=L*\sqrt{P_a} \Rightarrow y_v=L*\sqrt{P_a} y = y re a l + y v = L ∗ P a ⇒ y v = L ∗ P a
将 x v x_v x v 和 y v y_v y v 代入 (6) 可得
( x r e a l + x v ) ∗ ( y r e a l + y v ) = L 2 ( x r e a l + L P b ) ∗ ( y r e a l + L ∗ P a ) = L 2 \begin{aligned}
(x_{real}+x_v)*(y_{real}+y_v)=L^2 \\
(x_{real}+\frac{L}{\sqrt{P_b}})*(y_{real}+L*\sqrt{P_a})=L^2
\end{aligned} ( x re a l + x v ) ∗ ( y re a l + y v ) = L 2 ( x re a l + P b L ) ∗ ( y re a l + L ∗ P a ) = L 2
根据最后得出的公式,我们可以得到下面的图:
虚拟流动性案例分析
注意:因为 P P P 是使用 y x \frac{y}{x} x y 来计算的,所以 P P P 的单位应该是 DAI / ETH 即一个 ETH 等于多少 DAI
当前价格在 c 点,求 x v x_v x v 和 y v y_v y v
x v = L P b = 20 10 16000 = 0.5 E T H y v = L ∗ P a = 20 10 ∗ 1000 = 2000 D A I \begin{aligned}
&x_v=\frac{L}{P_b}=\frac{20\sqrt{10}}{\sqrt{16000}}=0.5 ETH \\
&y_v=L*\sqrt{P_a}=20\sqrt{10}*\sqrt{1000}=2000 DAI
\end{aligned} x v = P b L = 16000 20 10 = 0.5 ET H y v = L ∗ P a = 20 10 ∗ 1000 = 2000 D A I
在 c 点,y r e a l x r e a l = 4000 \frac{y_{real}}{x_{real}}=4000 x re a l y re a l = 4000 的时候,求 x r e a l x_{real} x re a l 和 y r e a l y_{real} y re a l
{ ( x r e a l + 0.5 ) ∗ ( y r e a l + 2000 ) = 4000 y r e a l x r e a l = 4000 ⇒ { x r e a l = 0.5 y r e a l = 2000 \left\{
\begin{aligned}
&(x_{real}+0.5)*(y_{real}+2000)=4000 \\
&\frac{y_{real}}{x_{real}}=4000
\end{aligned}
\right .
\Rightarrow
\left\{
\begin{aligned}
&x_{real}=0.5 \\
&y_{real}=2000
\end{aligned}
\right . ⎩ ⎨ ⎧ ( x re a l + 0.5 ) ∗ ( y re a l + 2000 ) = 4000 x re a l y re a l = 4000 ⇒ { x re a l = 0.5 y re a l = 2000
在 b 点,y r e a l x r e a l = 8000 \frac{y_{real}}{x_{real}}=8000 x re a l y re a l = 8000 的时候,求 x r e a l x_{real} x re a l 和 y r e a l y_{real} y re a l
x = x r e a l + x v ⇒ 0.5 = x r e a l + 0.5 ⇒ x r e a l = 0 E T H y = y r e a l + y v ⇒ 8000 = y r e a l + 2000 ⇒ y r e a l = 6000 D A I \begin{aligned}
&x=x_{real}+x_v \Rightarrow 0.5=x_{real}+0.5 \Rightarrow x_{real}=0 ETH \\
&y=y_{real}+y_v \Rightarrow 8000=y_{real}+2000 \Rightarrow y_{real}=6000 DAI
\end{aligned} x = x re a l + x v ⇒ 0.5 = x re a l + 0.5 ⇒ x re a l = 0 ET H y = y re a l + y v ⇒ 8000 = y re a l + 2000 ⇒ y re a l = 6000 D A I
在 a 点,y r e a l x r e a l = 2000 \frac{y_{real}}{x_{real}}=2000 x re a l y re a l = 2000 的时候,求 x r e a l x_{real} x re a l 和 y r e a l y_{real} y re a l
x = x r e a l + x v ⇒ 2 = x r e a l + 0.5 ⇒ x r e a l = 1.5 E T H y = y r e a l + y v ⇒ 2000 = y r e a l + 2000 ⇒ y r e a l = 0 D A I \begin{aligned}
&x=x_{real}+x_v \Rightarrow 2=x_{real}+0.5 \Rightarrow x_{real}=1.5 ETH \\
&y=y_{real}+y_v \Rightarrow 2000=y_{real}+2000 \Rightarrow y_{real}=0 DAI
\end{aligned} x = x re a l + x v ⇒ 2 = x re a l + 0.5 ⇒ x re a l = 1.5 ET H y = y re a l + y v ⇒ 2000 = y re a l + 2000 ⇒ y re a l = 0 D A I
如果降到 a 点,移除流动性,会得到多少 x 和 y?
在 a 点 ( x r , y r ) (x_r,y_r) ( x r , y r ) 为 ( 1.5 , 0 ) (1.5,0) ( 1.5 , 0 ) ,相当于以均价 6000 1.5 = 4000 \frac{6000}{1.5}=4000 1.5 6000 = 4000 的价格把 6000 个 DAI 换成了 1.5 个 ETH,如果缩小 a,b 点的距离,一定程度上起到了限价订单的作用
假设当前市价为 c 点,用户在超过 a 点或 b 点的位置添加流动性时,只需要添加其中一种代币而不需要同时添加两种代币(具体原因会在后面进行分析)
在超过 a 点的位置表示当前 ETH 价格降低,此时用户只需要投入 DAI。这里我们可以理解为用户预估 ETH 价格会跌,所以想要在超过 a 点的位置做流动性,当 ETH 价格到达该位置时,用户之前所投入的 DAI 将会自动换成 ETH,也就是所谓的“低吸”
在超过 b 点的位置表示当前 ETH 价格增加,此时用户只需要投入 ETH。这里我们可以理解为用户预估 ETH 价格会涨,所以想要在超过 b 点的位置做流动性,当 ETH 价格到达该位置时,用户之前所投入的 ETH 将会自动换成 DAI,也就是所谓的“高抛”
不同价格区间,流动性 L 和 x r x_r x r 和 y r y_r y r 的关系
在 Uniswap V2 中,如果想在 c 点添加流动性,需要提供 ( 1 , 4000 ) (1,4000) ( 1 , 4000 ) 。在 Uniswap V3 中,同样的流动性曲线,只需要真实提供 ( 0.5 , 2000 ) (0.5,2000) ( 0.5 , 2000 ) ,便可以在 a,b 点之间达到同样的 k 值 ( k = x ∗ y ) (k=x*y) ( k = x ∗ y ) 。如果在 V3 中,真实提供 ( 1 , 4000 ) (1,4000) ( 1 , 4000 ) 。那么 k 值 ( k = L 2 ) (k=L^2) ( k = L 2 ) 会如何变化呢?
注:图中的 x r x_r x r 和 y r y_r y r 是 a 点和 b 点减去 Virtual Reserves 的结果
如果在价格 P ≤ P a P \le P_a P ≤ P a 时,提供流动性,k 值(L 值会如何变化?)
当 P ≤ P a P \le P_a P ≤ P a 时, y r = 0 y_r=0 y r = 0
( x r + L P b ) ∗ L P a = L 2 x r + L P b = L P a x r = L ∗ ( 1 P a − 1 P a ) = L ∗ P b − P a P a ∗ P b L = x r ∗ P a ∗ P b P b − P a \begin{aligned}
(x_r+\frac{L}{\sqrt{P_b}})*L\sqrt{P_a} &= L^2 \\
x_r+\frac{L}{\sqrt{P_b}} &= \frac{L}{\sqrt{P_a}} \\
x_r=L*(\frac{1}{\sqrt{P_a}}-\frac{1}{\sqrt{P_a}}) &= L*\frac{\sqrt{P_b}-\sqrt{P_a}}{\sqrt{P_a}*\sqrt{P_b}} \\
L &= x_r*\frac{\sqrt{P_a}*\sqrt{P_b}}{\sqrt{P_b}-\sqrt{P_a}}
\end{aligned} ( x r + P b L ) ∗ L P a x r + P b L x r = L ∗ ( P a 1 − P a 1 ) L = L 2 = P a L = L ∗ P a ∗ P b P b − P a = x r ∗ P b − P a P a ∗ P b
故两者关系为:当 x r x_r x r 变大,L 也变大
如果在价格 P ≥ P b P \ge P_b P ≥ P b 时,提供流动性,k 值(L 值会如何变化?)
当 P ≥ P b P \ge P_b P ≥ P b 时, x r = 0 x_r=0 x r = 0
L P b ∗ ( y r + L P a ) = L 2 y r + L P a = L ∗ P b y r = L ∗ ( P b − P a ) L = y r P b − P a \begin{aligned}
\frac{L}{\sqrt{P_b}}*(y_r+L\sqrt{P_a}) &= L^2 \\
y_r+L\sqrt{P_a} &= L*\sqrt{P_b} \\
y_r &= L*(\sqrt{P_b}-\sqrt{P_a}) \\
L &= \frac{y_r}{\sqrt{P_b}-\sqrt{P_a}}
\end{aligned} P b L ∗ ( y r + L P a ) y r + L P a y r L = L 2 = L ∗ P b = L ∗ ( P b − P a ) = P b − P a y r
故两者关系为:当 y r y_r y r 变大,L 也变大
当 P a < P < P b P_a \lt P \lt P_b P a < P < P b 时,提供流动性,k 值(L 值会如何变化?)
当 P 处于 P a P_a P a 和 P b P_b P b 之间的任意一点,x r x_r x r 和 y r y_r y r 对于维护 [ P a , P b ] [P_a,P_b] [ P a , P b ] 之间的流动性贡献是一样的**(因为他们处于同一条曲线,故两者流动性相同)**
先计算 ( P , P b ) (P,P_b) ( P , P b ) 价格之间,单纯由 x r x_r x r 贡献的流动性
L = x r ∗ P a ∗ P b P b − P a = x r ∗ P ∗ P b P b − P L=x_r*\frac{\sqrt{P_a}*\sqrt{P_b}}{\sqrt{P_b}-\sqrt{P_a}}
=x_r*\frac{\sqrt{P}*\sqrt{P_b}}{\sqrt{P_b}-\sqrt{P}} L = x r ∗ P b − P a P a ∗ P b = x r ∗ P b − P P ∗ P b
再计算 ( P a , P ) (P_a,P) ( P a , P ) 价格之间,单纯由 y r y_r y r 贡献的流动性
L = y r P b − P a = y r P − P a L=\frac{y_r}{\sqrt{P_b}-\sqrt{P_a}}
=\frac{y_r}{\sqrt{P}-\sqrt{P_a}} L = P b − P a y r = P − P a y r
所以
L = x r ∗ P ∗ P b P b − P = y r P − P a L
=x_r*\frac{\sqrt{P}*\sqrt{P_b}}{\sqrt{P_b}-\sqrt{P}}
=\frac{y_r}{\sqrt{P}-\sqrt{P_a}} L = x r ∗ P b − P P ∗ P b = P − P a y r
案例解析(以虚拟流动性案例分析中的例子为例)
P a = 1000 , P b = 16000 , P = 4000 P_a=1000,P_b=16000,P=4000 P a = 1000 , P b = 16000 , P = 4000
当 P = P a P=P_a P = P a 时,( x r , y r ) = ( 1.5 , 0 ) (x_r,y_r)=(1.5,0) ( x r , y r ) = ( 1.5 , 0 )
L = x r ∗ P a ∗ P b P b − P a = 1.5 ∗ 1000 ∗ 16000 16000 − 1000 = 1.5 ∗ 16000 16 − 1 = 0.5 ∗ 40 10 = 20 10 \begin{aligned}
L &= x_r*\frac{\sqrt{P_a}*\sqrt{P_b}}{\sqrt{P_b}-\sqrt{P_a}} \\
&= 1.5*\frac{\sqrt{1000}*\sqrt{16000}}{\sqrt{16000}-\sqrt{1000}} \\
&= 1.5*\frac{\sqrt{16000}}{\sqrt{16}-1} \\
&= 0.5*40\sqrt{10} \\
&= 20\sqrt{10}
\end{aligned} L = x r ∗ P b − P a P a ∗ P b = 1.5 ∗ 16000 − 1000 1000 ∗ 16000 = 1.5 ∗ 16 − 1 16000 = 0.5 ∗ 40 10 = 20 10
当 P = P b P=P_b P = P b 时,( x r , y r ) = ( 0 , 6000 ) (x_r,y_r)=(0,6000) ( x r , y r ) = ( 0 , 6000 )
L = y r P b − P a = 6000 16000 − 1000 = 6000 30 10 = 20 10 \begin{aligned}
L &= \frac{y_r}{\sqrt{P_b}-\sqrt{P_a}} \\
&= \frac{6000}{\sqrt{16000}-\sqrt{1000}} \\
&= \frac{6000}{30\sqrt{10}} \\
&= 20\sqrt{10}
\end{aligned} L = P b − P a y r = 16000 − 1000 6000 = 30 10 6000 = 20 10
当 P = P c P=P_c P = P c 时,( x r , y r ) = ( 0.5 , 2000 ) (x_r,y_r)=(0.5,2000) ( x r , y r ) = ( 0.5 , 2000 )
L = x r ∗ P ∗ P b P b − P = 0.5 ∗ 4000 ∗ 16000 16000 − 4000 = 0.5 ∗ 16000 4 − 1 = 0.5 ∗ 40 10 = 20 10 \begin{aligned}
L &= \frac{x_r*\sqrt{P}*\sqrt{P_b}}{\sqrt{P_b}-\sqrt{P}} \\
&= \frac{0.5*\sqrt{4000}*\sqrt{16000}}{\sqrt{16000}-\sqrt{4000}} \\
&= \frac{0.5*\sqrt{16000}}{\sqrt{4}-1} \\
&= 0.5*40\sqrt{10} \\
&= 20\sqrt{10}
\end{aligned} L = P b − P x r ∗ P ∗ P b = 16000 − 4000 0.5 ∗ 4000 ∗ 16000 = 4 − 1 0.5 ∗ 16000 = 0.5 ∗ 40 10 = 20 10
L = y r P − P a = 2000 4000 − 1000 = 6000 20 10 − 10 10 = 200 10 = 20 10 \begin{aligned}
L &= \frac{y_r}{\sqrt{P}-\sqrt{P_a}} \\
&= \frac{2000}{\sqrt{4000}-\sqrt{1000}} \\
&= \frac{6000}{20\sqrt{10}-10\sqrt{10}} \\
&= \frac{200}{\sqrt{10}} \\
&= 20\sqrt{10}
\end{aligned} L = P − P a y r = 4000 − 1000 2000 = 20 10 − 10 10 6000 = 10 200 = 20 10
因此,我们回到最开始的那个问题
如果在 V3 中,真实提供 ( 1 , 4000 ) (1,4000) ( 1 , 4000 ) 。那么 k 值 ( k = L 2 ) (k=L^2) ( k = L 2 ) 会如何变化呢?
即在 P = 4000 P=4000 P = 4000 ,( P a , P b ) = ( 1000 , 16000 ) (P_a,P_b)=(1000,16000) ( P a , P b ) = ( 1000 , 16000 ) ,( x r , y r ) = ( 1 , 4000 ) (x_r,y_r)=(1,4000) ( x r , y r ) = ( 1 , 4000 ) 的情况下,求 L
L = x r ∗ P ∗ P b P b − P = 1 ∗ 4000 ∗ 16000 16000 − 4000 = 1 ∗ 16000 4 − 1 = 40 10 L
= \frac{x_r*\sqrt{P}*\sqrt{P_b}}{\sqrt{P_b}-\sqrt{P}}
= \frac{1*\sqrt{4000}*\sqrt{16000}}{\sqrt{16000}-\sqrt{4000}}
= \frac{1*\sqrt{16000}}{\sqrt{4}-1}
= 40\sqrt{10} L = P b − P x r ∗ P ∗ P b = 16000 − 4000 1 ∗ 4000 ∗ 16000 = 4 − 1 1 ∗ 16000 = 40 10
Uniswap V3 无常损失的计算
仍然以图中的这个数据来进行举例计算,分别计算当用户在 c 点添加 ( 1 , 4000 ) (1,4000) ( 1 , 4000 ) 的流动性且价格从 c 点变到 a 点时 V2,V3 中的无常损失
在 Uniswap V2 中
V c = 1 ∗ 4000 + 4000 = 8000 V h o d l = 1 ∗ 1000 + 4000 = 5000 V 2 = 2 ∗ 1000 + 2000 = 4000 ∴ V 2 中 无常损失为 ( V h o d l − V 2 ) = 1000 \begin{aligned}
V_c &= 1*4000+4000=8000 \\
V_{hodl} &= 1*1000+4000=5000 \\
V_2 &= 2*1000+2000=4000 \\
\therefore V2中 & 无常损失为(V_{hodl}-V_2)=1000
\end{aligned} V c V h o d l V 2 ∴ V 2 中 = 1 ∗ 4000 + 4000 = 8000 = 1 ∗ 1000 + 4000 = 5000 = 2 ∗ 1000 + 2000 = 4000 无常损失为 ( V h o d l − V 2 ) = 1000
在 Uniswap V3 中,因为 V3 多了一个 Virtual Reserves 及其曲线与 V2 也有差异,在 V2 添加的流动性数量同样添加到 V3 中会有更大的影响,因此我们必需先计算出该 V3 曲线的 x v , y v x_v,y_v x v , y v ,再去反推某个点上的 x r , y r x_r,y_r x r , y r ,最后才进行价格的计算
在 c 点 ( x r , y r ) = ( 1 , 4000 ) (x_r,y_r)=(1,4000) ( x r , y r ) = ( 1 , 4000 ) ,先求 x v , y v x_v,y_v x v , y v
x v = L P b = 40 10 16000 = 1 y v = L ∗ P a = 40 10 ∗ 1000 = 4000 \begin{aligned}
x_v &= \frac{L}{\sqrt{P_b}}=\frac{40\sqrt{10}}{\sqrt{16000}}=1 \\
y_v &= L*\sqrt{P_a}=40\sqrt{10}*\sqrt{1000}=4000
\end{aligned} x v y v = P b L = 16000 40 10 = 1 = L ∗ P a = 40 10 ∗ 1000 = 4000
由此可得实际曲线为:
在 a 点
{ x = x r + x v y = y r + y v ⇒ { 4 = x r + 1 4000 = y r + 4000 ⇒ { x r = 3 y r = 0 V 3 = 3 ∗ 1000 = 3000 V h o d l = 1 ∗ 1000 + 4000 = 5000 ∴ V 3 中 无常损失为 ( V h o d l − V 3 ) = 2000 \left\{
\begin{aligned}
x &= x_r+x_v \\
y &= y_r+y_v
\end{aligned}
\right .
\Rightarrow
\left\{
\begin{aligned}
4 &= x_r+1 \\
4000 &= y_r+4000
\end{aligned}
\right .
\Rightarrow
\left\{
\begin{aligned}
x_r &= 3 \\
y_r &= 0
\end{aligned}
\right . \\
\begin{aligned}
V_3 &= 3*1000=3000 \\
V_{hodl} &= 1*1000+4000=5000 \\
\therefore V3中 & 无常损失为(V_{hodl}-V_3)=2000
\end{aligned} { x y = x r + x v = y r + y v ⇒ { 4 4000 = x r + 1 = y r + 4000 ⇒ { x r y r = 3 = 0 V 3 V h o d l ∴ V 3 中 = 3 ∗ 1000 = 3000 = 1 ∗ 1000 + 4000 = 5000 无常损失为 ( V h o d l − V 3 ) = 2000
由此我们可以看出,Uniswap V3 的无常损失更大
我们再将其抽象为更通用的模型:
前提条件
{ x ∗ y = k P = y x ⇒ { x = k P y = k ∗ P \left\{
\begin{aligned}
& x*y=k \\
& P=\frac{y}{x}
\end{aligned}
\right .
\Rightarrow
\left\{
\begin{aligned}
& x=\frac{\sqrt{k}}{\sqrt{P}} \\
& y=\sqrt{k}*\sqrt{P}
\end{aligned}
\right . ⎩ ⎨ ⎧ x ∗ y = k P = x y ⇒ ⎩ ⎨ ⎧ x = P k y = k ∗ P
在 V 3 中 x v = L P b = k P b y v = L ∗ P a = k ∗ P a \begin{aligned}
在V3中 \\
x_v &= \frac{L}{\sqrt{P_b}}=\frac{\sqrt{k}}{\sqrt{P_b}} \\
y_v &= L*\sqrt{P_a} = \sqrt{k}*\sqrt{P_a}
\end{aligned} 在 V 3 中 x v y v = P b L = P b k = L ∗ P a = k ∗ P a
假设起始价格 P 0 P_0 P 0 ,变化后的价格 P 1 P_1 P 1 都满足 P 0 , P 1 ∈ [ P a , P b ] P_0,P_1 \in [P_a,P_b] P 0 , P 1 ∈ [ P a , P b ] ,求此时的无常损失(无手续费)
t 0 t_0 t 0 的时候 ( x 0 , y 0 ) , P 0 = y 0 x 0 , x 0 ∗ y 0 = k (x_0,y_0),P_0=\frac{y_0}{x_0},x_0*y_0=k ( x 0 , y 0 ) , P 0 = x 0 y 0 , x 0 ∗ y 0 = k
t 0 { t 1 : ( x 1 , y 1 ) , P 1 = y 1 x 1 t h o d l : ( x 0 , y 0 ) , P 1 = y 1 x 1 f ( d ) = V 1 − V h o d l V h o d l = V 1 V h o d l − 1 t_0
\left\{
\begin{aligned}
& t_1:(x_1,y_1),P_1=\frac{y_1}{x_1} \\
& t_{hodl}:(x_0,y_0),P_1=\frac{y_1}{x_1}
\end{aligned}
\right .
\\
f(d)=\frac{V_1-V_{hodl}}{V_{hodl}}=\frac{V_1}{V_{hodl}}-1 t 0 ⎩ ⎨ ⎧ t 1 : ( x 1 , y 1 ) , P 1 = x 1 y 1 t h o d l : ( x 0 , y 0 ) , P 1 = x 1 y 1 f ( d ) = V h o d l V 1 − V h o d l = V h o d l V 1 − 1
同时在前面我们还计算得到
x = x r e a l + x v y = y r e a l + y v x 1 = k P 1 y 1 = k ∗ P 1 x 0 = k P 0 y 0 = k ∗ P 0 \begin{aligned}
x &= x_{real}+x_v \\
y &= y_{real}+y_v \\
x_1 &= \frac{\sqrt{k}}{\sqrt{P_1}} \quad y_1 = \sqrt{k}*\sqrt{P_1} \\
x_0 &= \frac{\sqrt{k}}{\sqrt{P_0}} \quad y_0 = \sqrt{k}*\sqrt{P_0}
\end{aligned} x y x 1 x 0 = x re a l + x v = y re a l + y v = P 1 k y 1 = k ∗ P 1 = P 0 k y 0 = k ∗ P 0
通过上面的这些公式,我们可以计算出
V 1 = x r e a l ∗ P 1 + y r e a l = ( x 1 − x v ) ∗ P 1 + ( y 1 − y v ) = ( k P 1 − k P b ) ∗ P 1 + ( k ∗ P 1 − k ∗ P a ) = 2 k ∗ P 1 − k ∗ P a − k P b ∗ P 1 \begin{aligned}
V_1 &= x_{real}*P_1+y_{real} \\
&= (x_1-x_v)*P_1+(y_1-y_v) \\
&= (\frac{\sqrt{k}}{\sqrt{P_1}}-\frac{\sqrt{k}}{\sqrt{P_b}})*P_1+(\sqrt{k}*\sqrt{P_1}-\sqrt{k}*\sqrt{P_a}) \\
&= 2\sqrt{k}*\sqrt{P_1}-\sqrt{k}*\sqrt{P_a}-\frac{\sqrt{k}}{\sqrt{P_b}}*P_1
\end{aligned} V 1 = x re a l ∗ P 1 + y re a l = ( x 1 − x v ) ∗ P 1 + ( y 1 − y v ) = ( P 1 k − P b k ) ∗ P 1 + ( k ∗ P 1 − k ∗ P a ) = 2 k ∗ P 1 − k ∗ P a − P b k ∗ P 1
V h o d l = x r e a l ∗ P 1 + y r e a l = ( x 0 − x v ) ∗ P 1 + ( y 0 − y v ) = ( k P 0 − k P b ) ∗ P 1 + ( k ∗ P 0 − k ∗ P a ) = k ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) ∗ k \begin{aligned}
V_{hodl} &= x_{real}*P_1+y_{real} \\
&= (x_0-x_v)*P_1+(y_0-y_v) \\
&= (\frac{\sqrt{k}}{\sqrt{P_0}}-\frac{\sqrt{k}}{\sqrt{P_b}})*P_1+(\sqrt{k}*\sqrt{P_0}-\sqrt{k}*\sqrt{P_a}) \\
&= \sqrt{k}(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})*\sqrt{k}
\end{aligned} V h o d l = x re a l ∗ P 1 + y re a l = ( x 0 − x v ) ∗ P 1 + ( y 0 − y v ) = ( P 0 k − P b k ) ∗ P 1 + ( k ∗ P 0 − k ∗ P a ) = k ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) ∗ k
f ( d ) = V 1 − V h o d l V h o d l = V 1 V h o d l − 1 = 2 k ∗ P 1 − k ∗ P a − k P b ∗ P 1 k ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) ∗ k − 1 = 2 P 1 − P a − P 1 P b ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) − 1 (1) \begin{aligned}
f(d)
&= \frac{V_1-V_{hodl}}{V_{hodl}}=\frac{V_1}{V_{hodl}}-1 \\
&= \frac
{2\sqrt{k}*\sqrt{P_1}-\sqrt{k}*\sqrt{P_a}-\frac{\sqrt{k}}{\sqrt{P_b}}*P_1}
{\sqrt{k}(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})*\sqrt{k}} -1 \\
&= \frac
{2\sqrt{P_1}-\sqrt{P_a}-\frac{P_1}{P_b}}
{(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})} -1
\end{aligned} \tag 1 f ( d ) = V h o d l V 1 − V h o d l = V h o d l V 1 − 1 = k ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) ∗ k 2 k ∗ P 1 − k ∗ P a − P b k ∗ P 1 − 1 = ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) 2 P 1 − P a − P b P 1 − 1 ( 1 )
其他条件不变,假设变化后的价格 P 1 < P a P_1 \lt P_a P 1 < P a ,计算无常损失
在 P 1 < P a P_1 \lt P_a P 1 < P a 时,y r e a l y_{real} y re a l 为 0
V 1 = x r e a l ∗ P 1 + y y e a l = x r e a l ∗ P 1 = ( k P 1 − k P b ) ∗ P 1 \begin{aligned}
V_1 &= x_{real}*P_1+y_{yeal} \\
&= x_{real}*P_1 \\
&= (\frac{\sqrt{k}}{\sqrt{P_1}}-\frac{\sqrt{k}}{\sqrt{P_b}})*P_1
\end{aligned} V 1 = x re a l ∗ P 1 + y ye a l = x re a l ∗ P 1 = ( P 1 k − P b k ) ∗ P 1
f ( d ) = ( k P 1 − k P b ) ∗ P 1 k ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) ∗ k − 1 = ( 1 P 1 − 1 P b ) ∗ P 1 ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) − 1 (2) \begin{aligned}
f(d) &= \frac
{(\frac{\sqrt{k}}{\sqrt{P_1}}-\frac{\sqrt{k}}{\sqrt{P_b}})*P_1}
{\sqrt{k}(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})*\sqrt{k}}
-1 \\
&= \frac
{(\frac{1}{\sqrt{P_1}}-\frac{1}{\sqrt{P_b}})*P_1}
{(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})}
-1
\end{aligned} \tag 2 f ( d ) = k ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) ∗ k ( P 1 k − P b k ) ∗ P 1 − 1 = ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) ( P 1 1 − P b 1 ) ∗ P 1 − 1 ( 2 )
其他条件不变,假设变化后的价格 P 1 > P b P_1 \gt P_b P 1 > P b ,计算无常损失
在 P 1 > P b P_1 \gt P_b P 1 > P b 时,x r e a l x_{real} x re a l 为 0
V 1 = x r e a l ∗ P 1 + y y e a l = y y e a l = y − y v = k ∗ P 1 − k ∗ P a \begin{aligned}
V_1 &= x_{real}*P_1+y_{yeal} \\
&= y_{yeal} =y-y_v\\
&= \sqrt{k}*\sqrt{P_1}-\sqrt{k}*\sqrt{P_a}
\end{aligned} V 1 = x re a l ∗ P 1 + y ye a l = y ye a l = y − y v = k ∗ P 1 − k ∗ P a
f ( d ) = k ∗ P 1 − k ∗ P a k ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) ∗ k − 1 = P 1 − P a ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) − 1 (3) \begin{aligned}
f(d) &= \frac
{\sqrt{k}*\sqrt{P_1}-\sqrt{k}*\sqrt{P_a}}
{\sqrt{k}(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})*\sqrt{k}}
-1 \\
&= \frac
{\sqrt{P_1}-\sqrt{P_a}}
{(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})}
-1
\end{aligned} \tag 3 f ( d ) = k ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) ∗ k k ∗ P 1 − k ∗ P a − 1 = ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) P 1 − P a − 1 ( 3 )
由 (1) 我们可以得知,当 P a P_a P a 趋向于 0,P b P_b P b 趋向于 ∞ \infty ∞ 的时候
f ( d ) = 2 P 1 − P a − P 1 P b ( 1 P 0 − 1 P b ) ∗ P 1 + ( P 0 − P a ) − 1 = 2 P 1 P 1 P 0 + P 0 − 1 ∵ P 1 = P 0 ∗ d , 则 f ( d ) = 2 P 0 ∗ d P 0 ∗ d P 0 + P 0 − 1 = 2 d 1 + d − 1 \begin{aligned}
f(d) &= \frac
{2\sqrt{P_1}-\sqrt{P_a}-\frac{P_1}{P_b}}
{(\frac{1}{\sqrt{P_0}}-\frac{1}{\sqrt{P_b}})*P_1+(\sqrt{P_0}-\sqrt{P_a})} -1 \\
&= \frac{2\sqrt{P_1}}{\frac{P_1}{\sqrt{P_0}}+\sqrt{P_0}}-1 \\
\because P_1 &= P_0*d,则 \\
f(d) &= \frac{2\sqrt{P_0*d}}{\frac{P_0*d}{\sqrt{P_0}}+\sqrt{P_0}}-1 \\
&= \frac{2\sqrt{d}}{1+d}-1
\end{aligned} f ( d ) ∵ P 1 f ( d ) = ( P 0 1 − P b 1 ) ∗ P 1 + ( P 0 − P a ) 2 P 1 − P a − P b P 1 − 1 = P 0 P 1 + P 0 2 P 1 − 1 = P 0 ∗ d , 则 = P 0 P 0 ∗ d + P 0 2 P 0 ∗ d − 1 = 1 + d 2 d − 1
从这看出其与 V2 的公式相同,即说明 V3 的公式推导正确
在这我们说回前面所提到的问题
假设当前市价为 c 点,用户在超过 a 点或 b 点的位置添加流动性时,只需要添加其中一种代币而不需要同时添加两种代币
V3 与 V2 最大的不同是引进了集中流动性并带来了 Virtual Reserves,当我们在上面的曲线添加流动性时必须要用减去 x r , y r x_r,y_r x r , y r 的值之后的曲线再进行计算。否则在原来的曲线进行计算,即使在超过 a 点或 b 点的位置添加流动性,其结果仍会是两种代币都需要添加;而使用减去 x r , y r x_r,y_r x r , y r 值之后的曲线进行计算则可以得到正确的结果,因为当处于超过 a 点或 b 点的位置,x r e a l x_{real} x re a l 或 y r e a l y_{real} y re a l 总会有一个超出范围而变为 0(如下两图),即只需要添加一种代币即可
同时我们需要的注意的是,当我们是在下图的情况下(市价在 c 点,想要在 d 点到 e 点添加流动性)时,其仍需同时添加两种代币。因为本质上其仍处于 x r e a l x_{real} x re a l 和 y r e a l y_{real} y re a l 的范围之内
Staking Rewards
这是一个关于用户抵押资金,在一段时间之后取回本金并计算可以拿到多少奖励的算法
由此引出了相应的数学公式:
使用上面的公式进行计算时,有时候不利于开发者编写代码(一是在最后统一进行计算需要对每个用户进行轮询计算,代码难以实现;二是这么做 gas 费会很高),因此对上面公式的表达进行了修改即计算 k 到 n-1 秒的奖励从原先的直接计算改为通过计算从 0 到 n-1 秒的奖励减去 从 0 到 k 秒的奖励:
示例:
只有一个用户质押
有两个用户质押,并且中途有用户进行提款操作
多个用户参与质押与提款
算法设计
最后,这部分的材料来源:Staking Rewards - Intro | DeFi - YouTube
再补充一个个人认为比较好的相关材料:流动性挖矿-合约原理详解 — xyyme.eth
后续笔记会在之后发布,让我们尽情期待,您也可以关注我的推特账号(@weihaoming)以获取更多笔记资源……