ETH Price: $3,448.51 (+1.47%)

Token

Tux (TUX)
 

Overview

Max Total Supply

150,465.49 TUX

Holders

411

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
blockbird.eth
Balance
10 TUX

Value
$0.00
0x6B67623ff56c10d9dcFc2152425f90285fC74DDD
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TuxERC20

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 100 runs

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

pragma solidity 0.8.9;

import "./ITuxERC20.sol";
import "./library/RankedSet.sol";
import "./library/AddressSet.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";

/**
 * @dev {ERC20} token, including:
 *
 *  - Preminted initial supply
 *  - Ability for holders to burn (destroy) their tokens
 *  - No access control mechanism (for minting/pausing) and hence no governance
 *
 * This contract uses {ERC20Burnable} to include burn capabilities - head to
 * its documentation for details.
 *
 * _Available since v3.4._
 */
contract TuxERC20 is
    ITuxERC20,
    ERC20Burnable
{
    using RankedSet for RankedSet.Set;
    using AddressSet for AddressSet.Set;

    // Admin address for managing payout addresses
    address public owner;

    // Tux auctions address
    address public minter;

    // Currently featured auction
    uint256 public featured;

    // Timestamp of next featured auction
    uint256 public nextFeaturedTime;

    // Amount of time for featured auctions
    uint256 constant public featuredDuration = 3600; // 1 hour -> 3600 seconds

    // Amount of time between payouts
    uint256 constant public payoutsFrequency = 604800; // 7 days -> 604800 seconds

    // Timestamp of next payouts
    uint256 public nextPayoutsTime = block.timestamp + payoutsFrequency;

    // Payout amount to pinning and API services
    uint256 public payoutAmount = 100 * 10**18;

    // AddressSet of payout addresses to pinning and API services
    AddressSet.Set private _payoutAddresses;

    // RankedSet for queue of next featured auction
    RankedSet.Set private _featuredQueue;

    /**
     * @dev Mints 100,000 tokens and adds payout addresses.
     *
     * See {ERC20-constructor}.
     */
    constructor(
        string memory name,
        string memory symbol
    ) ERC20(name, symbol) {
        owner = msg.sender;

        _mint(owner, 100000 * 10**18);

        _payoutAddresses.add(0x71C7656EC7ab88b098defB751B7401B5f6d8976F); // Etherscan
        // _payoutAddresses.add(0xInfura); // Infura
        // _payoutAddresses.add(0xPinata); // Pinata
        // _payoutAddresses.add(0xAlchemy); // Alchemy
        // _payoutAddresses.add(0xNFT.Storage); // nft.storage
    }

    /**
     * @dev Sets the minting address.
     */
    function setMinter(address minter_)
        external
    {
        require(
            msg.sender == owner,
            "Not owner address");

        minter = minter_;
    }

    /**
     * @dev Add a payout address, up to 10.
     */
    function addPayoutAddress(address payoutAddress)
        external
    {
        require(
            msg.sender == owner,
            "Not owner address");
        require(
            _payoutAddresses.length() < 10,
            "Maximum reached");

        _payoutAddresses.add(payoutAddress);
    }

    /**
     * @dev Remove a payout address.
     */
    function removePayoutAddress(address payoutAddress)
        external
    {
        require(
            msg.sender == owner,
            "Not owner address");

        _payoutAddresses.remove(payoutAddress);
    }

    /**
     * @dev Update payout amount up to 1000.
     */
    function updatePayoutAmount(uint256 amount)
        external
    {
        require(
            msg.sender == owner,
            "Not owner address");
        require(
            amount < 1000 * 10**18,
            "Amount too high");

        payoutAmount = amount;
    }

    /**
     * @dev Renounce ownership once payout addresses are added and the payout
     * amount gets settled.
     */
    function renounceOwnership()
        external
    {
        require(
            msg.sender == owner,
            "Not owner address");

        owner = address(0);
    }

    /**
     * @dev Creates `amount` new tokens for `to`.
     *
     * See {ERC20-_mint}.
     *
     * Requirements:
     *
     * - the caller must be the Tux auctions contract.
     */
    function mint(address to, uint256 amount)
        external
        virtual
        override
    {
        require(
            msg.sender == minter,
            "Not minter address");

        _mint(to, amount);
    }

    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount)
        public
        override(ERC20Burnable)
    {
        _burn(msg.sender, amount);
    }

    /**
     * Add Tux auction to featured queue
     */
    function feature(uint256 auctionId, uint256 amount, address from)
        external
        virtual
        override
    {
        require(
            msg.sender == minter,
            "Not minter address");
        require(
            balanceOf(from) >= amount,
            "Not enough TUX");
        require(
            _featuredQueue.contains(auctionId) == false,
            "Already queued");
        require(
            amount >= 1 * 10**18,
            "Price too low");

        updateFeatured();

        _burn(from, amount);

        _featuredQueue.add(auctionId);
        _featuredQueue.rankScore(auctionId, amount);

        payouts();
    }

    function cancel(uint256 auctionId, address from)
        external
        virtual
        override
    {
        require(
            msg.sender == minter,
            "Not minter address");
        require(
            _featuredQueue.contains(auctionId) == true,
            "Not queued");

        _mint(from, _featuredQueue.scoreOf(auctionId));

        _featuredQueue.remove(auctionId);

        updateFeatured();
        payouts();
    }

    /**
     * Get featured items
     */
    function getFeatured(uint256 from, uint256 n)
        view
        public
        returns(uint256[] memory)
    {
        return _featuredQueue.valuesFromN(from, n);
    }

    /**
     * Get featured queue length
     */
    function getFeaturedLength()
        view
        public
        returns(uint256 length)
    {
        return _featuredQueue.length();
    }

    /**
     * Get if featured queue contains an auction ID
     */
    function getFeaturedContains(uint auctionId)
        view
        public
        returns(bool)
    {
        return _featuredQueue.contains(auctionId);
    }

    /**
     * Get next featured timestamp
     */
    function getNextFeaturedTime()
        view
        public
        returns(uint256 timestamp)
    {
        return nextFeaturedTime;
    }

    /**
     * Get featured price of queue item
     */
    function getFeaturedPrice(uint256 auctionId)
        view
        public
        returns(uint256 price)
    {
        return _featuredQueue.scoreOf(auctionId);
    }

    /**
     * Update featured queue
     */
    function updateFeatured()
        public
        override
    {
        if (block.timestamp < nextFeaturedTime || _featuredQueue.length() == 0) {
            return;
        }

        nextFeaturedTime = block.timestamp + featuredDuration;
        uint256 auctionId = _featuredQueue.head();
        _featuredQueue.remove(auctionId);
        featured = auctionId;

        _mint(msg.sender, 1 * 10**18);
    }

    /**
     * Mint weekly payouts to pinning and API services
     */
    function payouts()
        public
        override
    {
        if (block.timestamp < nextPayoutsTime) {
            return;
        }

        nextPayoutsTime = block.timestamp + payoutsFrequency;

        for (uint i = 0; i < _payoutAddresses.length(); i++) {
            _mint(_payoutAddresses.at(i), payoutAmount);
        }

        _mint(msg.sender, 1 * 10**18);
    }
}

File 2 of 10 : ITuxERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

interface ITuxERC20 {
    function mint(address to, uint256 amount) external;

    function feature(
        uint256 auctionId,
        uint256 amount,
        address from
    ) external;

    function cancel(
        uint256 auctionId,
        address from
    ) external;

    function updateFeatured() external;
    function payouts() external;
}

File 3 of 10 : RankedSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./OrderedSet.sol";

/**
 * @title RankedSet
 * @dev Ranked data structure using two ordered sets, a mapping of scores to
 * boundary values and counter, a mapping of last ranked scores, and a highest
 * score.
 */
library RankedSet {
    using OrderedSet for OrderedSet.Set;

    struct RankGroup {
        uint256 count;
        uint256 start;
        uint256 end;
    }

    struct Set {
        uint256 highScore;
        mapping(uint256 => RankGroup) rankgroups;
        mapping(uint256 => uint256) scores;
        OrderedSet.Set rankedScores;
        OrderedSet.Set rankedItems;
    }

    /**
     * @dev Add an item at the end of the set
     */
    function add(Set storage set, uint256 item) internal {
        set.rankedItems.append(item);
        set.rankgroups[0].end = item;
        set.rankgroups[0].count += 1;
        if (set.rankgroups[0].start == 0) {
            set.rankgroups[0].start = item;
        }
    }

    /**
     * @dev Remove an item
     */
    function remove(Set storage set, uint256 item) internal {
        uint256 score = set.scores[item];
        delete set.scores[item];

        RankGroup storage rankgroup = set.rankgroups[score];
        if (rankgroup.count > 0) {
            rankgroup.count -= 1;
        }

        if (rankgroup.count == 0) {
            rankgroup.start = 0;
            rankgroup.end = 0;
            if (score == set.highScore) {
                set.highScore = set.rankedScores.next(score);
            }
            if (score > 0) {
                set.rankedScores.remove(score);
            }
        } else {
            if (rankgroup.start == item) {
                rankgroup.start = set.rankedItems.next(item);
            }
            if (rankgroup.end == item) {
                rankgroup.end = set.rankedItems.prev(item);
            }
        }

        set.rankedItems.remove(item);
    }

    /**
     * @dev Returns the head
     */
    function head(Set storage set) internal view returns (uint256) {
        return set.rankedItems._next[0];
    }

    /**
     * @dev Returns the tail
     */
    function tail(Set storage set) internal view returns (uint256) {
        return set.rankedItems._prev[0];
    }

    /**
     * @dev Returns the length
     */
    function length(Set storage set) internal view returns (uint256) {
        return set.rankedItems.count;
    }

    /**
     * @dev Returns the next value
     */
    function next(Set storage set, uint256 _value) internal view returns (uint256) {
        return set.rankedItems._next[_value];
    }

    /**
     * @dev Returns the previous value
     */
    function prev(Set storage set, uint256 _value) internal view returns (uint256) {
        return set.rankedItems._prev[_value];
    }

    /**
     * @dev Returns true if the value is in the set
     */
    function contains(Set storage set, uint256 value) internal view returns (bool) {
        return set.rankedItems._next[0] == value ||
               set.rankedItems._next[value] != 0 ||
               set.rankedItems._prev[value] != 0;
    }

    /**
     * @dev Returns a value's score
     */
    function scoreOf(Set storage set, uint256 value) internal view returns (uint256) {
        return set.scores[value];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Set storage set) internal view returns (uint256[] memory) {
        uint256[] memory _values = new uint256[](set.rankedItems.count);
        uint256 value = set.rankedItems._next[0];
        uint256 i = 0;
        while (value != 0) {
            _values[i] = value;
            value = set.rankedItems._next[value];
            i += 1;
        }
        return _values;
    }

    /**
     * @dev Return an array with n values in the set, starting after "from"
     */
    function valuesFromN(Set storage set, uint256 from, uint256 n) internal view returns (uint256[] memory) {
        uint256[] memory _values = new uint256[](n);
        uint256 value = set.rankedItems._next[from];
        uint256 i = 0;
        while (i < n) {
            _values[i] = value;
            value = set.rankedItems._next[value];
            i += 1;
        }
        return _values;
    }

    /**
     * @dev Rank new score
     */
    function rankScore(Set storage set, uint256 item, uint256 newScore) internal {
        RankGroup storage rankgroup = set.rankgroups[newScore];

        if (newScore > set.highScore) {
            remove(set, item);
            rankgroup.start = item;
            set.highScore = newScore;
            set.rankedItems.add(item);
            set.rankedScores.add(newScore);
        } else {
            uint256 score = set.scores[item];
            uint256 prevScore = set.rankedScores.prev(score);

            if (set.rankgroups[score].count == 1) {
                score = set.rankedScores.next(score);
            }

            remove(set, item);

            while (prevScore > 0 && newScore > prevScore) {
                prevScore = set.rankedScores.prev(prevScore);
            }

            set.rankedItems.insert(
                set.rankgroups[prevScore].end,
                item,
                set.rankgroups[set.rankedScores.next(prevScore)].start
            );

            if (rankgroup.count == 0) {
                set.rankedScores.insert(prevScore, newScore, score);
                rankgroup.start = item;
            }
        }

        rankgroup.end = item;
        rankgroup.count += 1;

        set.scores[item] = newScore;
    }
}

File 4 of 10 : AddressSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `address` (`addressSet`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library AddressSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // address values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in address.

    struct Set {
        // Storage of set values
        address[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(address => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Set storage set, address value) internal returns (bool) {
        if (!contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Set storage set, address value) internal returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                address lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Set storage set, address value) internal view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(Set storage set) internal view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Set storage set, uint256 index) internal view returns (address) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Set storage set) internal view returns (address[] memory) {
        return set._values;
    }
}

File 5 of 10 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC20.sol";
import "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

File 6 of 10 : OrderedSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title OrderedSet
 * @dev Ordered data structure. It has the properties of a mapping of uint256, but members are ordered
 * and can be enumerated. Values can be inserted and removed from anywhere. Add, append, remove and
 * contains are O(1). Enumerate is O(N).
 */
library OrderedSet {

    struct Set {
        uint256 count;
        mapping (uint256 => uint256) _next;
        mapping (uint256 => uint256) _prev;
    }

    /**
     * @dev Insert a value between two values
     */
    function insert(Set storage set, uint256 prev_, uint256 value, uint256 next_) internal {
        set._next[prev_] = value;
        set._next[value] = next_;
        set._prev[next_] = value;
        set._prev[value] = prev_;
        set.count += 1;
    }

    /**
     * @dev Insert a value as the new head
     */
    function add(Set storage set, uint256 value) internal {
        insert(set, 0, value, set._next[0]);
    }

    /**
     * @dev Insert a value as the new tail
     */
    function append(Set storage set, uint256 value) internal {
        insert(set, set._prev[0], value, 0);
    }

    /**
     * @dev Remove a value
     */
    function remove(Set storage set, uint256 value) internal {
        set._next[set._prev[value]] = set._next[value];
        set._prev[set._next[value]] = set._prev[value];
        delete set._next[value];
        delete set._prev[value];
        if (set.count > 0) {
            set.count -= 1;
        }
    }

    /**
     * @dev Returns the head
     */
    function head(Set storage set) internal view returns (uint256) {
        return set._next[0];
    }

    /**
     * @dev Returns the tail
     */
    function tail(Set storage set) internal view returns (uint256) {
        return set._prev[0];
    }

    /**
     * @dev Returns the length
     */
    function length(Set storage set) internal view returns (uint256) {
        return set.count;
    }

    /**
     * @dev Returns the next value
     */
    function next(Set storage set, uint256 _value) internal view returns (uint256) {
        return set._next[_value];
    }

    /**
     * @dev Returns the previous value
     */
    function prev(Set storage set, uint256 _value) internal view returns (uint256) {
        return set._prev[_value];
    }

    /**
     * @dev Returns true if the value is in the set
     */
    function contains(Set storage set, uint256 value) internal view returns (bool) {
        return set._next[0] == value ||
               set._next[value] != 0 ||
               set._prev[value] != 0;
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Set storage set) internal view returns (uint256[] memory) {
        uint256[] memory _values = new uint256[](set.count);
        uint256 value = set._next[0];
        uint256 i = 0;
        while (value != 0) {
            _values[i] = value;
            value = set._next[value];
            i += 1;
        }
        return _values;
    }

    /**
     * @dev Return an array with n values in the set, starting after "from"
     */
    function valuesFromN(Set storage set, uint256 from, uint256 n) internal view returns (uint256[] memory) {
        uint256[] memory _values = new uint256[](n);
        uint256 value = set._next[from];
        uint256 i = 0;
        while (i < n) {
            _values[i] = value;
            value = set._next[value];
            i += 1;
        }
        return _values;
    }
}

