rwadurian/backend/services/blockchain-service/contracts/TestUSDT_Flat.sol

143 lines
5.1 KiB
Solidity
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title TestUSDT (Flattened)
* @dev 测试网专用 USDT可直接在 Remix 部署,无需额外依赖
*
* 部署网络:
* - BSC Testnet: Chain ID 97, RPC: https://data-seed-prebsc-1-s1.binance.org:8545
* - KAVA Testnet: Chain ID 2221, RPC: https://evm.testnet.kava.io
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
}
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
abstract contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual returns (string memory) { return _name; }
function symbol() public view virtual returns (string memory) { return _symbol; }
function decimals() public view virtual returns (uint8) { return 18; }
function totalSupply() public view virtual returns (uint256) { return _totalSupply; }
function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; }
function transfer(address to, uint256 value) public virtual returns (bool) {
_transfer(_msgSender(), to, value);
return true;
}
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 value) public virtual returns (bool) {
_approve(_msgSender(), spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
uint256 currentAllowance = allowance(from, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= value, "ERC20: insufficient allowance");
unchecked { _approve(from, spender, currentAllowance - value); }
}
_transfer(from, to, value);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
require(from != address(0), "ERC20: transfer from zero address");
require(to != address(0), "ERC20: transfer to zero address");
uint256 fromBalance = _balances[from];
require(fromBalance >= value, "ERC20: insufficient balance");
unchecked {
_balances[from] = fromBalance - value;
_balances[to] += value;
}
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
require(account != address(0), "ERC20: mint to zero address");
_totalSupply += value;
unchecked { _balances[account] += value; }
emit Transfer(address(0), account, value);
}
function _approve(address owner, address spender, uint256 value) internal {
require(owner != address(0) && spender != address(0), "ERC20: zero address");
_allowances[owner][spender] = value;
emit Approval(owner, spender, value);
}
}
contract TestUSDT is ERC20 {
uint8 private constant _decimals = 6;
address public owner;
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
constructor() ERC20("Test USDT", "USDT") {
owner = msg.sender;
_mint(msg.sender, 1_000_000 * 10 ** _decimals);
}
function decimals() public pure override returns (uint8) {
return _decimals;
}
/// @dev 任何人可以 mint (测试网专用)
function mint(uint256 amount) external {
_mint(msg.sender, amount);
}
/// @dev 便捷函数: 输入 USDT 数量,自动处理精度
function mintUsdt(uint256 usdtAmount) external {
_mint(msg.sender, usdtAmount * 10 ** _decimals);
}
/// @dev Owner 给任意地址 mint
function mintTo(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
/// @dev 水龙头: 一次领 10000 USDT
function faucet() external {
_mint(msg.sender, 10_000 * 10 ** _decimals);
}
}