Uniswap v3 学习笔记

概述

Uniswap v3 白皮书

v2核心公式

x*y=k,即池子中资产X的数量 * 资产Y的数量 = 流动性数量

price changing

但是资金利用率不高

liquidity rate

当用户用 X 换取 Y 的时候,价格会从低点涨到高点,红点从 p_lower 移动到 p_upper 的过程中(X 的价格),实际参与交易的流动性仅仅是橙色的矩形区域。

所以提高利用率的关键是既要移除那些躺在那不干活的流动性(绿色区域),又要保证这个函数模型不变。于是我们将其换成了虚拟的流动性,即 x_virtualy_virtual,而添加流动性时,只需要注入橙色区域的流动性即可。于是公式变成了如下模样:

1
(x + x_virtual)*(y + y_virtual)=k

real liquidity

整个图形向左下方平移了,因为价格是直线的斜率,所以平移对于实际交易是没有影响的。前提是价格没有超出限定的区间

v3核心公式

将代表流动性的 k 换成 𝐿^2 即 L 的平方

可以看出 x_virtual 的长度实际是 p_upper 点的 x,而 y_virtual 的长度实际上是 p_lower 点的 y。

有价格的公式 y = p*xxy=L^2

可以得出

1
2
3
4
5
6
7
8
9
x = L / √p
y = L * √p

//也就是
x_virtual = L / √p_upper
y_virtual = L * √p_lower

//即核心公式
(x + L / √p_upper) * (y + L * √p_lower) = L^2

可以看到,公式中是将 p_upperp_lower 作为已知的变量,所以在 V3 中添加流动性,是需要用户自己设置需要做市的价格区间的。V3 中创建者不同或者价格区间不同(或手续费水平不同,后面展开讨论)都是不同的流动性头寸 position

AMM

AMM,全称Automated Market Makers,翻译过来是自动做市商。其基础模型来源于Vitalik于2017年发表的博客,讨论了“恒定乘机公式”,即每一个Uniswap Pair 中存有两种资产,并为这两种资产提供流动性。

swap中的曲线移动

image20210717105238162.png

mint中的曲线移动

image-20221004205749992

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

Uniswap Part Ⅴ | 预言机 - Sissice’s Blog

Uniswap Part Ⅵ | 闪电贷 - Sissice’s Blog


Uniswap v3 学习笔记
http://sissice.github.io/2022/10/04/uniswap-v3-learning/
作者
Sissice
发布于
2022年10月4日
许可协议