File 7 of 10 : ERC20.sol
// SPDX-License-Identifier: MIT

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.zeppelin.solutions/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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, 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;
        _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;
        }
        _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 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 8 of 10 : Context.sol
// SPDX-License-Identifier: MIT

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;
    }
}

File 9 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @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);
}

File 10 of 10 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"payoutAddress","type":"address"}],"name":"addPayoutAddress","outputs":[],"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":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"address","name":"from","type":"address"}],"name":"cancel","outputs":[],"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":"auctionId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"from","type":"address"}],"name":"feature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"featured","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"featuredDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"name":"getFeatured","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getFeaturedContains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeaturedLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getFeaturedPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextFeaturedTime","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextFeaturedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextPayoutsTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payouts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutsFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payoutAddress","type":"address"}],"name":"removePayoutAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateFeatured","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updatePayoutAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526200001362093a8042620002ec565b60095568056bc75e2d63100000600a553480156200003057600080fd5b5060405162001fda38038062001fda8339810160408190526200005391620003e0565b8151829082906200006c90600390602085019062000246565b5080516200008290600490602084019062000246565b5050600580546001600160a01b03191633908117909155620000b0915069152d02c7e14af6800000620000e8565b620000df7371c7656ec7ab88b098defb751b7401b5f6d8976f600b620001d060201b62000c581790919060201c565b50505062000487565b6001600160a01b038216620001435760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620001579190620002ec565b90915550506001600160a01b0382166000908152602081905260408120805483929062000186908490620002ec565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03811660009081526001830160205260408120546200023c57508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b0386169081179091558554908252828601909352604090209190915562000240565b5060005b92915050565b82805462000254906200044a565b90600052602060002090601f016020900481019282620002785760008555620002c3565b82601f106200029357805160ff1916838001178555620002c3565b82800160010185558215620002c3579182015b82811115620002c3578251825591602001919060010190620002a6565b50620002d1929150620002d5565b5090565b5b80821115620002d15760008155600101620002d6565b600082198211156200030e57634e487b7160e01b600052601160045260246000fd5b500190565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200033b57600080fd5b81516001600160401b038082111562000358576200035862000313565b604051601f8301601f19908116603f0116810190828211818310171562000383576200038362000313565b81604052838152602092508683858801011115620003a057600080fd5b600091505b83821015620003c45785820183015181830184015290820190620003a5565b83821115620003d65760008385830101525b9695505050505050565b60008060408385031215620003f457600080fd5b82516001600160401b03808211156200040c57600080fd5b6200041a8683870162000329565b935060208501519150808211156200043157600080fd5b50620004408582860162000329565b9150509250929050565b600181811c908216806200045f57607f821691505b602082108114156200048157634e487b7160e01b600052602260045260246000fd5b50919050565b611b4380620004976000396000f3fe608060405234801561001057600080fd5b50600436106101dc5760003560e01c8063715018a611610105578063a457c2d71161009d578063a457c2d7146103d6578063a9059cbb146103e9578063ac58ca1f146103fc578063c15caf0814610405578063dd62ed3e1461040d578063f08ce46114610446578063fca3b5aa14610459578063fe984df31461046c578063ff8a2ecf1461047f57600080fd5b8063715018a61461035f57806379cc6790146103675780637ad94dca1461037a5780637f561e61146103835780638da5cb5b1461038b57806393308d951461039e578063939ddf59146103be57806395d89b41146103c6578063a247bc32146103ce57600080fd5b806334c77f871161017857806334c77f87146102b257806339509351146102c55780633daf0e03146102d857806340c10f19146102eb57806342966c68146102fe57806357d682c41461031157806358baa76e146103245780636b46c8c31461032d57806370a082311461033657600080fd5b806306fdde03146101e157806307546172146101ff578063095ea7b31461022a5780631789058d1461024d57806318160ddd146102625780631b61f60d1461027457806323b872dd14610287578063313ce5671461029a5780633318da6c146102a9575b600080fd5b6101e9610489565b6040516101f691906117bd565b60405180910390f35b600654610212906001600160a01b031681565b6040516001600160a01b0390911681526020016101f6565b61023d61023836600461182e565b61051b565b60405190151581526020016101f6565b61026061025b366004611858565b610532565b005b6002545b6040519081526020016101f6565b610260610282366004611858565b6105be565b61023d610295366004611873565b6105f3565b604051601281526020016101f6565b61026660075481565b6102606102c03660046118af565b61069d565b61023d6102d336600461182e565b6107ed565b6102666102e63660046118e4565b610829565b6102606102f936600461182e565b61083d565b61026061030c3660046118e4565b610871565b61026061031f3660046118fd565b61087e565b610266610e1081565b610266600a5481565b610266610344366004611858565b6001600160a01b031660009081526020819052604090205490565b610260610926565b61026061037536600461182e565b610962565b61026660085481565b601354610266565b600554610212906001600160a01b031681565b6103b16103ac366004611929565b6109e3565b6040516101f6919061194b565b6102606109f8565b6101e9610a6b565b610260610a7a565b61023d6103e436600461182e565b610ae0565b61023d6103f736600461182e565b610b79565b61026660095481565b600854610266565b61026661041b36600461198f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102606104543660046118e4565b610b86565b610260610467366004611858565b610bff565b61023d61047a3660046118e4565b610c4b565b61026662093a8081565b606060038054610498906119b9565b80601f01602080910402602001604051908101604052809291908181526020018280546104c4906119b9565b80156105115780601f106104e657610100808354040283529160200191610511565b820191906000526020600020905b8154815290600101906020018083116104f457829003601f168201915b5050505050905090565b6000610528338484610cca565b5060015b92915050565b6005546001600160a01b031633146105655760405162461bcd60e51b815260040161055c906119f4565b60405180910390fd5b600a610570600b5490565b106105af5760405162461bcd60e51b815260206004820152600f60248201526e13585e1a5b5d5b481c995858da1959608a1b604482015260640161055c565b6105ba600b82610c58565b5050565b6005546001600160a01b031633146105e85760405162461bcd60e51b815260040161055c906119f4565b6105ba600b82610dee565b6000610600848484610f24565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106855760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161055c565b6106928533858403610cca565b506001949350505050565b6006546001600160a01b031633146106c75760405162461bcd60e51b815260040161055c90611a1f565b816106e7826001600160a01b031660009081526020819052604090205490565b10156107265760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040a8aab60931b604482015260640161055c565b610731600d846110e2565b1561076f5760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481c5d595d595960921b604482015260640161055c565b670de0b6b3a76400008210156107b75760405162461bcd60e51b815260206004820152600d60248201526c507269636520746f6f206c6f7760981b604482015260640161055c565b6107bf6109f8565b6107c9818361112e565b6107d4600d8461126a565b6107e0600d84846112d4565b6107e8610a7a565b505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610528918590610824908690611a61565b610cca565b6000818152600f602052604081205461052c565b6006546001600160a01b031633146108675760405162461bcd60e51b815260040161055c90611a1f565b6105ba8282611431565b61087b338261112e565b50565b6006546001600160a01b031633146108a85760405162461bcd60e51b815260040161055c90611a1f565b6108b3600d836110e2565b15156001146108f15760405162461bcd60e51b815260206004820152600a602482015269139bdd081c5d595d595960b21b604482015260640161055c565b6000828152600f602052604090205461090b908290611431565b610916600d836114fe565b61091e6109f8565b6105ba610a7a565b6005546001600160a01b031633146109505760405162461bcd60e51b815260040161055c906119f4565b600580546001600160a01b0319169055565b600061096e833361041b565b9050818110156109cc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161055c565b6109d98333848403610cca565b6107e8838361112e565b60606109f1600d84846115e2565b9392505050565b600854421080610a085750601354155b15610a0f57565b610a1b610e1042611a61565b6008556000805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c54610a54600d826114fe565b600781905561087b33670de0b6b3a7640000611431565b606060048054610498906119b9565b600954421015610a8657565b610a9362093a8042611a61565b60095560005b600b54811015610acb57610ab9610ab1600b83611697565b600a54611431565b80610ac381611a79565b915050610a99565b50610ade33670de0b6b3a7640000611431565b565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610b625760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161055c565b610b6f3385858403610cca565b5060019392505050565b6000610528338484610f24565b6005546001600160a01b03163314610bb05760405162461bcd60e51b815260040161055c906119f4565b683635c9adc5dea000008110610bfa5760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b604482015260640161055c565b600a55565b6005546001600160a01b03163314610c295760405162461bcd60e51b815260040161055c906119f4565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600061052c600d836110e2565b6001600160a01b0381166000908152600183016020526040812054610cc257508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b0386169081179091558554908252828601909352604090209190915561052c565b50600061052c565b6001600160a01b038316610d2c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161055c565b6001600160a01b038216610d8d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161055c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526001830160205260408120548015610f1a576000610e1c600183611a94565b8554909150600090610e3090600190611a94565b9050818114610ebc576000866000018281548110610e5057610e50611aab565b60009182526020909120015487546001600160a01b0390911691508190889085908110610e7f57610e7f611aab565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018801909152604090208390555b8554869080610ecd57610ecd611ac1565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825260018881019091526040822091909155935061052c92505050565b600091505061052c565b6001600160a01b038316610f885760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161055c565b6001600160a01b038216610fea5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161055c565b6001600160a01b038316600090815260208190526040902054818110156110625760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161055c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611099908490611a61565b92505081905550826001600160a01b0316846001600160a01b0316600080516020611aee833981519152846040516110d391815260200190565b60405180910390a35b50505050565b600080805260078301602052604081205482148061110f5750600082815260078401602052604090205415155b806109f157505060009081526008919091016020526040902054151590565b6001600160a01b03821661118e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161055c565b6001600160a01b038216600090815260208190526040902054818110156112025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161055c565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611231908490611a94565b90915550506040518281526000906001600160a01b03851690600080516020611aee8339815191529060200160405180910390a3505050565b61127760068301826116ca565b6000808052600180840160205260408220600281018490558054919290916112a0908490611a61565b909155505060008080526001808401602052604090912001546105ba57600080805260019283016020526040902090910155565b600081815260018401602052604090208354821115611320576112f784846114fe565b6001810183905581845561130e60068501846116e9565b61131b60038501836116e9565b6113fb565b6000838152600285016020908152604080832054808452600588018352818420546001808a0190945291909320549091141561136a57600082815260048701602052604090205491505b61137486866114fe565b60008111801561138357508084115b1561139e576000908152600586016020526040902054611374565b60008181526001878101602081815260408085206002015460048c0183528186205486529290915290922001546113db9160068901918890611703565b82546113f8576113f060038701828685611703565b600183018590555b50505b6002810183905580546001908290600090611417908490611a61565b909155505050600091825260029092016020526040902055565b6001600160a01b0382166114875760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161055c565b80600260008282546114999190611a61565b90915550506001600160a01b038216600090815260208190526040812080548392906114c6908490611a61565b90915550506040518181526001600160a01b03831690600090600080516020611aee8339815191529060200160405180910390a35050565b60008181526002830160209081526040808320805490849055808452600186019092529091208054156115465760018160000160008282546115409190611a94565b90915550505b805461158f576000600182018190556002820155835482141561157757600082815260048501602052604090205484555b811561158a5761158a6003850183611757565b6115d5565b82816001015414156115b257600083815260078501602052604090205460018201555b82816002015414156115d557600083815260088501602052604090205460028201555b6110dc6006850184611757565b606060008267ffffffffffffffff8111156115ff576115ff611ad7565b604051908082528060200260200182016040528015611628578160200160208202803683370190505b5060008581526007870160205260408120549192505b8481101561168c578183828151811061165957611659611aab565b602090810291909101810191909152600092835260078801905260409091205490611685600182611a61565b905061163e565b509095945050505050565b60008260000182815481106116ae576116ae611aab565b6000918252602090912001546001600160a01b03169392505050565b60008080526002830160205260408120546105ba918491908490611703565b60008080526001830160205260408120546105ba91849184905b600083815260018086016020908152604080842086905585845280842085905584845260028801909152808320859055848352822085905585549091869161174c908490611a61565b909155505050505050565b60008181526001830160208181526040808420805460028801808552838720805488529585528387208290558554918752808552928620558585528490559052558154156105ba5760018260000160008282546117b49190611a94565b90915550505050565b600060208083528351808285015260005b818110156117ea578581018301518582016040015282016117ce565b818111156117fc576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461182957600080fd5b919050565b6000806040838503121561184157600080fd5b61184a83611812565b946020939093013593505050565b60006020828403121561186a57600080fd5b6109f182611812565b60008060006060848603121561188857600080fd5b61189184611812565b925061189f60208501611812565b9150604084013590509250925092565b6000806000606084860312156118c457600080fd5b83359250602084013591506118db60408501611812565b90509250925092565b6000602082840312156118f657600080fd5b5035919050565b6000806040838503121561191057600080fd5b8235915061192060208401611812565b90509250929050565b6000806040838503121561193c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561198357835183529284019291840191600101611967565b50909695505050505050565b600080604083850312156119a257600080fd5b6119ab83611812565b915061192060208401611812565b600181811c908216806119cd57607f821691505b602082108114156119ee57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601190820152704e6f74206f776e6572206164647265737360781b604082015260600190565b6020808252601290820152714e6f74206d696e746572206164647265737360701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611a7457611a74611a4b565b500190565b6000600019821415611a8d57611a8d611a4b565b5060010190565b600082821015611aa657611aa6611a4b565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d2338de0ef1881b3ac4123eb4a25632b8535489edb14ebed6cab7a2ac7bc68fa64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003547578000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035455580000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101dc5760003560e01c8063715018a611610105578063a457c2d71161009d578063a457c2d7146103d6578063a9059cbb146103e9578063ac58ca1f146103fc578063c15caf0814610405578063dd62ed3e1461040d578063f08ce46114610446578063fca3b5aa14610459578063fe984df31461046c578063ff8a2ecf1461047f57600080fd5b8063715018a61461035f57806379cc6790146103675780637ad94dca1461037a5780637f561e61146103835780638da5cb5b1461038b57806393308d951461039e578063939ddf59146103be57806395d89b41146103c6578063a247bc32146103ce57600080fd5b806334c77f871161017857806334c77f87146102b257806339509351146102c55780633daf0e03146102d857806340c10f19146102eb57806342966c68146102fe57806357d682c41461031157806358baa76e146103245780636b46c8c31461032d57806370a082311461033657600080fd5b806306fdde03146101e157806307546172146101ff578063095ea7b31461022a5780631789058d1461024d57806318160ddd146102625780631b61f60d1461027457806323b872dd14610287578063313ce5671461029a5780633318da6c146102a9575b600080fd5b6101e9610489565b6040516101f691906117bd565b60405180910390f35b600654610212906001600160a01b031681565b6040516001600160a01b0390911681526020016101f6565b61023d61023836600461182e565b61051b565b60405190151581526020016101f6565b61026061025b366004611858565b610532565b005b6002545b6040519081526020016101f6565b610260610282366004611858565b6105be565b61023d610295366004611873565b6105f3565b604051601281526020016101f6565b61026660075481565b6102606102c03660046118af565b61069d565b61023d6102d336600461182e565b6107ed565b6102666102e63660046118e4565b610829565b6102606102f936600461182e565b61083d565b61026061030c3660046118e4565b610871565b61026061031f3660046118fd565b61087e565b610266610e1081565b610266600a5481565b610266610344366004611858565b6001600160a01b031660009081526020819052604090205490565b610260610926565b61026061037536600461182e565b610962565b61026660085481565b601354610266565b600554610212906001600160a01b031681565b6103b16103ac366004611929565b6109e3565b6040516101f6919061194b565b6102606109f8565b6101e9610a6b565b610260610a7a565b61023d6103e436600461182e565b610ae0565b61023d6103f736600461182e565b610b79565b61026660095481565b600854610266565b61026661041b36600461198f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102606104543660046118e4565b610b86565b610260610467366004611858565b610bff565b61023d61047a3660046118e4565b610c4b565b61026662093a8081565b606060038054610498906119b9565b80601f01602080910402602001604051908101604052809291908181526020018280546104c4906119b9565b80156105115780601f106104e657610100808354040283529160200191610511565b820191906000526020600020905b8154815290600101906020018083116104f457829003601f168201915b5050505050905090565b6000610528338484610cca565b5060015b92915050565b6005546001600160a01b031633146105655760405162461bcd60e51b815260040161055c906119f4565b60405180910390fd5b600a610570600b5490565b106105af5760405162461bcd60e51b815260206004820152600f60248201526e13585e1a5b5d5b481c995858da1959608a1b604482015260640161055c565b6105ba600b82610c58565b5050565b6005546001600160a01b031633146105e85760405162461bcd60e51b815260040161055c906119f4565b6105ba600b82610dee565b6000610600848484610f24565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106855760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161055c565b6106928533858403610cca565b506001949350505050565b6006546001600160a01b031633146106c75760405162461bcd60e51b815260040161055c90611a1f565b816106e7826001600160a01b031660009081526020819052604090205490565b10156107265760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040a8aab60931b604482015260640161055c565b610731600d846110e2565b1561076f5760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481c5d595d595960921b604482015260640161055c565b670de0b6b3a76400008210156107b75760405162461bcd60e51b815260206004820152600d60248201526c507269636520746f6f206c6f7760981b604482015260640161055c565b6107bf6109f8565b6107c9818361112e565b6107d4600d8461126a565b6107e0600d84846112d4565b6107e8610a7a565b505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610528918590610824908690611a61565b610cca565b6000818152600f602052604081205461052c565b6006546001600160a01b031633146108675760405162461bcd60e51b815260040161055c90611a1f565b6105ba8282611431565b61087b338261112e565b50565b6006546001600160a01b031633146108a85760405162461bcd60e51b815260040161055c90611a1f565b6108b3600d836110e2565b15156001146108f15760405162461bcd60e51b815260206004820152600a602482015269139bdd081c5d595d595960b21b604482015260640161055c565b6000828152600f602052604090205461090b908290611431565b610916600d836114fe565b61091e6109f8565b6105ba610a7a565b6005546001600160a01b031633146109505760405162461bcd60e51b815260040161055c906119f4565b600580546001600160a01b0319169055565b600061096e833361041b565b9050818110156109cc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161055c565b6109d98333848403610cca565b6107e8838361112e565b60606109f1600d84846115e2565b9392505050565b600854421080610a085750601354155b15610a0f57565b610a1b610e1042611a61565b6008556000805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c54610a54600d826114fe565b600781905561087b33670de0b6b3a7640000611431565b606060048054610498906119b9565b600954421015610a8657565b610a9362093a8042611a61565b60095560005b600b54811015610acb57610ab9610ab1600b83611697565b600a54611431565b80610ac381611a79565b915050610a99565b50610ade33670de0b6b3a7640000611431565b565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610b625760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161055c565b610b6f3385858403610cca565b5060019392505050565b6000610528338484610f24565b6005546001600160a01b03163314610bb05760405162461bcd60e51b815260040161055c906119f4565b683635c9adc5dea000008110610bfa5760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b604482015260640161055c565b600a55565b6005546001600160a01b03163314610c295760405162461bcd60e51b815260040161055c906119f4565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600061052c600d836110e2565b6001600160a01b0381166000908152600183016020526040812054610cc257508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b0386169081179091558554908252828601909352604090209190915561052c565b50600061052c565b6001600160a01b038316610d2c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161055c565b6001600160a01b038216610d8d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161055c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526001830160205260408120548015610f1a576000610e1c600183611a94565b8554909150600090610e3090600190611a94565b9050818114610ebc576000866000018281548110610e5057610e50611aab565b60009182526020909120015487546001600160a01b0390911691508190889085908110610e7f57610e7f611aab565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018801909152604090208390555b8554869080610ecd57610ecd611ac1565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038716825260018881019091526040822091909155935061052c92505050565b600091505061052c565b6001600160a01b038316610f885760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161055c565b6001600160a01b038216610fea5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161055c565b6001600160a01b038316600090815260208190526040902054818110156110625760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161055c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611099908490611a61565b92505081905550826001600160a01b0316846001600160a01b0316600080516020611aee833981519152846040516110d391815260200190565b60405180910390a35b50505050565b600080805260078301602052604081205482148061110f5750600082815260078401602052604090205415155b806109f157505060009081526008919091016020526040902054151590565b6001600160a01b03821661118e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161055c565b6001600160a01b038216600090815260208190526040902054818110156112025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161055c565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611231908490611a94565b90915550506040518281526000906001600160a01b03851690600080516020611aee8339815191529060200160405180910390a3505050565b61127760068301826116ca565b6000808052600180840160205260408220600281018490558054919290916112a0908490611a61565b909155505060008080526001808401602052604090912001546105ba57600080805260019283016020526040902090910155565b600081815260018401602052604090208354821115611320576112f784846114fe565b6001810183905581845561130e60068501846116e9565b61131b60038501836116e9565b6113fb565b6000838152600285016020908152604080832054808452600588018352818420546001808a0190945291909320549091141561136a57600082815260048701602052604090205491505b61137486866114fe565b60008111801561138357508084115b1561139e576000908152600586016020526040902054611374565b60008181526001878101602081815260408085206002015460048c0183528186205486529290915290922001546113db9160068901918890611703565b82546113f8576113f060038701828685611703565b600183018590555b50505b6002810183905580546001908290600090611417908490611a61565b909155505050600091825260029092016020526040902055565b6001600160a01b0382166114875760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161055c565b80600260008282546114999190611a61565b90915550506001600160a01b038216600090815260208190526040812080548392906114c6908490611a61565b90915550506040518181526001600160a01b03831690600090600080516020611aee8339815191529060200160405180910390a35050565b60008181526002830160209081526040808320805490849055808452600186019092529091208054156115465760018160000160008282546115409190611a94565b90915550505b805461158f576000600182018190556002820155835482141561157757600082815260048501602052604090205484555b811561158a5761158a6003850183611757565b6115d5565b82816001015414156115b257600083815260078501602052604090205460018201555b82816002015414156115d557600083815260088501602052604090205460028201555b6110dc6006850184611757565b606060008267ffffffffffffffff8111156115ff576115ff611ad7565b604051908082528060200260200182016040528015611628578160200160208202803683370190505b5060008581526007870160205260408120549192505b8481101561168c578183828151811061165957611659611aab565b602090810291909101810191909152600092835260078801905260409091205490611685600182611a61565b905061163e565b509095945050505050565b60008260000182815481106116ae576116ae611aab565b6000918252602090912001546001600160a01b03169392505050565b60008080526002830160205260408120546105ba918491908490611703565b60008080526001830160205260408120546105ba91849184905b600083815260018086016020908152604080842086905585845280842085905584845260028801909152808320859055848352822085905585549091869161174c908490611a61565b909155505050505050565b60008181526001830160208181526040808420805460028801808552838720805488529585528387208290558554918752808552928620558585528490559052558154156105ba5760018260000160008282546117b49190611a94565b90915550505050565b600060208083528351808285015260005b818110156117ea578581018301518582016040015282016117ce565b818111156117fc576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461182957600080fd5b919050565b6000806040838503121561184157600080fd5b61184a83611812565b946020939093013593505050565b60006020828403121561186a57600080fd5b6109f182611812565b60008060006060848603121561188857600080fd5b61189184611812565b925061189f60208501611812565b9150604084013590509250925092565b6000806000606084860312156118c457600080fd5b83359250602084013591506118db60408501611812565b90509250925092565b6000602082840312156118f657600080fd5b5035919050565b6000806040838503121561191057600080fd5b8235915061192060208401611812565b90509250929050565b6000806040838503121561193c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561198357835183529284019291840191600101611967565b50909695505050505050565b600080604083850312156119a257600080fd5b6119ab83611812565b915061192060208401611812565b600181811c908216806119cd57607f821691505b602082108114156119ee57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601190820152704e6f74206f776e6572206164647265737360781b604082015260600190565b6020808252601290820152714e6f74206d696e746572206164647265737360701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611a7457611a74611a4b565b500190565b6000600019821415611a8d57611a8d611a4b565b5060010190565b600082821015611aa657611aa6611a4b565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052604160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d2338de0ef1881b3ac4123eb4a25632b8535489edb14ebed6cab7a2ac7bc68fa64736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003547578000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035455580000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Tux
Arg [1] : symbol (string): TUX

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [3] : 5475780000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 5455580000000000000000000000000000000000000000000000000000000000


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

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.