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": []
}
}}
Submitted on: 2025-10-29 10:52:31
Comments
Log in to comment.
No comments yet.