前言
前段时间看了下uniswap相关的白皮书及源码,在此想做一个系列总结,不求面面俱到,尽量简单而概括并凸出重点,让新手和高手都能得到一些收获。
概要
一图胜千言,上图就是精简版的uniswap执行流程。用户通过EOA账号(比如小狐狸)或者自己编写的智能合约通过 Factory或 Router合约与Pair(核心合约)交互。那Factory的作用主要是创建并 初始化 pair合约,而 Router的作用主要是执行三大函数 mint, burn, swap, 下面也将围绕着三个函数分别讲一下源码。
mint
mint铸造函数主要用于创建和添加流动性,现实中的使用场景是ERC20项目方发布自动的token后,通过uniswap创建 pair来提供流动性,方便用户购买其token。或者是某些token的持有者,想通过提供流动性来获取0.3%的交易手续费。
mint源码解析
在调用此铸造函数前,调用者已经在当前区块的同一笔交易中存入对应的token1 和 token2, 调用此函数式为了获取流动性token(一种资产权益证明的ERC20token), 用来记录你在改流动性交易对中的份额占比,将来用户赎回流动性计算时使用。
1行: 入参to地址就是 提供流动性token的EOA或合约地址,也是用于接受 liquidity token的地址。出参便是此次因为提供两种代币而获取的 liquidity token的数量;
2行:通过调用external 方法获取当前的两个token的reserve, reserve记录的是该交易发生前两种代币的数量,是历史记录。这种操作节约gas费。
3~4行:通过标准的ERC20接口获取当前pair地址的两个代币余额,此时的余额应当包含当前交易刚刚转入的余额。
5~6行:通过safeMath安全库的sub操作计算当前交易中刚转入的余额;
8行:uniswap项目方通过feeon开关收取 交易费用0.3%中1/6的手续费,即万分之五的交易手续费,目前这个还没开启,为了精简篇幅,先略过。
11~12行:_totalSupply为0,说明这是第一次添加流动性,首次的流动性 k=, amount0* amount1 也是uniswap自动做市商的核心算法: constant product formula 恒定成积;min是为了首次提高创建流行性的成本,也相当于收税,值为可以忽略不计的1000;
14行:如果不是首次创建流动性,而是后续陆续的添加,则按照token的新增数据占目前余额的比值,计算对应的新增流动性。注意这里是取最小值,所以LP 提供者一定要按照比例添加流动性,不然就亏了。
17行:按照ERC20标准铸造流动性token。
18行:主要是将reserve更新为最新的balance, 并提过价格累计算法提供币价预言机功能。