IRAN (IRAN)

Description:

ERC20 token contract with Burnable 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.20;

/*
 * IRAN - Simple ERC20 Meme Token
 * Supply: 100,000,000 tokens
 * Features:
 *  - Standard ERC-20
 *  - Burnable
 *  - Optional transfer fee (max 10%)
 *  - Owner controls (transferOwnership, fee settings)
 *
 * This is a single-file implementation (no external imports) to simplify compilation & verification.
 */

contract IRAN {
    // === Token metadata ===
    string public constant name = "IRAN";
    string public constant symbol = "IRAN";
    uint8 public constant decimals = 18;
    uint256 public constant TOTAL_SUPPLY = 100_000_000 * (10 ** uint256(decimals));

    // Balances & allowances
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    // Ownership
    address public owner;

    // Fee settings
    uint256 public feePercent; // whole percent (e.g., 2 == 2%)
    uint256 public constant FEE_CAP_PERCENT = 10; // maximum allowed fee
    address public feeReceiver;
    mapping(address => bool) private _isExcludedFromFee;

    // Events
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner_, address indexed spender, uint256 value);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event FeePercentUpdated(uint256 oldPercent, uint256 newPercent);
    event FeeReceiverUpdated(address indexed oldReceiver, address indexed newReceiver);
    event ExcludedFromFee(address indexed account, bool excluded);

    // === Constructor ===
    constructor() {
        owner = msg.sender;
        _balances[msg.sender] = TOTAL_SUPPLY;

        // defaults
        feePercent = 0;
        feeReceiver = msg.sender;

        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), msg.sender, TOTAL_SUPPLY);
    }

    // === Modifiers ===
    modifier onlyOwner() {
        require(msg.sender == owner, "IRAN: caller is not the owner");
        _;
    }

    // === ERC-20 standard functions ===
    function totalSupply() public pure returns (uint256) {
        return TOTAL_SUPPLY;
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address holder, address spender) public view returns (uint256) {
        return _allowances[holder][spender];
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "IRAN: allowance exceeded");
        _approve(sender, msg.sender, currentAllowance - amount);
        _transfer(sender, recipient, amount);
        return true;
    }

    // === Internal helpers ===
    function _approve(address owner_, address spender, uint256 amount) internal {
        require(owner_ != address(0) && spender != address(0), "IRAN: zero address");
        _allowances[owner_][spender] = amount;
        emit Approval(owner_, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0) && recipient != address(0), "IRAN: zero address");
        require(_balances[sender] >= amount, "IRAN: insufficient balance");

        uint256 fee = 0;
        if (feePercent > 0 && !_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient]) {
            fee = (amount * feePercent) / 100;
            // feePercent is capped by setter; this extra require is defensive
            require(fee <= (amount * FEE_CAP_PERCENT) / 100, "IRAN: fee > cap");
        }

        uint256 sendAmount = amount - fee;
        _balances[sender] -= amount;
        _balances[recipient] += sendAmount;
        emit Transfer(sender, recipient, sendAmount);

        if (fee > 0) {
            _balances[feeReceiver] += fee;
            emit Transfer(sender, feeReceiver, fee);
        }
    }

    // === Burn ===
    function burn(uint256 amount) external {
        require(_balances[msg.sender] >= amount, "IRAN: insufficient to burn");
        _balances[msg.sender] -= amount;
        emit Transfer(msg.sender, address(0), amount);
    }

    // === Owner controls ===
    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "IRAN: zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function setFeePercent(uint256 _percent) external onlyOwner {
        require(_percent <= FEE_CAP_PERCENT, "IRAN: fee > cap");
        emit FeePercentUpdated(feePercent, _percent);
        feePercent = _percent;
    }

    function setFeeReceiver(address _receiver) external onlyOwner {
        require(_receiver != address(0), "IRAN: zero addr");
        emit FeeReceiverUpdated(feeReceiver, _receiver);
        feeReceiver = _receiver;
    }

    function setExcludedFromFee(address account, bool excluded) external onlyOwner {
        _isExcludedFromFee[account] = excluded;
        emit ExcludedFromFee(account, excluded);
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }
}

Tags:
ERC20, Token, Burnable|addr:0x2754e9eeea60570af9ea860ebdfe7e6fc0688692|verified:true|block:23386231|tx:0xbf26b8e343a4c7974a7ca338e53e708e4107a0fa68fe06763ceaa78d97cedbe9|first_check:1758187691

Submitted on: 2025-09-18 11:28:13

Comments

Log in to comment.

No comments yet.