ETH Price: $2,051.26 (+5.62%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw208589282024-09-29 21:16:47502 days ago1727644607IN
Lucky Meme: LME Token
0 ETH0.000206016.63167056
Transfer208588442024-09-29 20:59:59502 days ago1727643599IN
Lucky Meme: LME Token
0 ETH0.000250246.10811727
Transfer208587622024-09-29 20:43:11502 days ago1727642591IN
Lucky Meme: LME Token
0 ETH0.000255746.24075237
Transfer208587342024-09-29 20:37:35502 days ago1727642255IN
Lucky Meme: LME Token
0 ETH0.000249796.09698727
Transfer208568552024-09-29 14:20:35502 days ago1727619635IN
Lucky Meme: LME Token
0 ETH0.000280156.8362707
Transfer208564202024-09-29 12:52:59502 days ago1727614379IN
Lucky Meme: LME Token
0 ETH0.000254966.22352928
Withdraw Tokens208564062024-09-29 12:50:11502 days ago1727614211IN
Lucky Meme: LME Token
0 ETH0.000427885.97709513
Transfer208563912024-09-29 12:47:11502 days ago1727614031IN
Lucky Meme: LME Token
0 ETH0.000255676.23907066
Approve208563752024-09-29 12:43:59502 days ago1727613839IN
Lucky Meme: LME Token
0 ETH0.000351997.46677218
Approve208309822024-09-25 23:44:11506 days ago1727307851IN
Lucky Meme: LME Token
0 ETH0.0006548113.94732266
Approve205141332024-08-12 17:49:47550 days ago1723484987IN
Lucky Meme: LME Token
0 ETH0.000218664.63847745
Approve204078432024-07-28 21:48:59565 days ago1722203339IN
Lucky Meme: LME Token
0 ETH0.000081581.738663
Approve202620642024-07-08 13:23:11585 days ago1720444991IN
Lucky Meme: LME Token
0 ETH0.000161463.42076752
Approve202040132024-06-30 10:49:47593 days ago1719744587IN
Lucky Meme: LME Token
0 ETH0.00013982.96560717
Approve201574992024-06-23 22:54:47600 days ago1719183287IN
Lucky Meme: LME Token
0 ETH0.000085041.80396179
Approve201553202024-06-23 15:35:35600 days ago1719156935IN
Lucky Meme: LME Token
0 ETH0.000217134.60603517
Transfer201474132024-06-22 13:01:59601 days ago1719061319IN
Lucky Meme: LME Token
0 ETH0.000138843.42322921
Transfer201473972024-06-22 12:58:47601 days ago1719061127IN
Lucky Meme: LME Token
0 ETH0.000134913.32335719
Approve201472342024-06-22 12:26:11601 days ago1719059171IN
Lucky Meme: LME Token
0 ETH0.000146363.100859
Approve201424342024-06-21 20:18:35602 days ago1719001115IN
Lucky Meme: LME Token
0 ETH0.000285996.05913852
Approve201424242024-06-21 20:16:35602 days ago1719000995IN
Lucky Meme: LME Token
0 ETH0.000238895.06117652
Approve201424052024-06-21 20:12:47602 days ago1719000767IN
Lucky Meme: LME Token
0 ETH0.0002725.76270369
Approve201371492024-06-21 2:35:35602 days ago1718937335IN
Lucky Meme: LME Token
0 ETH0.000129792.75325814
Approve201371162024-06-21 2:28:47602 days ago1718936927IN
Lucky Meme: LME Token
0 ETH0.000132922.81963878
Approve201308822024-06-20 5:33:59603 days ago1718861639IN
Lucky Meme: LME Token
0 ETH0.000153615.62904484
View all transactions

Latest 5 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer208589282024-09-29 21:16:47502 days ago1727644607
Lucky Meme: LME Token
0.005 ETH
Transfer198287562024-05-08 23:57:11646 days ago1715212631
Lucky Meme: LME Token
0.03 ETH
Transfer197699622024-04-30 18:37:47654 days ago1714502267
Lucky Meme: LME Token
0.02 ETH
Transfer197443372024-04-27 4:37:35657 days ago1714192655
Lucky Meme: LME Token
0.005 ETH
Transfer197440742024-04-27 3:44:35657 days ago1714189475
Lucky Meme: LME Token
0.01 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LuckyMeme

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.18;

import {IERC20} from "./IERC20.sol";
import {IERC20Errors} from "./draft-IERC6093.sol";


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the sender.
     */
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
contract LuckyMeme is Ownable, IERC20, IERC20Errors {
    mapping(address account => uint256) internal _balances;
    mapping(address account => mapping(address spender => uint256)) internal _allowances;

    uint256 private immutable _decimals;
    uint256 public immutable _maxTransaction;    // max of 1% of the total supply per transaction
    uint256 public immutable _distributeThreshold;
    uint256 public constant _tax = 4;    // 0.4% fee (_tax / _taxDenominator = 4/1000 = 0.004 = 0.4%)
    uint256 private constant _taxDenominator = 1000;
    uint256 public _distributeCounter = 0;
    uint256 private _totalSupply;

    bool public _trading = false;
    bool public _presale = true;    // presale tax and everything related
    bool public _hardTax = false;    // first month tax
    bool public _zeroTax = true;    

    string private constant _name = "LuckyMeme";
    string private constant _symbol = "LME";

    address payable immutable lmeAddress = payable(address(this));
    address payable public _annualprizeWallet = payable(0x58c88BC76769B9380F65FA9F8A01dd9F8af81022);
    address payable public _monthlyprizeWallet = payable(0x10Eea63dAEDaa2d81e9c29641eF6dCE005164dc1);
    address payable public _weeklyprizeWallet = payable(0xb120D280270870E7EF43101250b1b7d5A9F0D8e0);

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor() {
        _decimals = decimals();
        _maxTransaction = 10000000 * 10**_decimals;
        _distributeThreshold = 100000 * 10**_decimals;

        // Total supply is fixed and equal to the initial supply.
        uint256 _initialSupply = 1000000000 * 10**_decimals;
        _mint(_msgSender(), _initialSupply);
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address user = _msgSender();
        _zeroTax = true;
        _transfer(user, to, value);
        _zeroTax = false;

        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address user, address spender) public view virtual returns (uint256) {
        return _allowances[user][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address user = _msgSender();
        _approve(user, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _zeroTax = false;
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);

        // Trigger for distributing fees between project addresses.
        uint256 tokenBalance = balanceOf(lmeAddress);
        if (tokenBalance > _distributeThreshold) {
            if (_trading) {
                _distributeFee();
            }
        }
        
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }

        require((_trading) || ((from==lmeAddress) && (_presale)) || (to == owner()) || (from == owner()), "Cannot transact now"); 

        // Penalty imposed on holders who attempt to transact a larger amount than allowed, penalty=1 means there is no 
        // penalty (fee=0.4%). When the limit is exceeded, the holder suffers a penalty=10 (fee=4%).
        uint256 penalty;    

        // Situation in which the transaction limit has been exceeded.
        if (value > _maxTransaction) {
            penalty = 10;
        }
        // Transaction within the limit. 
        else {
            penalty = 1;    
        }

        _transferSubroutine(from, to, value, penalty);
    }

    /**
     * @dev Subroutine of the fucntion `_transfer`.     
     */
    function _transferSubroutine(address from, address to, uint256 value, uint256 penalty) internal {
        // If it is not one of the project addresses, penalty or fees are applied.
        if (from != owner() && from != _annualprizeWallet && from != _monthlyprizeWallet && from != _weeklyprizeWallet && from != lmeAddress) {
            if (to != owner() && to != _annualprizeWallet && to != _monthlyprizeWallet && to != _weeklyprizeWallet && to != lmeAddress) {
                uint256 taxedValue;    // value after fees                
                taxedValue = _applyFee(from, value, penalty);
                _update(from, to, taxedValue);
            }
            // Transaction to a project address. In this case, no penalties and no fees apply.
            else {
                _update(from, to, value);
            }
        }
        // Transaction from a project address. In this case, no penalties and no fees apply.
        else {
            _update(from, to, value);
        }
    }

    /**
     * @dev The contract retains a portion of the 'from' transaction amount (`value`) as a fee (`tax`).     
     */
    function _applyFee(address from, uint256 value, uint256 penalty) internal virtual returns(uint256) {
        uint256 tax;

        // Type of tax.
        if ((_zeroTax)||(_presale)) {
            tax = 0;
        }
        else if (_hardTax) {
            tax = 10 * penalty * (_tax * value) / _taxDenominator;
        }
        else {
            tax = penalty * (_tax * value) / _taxDenominator; 
        }

        // Value of the transaction after tax.
        uint256 taxedValue;
        taxedValue = value - tax;

        // Sender token balance.
        uint256 fromBalance = _balances[from];

        if (fromBalance < tax) {
            revert ERC20InsufficientBalance(from, fromBalance, tax);
        }
        unchecked {
            // Overflow not possible: tax < value <= fromBalance.
            _balances[from] = fromBalance - tax;
        }

        unchecked {
            // Overflow not possible: balance + tax is at most totalSupply, which we know fits into a uint256.
            _balances[lmeAddress] += tax;
        }        

        if (tax > 0) {
            emit Transfer(from, lmeAddress, tax);
        }

        return taxedValue;
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply = value;
        } 
        else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        // The project does not have burns, but someone might want to send their tokens to the null address anyway. 
        // In this case the total supply is reduced.
        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } 
        else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Distributes the fees between the parties: annual prize wallet, monthly prize wallet, weekly prize wallet 
     * and project. This function is called every time the contract's token balance exceeds 100,000 LME. With each 
     * call, the proportional part is sent to only one of the wallets. Once it reaches 100,000 LME again, the 
     * proportional transfer is made to the next wallet, and so on.     
     */
    function _distributeFee() internal virtual returns(bool) {
        uint256 _prizesWalletPercentage = 275;    // 0.11% is equivalent to 27.5% of 0.4% 
        uint256 _projectWalletPercentage = 175;    // 0.07% is equivalent to 17.5% of 0.4% 
        uint256 value = balanceOf(lmeAddress);    
        uint256 proportionalValue;
        address from = lmeAddress;
        address payable to;

        if (_distributeCounter == 0) {
            proportionalValue = (value * _prizesWalletPercentage) / _taxDenominator;
            to = _annualprizeWallet;
        }
        else if (_distributeCounter == 1) {
            proportionalValue = (value * _prizesWalletPercentage) / _taxDenominator;
            to = _monthlyprizeWallet;
        }
        else if (_distributeCounter == 2) {
            proportionalValue = (value * _prizesWalletPercentage) / _taxDenominator;
            to = _weeklyprizeWallet;
        }
        else {
            proportionalValue = (value * _projectWalletPercentage) / _taxDenominator;
            to = payable(owner());
        }

        // Update counter.
        _distributeCounter += 1;
        if (_distributeCounter >= 4) {
            _distributeCounter = 0;
        }

        // Transfer tokens to chosen wallet.
        _transfer(from, to, proportionalValue);
        
        return true;
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address user, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(user, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address user, address spender, uint256 value) internal virtual {
        if (user == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[user][spender] = value;
        emit Approval(user, spender, value);
    }

    /**
     * @dev Updates `user` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address user, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(user, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(user, spender, currentAllowance - value);
            }
        }
    }

    /**
     * @dev Changes the address of a prize wallet. If any prize wallet is compromised, this function must 
     * be called to update its address.
     */
    function changePrizeWallet(uint256 i, address prizeWallet) public virtual onlyOwner {
        if (i == 0) {
            _annualprizeWallet = payable(prizeWallet);
        }
        else if (i == 1) {
            _monthlyprizeWallet = payable(prizeWallet);
        }
        else if (i == 2) {
            _weeklyprizeWallet = payable(prizeWallet);
        }        
    }

    /**
     * @dev Changes the variable `_trading` state to true, and from then on the token can be traded freely. Note 
     * that after this there is no turning back, this variable will always be true.
     */
    function openTrading() public virtual onlyOwner {
        _trading = true;
    }

    /**
     * @dev Changes _hardTax to false. There is no turning back after that.
     */
    function hardTaxOver() public virtual onlyOwner {
        _hardTax = false;    
    }

    /**
     * @dev Forces the tax to be zero if needed.
     */
    function zeroTax() public virtual onlyOwner {
        if (_zeroTax) {
            _zeroTax = false;    
        }
        else {
            _zeroTax = true;
        }
    }

    /** 
     * @dev Send ethers to the project's wallet. We don't expect to use this function, but it can be useful.
     */
    function withdraw(uint256 ethAmount) external onlyOwner {
        payable(owner()).transfer(ethAmount);
    }

    /**
     * @dev Receive function.
     */
    receive() external payable virtual {
        address user = msg.sender;
        uint256 ethAmount = msg.value;

        if ((_presale) && (user!=owner())) {
            _swapETHforToken(user, ethAmount);
        }
    }


    /***** From now on everything is about the presale. *****/

    uint256 public totalPurchases = 0;
    uint256 public presalePrice = 2000000000000 wei;    // price of 1 LME in wei (1 LME = 0.000002 ETH)

    bool internal locked;    // lock state when executing	

    modifier noReentrancy() {
        require(!locked, "No reentrancy allowed");
        locked = true;
        _;
        locked = false;
    }

    // When the user send ETH to this contract, it needs to allow the user to be the spender of the transfer.
    // This allowance can't be done with the `approve` function since the sender is never the spender. Only 
    // for the presale we will allow this behavior.
    function _presaleApprove(address user, uint256 value) private returns (bool) {
        if ((_presale) || (user==owner())) {
            _approve(lmeAddress, user, value);
        }
        return true;
    }

    // User is giving ETH to receive tokens
    function _swapETHforToken(address user, uint256 ethAmount) private noReentrancy { 
        require(_presale, "Presale is over");

        // Verify min and max limits.
        require(ethAmount >= 5000000000000000 wei, "ETH amount must be greater than 0.005 ETH");
        require(ethAmount <= 1000000000000000000 wei, "ETH amount must be less than 1 ETH");

        // Calculates the amount of tokens the user will receive.
        uint256 tokenAmount = (ethAmount / presalePrice) * 10**_decimals;

        // Verify if the amount of token in the contract is enough to continue the transaction.   
        require(balanceOf(lmeAddress) >= tokenAmount, "Insufficient token balance to complete the transaction");  
        payable(owner()).transfer(ethAmount);

        // Transfer tokens to the user.
		bool status;
        require(_presaleApprove(user, tokenAmount), "Allowance not approved");
        status = transferFrom(lmeAddress, user, tokenAmount);
		
		// Updates.
        if (status) {
		    totalPurchases += tokenAmount;
        }
        // Just to make sure there are no loose ends.
        _presaleApprove(user, 0);
    } 

    // Activate this function to finish the presale. There is no turning back after that.
    function presaleOver() public onlyOwner {
        _presale = false;    
        _hardTax = true;    
    }

    // Send the LME tokens to the project's wallet.
    function withdrawTokens(uint256 tokenAmount) external onlyOwner {
		bool status;
        require(_presaleApprove(owner(), tokenAmount), "Allowance not approved");
        status = transferFrom(lmeAddress, owner(), tokenAmount);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.18;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.18;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_annualprizeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_distributeCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_distributeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hardTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_monthlyprizeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_trading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_weeklyprizeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_zeroTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"address","name":"prizeWallet","type":"address"}],"name":"changePrizeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hardTaxOver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zeroTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040525f6003555f60055f6101000a81548160ff0219169083151502179055506001600560016101000a81548160ff0219169083151502179055505f600560026101000a81548160ff0219169083151502179055506001600560036101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff168152507358c88bc76769b9380f65fa9f8a01dd9f8af81022600560046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507310eea63daedaa2d81e9c29641ef6dce005164dc160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b120d280270870e7ef43101250b1b7d5a9f0d8e060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f6008556501d1a94a2000600955348015620001bc575f80fd5b50620001dd620001d16200029460201b60201c565b6200029b60201b60201c565b620001ed6200035c60201b60201c565b60ff1660808181525050608051600a62000208919062000788565b62989680620002189190620007d8565b60a08181525050608051600a62000230919062000788565b620186a0620002409190620007d8565b60c081815250505f608051600a62000259919062000788565b633b9aca006200026a9190620007d8565b90506200028d620002806200029460201b60201c565b826200036460201b60201c565b50620008e7565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003d7575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620003ce919062000865565b60405180910390fd5b620003ea5f8383620003ee60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200042f578060048190555062000502565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015620004bc578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620004b39392919062000891565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200054b578060045f828254039250508190555062000596565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005f59190620008cc565b60405180910390a3505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200068c5780860481111562000664576200066362000602565b5b6001851615620006745780820291505b808102905062000684856200062f565b945062000644565b94509492505050565b5f82620006a6576001905062000778565b81620006b5575f905062000778565b8160018114620006ce5760028114620006d9576200070f565b600191505062000778565b60ff841115620006ee57620006ed62000602565b5b8360020a91508482111562000708576200070762000602565b5b5062000778565b5060208310610133831016604e8410600b8410161715620007495782820a90508381111562000743576200074262000602565b5b62000778565b6200075884848460016200063b565b9250905081840481111562000772576200077162000602565b5b81810290505b9392505050565b5f819050919050565b5f62000794826200077f565b9150620007a1836200077f565b9250620007d07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000695565b905092915050565b5f620007e4826200077f565b9150620007f1836200077f565b925082820262000801816200077f565b915082820484148315176200081b576200081a62000602565b5b5092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200084d8262000822565b9050919050565b6200085f8162000841565b82525050565b5f6020820190506200087a5f83018462000854565b92915050565b6200088b816200077f565b82525050565b5f606082019050620008a65f83018662000854565b620008b5602083018562000880565b620008c4604083018462000880565b949350505050565b5f602082019050620008e15f83018462000880565b92915050565b60805160a05160c05160e051612bf0620009765f395f818161094701528181610a4601528181610b9201528181610cee0152818161120101528181611588015281816117020152818161172c01528181611b3701528181611cd701528181611efc0152611f6a01525f8181610bba0152610d6201525f8181610fc401526116aa01525f6108fc0152612bf05ff3fe6080604052600436106101e5575f3560e01c806370a0823111610101578063da7003d411610094578063e2a71ef811610063578063e2a71ef8146106df578063e5f8091d14610709578063e751d50814610733578063f2fde38b1461075d57610253565b8063da7003d414610639578063dcab42b614610663578063dd62ed3e1461068d578063e0dca26e146106c957610253565b806395d89b41116100d057806395d89b4114610593578063a4e67f18146105bd578063a9059cbb146105e7578063c9567bf91461062357610253565b806370a0823114610501578063715018a61461053d57806376faf2ab146105535780638da5cb5b1461056957610253565b80632893266f116101795780634738a883116101485780634738a8831461046f5780634fd23e91146104855780635962a941146104af57806364ef317f146104d957610253565b80632893266f146103cb5780632e1a7d4d146103f5578063313ce5671461041d578063315a095d1461044757610253565b8063095ea7b3116101b5578063095ea7b3146102ff57806318160ddd1461033b57806323b872dd1461036557806326064376146103a157610253565b80620e7fa814610257578063026240ce14610281578063061dfbc9146102ab57806306fdde03146102d557610253565b36610253575f3390505f349050600560019054906101000a900460ff1680156102415750610211610785565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156102515761025082826107ac565b5b005b5f80fd5b348015610262575f80fd5b5061026b610ab7565b604051610278919061221e565b60405180910390f35b34801561028c575f80fd5b50610295610abd565b6040516102a2919061221e565b60405180910390f35b3480156102b6575f80fd5b506102bf610ac3565b6040516102cc9190612276565b60405180910390f35b3480156102e0575f80fd5b506102e9610ae8565b6040516102f69190612319565b60405180910390f35b34801561030a575f80fd5b50610325600480360381019061032091906123a2565b610b25565b60405161033291906123fa565b60405180910390f35b348015610346575f80fd5b5061034f610b47565b60405161035c919061221e565b60405180910390f35b348015610370575f80fd5b5061038b60048036038101906103869190612413565b610b50565b60405161039891906123fa565b60405180910390f35b3480156103ac575f80fd5b506103b5610c0c565b6040516103c291906123fa565b60405180910390f35b3480156103d6575f80fd5b506103df610c1f565b6040516103ec91906123fa565b60405180910390f35b348015610400575f80fd5b5061041b60048036038101906104169190612463565b610c32565b005b348015610428575f80fd5b50610431610c88565b60405161043e91906124a9565b60405180910390f35b348015610452575f80fd5b5061046d60048036038101906104689190612463565b610c90565b005b34801561047a575f80fd5b50610483610d21565b005b348015610490575f80fd5b50610499610d60565b6040516104a6919061221e565b60405180910390f35b3480156104ba575f80fd5b506104c3610d84565b6040516104d0919061221e565b60405180910390f35b3480156104e4575f80fd5b506104ff60048036038101906104fa91906124c2565b610d8a565b005b34801561050c575f80fd5b5061052760048036038101906105229190612500565b610e7b565b604051610534919061221e565b60405180910390f35b348015610548575f80fd5b50610551610ec1565b005b34801561055e575f80fd5b50610567610ed4565b005b348015610574575f80fd5b5061057d610785565b60405161058a919061253a565b60405180910390f35b34801561059e575f80fd5b506105a7610ef8565b6040516105b49190612319565b60405180910390f35b3480156105c8575f80fd5b506105d1610f35565b6040516105de91906123fa565b60405180910390f35b3480156105f2575f80fd5b5061060d600480360381019061060891906123a2565b610f47565b60405161061a91906123fa565b60405180910390f35b34801561062e575f80fd5b50610637610f9e565b005b348015610644575f80fd5b5061064d610fc2565b60405161065a919061221e565b60405180910390f35b34801561066e575f80fd5b50610677610fe6565b6040516106849190612276565b60405180910390f35b348015610698575f80fd5b506106b360048036038101906106ae9190612553565b61100b565b6040516106c0919061221e565b60405180910390f35b3480156106d4575f80fd5b506106dd61108d565b005b3480156106ea575f80fd5b506106f36110e7565b60405161070091906123fa565b60405180910390f35b348015610714575f80fd5b5061071d6110fa565b60405161072a9190612276565b60405180910390f35b34801561073e575f80fd5b50610747611120565b604051610754919061221e565b60405180910390f35b348015610768575f80fd5b50610783600480360381019061077e9190612500565b611125565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5f9054906101000a900460ff16156107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f2906125db565b60405180910390fd5b6001600a5f6101000a81548160ff021916908315150217905550600560019054906101000a900460ff16610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b90612643565b60405180910390fd5b6611c37937e080008110156108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a5906126d1565b60405180910390fd5b670de0b6b3a76400008111156108f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f09061275f565b60405180910390fd5b5f7f0000000000000000000000000000000000000000000000000000000000000000600a61092791906128d9565b600954836109359190612950565b61093f9190612980565b90508061096b7f0000000000000000000000000000000000000000000000000000000000000000610e7b565b10156109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a390612a31565b60405180910390fd5b6109b4610785565b73ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156109f6573d5f803e3d5ffd5b505f610a0284836111a9565b610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890612a99565b60405180910390fd5b610a6c7f00000000000000000000000000000000000000000000000000000000000000008584610b50565b90508015610a8d578160085f828254610a859190612ab7565b925050819055505b610a97845f6111a9565b5050505f600a5f6101000a81548160ff0219169083151502179055505050565b60095481565b60035481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600981526020017f4c75636b794d656d650000000000000000000000000000000000000000000000815250905090565b5f80610b2f611232565b9050610b3c818585611239565b600191505092915050565b5f600454905090565b5f80610b5a611232565b90505f600560036101000a81548160ff021916908315150217905550610b81858285611400565b610b8c858585611491565b5f610bb67f0000000000000000000000000000000000000000000000000000000000000000610e7b565b90507f0000000000000000000000000000000000000000000000000000000000000000811115610bff5760055f9054906101000a900460ff1615610bfe57610bfc6116f0565b505b5b6001925050509392505050565b600560039054906101000a900460ff1681565b600560029054906101000a900460ff1681565b610c3a6118a3565b610c42610785565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610c84573d5f803e3d5ffd5b5050565b5f6012905090565b610c986118a3565b5f610caa610ca4610785565b836111a9565b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090612a99565b60405180910390fd5b610d1b7f0000000000000000000000000000000000000000000000000000000000000000610d15610785565b84610b50565b90505050565b610d296118a3565b5f600560016101000a81548160ff0219169083151502179055506001600560026101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60085481565b610d926118a3565b5f8203610ddf5780600560046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e77565b60018203610e2c578060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e76565b60028203610e75578060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5b5050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ec96118a3565b610ed25f61192a565b565b610edc6118a3565b5f600560026101000a81548160ff021916908315150217905550565b60606040518060400160405280600381526020017f4c4d450000000000000000000000000000000000000000000000000000000000815250905090565b60055f9054906101000a900460ff1681565b5f80610f51611232565b90506001600560036101000a81548160ff021916908315150217905550610f79818585611491565b5f600560036101000a81548160ff021916908315150217905550600191505092915050565b610fa66118a3565b600160055f6101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6110956118a3565b600560039054906101000a900460ff16156110c9575f600560036101000a81548160ff0219169083151502179055506110e5565b6001600560036101000a81548160ff0219169083151502179055505b565b600560019054906101000a900460ff1681565b600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600481565b61112d6118a3565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361119d575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611194919061253a565b60405180910390fd5b6111a68161192a565b50565b5f600560019054906101000a900460ff16806111f757506111c8610785565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611228576112277f00000000000000000000000000000000000000000000000000000000000000008484611239565b5b6001905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a9575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016112a0919061253a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611319575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611310919061253a565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113f3919061221e565b60405180910390a3505050565b5f61140b848461100b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461148b578181101561147d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161147493929190612aea565b60405180910390fd5b61148a8484848403611239565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611501575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016114f8919061253a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611571575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611568919061253a565b60405180910390fd5b60055f9054906101000a900460ff16806115ee57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156115ed5750600560019054906101000a900460ff165b5b8061162b57506115fc610785565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806116685750611639610785565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b6116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90612b69565b60405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000008211156116d957600a90506116de565b600190505b6116ea848484846119eb565b50505050565b5f8061011390505f60af90505f6117267f0000000000000000000000000000000000000000000000000000000000000000610e7b565b90505f807f000000000000000000000000000000000000000000000000000000000000000090505f806003540361179c576103e886856117669190612980565b6117709190612950565b9250600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611860565b6001600354036117ea576103e886856117b59190612980565b6117bf9190612950565b925060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061185f565b600260035403611838576103e886856118039190612980565b61180d9190612950565b925060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061185e565b6103e885856118479190612980565b6118519190612950565b925061185b610785565b90505b5b5b600160035f8282546118729190612ab7565b9250508190555060046003541061188b575f6003819055505b611896828285611491565b6001965050505050505090565b6118ab611232565b73ffffffffffffffffffffffffffffffffffffffff166118c9610785565b73ffffffffffffffffffffffffffffffffffffffff1614611928576118ec611232565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161191f919061253a565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119f3610785565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611a7c5750600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611ad5575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611b2e575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611b8657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611d5b57611b93610785565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c1c5750600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611c75575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611cce575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611d2657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611d4a575f611d37858484611d6d565b9050611d44858583611ffb565b50611d56565b611d55848484611ffb565b5b611d67565b611d66848484611ffb565b5b50505050565b5f80600560039054906101000a900460ff1680611d965750600560019054906101000a900460ff165b15611da3575f9050611e19565b600560029054906101000a900460ff1615611df0576103e8846004611dc89190612980565b84600a611dd59190612980565b611ddf9190612980565b611de99190612950565b9050611e18565b6103e8846004611e009190612980565b84611e0b9190612980565b611e159190612950565b90505b5b5f8185611e269190612b87565b90505f60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015611eb2578681846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611ea993929190612aea565b60405180910390fd5b82810360015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508260015f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505f831115611fee577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611fe5919061221e565b60405180910390a35b8193505050509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361203a578060048190555061210a565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156120c4578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016120bb93929190612aea565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612151578060045f828254039250508190555061219c565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121f9919061221e565b60405180910390a3505050565b5f819050919050565b61221881612206565b82525050565b5f6020820190506122315f83018461220f565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61226082612237565b9050919050565b61227081612256565b82525050565b5f6020820190506122895f830184612267565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156122c65780820151818401526020810190506122ab565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6122eb8261228f565b6122f58185612299565b93506123058185602086016122a9565b61230e816122d1565b840191505092915050565b5f6020820190508181035f83015261233181846122e1565b905092915050565b5f80fd5b5f61234782612237565b9050919050565b6123578161233d565b8114612361575f80fd5b50565b5f813590506123728161234e565b92915050565b61238181612206565b811461238b575f80fd5b50565b5f8135905061239c81612378565b92915050565b5f80604083850312156123b8576123b7612339565b5b5f6123c585828601612364565b92505060206123d68582860161238e565b9150509250929050565b5f8115159050919050565b6123f4816123e0565b82525050565b5f60208201905061240d5f8301846123eb565b92915050565b5f805f6060848603121561242a57612429612339565b5b5f61243786828701612364565b935050602061244886828701612364565b92505060406124598682870161238e565b9150509250925092565b5f6020828403121561247857612477612339565b5b5f6124858482850161238e565b91505092915050565b5f60ff82169050919050565b6124a38161248e565b82525050565b5f6020820190506124bc5f83018461249a565b92915050565b5f80604083850312156124d8576124d7612339565b5b5f6124e58582860161238e565b92505060206124f685828601612364565b9150509250929050565b5f6020828403121561251557612514612339565b5b5f61252284828501612364565b91505092915050565b6125348161233d565b82525050565b5f60208201905061254d5f83018461252b565b92915050565b5f806040838503121561256957612568612339565b5b5f61257685828601612364565b925050602061258785828601612364565b9150509250929050565b7f4e6f207265656e7472616e637920616c6c6f77656400000000000000000000005f82015250565b5f6125c5601583612299565b91506125d082612591565b602082019050919050565b5f6020820190508181035f8301526125f2816125b9565b9050919050565b7f50726573616c65206973206f76657200000000000000000000000000000000005f82015250565b5f61262d600f83612299565b9150612638826125f9565b602082019050919050565b5f6020820190508181035f83015261265a81612621565b9050919050565b7f45544820616d6f756e74206d7573742062652067726561746572207468616e205f8201527f302e303035204554480000000000000000000000000000000000000000000000602082015250565b5f6126bb602983612299565b91506126c682612661565b604082019050919050565b5f6020820190508181035f8301526126e8816126af565b9050919050565b7f45544820616d6f756e74206d757374206265206c657373207468616e203120455f8201527f5448000000000000000000000000000000000000000000000000000000000000602082015250565b5f612749602283612299565b9150612754826126ef565b604082019050919050565b5f6020820190508181035f8301526127768161273d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156127ff578086048111156127db576127da61277d565b5b60018516156127ea5780820291505b80810290506127f8856127aa565b94506127bf565b94509492505050565b5f8261281757600190506128d2565b81612824575f90506128d2565b816001811461283a576002811461284457612873565b60019150506128d2565b60ff8411156128565761285561277d565b5b8360020a91508482111561286d5761286c61277d565b5b506128d2565b5060208310610133831016604e8410600b84101617156128a85782820a9050838111156128a3576128a261277d565b5b6128d2565b6128b584848460016127b6565b925090508184048111156128cc576128cb61277d565b5b81810290505b9392505050565b5f6128e382612206565b91506128ee83612206565b925061291b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612808565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61295a82612206565b915061296583612206565b92508261297557612974612923565b5b828204905092915050565b5f61298a82612206565b915061299583612206565b92508282026129a381612206565b915082820484148315176129ba576129b961277d565b5b5092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520746f20636f5f8201527f6d706c65746520746865207472616e73616374696f6e00000000000000000000602082015250565b5f612a1b603683612299565b9150612a26826129c1565b604082019050919050565b5f6020820190508181035f830152612a4881612a0f565b9050919050565b7f416c6c6f77616e6365206e6f7420617070726f766564000000000000000000005f82015250565b5f612a83601683612299565b9150612a8e82612a4f565b602082019050919050565b5f6020820190508181035f830152612ab081612a77565b9050919050565b5f612ac182612206565b9150612acc83612206565b9250828201905080821115612ae457612ae361277d565b5b92915050565b5f606082019050612afd5f83018661252b565b612b0a602083018561220f565b612b17604083018461220f565b949350505050565b7f43616e6e6f74207472616e73616374206e6f77000000000000000000000000005f82015250565b5f612b53601383612299565b9150612b5e82612b1f565b602082019050919050565b5f6020820190508181035f830152612b8081612b47565b9050919050565b5f612b9182612206565b9150612b9c83612206565b9250828203905081811115612bb457612bb361277d565b5b9291505056fea26469706673582212206f95a702394648d5cf1bc89e3b57f6d0f2e8688d24910d32d492682d619f665d64736f6c63430008180033

Deployed Bytecode

0x6080604052600436106101e5575f3560e01c806370a0823111610101578063da7003d411610094578063e2a71ef811610063578063e2a71ef8146106df578063e5f8091d14610709578063e751d50814610733578063f2fde38b1461075d57610253565b8063da7003d414610639578063dcab42b614610663578063dd62ed3e1461068d578063e0dca26e146106c957610253565b806395d89b41116100d057806395d89b4114610593578063a4e67f18146105bd578063a9059cbb146105e7578063c9567bf91461062357610253565b806370a0823114610501578063715018a61461053d57806376faf2ab146105535780638da5cb5b1461056957610253565b80632893266f116101795780634738a883116101485780634738a8831461046f5780634fd23e91146104855780635962a941146104af57806364ef317f146104d957610253565b80632893266f146103cb5780632e1a7d4d146103f5578063313ce5671461041d578063315a095d1461044757610253565b8063095ea7b3116101b5578063095ea7b3146102ff57806318160ddd1461033b57806323b872dd1461036557806326064376146103a157610253565b80620e7fa814610257578063026240ce14610281578063061dfbc9146102ab57806306fdde03146102d557610253565b36610253575f3390505f349050600560019054906101000a900460ff1680156102415750610211610785565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156102515761025082826107ac565b5b005b5f80fd5b348015610262575f80fd5b5061026b610ab7565b604051610278919061221e565b60405180910390f35b34801561028c575f80fd5b50610295610abd565b6040516102a2919061221e565b60405180910390f35b3480156102b6575f80fd5b506102bf610ac3565b6040516102cc9190612276565b60405180910390f35b3480156102e0575f80fd5b506102e9610ae8565b6040516102f69190612319565b60405180910390f35b34801561030a575f80fd5b50610325600480360381019061032091906123a2565b610b25565b60405161033291906123fa565b60405180910390f35b348015610346575f80fd5b5061034f610b47565b60405161035c919061221e565b60405180910390f35b348015610370575f80fd5b5061038b60048036038101906103869190612413565b610b50565b60405161039891906123fa565b60405180910390f35b3480156103ac575f80fd5b506103b5610c0c565b6040516103c291906123fa565b60405180910390f35b3480156103d6575f80fd5b506103df610c1f565b6040516103ec91906123fa565b60405180910390f35b348015610400575f80fd5b5061041b60048036038101906104169190612463565b610c32565b005b348015610428575f80fd5b50610431610c88565b60405161043e91906124a9565b60405180910390f35b348015610452575f80fd5b5061046d60048036038101906104689190612463565b610c90565b005b34801561047a575f80fd5b50610483610d21565b005b348015610490575f80fd5b50610499610d60565b6040516104a6919061221e565b60405180910390f35b3480156104ba575f80fd5b506104c3610d84565b6040516104d0919061221e565b60405180910390f35b3480156104e4575f80fd5b506104ff60048036038101906104fa91906124c2565b610d8a565b005b34801561050c575f80fd5b5061052760048036038101906105229190612500565b610e7b565b604051610534919061221e565b60405180910390f35b348015610548575f80fd5b50610551610ec1565b005b34801561055e575f80fd5b50610567610ed4565b005b348015610574575f80fd5b5061057d610785565b60405161058a919061253a565b60405180910390f35b34801561059e575f80fd5b506105a7610ef8565b6040516105b49190612319565b60405180910390f35b3480156105c8575f80fd5b506105d1610f35565b6040516105de91906123fa565b60405180910390f35b3480156105f2575f80fd5b5061060d600480360381019061060891906123a2565b610f47565b60405161061a91906123fa565b60405180910390f35b34801561062e575f80fd5b50610637610f9e565b005b348015610644575f80fd5b5061064d610fc2565b60405161065a919061221e565b60405180910390f35b34801561066e575f80fd5b50610677610fe6565b6040516106849190612276565b60405180910390f35b348015610698575f80fd5b506106b360048036038101906106ae9190612553565b61100b565b6040516106c0919061221e565b60405180910390f35b3480156106d4575f80fd5b506106dd61108d565b005b3480156106ea575f80fd5b506106f36110e7565b60405161070091906123fa565b60405180910390f35b348015610714575f80fd5b5061071d6110fa565b60405161072a9190612276565b60405180910390f35b34801561073e575f80fd5b50610747611120565b604051610754919061221e565b60405180910390f35b348015610768575f80fd5b50610783600480360381019061077e9190612500565b611125565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5f9054906101000a900460ff16156107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f2906125db565b60405180910390fd5b6001600a5f6101000a81548160ff021916908315150217905550600560019054906101000a900460ff16610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b90612643565b60405180910390fd5b6611c37937e080008110156108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a5906126d1565b60405180910390fd5b670de0b6b3a76400008111156108f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f09061275f565b60405180910390fd5b5f7f0000000000000000000000000000000000000000000000000000000000000012600a61092791906128d9565b600954836109359190612950565b61093f9190612980565b90508061096b7f0000000000000000000000004a8826988296843b2132cd4efb21294b01553987610e7b565b10156109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a390612a31565b60405180910390fd5b6109b4610785565b73ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f193505050501580156109f6573d5f803e3d5ffd5b505f610a0284836111a9565b610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890612a99565b60405180910390fd5b610a6c7f0000000000000000000000004a8826988296843b2132cd4efb21294b015539878584610b50565b90508015610a8d578160085f828254610a859190612ab7565b925050819055505b610a97845f6111a9565b5050505f600a5f6101000a81548160ff0219169083151502179055505050565b60095481565b60035481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600981526020017f4c75636b794d656d650000000000000000000000000000000000000000000000815250905090565b5f80610b2f611232565b9050610b3c818585611239565b600191505092915050565b5f600454905090565b5f80610b5a611232565b90505f600560036101000a81548160ff021916908315150217905550610b81858285611400565b610b8c858585611491565b5f610bb67f0000000000000000000000004a8826988296843b2132cd4efb21294b01553987610e7b565b90507f00000000000000000000000000000000000000000000152d02c7e14af6800000811115610bff5760055f9054906101000a900460ff1615610bfe57610bfc6116f0565b505b5b6001925050509392505050565b600560039054906101000a900460ff1681565b600560029054906101000a900460ff1681565b610c3a6118a3565b610c42610785565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610c84573d5f803e3d5ffd5b5050565b5f6012905090565b610c986118a3565b5f610caa610ca4610785565b836111a9565b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090612a99565b60405180910390fd5b610d1b7f0000000000000000000000004a8826988296843b2132cd4efb21294b01553987610d15610785565b84610b50565b90505050565b610d296118a3565b5f600560016101000a81548160ff0219169083151502179055506001600560026101000a81548160ff021916908315150217905550565b7f00000000000000000000000000000000000000000000152d02c7e14af680000081565b60085481565b610d926118a3565b5f8203610ddf5780600560046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e77565b60018203610e2c578060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e76565b60028203610e75578060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5b5050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ec96118a3565b610ed25f61192a565b565b610edc6118a3565b5f600560026101000a81548160ff021916908315150217905550565b60606040518060400160405280600381526020017f4c4d450000000000000000000000000000000000000000000000000000000000815250905090565b60055f9054906101000a900460ff1681565b5f80610f51611232565b90506001600560036101000a81548160ff021916908315150217905550610f79818585611491565b5f600560036101000a81548160ff021916908315150217905550600191505092915050565b610fa66118a3565b600160055f6101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000084595161401484a00000081565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6110956118a3565b600560039054906101000a900460ff16156110c9575f600560036101000a81548160ff0219169083151502179055506110e5565b6001600560036101000a81548160ff0219169083151502179055505b565b600560019054906101000a900460ff1681565b600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600481565b61112d6118a3565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361119d575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611194919061253a565b60405180910390fd5b6111a68161192a565b50565b5f600560019054906101000a900460ff16806111f757506111c8610785565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611228576112277f0000000000000000000000004a8826988296843b2132cd4efb21294b015539878484611239565b5b6001905092915050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a9575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016112a0919061253a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611319575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611310919061253a565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113f3919061221e565b60405180910390a3505050565b5f61140b848461100b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461148b578181101561147d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161147493929190612aea565b60405180910390fd5b61148a8484848403611239565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611501575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016114f8919061253a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611571575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611568919061253a565b60405180910390fd5b60055f9054906101000a900460ff16806115ee57507f0000000000000000000000004a8826988296843b2132cd4efb21294b0155398773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156115ed5750600560019054906101000a900460ff165b5b8061162b57506115fc610785565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806116685750611639610785565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b6116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90612b69565b60405180910390fd5b5f7f000000000000000000000000000000000000000000084595161401484a0000008211156116d957600a90506116de565b600190505b6116ea848484846119eb565b50505050565b5f8061011390505f60af90505f6117267f0000000000000000000000004a8826988296843b2132cd4efb21294b01553987610e7b565b90505f807f0000000000000000000000004a8826988296843b2132cd4efb21294b0155398790505f806003540361179c576103e886856117669190612980565b6117709190612950565b9250600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611860565b6001600354036117ea576103e886856117b59190612980565b6117bf9190612950565b925060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061185f565b600260035403611838576103e886856118039190612980565b61180d9190612950565b925060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061185e565b6103e885856118479190612980565b6118519190612950565b925061185b610785565b90505b5b5b600160035f8282546118729190612ab7565b9250508190555060046003541061188b575f6003819055505b611896828285611491565b6001965050505050505090565b6118ab611232565b73ffffffffffffffffffffffffffffffffffffffff166118c9610785565b73ffffffffffffffffffffffffffffffffffffffff1614611928576118ec611232565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161191f919061253a565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119f3610785565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611a7c5750600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611ad5575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611b2e575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611b8657507f0000000000000000000000004a8826988296843b2132cd4efb21294b0155398773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611d5b57611b93610785565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c1c5750600560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611c75575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611cce575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611d2657507f0000000000000000000000004a8826988296843b2132cd4efb21294b0155398773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611d4a575f611d37858484611d6d565b9050611d44858583611ffb565b50611d56565b611d55848484611ffb565b5b611d67565b611d66848484611ffb565b5b50505050565b5f80600560039054906101000a900460ff1680611d965750600560019054906101000a900460ff165b15611da3575f9050611e19565b600560029054906101000a900460ff1615611df0576103e8846004611dc89190612980565b84600a611dd59190612980565b611ddf9190612980565b611de99190612950565b9050611e18565b6103e8846004611e009190612980565b84611e0b9190612980565b611e159190612950565b90505b5b5f8185611e269190612b87565b90505f60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015611eb2578681846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611ea993929190612aea565b60405180910390fd5b82810360015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508260015f7f0000000000000000000000004a8826988296843b2132cd4efb21294b0155398773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505f831115611fee577f0000000000000000000000004a8826988296843b2132cd4efb21294b0155398773ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611fe5919061221e565b60405180910390a35b8193505050509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361203a578060048190555061210a565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156120c4578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016120bb93929190612aea565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612151578060045f828254039250508190555061219c565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121f9919061221e565b60405180910390a3505050565b5f819050919050565b61221881612206565b82525050565b5f6020820190506122315f83018461220f565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61226082612237565b9050919050565b61227081612256565b82525050565b5f6020820190506122895f830184612267565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156122c65780820151818401526020810190506122ab565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6122eb8261228f565b6122f58185612299565b93506123058185602086016122a9565b61230e816122d1565b840191505092915050565b5f6020820190508181035f83015261233181846122e1565b905092915050565b5f80fd5b5f61234782612237565b9050919050565b6123578161233d565b8114612361575f80fd5b50565b5f813590506123728161234e565b92915050565b61238181612206565b811461238b575f80fd5b50565b5f8135905061239c81612378565b92915050565b5f80604083850312156123b8576123b7612339565b5b5f6123c585828601612364565b92505060206123d68582860161238e565b9150509250929050565b5f8115159050919050565b6123f4816123e0565b82525050565b5f60208201905061240d5f8301846123eb565b92915050565b5f805f6060848603121561242a57612429612339565b5b5f61243786828701612364565b935050602061244886828701612364565b92505060406124598682870161238e565b9150509250925092565b5f6020828403121561247857612477612339565b5b5f6124858482850161238e565b91505092915050565b5f60ff82169050919050565b6124a38161248e565b82525050565b5f6020820190506124bc5f83018461249a565b92915050565b5f80604083850312156124d8576124d7612339565b5b5f6124e58582860161238e565b92505060206124f685828601612364565b9150509250929050565b5f6020828403121561251557612514612339565b5b5f61252284828501612364565b91505092915050565b6125348161233d565b82525050565b5f60208201905061254d5f83018461252b565b92915050565b5f806040838503121561256957612568612339565b5b5f61257685828601612364565b925050602061258785828601612364565b9150509250929050565b7f4e6f207265656e7472616e637920616c6c6f77656400000000000000000000005f82015250565b5f6125c5601583612299565b91506125d082612591565b602082019050919050565b5f6020820190508181035f8301526125f2816125b9565b9050919050565b7f50726573616c65206973206f76657200000000000000000000000000000000005f82015250565b5f61262d600f83612299565b9150612638826125f9565b602082019050919050565b5f6020820190508181035f83015261265a81612621565b9050919050565b7f45544820616d6f756e74206d7573742062652067726561746572207468616e205f8201527f302e303035204554480000000000000000000000000000000000000000000000602082015250565b5f6126bb602983612299565b91506126c682612661565b604082019050919050565b5f6020820190508181035f8301526126e8816126af565b9050919050565b7f45544820616d6f756e74206d757374206265206c657373207468616e203120455f8201527f5448000000000000000000000000000000000000000000000000000000000000602082015250565b5f612749602283612299565b9150612754826126ef565b604082019050919050565b5f6020820190508181035f8301526127768161273d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156127ff578086048111156127db576127da61277d565b5b60018516156127ea5780820291505b80810290506127f8856127aa565b94506127bf565b94509492505050565b5f8261281757600190506128d2565b81612824575f90506128d2565b816001811461283a576002811461284457612873565b60019150506128d2565b60ff8411156128565761285561277d565b5b8360020a91508482111561286d5761286c61277d565b5b506128d2565b5060208310610133831016604e8410600b84101617156128a85782820a9050838111156128a3576128a261277d565b5b6128d2565b6128b584848460016127b6565b925090508184048111156128cc576128cb61277d565b5b81810290505b9392505050565b5f6128e382612206565b91506128ee83612206565b925061291b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612808565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61295a82612206565b915061296583612206565b92508261297557612974612923565b5b828204905092915050565b5f61298a82612206565b915061299583612206565b92508282026129a381612206565b915082820484148315176129ba576129b961277d565b5b5092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520746f20636f5f8201527f6d706c65746520746865207472616e73616374696f6e00000000000000000000602082015250565b5f612a1b603683612299565b9150612a26826129c1565b604082019050919050565b5f6020820190508181035f830152612a4881612a0f565b9050919050565b7f416c6c6f77616e6365206e6f7420617070726f766564000000000000000000005f82015250565b5f612a83601683612299565b9150612a8e82612a4f565b602082019050919050565b5f6020820190508181035f830152612ab081612a77565b9050919050565b5f612ac182612206565b9150612acc83612206565b9250828201905080821115612ae457612ae361277d565b5b92915050565b5f606082019050612afd5f83018661252b565b612b0a602083018561220f565b612b17604083018461220f565b949350505050565b7f43616e6e6f74207472616e73616374206e6f77000000000000000000000000005f82015250565b5f612b53601383612299565b9150612b5e82612b1f565b602082019050919050565b5f6020820190508181035f830152612b8081612b47565b9050919050565b5f612b9182612206565b9150612b9c83612206565b9250828203905081811115612bb457612bb361277d565b5b9291505056fea26469706673582212206f95a702394648d5cf1bc89e3b57f6d0f2e8688d24910d32d492682d619f665d64736f6c63430008180033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

In the ever-changing landscape of meme coins, a unique project arises, consolidating investments to ride trends effortlessly, while incentivizing trading for enhanced rewards and offering accessible prizes.

Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.