这些代码向 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);
}