CONTRACT

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);
    }
}

Tags:
ERC20, Token|addr:0xd856c2bd87da73c487b156f8366fb5479317b1fb|verified:true|block:23631780|tx:0x1f15426c261c39e33b60fdd6df37c48e4e13b835619d0d9999ff1a3e6dbb89cc|first_check:1761238712

Submitted on: 2025-10-23 18:58:34

Comments

Log in to comment.

No comments yet.