Description:
ERC20 token contract with Mintable, Burnable, Pausable capabilities. Standard implementation for fungible tokens on Ethereum.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{"EIP20Interface.sol":{"content":"// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface EIP20Interface {
function totalSupply() external view returns (uint256);
function balanceOf(address _account) external view returns (uint256 balance);
function transfer(address _to, uint256 _value) external returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
function approve(address _spender, uint256 _value) external returns (bool success);
function allowance(address _account, address _spender) external view returns (uint256 remaining);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function paused() external view returns (bool);
function isBlacklisted(address account) external view returns (bool);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
event Blacklisted(address indexed account);
event Unblacklisted(address indexed account);
event Paused(address account);
event Unpaused(address account);
event FeeSet(uint256 feeBasisPoints);
event FeeRecipientSet(address recipient);
event Mint(address indexed to, uint256 amount);
event Burn(address indexed from, uint256 amount);
event Redeem(address indexed from, uint256 amount);
}"},"TetherUSD.sol":{"content":"// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./EIP20Interface.sol";
contract TetherToken is EIP20Interface {
mapping(address =\u003e uint256) private _balances;
mapping(address =\u003e mapping(address =\u003e uint256)) private _allowances;
mapping(address =\u003e bool) private _blacklisted;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
uint256 private _feeBasisPoints;
address private _feeRecipient;
bool private _paused;
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
require(initialOwner != address(0), "Invalid owner address");
_owner = initialOwner;
_name = "Tether USD";
_symbol = "USDT";
_decimals = 6;
_totalSupply = 9876543210 * (10 ** uint256(_decimals));
_balances[initialOwner] = _totalSupply;
_feeBasisPoints = 0;
_feeRecipient = initialOwner;
_paused = false;
emit Transfer(address(0), initialOwner, _totalSupply);
emit OwnershipTransferred(address(0), initialOwner);
}
modifier onlyOwner() {
require(msg.sender == _owner, "Caller is not owner");
_;
}
modifier whenNotPaused() {
require(!_paused, "Contract paused");
_;
}
// ERC20标准函数
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 value) public override whenNotPaused returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public override whenNotPaused returns (bool) {
_spendAllowance(from, msg.sender, value);
_transfer(from, to, value);
return true;
}
function approve(address spender, uint256 value) public override returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function allowance(address accountOwner, address spender) public view override returns (uint256) {
return _allowances[accountOwner][spender];
}
function name() public view override returns (string memory) {
return _name;
}
function symbol() public view override returns (string memory) {
return _symbol;
}
function decimals() public view override returns (uint8) {
return _decimals;
}
// 管理功能
function pause() external onlyOwner {
require(!_paused, "Already paused");
_paused = true;
emit Paused(msg.sender);
}
function unpause() external onlyOwner {
require(_paused, "Not paused");
_paused = false;
emit Unpaused(msg.sender);
}
function paused() public view override returns (bool) {
return _paused;
}
function blacklist(address account) external onlyOwner {
require(!_blacklisted[account], "Already blacklisted");
_blacklisted[account] = true;
emit Blacklisted(account);
}
function unblacklist(address account) external onlyOwner {
require(_blacklisted[account], "Not blacklisted");
_blacklisted[account] = false;
emit Unblacklisted(account);
}
function isBlacklisted(address account) public view override returns (bool) {
return _blacklisted[account];
}
function mint(address to, uint256 amount) external onlyOwner {
require(to != address(0), "Mint to zero address");
_totalSupply += amount;
_balances[to] += amount;
emit Mint(to, amount);
emit Transfer(address(0), to, amount);
}
function burn(address from, uint256 amount) external onlyOwner {
_burn(from, amount);
}
function redeem(uint256 amount) external {
_burn(msg.sender, amount);
emit Redeem(msg.sender, amount);
}
function setFee(uint256 feeBasisPoints) external onlyOwner {
require(feeBasisPoints \u003c= 10000, "Fee too high");
_feeBasisPoints = feeBasisPoints;
emit FeeSet(feeBasisPoints);
}
function setFeeRecipient(address recipient) external onlyOwner {
require(recipient != address(0), "Invalid recipient");
_feeRecipient = recipient;
emit FeeRecipientSet(recipient);
}
function getOwner() public view returns (address) {
return _owner;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0), "Invalid new owner");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
// 内部函数
function _transfer(address from, address to, uint256 value) internal {
require(from != address(0), "Transfer from zero address");
require(to != address(0), "Transfer to zero address");
require(value \u003e 0, "Invalid amount");
require(!_blacklisted[from], "Sender blacklisted");
require(!_blacklisted[to], "Recipient blacklisted");
require(_balances[from] \u003e= value, "Insufficient balance");
uint256 fee = (value * _feeBasisPoints) / 10000;
uint256 netAmount = value - fee;
_balances[from] -= value;
_balances[to] += netAmount;
if (fee \u003e 0) {
_balances[_feeRecipient] += fee;
emit Transfer(from, _feeRecipient, fee);
}
emit Transfer(from, to, netAmount);
}
function _approve(address accountOwner, address spender, uint256 value) internal {
require(accountOwner != address(0), "Approve from zero address");
require(spender != address(0), "Approve to zero address");
_allowances[accountOwner][spender] = value;
emit Approval(accountOwner, spender, value);
}
function _spendAllowance(address accountOwner, address spender, uint256 value) internal {
uint256 currentAllowance = allowance(accountOwner, spender);
require(currentAllowance \u003e= value, "Insufficient allowance");
_approve(accountOwner, spender, currentAllowance - value);
}
function _burn(address from, uint256 amount) internal {
require(from != address(0), "Burn from zero address");
require(amount \u003e 0, "Invalid amount");
require(_balances[from] \u003e= amount, "Insufficient balance");
_balances[from] -= amount;
_totalSupply -= amount;
emit Burn(from, amount);
emit Transfer(from, address(0), amount);
}
}"}}
Submitted on: 2025-10-15 11:52:51
Comments
Log in to comment.
No comments yet.