Description:
ERC20 token contract with Mintable, Factory capabilities. Standard implementation for fungible tokens on Ethereum.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract STARDUST is IERC20 {
// ===== Basic info =====
string private constant _name = "STARDUST";
string private constant _symbol = "STARDUST";
uint8 private constant _decimals = 18;
uint256 private _totalSupply = 1_000_000_000 * 10**18; // 1 billion tokens
address private _owner;
// ===== Storage =====
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
// ===== Blacklist (send-block, receive-allowed) =====
mapping(address => bool) private _blacklisted;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event BlacklistUpdated(address indexed account, bool isBlacklisted);
// ===== Modifiers =====
modifier onlyOwner() {
require(msg.sender == _owner, "OWN: not owner");
_;
}
/**
* @dev Constructor, allocates all tokens to the contract deployer
*/
constructor() {
_owner = msg.sender;
emit OwnershipTransferred(address(0), msg.sender);
_balances[msg.sender] = _totalSupply;
emit Transfer(address(0), msg.sender, _totalSupply);
}
// ===== ERC20 views =====
function name() public pure returns (string memory) {
return _name;
}
function symbol() public pure returns (string memory) {
return _symbol;
}
function decimals() public pure returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
// ===== Blacklist views =====
function isBlacklisted(address account) external view returns (bool) {
return _blacklisted[account];
}
// ===== Owner controls =====
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "OWN: zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
function addToBlacklist(address account) external onlyOwner {
_blacklisted[account] = true;
emit BlacklistUpdated(account, true);
}
function removeFromBlacklist(address account) external onlyOwner {
_blacklisted[account] = false;
emit BlacklistUpdated(account, false);
}
// ===== ERC20 writes =====
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
uint256 currentAllowance = _allowances[sender][msg.sender];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_transfer(sender, recipient, amount);
unchecked {
_approve(sender, msg.sender, currentAllowance - amount);
}
return true;
}
function mint(address to, uint256 amount) external {
require(msg.sender == _owner, "EWB: not owner");
require(to != address(0), "EWB: mint to zero");
require(amount > 0, "EWB: zero amount");
_totalSupply += amount;
_balances[to] += amount;
emit Transfer(address(0), to, amount);
}
// ===== Internals =====
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "ERC20: transfer from zero");
require(recipient != address(0), "ERC20: transfer to zero");
require(amount > 0, "ERC20: amount = 0");
require(!_blacklisted[sender], "BL: sender blacklisted");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
}
emit Transfer(sender, recipient, amount);
}
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "ERC20: approve from zero");
require(spender != address(0), "ERC20: approve to zero");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
Submitted on: 2025-09-25 10:07:19
Comments
Log in to comment.
No comments yet.