Uniswap V2的Contract分成V2-Core和V2-periphery。
Uniswap V2 core contract由interface, libraries以及UNI-V2 token (ERC20),Pair, 和Pair Factory合约组成。
Interface包括IERC20和IUniswapV2ERC20, IUniswapV2Callee,IUniswapV2Factory,和IUniswapV2Pair。
IUniswapV2ERC20和IERC20定义了ERC20接口。IUniswapV2ERC20与标准IERC20的区别是IUniswapV2ERC20定义了DOMAIN_SEPARATOR, PERMIT_TYPEHASH, nonces, 和permit四个function. 他们的主要作用是支持meta transaction(允许UniswapV2ERC20 token持有人授权第三方来转移token)。
IUniswapV2Callee定义了flash swap时用户可以自定义的uniswapV2Call的接口。
IUniswapV2Factory和IUniswapV2Pair为UniswapV2Factory和UniswapV2Pair定义了接口。
Libraries包括Math(min, sqrt), SafeMath(防止uint25溢出)和Uniswap自创的支持小数的UQ112xUQ112库。
liquidity provider (LP)为Uniswap V2添加liquidity时mint一定数量的UNI-V2 ERC20 token;反之,LP移除liquidity时burn UNI-V2 token。
V2-periphery最主要的contract是UniswapV2Router02.sol,除此之外还有interfaces和libraries,以及升级V1 exchange到V2的UniswapV2Migrator。下面着重介绍UniswapV2Router02.sol和UniswapV2Library.sol。
Uniswap V2 Router包装V2-Core的功能,根据用户的需求,对输入的数据做检查,调用V2-Core contract来完成与用户的交互。Router contract的主要函数属于三大类:添加流动性(AddLiquidity),移除流动性(removeLiquidity)和swap。contract里多数的函数只是为了能够处理ETH(非 ERC20)和 Fee-On-Transfer Token,以及允许LP用户授权(permit)第三方来移除流动性。
Uniswap v2处理ETH的方法是将LP存入的ETH转给WETH contract,WETH contract再给liquidity pool (pair)转入等量的WETH (Wrapped ETH) - 一个ERC20 token。移除流动性(removeLiuquidity)时则反向操作:从liquidity pool将相应数量的WETH返还给WETH contract,取出(withdraw)等量的ETH转给removeLiquidity的LP.
某些ERC20 token contract在token transfer时会征收一定的费用(fee)。Uniswap V2在处理此类token时,不再做条件检查(比如移除流动性时,得到fee-on-token的数量必须大于用户设定的最小值)。添加流动性不需要对此类token做特殊处理,因为liquidity pool (pair)只用关心最终收到(扣除fee以后)的token的数量。
