我在尝试调用
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)) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我删除了从合约
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 {}
}
问题是
IPoolAddressesProvider(_addressProvider)
不是 address
的类型,它应该是 _addressProvider
,而不是作为正确的类型传递。
这个模板演示了导入、构造函数和函数调用的格式。