我正在创建一个智能契约,它既可以通过0x进行闪光贷款,也可以交换令牌。我可以很好地调用闪存贷款和令牌交换函数,但是当我试图在闪存贷款回调中调用令牌交换时,我会得到一个错误:execution reverted: SafeERC20: low-level call failed。
如果我正确理解了这个错误,我相信这意味着我没有正确地批准令牌。下面是我的代码的要点:
/// Make a flash loan.
function makeFlashLoan(...) {
IERC20(borrowedTokenAddress).approve(zrxSpender, uint256(-1));
lendingPool.flashLoan(...);
}
/// Callback for flash loan.
function executeOperation(...) {
IERC20(borrowedTokenAddress).approve(lendingPoolAddress, uint256(-1));
swapOnZrx(...);
}
/// Swap a token on 0x.
function swapOnZrx(...) {
IERC20(fromToken).approve(zrxSpender, uint256(-1));
...
(bool success,) = _swapTarget.call(_swapCallData);
...
}如果我做了一个只调用swapOnZrx的事务,事务就会成功。类似地,如果我做了一个事务来调用makeFlashLoan,并且swapOnZrx注释掉了,事务也会成功。但是,当我调用makeFlashLoan并调用swapOnZrx时,总是会得到SafeERC20错误。
任何帮助都将是非常感谢的,因为我已经为这个错误挣扎了将近一整天:
发布于 2021-11-30 04:20:04
啊呀。事实证明这是因为我没有还清我的短期贷款。
https://ethereum.stackexchange.com/questions/114629
复制相似问题