- 创建.env文件,写入
ETHEREUM_RPC_URL
npm install
npx hardhat compile
- 对于UniswapV2 Price的测试,使用
npx hardhat test --grep "UniswapV2 price"
- 对于UniswapV3 Price的测试,使用
npx hardhat test --grep "V3 price"
UniswapV2使用常量乘积函数管理流动性,先来解决两个实际会遇到的数学问题:
1)在常量乘积函数下,如果用户存入Δx 个tokenA,可以兑换出多少个tokenB?
2)在常量乘积函数下,如果用户希望兑出Δx 个tokenA,则需要存入多少个tokenB?
如果以tokenA作为基准,对于用户来说,问题1相当于tokenA的卖出价,而问题2相当于tokenA的买入价。
先从常识的角度出发下一个结论:和外汇交易一样,在相同的市场环境下,卖出价≤买入价,否则就是虚幻的永动机了。
假设用户存入Δx个tokenA,可以兑换出 Δy个tokenB。兑换前后tokenA和tokenB的数量均符合常量乘积函数
UniswapV2会收取交易费率 ρ(0.3%)。交易费属于固定费率,每一笔交易都需要收取。交易费用属于前端收费,即收取Δx × ρ个tokenA作为费用。
问题1)已知当前pool的x和y,存入Δx,拟兑出 Δy,常量乘积函数如下:
则Δy为:
问题2)已知当前pool的x和y,希望兑出Δx,拟存入Δy,常量乘积函数如下:
则Δy为:
相比V2,UniswapV3延续了常量乘积函数理念,但引入了集中流动性,即流动性提供者可以指定存入token对应的价格,存入token仅在价格区间内实现兑换,价格区间外无法兑换。集中流动性可以让LP提供的token更有效率地赚钱LP费用。 资产池中存在两种token,价格比例用 y/x = P 表示,资产池中的token仅在 Pₙ≤P≤Pₘ价格区间。 所以可以把常量乘积函数调整为如下形式,用来表示曲线EF:
价格区间 Pₙ≤P≤Pₘ,且xₙ和xₘ来自于N点和M点,所以可以推导出:
所以上面的公式很清楚的说明了,**在已知当前流动性L、当前价格P、拟兑换的价格Pt,如果需要存入Δx个token x,则可以根据公式(8)测算出兑换出的Δy。**这个结论有两个前提,1)拟兑换的价格Pt在当前价格区间内;2)当前价格区间的流动L完全可以满足兑付Δx。
上面的说明只摘抄了部分内容,详细公式推导可以参见Notion。