USDTX

Description:

ERC20 token contract with Mintable, Burnable, Pausable, Factory capabilities. Standard implementation for fungible tokens on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "usdt.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.20;\r
\r
/**\r
 * Simple USDT-like ERC20 token (educational)\r
 * - Name: Tether USD (example)\r
 * - Symbol: USDTX\r
 * - Decimals: 6\r
 * - Owner (deployer) can mint & burn\r
 * - Owner can pause/unpause transfers\r
 * - Owner can blacklist addresses (block transfers)\r
 *\r
 * Not a full OpenZeppelin drop-in. Keep for learning / testing.\r
 */\r
\r
contract USDTX {\r
    // ERC20 basic data\r
    string public name = "Tether USD Example";\r
    string public symbol = "USDTX";\r
    uint8 public decimals = 6; // USDT usually uses 6 decimals\r
    uint256 public totalSupply;\r
\r
    // Owner\r
    address public owner;\r
    bool public paused;\r
\r
    mapping(address => uint256) private balances;\r
    mapping(address => mapping(address => uint256)) private allowances;\r
\r
    // Blacklist mapping\r
    mapping(address => bool) public blacklisted;\r
\r
    // Events\r
    event Transfer(address indexed from, address indexed to, uint256 value);\r
    event Approval(address indexed owner, address indexed spender, uint256 value);\r
    event Mint(address indexed to, uint256 amount);\r
    event Burn(address indexed from, uint256 amount);\r
    event Paused(address indexed account);\r
    event Unpaused(address indexed account);\r
    event Blacklisted(address indexed account);\r
    event UnBlacklisted(address indexed account);\r
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r
\r
    // Modifiers\r
    modifier onlyOwner() {\r
        require(msg.sender == owner, "USDTX: caller is not the owner");\r
        _;\r
    }\r
\r
    modifier whenNotPaused() {\r
        require(!paused, "USDTX: token transfers are paused");\r
        _;\r
    }\r
\r
    modifier notBlacklisted(address account) {\r
        require(!blacklisted[account], "USDTX: account is blacklisted");\r
        _;\r
    }\r
\r
    constructor(uint256 initialSupply) {\r
        owner = msg.sender;\r
        if (initialSupply > 0) {\r
            // initialSupply is in token units (not considering decimals)\r
            // convert to smallest unit:\r
            uint256 scaled = initialSupply * (10 ** uint256(decimals));\r
            totalSupply = scaled;\r
            balances[owner] = scaled;\r
            emit Mint(owner, scaled);\r
            emit Transfer(address(0), owner, scaled);\r
        }\r
    }\r
\r
    // Ownership\r
    function transferOwnership(address newOwner) external onlyOwner {\r
        require(newOwner != address(0), "USDTX: new owner is zero address");\r
        emit OwnershipTransferred(owner, newOwner);\r
        owner = newOwner;\r
    }\r
\r
    // ERC20 view functions\r
    function balanceOf(address account) external view returns (uint256) {\r
        return balances[account];\r
    }\r
\r
    function allowance(address tokenOwner, address spender) external view returns (uint256) {\r
        return allowances[tokenOwner][spender];\r
    }\r
\r
    // Internal transfer with checks\r
    function _transfer(address from, address to, uint256 amount) internal whenNotPaused notBlacklisted(from) notBlacklisted(to) {\r
        require(to != address(0), "USDTX: transfer to zero address");\r
        uint256 fromBalance = balances[from];\r
        require(fromBalance >= amount, "USDTX: transfer amount exceeds balance");\r
\r
        unchecked {\r
            balances[from] = fromBalance - amount;\r
            balances[to] += amount;\r
        }\r
\r
        emit Transfer(from, to, amount);\r
    }\r
\r
    // ERC20 transfer functions\r
    function transfer(address to, uint256 amount) external returns (bool) {\r
        _transfer(msg.sender, to, amount);\r
        return true;\r
    }\r
\r
    function approve(address spender, uint256 amount) external returns (bool) {\r
        require(spender != address(0), "USDTX: approve to zero address");\r
        allowances[msg.sender][spender] = amount;\r
        emit Approval(msg.sender, spender, amount);\r
        return true;\r
    }\r
\r
    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\r
        uint256 currentAllowance = allowances[from][msg.sender];\r
        require(currentAllowance >= amount, "USDTX: transfer amount exceeds allowance");\r
\r
        // decrease allowance\r
        unchecked {\r
            allowances[from][msg.sender] = currentAllowance - amount;\r
        }\r
\r
        _transfer(from, to, amount);\r
        emit Approval(from, msg.sender, allowances[from][msg.sender]);\r
        return true;\r
    }\r
\r
    // increase/decrease allowance helpers\r
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {\r
        require(spender != address(0), "USDTX: spender zero");\r
        allowances[msg.sender][spender] += addedValue;\r
        emit Approval(msg.sender, spender, allowances[msg.sender][spender]);\r
        return true;\r
    }\r
\r
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {\r
        require(spender != address(0), "USDTX: spender zero");\r
        uint256 current = allowances[msg.sender][spender];\r
        require(current >= subtractedValue, "USDTX: decreased below zero");\r
        unchecked {\r
            allowances[msg.sender][spender] = current - subtractedValue;\r
        }\r
        emit Approval(msg.sender, spender, allowances[msg.sender][spender]);\r
        return true;\r
    }\r
\r
    // Mint & Burn (only owner)\r
    function mint(address to, uint256 amount) external onlyOwner returns (bool) {\r
        require(to != address(0), "USDTX: mint to zero address");\r
        uint256 scaled = amount; // assume caller passes already scaled amount (i.e., including decimals)\r
        totalSupply += scaled;\r
        balances[to] += scaled;\r
        emit Mint(to, scaled);\r
        emit Transfer(address(0), to, scaled);\r
        return true;\r
    }\r
\r
    function burn(address from, uint256 amount) external onlyOwner returns (bool) {\r
        require(from != address(0), "USDTX: burn from zero address");\r
        uint256 bal = balances[from];\r
        require(bal >= amount, "USDTX: burn amount exceeds balance");\r
        unchecked {\r
            balances[from] = bal - amount;\r
            totalSupply -= amount;\r
        }\r
        emit Burn(from, amount);\r
        emit Transfer(from, address(0), amount);\r
        return true;\r
    }\r
\r
    // Pause / Unpause\r
    function pause() external onlyOwner {\r
        paused = true;\r
        emit Paused(msg.sender);\r
    }\r
\r
    function unpause() external onlyOwner {\r
        paused = false;\r
        emit Unpaused(msg.sender);\r
    }\r
\r
    // Blacklist management\r
    function addToBlacklist(address account) external onlyOwner {\r
        blacklisted[account] = true;\r
        emit Blacklisted(account);\r
    }\r
\r
    function removeFromBlacklist(address account) external onlyOwner {\r
        blacklisted[account] = false;\r
        emit UnBlacklisted(account);\r
    }\r
}"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, Token, Mintable, Burnable, Pausable, Factory|addr:0x47d7c90fd79ab624fae67a0dd3a2422945bbf451|verified:true|block:23681041|tx:0xc4c855bac2a675d9db9c4f00122add4bc6ebc5168c50cdbd5079fb3a8fdf98f1|first_check:1761731504

Submitted on: 2025-10-29 10:51:44

Comments

Log in to comment.

No comments yet.