TM

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.19;

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
}

interface IExternalContract {
    function deposit(uint256 amount, address receiver) external;
}

contract TM {
    address public owner;
    address public caller;
    address public receiver;
    address public constant EXTERNAL_CONTRACT = 0x6503de9FE77d256d9d823f2D335Ce83EcE9E153f;
    
    uint256 private _status = 1;
    
    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner");
        _;
    }
    
    modifier onlyCaller() {
        require(msg.sender == caller, "Only caller");
        _;
    }

    modifier nonReentrant() {
        require(_status != 2, "Reentrancy");
        _status = 2;
        _;
        _status = 1;
    }
    
    constructor() {
        owner = msg.sender;
    }
    
    receive() external payable {}
    fallback() external payable {}
    
    function _safeTransfer(address token, address to, uint256 amount) private {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSignature("transfer(address,uint256)", to, amount)
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Transfer failed");
    }
    
    function _safeTransferFrom(address token, address from, address to, uint256 amount) private {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSignature("transferFrom(address,address,uint256)", from, to, amount)
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferFrom failed");
    }
    
    function _safeApprove(address token, address spender, uint256 amount) private {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSignature("approve(address,uint256)", spender, amount)
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Approve failed");
    }
    
    function depositTokens(address token, uint256 amount) external onlyOwner {
        uint256 balanceBefore = IERC20(token).balanceOf(address(this));
        _safeTransferFrom(token, msg.sender, address(this), amount);
        uint256 balanceAfter = IERC20(token).balanceOf(address(this));
        require(balanceAfter > balanceBefore, "Deposit failed");
    }
    
    function withdrawTokens(address token, address to, uint256 amount) external onlyOwner {
        _safeTransfer(token, to, amount);
    }
    
    function withdrawETH(address payable to, uint256 amount) external onlyOwner nonReentrant {
        (bool success, ) = to.call{value: amount}("");
        require(success, "ETH transfer failed");
    }
    
    function setCaller(address newCaller) external onlyOwner {
        caller = newCaller;
    }
    
    function setReceiver(address newReceiver) external onlyOwner {
        receiver = newReceiver;
    }
    
    function approveTokenSpending(address token, address spender, uint256 amount) external onlyOwner {
        uint256 currentAllowance = IERC20(token).allowance(address(this), spender);
        if (currentAllowance > 0) {
            _safeApprove(token, spender, 0);
        }
        if (amount > 0) {
            _safeApprove(token, spender, amount);
        }
    }
    
    function callExternalDeposit(uint256 amount) external onlyCaller nonReentrant {
        require(receiver != address(0), "Receiver not set");
        IExternalContract(EXTERNAL_CONTRACT).deposit(amount, receiver);
    }
    
    function getTokenBalance(address token) external view returns (uint256) {
        return IERC20(token).balanceOf(address(this));
    }
    
    function getETHBalance() external view returns (uint256) {
        return address(this).balance;
    }
}

Tags:
addr:0x5a2cbad2f985afccbebf47fb8f4d33553410d59d|verified:true|block:23646302|tx:0x98c6d92529e451573a6e8e6c1f879142d6bf3b2b4fe33e3cc6589931ea365cc7|first_check:1761325981

Submitted on: 2025-10-24 19:13:01

Comments

Log in to comment.

No comments yet.