交易价格的计算有两种类型:一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input);一种是给定Y的数量,计算需要的X数量(Output)。
上一节说了Uniwap自动化做市商核心算法解析, 这一节继续说Uniwap做市商算法之价格计算。
本文的基础是上一篇,建议认真理解,否则理解本篇有一定难度。系好安全带,准备出发!
交易价格的计算有两种类型: 一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input); 一种是给定Y的数量,计算需要的X数量(Output)。
本文接着上篇加入费用模型的算法。上一节的符号定义全部直接使用,不再重复说明。
假设要卖出∆x, = ∆x / x,则用来计算可以换取的 ∆y的函数记为getInputPrice如下:
r = 1 - ρ , ρ是费率。交换后,x, y代币余量变化如下:
本次交易,y的价格如下计算: $\frac{\Delta x}{\Delta y}=\frac{\alpha x}{\frac{\alpha \gamma}{1+\alpha \gamma}y}=\frac{1+\alpha \gamma}{\gamma}* \frac{x}{y}$
可以看出$\alpha$越大,对y价格影响越大,$\alpha$最大取1,即使用x当前储备量相同数量x,最多可获取50%的y. 这种情况对价格影响加大,uniswap调用合约执行前,会检查用户输入数量是否对价格产生较大影响。
如果超出预定价格波动范围,会提示”Price impact too high“ 来阻止操作, 使用过uniswap的朋友应该对此比较熟悉。
尤其是当一个pool代币余量比较小的情况,每次交易的数量都不大,这就是所谓的交易深度。
下面看一下,第二种价格计算
假设要卖出∆y, $\beta$= ∆y / y,则用来计算可以换取的 ∆x的函数记为getOutPrice如下:
注意:这里依然是使用一定数量x来交换y, 不是用y交换x. 这里已知的是∆y,求出需要准备的∆x 可以看出当 $\beta$= 1/2 时,大约需要当前流动性中等量的x代币, 这一结果跟上面getInputPrice 是一致的。
交换后x, y剩余量更新如下:
上一节已经对该公式做了分析,看下此时y代币价格:
代入 = ∆y / y,化简得: $\frac{\Delta x}{\Delta y}=\frac{1}{(1-\beta)\gamma}* \frac{x}{y}$
可见$\beta$ 越大,价格越高。直面理解,置换出的∆y越多,池子里y代币就越少,同时x代币有所增加∆x,y的价格自然上升。
getInputPrice和getOutputPrice分别从两种代币角度计算价格:
已有∆x数量的x代币,想知道能换得y代币数量
想换取∆y数量的y代币,想知道需要x代币数量
最终的价格是一致的,价格计算公式只区分价格计算的两种方向(x->y & y->x),不与具体的代币类型挂钩。例如,交易对ETH/UNI,可以把ETH当作x,UNI当作y,同样你也可以将UNI当作x,ETH当作y,这就是抽象。
本文内容主要参考: https://github.com/runtimeverification/verified-smart-contracts/blob/uniswap/uniswap/x-y-k.pdf https://uniswap.org/whitepaper.pdf
本文依然可以感受到uniswap 做市商模型的简洁,
下一节继续分析uniswap中添加移除流动性产生的影响。
欢迎关注公众号:blocksight
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!