I am trying to obtain a flashloan from aave, then those tokens must be transferred to a specific wallet to then end with the return of the tokens.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import "https://github.com/aave/aave-v3-core/blob/master/contracts/flashloan/base/FlashLoanSimpleReceiverBase.sol";
import "https://github.com/aave/aave-v3-core/blob/master/contracts/interfaces/IPoolAddressesProvider.sol";
import "https://github.com/aave/aave-v3-core/blob/master/contracts/dependencies/openzeppelin/contracts/IERC20.sol";
import "https://github.com/aave/aave-v3-core/blob/master/contracts/dependencies/openzeppelin/contracts/Ownable.sol"; // Importa Ownable
contract MyFirstFlashLoan is FlashLoanSimpleReceiverBase, Ownable { // Hereda de Ownable
address public targetWallet; // Dirección del wallet objetivo
address public token; // Dirección del token (moneda)
constructor(address _addressProvider, address _targetWallet)
FlashLoanSimpleReceiverBase(IPoolAddressesProvider(_addressProvider))
{
targetWallet = _targetWallet; // Inicializa la dirección del wallet objetivo
}
function fn_RequestFlashLoan(address _token, uint256 _amount) public {
address receiverAddress = address(this);
token = _token;
uint256 amount = _amount;
bytes memory params = "";
uint16 referralCode = 0;
POOL.flashLoanSimple(
receiverAddress,
token,
amount,
params,
referralCode
);
}
// Esta función se llama después de que tu contrato haya recibido el monto del préstamo flash
function executeOperation(
address asset,
uint256 amount,
uint256 premium,
address initiator,
bytes calldata params
) external override returns (bool) {
// Lógica del préstamo flash
// Transferir los tokens recibidos al wallet objetivo
require(IERC20(asset).transfer(targetWallet, amount), "Transfer to target wallet failed");
// Realizar la lógica adicional aquí
// ...
// Retornar los tokens al contrato desde el wallet objetivo
require(IERC20(asset).transferFrom(targetWallet, address(this), amount), "Return transfer failed");
// Aprobar la devolución del préstamo flash
uint256 totalAmount = amount + premium;
IERC20(asset).approve(address(POOL), totalAmount);
return true;
}
receive() external payable {}
}