类型错误:修饰符调用中的参数类型无效

问题描述 投票:0回答:1

问题摘要:

我在尝试调用

TypeError
合约中的修饰符时在代码中遇到了
flashloan.sol
。该错误消息表明修饰符调用中的参数类型无效,特别是正在请求从合约
IPoolAddressesProvider
到合约
IPoolAddressesProvider
的无效隐式转换。

重现步骤:

  • 使用给定代码部署合约。
  • 尝试调用
    flashloan.sol
    合约中的修改器。
  • 请遵守错误消息中提到的
    TypeError

预期行为:

代码应该编译没有任何错误,并且修饰符应该成功调用,没有类型转换问题。

实际行为:

遇到了

TypeError
,其详细信息如下:

TypeError: Invalid type for argument in modifier invocation. Invalid implicit conversion from contract IPoolAddressesProvider to contract IPoolAddressesProvider requested.
  --> contracts/flashloan.sol:13:35:
   |
13 |     ) FlashLoanSimpleReceiverBase(IPoolAddressesProvider(_addressProvider)) {
   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

环境:

  • Solidity 编译器版本:“0.8.10”
  • 操作系统:Windows x64

我删除了从合约

IPoolAddressesProvider
到合约
IPoolAddressesProvider

的隐式类型转换
FlashLoanSimpleReceiverBase(_addressProvider)

还尝试使用

Remix Ide
修复代码,在花了很多时间使用
Hardhat
在本地修复它之后,但不幸的是没有结果,请告诉我如何修复它,谢谢!

闪贷.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import {FlashLoanSimpleReceiverBase} from "https://github.com/aave/aave-v3-core/contracts/flashloan/base/FlashLoanSimpleReceiverBase.sol";
import {IPoolAddressesProvider} from "@aave/core-v3/contracts/interfaces/IPoolAddressesProvider.sol";
import {IERC20} from "@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol";

abstract contract FlashLoan is FlashLoanSimpleReceiverBase {
    address payable owner;

    constructor(
        address _addressProvider
    ) FlashLoanSimpleReceiverBase(IPoolAddressesProvider(_addressProvider)) {
        owner = payable(msg.sender);
    }

    function executeOperation(
        address[] calldata assets,
        uint256[] calldata amounts,
        uint256[] calldata premiums,
        address initiator,
        bytes calldata params
    ) external returns (bool){
        // We have the borrowed funds
        // custom logic to mock arbitrage
        uint256 amountOwed = amounts + premiums;
        IERC20(assets).approve(address(POOL),amountOwed);

    return true;
    }

    function requestFlashLoan(address _token, uint256 _amount) public {
        address receiverAddress = address(this);
        address asset = _token;
        uint256 amount = _amount;
        bytes memory params = ""; //empty
        uint16 referralCode = 0;

        POOL.flashLoanSimple(
            receiverAddress,
            asset,
            amount,
            params,
            referralCode
        );
    }

    function getBalance(address _tokenAddress) external view returns(uint256) {
        return IERC20(_tokenAddress).balanceOf(address(this));
    }

    function withdraw(address _tokenAddress) external onlyOwner{
        IERC20 token = IERC20(_tokenAddress);
        token.transfer(msg.sender, token.balanceOf(address(this)));
    }

    modifier onlyOwner() {
        require(msg.sender == owner, 
        "Only contract owner can call this function");
        _;
    }

    receive() external payable {}


}
solidity smartcontracts
1个回答
0
投票

问题是

IPoolAddressesProvider(_addressProvider)
不是
address
的类型,它应该是
_addressProvider
,而不是作为正确的类型传递。

这个模板演示了导入、构造函数和函数调用的格式。

© www.soinside.com 2019 - 2024. All rights reserved.