繁体   English   中英

关于销毁函数中流动性的问题,UniswapV2Pair.sol

[英]Question about liquidity in burn function, UniswapV2Pair.sol

// UniswapV2Pair.sol burn function
function burn(address to) external lock returns (uint amount0, uint amount1){
    // ...
    uint balance0 = IERC20(_token0).balanceOf(address(this));
    uint balance1 = IERC20(_token1).balanceOf(address(this));
    uint liquidity = balanceOf[address(this)];
    // ...
}

address(this) 是指合约实例的地址,这意味着流动性由 UniswapPair 实例拥有。

为什么流动性不等于 balanceOf[to](LP Token 接收方地址)?

这是UniswapV2Pair.sol

contract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {}

UniswapV2Router02.sol合约添加流动性时

 function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(pair).mint(to);
    }

流动性是铸造的liquidity = IUniswapV2Pair(pair).mint(to) 这是 lp 令牌,它的类型是UniswapV2ERC20 每对或每个UniswapV2Pair合约都有一个 LP 代币。 因此,当您在UniswapV2Pair中销毁 LP 代币时,您实际上是在销毁属于UniswapV2Pair合约本身的 LP 代币。

 uint liquidity = balanceOf[address(this)]

address(this)指的是当前合约地址, balanceOfUniswapV2ERC20内部的映射。

mapping(address => uint) public balanceOf;

由于UniswapV2Pair继承自UniswapV2ERC20 ,我们可以直接访问balanceOf合约中的UniswapV2Pair

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM