ETH Price: $3,403.81 (+2.08%)

Contract

0xB7BDa6a89e724f63572Ce68FdDc1a6d1d5D24BCf
 

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
Approve214266352024-12-18 3:08:5911 days ago1734491339IN
OGz: OGz Token
0 ETH0.0006252913.5
Approve212847852024-11-28 7:44:1131 days ago1732779851IN
OGz: OGz Token
0 ETH0.000400948.60055053
Approve212847792024-11-28 7:42:5931 days ago1732779779IN
OGz: OGz Token
0 ETH0.000219467.49596168
Approve212748382024-11-26 22:13:3532 days ago1732659215IN
OGz: OGz Token
0 ETH0.0002502110.28272378
Transfer212584042024-11-24 15:09:1134 days ago1732460951IN
OGz: OGz Token
0 ETH0.000245399.15402172
Approve212128452024-11-18 6:35:1141 days ago1731911711IN
OGz: OGz Token
0 ETH0.000452289.77247954
Approve210794952024-10-30 15:58:3559 days ago1730303915IN
OGz: OGz Token
0 ETH0.0013119928.1435191
Approve210644052024-10-28 13:23:1161 days ago1730121791IN
OGz: OGz Token
0 ETH0.0002891511.9120408
Approve210507872024-10-26 15:47:5963 days ago1729957679IN
OGz: OGz Token
0 ETH0.000295516.34716062
Approve210133302024-10-21 10:22:5969 days ago1729506179IN
OGz: OGz Token
0 ETH0.000192257.9201587
Approve210057272024-10-20 8:54:5970 days ago1729414499IN
OGz: OGz Token
0 ETH0.00021929.00809231
Approve210057192024-10-20 8:53:2370 days ago1729414403IN
OGz: OGz Token
0 ETH0.000232839.56845374
Approve209875742024-10-17 20:08:2372 days ago1729195703IN
OGz: OGz Token
0 ETH0.0006995315.00558014
Approve209863092024-10-17 15:53:5972 days ago1729180439IN
OGz: OGz Token
0 ETH0.0004931820.26736459
Approve208762052024-10-02 7:05:3588 days ago1727852735IN
OGz: OGz Token
0 ETH0.000295396.37922387
Approve208742272024-10-02 0:28:2388 days ago1727828903IN
OGz: OGz Token
0 ETH0.000330777.09536681
Transfer208741812024-10-02 0:19:1188 days ago1727828351IN
OGz: OGz Token
0 ETH0.000292396.24086102
Transfer208741682024-10-02 0:16:3588 days ago1727828195IN
OGz: OGz Token
0 ETH0.000211087.09495011
Transfer208741632024-10-02 0:15:3588 days ago1727828135IN
OGz: OGz Token
0 ETH0.000338076.55145372
Transfer208741422024-10-02 0:11:2388 days ago1727827883IN
OGz: OGz Token
0 ETH0.000237217.97669828
Approve207459212024-09-14 2:38:23106 days ago1726281503IN
OGz: OGz Token
0 ETH0.000092081.9880969
Approve207056652024-09-08 11:42:23111 days ago1725795743IN
OGz: OGz Token
0 ETH0.000065071.40313085
Transfer206869792024-09-05 21:08:59114 days ago1725570539IN
OGz: OGz Token
0 ETH0.000226614.83690891
Transfer206849042024-09-05 14:12:23114 days ago1725545543IN
OGz: OGz Token
0 ETH0.0006003311.63097294
Transfer206789242024-09-04 18:10:47115 days ago1725473447IN
OGz: OGz Token
0 ETH0.000177243.43399036
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
214266362024-12-18 3:09:1111 days ago1734491351
0xB7BDa6a8...1d5D24BCf
0 ETH
214266362024-12-18 3:09:1111 days ago1734491351
0xB7BDa6a8...1d5D24BCf
0 ETH
214266362024-12-18 3:09:1111 days ago1734491351
0xB7BDa6a8...1d5D24BCf
0 ETH
212848012024-11-28 7:47:2331 days ago1732780043
0xB7BDa6a8...1d5D24BCf
0 ETH
212848012024-11-28 7:47:2331 days ago1732780043
0xB7BDa6a8...1d5D24BCf
0 ETH
212848012024-11-28 7:47:2331 days ago1732780043
0xB7BDa6a8...1d5D24BCf
0 ETH
212847562024-11-28 7:38:2331 days ago1732779503
0xB7BDa6a8...1d5D24BCf
0 ETH
212847562024-11-28 7:38:2331 days ago1732779503
0xB7BDa6a8...1d5D24BCf
0 ETH
212847562024-11-28 7:38:2331 days ago1732779503
0xB7BDa6a8...1d5D24BCf
0 ETH
212620912024-11-25 3:29:3534 days ago1732505375
0xB7BDa6a8...1d5D24BCf
0 ETH
212620912024-11-25 3:29:3534 days ago1732505375
0xB7BDa6a8...1d5D24BCf
0 ETH
212620912024-11-25 3:29:3534 days ago1732505375
0xB7BDa6a8...1d5D24BCf
0 ETH
212620912024-11-25 3:29:3534 days ago1732505375
0xB7BDa6a8...1d5D24BCf
0 ETH
212128452024-11-18 6:35:1141 days ago1731911711
0xB7BDa6a8...1d5D24BCf
0 ETH
212128452024-11-18 6:35:1141 days ago1731911711
0xB7BDa6a8...1d5D24BCf
0 ETH
212128452024-11-18 6:35:1141 days ago1731911711
0xB7BDa6a8...1d5D24BCf
0 ETH
210794992024-10-30 15:59:2359 days ago1730303963
0xB7BDa6a8...1d5D24BCf
0 ETH
210794992024-10-30 15:59:2359 days ago1730303963
0xB7BDa6a8...1d5D24BCf
0 ETH
210794992024-10-30 15:59:2359 days ago1730303963
0xB7BDa6a8...1d5D24BCf
0 ETH
210794992024-10-30 15:59:2359 days ago1730303963
0xB7BDa6a8...1d5D24BCf
0 ETH
210794992024-10-30 15:59:2359 days ago1730303963
0xB7BDa6a8...1d5D24BCf
0 ETH
210507892024-10-26 15:48:2363 days ago1729957703
0xB7BDa6a8...1d5D24BCf
0 ETH
210507892024-10-26 15:48:2363 days ago1729957703
0xB7BDa6a8...1d5D24BCf
0 ETH
210507892024-10-26 15:48:2363 days ago1729957703
0xB7BDa6a8...1d5D24BCf
0 ETH
210186482024-10-22 4:11:3568 days ago1729570295
0xB7BDa6a8...1d5D24BCf
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OGzClub

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : OGZToken.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

interface Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

contract OGzClub is ERC20, Ownable{
    uint256 public totalInitializated;
    uint256 private constant POOL_NUMBER = 7;
    uint256 private constant INITIALIZE_SUPPLY = 118_000_000_000 ether;
    uint256 public constant MAX_BUY_TAX_RATE = 800;
    uint256 public constant MAX_SELL_TAX_RATE = 800;
    uint256 public totalBuyTaxRate;
    uint256 public totalSellTaxRate;
    uint256 private toggleReferenceFees = 0;
    uint256 public togglePreferredNicknames;
    uint256 public referenceRate;
    uint256 public isTradeOpen;
    address public taxManager;
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public immutable PairAddress;
    Factory public constant FACTORY = Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);

    struct Pools {
        address poolAddress;
        uint256 taxRate;
    }

    struct Referrers {
        address referrer;
        uint256 timestamp;
    }

    struct Referrals {
        address referral;
        string nickname;
        uint256 timestamp;
        Referrers[] referees;
    }

    /// @dev mapping for all buying fee pools
    mapping(uint256 => Pools) public buyPools;
    mapping(uint256 => Pools) public sellPools;
    mapping(address => address) internal _referrals;
    mapping(address => string) internal _referralNickname;
    mapping(uint256 => uint256) internal _toggledOffBuyPools;
    mapping(uint256 => uint256) internal _toggledOffSellPools;
    mapping(string => address) internal _nickNames;
    /// @dev mapping for accounts that allow nicknames
    mapping(address => uint256) internal _preferredNicknames;
    /// @dev mapping for tax-frees accounts
    mapping(address => uint256) public _taxFrees;

    event RegisteredReferrence(address referral, string nickname, address referrer, uint256 timestamp);

    event CreatedLink(address owner, string nickName, uint256 timestamp);

    event BuyFeesUpdated(uint256 indexed poolId, uint256 newRate);

    event SellFeesUpdated(uint256 indexed poolId, uint256 newRate);

    event ReferenceFeeUpdated(uint256 oldRate, uint256 newFee);

    event ChangedPoolAddress(uint256 indexed poolId, address newAddress);

    event TransferWithTaxFee(string referralNickName, address referralAddress, address from, uint256 amount, uint256 referralEarnedAmount, uint256 timestamp);

    event ChangedTaxManager(address oldTaxManager, address newTaxManager);

    event TradingEnabled(uint256 timestamp);


    constructor(
        address _multisigOwner,
        address _taxManager,
        uint256 _referenceRate,
        Pools[] memory _poolsData)
    ERC20("OGzClub", "OGz") {
        require(_poolsData.length == POOL_NUMBER, "Pools datas length must be equal to 7");
        require(_multisigOwner != address(0) && _taxManager != address(0), "Owner and tax manager address cannot equal to address 0");
        require(_referenceRate > 0, "Reference tax rate must be greater than zero");
        referenceRate = _referenceRate;
        PairAddress = FACTORY.createPair(address(this), WETH);
        taxManager = _taxManager;
        _taxFrees[_multisigOwner] = 1;
        _transferOwnership(_multisigOwner);
        togglePreferredNicknames = 1;
        for (uint256 i = 0; i < _poolsData.length; i++) {
            require(_poolsData[i].poolAddress != address(0), "Pool address cannot equal to 0 address");
            require(_poolsData[i].taxRate > 0, "Pool rate must be greater than 0");
            buyPools[i] = _poolsData[i];
            sellPools[i] = _poolsData[i];
            totalBuyTaxRate += _poolsData[i].taxRate;
            totalSellTaxRate += _poolsData[i].taxRate;
        }
        require(
            totalBuyTaxRate == MAX_BUY_TAX_RATE &&
            totalSellTaxRate == MAX_SELL_TAX_RATE,
            "Total tax rate must be equal to maximum tax rate"
        );
        _mint(owner(), INITIALIZE_SUPPLY);
    }

    /** @dev Modifier to make a function callable only by the Tax Manager.
    * Throws if called by any account other than the Tax Manager.
    * @notice You must be the Tax Manager to call this.
    */
    modifier onlyTaxManager() {
        require(msg.sender == taxManager, "You are not tax manager.");
        _;
    }

    modifier initializationControl() {
        require(totalInitializated <= 62, "Initialization is done");
        _;
    }

    /**
    * @dev Modifier to restrict function access to preferred accounts for nickname creation.
    * @notice This modifier ensures that the function can only be accessed by preferred accounts,
    * or if the togglePreferredNicknames feature is turned off (equals to 0).
    */
    modifier onlyPreferredAccountCreateNickname() {
        require(
            togglePreferredNicknames == 0 ||
            _preferredNicknames[msg.sender] == 1,
            "You are not preferred");
        _;
    }

    /**
    * @dev Allows the current Tax Manager to relinquish control of the contract.
    * It sets the tax manager address to zero, hence no more tax related actions can be performed.
    * @notice Only the current Tax Manager can renounce tax management.
    */
    function renounceTaxManager() external onlyTaxManager {
        address oldTaxManager = taxManager;
        taxManager = address(0);
        emit ChangedTaxManager(oldTaxManager, taxManager);
    }

    /**
    * @dev Initializes referral data for the new token contract, pulling from the previously deployed token contract.
    * The referrals array provided should contain referral data from the previous contract to be transferred to the new one.
    * Emits a {CreatedLink} event for each referral that is successfully initialized.
    * Emits a {RegisteredReferrence} event for each referee that is successfully registered under a referrer.
    * @notice Only the contract owner can initialize the referral data.
    * @param referrals An array of Referral structs from the previous contract.
    * Each `Referral` struct should include the referrer's Ethereum address, nickname, and timestamp,
    * as well as an array of `Referee` structs, each of which should include the referred account's Ethereum address and timestamp.
    * @return true if the function succeeds.
    */
    function initializeReferralDatas(Referrals[] memory referrals) external onlyOwner initializationControl returns(bool) {
        require(referrals.length > 0, "Referrals array length must be greater than zero");
        totalInitializated += referrals.length;
        for (uint256 i = 0; i < referrals.length;) {
            _preferredNicknames[referrals[i].referral] = 1;
            require(bytes(_referralNickname[referrals[i].referral]).length == 0, "You already have a nickname");
            require(bytes(referrals[i].nickname).length != 0 && bytes(referrals[i].nickname).length <= 64, "Nickname must be between 1 and 64 characters");
            require(_nickNames[referrals[i].nickname] == address(0), "Nickname is already taken");
            _nickNames[referrals[i].nickname] = referrals[i].referral;
            _referralNickname[referrals[i].referral] = referrals[i].nickname;
            emit CreatedLink(referrals[i].referral, referrals[i].nickname, referrals[i].timestamp);
            if (referrals[i].referees.length > 0) {
                bytes32 referrerNicknameHash = keccak256(abi.encodePacked(_referralNickname[referrals[i].referral]));
                for (uint256 k = 0; k < referrals[i].referees.length;) {
                    require(
                        _referrals[referrals[i].referral] != referrals[i].referees[k].referrer &&
                        _referrals[referrals[i].referees[k].referrer] == address(0) &&
                        referrerNicknameHash != keccak256(abi.encodePacked("")) &&
                        referrals[i].referral != address(0) &&
                        referrals[i].referral != referrals[i].referees[k].referrer,
                        "Invalid referral"
                    );
                    _referrals[referrals[i].referees[k].referrer] = referrals[i].referral;
                    emit RegisteredReferrence(referrals[i].referral, referrals[i].nickname, referrals[i].referees[k].referrer, referrals[i].referees[k].timestamp);
                unchecked {
                    k ++;
                }
                }
            }
        unchecked {
            i ++;
        }
        }
        return true;
    }

    /**
    * @dev Transfers the tax management to a new address.
    * It sets the provided address as the new tax manager.
    * @notice Only the current Tax Manager can transfer tax management to a new address.
    * @param newTaxManager The address of the new Tax Manager.
    */
    function transferTaxManager(address newTaxManager) external onlyTaxManager {
        require(newTaxManager != address(0), "New address cannot be 0 address");
        address oldTaxManager = taxManager;
        taxManager = newTaxManager;
        emit ChangedTaxManager(oldTaxManager, taxManager);
    }


    /**
    * @dev Adds a list of addresses to the tax-free list.
    * These addresses will be exempt from taxes imposed by the contract.
    * @notice Only the current Tax Manager can add addresses to the tax-free list.
    * A maximum of 50 addresses can be added at a time.
    * @param taxFrees An array of addresses to be added to the tax-free list.
    * @return A boolean value indicating whether the operation was successful.
    */
    function addTaxFrees(address[] memory taxFrees) external onlyTaxManager returns(bool) {
        require(taxFrees.length <= 50, "Maximum 50 address can be added");
        for (uint256 i = 0; i < taxFrees.length;) {
            if (_taxFrees[taxFrees[i]] == 0 && taxFrees[i] != address(0)) {
                _taxFrees[taxFrees[i]] = 1;
            }
        unchecked {
            i++;
        }
        }
        return true;
    }

    /**
    * @dev Removes a list of addresses from the tax-free list.
    * These addresses will no longer be exempt from taxes imposed by the contract.
    * @notice Only the current Tax Manager can remove addresses from the tax-free list.
    * A maximum of 50 addresses can be removed at a time.
    * @param taxFrees An array of addresses to be removed from the tax-free list.
    * @return A boolean value indicating whether the operation was successful.
    */
    function removeTaxFrees(address[] memory taxFrees) external onlyTaxManager returns(bool) {
        require(taxFrees.length <= 50, "Maximum 50 address can be added");
        for (uint256 i = 0; i < taxFrees.length;) {
            if (_taxFrees[taxFrees[i]] == 1) {
                delete _taxFrees[taxFrees[i]];
            }
        unchecked {
            i++;
        }
        }
        return true;
    }

    /**
    * @dev Changes the address of a specific pool.
    * @notice This function can only be called by the current Tax Manager. It changes the
    * address of both the buy and sell pools at the specified pool ID.
    * @param poolId The ID of the pool whose address is to be changed.
    * @param newAddress The new address to set for the specified pool.
    */
    function changePoolAddress(
        uint256 poolId,
        address newAddress
    ) external onlyTaxManager {
        require(newAddress != address(0), "New address cannot equal to 0 address");
        require(poolId < POOL_NUMBER, "Pool id is not found.");
        buyPools[poolId].poolAddress = newAddress;
        sellPools[poolId].poolAddress = newAddress;
        emit ChangedPoolAddress(poolId, newAddress);
    }

    /**
    * @dev Function to add a list of preferred accounts for nickname creation.
    * @notice This function is used to add a list of accounts as preferred for creating nicknames.
    * The maximum limit is 50 accounts per transaction. Only contract owner can call this function.
    * @param account An array of account addresses to be marked as preferred.
    * @return Returns true if the operation is successful.
    */
    function addPreferredNicknames(address[] memory account) external onlyOwner returns(bool) {
        require(account.length <= 50, "Maximum 50 account can be added");
        for (uint256 i = 0; i < account.length; i++) {
            if (_preferredNicknames[account[i]] == 0 && account[i] != address(0)) {
                _preferredNicknames[account[i]] = 1;
            }
        }
        return true;
    }

    /**
    * @dev Function to remove a list of preferred accounts for nickname creation.
    * @notice This function is used to remove a list of accounts from the preferred accounts for creating nicknames.
    * The maximum limit is 50 accounts per transaction. Only contract owner can call this function.
    * @param account An array of account addresses to be removed from the list of preferred accounts.
    * @return Returns true if the operation is successful.
    */
    function removePreferredNicknames(address[] memory account) external onlyOwner returns(bool) {
        require(account.length <= 50, "Maximum 50 account can be removed");
        for (uint256 i = 0; i < account.length; i++) {
            if (_preferredNicknames[account[i]] == 1) {
                delete _preferredNicknames[account[i]];
            }
        }
        return true;
    }

    /**
    * @dev Function to disable the preferred nickname creation feature.
    * @notice This function allows the contract owner to disable the preferred nickname creation feature.
    * Once this function is called, only the contract owner will be able to re-enable it.
    * @return Returns true if the operation is successful.
    */
    function toggleOffPreferredNicknames() external onlyOwner returns(bool) {
        togglePreferredNicknames = 0;
        return true;
    }

    /**
    * @dev Function to check whether a specific account has the permission to create a nickname.
    * @notice This function checks whether the passed account has the permission to create a nickname.
    * If the preferred nickname feature is turned off (togglePreferredNicknames == 0), this function will return true for any account.
    * If the preferred nickname feature is turned on (togglePreferredNicknames != 0), only accounts in the preferred nicknames list (_preferredNicknames[account] == 1) will return true.
    * @param account The address of the account to check for the create nickname permission.
    * @return Returns true if the account has the permission to create a nickname.
    */
    function checkCreateNicknamePermission(address account) external view returns(bool) {
        return togglePreferredNicknames == 0 || _preferredNicknames[account] == 1;
    }


    /**
    * @dev Function to disable the buy tax fee for a specific pool.
    * @notice This function will disable the buy tax fee for a specific pool by setting the corresponding _toggledOffBuyPools value to 1.
    * If the pool is already toggled off, the function will revert. After disabling, the total buy tax rate will be updated and the pool will be deleted.
    * @param poolId The id of the pool to disable the buy tax fee.
    * @return Returns true if the operation is successful.
    */
    /*
    PoolIds:
    0: Future Plan
    1: Team1
    2: Team2
    3: Team3
    4: Liquidity Pool
    5: Staking
    6: Future Plan or Referral
    */
    function toggleOffBuyTaxFee(uint256 poolId) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffBuyPools[poolId] == 0, "The pool is already toggled off");
        _toggledOffBuyPools[poolId] = 1;
        totalBuyTaxRate = totalBuyTaxRate - buyPools[poolId].taxRate;
        delete buyPools[poolId];
        emit BuyFeesUpdated(poolId, 0);
        return true;
    }

    /**
    * @dev Function to disable the sell tax fee for a specific pool.
    * @notice This function will disable the sell tax fee for a specific pool by setting the corresponding _toggledOffSellPools value to 1.
    * If the pool is already toggled off, the function will revert. After disabling, the total sell tax rate will be updated and the pool will be deleted.
    * @param poolId The id of the pool to disable the sell tax fee.
    * @return Returns true if the operation is successful.
    */
    function toggleOffSellTaxFee(uint256 poolId) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffSellPools[poolId] == 0, "The pool is already toggled off");
        _toggledOffSellPools[poolId] = 1;
        totalSellTaxRate = totalSellTaxRate - sellPools[poolId].taxRate;
        delete sellPools[poolId];
        emit SellFeesUpdated(poolId, 0);
        return true;
    }

    /**
    * @dev Function to disable the reference fee.
    * @notice This function will disable the reference fee by setting the toggleReferenceFees value to 1. If the reference fee is already toggled off, the function will revert.
    * After disabling, the reference rate will be updated to 0.
    * @return Returns true if the operation is successful.
    */
    function toggleOffReferenceFee() external onlyTaxManager returns(bool) {
        require(toggleReferenceFees == 0, "Reference pool is already toggled off");
        toggleReferenceFees = 1;
        uint256 oldRate = referenceRate;
        referenceRate = 0;
        emit ReferenceFeeUpdated(oldRate, 0);
        return true;
    }

    /**
    * @dev Function to decrease the buy tax fee of a specific pool.
    * @notice This function allows the tax manager to reduce the buy tax fee for a given pool. The new fee should be greater than 0 and less than the current tax fee, otherwise, the function will revert. This function will not work if the pool is toggled off.
    * @param poolId The identifier of the pool that the tax fee will be decreased for.
    * @param newFee The new fee that will replace the old tax fee for the given pool.
    * @return Returns true if the operation is successful.
    */
    function decreaseBuyTaxFee(
        uint256 poolId,
        uint256 newFee
    ) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffBuyPools[poolId] == 0, "The pool is already toggled off");
        require(
            newFee > 0 &&
            newFee < buyPools[poolId].taxRate,
            "New fee rate must be between 0 and current tax fee"
        );
        totalBuyTaxRate = totalBuyTaxRate - (buyPools[poolId].taxRate - newFee);
        buyPools[poolId].taxRate = newFee;
        emit BuyFeesUpdated(poolId, newFee);
        return true;
    }

    /**
    * @dev Function to decrease the sell tax fee of a specific pool.
    * @notice This function allows the tax manager to reduce the sell tax fee for a given pool. The new fee should be greater than 0 and less than the current tax fee, otherwise, the function will revert. This function will not work if the pool is toggled off.
    * @param poolId The identifier of the pool that the tax fee will be decreased for.
    * @param newFee The new fee that will replace the old tax fee for the given pool.
    * @return Returns true if the operation is successful.
    */
    function decreaseSellTaxFee(
        uint256 poolId,
        uint256 newFee
    ) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffSellPools[poolId] == 0, "The pool is already toggled off");
        require(
            newFee > 0 &&
            newFee < sellPools[poolId].taxRate,
            "New fee rate must be between 0 and current tax fee"
        );
        totalSellTaxRate = totalSellTaxRate - (sellPools[poolId].taxRate - newFee);
        sellPools[poolId].taxRate = newFee;
        emit SellFeesUpdated(poolId, newFee);
        return true;
    }

    /**
    * @dev Function to decrease the reference fee.
    * @notice This function allows the tax manager to reduce the reference fee. The new fee should be greater than 0 and less than the current fee, otherwise, the function will revert.
    * @param newFee The new fee that will replace the old reference fee.
    * @return Returns true if the operation is successful.
    */
    function decreaseReferenceFee(uint256 newFee) external onlyTaxManager returns(bool) {
        require(
            newFee > 0 &&
            newFee < referenceRate,
            "New fee rate must be between 0 and current fee"
        );
        uint256 oldRate = referenceRate;
        referenceRate = newFee;
        emit ReferenceFeeUpdated(oldRate, newFee);
        return true;
    }

    /**
    * @dev Calculates the fee amount for a given transaction amount and fee rate.
    * @notice This is a private function used to calculate the fee amount based on a specific transaction amount and a fee rate.
    * The fee rate is a percentage value multiplied by 100 to handle it as an integer.
    * Therefore, it needs to be divided by 10,000 during calculation to reflect the correct fee amount.
    * @param amount The transaction amount for which the fee should be computed.
    * @param fee The fee rate used for the computation. The fee is represented as a percentage out of 10,000 (equivalent to a basis point representation).
    * @return Returns the calculated fee amount.
    */
    function computeFee(uint256 amount, uint256 fee) private pure returns(uint256) {
        return amount * fee / 10000;
    }

    /**
    * @notice Enables trading. This function can only be called by the contract owner.
    * @dev Checks whether trading is already enabled. If not, it enables trading and triggers the TradingEnabled event.
    * @return Returns a boolean value. If the operation is successful, it returns true; otherwise, false.
    */
    function enableTrading() external onlyOwner returns(bool) {
        require(isTradeOpen == 0, "Trade is already enabled");
        isTradeOpen = 1;
        emit TradingEnabled(block.timestamp);
        return true;
    }

    /**
    * @notice This private function is used to send buy fees to different pools and referral addresses.
    * @dev It calculates and transfers fees for each buy pool unless the pool is toggled off.
    * It also computes and transfers the reference fee if reference fees are toggled on and there exists a referral for the owner.
    * If there's no referral or reference fees are toggled off, it computes and sends the fee to the last pool if it is not toggled off.
    * The function subtracts the total fee from the amount and returns the difference.
    * @param owner The address of the owner initiating the buy action.
    * @param from The address of the pair.
    * @param amount The amount of tokens being purchased.
    * @return Returns the amount after subtracting the total fee.
    */
    function sendBuyFees(
        address owner,
        address from,
        uint256 amount
    ) private returns(uint256) {
        uint256 totalFee = 0;
        for (uint256 i = 0; i < POOL_NUMBER - 1; i++) {
            uint256 poolTaxRate = buyPools[i].taxRate;
            if (_toggledOffBuyPools[i] == 0) {
                uint256 fee = computeFee(amount, poolTaxRate);
                totalFee += fee;
                address poolAddress = buyPools[i].poolAddress;
                _transfer(from, poolAddress, fee);
            }
        }
        address referral = _referrals[owner];
        if (toggleReferenceFees == 0 && referral != address(0)) {
            uint256 referenceFee = computeFee(amount, referenceRate);
            totalFee += referenceFee;
            _transfer(from, referral, referenceFee);
            emit TransferWithTaxFee(_referralNickname[referral], referral, owner, amount, referenceFee, block.timestamp);
        } else if (_toggledOffBuyPools[POOL_NUMBER - 1] == 0){
            uint256 lastPoolFee = computeFee(amount, buyPools[POOL_NUMBER - 1].taxRate);
            totalFee += lastPoolFee;
            address lastPoolAddress = buyPools[POOL_NUMBER - 1].poolAddress;
            _transfer(from, lastPoolAddress, lastPoolFee);
        }
        return amount - totalFee;
    }

    /**
    * @notice This private function is used to send sell fees to different pools and referral addresses.
    * @dev It calculates and transfers fees for each sell pool unless the pool is toggled off.
    * It also computes and transfers the reference fee if reference fees are toggled on and there exists a referral for the owner.
    * If there's no referral or reference fees are toggled off, it computes and sends the fee to the last pool if it is not toggled off.
    * The function subtracts the total fee from the amount and returns the difference.
    * @param owner The address of the owner initiating the sell action.
    * @param amount The amount of tokens being sold.
    * @return Returns the amount after subtracting the total fee.
    */
    function sendSellFees(address owner, uint256 amount) private returns(uint256) {
        uint256 totalFee = 0;
        for (uint256 i = 0; i < POOL_NUMBER - 1; i++) {
            uint256 poolTaxRate = sellPools[i].taxRate;
            if (_toggledOffSellPools[i] == 0) {
                uint256 fee = computeFee(amount, poolTaxRate);
                totalFee += fee;
                address poolAddress = sellPools[i].poolAddress;
                _transfer(owner, poolAddress, fee);
            }
        }
        address referral = _referrals[owner];
        if (toggleReferenceFees == 0 && referral != address(0)) {
            uint256 referenceFee = computeFee(amount, referenceRate);
            totalFee += referenceFee;
            _transfer(owner, referral, referenceFee);
            emit TransferWithTaxFee(_referralNickname[referral], referral, owner, amount, referenceFee, block.timestamp);
        } else if(_toggledOffSellPools[POOL_NUMBER - 1] == 0){
            uint256 lastPoolFee = computeFee(amount, sellPools[POOL_NUMBER - 1].taxRate);
            totalFee += lastPoolFee;
            address lastPoolAddress = sellPools[POOL_NUMBER - 1].poolAddress;
            _transfer(owner, lastPoolAddress, lastPoolFee);
        }
        return amount - totalFee;
    }


    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        if (to == PairAddress && _taxFrees[from] == 0) {
            require(isTradeOpen == 1, "Trading is not open");
            amount = sendSellFees(from, amount);
        }
        _transfer(from, to, amount);
        return true;
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        if (owner == PairAddress && _taxFrees[to] == 0) {
            require(isTradeOpen == 1, "Trading is not open");
            amount = sendBuyFees(to, owner, amount);
        }
        _transfer(owner, to, amount);
        return true;
    }

    /**
    * @notice This function allows eligible accounts to create a nickname.
    * @dev Function is restricted to accounts that satisfy the 'onlyPreferredAccountCreateNickname' modifier.
    * A nickname should be unique, not empty, and at most 64 characters long.
    * Emits a 'CreatedLink' event upon successful execution.
    * @param nickName The chosen nickname string.
    * @return Returns 'true' upon successful execution.
    */
    function createNickname(string memory nickName) external onlyPreferredAccountCreateNickname returns(bool) {
        require(bytes(_referralNickname[msg.sender]).length == 0, "You already have a nickname");
        require(bytes(nickName).length != 0 && bytes(nickName).length <= 64, "Nickname must be between 1 and 64 characters");
        require(_nickNames[nickName] == address(0), "Nickname is already taken");
        _nickNames[nickName] = msg.sender;
        _referralNickname[msg.sender] = nickName;
        emit CreatedLink(msg.sender, nickName, block.timestamp);
        return true;
    }

    /**
    * @notice This function returns the nickname of a given account.
    * @param account The address of the account for which the nickname is queried.
    * @return Returns the nickname string associated with the given account.
    */
    function getNickname(address account) external view returns(string memory) {
        return _referralNickname[account];
    }

    /**
    * @notice This function returns the referrer information for a given referee.
    * @param referee The address of the referee for which the referrer information is queried.
    * @return Returns a tuple containing the nickname string and address of the referrer.
    */
    function getReferrer(address referee) external view returns(string memory, address) {
        address referrer = _referrals[referee];
        return (_referralNickname[referrer], referrer);
    }

    /**
    * @notice This function returns the address associated with a given nickname.
    * @param nickname The nickname for which the associated address is queried.
    * @return Returns the address associated with the given nickname.
    */
    function getAddressWithNickname(string memory nickname) external view returns(address) {
        return _nickNames[nickname];
    }

    /**
    * @notice This function allows a user to add a referral using a nickname.
    * @param nickname The nickname of the referrer.
    * @return Returns true if the referral was successfully added.
    */
    function addReferral(string memory nickname) external returns(bool) {
        address referrer = _nickNames[nickname];
        bytes32 referrerNicknameHash = keccak256(abi.encodePacked(_referralNickname[referrer]));
        require(
            _referrals[referrer] != msg.sender &&
            _referrals[msg.sender] == address(0) &&
            referrerNicknameHash != keccak256(abi.encodePacked("")) &&
            referrer != address(0) &&
            referrer != msg.sender,
            "Invalid referral"
        );
        _referrals[msg.sender] = referrer;
        emit RegisteredReferrence(referrer, nickname, msg.sender, block.timestamp);
        return true;
    }
}

File 2 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.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.
 *
 * By default, the owner account will be the one that deploys the contract. 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 is Context {
    address private _owner;

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

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

    /**
     * @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 {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _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);
    }
}

File 3 of 6 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * 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].
 *
 * 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 ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 value {ERC20} uses, unless this function is
     * 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 override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override 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 `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * 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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 4 of 6 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 5 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount
    ) external returns (bool);
}

File 6 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_multisigOwner","type":"address"},{"internalType":"address","name":"_taxManager","type":"address"},{"internalType":"uint256","name":"_referenceRate","type":"uint256"},{"components":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint256","name":"taxRate","type":"uint256"}],"internalType":"struct OGzClub.Pools[]","name":"_poolsData","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"ChangedPoolAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTaxManager","type":"address"},{"indexed":false,"internalType":"address","name":"newTaxManager","type":"address"}],"name":"ChangedTaxManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"nickName","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CreatedLink","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":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"ReferenceFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"referral","type":"address"},{"indexed":false,"internalType":"string","name":"nickname","type":"string"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RegisteredReferrence","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradingEnabled","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"referralNickName","type":"string"},{"indexed":false,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralEarnedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TransferWithTaxFee","type":"event"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"contract Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUY_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SELL_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_taxFrees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"}],"name":"addPreferredNicknames","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nickname","type":"string"}],"name":"addReferral","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"taxFrees","type":"address[]"}],"name":"addTaxFrees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"amount","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":"","type":"uint256"}],"name":"buyPools","outputs":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint256","name":"taxRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"newAddress","type":"address"}],"name":"changePoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkCreateNicknamePermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nickName","type":"string"}],"name":"createNickname","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"decreaseBuyTaxFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"decreaseReferenceFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"decreaseSellTaxFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nickname","type":"string"}],"name":"getAddressWithNickname","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNickname","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referee","type":"address"}],"name":"getReferrer","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"referral","type":"address"},{"internalType":"string","name":"nickname","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct OGzClub.Referrers[]","name":"referees","type":"tuple[]"}],"internalType":"struct OGzClub.Referrals[]","name":"referrals","type":"tuple[]"}],"name":"initializeReferralDatas","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTradeOpen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referenceRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"}],"name":"removePreferredNicknames","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"taxFrees","type":"address[]"}],"name":"removeTaxFrees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sellPools","outputs":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint256","name":"taxRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"toggleOffBuyTaxFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleOffPreferredNicknames","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleOffReferenceFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"toggleOffSellTaxFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePreferredNicknames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTaxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalInitializated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTaxRate","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":"amount","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":"amount","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":"address","name":"newTaxManager","type":"address"}],"name":"transferTaxManager","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405260006009553480156200001657600080fd5b506040516200446238038062004462833981016040819052620000399162000799565b6040518060400160405280600781526020016627a3bd21b63ab160c91b8152506040518060400160405280600381526020016227a3bd60e91b81525081600390816200008691906200093a565b5060046200009582826200093a565b505050620000b2620000ac620005ea60201b60201c565b620005ee565b6007815114620001175760405162461bcd60e51b815260206004820152602560248201527f506f6f6c73206461746173206c656e677468206d75737420626520657175616c60448201526420746f203760d81b60648201526084015b60405180910390fd5b6001600160a01b038416158015906200013857506001600160a01b03831615155b620001ac5760405162461bcd60e51b815260206004820152603760248201527f4f776e657220616e6420746178206d616e61676572206164647265737320636160448201527f6e6e6f7420657175616c20746f2061646472657373203000000000000000000060648201526084016200010e565b60008211620002135760405162461bcd60e51b815260206004820152602c60248201527f5265666572656e6365207461782072617465206d75737420626520677265617460448201526b6572207468616e207a65726f60a01b60648201526084016200010e565b600b8290556040516364e329cb60e11b815230600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26024820152735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9063c9c65396906044016020604051808303816000875af115801562000284573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002aa919062000a06565b6001600160a01b03908116608052600d80546001600160a01b0319168583161790558416600090815260166020526040902060019055620002eb84620005ee565b6001600a5560005b8151811015620005365760006001600160a01b03168282815181106200031d576200031d62000a2b565b6020026020010151600001516001600160a01b031603620003905760405162461bcd60e51b815260206004820152602660248201527f506f6f6c20616464726573732063616e6e6f7420657175616c20746f2030206160448201526564647265737360d01b60648201526084016200010e565b6000828281518110620003a757620003a762000a2b565b60200260200101516020015111620004025760405162461bcd60e51b815260206004820181905260248201527f506f6f6c2072617465206d7573742062652067726561746572207468616e203060448201526064016200010e565b81818151811062000417576200041762000a2b565b6020908102919091018101516000838152600e835260409020815181546001600160a01b0319166001600160a01b0390911617815591015160019091015581518290829081106200046c576200046c62000a2b565b6020908102919091018101516000838152600f835260409020815181546001600160a01b0319166001600160a01b039091161781559101516001909101558151829082908110620004c157620004c162000a2b565b60200260200101516020015160076000828254620004e0919062000a57565b92505081905550818181518110620004fc57620004fc62000a2b565b602002602001015160200151600860008282546200051b919062000a57565b909155508190506200052d8162000a73565b915050620002f3565b506103206007541480156200054e5750610320600854145b620005b55760405162461bcd60e51b815260206004820152603060248201527f546f74616c207461782072617465206d75737420626520657175616c20746f2060448201526f6d6178696d756d20746178207261746560801b60648201526084016200010e565b620005e0620005cc6005546001600160a01b031690565b6c017d474ff1aa1b1c12f000000062000640565b5050505062000a8f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620006985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200010e565b8060026000828254620006ac919062000a57565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b80516001600160a01b03811681146200072057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171562000760576200076062000725565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000791576200079162000725565b604052919050565b60008060008060808587031215620007b057600080fd5b620007bb8562000708565b93506020620007cc81870162000708565b60408781015160608901519296509450906001600160401b0380821115620007f357600080fd5b818901915089601f8301126200080857600080fd5b8151818111156200081d576200081d62000725565b6200082d858260051b0162000766565b818152858101925060069190911b83018501908b8211156200084e57600080fd5b928501925b818410156200089c5784848d0312156200086d5760008081fd5b620008776200073b565b620008828562000708565b815284870151878201528352928401929185019162000853565b989b979a50959850505050505050565b600181811c90821680620008c157607f821691505b602082108103620008e257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200070357600081815260208120601f850160051c81016020861015620009115750805b601f850160051c820191505b8181101562000932578281556001016200091d565b505050505050565b81516001600160401b0381111562000956576200095662000725565b6200096e81620009678454620008ac565b84620008e8565b602080601f831160018114620009a657600084156200098d5750858301515b600019600386901b1c1916600185901b17855562000932565b600085815260208120601f198616915b82811015620009d757888601518255948401946001909101908401620009b6565b5085821015620009f65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a1957600080fd5b62000a248262000708565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000a6d5762000a6d62000a41565b92915050565b60006001820162000a885762000a8862000a41565b5060010190565b6080516139a962000ab9600039600081816105620152818161091001526120bc01526139a96000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80638d0846381161019d578063ac169800116100e9578063bcae1d57116100a2578063e0a22e671161007c578063e0a22e67146106c4578063e0af4fe2146106d7578063ed534174146106e0578063f2fde38b146106f357600080fd5b8063bcae1d571461066b578063dd62ed3e1461069e578063dedbf736146106b157600080fd5b8063ac1698001461060f578063ad5c464814610618578063adaccd7414610633578063b37bf54614610646578063b4975d4a1461064f578063b8e3e0f21461065857600080fd5b8063a03fb0c911610156578063a343895511610130578063a3438955146105d6578063a457c2d7146105e9578063a7782d06146104f7578063a9059cbb146105fc57600080fd5b8063a03fb0c9146105b2578063a2aa18ad146105ba578063a32bff44146105cd57600080fd5b80638d084638146105395780638da5cb5b1461054c5780639026b8d91461055d57806394f46b751461058457806395d89b41146105975780639be675741461059f57600080fd5b80633bfb4aad1161025c5780635e043f95116102155780636e11a899116101ef5780636e11a899146104f757806370a0823114610500578063715018a6146105295780638a8c523c1461053157600080fd5b80635e043f95146104c857806360901444146104db57806361e8bc20146104e457600080fd5b80633bfb4aad1461040957806343330c941461041c57806344ecc1791461046e5780634672bd0e146104815780634a9fefc7146104945780634d237730146104b557600080fd5b8063313ce567116102ae578063313ce567146103a257806332a5fce5146103b157806332b6eca2146103c457806332f28053146103cc5780633516e6fe146103ec57806339509351146103f657600080fd5b806306fdde03146102f6578063095ea7b31461031457806318160ddd146103375780632175c6491461034957806323b872dd1461035c5780632dd310001461036f575b600080fd5b6102fe610706565b60405161030b9190612f83565b60405180910390f35b610327610322366004612fad565b610798565b604051901515815260200161030b565b6002545b60405190815260200161030b565b61032761035736600461308e565b6107b2565b61032761036a36600461312b565b610900565b61038a735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6040516001600160a01b03909116815260200161030b565b6040516012815260200161030b565b6103276103bf366004613167565b6109d5565b610327610a02565b61033b6103da366004613167565b60166020526000908152604090205481565b6103f4610ae5565b005b610327610404366004612fad565b610b69565b61032761041736600461308e565b610b8b565b61044f61042a366004613182565b600e60205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b03909316835260208301919091520161030b565b61032761047c36600461308e565b610ce2565b61032761048f366004613182565b610dfe565b6104a76104a2366004613167565b610ee9565b60405161030b92919061319b565b600d5461038a906001600160a01b031681565b6103276104d6366004613235565b610fb2565b61033b600c5481565b61038a6104f23660046133e8565b611859565b61033b61032081565b61033b61050e366004613167565b6001600160a01b031660009081526020819052604090205490565b6103f461188a565b61032761189e565b6103276105473660046133e8565b611936565b6005546001600160a01b031661038a565b61038a7f000000000000000000000000000000000000000000000000000000000000000081565b6103276105923660046133e8565b611b4b565b6102fe611ce4565b6103276105ad366004613425565b611cf3565b610327611e2f565b6103f46105c8366004613167565b611e44565b61033b600b5481565b6103276105e4366004613182565b611f25565b6103276105f7366004612fad565b612034565b61032761060a366004612fad565b6120af565b61033b600a5481565b61038a73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6102fe610641366004613167565b612166565b61033b60075481565b61033b60065481565b61032761066636600461308e565b612212565b61044f610679366004613182565b600f60205260009081526040902080546001909101546001600160a01b039091169082565b61033b6106ac366004613447565b61231f565b6103f46106bf36600461347a565b61234a565b6103276106d2366004613425565b612495565b61033b60085481565b6103276106ee366004613182565b6125c0565b6103f4610701366004613167565b6126bf565b6060600380546107159061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546107419061349d565b801561078e5780601f106107635761010080835404028352916020019161078e565b820191906000526020600020905b81548152906001019060200180831161077157829003601f168201915b5050505050905090565b6000336107a6818585612738565b60019150505b92915050565b60006107bc61285c565b6032825111156108135760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d203530206163636f756e742063616e2062652061646465640060448201526064015b60405180910390fd5b60005b82518110156108f55760156000848381518110610835576108356134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000148015610899575060006001600160a01b0316838281518110610885576108856134d7565b60200260200101516001600160a01b031614155b156108e3576001601560008584815181106108b6576108b66134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b806108ed81613503565b915050610816565b50600190505b919050565b60003361090e8582856128b6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614801561096557506001600160a01b038516600090815260166020526040902054155b156109bf57600c546001146109b25760405162461bcd60e51b81526020600482015260136024820152722a3930b234b7339034b9903737ba1037b832b760691b604482015260640161080a565b6109bc8584612930565b92505b6109ca858585612b2f565b506001949350505050565b6000600a54600014806107ac5750506001600160a01b031660009081526015602052604090205460011490565b600d546000906001600160a01b03163314610a2f5760405162461bcd60e51b815260040161080a9061351c565b60095415610a8d5760405162461bcd60e51b815260206004820152602560248201527f5265666572656e636520706f6f6c20697320616c726561647920746f67676c65604482015264321037b33360d91b606482015260840161080a565b6001600955600b805460009182905560405190917f27f369f734f9f38ca1388d9fd8488d89e84f8bea0457621af7b35b6df99976ed91610ad591848252602082015260400190565b60405180910390a1600191505090565b600d546001600160a01b03163314610b0f5760405162461bcd60e51b815260040161080a9061351c565b600d80546001600160a01b03198116909155604080516001600160a01b0390921680835260006020840152917f4adb4bd40da8456432ec4d0c365d395fb1d51464c6bf1edf44c49eca7708a449910160405180910390a150565b6000336107a6818585610b7c838361231f565b610b869190613553565b612738565b600d546000906001600160a01b03163314610bb85760405162461bcd60e51b815260040161080a9061351c565b603282511115610c0a5760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20353020616464726573732063616e20626520616464656400604482015260640161080a565b60005b82518110156108f55760166000848381518110610c2c57610c2c6134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000148015610c90575060006001600160a01b0316838281518110610c7c57610c7c6134d7565b60200260200101516001600160a01b031614155b15610cda57600160166000858481518110610cad57610cad6134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b600101610c0d565b600d546000906001600160a01b03163314610d0f5760405162461bcd60e51b815260040161080a9061351c565b603282511115610d615760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20353020616464726573732063616e20626520616464656400604482015260640161080a565b60005b82518110156108f55760166000848381518110610d8357610d836134d7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054600103610df65760166000848381518110610dc957610dc96134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600090555b600101610d64565b600d546000906001600160a01b03163314610e2b5760405162461bcd60e51b815260040161080a9061351c565b600082118015610e3c5750600b5482105b610e9f5760405162461bcd60e51b815260206004820152602e60248201527f4e6577206665652072617465206d757374206265206265747765656e2030206160448201526d6e642063757272656e742066656560901b606482015260840161080a565b600b80549083905560408051828152602081018590527f27f369f734f9f38ca1388d9fd8488d89e84f8bea0457621af7b35b6df99976ed910160405180910390a150600192915050565b6001600160a01b0380821660009081526010602090815260408083205490931680835260119091529181208054606093919082908290610f289061349d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f549061349d565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b505050505091509250925050915091565b6000610fbc61285c565b603e60065411156110085760405162461bcd60e51b8152602060048201526016602482015275496e697469616c697a6174696f6e20697320646f6e6560501b604482015260640161080a565b60008251116110725760405162461bcd60e51b815260206004820152603060248201527f526566657272616c73206172726179206c656e677468206d757374206265206760448201526f726561746572207468616e207a65726f60801b606482015260840161080a565b8151600660008282546110859190613553565b90915550600090505b82518110156108f5576001601560008584815181106110af576110af6134d7565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550601160008483815181106110f5576110f56134d7565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020805461112c9061349d565b15905061117b5760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c726561647920686176652061206e69636b6e616d650000000000604482015260640161080a565b82818151811061118d5761118d6134d7565b602002602001015160200151516000141580156111c9575060408382815181106111b9576111b96134d7565b6020026020010151602001515111155b6111e55760405162461bcd60e51b815260040161080a90613566565b60006001600160a01b03166014848381518110611204576112046134d7565b60200260200101516020015160405161121d91906135b2565b908152604051908190036020019020546001600160a01b03161461127f5760405162461bcd60e51b81526020600482015260196024820152782734b1b5b730b6b29034b99030b63932b0b23c903a30b5b2b760391b604482015260640161080a565b828181518110611291576112916134d7565b60200260200101516000015160148483815181106112b1576112b16134d7565b6020026020010151602001516040516112ca91906135b2565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082818151811061130e5761130e6134d7565b60200260200101516020015160116000858481518110611330576113306134d7565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000209081611368919061361c565b507f0ed9a97ab9c2d9154a598932f980864c384da57bbf1b41cef09c6768dff088ad83828151811061139c5761139c6134d7565b6020026020010151600001518483815181106113ba576113ba6134d7565b6020026020010151602001518584815181106113d8576113d86134d7565b6020026020010151604001516040516113f3939291906136dc565b60405180910390a1600083828151811061140f5761140f6134d7565b6020026020010151606001515111156118515760006011600085848151811061143a5761143a6134d7565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000206040516020016114769190613710565b60405160208183030381529060405280519060200120905060005b8483815181106114a3576114a36134d7565b6020026020010151606001515181101561184e578483815181106114c9576114c96134d7565b60200260200101516060015181815181106114e6576114e66134d7565b6020026020010151600001516001600160a01b031660106000878681518110611511576115116134d7565b602090810291909101810151516001600160a01b039081168352908201929092526040016000205416148015906115ac575060006001600160a01b031660106000878681518110611564576115646134d7565b6020026020010151606001518481518110611581576115816134d7565b602090810291909101810151516001600160a01b039081168352908201929092526040016000205416145b80156115ca5750604080516000815260208101918290525190208214155b8015611606575060006001600160a01b03168584815181106115ee576115ee6134d7565b6020026020010151600001516001600160a01b031614155b801561167b575084838151811061161f5761161f6134d7565b602002602001015160600151818151811061163c5761163c6134d7565b6020026020010151600001516001600160a01b0316858481518110611663576116636134d7565b6020026020010151600001516001600160a01b031614155b6116ba5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c9959995c9c985b60821b604482015260640161080a565b8483815181106116cc576116cc6134d7565b602002602001015160000151601060008786815181106116ee576116ee6134d7565b602002602001015160600151848151811061170b5761170b6134d7565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507fd4024e5e44041dd6dba8b883ae669a8fb58b9402a39d82671cd3696fef8c8c4985848151811061178e5761178e6134d7565b6020026020010151600001518685815181106117ac576117ac6134d7565b6020026020010151602001518786815181106117ca576117ca6134d7565b60200260200101516060015184815181106117e7576117e76134d7565b602002602001015160000151888781518110611805576118056134d7565b6020026020010151606001518581518110611822576118226134d7565b60200260200101516020015160405161183e9493929190613786565b60405180910390a1600101611491565b50505b60010161108e565b600060148260405161186b91906135b2565b908152604051908190036020019020546001600160a01b031692915050565b61189261285c565b61189c6000612cd3565b565b60006118a861285c565b600c54156118f85760405162461bcd60e51b815260206004820152601860248201527f547261646520697320616c726561647920656e61626c65640000000000000000604482015260640161080a565b6001600c556040514281527fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9239060200160405180910390a150600190565b6000600a54600014806119585750336000908152601560205260409020546001145b61199c5760405162461bcd60e51b8152602060048201526015602482015274165bdd48185c99481b9bdd081c1c9959995c9c9959605a1b604482015260640161080a565b33600090815260116020526040902080546119b69061349d565b159050611a055760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c726561647920686176652061206e69636b6e616d650000000000604482015260640161080a565b815115801590611a1757506040825111155b611a335760405162461bcd60e51b815260040161080a90613566565b60006001600160a01b0316601483604051611a4e91906135b2565b908152604051908190036020019020546001600160a01b031614611ab05760405162461bcd60e51b81526020600482015260196024820152782734b1b5b730b6b29034b99030b63932b0b23c903a30b5b2b760391b604482015260640161080a565b33601483604051611ac191906135b2565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039490941693909317909255336000908152601190915220611b07838261361c565b507f0ed9a97ab9c2d9154a598932f980864c384da57bbf1b41cef09c6768dff088ad338342604051611b3b939291906136dc565b60405180910390a1506001919050565b600080601483604051611b5e91906135b2565b9081526040805160209281900383018120546001600160a01b03166000818152601185529283209094509192611b95929101613710565b60408051601f1981840301815291815281516020928301206001600160a01b03858116600090815260109094529190922054919250163314801590611bf05750336000908152601060205260409020546001600160a01b0316155b8015611c0e5750604080516000815260208101918290525190208114155b8015611c2257506001600160a01b03821615155b8015611c3757506001600160a01b0382163314155b611c765760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c9959995c9c985b60821b604482015260640161080a565b336000818152601060205260409081902080546001600160a01b0319166001600160a01b038616179055517fd4024e5e44041dd6dba8b883ae669a8fb58b9402a39d82671cd3696fef8c8c4991611cd291859188914290613786565b60405180910390a15060019392505050565b6060600480546107159061349d565b600d546000906001600160a01b03163314611d205760405162461bcd60e51b815260040161080a9061351c565b6007831115611d415760405162461bcd60e51b815260040161080a906137ba565b60008381526012602052604090205415611d6d5760405162461bcd60e51b815260040161080a906137e5565b600082118015611d8d57506000838152600e602052604090206001015482105b611da95760405162461bcd60e51b815260040161080a9061381c565b6000838152600e6020526040902060010154611dc690839061386e565b600754611dd3919061386e565b6007556000838152600e6020526040908190206001018390555183907f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c90611e1e9085815260200190565b60405180910390a250600192915050565b6000611e3961285c565b506000600a55600190565b600d546001600160a01b03163314611e6e5760405162461bcd60e51b815260040161080a9061351c565b6001600160a01b038116611ec45760405162461bcd60e51b815260206004820152601f60248201527f4e657720616464726573732063616e6e6f742062652030206164647265737300604482015260640161080a565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f4adb4bd40da8456432ec4d0c365d395fb1d51464c6bf1edf44c49eca7708a449910160405180910390a15050565b600d546000906001600160a01b03163314611f525760405162461bcd60e51b815260040161080a9061351c565b6007821115611f735760405162461bcd60e51b815260040161080a906137ba565b60008281526012602052604090205415611f9f5760405162461bcd60e51b815260040161080a906137e5565b6000828152601260209081526040808320600190819055600e9092529091200154600754611fcd919061386e565b6007556000828152600e602052604080822080546001600160a01b03191681556001018290555183917f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c9161202491815260200190565b60405180910390a2506001919050565b60003381612042828661231f565b9050838110156120a25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161080a565b6109ca8286868403612738565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168114801561210057506001600160a01b038416600090815260166020526040902054155b1561215b57600c5460011461214d5760405162461bcd60e51b81526020600482015260136024820152722a3930b234b7339034b9903737ba1037b832b760691b604482015260640161080a565b612158848285612d25565b92505b6107a6818585612b2f565b6001600160a01b038116600090815260116020526040902080546060919061218d9061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546121b99061349d565b80156122065780601f106121db57610100808354040283529160200191612206565b820191906000526020600020905b8154815290600101906020018083116121e957829003601f168201915b50505050509050919050565b600061221c61285c565b6032825111156122785760405162461bcd60e51b815260206004820152602160248201527f4d6178696d756d203530206163636f756e742063616e2062652072656d6f76656044820152601960fa1b606482015260840161080a565b60005b82518110156108f5576015600084838151811061229a5761229a6134d7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205460010361230d57601560008483815181106122e0576122e06134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600090555b8061231781613503565b91505061227b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600d546001600160a01b031633146123745760405162461bcd60e51b815260040161080a9061351c565b6001600160a01b0381166123d85760405162461bcd60e51b815260206004820152602560248201527f4e657720616464726573732063616e6e6f7420657175616c20746f2030206164604482015264647265737360d81b606482015260840161080a565b600782106124205760405162461bcd60e51b81526020600482015260156024820152742837b7b61034b21034b9903737ba103337bab7321760591b604482015260640161080a565b6000828152600e6020908152604080832080546001600160a01b0386166001600160a01b03199182168117909255600f845293829020805490941681179093555191825283917fb672b14b994dc0b451a4b01d24d56f5230137c6960ef3e02bfd22255ced63e01910160405180910390a25050565b600d546000906001600160a01b031633146124c25760405162461bcd60e51b815260040161080a9061351c565b60078311156124e35760405162461bcd60e51b815260040161080a906137ba565b6000838152601360205260409020541561250f5760405162461bcd60e51b815260040161080a906137e5565b60008211801561252f57506000838152600f602052604090206001015482105b61254b5760405162461bcd60e51b815260040161080a9061381c565b6000838152600f602052604090206001015461256890839061386e565b600854612575919061386e565b6008556000838152600f6020526040908190206001018390555183907f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b90611e1e9085815260200190565b600d546000906001600160a01b031633146125ed5760405162461bcd60e51b815260040161080a9061351c565b600782111561260e5760405162461bcd60e51b815260040161080a906137ba565b6000828152601360205260409020541561263a5760405162461bcd60e51b815260040161080a906137e5565b6000828152601360209081526040808320600190819055600f9092529091200154600854612668919061386e565b6008556000828152600f602052604080822080546001600160a01b03191681556001018290555183917f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b9161202491815260200190565b6126c761285c565b6001600160a01b03811661272c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080a565b61273581612cd3565b50565b6001600160a01b03831661279a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161080a565b6001600160a01b0382166127fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161080a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b0316331461189c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080a565b60006128c2848461231f565b9050600019811461292a578181101561291d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161080a565b61292a8484848403612738565b50505050565b600080805b6129416001600761386e565b8110156129c0576000818152600f602090815260408083206001015460139092528220549091036129ad5760006129788683612f0e565b90506129848185613553565b6000848152600f60205260409020549094506001600160a01b03166129aa888284612b2f565b50505b50806129b881613503565b915050612935565b506001600160a01b038085166000908152601060205260409020546009549116901580156129f657506001600160a01b03811615155b15612a81576000612a0985600b54612f0e565b9050612a158184613553565b9250612a22868383612b2f565b6001600160a01b0382166000908152601160205260409081902090517f684eec4406defb53defd351500aae07199860053b688af9137c2a72b037455bf91612a739185908a908a9087904290613881565b60405180910390a150612b1c565b60136000612a916001600761386e565b815260200190815260200160002054600003612b1c576000612ad385600f83612abc6001600761386e565b815260200190815260200160002060010154612f0e565b9050612adf8184613553565b92506000600f81612af26001600761386e565b81526020810191909152604001600020546001600160a01b03169050612b19878284612b2f565b50505b612b26828561386e565b95945050505050565b6001600160a01b038316612b935760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161080a565b6001600160a01b038216612bf55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161080a565b6001600160a01b03831660009081526020819052604090205481811015612c6d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161080a565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361292a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080805b612d366001600761386e565b811015612db5576000818152600e60209081526040808320600101546012909252822054909103612da2576000612d6d8683612f0e565b9050612d798185613553565b6000848152600e60205260409020549094506001600160a01b0316612d9f888284612b2f565b50505b5080612dad81613503565b915050612d2a565b506001600160a01b03808616600090815260106020526040902054600954911690158015612deb57506001600160a01b03811615155b15612e76576000612dfe85600b54612f0e565b9050612e0a8184613553565b9250612e17868383612b2f565b6001600160a01b0382166000908152601160205260409081902090517f684eec4406defb53defd351500aae07199860053b688af9137c2a72b037455bf91612e689185908b908a9087904290613881565b60405180910390a150612efa565b60126000612e866001600761386e565b815260200190815260200160002054600003612efa576000612eb185600e83612abc6001600761386e565b9050612ebd8184613553565b92506000600e81612ed06001600761386e565b81526020810191909152604001600020546001600160a01b03169050612ef7878284612b2f565b50505b612f04828561386e565b9695505050505050565b6000612710612f1d838561393a565b612f279190613951565b9392505050565b505050565b60005b83811015612f4e578181015183820152602001612f36565b50506000910152565b60008151808452612f6f816020860160208601612f33565b601f01601f19169290920160200192915050565b602081526000612f276020830184612f57565b80356001600160a01b03811681146108fb57600080fd5b60008060408385031215612fc057600080fd5b612fc983612f96565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561301057613010612fd7565b60405290565b6040805190810167ffffffffffffffff8111828210171561301057613010612fd7565b604051601f8201601f1916810167ffffffffffffffff8111828210171561306257613062612fd7565b604052919050565b600067ffffffffffffffff82111561308457613084612fd7565b5060051b60200190565b600060208083850312156130a157600080fd5b823567ffffffffffffffff8111156130b857600080fd5b8301601f810185136130c957600080fd5b80356130dc6130d78261306a565b613039565b81815260059190911b820183019083810190878311156130fb57600080fd5b928401925b828410156131205761311184612f96565b82529284019290840190613100565b979650505050505050565b60008060006060848603121561314057600080fd5b61314984612f96565b925061315760208501612f96565b9150604084013590509250925092565b60006020828403121561317957600080fd5b612f2782612f96565b60006020828403121561319457600080fd5b5035919050565b6040815260006131ae6040830185612f57565b905060018060a01b03831660208301529392505050565b600082601f8301126131d657600080fd5b813567ffffffffffffffff8111156131f0576131f0612fd7565b613203601f8201601f1916602001613039565b81815284602083860101111561321857600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561324757600080fd5b67ffffffffffffffff808335111561325e57600080fd5b8235830184601f82011261327157600080fd5b61327e6130d7823561306a565b81358082526020808301929160051b8401018781111561329d57600080fd5b602084015b818110156133db5785813511156132b857600080fd5b803585016080818b03601f190112156132d057600080fd5b6132d8612fed565b6132e460208301612f96565b815287604083013511156132f757600080fd5b61330a8b602060408501358501016131c5565b602082015260608201356040820152876080830135111561332a57600080fd5b6080820135820191508a603f83011261334257600080fd5b60208201356133536130d78261306a565b81815260069190911b83016040019060208101908d83111561337457600080fd5b6040850194505b828510156133c5576040858f03121561339357600080fd5b61339b613016565b6133a486612f96565b8152602086013560208201528083525060208201915060408501945061337b565b60608401525050855250602093840193016132a2565b5090979650505050505050565b6000602082840312156133fa57600080fd5b813567ffffffffffffffff81111561341157600080fd5b61341d848285016131c5565b949350505050565b6000806040838503121561343857600080fd5b50508035926020909101359150565b6000806040838503121561345a57600080fd5b61346383612f96565b915061347160208401612f96565b90509250929050565b6000806040838503121561348d57600080fd5b8235915061347160208401612f96565b600181811c908216806134b157607f821691505b6020821081036134d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613515576135156134ed565b5060010190565b60208082526018908201527f596f7520617265206e6f7420746178206d616e616765722e0000000000000000604082015260600190565b808201808211156107ac576107ac6134ed565b6020808252602c908201527f4e69636b6e616d65206d757374206265206265747765656e203120616e64203660408201526b34206368617261637465727360a01b606082015260800190565b600082516135c4818460208701612f33565b9190910192915050565b601f821115612f2e57600081815260208120601f850160051c810160208610156135f55750805b601f850160051c820191505b8181101561361457828155600101613601565b505050505050565b815167ffffffffffffffff81111561363657613636612fd7565b61364a81613644845461349d565b846135ce565b602080601f83116001811461367f57600084156136675750858301515b600019600386901b1c1916600185901b178555613614565b600085815260208120601f198616915b828110156136ae5788860151825594840194600190910190840161368f565b50858210156136cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038416815260606020820181905260009061370090830185612f57565b9050826040830152949350505050565b600080835461371e8161349d565b60018281168015613736576001811461374b5761377a565b60ff198416875282151583028701945061377a565b8760005260208060002060005b858110156137715781548a820152908401908201613758565b50505082870194505b50929695505050505050565b600060018060a01b038087168352608060208401526137a86080840187612f57565b94166040830152506060015292915050565b602080825260119082015270141bdbdb081a59081b9bdd08199bdd5b99607a1b604082015260600190565b6020808252601f908201527f54686520706f6f6c20697320616c726561647920746f67676c6564206f666600604082015260600190565b60208082526032908201527f4e6577206665652072617465206d757374206265206265747765656e203020616040820152716e642063757272656e74207461782066656560701b606082015260800190565b818103818111156107ac576107ac6134ed565b60c0815260008088546138938161349d565b8060c086015260e06001808416600081146138b557600181146138cf57613900565b60ff1985168884015283151560051b880183019550613900565b8d60005260208060002060005b868110156138f75781548b82018701529084019082016138dc565b8a018501975050505b505050506001600160a01b039889166020850152509590961660408201526060810193909352608083019190915260a09091015292915050565b80820281158282048414176107ac576107ac6134ed565b60008261396e57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212201880500fc0fec932240e084c91dafb755e30f44ca4fd3f0e6d78a4fcdc65670064736f6c63430008130033000000000000000000000000cf852bf2abad76e9ac8c0fe115246462ba883638000000000000000000000000cf852bf2abad76e9ac8c0fe115246462ba8836380000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000070000000000000000000000007d0492b9e74706a054b57294048ecaee7f9fffab0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000a4cb3bdef8213b9fbcaba5aca31c2de991512e530000000000000000000000000000000000000000000000000000000000000064000000000000000000000000e2ee8c63f0ee14e1f914bc7c4127aeffb62891ef00000000000000000000000000000000000000000000000000000000000000640000000000000000000000005a8cc2989c952eef71ce78ba481902d0e06540ae0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000a5e5732e9c51a85bbaeca1f022d70029f14c0d9400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000009f16826911e63a7be765c8e20ebaa9c7a8ec4e4900000000000000000000000000000000000000000000000000000000000000640000000000000000000000007d0492b9e74706a054b57294048ecaee7f9fffab0000000000000000000000000000000000000000000000000000000000000064

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102f15760003560e01c80638d0846381161019d578063ac169800116100e9578063bcae1d57116100a2578063e0a22e671161007c578063e0a22e67146106c4578063e0af4fe2146106d7578063ed534174146106e0578063f2fde38b146106f357600080fd5b8063bcae1d571461066b578063dd62ed3e1461069e578063dedbf736146106b157600080fd5b8063ac1698001461060f578063ad5c464814610618578063adaccd7414610633578063b37bf54614610646578063b4975d4a1461064f578063b8e3e0f21461065857600080fd5b8063a03fb0c911610156578063a343895511610130578063a3438955146105d6578063a457c2d7146105e9578063a7782d06146104f7578063a9059cbb146105fc57600080fd5b8063a03fb0c9146105b2578063a2aa18ad146105ba578063a32bff44146105cd57600080fd5b80638d084638146105395780638da5cb5b1461054c5780639026b8d91461055d57806394f46b751461058457806395d89b41146105975780639be675741461059f57600080fd5b80633bfb4aad1161025c5780635e043f95116102155780636e11a899116101ef5780636e11a899146104f757806370a0823114610500578063715018a6146105295780638a8c523c1461053157600080fd5b80635e043f95146104c857806360901444146104db57806361e8bc20146104e457600080fd5b80633bfb4aad1461040957806343330c941461041c57806344ecc1791461046e5780634672bd0e146104815780634a9fefc7146104945780634d237730146104b557600080fd5b8063313ce567116102ae578063313ce567146103a257806332a5fce5146103b157806332b6eca2146103c457806332f28053146103cc5780633516e6fe146103ec57806339509351146103f657600080fd5b806306fdde03146102f6578063095ea7b31461031457806318160ddd146103375780632175c6491461034957806323b872dd1461035c5780632dd310001461036f575b600080fd5b6102fe610706565b60405161030b9190612f83565b60405180910390f35b610327610322366004612fad565b610798565b604051901515815260200161030b565b6002545b60405190815260200161030b565b61032761035736600461308e565b6107b2565b61032761036a36600461312b565b610900565b61038a735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6040516001600160a01b03909116815260200161030b565b6040516012815260200161030b565b6103276103bf366004613167565b6109d5565b610327610a02565b61033b6103da366004613167565b60166020526000908152604090205481565b6103f4610ae5565b005b610327610404366004612fad565b610b69565b61032761041736600461308e565b610b8b565b61044f61042a366004613182565b600e60205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b03909316835260208301919091520161030b565b61032761047c36600461308e565b610ce2565b61032761048f366004613182565b610dfe565b6104a76104a2366004613167565b610ee9565b60405161030b92919061319b565b600d5461038a906001600160a01b031681565b6103276104d6366004613235565b610fb2565b61033b600c5481565b61038a6104f23660046133e8565b611859565b61033b61032081565b61033b61050e366004613167565b6001600160a01b031660009081526020819052604090205490565b6103f461188a565b61032761189e565b6103276105473660046133e8565b611936565b6005546001600160a01b031661038a565b61038a7f000000000000000000000000173a958b4381f72381c3a1099bf715d0acd8230981565b6103276105923660046133e8565b611b4b565b6102fe611ce4565b6103276105ad366004613425565b611cf3565b610327611e2f565b6103f46105c8366004613167565b611e44565b61033b600b5481565b6103276105e4366004613182565b611f25565b6103276105f7366004612fad565b612034565b61032761060a366004612fad565b6120af565b61033b600a5481565b61038a73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6102fe610641366004613167565b612166565b61033b60075481565b61033b60065481565b61032761066636600461308e565b612212565b61044f610679366004613182565b600f60205260009081526040902080546001909101546001600160a01b039091169082565b61033b6106ac366004613447565b61231f565b6103f46106bf36600461347a565b61234a565b6103276106d2366004613425565b612495565b61033b60085481565b6103276106ee366004613182565b6125c0565b6103f4610701366004613167565b6126bf565b6060600380546107159061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546107419061349d565b801561078e5780601f106107635761010080835404028352916020019161078e565b820191906000526020600020905b81548152906001019060200180831161077157829003601f168201915b5050505050905090565b6000336107a6818585612738565b60019150505b92915050565b60006107bc61285c565b6032825111156108135760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d203530206163636f756e742063616e2062652061646465640060448201526064015b60405180910390fd5b60005b82518110156108f55760156000848381518110610835576108356134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000148015610899575060006001600160a01b0316838281518110610885576108856134d7565b60200260200101516001600160a01b031614155b156108e3576001601560008584815181106108b6576108b66134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b806108ed81613503565b915050610816565b50600190505b919050565b60003361090e8582856128b6565b7f000000000000000000000000173a958b4381f72381c3a1099bf715d0acd823096001600160a01b0316846001600160a01b031614801561096557506001600160a01b038516600090815260166020526040902054155b156109bf57600c546001146109b25760405162461bcd60e51b81526020600482015260136024820152722a3930b234b7339034b9903737ba1037b832b760691b604482015260640161080a565b6109bc8584612930565b92505b6109ca858585612b2f565b506001949350505050565b6000600a54600014806107ac5750506001600160a01b031660009081526015602052604090205460011490565b600d546000906001600160a01b03163314610a2f5760405162461bcd60e51b815260040161080a9061351c565b60095415610a8d5760405162461bcd60e51b815260206004820152602560248201527f5265666572656e636520706f6f6c20697320616c726561647920746f67676c65604482015264321037b33360d91b606482015260840161080a565b6001600955600b805460009182905560405190917f27f369f734f9f38ca1388d9fd8488d89e84f8bea0457621af7b35b6df99976ed91610ad591848252602082015260400190565b60405180910390a1600191505090565b600d546001600160a01b03163314610b0f5760405162461bcd60e51b815260040161080a9061351c565b600d80546001600160a01b03198116909155604080516001600160a01b0390921680835260006020840152917f4adb4bd40da8456432ec4d0c365d395fb1d51464c6bf1edf44c49eca7708a449910160405180910390a150565b6000336107a6818585610b7c838361231f565b610b869190613553565b612738565b600d546000906001600160a01b03163314610bb85760405162461bcd60e51b815260040161080a9061351c565b603282511115610c0a5760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20353020616464726573732063616e20626520616464656400604482015260640161080a565b60005b82518110156108f55760166000848381518110610c2c57610c2c6134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000148015610c90575060006001600160a01b0316838281518110610c7c57610c7c6134d7565b60200260200101516001600160a01b031614155b15610cda57600160166000858481518110610cad57610cad6134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b600101610c0d565b600d546000906001600160a01b03163314610d0f5760405162461bcd60e51b815260040161080a9061351c565b603282511115610d615760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20353020616464726573732063616e20626520616464656400604482015260640161080a565b60005b82518110156108f55760166000848381518110610d8357610d836134d7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054600103610df65760166000848381518110610dc957610dc96134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600090555b600101610d64565b600d546000906001600160a01b03163314610e2b5760405162461bcd60e51b815260040161080a9061351c565b600082118015610e3c5750600b5482105b610e9f5760405162461bcd60e51b815260206004820152602e60248201527f4e6577206665652072617465206d757374206265206265747765656e2030206160448201526d6e642063757272656e742066656560901b606482015260840161080a565b600b80549083905560408051828152602081018590527f27f369f734f9f38ca1388d9fd8488d89e84f8bea0457621af7b35b6df99976ed910160405180910390a150600192915050565b6001600160a01b0380821660009081526010602090815260408083205490931680835260119091529181208054606093919082908290610f289061349d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f549061349d565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b505050505091509250925050915091565b6000610fbc61285c565b603e60065411156110085760405162461bcd60e51b8152602060048201526016602482015275496e697469616c697a6174696f6e20697320646f6e6560501b604482015260640161080a565b60008251116110725760405162461bcd60e51b815260206004820152603060248201527f526566657272616c73206172726179206c656e677468206d757374206265206760448201526f726561746572207468616e207a65726f60801b606482015260840161080a565b8151600660008282546110859190613553565b90915550600090505b82518110156108f5576001601560008584815181106110af576110af6134d7565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550601160008483815181106110f5576110f56134d7565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020805461112c9061349d565b15905061117b5760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c726561647920686176652061206e69636b6e616d650000000000604482015260640161080a565b82818151811061118d5761118d6134d7565b602002602001015160200151516000141580156111c9575060408382815181106111b9576111b96134d7565b6020026020010151602001515111155b6111e55760405162461bcd60e51b815260040161080a90613566565b60006001600160a01b03166014848381518110611204576112046134d7565b60200260200101516020015160405161121d91906135b2565b908152604051908190036020019020546001600160a01b03161461127f5760405162461bcd60e51b81526020600482015260196024820152782734b1b5b730b6b29034b99030b63932b0b23c903a30b5b2b760391b604482015260640161080a565b828181518110611291576112916134d7565b60200260200101516000015160148483815181106112b1576112b16134d7565b6020026020010151602001516040516112ca91906135b2565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082818151811061130e5761130e6134d7565b60200260200101516020015160116000858481518110611330576113306134d7565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000209081611368919061361c565b507f0ed9a97ab9c2d9154a598932f980864c384da57bbf1b41cef09c6768dff088ad83828151811061139c5761139c6134d7565b6020026020010151600001518483815181106113ba576113ba6134d7565b6020026020010151602001518584815181106113d8576113d86134d7565b6020026020010151604001516040516113f3939291906136dc565b60405180910390a1600083828151811061140f5761140f6134d7565b6020026020010151606001515111156118515760006011600085848151811061143a5761143a6134d7565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000206040516020016114769190613710565b60405160208183030381529060405280519060200120905060005b8483815181106114a3576114a36134d7565b6020026020010151606001515181101561184e578483815181106114c9576114c96134d7565b60200260200101516060015181815181106114e6576114e66134d7565b6020026020010151600001516001600160a01b031660106000878681518110611511576115116134d7565b602090810291909101810151516001600160a01b039081168352908201929092526040016000205416148015906115ac575060006001600160a01b031660106000878681518110611564576115646134d7565b6020026020010151606001518481518110611581576115816134d7565b602090810291909101810151516001600160a01b039081168352908201929092526040016000205416145b80156115ca5750604080516000815260208101918290525190208214155b8015611606575060006001600160a01b03168584815181106115ee576115ee6134d7565b6020026020010151600001516001600160a01b031614155b801561167b575084838151811061161f5761161f6134d7565b602002602001015160600151818151811061163c5761163c6134d7565b6020026020010151600001516001600160a01b0316858481518110611663576116636134d7565b6020026020010151600001516001600160a01b031614155b6116ba5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c9959995c9c985b60821b604482015260640161080a565b8483815181106116cc576116cc6134d7565b602002602001015160000151601060008786815181106116ee576116ee6134d7565b602002602001015160600151848151811061170b5761170b6134d7565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507fd4024e5e44041dd6dba8b883ae669a8fb58b9402a39d82671cd3696fef8c8c4985848151811061178e5761178e6134d7565b6020026020010151600001518685815181106117ac576117ac6134d7565b6020026020010151602001518786815181106117ca576117ca6134d7565b60200260200101516060015184815181106117e7576117e76134d7565b602002602001015160000151888781518110611805576118056134d7565b6020026020010151606001518581518110611822576118226134d7565b60200260200101516020015160405161183e9493929190613786565b60405180910390a1600101611491565b50505b60010161108e565b600060148260405161186b91906135b2565b908152604051908190036020019020546001600160a01b031692915050565b61189261285c565b61189c6000612cd3565b565b60006118a861285c565b600c54156118f85760405162461bcd60e51b815260206004820152601860248201527f547261646520697320616c726561647920656e61626c65640000000000000000604482015260640161080a565b6001600c556040514281527fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9239060200160405180910390a150600190565b6000600a54600014806119585750336000908152601560205260409020546001145b61199c5760405162461bcd60e51b8152602060048201526015602482015274165bdd48185c99481b9bdd081c1c9959995c9c9959605a1b604482015260640161080a565b33600090815260116020526040902080546119b69061349d565b159050611a055760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c726561647920686176652061206e69636b6e616d650000000000604482015260640161080a565b815115801590611a1757506040825111155b611a335760405162461bcd60e51b815260040161080a90613566565b60006001600160a01b0316601483604051611a4e91906135b2565b908152604051908190036020019020546001600160a01b031614611ab05760405162461bcd60e51b81526020600482015260196024820152782734b1b5b730b6b29034b99030b63932b0b23c903a30b5b2b760391b604482015260640161080a565b33601483604051611ac191906135b2565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039490941693909317909255336000908152601190915220611b07838261361c565b507f0ed9a97ab9c2d9154a598932f980864c384da57bbf1b41cef09c6768dff088ad338342604051611b3b939291906136dc565b60405180910390a1506001919050565b600080601483604051611b5e91906135b2565b9081526040805160209281900383018120546001600160a01b03166000818152601185529283209094509192611b95929101613710565b60408051601f1981840301815291815281516020928301206001600160a01b03858116600090815260109094529190922054919250163314801590611bf05750336000908152601060205260409020546001600160a01b0316155b8015611c0e5750604080516000815260208101918290525190208114155b8015611c2257506001600160a01b03821615155b8015611c3757506001600160a01b0382163314155b611c765760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c9959995c9c985b60821b604482015260640161080a565b336000818152601060205260409081902080546001600160a01b0319166001600160a01b038616179055517fd4024e5e44041dd6dba8b883ae669a8fb58b9402a39d82671cd3696fef8c8c4991611cd291859188914290613786565b60405180910390a15060019392505050565b6060600480546107159061349d565b600d546000906001600160a01b03163314611d205760405162461bcd60e51b815260040161080a9061351c565b6007831115611d415760405162461bcd60e51b815260040161080a906137ba565b60008381526012602052604090205415611d6d5760405162461bcd60e51b815260040161080a906137e5565b600082118015611d8d57506000838152600e602052604090206001015482105b611da95760405162461bcd60e51b815260040161080a9061381c565b6000838152600e6020526040902060010154611dc690839061386e565b600754611dd3919061386e565b6007556000838152600e6020526040908190206001018390555183907f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c90611e1e9085815260200190565b60405180910390a250600192915050565b6000611e3961285c565b506000600a55600190565b600d546001600160a01b03163314611e6e5760405162461bcd60e51b815260040161080a9061351c565b6001600160a01b038116611ec45760405162461bcd60e51b815260206004820152601f60248201527f4e657720616464726573732063616e6e6f742062652030206164647265737300604482015260640161080a565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f4adb4bd40da8456432ec4d0c365d395fb1d51464c6bf1edf44c49eca7708a449910160405180910390a15050565b600d546000906001600160a01b03163314611f525760405162461bcd60e51b815260040161080a9061351c565b6007821115611f735760405162461bcd60e51b815260040161080a906137ba565b60008281526012602052604090205415611f9f5760405162461bcd60e51b815260040161080a906137e5565b6000828152601260209081526040808320600190819055600e9092529091200154600754611fcd919061386e565b6007556000828152600e602052604080822080546001600160a01b03191681556001018290555183917f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c9161202491815260200190565b60405180910390a2506001919050565b60003381612042828661231f565b9050838110156120a25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161080a565b6109ca8286868403612738565b6000336001600160a01b037f000000000000000000000000173a958b4381f72381c3a1099bf715d0acd82309168114801561210057506001600160a01b038416600090815260166020526040902054155b1561215b57600c5460011461214d5760405162461bcd60e51b81526020600482015260136024820152722a3930b234b7339034b9903737ba1037b832b760691b604482015260640161080a565b612158848285612d25565b92505b6107a6818585612b2f565b6001600160a01b038116600090815260116020526040902080546060919061218d9061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546121b99061349d565b80156122065780601f106121db57610100808354040283529160200191612206565b820191906000526020600020905b8154815290600101906020018083116121e957829003601f168201915b50505050509050919050565b600061221c61285c565b6032825111156122785760405162461bcd60e51b815260206004820152602160248201527f4d6178696d756d203530206163636f756e742063616e2062652072656d6f76656044820152601960fa1b606482015260840161080a565b60005b82518110156108f5576015600084838151811061229a5761229a6134d7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205460010361230d57601560008483815181106122e0576122e06134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600090555b8061231781613503565b91505061227b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600d546001600160a01b031633146123745760405162461bcd60e51b815260040161080a9061351c565b6001600160a01b0381166123d85760405162461bcd60e51b815260206004820152602560248201527f4e657720616464726573732063616e6e6f7420657175616c20746f2030206164604482015264647265737360d81b606482015260840161080a565b600782106124205760405162461bcd60e51b81526020600482015260156024820152742837b7b61034b21034b9903737ba103337bab7321760591b604482015260640161080a565b6000828152600e6020908152604080832080546001600160a01b0386166001600160a01b03199182168117909255600f845293829020805490941681179093555191825283917fb672b14b994dc0b451a4b01d24d56f5230137c6960ef3e02bfd22255ced63e01910160405180910390a25050565b600d546000906001600160a01b031633146124c25760405162461bcd60e51b815260040161080a9061351c565b60078311156124e35760405162461bcd60e51b815260040161080a906137ba565b6000838152601360205260409020541561250f5760405162461bcd60e51b815260040161080a906137e5565b60008211801561252f57506000838152600f602052604090206001015482105b61254b5760405162461bcd60e51b815260040161080a9061381c565b6000838152600f602052604090206001015461256890839061386e565b600854612575919061386e565b6008556000838152600f6020526040908190206001018390555183907f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b90611e1e9085815260200190565b600d546000906001600160a01b031633146125ed5760405162461bcd60e51b815260040161080a9061351c565b600782111561260e5760405162461bcd60e51b815260040161080a906137ba565b6000828152601360205260409020541561263a5760405162461bcd60e51b815260040161080a906137e5565b6000828152601360209081526040808320600190819055600f9092529091200154600854612668919061386e565b6008556000828152600f602052604080822080546001600160a01b03191681556001018290555183917f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b9161202491815260200190565b6126c761285c565b6001600160a01b03811661272c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080a565b61273581612cd3565b50565b6001600160a01b03831661279a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161080a565b6001600160a01b0382166127fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161080a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b0316331461189c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080a565b60006128c2848461231f565b9050600019811461292a578181101561291d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161080a565b61292a8484848403612738565b50505050565b600080805b6129416001600761386e565b8110156129c0576000818152600f602090815260408083206001015460139092528220549091036129ad5760006129788683612f0e565b90506129848185613553565b6000848152600f60205260409020549094506001600160a01b03166129aa888284612b2f565b50505b50806129b881613503565b915050612935565b506001600160a01b038085166000908152601060205260409020546009549116901580156129f657506001600160a01b03811615155b15612a81576000612a0985600b54612f0e565b9050612a158184613553565b9250612a22868383612b2f565b6001600160a01b0382166000908152601160205260409081902090517f684eec4406defb53defd351500aae07199860053b688af9137c2a72b037455bf91612a739185908a908a9087904290613881565b60405180910390a150612b1c565b60136000612a916001600761386e565b815260200190815260200160002054600003612b1c576000612ad385600f83612abc6001600761386e565b815260200190815260200160002060010154612f0e565b9050612adf8184613553565b92506000600f81612af26001600761386e565b81526020810191909152604001600020546001600160a01b03169050612b19878284612b2f565b50505b612b26828561386e565b95945050505050565b6001600160a01b038316612b935760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161080a565b6001600160a01b038216612bf55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161080a565b6001600160a01b03831660009081526020819052604090205481811015612c6d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161080a565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361292a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080805b612d366001600761386e565b811015612db5576000818152600e60209081526040808320600101546012909252822054909103612da2576000612d6d8683612f0e565b9050612d798185613553565b6000848152600e60205260409020549094506001600160a01b0316612d9f888284612b2f565b50505b5080612dad81613503565b915050612d2a565b506001600160a01b03808616600090815260106020526040902054600954911690158015612deb57506001600160a01b03811615155b15612e76576000612dfe85600b54612f0e565b9050612e0a8184613553565b9250612e17868383612b2f565b6001600160a01b0382166000908152601160205260409081902090517f684eec4406defb53defd351500aae07199860053b688af9137c2a72b037455bf91612e689185908b908a9087904290613881565b60405180910390a150612efa565b60126000612e866001600761386e565b815260200190815260200160002054600003612efa576000612eb185600e83612abc6001600761386e565b9050612ebd8184613553565b92506000600e81612ed06001600761386e565b81526020810191909152604001600020546001600160a01b03169050612ef7878284612b2f565b50505b612f04828561386e565b9695505050505050565b6000612710612f1d838561393a565b612f279190613951565b9392505050565b505050565b60005b83811015612f4e578181015183820152602001612f36565b50506000910152565b60008151808452612f6f816020860160208601612f33565b601f01601f19169290920160200192915050565b602081526000612f276020830184612f57565b80356001600160a01b03811681146108fb57600080fd5b60008060408385031215612fc057600080fd5b612fc983612f96565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561301057613010612fd7565b60405290565b6040805190810167ffffffffffffffff8111828210171561301057613010612fd7565b604051601f8201601f1916810167ffffffffffffffff8111828210171561306257613062612fd7565b604052919050565b600067ffffffffffffffff82111561308457613084612fd7565b5060051b60200190565b600060208083850312156130a157600080fd5b823567ffffffffffffffff8111156130b857600080fd5b8301601f810185136130c957600080fd5b80356130dc6130d78261306a565b613039565b81815260059190911b820183019083810190878311156130fb57600080fd5b928401925b828410156131205761311184612f96565b82529284019290840190613100565b979650505050505050565b60008060006060848603121561314057600080fd5b61314984612f96565b925061315760208501612f96565b9150604084013590509250925092565b60006020828403121561317957600080fd5b612f2782612f96565b60006020828403121561319457600080fd5b5035919050565b6040815260006131ae6040830185612f57565b905060018060a01b03831660208301529392505050565b600082601f8301126131d657600080fd5b813567ffffffffffffffff8111156131f0576131f0612fd7565b613203601f8201601f1916602001613039565b81815284602083860101111561321857600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561324757600080fd5b67ffffffffffffffff808335111561325e57600080fd5b8235830184601f82011261327157600080fd5b61327e6130d7823561306a565b81358082526020808301929160051b8401018781111561329d57600080fd5b602084015b818110156133db5785813511156132b857600080fd5b803585016080818b03601f190112156132d057600080fd5b6132d8612fed565b6132e460208301612f96565b815287604083013511156132f757600080fd5b61330a8b602060408501358501016131c5565b602082015260608201356040820152876080830135111561332a57600080fd5b6080820135820191508a603f83011261334257600080fd5b60208201356133536130d78261306a565b81815260069190911b83016040019060208101908d83111561337457600080fd5b6040850194505b828510156133c5576040858f03121561339357600080fd5b61339b613016565b6133a486612f96565b8152602086013560208201528083525060208201915060408501945061337b565b60608401525050855250602093840193016132a2565b5090979650505050505050565b6000602082840312156133fa57600080fd5b813567ffffffffffffffff81111561341157600080fd5b61341d848285016131c5565b949350505050565b6000806040838503121561343857600080fd5b50508035926020909101359150565b6000806040838503121561345a57600080fd5b61346383612f96565b915061347160208401612f96565b90509250929050565b6000806040838503121561348d57600080fd5b8235915061347160208401612f96565b600181811c908216806134b157607f821691505b6020821081036134d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613515576135156134ed565b5060010190565b60208082526018908201527f596f7520617265206e6f7420746178206d616e616765722e0000000000000000604082015260600190565b808201808211156107ac576107ac6134ed565b6020808252602c908201527f4e69636b6e616d65206d757374206265206265747765656e203120616e64203660408201526b34206368617261637465727360a01b606082015260800190565b600082516135c4818460208701612f33565b9190910192915050565b601f821115612f2e57600081815260208120601f850160051c810160208610156135f55750805b601f850160051c820191505b8181101561361457828155600101613601565b505050505050565b815167ffffffffffffffff81111561363657613636612fd7565b61364a81613644845461349d565b846135ce565b602080601f83116001811461367f57600084156136675750858301515b600019600386901b1c1916600185901b178555613614565b600085815260208120601f198616915b828110156136ae5788860151825594840194600190910190840161368f565b50858210156136cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038416815260606020820181905260009061370090830185612f57565b9050826040830152949350505050565b600080835461371e8161349d565b60018281168015613736576001811461374b5761377a565b60ff198416875282151583028701945061377a565b8760005260208060002060005b858110156137715781548a820152908401908201613758565b50505082870194505b50929695505050505050565b600060018060a01b038087168352608060208401526137a86080840187612f57565b94166040830152506060015292915050565b602080825260119082015270141bdbdb081a59081b9bdd08199bdd5b99607a1b604082015260600190565b6020808252601f908201527f54686520706f6f6c20697320616c726561647920746f67676c6564206f666600604082015260600190565b60208082526032908201527f4e6577206665652072617465206d757374206265206265747765656e203020616040820152716e642063757272656e74207461782066656560701b606082015260800190565b818103818111156107ac576107ac6134ed565b60c0815260008088546138938161349d565b8060c086015260e06001808416600081146138b557600181146138cf57613900565b60ff1985168884015283151560051b880183019550613900565b8d60005260208060002060005b868110156138f75781548b82018701529084019082016138dc565b8a018501975050505b505050506001600160a01b039889166020850152509590961660408201526060810193909352608083019190915260a09091015292915050565b80820281158282048414176107ac576107ac6134ed565b60008261396e57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212201880500fc0fec932240e084c91dafb755e30f44ca4fd3f0e6d78a4fcdc65670064736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000cf852bf2abad76e9ac8c0fe115246462ba883638000000000000000000000000cf852bf2abad76e9ac8c0fe115246462ba8836380000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000070000000000000000000000007d0492b9e74706a054b57294048ecaee7f9fffab0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000a4cb3bdef8213b9fbcaba5aca31c2de991512e530000000000000000000000000000000000000000000000000000000000000064000000000000000000000000e2ee8c63f0ee14e1f914bc7c4127aeffb62891ef00000000000000000000000000000000000000000000000000000000000000640000000000000000000000005a8cc2989c952eef71ce78ba481902d0e06540ae0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000a5e5732e9c51a85bbaeca1f022d70029f14c0d9400000000000000000000000000000000000000000000000000000000000000c80000000000000000000000009f16826911e63a7be765c8e20ebaa9c7a8ec4e4900000000000000000000000000000000000000000000000000000000000000640000000000000000000000007d0492b9e74706a054b57294048ecaee7f9fffab0000000000000000000000000000000000000000000000000000000000000064

-----Decoded View---------------
Arg [0] : _multisigOwner (address): 0xCF852bf2abaD76e9aC8c0Fe115246462Ba883638
Arg [1] : _taxManager (address): 0xCF852bf2abaD76e9aC8c0Fe115246462Ba883638
Arg [2] : _referenceRate (uint256): 100
Arg [3] : _poolsData (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf852bf2abad76e9ac8c0fe115246462ba883638
Arg [1] : 000000000000000000000000cf852bf2abad76e9ac8c0fe115246462ba883638
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 0000000000000000000000007d0492b9e74706a054b57294048ecaee7f9fffab
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [7] : 000000000000000000000000a4cb3bdef8213b9fbcaba5aca31c2de991512e53
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [9] : 000000000000000000000000e2ee8c63f0ee14e1f914bc7c4127aeffb62891ef
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [11] : 0000000000000000000000005a8cc2989c952eef71ce78ba481902d0e06540ae
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [13] : 000000000000000000000000a5e5732e9c51a85bbaeca1f022d70029f14c0d94
Arg [14] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [15] : 0000000000000000000000009f16826911e63a7be765c8e20ebaa9c7a8ec4e49
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [17] : 0000000000000000000000007d0492b9e74706a054b57294048ecaee7f9fffab
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000064


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

OGz MemeFi is a unique blockchain project that combines the power of DeFi with creativity and culture of memes. It aims to change the DeFi landscape by making it more accessible, inclusive, and fun. Unique referral system, dynamic staking, future plans vault, and much more.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.