关于solidity:defi质押lp挖矿dapp系统开发合约部署详情

Uniswap 是去中心化的,不仅跟传统的加密货币交易所不同,也跟一般的去中心化代币交易所不同。Uniswap 是一组部署到以太坊网络的合约,所有的交易都在链上进行。

function addLiquidityETH(

    address token,
    uint amountTokenDesired,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline

) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {

    (amountToken, amountETH) = _addLiquidity(
        token,dapp流动性质押挖矿零碎开发卫星:hkkf5566
        WETH,
        amountTokenDesired,
        msg.value,
        amountTokenMin,
        amountETHMin
    );

    address pair = UniswapV2Library.pairFor(factory, token, WETH);

     //把coin从合约调用者账户转到币对

    TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);

    //把发送的eth兑换成WETH到swap合约
    IWETH(WETH).deposit{value: amountETH}();

    //swap合约把上一步兑换的weth充值到币对
    assert(IWETH(WETH).transfer(pair, amountETH));

    //增加流动性
    liquidity = IUniswapV2Pair(pair).mint(to);
    // 把发送的多于的eth发回给调用者
    if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
}

首先应用修改器做了一次工夫戳校验,传入的工夫戳必须大于以后区块的工夫戳。

modifier ensure(uint deadline) {
    require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
    _;
}

而后调用了_addLiquidity

// **** ADD LIQUIDITY ****
function _addLiquidity(
    address tokenA,  //yp
    address tokenB,  // Weth
    uint amountADesired, //yp amount
    uint amountBDesired, // msg.value 
    uint amountAMin, //滑点后
    uint amountBMin  //滑点后
) internal virtual returns (uint amountA, uint amountB) {
    // create the pair if it doesn't exist yet
    //创立币对
    if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
        IUniswapV2Factory(factory).createPair(tokenA, tokenB);

        }

    //
    (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
    if (reserveA == 0 && reserveB == 0) {
        (amountA, amountB) = (amountADesired, amountBDesired);

    } else {
        uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
        //计算出来的weth数量小于发送的eth数量
        if (amountBOptimal <= amountBDesired) {
            require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
            (amountA, amountB) = (amountADesired, amountBOptimal);
        } else {  //大于。
            uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
            assert(amountAOptimal <= amountADesired);


            require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
            (amountA, amountB) = (amountAOptimal, amountBDesired);
        }
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理