Uniswap v3 学习笔记
概述
v2核心公式
x*y=k
,即池子中资产X的数量 * 资产Y的数量 = 流动性数量
。
但是资金利用率不高
当用户用 X 换取 Y 的时候,价格会从低点涨到高点,红点从 p_lower
移动到 p_upper
的过程中(X 的价格),实际参与交易的流动性仅仅是橙色的矩形区域。
所以提高利用率的关键是既要移除那些躺在那不干活的流动性(绿色区域),又要保证这个函数模型不变。于是我们将其换成了虚拟的流动性,即 x_virtual
和 y_virtual
,而添加流动性时,只需要注入橙色区域的流动性即可。于是公式变成了如下模样:
1 |
|
整个图形向左下方平移了,因为价格是直线的斜率,所以平移对于实际交易是没有影响的。前提是价格没有超出限定的区间。
v3核心公式
将代表流动性的 k
换成 𝐿^2
即 L 的平方
可以看出 x_virtual
的长度实际是 p_upper
点的 x,而 y_virtual
的长度实际上是 p_lower
点的 y。
有价格的公式 y = p*x
和 xy=L^2
可以得出
1 |
|
可以看到,公式中是将 p_upper
和 p_lower
作为已知的变量,所以在 V3 中添加流动性,是需要用户自己设置需要做市的价格区间的。V3 中创建者不同或者价格区间不同(或手续费水平不同,后面展开讨论)都是不同的流动性头寸 position
。
AMM
AMM,全称Automated Market Makers,翻译过来是自动做市商。其基础模型来源于Vitalik于2017年发表的博客,讨论了“恒定乘机公式”,即每一个Uniswap Pair 中存有两种资产,并为这两种资产提供流动性。
swap中的曲线移动
mint中的曲线移动
burn是mint的逆向
源码阅读
Uniswap v3 在代码层面的架构和 v2 基本保持一致,将合约分成了两个仓库:
- Uniswap-v3-core
- UniswapV3Factory 是交易池(UniswapV3Pool)统一创建的接口。
- UniswapV3Pool 由 UniswapV3PoolDeployer 统一部署。 实现代币交易,流动性管理,交易手续费的收取,oracle 数据管理。接口的实现粒度比较低,不适合普通用户使用,错误的调用其中的接口可能会造成经济上的损失。 UniswapV3Pool 是核心逻辑,管理了 Tick 和 Position,实现流动性管理以及一个交易池中 swap 功能实现。
- Uniswap-v3-periphery
- NonfungiblePositionManager 负责交易池的创建以及流动性的添加删除,用来增加/移除/修改 Pool 的流动性,并且通过 NFT token 将流动性代币化。使用 ERC721 token(v2 使用的是 ERC20)的原因是同一个池的多个流动性并不能等价替换(v3 的集中流性动功能)。
- SwapRouter 是 swap 路由的管理。提供代币交易的接口,它是对 UniswapV3Pool 合约中交易相关接口的进一步封装,前端界面主要与这个合约来进行对接。
Uniswap Part Ⅰ | 创建交易对 - Sissice’s Blog
Uniswap Part Ⅱ | 提供/移除流动性 - Sissice’s Blog
Uniswap Part Ⅲ | 交易过程 - Sissice’s Blog
Uniswap Part Ⅳ | 交易手续费 - Sissice’s Blog