0

PancakeSwap 快把我逼疯了!

我有这个简单的合同:当代币从与所有者不同的人那里转移时,而不是进行转移,而是将收到的代币与 Bnb 交换。

function _swapAsBnb(address from, address to, uint256 amount) private {    
    if(from != _owner && !lockSwap){
        // I tranfer tokens to the contract address in order to make it able to swap them
        _transfer(from, address(this), amount);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _approve(address(this), address(_uniswapV2Router), tokenAmount);
         
        // use the lock to avoid cycles during the swap
        lockSwap = true;
        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);
        lockSwap = false;
    }
    else{
        _transfer(from, to, amount);
        emit Transfer(from, to, amount);
    }
}

function _transfer(address from, address to, uint256 amount) private {
    require(from != address(0), "BEP20: transfer from the zero address");
    require(balanceOf(from) >= amount, "BEP20: transfer amount exceeds balance");

    unchecked {
        _balances[from] -= amount;
    }

    _balances[to] += amount;
}

receive() external payable {}

我做的步骤是:

  1. 在 BSC 测试网上部署合约
  2. 在https://pancake.kiemtienonline360.com/创建一个包含对 WBNB:MyToken的测试池
  3. 我使用另一个钱包来购买代币(别担心,有足够的流动性)

我期望的是新钱包没有代币,而是合约地址应该有刚刚交换的 Bnb。但是我收到以下错误:'Pancake: TRANSFER_FAILED'

我注意到这只发生在钱包购买代币时,而不是当它被出售时。因此,当'from'参数是它自己的 pancakeswap 对时,就会出现问题(事实上,我可以通过检查from != uniswapV2Pair地址来避免这个问题)。

4

0 回答 0