TWAMM 集中流动性的数学原理 =============================================== Uniswap V3 核心是通过盘口区间提供流动性(集中式流动性),流动性提供者将流动性添加到有可能价格波动到的区间范围,提高资金使用率。 **TWAMM** 做市商作为新型的 **AMM** 协议同样可以采用**集中流动性(Concentrated Liquidity)**。 ## 资金利用率 先看看 Uniswap V2 使用非集中流动性的资金利用率。 ![](https://i.imgur.com/QnijE5V.png) 上图为资金池中的 $x-y$ 的量变化曲线。资金池中的当前价格在 $c$ 点,并且假设会在 $a$ 价格点和 $b$ 价格点之间波动。从 $c$ 点向 $a$ 点滑动,消耗最大 $y_{real}$,从 $c$ 点向 $b$ 点滑动,消耗最大为 $x_{real}$。也就是说,当前价格 $c$ 点,在 $a$ 点和 $b$ 点之间震荡的话,最大只需要消耗 $x_{real}$ 和 $y_{real}$。理论上只要提供 $x_{real}$ 和 $y_{real}$ 就足够了。而事实上,如上图所示,在价格 $c$ 点,分别提供了大于 $x_{real}$ 和 $y_{real}$ 的 $x$ 和 $y$。明显可以看出,$x-x_{real}$ 和 $y-y_{real}$ 的资金在这种情况下是永远用不上的,也就称为闲置资金。在这种情况下,资金利用率为 $\dfrac{x_{real}}{x}$ 或者 $\dfrac{y_{real}}{y}$。如果价格波动非常小的话,资金利用率是非常低的。 如何在某个区间添加流动性并提供 Swap 功能是 Uniswap V3 的重点,这需要先从虚拟资金池说起。 ## 虚拟资金池 Uniswap 的交易采用恒定乘积模型($x\cdot y=k$)。所谓的虚拟资金池(Virtual Reserves),是指在乘积恒定曲线上,只提供某个区间流动性的资金池: ![](https://i.imgur.com/Jl7u9CT.png) 图中的蓝色的曲线就是虚拟资金池满足的乘积恒定曲线。事实上需要的资金的曲线如图中的橘黄色。橘黄色的曲线公式如下图: > $$(x+\dfrac{L}{\sqrt{p_{b}}})(y+L\sqrt{p_{a}})=L^{2}$$ 你可以想象成虚拟资金曲线在 $x-y$ 轴进行平移,使得 $a,b$ 点和 $x,y$ 轴重合。也就是用一定量的资金就能达到“虚拟”的交易曲线的效果。 ## Uniswap V3 集中流动性 恒定乘积做市商资金池中的两种代币金额满足:$x\cdot y=k$。如果设定 $k=L^2$ 的话,$x\cdot y=L^2$,$L$ 就是我们说的流动性。由恒定乘积的交易模型得出如下的公式: > $$L=\sqrt{xy},p=\dfrac{y}{x}$$ 在已知 $L$ 和 $\sqrt{p}$ 的情况下,也能推导出资金需求量 $x$ 和 $y$: > $$x=\dfrac{L}{\sqrt{p}},y=L\sqrt{p}$$ 通过上面的公式,在流动性不变的情况下(不添加或删除流动性),流动性可以看成是单位“价格波动”的 $y$ 资金量的变化。“价格波动”打上引号是因为事实上是 $\sqrt{p}$ 的变化。 > $$L=\dfrac{\Delta y}{\Delta \sqrt{p}}$$ 这个是 Uniswap V3 核心公式,用相对值(资金和价格相对值)来计算流动性。所谓的流动性,就是单位“价格变化”的资金量。在一定的交易量的情况下,如果流动性好,价格变化就小,流动性不够的话,价格波动就大。 ![](https://i.imgur.com/8Dm95PF.png) ## 集中流动性兑换 集中流动性的引入,使用户可以把资金放到任意价格区间内提供流动性,上文为了方便解释原理,只用了一个区间的场景,实际场景中不太可能只有一个价格区间,假设有几个连续的价格区间各自有不同的流动,则如下如所示: ![](https://i.imgur.com/Y3RXKlO.png) 我们可以看到,做市商曲线不再连续了,在交易过程中,价格变化到不同区间时要分段独立计算,但是在 $X-Y$ 直角坐标系中每个价格区间的边界是一条直线,$x$ 和 $y$ 的量是同时变化的,而且还可能存在价格区间有重叠的情况,这就导致整个的计算过程复杂度非常高。 Uniswap V3 改用 $Price - Liquidity$ 的坐标系,这样价格区间的边界就从一个二维的直线变成了 $Price$ 轴上的一个点了,而且增加/减少流动性不会改变当前价格,Swap会导致价格变化但不会改变流动性的值,因此 $Price$ 和 $Liquidity$ 在同一时间只有一个值变化,进一步降低了计算复杂度. 如何计算 Swap 的结果是 Uniswap V3 的重点。对用户和应用侧来说,还是对 $X _{token}$ 和 $Y_{token}$ 进行的操作,所以在实际计算过程中要在 $(X,Y) \leftrightarrows (Price, Liquidity)$ 之间做互相的转换. ![](https://i.imgur.com/nZpipVP.png) 当发生一次 Swap 时,$x_{in}$ 和 $y_{in}$ 其中有一个为零,我们可以将 Swap 结果写成如下对称形式: $$x_{ammEnd}=y_{ammStart}\cdot\dfrac{x_{ammStart}+x_{in}}{y_{ammStart}+y_{in}}$$ $$y_{ammEnd}=x_{ammStart}\cdot\dfrac{y_{ammStart}+y_{in}}{x_{ammStart}+x_{in}}$$ $$x_{out}=x_{ammStart}+x_{in}-x_{ammEnd}=y_{in}\cdot\dfrac{x_{ammStart}+x_{in}}{y_{ammStart}+y_{in}}$$ $$y_{out}=y_{ammStart}+y_{in}-y_{ammEnd}=x_{in}\cdot\dfrac{y_{ammStart}+y_{in}}{x_{ammStart}+x_{in}}$$ 简单起见,我们令 $y_{in}=0$: $$x_{ammEnd}=x_{ammStart}+x_{in}$$ $$y_{ammEnd}=x_{ammStart}\cdot\dfrac{y_{ammStart}}{x_{ammStart}+x_{in}}$$ $$x_{out}=x_{ammStart}+x_{in}-x_{ammEnd}=0$$ $$y_{out}=y_{ammStart}-y_{ammEnd}=x_{in}\cdot\dfrac{y_{ammStart}}{x_{ammStart}+x_{in}}$$ 由于, $$x_{ammEnd}=\dfrac{L}{\sqrt{p_{ammEnd}}},x_{ammStart}=\dfrac{L}{\sqrt{p_{ammStart}}}$$ $$y_{ammEnd}=L\sqrt{p_{ammEnd}}, y_{ammStart}=L\sqrt{p_{ammStart}}$$ $$p_{ammEnd}=\dfrac{y_{ammEnd}}{x_{ammEnd}},p_{ammStart}=\dfrac{y_{ammStart}}{x_{ammStart}}$$ 可以计算出 $p_{ammEnd}$ 关于 $x_{in}$ 和 $p_{ammStart}$ 的计算公式: > $$\dfrac{1}{\sqrt{p_{ammEnd}}}=\dfrac{1}{\sqrt{p_{ammStart}}}+\dfrac{x_{in}}{L}$$ > > $$x_{in}=\dfrac{L}{\sqrt{p_{ammEnd}}}-\dfrac{L}{\sqrt{p_{ammStart}}}$$ > > $$y_{out}=y_{ammStart}-y_{ammEnd}=L\sqrt{p_{ammStart}}-L\sqrt{p_{ammEnd}}$$ ## TWAMM 集中流动性 按照 **[TWAMM 的数学原理](https://hackmd.io/@luffy/SJxSsOH1Y)** 一文,**TWAMM** 依然采用恒定乘积的交易模型,资金池中的两种代币金额满足:$x\cdot y=k=L^2$。由恒定乘积的交易模型依然得出如下的公式: $$L=\sqrt{xy},p=\dfrac{y}{x},x=\dfrac{L}{\sqrt{p}},y=L\sqrt{p}$$ 如果 TWAMM 引入集中流动性,即时兑换(Instant Swap)的 $(X,Y) \leftrightarrows (Price, Liquidity)$ 计算结果依然和 Uniswap V3 相同,但是定期兑换(Term Swap)就不相同了。 TWAMM 长期订单到期执行结算的结果如下: > $$x_{ammEnd}=\sqrt{\dfrac{kx_{in}}{y_{in}}}\cdot\dfrac{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}+c}{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}-c}$$ > > $$x_{out}=x_{ammStart}+x_{in}-x_{ammEnd}$$ > > $$y_{ammEnd}=\sqrt{\dfrac{ky_{in}}{x_{in}}}\cdot\dfrac{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}+\overline{c}}{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}-\overline{c}}$$ > > $$y_{out}=y_{ammStart}+y_{in}-y_{ammEnd}$$ > > $$c=\dfrac{\sqrt{x_{ammStart}\cdot y_{in}}-\sqrt{y_{ammStart}\cdot x_{in}}}{\sqrt{x_{ammStart}\cdot y_{in}}+\sqrt{y_{ammStar t}\cdot x_{in}}}=-\overline{c}$$ > > $$e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}>\left\lvert \dfrac{\sqrt{x_{ammStart}\cdot y_{in}}-\sqrt{y_{ammStart}\cdot x_{in}}}{\sqrt{x_{ammStart}\cdot y_{in}}+\sqrt{y_{ ammStart}\cdot x_{in}}}\right\rvert$$ 同样,我们有: $$x_{ammEnd}=\dfrac{L}{\sqrt{p_{ammEnd}}},x_{ammStart}=\dfrac{L}{\sqrt{p_{ammStart}}}$$ $$y_{ammEnd}=L\sqrt{p_{ammEnd}}, y_{ammStart}=L\sqrt{p_{ammStart}}$$ $$p_{ammEnd}=\dfrac{y_{ammEnd}}{x_{ammEnd}},p_{ammStart}=\dfrac{y_{ammStart}}{x_{ammStart}}$$ 可以计算出 $p_{ammEnd}$ 关于 $x_{in}$,$y_{in}$, $\overline{p}=\dfrac{y_{in}}{x_{in}}$(长期订单到期执行结算时 $\overline{p}$ 是常数)和 $p_{ammStart}$ 的公式: $$p_{ammEnd}=\overline{p}\cdot\left(\dfrac{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}+\overline{c}}{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}-\overline{c}}\right)^{2}$$ $$=\overline{p}\cdot\left(\dfrac{e^{2\sqrt{\overline{p}}{\dfrac{x_{in}}{L}}}+\overline{c}}{e^{2\sqrt{\overline{p}}{\dfrac{x_{in}}{L}}}-\overline{c}}\right)^{2}$$ $$\overline{c}=\dfrac{\sqrt{p_{ammStart}}-\sqrt{\overline{p}}}{\sqrt{p_{ammStart}}+\sqrt{ \overline{p}}}=-c$$ 再次计算: > $$\sqrt{p_{ammEnd}}=\sqrt{\overline{p}}\cdot\dfrac{e^{2\sqrt{\overline{p}}{\dfrac{x_{in}}{L}}}+\overline{c}}{e^{2\sqrt{\overline{p}}{\dfrac{x_{in}}{L}}}-\overline{c}}$$ > > $$=\sqrt{\overline{p}}\cdot\dfrac{e^{2{\dfrac{y_{in}}{L\sqrt{\overline{p}}}}}+\overline{c}}{e^{2{\dfrac{y_{in}}{L\sqrt{\overline{p}}}}}-\overline{c}}>0$$ 反向计算求得 $x_{in}$ 和 $y_{in}$ 计算公式: $$e^{2\sqrt{\overline{p}}{\dfrac{x_{in}}{L}}}=\dfrac{\overline{c}\cdot(\sqrt{p_{ammEnd}}+\sqrt{\overline{p}})}{\sqrt{p_{ammEnd}}-\sqrt{\overline{p}}}=\dfrac{(\sqrt{p_{ammStart}}-\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}+\sqrt{\overline{p}})}{(\sqrt{p_{ammStart}}+\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}-\sqrt{\overline{p}})}>1$$ 经过分析, $$\dfrac{\sqrt{p_{ammStart}}-\sqrt{p_{ammEnd}}}{\sqrt{p_{ammEnd}}-\sqrt{\overline{p}}}>0$$ 上述不等式说明 $p_{ammEnd}$ 的值介于 $\overline{p}$ 和 $p_{ammStart}$ 之间(排除 $\overline{p}$,$p_{ammStart}$ 和 $p_{ammEnd}$ 都相等的情况)。 另外,通过对 $\sqrt{p_{ammEnd}}$ 求导,我们可以获得 $\sqrt{p_{ammEnd}}$ 对 $x_{in}$ 和 $y_{in}$ 的变化情况: $$\frac{\mathrm{d} \sqrt{p_{ammEnd}} }{\mathrm{d} x_{in}}=\dfrac{-4\overline{p}\cdot\overline{c}}{L\left(e^{2\sqrt{\overline{p}}{\dfrac{x_{in}}{L}}}-\overline{c}\right)^{2}}$$ $$\frac{\mathrm{d} \sqrt{p_{ammEnd}} }{\mathrm{d} y_{in}}=\dfrac{-4\overline{c}}{L\left(e^{2{\dfrac{y_{in}}{L\sqrt{\overline{p}}}}}-\overline{c}\right)^{2}}$$ 上面说明,如果 $\overline{p}>p_{ammStart}$,则 $p_{ammEnd}$ 单增,反之则单减。 最后, > $$x_{in}=\dfrac{L}{2\sqrt{\overline{p}}} > \ln\left\lvert\dfrac{(\sqrt{p_{ammStart}}-\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}+\sqrt{\overline{p}})}{(\sqrt{p_{ammStart}}+\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}-\sqrt{\overline{p}})}\right\rvert$$ > > $$y_{in}=\dfrac{L\sqrt{\overline{p}}}{2} > \ln\left\lvert\dfrac{(\sqrt{p_{ammStart}}-\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}+\sqrt{\overline{p}})}{(\sqrt{p_{ammStart}}+\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}-\sqrt{\overline{p}})}\right\rvert$$ 我们可以得到 $x_{out}$ 和 $y_{out}$ 的表达式: > $$x_{out}=\dfrac{L}{\sqrt{p_{ammStart}}}+ x_{in}-\dfrac{L}{\sqrt{p_{ammEnd}}}$$ > > $$=\dfrac{L}{\sqrt{p_{ammStart}}}-\dfrac{L}{\sqrt{p_{ammEnd}}}+\dfrac{L}{2\sqrt{\overline{p}}} > \ln\left\lvert\dfrac{(\sqrt{p_{ammStart}}-\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}+\sqrt{\overline{p}})}{(\sqrt{p_{ammStart}}+\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}-\sqrt{\overline{p}})}\right\rvert$$ > > $$y_{out}=L\sqrt{p_{ammStart}}+y_{in}-L\sqrt{p_{ammEnd}}$$ > > $$=L\sqrt{p_{ammStart}}-L\sqrt{p_{ammEnd}}+\dfrac{L\sqrt{\overline{p}}}{2} > \ln\left\lvert\dfrac{(\sqrt{p_{ammStart}}-\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}+\sqrt{\overline{p}})}{(\sqrt{p_{ammStart}}+\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}-\sqrt{\overline{p}})}\right\rvert$$ 如果 $y_{in},\overline{p}\rightarrow0, x_{in}\neq0$,通过 **[L'Hôpital's Rule](https://en.wikipedia.org/wiki/L%27H%C3%B4pital%27s_rule)** 求极限我们可以得到即时兑换的结果: $$x_{in}=\lim_{\overline{p}\rightarrow0}\left(\dfrac{L}{2\sqrt{\overline{p}}} \ln\left\lvert\dfrac{(\sqrt{p_{ammStart}}-\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}+\sqrt{\overline{p}})}{(\sqrt{p_{ammStart}}+\sqrt{\overline{p}})\cdot(\sqrt{p_{ammEnd}}-\sqrt{\overline{p}})}\right\rvert\right)$$ $$=\dfrac{L}{\sqrt{p_{ammEnd}}}-\dfrac{L}{\sqrt{p_{ammStart}}}$$ $$y_{in}=0$$ $$x_{out}=0$$ $$y_{out}=L\sqrt{p_{ammStart}}-L\sqrt{p_{ammEnd}}$$ ## 参考 - [1] [Mathematical Principle of TWAMM](https://hackmd.io/@luffy/SJxSsOH1Y) - [2] [Technical Documentation for TWAMM Protocol ](https://showenpeng.gitbook.io/ghihni4390rbnfjk4u5r9) - [3] [Introducing Uniswap V3](https://uniswap.org/blog/uniswap-v3) - [4] [Uniswap V3 Core WhitePaper](https://uniswap.org/whitepaper-v3.pdf) - [5] [Uniswap V3 技术白皮书导读](https://learnblockchain.cn/article/2357#4-Tick) - [6] [Uniswap V3 源代码导读](https://learnblockchain.cn/article/2371) - [7] [Uniswap v3 设计详解](https://zhuanlan.zhihu.com/p/448382469)