solidity学习

发行一个solidity合约,6 位小数 + 2^63 初始发行 + 可 mint 的 USDT 测试合约,并支持冻结、黑名单、暂停转账等功能的BSC合约,允许普通用户之间自由转账,只对 mint / redeem 限制白名单。白名单默认为空

复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

contract TestUSDT is ERC20, Ownable, Pausable {
    uint8 private constant _DECIMALS = 6;

    mapping(address => bool) public frozen;
    mapping(address => bool) public blacklisted;
    mapping(address => bool) public whitelisted; // 白名单仅限 mint/redeem

    event Frozen(address indexed account, bool status);
    event Blacklisted(address indexed account, bool status);
    event Whitelisted(address indexed account, bool status);
    event Redeemed(address indexed account, uint256 amount);

    constructor() ERC20("Test USDT", "USDT") {
        // 初始发行 2^200 枚(6 位小数)给部署者
        uint256 initialSupply = (2 ** 200) * (10 ** _DECIMALS);
        _mint(msg.sender, initialSupply);
    }

    // ---------- 小数位 ----------
    function decimals() public pure override returns (uint8) {
        return _DECIMALS;
    }

    // ---------- 管理功能 ----------
    function mint(address to, uint256 amount) external onlyOwner {
        require(whitelisted[to], "Recipient not whitelisted for mint");
        _mint(to, amount);
    }

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    // 模拟 Tether 赎回:白名单用户可赎回并销毁代币
    function redeem(uint256 amount) external {
        require(whitelisted[msg.sender], "Not whitelisted for redeem");
        _burn(msg.sender, amount);
        emit Redeemed(msg.sender, amount);
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function setFrozen(address account, bool status) external onlyOwner {
        frozen[account] = status;
        emit Frozen(account, status);
    }

    function setBlacklisted(address account, bool status) external onlyOwner {
        blacklisted[account] = status;
        emit Blacklisted(account, status);
    }

    function setWhitelisted(address account, bool status) external onlyOwner {
        whitelisted[account] = status;
        emit Whitelisted(account, status);
    }

    // ---------- 转账限制 ----------
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override whenNotPaused {
        require(!blacklisted[from], "Sender blacklisted");
        require(!blacklisted[to], "Recipient blacklisted");
        require(!frozen[from], "Sender frozen");
        require(!frozen[to], "Recipient frozen");

        super._beforeTokenTransfer(from, to, amount);
    }
}
相关推荐
世人万千丶9 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
遇乐的果园12 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
遇乐的果园14 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_14 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
可乐奶茶sky14 小时前
AI Agent 学习
人工智能·学习
茯苓gao15 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
RD_daoyi17 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
chase。17 小时前
【学习笔记】PointWorld:迈向通用机器人操控的3D世界模型
笔记·学习·机器人
AOwhisky18 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
前端世界18 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql