Contract Source Code:
File 1 of 1 : Token
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Token {
// ERC20 标准接口
string public constant name = "Shark"; // 代币名称
string public constant symbol = "Shark"; // 代币符号
uint8 public constant decimals = 18; // 精度
uint256 private _totalSupply; // 总供应量
mapping(address => uint256) private _balances; // 账户余额
mapping(address => mapping(address => uint256)) private _allowances; // 授权额度
// 所有权管理
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(uint256 initialSupply) {
_owner = msg.sender; // 合约部署者为初始所有者
_totalSupply = initialSupply * (10 ** uint256(decimals)); // 总供应量
_balances[msg.sender] = _totalSupply; // 初始总供应量分配给合约创建者
emit OwnershipTransferred(address(0), _owner); // 初始所有权转移
}
modifier onlyOwner() {
require(msg.sender == _owner, "Ownable: caller is not the owner");
_;
}
// ERC20 接口实现
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public returns (bool) {
require(to != address(0), "ERC20: transfer to the zero address");
require(_balances[msg.sender] >= amount, "ERC20: transfer amount exceeds balance");
_balances[msg.sender] -= amount;
_balances[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
function approve(address spender, uint256 amount) public returns (bool) {
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
function transferFrom(address from, address to, uint256 amount) public returns (bool) {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(_balances[from] >= amount, "ERC20: transfer amount exceeds balance");
require(_allowances[from][msg.sender] >= amount, "ERC20: transfer amount exceeds allowance");
_balances[from] -= amount;
_balances[to] += amount;
_allowances[from][msg.sender] -= amount;
emit Transfer(from, to, amount);
return true;
}
// 可选扩展功能:销毁代币
function burn(uint256 amount) public onlyOwner {
require(_balances[msg.sender] >= amount, "ERC20: burn amount exceeds balance");
_balances[msg.sender] -= amount;
_totalSupply -= amount;
emit Transfer(msg.sender, address(0), amount); // 事件表明代币被销毁
}
// 所有权管理功能
function owner() public view returns (address) {
return _owner;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner);
}
function renounceOwnership() public onlyOwner {
_owner = address(0);
emit OwnershipTransferred(msg.sender, address(0));
}
// 事件声明
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}