0

这些代码向 uniswap 合约发送交易并收取一定的手续费,为资金池增加流动性。但是,我不知道“_transfer”函数哪里出错了,它调用fpoSwap.swapAndLiquidity()了“FPOSwap”合约中的一个方法。它会引发传输错误。我分别测试了“swapTokensForToken”函数和“addLiquidity”函数,都通过了。这是传递函数

function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(amount > 0,"FPO: transfer amount the zero");
        require(sender != address(0), "FPO: transfer from the zero address");
        require(recipient != address(0), "FPO: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount, "FPO: transfer amount exceeds balance");
        if((automatedMarketMakerPairs[sender] || automatedMarketMakerPairs[recipient]) &&
            !excludeFromFees[recipient] && !excludeFromFees[sender] && fee > 0 && !swapping){
            swapping = true;
            uint256 feeAmount = amount.mul(fee).div(100);
            amount = amount.sub(feeAmount);
            _balances[address(fpoSwap)] = _balances[address(fpoSwap)].add(feeAmount);
            emit Transfer(address(sender), address(fpoSwap), feeAmount);
            if(_balances[address(fpoSwap)] > 100000000){
                fpoSwap.swapAndLiquidity();
            }
            swapping = false;
        }
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

这是 fpoSwap 合约

function swapTokensForToken(uint256 tokenAmount) public onlyOwner {
        address[] memory path = new address[](2);
        path[0] = address(fpo);
        path[1] = address(usd);

        fpo.approve(address(router), tokenAmount);
        router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 usdAmount) public onlyOwner {
        // approve token transfer to cover all possible scenarios
        fpo.approve(address(router), tokenAmount);
        usd.approve(address(router),usdAmount);

        // add the liquidity
        router.addLiquidity(
            address(fpo),
            address(usd),
            tokenAmount,
            usdAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0),
            block.timestamp
        );
    }

    function swapAndLiquidity() public override onlyFPO {
        uint256 tokens = fpo.balanceOf(address(this));
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        swapTokensForToken(half);
        uint256 usdBalance = usd.balanceOf(address(this));
        addLiquidity(otherHalf, usdBalance);
        emit SwapAndLiquidity(half, usdBalance, otherHalf);
    }
4

2 回答 2

0
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(amount > 0,"FPO: transfer amount the zero");
        require(sender != address(0), "FPO: transfer from the zero address");
        require(recipient != address(0), "FPO: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount, "FPO: transfer amount exceeds balance");
        if((automatedMarketMakerPairs[sender] || automatedMarketMakerPairs[recipient]) &&
            !excludeFromFees[recipient] && !excludeFromFees[sender] && fee > 0 && !swapping){
            swapping = true;
            uint256 feeAmount = amount.mul(fee).div(100);
            amount = amount.sub(feeAmount);
            _balances[address(fpoSwap)] = _balances[address(fpoSwap)].add(feeAmount);
            emit Transfer(address(sender), address(fpoSwap), feeAmount);
            if(_balances[address(fpoSwap)] > 100000000 && runSwapping){
                fpoSwap.swapAndLiquidity();
            }
            swapping = false;
        }
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _runSwapAndLiquidity() internal virtual {
        fpoSwap.swapAndLiquidity();
    }

“Fposwap.Swapandliquidity”可以单独执行,但是放在“_transfer”中会报错

于 2022-02-18T09:58:17.023 回答
0

无法访问您提供的资源,但无法访问。

到目前为止,我们可以做一些事情来解决它:

  1. 分别测试swapAndLiquidity(),直接在合约中留下一些token。
  2. 注释掉fpoSwap.swapAndLiquidity();并测试正确应用费用的地方。
  3. swapAndLiquidity()在这种情况下手动调用: _balances[address(fpoSwap)] > 100000000
  4. 如果 1、2、3 成功,那么我们可以取消对 transfer 函数中的 2 的注释,只测试 Simple transfer。
  5. 最后,我们可以通过 uniswap 等第三方继续进行转账。
于 2022-02-18T03:27:14.407 回答