执行恢复:SafeERC20:低级调用失败

Rah*_*inh 2 python solidity web3js web3py

我正在尝试使用 web3.py 获得闪贷。我能够成功部署闪贷合约,但是当我调用闪贷功能时,它给了我

执行恢复:SafeERC20:低级调用失败'失败错误。我的账户里有足够的以太币。

我需要向我的闪贷合约发送一些以太币吗?但我不认为这个错误是因为缺乏以太币来支付汽油费。(如果是这种情况请告诉我!)

下面是我的闪贷代码

pragma solidity ^0.6.6;

import "./aave/FlashLoanReceiverBaseV2.sol";
import "../../interfaces/v2/ILendingPoolAddressesProviderV2.sol";
import "../../interfaces/v2/ILendingPoolV2.sol";

contract FlashloanV2 is FlashLoanReceiverBaseV2, Withdrawable {
    constructor(address _addressProvider) FlashLoanReceiverBaseV2(_addressProvider) public {}

    function executeOperation(
        address[] calldata assets,
        uint256[] calldata amounts,
        uint256[] calldata premiums,
        address initiator,
        bytes calldata params
    )
        external
        override
        returns (bool)
    {

        // Approve the LendingPool contract allowance to *pull* the owed amount
        for (uint i = 0; i < assets.length; i++) {
            uint amountOwing = amounts[i].add(premiums[i]);
            IERC20(assets[i]).approve(address(LENDING_POOL), amountOwing);
        }
        return true;
    }

    function _flashloan(address[] memory assets, uint256[] memory amounts) internal {
        address receiverAddress = address(this);

        address onBehalfOf = address(this);
        bytes memory params = "";
        uint16 referralCode = 0;

        uint256[] memory modes = new uint256[](assets.length);

        // 0 = no debt (flash), 1 = stable, 2 = variable
        for (uint256 i = 0; i < assets.length; i++) {
            modes[i] = 0;
        }

        LENDING_POOL.flashLoan(
            receiverAddress,
            assets,
            amounts,
            modes,
            onBehalfOf,
            params,
            referralCode
        );
    }


    function flashloan(address[] memory assets, uint256[] memory amounts) public onlyOwner {
        _flashloan(assets, amounts);
    }


    function flashloan(address _asset) public onlyOwner {
        bytes memory data = "";
        uint amount = 1 ether;

        address[] memory assets = new address[](1);
        assets[0] = _asset;

        uint256[] memory amounts = new uint256[](1);
        amounts[0] = amount;

        _flashloan(assets, amounts);
   }
}
Run Code Online (Sandbox Code Playgroud)

ace*_*ace 5

我认为您收到的错误是因为您没有可用资金在(闪电)交易结束时偿还闪电贷+保费。

你的逻辑不会产生任何额外的利润,而且你单独索要的资金也不足以支付费用。