UniSwap
恒定积公式(CPMM)
L 意思是 L = Liquidity Token(流动性代币)
x×y=L2
L 越大,获得的价格,Swap 的数量越好。
我们尝试进行交换
我们使用指定数量的 dx 去在AMM 中进行交换,我们来逐步看看交换过程
(x0+dx)×(y0−dy)=L2x0×y0=L2换元,得:(x0+dx)×(y0−dy)=x0×y0y0−dy=x0+dxx0y0dy=y0−x0+dxx0y0dy=x0+dxy0(x0+dx)−x0+dxx0y0dy=x0+dxy0x0+y0dx−x0+dxx0y0dy=x0+dxy0x0+y0dx−x0y0dy=x0+dxdxy0
OK,如果没有交易手续费,那么交换所得的 **dy 便是 x0+dxdxy0 **
那创建池子的人肯定要赚钱呀,怎么赚钱,那么万变不离其宗:
此山是我开,此树是我栽,要想过此路,留下买路财
买路财在这里便是收手续费,在 uniswap 中 ,简称为 fee。这个手续费的费率我们叫做 f ,f∈[0,1]
这个手续费是交换发起方付的,那么付的自然是 x 对应的 token。
在交换过程中消耗的 费用 便是 f×dx
所以实际进行交换的部分则是 dx−f∗dx 化简得 dx(1−f)
我们带入到 dy=x0+dxdxy0 则是 dy=x0+dx(1−f)y0dx(1−f)
同样的,已知 dy 求 dx
dy=x0+dx(1−f)y0dx(1−f)dy=dxx0+(1−f)y0(1−f)dxdyx0+dy(1−f)=y0(1−f)dxdyx0=(y0−dy)(1−f)dx=(y0−dy)(1−f)dyx0
上面的方法是其中一种, dx 可以互相求解 dy,我们称之为计算思路一。
下面我们介绍计算思路二。
我们也可以回归到公式的本质,在AMM图像或者实际交换中,我们付出的 dx 实际上就是 dx(1−f)
(x0+dx(1−f))×(y0−dy)=L2x0×y0=L2(x0+dx(1−f))×(y0−dy)=x0×y0
也是易得以上两解:
dy=x0+dx(1−f)y0dx(1−f)dx=(y0−dy)(1−f)dyx0
这便是 UniSwap V2 的 计算公式。
Swap 调用
我们知道 在Uniswap V2 中有 Route 合约,我们来看看在实际中是怎么运行的吧
如果我们 ERC 20 交换 ERC 20 ,那么调用的则是 swapExactTokensForTokens()
;如果是ETH 交换 ERC20 ,那么是 swapExactEthForTokens
,这里我们就用 ERC20-DAI/MKR表示。
上面演示的是 1个交易对,那么如果我们想要交换的这两个Token 之间路由不存在呢?
我们来看 UniSwap