Description:
ERC20 token contract. 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.25;
contract CONTRACT {
error ZeroAddressSender();
error ZeroAddressRecipient();
error InsufficientBalance();
error InsufficientAllowance();
error EmptyMetadata();
string private _name;
string private _symbol;
uint8 private _decimals;
uint256 private _baseUnit;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
constructor(
string memory tokenName,
string memory tokenSymbol,
uint8 tokenDecimals,
uint256 initialSupply
) {
_setMetadata(tokenName, tokenSymbol, tokenDecimals);
_mint(msg.sender, initialSupply);
}
function name() external view returns (string memory) {
return _name;
}
function symbol() external view returns (string memory) {
return _symbol;
}
function decimals() external view returns (uint8) {
return _decimals;
}
function totalSupply() external view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external view returns (uint256) {
return _balances[account];
}
function allowance(address owner, address spender) external view returns (uint256) {
return _allowances[owner][spender];
}
function transfer(address to, uint256 amount) external returns (bool) {
_transfer(msg.sender, to, amount);
return true;
}
function approve(address spender, uint256 amount) external returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) external returns (bool) {
_spendAllowance(from, msg.sender, amount);
_transfer(from, to, amount);
return true;
}
function _transfer(address from, address to, uint256 amount) internal {
if (from == address(0)) revert ZeroAddressSender();
if (to == address(0)) revert ZeroAddressRecipient();
uint256 senderBalance = _balances[from];
if (senderBalance < amount) revert InsufficientBalance();
unchecked {
_balances[from] = senderBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
}
function _approve(address owner, address spender, uint256 amount) internal {
if (owner == address(0)) revert ZeroAddressSender();
if (spender == address(0)) revert ZeroAddressRecipient();
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(address owner, address spender, uint256 amount) internal {
uint256 currentAllowance = _allowances[owner][spender];
if (currentAllowance < amount) revert InsufficientAllowance();
if (currentAllowance != type(uint256).max) {
unchecked {
_allowances[owner][spender] = currentAllowance - amount;
}
}
}
function _mint(address to, uint256 amount) internal {
if (to == address(0)) revert ZeroAddressRecipient();
uint256 minted = amount * _baseUnit;
unchecked {
_totalSupply += minted;
_balances[to] += minted;
}
emit Transfer(address(0), to, minted);
}
function _setMetadata(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) private {
if (bytes(tokenName).length == 0 || bytes(tokenSymbol).length == 0) revert EmptyMetadata();
_name = tokenName;
_symbol = tokenSymbol;
_decimals = tokenDecimals;
_baseUnit = 10 ** uint256(tokenDecimals);
}
}
Submitted on: 2025-10-23 18:58:34
Comments
Log in to comment.
No comments yet.