Uniswap
uniswap
uniswapv2
resources
uniswapv2-core
uniswapv2-core 架构图:
uniswapv2-periphery
tips
uniswapv2的Oracle
uniswapv2版本起,就已经提供了预言机功能,用来计算交易对的时间加权平均价(TWAP, Time Weighted Average Price), 但是存在下面几个问题:
- v2版本的预言机使用门槛比较高,官方合约中只提供了最新的价格累积值,开发者需要自己实现历史价格的记录和抓取
- 在使用DEX预言机时,但是在v2版本我们无法通过简单的方式获取交易对深度变化的历史数据
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