UniswapV2合约学习之路(一) 【ExampleFlashSwap】2020-12-29

记得朋友圈看到过一句话,如果Defi是以太坊的皇冠,那么Uniswap就是这顶皇冠中的明珠。Uniswap目前已经是V2版本,相对V1,它的功能更加全面优化,然而其合约源码却并不复杂。本文为个人学习UniswapV2源码的系列记录文章。

本学习过程引用自博客


pragma solidity =0.6.6;

//导入UniswapV1版本的factory合约接口和交易对接口
import './interfaces/V1/IUniswapV1Factory.sol';
import './interfaces/V1/IUniswapV1Exchange.sol';

//导入IUniswapV2Callee接口,该接口定义了一个接收到代币后的回调函数。在Uniswapv2核心合约中的交易对合约的swap函数有这么一行代码
//if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
//这正是调用了该函数。这行代码在用户得到买入的资产后立即调用了,且发生在用户卖出资产之前。
//用户可以在这个空隙利用uniswapV2Call这个回调函数做自己想做的任意操作,
//比如说套利等。因此,此回调函数再加上UniswapV2交易对的先买进再卖出机制是实现套利的核心
// import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Callee.sol';
import './interfaces/V2/IUniswapV2Callee.sol';
//导入UniswapV2版的工具库及Router接口,标准ERC20代币接口和WETH接口
import './interfaces/V2/IUniswapV2Router01.sol';

import './interfaces/IERC20.sol';
import './interfaces/IWETH.sol';

import './libraries/UniswapV2Library.sol';

这一行为合约定义,它必须实现 IUniswapV2Callee,也就是必须实现 uniswapV2Call 这个函数,不然无法进行回调会报错重置交易
contract ExampleFlashSwap is IUniswapV2Callee {
    
    
    IUniswapV1Factory immutable factoryV1; // V1版本的factory实例  vyper:0.1.0b4 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95
    
    // 为什么这里V2版本的factory为地址类型而不为实例(合约类型)呢?
    // 因为下面的IUniswapV2Callee函数会利用该地址进行大量的计算(见工具库),所以这里使用地址类型更方便一些
    address immutable factory; // V2版本的factory地址 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
    
    IWETH immutable WETH; // WETH的实例  WETH9 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
                                                            // V2 router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 
    constructor(address _factory, address _factoryV1, address router) public {
   
// 利用输入参数对上面三个状态变量初始化。注意,WETH实例的初始化不是直接传入的WETH合约地址,而是利用Router合约得到的。   
// 其实WETH合约人人都可以部署一个,是可以存在多个的。
// 如果存在这种情况,到底用哪个地址实例化呢?用Router合约用到的那个地址才是一致的,是准确无误的。
        factoryV1 = IUniswapV1Factory(_factoryV1);
        factory = _factory;
        WETH = IWETH(IUniswapV2Router01(router).WETH());
    }
    
        uint public ETHAmount;
        address WETH9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
        
        event see_thisContract_swapedWETH9(uint swapedWETH9);
        
    function ETH_to_WETH9() public payable {
    // 第一步  ETH --> WETH9
        ETHAmount = msg.value;
        IWETH(WETH9).deposit{
   value: ETHAmount }()

你可能感兴趣的:(Solidity之路,区块链)