Periphery是uniswap的外围合约,将core合约封装起来提供给外部调用,比如我们在网页操作Swap时,请求的就是Periphery的合约。
Periphery里面写了Migrator和Router两个合约,其中Migrator是迁移合约,将流动性从Uniswap的V1版本迁移到V2版本,不涉及swap的功能,这里就不写了。
Router合约
using SafeMath for uint; address public immutable override factory; address public immutable override WETH; modifier ensure(uint deadline) { require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED'); _; } constructor(address _factory, address _WETH) public { factory = _factory; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract }
从基础部分开始看起,router合约中记录了factory
和WETH
地址,其中factory
用于获取pair
和创建新的pair
合约,而特别记录下WETH
的地址是为了支持以太坊链的主网币ETH
。
Uniswap中的代币操作都是基于ERC20
类型,但是ETH本身既不是ERC20
,也没有合约地址,因此为了ETH
也能参与swap,需要先将ETH
转换成WETH
,再进行后续的操作。Uniswap为了减少用户手动转换的麻烦,会在有ETH
参与的交易中自动执行ETH
与WETH
的相互转换,因此需要记录下WETH
的合约地址。
receive
方法中限制了只允许接收来自WETH
合约的ETH,即调用withdraw
方法取出ETH,除此之外不可直接向合约中转入ETH。
addLiquidity
addLiquidity是向合约添加流动性的方法
这一切,似未曾拥有