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": []
}
}}
Submitted on: 2025-09-30 20:02:44
Comments
Log in to comment.
No comments yet.