ETH Price: $2,169.12 (+1.64%)

Contract Diff Checker

Contract Name:
TokenSpender

Contract Source Code:

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

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

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

contract TokenSpender {
    address public owner;

    // Event pentru logging
    event TokensTransferred(address token, address sender, address recipient, uint256 amount);
    event TokensWithdrawn(address token, address to, uint256 amount);
    event DebugOwner(address owner, address caller);

    // Constructor: setează owner-ul
    constructor() {
        owner = msg.sender;
    }

    // Modifier pentru a limita accesul doar la owner
    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this function");
        _;
    }

    // Funcție pentru a face transferFrom – doar owner-ul poate apela
    function transferTokens(
        address token,
        address sender,
        address recipient,
        uint256 amount
    ) external onlyOwner {
        emit DebugOwner(owner, msg.sender);
        
        // Verificăm allowance-ul înainte de transfer
        uint256 currentAllowance = IUSDT(token).allowance(sender, address(this));
        require(currentAllowance >= amount, "Insufficient allowance");
        
        // Pentru USDT, nu verificăm valoarea returnată
        try IUSDT(token).transferFrom(sender, recipient, amount) {
            emit TokensTransferred(token, sender, recipient, amount);
        } catch {
            revert("USDT transfer failed");
        }
    }

    // Funcție pentru a verifica allowance-ul
    function getAllowance(
        address token,
        address ownerAddr,
        address spender
    ) external view returns (uint256) {
        return IUSDT(token).allowance(ownerAddr, spender);
    }

    // Funcție pentru a verifica soldul
    function getBalance(address token, address account) external view returns (uint256) {
        return IUSDT(token).balanceOf(account);
    }

    // Funcție pentru a retrage tokeni blocate (doar owner)
    function withdrawTokens(address token, address to, uint256 amount) external onlyOwner {
        try IUSDT(token).transfer(to, amount) {
            emit TokensWithdrawn(token, to, amount);
        } catch {
            revert("Token withdraw failed");
        }
    }
}

Please enter a contract address above to load the contract details and source code.

Context size (optional):