tokenA:自己发行的token tokenB:配对的token
对token而言,只有从from 到 to 地址 多少数量
正常通过from to 来判断只能判断出代币去了pair
而这个to = address(pair) 包含了卖出和添加流动性
但是
添加流动性 和 卖出 有个区别,就是添加流动性时 tokenB的数量是会增加的
所以我们可以利用这点来判断(判断前提是用户在前端页面添加流动性的时候 tokenB 在 tokenA前面)
// 判断注池
if(to == address(uniswapV2Pair)){
(uint reserve0, uint reserve1, ) = IUniswapV2Pair(uniswapV2Pair).getReserves();
if(address(this) == IUniswapV2Pair(uniswapV2Pair).token0() && IERC20(tokenB).balanceOf(uniswapV2Pair) != reserve1){
takeFee = false;
}
if(address(this) == IUniswapV2Pair(uniswapV2Pair).token1() && IERC20(tokenB).balanceOf(uniswapV2Pair) != reserve0){
takeFee = false;
}
}
IUniswapV2Pair(uniswapV2Pair).getReserves() 获取的是上一次swap之后,tokenA和tokenB的数量
在满足这个添加的i情况下:
用户在前端页面添加流动性的时候 tokenB 在 tokenA前面
判断pair种tokenB的余额 是否 等于getReserves()中对应tokenB的数量来判断是卖出还是添加流动性
因为在添加流动性的时候,tokenB的数量变多了