70

uniswap交易价格计算

 3 years ago
source link: https://learnblockchain.cn/article/1492
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

交易价格的计算有两种类型:一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input);一种是给定Y的数量,计算需要的X数量(Output)。

写在前面

上一节说了 Uniwap自动化做市商核心算法解析 , 这一节继续说Uniwap做市商算法之价格计算。

本文的基础是上一篇,建议认真理解,否则理解本篇有一定难度。系好安全带,准备出发!

uniswap交易价格计算

交易价格的计算有两种类型: 一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input); 一种是给定Y的数量,计算需要的X数量(Output)。

本文接着上篇加入费用模型的算法。上一节的符号定义全部直接使用,不再重复说明。

给定X数量计算Y

假设要卖出∆x, = ∆x / x,则用来计算可以换取的 ∆y的函数记为getInputPrice如下:

eAnyE3y.png!mobile

r = 1 - ρ , ρ是费率。交换后,x, y代币余量变化如下:

7ze6b2A.png!mobile

本次交易,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数量计算X

假设要卖出∆y, $\beta$= ∆y / y,则用来计算可以换取的 ∆x的函数记为getOutPrice如下: namENjQ.jpg!mobile

注意:这里依然是使用一定数量x来交换y, 不是用y交换x. 这里已知的是∆y,求出需要准备的∆x 可以看出当 $\beta$= 1/2 时,大约需要当前流动性中等量的x代币, 这一结果跟上面getInputPrice 是一致的。

交换后x, y剩余量更新如下: ZRrmeim.jpg!mobile

上一节已经对该公式做了分析,看下此时y代币价格:

Irm2qua.jpg!mobile

代入 = ∆y / y,化简得: $\frac{\Delta x}{\Delta y}=\frac{1}{(1-\beta)\gamma}* \frac{x}{y}$

可见$\beta$ 越大,价格越高。直面理解,置换出的∆y越多,池子里y代币就越少,同时x代币有所增加∆x,y的价格自然上升。

小结

getInputPrice和getOutputPrice分别从两种代币角度计算价格:

  1. 已有∆x数量的x代币,想知道能换得y代币数量

  2. 想换取∆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中添加移除流动性产生的影响。

欢迎关注&在看, 疑问请留言!

写在前面

上一节说了 Uniwap自动化做市商核心算法解析 , 这一节继续说Uniwap做市商算法之价格计算。

本文的基础是上一篇,建议认真理解,否则理解本篇有一定难度。系好安全带,准备出发!

uniswap交易价格计算

交易价格的计算有两种类型: 一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input); 一种是给定Y的数量,计算需要的X数量(Output)。

本文接着上篇加入费用模型的算法。上一节的符号定义全部直接使用,不再重复说明。

给定X数量计算Y

假设要卖出∆x, = ∆x / x,则用来计算可以换取的 ∆y的函数记为getInputPrice如下:

eAnyE3y.png!mobile

r = 1 - ρ , ρ是费率。交换后,x, y代币余量变化如下:

7ze6b2A.png!mobile

本次交易,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数量计算X

假设要卖出∆y, $\beta$= ∆y / y,则用来计算可以换取的 ∆x的函数记为getOutPrice如下: namENjQ.jpg!mobile

注意:这里依然是使用一定数量x来交换y, 不是用y交换x. 这里已知的是∆y,求出需要准备的∆x 可以看出当 $\beta$= 1/2 时,大约需要当前流动性中等量的x代币, 这一结果跟上面getInputPrice 是一致的。

交换后x, y剩余量更新如下: ZRrmeim.jpg!mobile

上一节已经对该公式做了分析,看下此时y代币价格:

Irm2qua.jpg!mobile

代入 = ∆y / y,化简得: $\frac{\Delta x}{\Delta y}=\frac{1}{(1-\beta)\gamma}* \frac{x}{y}$

可见$\beta$ 越大,价格越高。直面理解,置换出的∆y越多,池子里y代币就越少,同时x代币有所增加∆x,y的价格自然上升。

小结

getInputPrice和getOutputPrice分别从两种代币角度计算价格:

  1. 已有∆x数量的x代币,想知道能换得y代币数量

  2. 想换取∆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中添加移除流动性产生的影响。

欢迎关注&在看, 疑问请留言!

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 6分钟前
  • 阅读 ( 4 )
  • 学分 ( 0 )
  • 分类:Uniswap

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK