October 26, 2024

UniSwap

uniswap

UniSwap

恒定积公式(CPMM)

L 意思是 L = Liquidity Token(流动性代币)

x×y=L2x \times y = L^2

LL 越大,获得的价格,Swap 的数量越好。

我们尝试进行交换

我们使用指定数量的 dx 去在AMM 中进行交换,我们来逐步看看交换过程

(x0+dx)×(y0dy)=L2x0×y0=L2换元,得:(x0+dx)×(y0dy)=x0×y0y0dy=x0y0x0+dxdy=y0x0y0x0+dxdy=y0(x0+dx)x0+dxx0y0x0+dxdy=y0x0+y0dxx0+dxx0y0x0+dxdy=y0x0+y0dxx0y0x0+dxdy=dxy0x0+dx(x_0+d_x) \times (y_0-d_y) = L^2 \\ \\ x_0 \times y_0 = L^2 \\ \\ 换元,得: \\ \\ (x_0 + d_x) \times ( y_0 - d_y ) = x_0 \times y_0 \\ \\ y_0 - d_y = \frac{ x_0y_0 } { x_0 + d_x } \\ \\ d_y = y_0 - \frac{ x_0y_0 } { x_0 + d_x } \\ \\ d_y = \frac{y_0(x_0 + d_x)}{x_0 + d_x} - \frac{ x_0y_0 } { x_0 + d_x } \\ \\ dy = \frac{y_0x_0 + y_0d_x}{x_0 + d_x} - \frac{ x_0y_0 } { x_0 + d_x } \\ \\ d_y = \frac{y_0x_0 + y_0d_x - x_0y_0 } { x_0 + d_x } \\ \\ d_y = \frac{d_xy_0} { x_0 + d_x }

OK,如果没有交易手续费,那么交换所得的 **dyd_y 便是 dxy0x0+dx\frac{d_xy_0} { x_0 + d_x } **

那创建池子的人肯定要赚钱呀,怎么赚钱,那么万变不离其宗:

此山是我开,此树是我栽,要想过此路,留下买路财

买路财在这里便是收手续费,在 uniswap 中 ,简称为 fee。这个手续费的费率我们叫做 fff[0,1]f \in [0,1]

这个手续费是交换发起方付的,那么付的自然是 x 对应的 token。

在交换过程中消耗的 费用 便是 f×dxf \times d_x

所以实际进行交换的部分则是 dxfdxd_x - f*d_x 化简得 dx(1f)d_x(1-f)

我们带入到 dy=dxy0x0+dxd_y = \frac{d_xy_0} { x_0 + d_x } 则是 dy=y0dx(1f)x0+dx(1f)d_y = \frac{y_0d_x(1-f)} { x_0 + d_x(1-f)}

同样的,已知 dyd_ydxd_x

dy=y0dx(1f)x0+dx(1f)dy=y0(1f)x0dx+(1f)dyx0dx+dy(1f)=y0(1f)dyx0dx=(y0dy)(1f)dx=dyx0(y0dy)(1f)d_y = \frac{y_0d_x(1-f)} { x_0 + d_x(1-f)} \\ \\ d_y = \frac{y_0(1-f)}{\frac{x_0}{d_x}+(1-f)} \\ \\ \frac{d_yx_0}{d_x}+d_y(1-f) = y_0(1-f) \\ \\ \frac{d_yx_0}{d_x} = (y_0-d_y)(1-f) \\ \\ d_x = \frac{d_yx_0}{ (y_0-d_y)(1-f)}

上面的方法是其中一种, dxd_x 可以互相求解 dyd_y,我们称之为计算思路一。

下面我们介绍计算思路二。

我们也可以回归到公式的本质,在AMM图像或者实际交换中,我们付出的 dxd_x 实际上就是 dx(1f)d_x(1-f)

(x0+dx(1f))×(y0dy)=L2x0×y0=L2(x0+dx(1f))×(y0dy)=x0×y0(x_0+d_x(1-f)) \times (y_0-d_y) = L^2 \\ \\ x_0 \times y_0 = L^2 \\ \\ (x_0+d_x(1-f)) \times (y_0-d_y) = x_0 \times y_0

也是易得以上两解:

dy=y0dx(1f)x0+dx(1f)dx=dyx0(y0dy)(1f)d_y = \frac{y_0d_x(1-f)} { x_0 + d_x(1-f)} \\ \\ d_x = \frac{d_yx_0}{ (y_0-d_y)(1-f)}

这便是 UniSwap V2 的 计算公式。

Swap 调用

我们知道 在Uniswap V2 中有 Route 合约,我们来看看在实际中是怎么运行的吧

如果我们 ERC 20 交换 ERC 20 ,那么调用的则是 swapExactTokensForTokens() ;如果是ETH 交换 ERC20 ,那么是 swapExactEthForTokens,这里我们就用 ERC20-DAI/MKR表示。

上面演示的是 1个交易对,那么如果我们想要交换的这两个Token 之间路由不存在呢?

我们来看 UniSwap

Share