前言
UniSwap在Github上开源了全部合约代码,主要包括核心合约代码,周边合约两部分,均使用Solidity语言编写。其中核心合约它为Uniswap上所有交易对提供基础的安全保证,代码包括3个合约:工厂合约,配对合约,ERC20合约。周边合约用来和核心合约交互,方便用户和前端使用,但并不是核心合约的一部分,中包括一些示例代码,例如价格预言机,闪电交换等,其中比较中重要的是路由合约,还有其他一些Library库合约Uniswap V2中的库提供了大量便利工具。
核心合约简介
工厂合约(UniswapV2Factory.sol)
作用:负责布署配对合约
代码方法介绍
构造函数
/**
* 构造函数
* @param _feeToSetter 收税开关权限控制(feeTo的设置者)
*/
constructor(address _feeToSetter) public {
feeToSetter = _feeToSetter;
}
setFeeTo 设置收税地址
uniswap中每次交易代币会收取交易额的0.3%的手续费分配给流动性的提供者,若feeTo地址不为0时,将会分出手续费中的1/6给开发者团队(就是feeTo地址),如果feeTo地址为0,说明开关关闭,就不从流动性提供者的手续费中分1/6给团队开发者。(这部分逻辑没有体现在factory里面)
/**
* 用于设置收税地址(只有feeToSetter才可以设置)
* @param _feeTo 收税地址
*/
function setFeeTo(address _feeTo) external {
require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
feeTo = _feeTo;
}
setFeeToSetter 用于设置feeToSetter地址,必须是现任feeToSetter才可以设置
/**
* 设置收税权限控制
* @param _feeToSetter 收税权限控制
*/
function setFeeToSetter(address _feeToSetter) external {
require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
feeToSetter = _feeToSetter;
}
createPair 创建交易对方法
/**
* 创建配对
* @param tokenA TokenA 地址
* @param tokenB TokenB 地址
* @return pair 配对地址
*
*/
function createPair(address tokenA, address tokenB) external returns (address pair) {
//必须是两个不一样的ERC20合约地址
require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
//让tokenA和tokenB的地址从小到大排列
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
//token地址不能是0
require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
//必须是uniswap中未创建过的pair
require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
//获取模板合约UniswapV2Pair的creationCode
bytes memory bytecode = type(UniswapV2Pair).creationCode;
//以两个token的地址作为种子生产salt
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
//直接调用汇编创建合约
assembly {
pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
//调用pair地址的合约中的"initialize"方法,传入变量token0,token1
IUniswapV2Pair(pair).initialize(token0, token1);
//记录刚刚创建的合约对应的pair
//记录token0=>token1=pair
getPair[token0][token1] = pair;
//记录token1=>token0=pair
getPair[token1][token0] = pair; // populate mapping in the reverse direction
//配对数组中推入pair地址
allPairs.push(pair);
//触发配对成功事件
emit PairCreated(token0, token1, pair, allPairs.length);
}
配对合约(UniswapV2Pair.sol)
作用:继承ERC20合约,每一个交易对都有一个配对合约,基本属性如reserve0/reserve1 以及 total supply。reserve0/reserve1 是交易对的两种代币的储存量。total supply 是当前流动性代币的总量, reserve0*reserve1 的乘积不变。
包含主要方法如下
initialize prir初始化方法
/**
初始化方法,创建交易对是由工厂合约调用
* @param _token0 token0
* @param _token1 t

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



