UniswapV2Factory.sol

pragma solidity =0.5.16;

import './interfaces/IUniswapV2Factory.sol';
import './UniswapV2Pair.sol';

contract UniswapV2Factory is IUniswapV2Factory {
    //存储一个手续费分成的发送地址;若为默认值,表示开发者不提取手续费
    address public feeTo;
    //存储安排feeTo地址的人的地址
    address public feeToSetter;

    //交易对中A代币的地址=>B代币的地址=>交易对的地址
    mapping(address => mapping(address => address)) public getPair;
    //存储全部交易对
    address[] public allPairs;

    //记录creatPair()创建了一个交易对,uint参数记录创建的交易对数量
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    //初始化时提交一个Setter地址,将之设置为安排手续费去向的管理者
    constructor(address _feeToSetter) public {
        feeToSetter = _feeToSetter;
    }

    //获取存储全部交易对的数列的长度
    function allPairsLength() external view returns (uint) {
        return allPairs.length;
    }

    //创建一个交易对,提交两种ERC20token的地址,返回交易对的地址
    function createPair(address tokenA, address tokenB) external returns (address pair) {
        //验证两种token是否相同,相同则报错
        require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
        //对地址进行由小到大排序,存入token0和token1)
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        //确保token0不为0(同时也就确定token1不为零)
        require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
        //确保此前为创建同样的交易对
        require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
        //获得UniswapV2Pair合约的creationCode并存入bytecode
        bytes memory bytecode = type(UniswapV2Pair).creationCode;
        //对token0、1进行abi编码及哈希转化,生成一个密码盐
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        //内联汇编
        assembly {
            //创建一个新合约(发送eth的数量wei,代码的起始内存地址,代码的长度,salt)
            pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
        }
        //对交易对初始化
        IUniswapV2Pair(pair).initialize(token0, token1);
        //记录下交易对
        getPair[token0][token1] = pair;
        getPair[token1][token0] = pair; // populate mapping in the reverse direction
        //将交易对记录进allPairs数组
        allPairs.push(pair);
        //记录日志
        emit PairCreated(token0, token1, pair, allPairs.length);
    }

    //设置分成费用的去向
    function setFeeTo(address _feeTo) external {
        require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
        feeTo = _feeTo;
    }

    //将安排手续费去向的管理员的身份进行移交
    function setFeeToSetter(address _feeToSetter) external {
        require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN');
        feeToSetter = _feeToSetter;
    }
}

 

你可能感兴趣的:(以太坊)