UniSwapv2_核心合约学习笔记

前言

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值