Uniswap

uniswap

uniswapv2

  • resources

  • uniswapv2-core

    uniswapv2-core 架构图:

  • uniswapv2-periphery

  • tips

    • uniswapv2的Oracle

      uniswapv2版本起,就已经提供了预言机功能,用来计算交易对的时间加权平均价(TWAP, Time Weighted Average Price), 但是存在下面几个问题:

      • v2版本的预言机使用门槛比较高,官方合约中只提供了最新的价格累积值,开发者需要自己实现历史价格的记录和抓取
      • 在使用DEX预言机时,但是在v2版本我们无法通过简单的方式获取交易对深度变化的历史数据

      uniswap v2版本中,Pair合约中记录了price0CumulativeLast, price0CumulativeLast两个状态值,分别表示上一次价格更新时,价格的时间累积值,计算公式为:
      At = P1 + P2 + ... + Pi(i=t)
      

      通过访问不同时间点的价格时间累积值,我们可以计算一个交易对在过去一段时间内的价格平均值。假设当前时间为t1, 5min前的时间为t2,那么可以计算过去5min交易对的平均价格:

      Pt2,t1 = (At2 - At1) / (t2- t1)
      

      这会开发者带来一个问题是: 开发者需要自己记录历史时间点中的价格累积值At, 而这些工作是相对复杂的。Github中有人开源通用的 Uniswap v2 Oracle , Uniswap v2官方也给出了一个相对简单的 Oracle 合约实现 , Fei Protocol中使用的Oracle就是参考这个样例实现的.

    • Router2合约相对Router1合约的更改

      getAmountIn()函数计算

      # UniswapV2Router01
      function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) public pure override returns (uint amountIn) {
          return UniswapV2Library.getAmountOut(amountOut, reserveIn, reserveOut);
      }
      
      # UniswapV2Router02
      function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
          public
          pure
          virtual
          override
          returns (uint amountIn)
      {
          return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
      }
      

      router1方式导致计算有稍微误差

    • Router合约exploit

      因为合约本身持有erc20,导致某些合约对持有人发放holder_profit时发放在router地址,而不是用户地址

      如果pair上有lp,直接调用burn()可以获取对应交易对

      通缩和通胀代币对uniswap有一定影响

      • 添加流动性时transfrom(msg.sender, pair, amount)
      • 移除流动性时transfer(to, amount);msg.sender = pair

      Uniswap router2 Fee事件: https://zhuanlan.zhihu.com/p/403487991

uniswap-v3