Uniswap 是一个基于以太坊的去中心化交易所(DEX),它允许用户在不同的ERC-20代币之间进行交易,Uniswap 使用一种称为自动做市商(Automated Market Maker,AMM)的机制来确定代币的价格,本文将详细介绍 Uniswap 中的价格计算方法。
1. Uniswap v1:恒定乘积模型
Uniswap v1 使用了一个简单的恒定乘积模型来确定代币的价格,在这个模型中,假设有两种代币:X 和 Y,X 和 Y 的流动性池中分别有 x
和 y
个代币,恒定乘积模型的公式为:
k = x * y
k
是一个常数,它等于代币 X 和 Y 的乘积,在交易过程中,这个乘积保持不变。
价格计算
假设用户想要用代币 X 购买代币 Y,交易量为 dx
个 X 代币,交易后的 X 代币数量变为 x dx
,Y 代币的数量需要调整为 k / _x dx)
以保持乘积不变,购买 Y 代币的数量 dy
可以通过以下公式计算:
dy = y - k / _x dx)
代币 Y 的价格(以 X 计价)可以通过以下公式计算:
price_Y_in_X = _dy) / _dx)
类似地,如果用户想要用代币 Y 购买代币 X,价格计算方法也是类似的。
2. Uniswap v2:恒定乘积模型 流动性提供者费用
Uniswap v2 在 v1 的基础上增加了流动性提供者(Liquidity Provider,LP)的费用,这个费用用于奖励 LP,以鼓励他们向流动性池提供代币。
假设 LP 费用为 fee
(0.3%,则 fee = 0.003
),则在交易过程中,交易者需要支付额外的费用,计算公式如下:
交易代币 X 购买代币 Y
1、计算交易后的 X 代币数量(考虑 LP 费用):
```
x_new = x - dx * _1 - fee)
```
2、计算交易后的 Y 代币数量(不考虑 LP 费用,因为 Y 代币是购买的):
```
y_new = y dy
```
3、重新计算常数 k
:
```
k_new = x_new * y_new
```
4、计算购买 Y 代币的数量 dy
:
```
dy = y - k_new / _x dx * fee)
```
5、计算代币 Y 的价格(以 X 计价):
```
price_Y_in_X = _dy) / _dx * fee)
```
交易代币 Y 购买代币 X
1、计算交易后的 Y 代币数量(考虑 LP 费用):
```
y_new = y - dy * _1 - fee)
```
2、计算交易后的 X 代币数量(不考虑 LP 费用):
```
x_new = x dx
```
3、重新计算常数 k
:
```
k_new = x_new * y_new
```
4、计算购买 X 代币的数量 dx
:
```
dx = x k_new / _y dy * fee) - x
```
5、计算代币 X 的价格(以 Y 计价):
```
price_X_in_Y = _dx * fee) / _dy)
```
3. Uniswap v3:集中流动性模型
Uniswap v3 引入了集中流动性模型(Concentrated Liquidity Model),允许 LP 在特定的价格范围内提供流动性,这使得 LP 可以更有效地管理风险,并在价格波动时获得更高的收益。
在 Uniswap v3 中,价格计算变得更加复杂,因为它涉及到非线性的数学模型,简单来说,v3 使用一个称为“Ticks”的系统来表示价格范围,每个 Tick 对应一个特定的价格,LP 可以在特定的 Tick 范围内提供流动性,而交易者则在这些 Tick 之间进行交易。
价格计算
在 Uniswap v3 中,价格计算涉及到以下几个关键概念:
1、Ticks:表示价格范围的整数。
2、Liquidity:在特定 Tick 范围内的流动性总量。
3、Position Notional Value:LP 在特定 Tick 范围内的代币价值。
价格计算的具体方法涉及到对 Tick 区间的搜索和计算,以及对流动性和 LP 头寸的评估,由于涉及到较为复杂的数学和算法,这里不再详细展开。
结论
Uniswap 的价格计算方法随着版本的升级而不断优化,从 v1 的简单恒定乘积模型,到 v2 的引入 LP 费用,再到 v3 的集中流动性模型,Uniswap 不断提高其交易效率和风险管理能力,了解这些价格计算方法有助于用户更好地参与 Uniswap 交易,以及为 LP 提供流动性。