[英]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 接收方地址)?
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)
指的是当前合约地址, balanceOf
是UniswapV2ERC20
内部的映射。
mapping(address => uint) public balanceOf;
由于UniswapV2Pair
继承自UniswapV2ERC20
,我们可以直接访问balanceOf
合约中的UniswapV2Pair
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.