I have written a simple flash loan smart contract with no custom logic and deployed it to goerli testnet. When I call the requestFlashLoan()
function I get the following error.
Gas estimation failed: 'execution reverted: 27'. This transaction will likely revert.
The token I would like to request a flash loan for is USDC. USDC-TestnetMintableERC20-Aave address is 0x65aFADD39029741B3b8f0756952C74678c9cEC93 according to aave documentation and I have funded my contract with USDC for fees and I have goerli eth in my wallet; I don't know what else might be wrong and I'd appreciate some guidance.
Here's my contract
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import {IPoolAddressesProvider} from "https://github.com/aave/aave-v3-core/blob/master/contracts/interfaces/IPoolAddressesProvider.sol";
import {FlashLoanSimpleReceiverBase} from "https://github.com/aave/aave-v3-core/blob/master/contracts/flashloan/base/FlashLoanSimpleReceiverBase.sol";
import {IERC20} from "https://github.com/aave/aave-v3-core/blob/master/contracts/dependencies/openzeppelin/contracts/IERC20.sol";
contract FlashLoan is FlashLoanSimpleReceiverBase {
address payable owner;
constructor(address _addressProvider)
FlashLoanSimpleReceiverBase(IPoolAddressesProvider(_addressProvider))
{
owner = payable(msg.sender);
}
modifier onlyOwner() {
require(
msg.sender == owner,
"Only the contract's owner can call this function."
);
_;
}
function executeOperation(
address asset,
uint256 amount,
uint256 premium,
address initiator,
bytes calldata params
) external override returns (bool) {
// custom logic
uint256 amountOwed = amount + premium;
IERC20(asset).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 = "";
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)));
}
receive() external payable {}
}
Best Answer
The given is the flashloan contract for uniswap v2. You can use execute function to do the flashloan in beetween different pools and dexes. It does a low level call to pair using
swap
method. You can just take different pairs and do flashloan. This works in ethereum, binanace smart chain, polygon, arbitrum etc. This is applicable in V2 dexes like Uniswap v2, shusiswap, pancakeswap etc. Here,execute
method is where you put details and create flashloan swap, you only pay gas fee..