LetiziaUpgradeableToken

Description:

Proxy contract enabling upgradeable smart contract patterns. Delegates calls to an implementation contract.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/LetiziaUpgradeableToken.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

/* Minimal Initializable */
abstract contract Initializable {
    bool private _initialized;
    bool private _initializing;

    modifier initializer() {
        require(_initializing || !_initialized, "Already initialized");
        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }
        _;
        if (isTopLevelCall) _initializing = false;
    }
}

/* Minimal ContextUpgradeable */
abstract contract ContextUpgradeable is Initializable {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

/* Minimal OwnableUpgradeable */
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function __Ownable_init() internal initializer {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is zero");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/* Minimal ReentrancyGuardUpgradeable */
abstract contract ReentrancyGuardUpgradeable is Initializable {
    uint256 private _status;
    function __ReentrancyGuard_init() internal initializer {
        _status = 1;
    }
    modifier nonReentrant() {
        require(_status == 1, "ReentrancyGuard: reentrant call");
        _status = 2;
        _;
        _status = 1;
    }
}

/* Minimal ERC20Upgradeable */
abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view returns (string memory) { return _name; }
    function symbol() public view returns (string memory) { return _symbol; }
    function decimals() public pure returns (uint8) { return 18; }
    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) {
        _transfer(_msgSender(), to, amount);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(address from,address to,uint256 amount) public returns (bool) {
        uint256 currentAllowance = _allowances[from][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(from, _msgSender(), currentAllowance - amount);
        _transfer(from, to, amount);
        return true;
    }

    function _transfer(address from,address to,uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from zero");
        require(to != address(0), "ERC20: transfer to zero");

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[from] = fromBalance - amount;
        _balances[to] += amount;
        emit Transfer(from, to, amount);
    }
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to zero");
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from zero");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
    }
    function _approve(address owner,address spender,uint256 amount) internal virtual {
        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);
    }

    event Transfer(address indexed from,address indexed to,uint256 value);
    event Approval(address indexed owner,address indexed spender,uint256 value);
}

/* Minimal UUPSUpgradeable */
abstract contract UUPSUpgradeable is Initializable, OwnableUpgradeable {
    address private _implementation;

    function __UUPSUpgradeable_init() internal initializer {}

    function upgradeTo(address newImplementation) external onlyOwner {
        _setImplementation(newImplementation);
    }

    function _setImplementation(address newImplementation) private {
        require(newImplementation != address(0), "UUPS: new implementation is zero address");
        _implementation = newImplementation;
    }
}

/* The actual LetiziaUpgradeableToken contract */
contract LetiziaUpgradeableToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable, ReentrancyGuardUpgradeable {
    bool public tradingEnabled;
    uint256 public maxTxAmount;
    uint256 public maxWalletAmount;
    mapping(address => bool) private _exempt;

    uint256 public tokensPerWei;
    event Bought(address indexed buyer, uint256 eth, uint256 tokens);
    event Sold(address indexed seller, uint256 tokens, uint256 eth);
    event PriceUpdated(uint256 oldPrice, uint256 newPrice);
    event EtherWithdrawn(address indexed to, uint256 amount);

    function initialize(uint256 initialSupply) public initializer {
        __ERC20_init("Letizia Token", "MNT");
        __Ownable_init();
        __UUPSUpgradeable_init();
        __ReentrancyGuard_init();

        _mint(msg.sender, initialSupply * 10 ** decimals());
        maxTxAmount = (initialSupply * 10 ** decimals()) * 2 / 100;
        maxWalletAmount = (initialSupply * 10 ** decimals()) * 3 / 100;
        _exempt[msg.sender] = true;
        _exempt[address(this)] = true;

        tradingEnabled = true;
        tokensPerWei = 100;
    }

    modifier tradingActive() {
        require(tradingEnabled || _exempt[msg.sender], "Trading disabled");
        _;
    }

    function enableTrading() external onlyOwner {
        tradingEnabled = true;
    }

    function setMaxTxAmount(uint256 newMax) external onlyOwner {
        maxTxAmount = newMax;
    }

    function setMaxWalletAmount(uint256 newMax) external onlyOwner {
        maxWalletAmount = newMax;
    }

    function excludeFromLimits(address acct, bool excl) external onlyOwner {
        _exempt[acct] = excl;
    }

    function setTokensPerWei(uint256 newRate) external onlyOwner {
        require(newRate > 0, "Rate must be >0");
        emit PriceUpdated(tokensPerWei, newRate);
        tokensPerWei = newRate;
    }

    function withdrawEther(address payable to, uint256 amount) external onlyOwner nonReentrant {
        require(to != address(0), "Zero address");
        require(amount <= address(this).balance, "Insufficient balance");
        to.transfer(amount);
        emit EtherWithdrawn(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual tradingActive {
        if (!_exempt[from] && !_exempt[to]) {
            require(amount <= maxTxAmount, "Exceeds max tx");
            require(balanceOf(to) + amount <= maxWalletAmount, "Exceeds max wallet");
        }
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        _beforeTokenTransfer(from, to, amount);
        super._transfer(from, to, amount);
    }

    function buyTokens() external payable nonReentrant {
        require(msg.value > 0, "Send ETH");
        uint256 mintAmt = msg.value * tokensPerWei;
        _mint(msg.sender, mintAmt);
        emit Bought(msg.sender, msg.value, mintAmt);
    }

    function sellTokens(uint256 tokenAmt) external nonReentrant {
        require(tokenAmt > 0, "Zero amount");
        require(balanceOf(msg.sender) >= tokenAmt, "Not enough tokens");
        uint256 weiOut = tokenAmt / tokensPerWei;
        require(address(this).balance >= weiOut, "Insufficient ETH liquidity");
        _burn(msg.sender, tokenAmt);
        payable(msg.sender).transfer(weiOut);
        emit Sold(msg.sender, tokenAmt, weiOut);
    }

    receive() external payable {}

    fallback() external payable {}

}
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
ERC20, Proxy, Upgradeable, Factory|addr:0xc7108c440e0ac6fab680f42e10712aad201bf39b|verified:true|block:23477166|tx:0xccfe228f64a4bfd70f36f206ddfc84b4d4488a37329b7ba2eadadf0a1ab49d9d|first_check:1759255363

Submitted on: 2025-09-30 20:02:44

Comments

Log in to comment.

No comments yet.