Post

W4-1 UniswapV3分析

W4-1 UniswapV3分析

Uniswap V2的问题

  • 在所有价格段提供资⾦(0,infinity),资⾦利⽤率低
  • 资⾦利⽤率(Capital Efficiency) = 实际使⽤的资⾦/ 所提供的资⾦ image1

Uniswap v3

通过集中式流动性提⾼资⾦利⽤率

image2

    1. 价格通常两点之间波动(a点和b点)
    1. c 到 a, 消耗资⾦为 Yreal
    1. c 到 b, 消耗资⾦为 Xreal
    1. 若在 [a,b] 提供流动性,仅需提供Xreal Yreal

虚拟流动性

image3

  • 引⼊虚拟流动性 K =(X+Xvirtual)*(Y+Yvirtual)
  • L:流动性,p: 价格(y的) image4

流动性聚合

image5

  • 叠加流动性:引⼊Tick,使⽤等⽐数列将价格区间分段,添加流动性只能选择对应的离散点作为价格边 界
  • tickspacing: 并不是每⼀个价格需要都可⽤,定义价格密度 image6

管理流动性的变化量

  • 跟踪中的流动性及每个 tick 引起的流动性变化 image7

设计原理

V2版本的Uniswap官方认为最大的痛点在于资金利用率(Capital Efficiency)太低,因此V3版本在解决这个的同时,带来了👇的改进:

  • 可灵活选择价格区间提供流动性(增强流动性)
  • 更好用的预言机
  • range order 功能
  • 灵活的费率

手续费

  • 若统⼀价格区间:
    • ⽤户⼿续费 fee = deltaL * (fee global/liquidity global)
  • 交易⼿续费累加值更新
    • feeGrowthGlobal + = deltafee/liquidity

image8

  • 有多个区间时,如何获得某个区间的交易⼿续费(单位LP⼿续费累计值)
  • f(il,iu) = fg − fb(il) − fa(iu)

image9

  • 在(i,u)区间发⽣的交易⼿续费累加,但是外侧的⼿续费是不变的,只需要累加 fg
  • 因此可以在tick上,加⼊feeGrowthOutside(fo) ,记录该 tick 外侧的⼿续费总量

预言机

  • V2 合约中记录了 price0CumulativeLast, price0CumulativeLast ,但是需要外部更新保存,然后计算算术平均价格
  • V3 使⽤ 跟踪价格的 tick

代码设计

image10

  • NonfungiblePositionManager:
    • positions:获取仓位信息
    • createAndInitializePoolIfNecessary: 创建 Pool 池
    • mint: 新增流动性(发⾏NFT)
    • increaseLiquidity、decreaseLiquidity: 添加、减少流动性
    • collet: 收集⼿续费
    • burn: 删除流动性
  • SwapRouter
    • exactInputSingle、exactOutputSingle : 单个交易对兑换
    • exactInput、exactOutput : 可设置 path,对多个交易对兑换
    • uniswapV3SwapCallback:swap 时进⾏回调,⽀付真正的 token

合约关系图

image11

添加流动性

image12

Swap

image13

参考资料

This post is licensed under CC BY 4.0 by the author.