# Source Code 1: Uniswap v2

By [tnkrxyz](https://paragraph.com/@tnkrxyz) · 2022-05-11

---

Uniswap V2的Contract分成[V2-Core](https://github.com/Uniswap/v2-core)和[V2-periphery](https://github.com/Uniswap/v2-periphery/)。

V2-Core Contract 结构
===================

Uniswap V2 core contract由interface, libraries以及UNI-V2 token (ERC20)，Pair, 和Pair Factory合约组成。

Interfaces
----------

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
---------

Libraries包括Math（min, sqrt）, SafeMath（防止uint25溢出）和Uniswap自创的支持小数的UQ112xUQ112库。

Contracts
---------

### UNI-V2 token (ERC20)

liquidity provider (LP)为Uniswap V2添加liquidity时mint一定数量的UNI-V2 ERC20 token；反之，LP移除liquidity时burn UNI-V2 token。

V2-periphery
============

V2-periphery最主要的contract是[UniswapV2Router02.sol](https://github.com/Uniswap/v2-periphery/blob/master/contracts/UniswapV2Router02.sol)，除此之外还有interfaces和libraries，以及升级V1 exchange到V2的[UniswapV2Migrator](https://github.com/Uniswap/v2-periphery/blob/master/contracts/UniswapV2Migrator.sol)。下面着重介绍UniswapV2Router02.sol和[UniswapV2Library.sol](https://github.com/Uniswap/v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol)。

UniswapV2Router02.sol
---------------------

Uniswap V2 Router包装V2-Core的功能，根据用户的需求，对输入的数据做检查，调用V2-Core contract来完成与用户的交互。Router contract的主要函数属于三大类：添加流动性（AddLiquidity），移除流动性(removeLiquidity)和swap。contract里多数的函数只是为了能够处理ETH（非 ERC20）和 Fee-On-Transfer Token，以及允许LP用户授权(permit)第三方来移除流动性。

### ETH

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.

Fee-on-transfer token
---------------------

某些ERC20 token contract在token transfer时会征收一定的费用(fee)。Uniswap V2在处理此类token时，不再做条件检查（比如移除流动性时，得到fee-on-token的数量必须大于用户设定的最小值）。添加流动性不需要对此类token做特殊处理，因为liquidity pool (pair)只用关心最终收到（扣除fee以后）的token的数量。

---

*Originally published on [tnkrxyz](https://paragraph.com/@tnkrxyz/source-code-1-uniswap-v2)*
