python - 执行已恢复 : SafeERC20: low-level call failed

标签 python solidity web3js web3py

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

execution reverted: SafeERC20: low-level call failed' failed error. I have enough ether in my account.

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

下面是我的闪贷代码

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);
   }
}

最佳答案

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

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

关于python - 执行已恢复 : SafeERC20: low-level call failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67543220/

相关文章:

python - 设置 dtype 时 Numpy 数组上的重复值

ethereum - 如何在松露中手动创建合约的实例

javascript - 如何将从智能合约返回的地址转换为可读的字符串?

reactjs - useWeb3React Hook 不返回提供程序

python - setup.py 从文件上传

python - 在绘图上标记 python 数据点

python - session 变量丢失,在 Django 中

function - 接收 NFT 并发送代币进行交换的金库,反之亦然

struct - Solidity 中是否可以将多个映射映射到同一个结构?

javascript - 尝试发送 USDC 时无法获取钱包签名者 @solana-labs/web3.js