ETH Price: $3,090.62 (+0.94%)
Gas: 6 Gwei

Token

Gum (GUM)
 

Overview

Max Total Supply

328,590 GUM

Holders

62

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Gum

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-04
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)



// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)



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

    /**
     * @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);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.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);
}
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)



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

/**
 * @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:
     *
     * - `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 `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:
     *
     * - `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;
        }
        _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;
        _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 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 {}
}// OpenZeppelin Contracts v4.4.1 (access/Ownable.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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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);
    }
}// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)



/**
 * @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 `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // 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
    // bytes32 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 bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => 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, bytes32 value) private 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, bytes32 value) private 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) {
                bytes32 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, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private 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) private view returns (bytes32) {
        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) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, 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(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @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(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @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(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @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(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, 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(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @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(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @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(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

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

    /**
     * @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(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, 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(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}
error IndexOutOfRange();
error InvalidAction();
error OnlyOwnerOrStaking();
error UnapprovedRecipient();
error UpdateFailed();

contract Gum is ERC20, Ownable {
    using EnumerableSet for EnumerableSet.UintSet;

    EnumerableSet.AddressSet private _transferAllowList;
    address public staking;

    enum TransferAllowListAction {
        Add,
        Remove
    }

    event TransferAllowListUpdated(
        address _approvedAddress,
        TransferAllowListAction _action
    );
    event StakingUpdated(address _staking);

    constructor(address _staking) ERC20("Gum", "GUM") {
        staking = _staking;
    }

    modifier onlyOwnerOrStaking() {
        if (msg.sender != owner() && msg.sender != staking) {
            revert OnlyOwnerOrStaking();
        }
        _;
    }

    /**
     * @dev Add or remove an item from the list of addresses to which
     * GUM can be transfered.
     * @param _address The address to add or remove from the allow list
     * @param _action 0 to add, 1 to remove
     */
    function updateTransferAllowList(address _address, uint8 _action)
        public
        onlyOwner
    {
        if (_action > 1) revert InvalidAction();
        bool success;
        if (_action == 0) {
            success = EnumerableSet.add(_transferAllowList, _address);
        } else if (_action == 1) {
            success = EnumerableSet.remove(_transferAllowList, _address);
        }
        if (!success) revert UpdateFailed();
        TransferAllowListAction action = TransferAllowListAction(_action);
        emit TransferAllowListUpdated(_address, action);
    }

    function getTransferAllowListLength() public view returns (uint256) {
        return EnumerableSet.length(_transferAllowList);
    }

    function getTransferAllowListAtIndex(uint256 index)
        public
        view
        returns (address)
    {
        if (index >= EnumerableSet.length(_transferAllowList)) {
            revert IndexOutOfRange();
        }
        return EnumerableSet.at(_transferAllowList, index);
    }

    function updateStaking(address _staking) public onlyOwner {
        staking = _staking;
        emit StakingUpdated(_staking);
    }

    /**
     * @dev Only owner and staking contract can mint tokens.
     */
    function mint(address to, uint256 amount) public onlyOwnerOrStaking {
        _mint(to, amount);
    }

    /**
     * @dev Overwrite the transfer function so that GUM can only be sent
     * to approved addresses.
     */
    function transfer(address to, uint256 amount)
        public
        override
        returns (bool)
    {
        if (!EnumerableSet.contains(_transferAllowList, to)) {
            revert UnapprovedRecipient();
        }
        return ERC20.transfer(to, amount);
    }

    /**
     * @dev Overwrite the transferFrom function so that GUM can only be
     * sent to approved addresses.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        if (!EnumerableSet.contains(_transferAllowList, to)) {
            revert UnapprovedRecipient();
        }
        return ERC20.transferFrom(from, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IndexOutOfRange","type":"error"},{"inputs":[],"name":"InvalidAction","type":"error"},{"inputs":[],"name":"OnlyOwnerOrStaking","type":"error"},{"inputs":[],"name":"UnapprovedRecipient","type":"error"},{"inputs":[],"name":"UpdateFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staking","type":"address"}],"name":"StakingUpdated","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":"address","name":"_approvedAddress","type":"address"},{"indexed":false,"internalType":"enum Gum.TransferAllowListAction","name":"_action","type":"uint8"}],"name":"TransferAllowListUpdated","type":"event"},{"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":[],"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":"index","type":"uint256"}],"name":"getTransferAllowListAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferAllowListLength","outputs":[{"internalType":"uint256","name":"","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":"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"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":"_staking","type":"address"}],"name":"updateStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"_action","type":"uint8"}],"name":"updateTransferAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001384380380620013848339810160408190526200003491620001ce565b60408051808201825260038082526247756d60e81b602080840191825284518086019095528285526247554d60e81b9085015282519293926200007992919062000128565b5080516200008f90600490602084019062000128565b505050620000ac620000a6620000d260201b60201c565b620000d6565b600880546001600160a01b0319166001600160a01b03929092169190911790556200023c565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001369062000200565b90600052602060002090601f0160209004810192826200015a5760008555620001a5565b82601f106200017557805160ff1916838001178555620001a5565b82800160010185558215620001a5579182015b82811115620001a557825182559160200191906001019062000188565b50620001b3929150620001b7565b5090565b5b80821115620001b35760008155600101620001b8565b600060208284031215620001e157600080fd5b81516001600160a01b0381168114620001f957600080fd5b9392505050565b600181811c908216806200021557607f821691505b6020821081036200023657634e487b7160e01b600052602260045260246000fd5b50919050565b611138806200024c6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063b96c4bee11610071578063b96c4bee1461027c578063c03155f41461028f578063dd62ed3e14610297578063f2fde38b146102aa578063fa550a00146102bd57600080fd5b80638da5cb5b1461022a57806395d89b411461023b578063a345f38d14610243578063a457c2d714610256578063a9059cbb1461026957600080fd5b806339509351116100f457806339509351146101a657806340c10f19146101b95780634cf088d9146101ce57806370a08231146101f9578063715018a61461022257600080fd5b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017257806323b872dd14610184578063313ce56714610197575b600080fd5b6101396102d0565b6040516101469190610e56565b60405180910390f35b61016261015d366004610ec7565b610362565b6040519015158152602001610146565b6002545b604051908152602001610146565b610162610192366004610ef1565b61037c565b60405160128152602001610146565b6101626101b4366004610ec7565b6103b9565b6101cc6101c7366004610ec7565b6103db565b005b6008546101e1906001600160a01b031681565b6040516001600160a01b039091168152602001610146565b610176610207366004610f2d565b6001600160a01b031660009081526020819052604090205490565b6101cc61042d565b6005546001600160a01b03166101e1565b61013961046c565b6101cc610251366004610f2d565b61047b565b610162610264366004610ec7565b6104f9565b610162610277366004610ec7565b61057f565b6101e161028a366004610f48565b6105ba565b6101766105f0565b6101766102a5366004610f61565b610601565b6101cc6102b8366004610f2d565b61062c565b6101cc6102cb366004610f94565b6106c7565b6060600380546102df90610fd1565b80601f016020809104026020016040519081016040528092919081815260200182805461030b90610fd1565b80156103585780601f1061032d57610100808354040283529160200191610358565b820191906000526020600020905b81548152906001019060200180831161033b57829003601f168201915b5050505050905090565b6000336103708185856107c4565b60019150505b92915050565b60006103896006846108e8565b6103a65760405163f8511d6d60e01b815260040160405180910390fd5b6103b184848461090a565b949350505050565b6000336103708185856103cc8383610601565b6103d69190611021565b6107c4565b6005546001600160a01b0316331480159061040157506008546001600160a01b03163314155b1561041f5760405163242c4b8960e21b815260040160405180910390fd5b6104298282610923565b5050565b6005546001600160a01b031633146104605760405162461bcd60e51b815260040161045790611039565b60405180910390fd5b61046a6000610a02565b565b6060600480546102df90610fd1565b6005546001600160a01b031633146104a55760405162461bcd60e51b815260040161045790611039565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527fe189a719dae2bf18df1013cfa028ecce01f9fafdbd456a862fa18e6d0143e3c29060200160405180910390a150565b600033816105078286610601565b9050838110156105675760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610457565b61057482868684036107c4565b506001949350505050565b600061058c6006846108e8565b6105a95760405163f8511d6d60e01b815260040160405180910390fd5b6105b38383610a54565b9392505050565b60006105c66006610a62565b82106105e557604051631390f2a160e01b815260040160405180910390fd5b610376600683610a6c565b60006105fc6006610a62565b905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146106565760405162461bcd60e51b815260040161045790611039565b6001600160a01b0381166106bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610457565b6106c481610a02565b50565b6005546001600160a01b031633146106f15760405162461bcd60e51b815260040161045790611039565b60018160ff16111561071657604051634a7f394f60e01b815260040160405180910390fd5b60008160ff166000036107355761072e600684610a78565b905061074e565b8160ff1660010361074e5761074b600684610a8d565b90505b8061076c5760405163055c6e9560e51b815260040160405180910390fd5b60008260ff1660018111156107835761078361106e565b90507f2b0889802e90f7fe8ed602b1b9fcb8b630e7579bd853144d73087d9715a91e9384826040516107b6929190611084565b60405180910390a150505050565b6001600160a01b0383166108265760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610457565b6001600160a01b0382166108875760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610457565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038116600090815260018301602052604081205415156105b3565b600033610918858285610aa2565b610574858585610b1c565b6001600160a01b0382166109795760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610457565b806002600082825461098b9190611021565b90915550506001600160a01b038216600090815260208190526040812080548392906109b8908490611021565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600033610370818585610b1c565b6000610376825490565b60006105b38383610cea565b60006105b3836001600160a01b038416610d14565b60006105b3836001600160a01b038416610d63565b6000610aae8484610601565b90506000198114610b165781811015610b095760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610457565b610b1684848484036107c4565b50505050565b6001600160a01b038316610b805760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610457565b6001600160a01b038216610be25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610457565b6001600160a01b03831660009081526020819052604090205481811015610c5a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610457565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610c91908490611021565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cdd91815260200190565b60405180910390a3610b16565b6000826000018281548110610d0157610d016110bf565b9060005260206000200154905092915050565b6000818152600183016020526040812054610d5b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610376565b506000610376565b60008181526001830160205260408120548015610e4c576000610d876001836110d5565b8554909150600090610d9b906001906110d5565b9050818114610e00576000866000018281548110610dbb57610dbb6110bf565b9060005260206000200154905080876000018481548110610dde57610dde6110bf565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610e1157610e116110ec565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610376565b6000915050610376565b600060208083528351808285015260005b81811015610e8357858101830151858201604001528201610e67565b81811115610e95576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610ec257600080fd5b919050565b60008060408385031215610eda57600080fd5b610ee383610eab565b946020939093013593505050565b600080600060608486031215610f0657600080fd5b610f0f84610eab565b9250610f1d60208501610eab565b9150604084013590509250925092565b600060208284031215610f3f57600080fd5b6105b382610eab565b600060208284031215610f5a57600080fd5b5035919050565b60008060408385031215610f7457600080fd5b610f7d83610eab565b9150610f8b60208401610eab565b90509250929050565b60008060408385031215610fa757600080fd5b610fb083610eab565b9150602083013560ff81168114610fc657600080fd5b809150509250929050565b600181811c90821680610fe557607f821691505b60208210810361100557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156110345761103461100b565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038316815260408101600283106110b257634e487b7160e01b600052602160045260246000fd5b8260208301529392505050565b634e487b7160e01b600052603260045260246000fd5b6000828210156110e7576110e761100b565b500390565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206c63391392e75a2aee016057f59e817444dc84cd6cac72a1cc47394c919c994e64736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063b96c4bee11610071578063b96c4bee1461027c578063c03155f41461028f578063dd62ed3e14610297578063f2fde38b146102aa578063fa550a00146102bd57600080fd5b80638da5cb5b1461022a57806395d89b411461023b578063a345f38d14610243578063a457c2d714610256578063a9059cbb1461026957600080fd5b806339509351116100f457806339509351146101a657806340c10f19146101b95780634cf088d9146101ce57806370a08231146101f9578063715018a61461022257600080fd5b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017257806323b872dd14610184578063313ce56714610197575b600080fd5b6101396102d0565b6040516101469190610e56565b60405180910390f35b61016261015d366004610ec7565b610362565b6040519015158152602001610146565b6002545b604051908152602001610146565b610162610192366004610ef1565b61037c565b60405160128152602001610146565b6101626101b4366004610ec7565b6103b9565b6101cc6101c7366004610ec7565b6103db565b005b6008546101e1906001600160a01b031681565b6040516001600160a01b039091168152602001610146565b610176610207366004610f2d565b6001600160a01b031660009081526020819052604090205490565b6101cc61042d565b6005546001600160a01b03166101e1565b61013961046c565b6101cc610251366004610f2d565b61047b565b610162610264366004610ec7565b6104f9565b610162610277366004610ec7565b61057f565b6101e161028a366004610f48565b6105ba565b6101766105f0565b6101766102a5366004610f61565b610601565b6101cc6102b8366004610f2d565b61062c565b6101cc6102cb366004610f94565b6106c7565b6060600380546102df90610fd1565b80601f016020809104026020016040519081016040528092919081815260200182805461030b90610fd1565b80156103585780601f1061032d57610100808354040283529160200191610358565b820191906000526020600020905b81548152906001019060200180831161033b57829003601f168201915b5050505050905090565b6000336103708185856107c4565b60019150505b92915050565b60006103896006846108e8565b6103a65760405163f8511d6d60e01b815260040160405180910390fd5b6103b184848461090a565b949350505050565b6000336103708185856103cc8383610601565b6103d69190611021565b6107c4565b6005546001600160a01b0316331480159061040157506008546001600160a01b03163314155b1561041f5760405163242c4b8960e21b815260040160405180910390fd5b6104298282610923565b5050565b6005546001600160a01b031633146104605760405162461bcd60e51b815260040161045790611039565b60405180910390fd5b61046a6000610a02565b565b6060600480546102df90610fd1565b6005546001600160a01b031633146104a55760405162461bcd60e51b815260040161045790611039565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527fe189a719dae2bf18df1013cfa028ecce01f9fafdbd456a862fa18e6d0143e3c29060200160405180910390a150565b600033816105078286610601565b9050838110156105675760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610457565b61057482868684036107c4565b506001949350505050565b600061058c6006846108e8565b6105a95760405163f8511d6d60e01b815260040160405180910390fd5b6105b38383610a54565b9392505050565b60006105c66006610a62565b82106105e557604051631390f2a160e01b815260040160405180910390fd5b610376600683610a6c565b60006105fc6006610a62565b905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146106565760405162461bcd60e51b815260040161045790611039565b6001600160a01b0381166106bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610457565b6106c481610a02565b50565b6005546001600160a01b031633146106f15760405162461bcd60e51b815260040161045790611039565b60018160ff16111561071657604051634a7f394f60e01b815260040160405180910390fd5b60008160ff166000036107355761072e600684610a78565b905061074e565b8160ff1660010361074e5761074b600684610a8d565b90505b8061076c5760405163055c6e9560e51b815260040160405180910390fd5b60008260ff1660018111156107835761078361106e565b90507f2b0889802e90f7fe8ed602b1b9fcb8b630e7579bd853144d73087d9715a91e9384826040516107b6929190611084565b60405180910390a150505050565b6001600160a01b0383166108265760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610457565b6001600160a01b0382166108875760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610457565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038116600090815260018301602052604081205415156105b3565b600033610918858285610aa2565b610574858585610b1c565b6001600160a01b0382166109795760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610457565b806002600082825461098b9190611021565b90915550506001600160a01b038216600090815260208190526040812080548392906109b8908490611021565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600033610370818585610b1c565b6000610376825490565b60006105b38383610cea565b60006105b3836001600160a01b038416610d14565b60006105b3836001600160a01b038416610d63565b6000610aae8484610601565b90506000198114610b165781811015610b095760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610457565b610b1684848484036107c4565b50505050565b6001600160a01b038316610b805760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610457565b6001600160a01b038216610be25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610457565b6001600160a01b03831660009081526020819052604090205481811015610c5a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610457565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610c91908490611021565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cdd91815260200190565b60405180910390a3610b16565b6000826000018281548110610d0157610d016110bf565b9060005260206000200154905092915050565b6000818152600183016020526040812054610d5b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610376565b506000610376565b60008181526001830160205260408120548015610e4c576000610d876001836110d5565b8554909150600090610d9b906001906110d5565b9050818114610e00576000866000018281548110610dbb57610dbb6110bf565b9060005260206000200154905080876000018481548110610dde57610dde6110bf565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610e1157610e116110ec565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610376565b6000915050610376565b600060208083528351808285015260005b81811015610e8357858101830151858201604001528201610e67565b81811115610e95576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610ec257600080fd5b919050565b60008060408385031215610eda57600080fd5b610ee383610eab565b946020939093013593505050565b600080600060608486031215610f0657600080fd5b610f0f84610eab565b9250610f1d60208501610eab565b9150604084013590509250925092565b600060208284031215610f3f57600080fd5b6105b382610eab565b600060208284031215610f5a57600080fd5b5035919050565b60008060408385031215610f7457600080fd5b610f7d83610eab565b9150610f8b60208401610eab565b90509250929050565b60008060408385031215610fa757600080fd5b610fb083610eab565b9150602083013560ff81168114610fc657600080fd5b809150509250929050565b600181811c90821680610fe557607f821691505b60208210810361100557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156110345761103461100b565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038316815260408101600283106110b257634e487b7160e01b600052602160045260246000fd5b8260208301529392505050565b634e487b7160e01b600052603260045260246000fd5b6000828210156110e7576110e761100b565b500390565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206c63391392e75a2aee016057f59e817444dc84cd6cac72a1cc47394c919c994e64736f6c634300080d0033

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

0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _staking (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

32211:3162:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6356:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8707:201;;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;8707:201:0;1053:187:1;7476:108:0;7564:12;;7476:108;;;1391:25:1;;;1379:2;1364:18;7476:108:0;1245:177:1;35061:309:0;;;;;;:::i;:::-;;:::i;7318:93::-;;;7401:2;1902:36:1;;1890:2;1875:18;7318:93:0;1760:184:1;10192:238:0;;;;;;:::i;:::-;;:::i;34412:104::-;;;;;;:::i;:::-;;:::i;:::-;;32361:22;;;;;-1:-1:-1;;;;;32361:22:0;;;;;;-1:-1:-1;;;;;2113:32:1;;;2095:51;;2083:2;2068:18;32361:22:0;1949:203:1;7647:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;7748:18:0;7721:7;7748:18;;;;;;;;;;;;7647:127;18782:103;;;:::i;18131:87::-;18204:6;;-1:-1:-1;;;;;18204:6:0;18131:87;;6575:104;;;:::i;34189:135::-;;;;;;:::i;:::-;;:::i;10933:436::-;;;;;;:::i;:::-;;:::i;34647:279::-;;;;;;:::i;:::-;;:::i;33882:299::-;;;;;;:::i;:::-;;:::i;33740:134::-;;;:::i;8236:151::-;;;;;;:::i;:::-;;:::i;19040:201::-;;;;;;:::i;:::-;;:::i;33142:590::-;;;;;;:::i;:::-;;:::i;6356:100::-;6410:13;6443:5;6436:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6356:100;:::o;8707:201::-;8790:4;4244:10;8846:32;4244:10;8862:7;8871:6;8846:8;:32::i;:::-;8896:4;8889:11;;;8707:201;;;;;:::o;35061:309::-;35184:4;35206:46;35229:18;35249:2;35206:22;:46::i;:::-;35201:108;;35276:21;;-1:-1:-1;;;35276:21:0;;;;;;;;;;;35201:108;35326:36;35345:4;35351:2;35355:6;35326:18;:36::i;:::-;35319:43;35061:309;-1:-1:-1;;;;35061:309:0:o;10192:238::-;10280:4;4244:10;10336:64;4244:10;10352:7;10389:10;10361:25;4244:10;10352:7;10361:9;:25::i;:::-;:38;;;;:::i;:::-;10336:8;:64::i;34412:104::-;18204:6;;-1:-1:-1;;;;;18204:6:0;32775:10;:21;;;;:46;;-1:-1:-1;32814:7:0;;-1:-1:-1;;;;;32814:7:0;32800:10;:21;;32775:46;32771:106;;;32845:20;;-1:-1:-1;;;32845:20:0;;;;;;;;;;;32771:106;34491:17:::1;34497:2;34501:6;34491:5;:17::i;:::-;34412:104:::0;;:::o;18782:103::-;18204:6;;-1:-1:-1;;;;;18204:6:0;4244:10;18351:23;18343:68;;;;-1:-1:-1;;;18343:68:0;;;;;;;:::i;:::-;;;;;;;;;18847:30:::1;18874:1;18847:18;:30::i;:::-;18782:103::o:0;6575:104::-;6631:13;6664:7;6657:14;;;;;:::i;34189:135::-;18204:6;;-1:-1:-1;;;;;18204:6:0;4244:10;18351:23;18343:68;;;;-1:-1:-1;;;18343:68:0;;;;;;;:::i;:::-;34258:7:::1;:18:::0;;-1:-1:-1;;;;;;34258:18:0::1;-1:-1:-1::0;;;;;34258:18:0;::::1;::::0;;::::1;::::0;;;34292:24:::1;::::0;2095:51:1;;;34292:24:0::1;::::0;2083:2:1;2068:18;34292:24:0::1;;;;;;;34189:135:::0;:::o;10933:436::-;11026:4;4244:10;11026:4;11109:25;4244:10;11126:7;11109:9;:25::i;:::-;11082:52;;11173:15;11153:16;:35;;11145:85;;;;-1:-1:-1;;;11145:85:0;;4359:2:1;11145:85:0;;;4341:21:1;4398:2;4378:18;;;4371:30;4437:34;4417:18;;;4410:62;-1:-1:-1;;;4488:18:1;;;4481:35;4533:19;;11145:85:0;4157:401:1;11145:85:0;11266:60;11275:5;11282:7;11310:15;11291:16;:34;11266:8;:60::i;:::-;-1:-1:-1;11357:4:0;;10933:436;-1:-1:-1;;;;10933:436:0:o;34647:279::-;34745:4;34772:46;34795:18;34815:2;34772:22;:46::i;:::-;34767:108;;34842:21;;-1:-1:-1;;;34842:21:0;;;;;;;;;;;34767:108;34892:26;34907:2;34911:6;34892:14;:26::i;:::-;34885:33;34647:279;-1:-1:-1;;;34647:279:0:o;33882:299::-;33982:7;34020:40;34041:18;34020:20;:40::i;:::-;34011:5;:49;34007:106;;34084:17;;-1:-1:-1;;;34084:17:0;;;;;;;;;;;34007:106;34130:43;34147:18;34167:5;34130:16;:43::i;33740:134::-;33799:7;33826:40;33847:18;33826:20;:40::i;:::-;33819:47;;33740:134;:::o;8236:151::-;-1:-1:-1;;;;;8352:18:0;;;8325:7;8352:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8236:151::o;19040:201::-;18204:6;;-1:-1:-1;;;;;18204:6:0;4244:10;18351:23;18343:68;;;;-1:-1:-1;;;18343:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19129:22:0;::::1;19121:73;;;::::0;-1:-1:-1;;;19121:73:0;;4765:2:1;19121:73:0::1;::::0;::::1;4747:21:1::0;4804:2;4784:18;;;4777:30;4843:34;4823:18;;;4816:62;-1:-1:-1;;;4894:18:1;;;4887:36;4940:19;;19121:73:0::1;4563:402:1::0;19121:73:0::1;19205:28;19224:8;19205:18;:28::i;:::-;19040:201:::0;:::o;33142:590::-;18204:6;;-1:-1:-1;;;;;18204:6:0;4244:10;18351:23;18343:68;;;;-1:-1:-1;;;18343:68:0;;;;;;;:::i;:::-;33273:1:::1;33263:7;:11;;;33259:39;;;33283:15;;-1:-1:-1::0;;;33283:15:0::1;;;;;;;;;;;33259:39;33309:12;33336:7;:12;;33347:1;33336:12:::0;33332:213:::1;;33375:47;33393:18;33413:8;33375:17;:47::i;:::-;33365:57;;33332:213;;;33444:7;:12;;33455:1;33444:12:::0;33440:105:::1;;33483:50;33504:18;33524:8;33483:20;:50::i;:::-;33473:60;;33440:105;33560:7;33555:35;;33576:14;;-1:-1:-1::0;;;33576:14:0::1;;;;;;;;;;;33555:35;33601:30;33658:7;33634:32;;;;;;;;;;:::i;:::-;33601:65;;33682:42;33707:8;33717:6;33682:42;;;;;;;:::i;:::-;;;;;;;;33248:484;;33142:590:::0;;:::o;14567:380::-;-1:-1:-1;;;;;14703:19:0;;14695:68;;;;-1:-1:-1;;;14695:68:0;;5762:2:1;14695:68:0;;;5744:21:1;5801:2;5781:18;;;5774:30;5840:34;5820:18;;;5813:62;-1:-1:-1;;;5891:18:1;;;5884:34;5935:19;;14695:68:0;5560:400:1;14695:68:0;-1:-1:-1;;;;;14782:21:0;;14774:68;;;;-1:-1:-1;;;14774:68:0;;6167:2:1;14774:68:0;;;6149:21:1;6206:2;6186:18;;;6179:30;6245:34;6225:18;;;6218:62;-1:-1:-1;;;6296:18:1;;;6289:32;6338:19;;14774:68:0;5965:398:1;14774:68:0;-1:-1:-1;;;;;14855:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14907:32;;1391:25:1;;;14907:32:0;;1364:18:1;14907:32:0;;;;;;;14567:380;;;:::o;27946:167::-;-1:-1:-1;;;;;28080:23:0;;28026:4;23482:19;;;:12;;;:19;;;;;;:24;;28050:55;23385:129;9488:295;9619:4;4244:10;9677:38;9693:4;4244:10;9708:6;9677:15;:38::i;:::-;9726:27;9736:4;9742:2;9746:6;9726:9;:27::i;12806:399::-;-1:-1:-1;;;;;12890:21:0;;12882:65;;;;-1:-1:-1;;;12882:65:0;;6570:2:1;12882:65:0;;;6552:21:1;6609:2;6589:18;;;6582:30;6648:33;6628:18;;;6621:61;6699:18;;12882:65:0;6368:355:1;12882:65:0;13038:6;13022:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13055:18:0;;:9;:18;;;;;;;;;;:28;;13077:6;;13055:9;:28;;13077:6;;13055:28;:::i;:::-;;;;-1:-1:-1;;13099:37:0;;1391:25:1;;;-1:-1:-1;;;;;13099:37:0;;;13116:1;;13099:37;;1379:2:1;1364:18;13099:37:0;;;;;;;34412:104;;:::o;19401:191::-;19494:6;;;-1:-1:-1;;;;;19511:17:0;;;-1:-1:-1;;;;;;19511:17:0;;;;;;;19544:40;;19494:6;;;19511:17;19494:6;;19544:40;;19475:16;;19544:40;19464:128;19401:191;:::o;7980:193::-;8059:4;4244:10;8115:28;4244:10;8132:2;8136:6;8115:9;:28::i;28199:117::-;28262:7;28289:19;28297:3;23683:18;;23600:109;28670:158;28744:7;28795:22;28799:3;28811:5;28795:3;:22::i;27374:152::-;27444:4;27468:50;27473:3;-1:-1:-1;;;;;27493:23:0;;27468:4;:50::i;27702:158::-;27775:4;27799:53;27807:3;-1:-1:-1;;;;;27827:23:0;;27799:7;:53::i;15238:453::-;15373:24;15400:25;15410:5;15417:7;15400:9;:25::i;:::-;15373:52;;-1:-1:-1;;15440:16:0;:37;15436:248;;15522:6;15502:16;:26;;15494:68;;;;-1:-1:-1;;;15494:68:0;;6930:2:1;15494:68:0;;;6912:21:1;6969:2;6949:18;;;6942:30;7008:31;6988:18;;;6981:59;7057:18;;15494:68:0;6728:353:1;15494:68:0;15606:51;15615:5;15622:7;15650:6;15631:16;:25;15606:8;:51::i;:::-;15362:329;15238:453;;;:::o;11848:671::-;-1:-1:-1;;;;;11979:18:0;;11971:68;;;;-1:-1:-1;;;11971:68:0;;7288:2:1;11971:68:0;;;7270:21:1;7327:2;7307:18;;;7300:30;7366:34;7346:18;;;7339:62;-1:-1:-1;;;7417:18:1;;;7410:35;7462:19;;11971:68:0;7086:401:1;11971:68:0;-1:-1:-1;;;;;12058:16:0;;12050:64;;;;-1:-1:-1;;;12050:64:0;;7694:2:1;12050:64:0;;;7676:21:1;7733:2;7713:18;;;7706:30;7772:34;7752:18;;;7745:62;-1:-1:-1;;;7823:18:1;;;7816:33;7866:19;;12050:64:0;7492:399:1;12050:64:0;-1:-1:-1;;;;;12200:15:0;;12178:19;12200:15;;;;;;;;;;;12234:21;;;;12226:72;;;;-1:-1:-1;;;12226:72:0;;8098:2:1;12226:72:0;;;8080:21:1;8137:2;8117:18;;;8110:30;8176:34;8156:18;;;8149:62;-1:-1:-1;;;8227:18:1;;;8220:36;8273:19;;12226:72:0;7896:402:1;12226:72:0;-1:-1:-1;;;;;12334:15:0;;;:9;:15;;;;;;;;;;;12352:20;;;12334:38;;12394:13;;;;;;;;:23;;12366:6;;12334:9;12394:23;;12366:6;;12394:23;:::i;:::-;;;;;;;;12450:2;-1:-1:-1;;;;;12435:26:0;12444:4;-1:-1:-1;;;;;12435:26:0;;12454:6;12435:26;;;;1391:25:1;;1379:2;1364:18;;1245:177;12435:26:0;;;;;;;;12474:37;16291:125;24063:120;24130:7;24157:3;:11;;24169:5;24157:18;;;;;;;;:::i;:::-;;;;;;;;;24150:25;;24063:120;;;;:::o;21289:414::-;21352:4;23482:19;;;:12;;;:19;;;;;;21369:327;;-1:-1:-1;21412:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;21595:18;;21573:19;;;:12;;;:19;;;;;;:40;;;;21628:11;;21369:327;-1:-1:-1;21679:5:0;21672:12;;21879:1420;21945:4;22084:19;;;:12;;;:19;;;;;;22120:15;;22116:1176;;22495:21;22519:14;22532:1;22519:10;:14;:::i;:::-;22568:18;;22495:38;;-1:-1:-1;22548:17:0;;22568:22;;22589:1;;22568:22;:::i;:::-;22548:42;;22624:13;22611:9;:26;22607:405;;22658:17;22678:3;:11;;22690:9;22678:22;;;;;;;;:::i;:::-;;;;;;;;;22658:42;;22832:9;22803:3;:11;;22815:13;22803:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;22917:23;;;:12;;;:23;;;;;:36;;;22607:405;23093:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23188:3;:12;;:19;23201:5;23188:19;;;;;;;;;;;23181:26;;;23231:4;23224:11;;;;;;;22116:1176;23275:5;23268:12;;;;;14:597:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:1;;723:42;;713:70;;779:1;776;769:12;713:70;616:173;;;:::o;794:254::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:1:o;1427:328::-;1504:6;1512;1520;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;1612:29;1631:9;1612:29;:::i;:::-;1602:39;;1660:38;1694:2;1683:9;1679:18;1660:38;:::i;:::-;1650:48;;1745:2;1734:9;1730:18;1717:32;1707:42;;1427:328;;;;;:::o;2157:186::-;2216:6;2269:2;2257:9;2248:7;2244:23;2240:32;2237:52;;;2285:1;2282;2275:12;2237:52;2308:29;2327:9;2308:29;:::i;2348:180::-;2407:6;2460:2;2448:9;2439:7;2435:23;2431:32;2428:52;;;2476:1;2473;2466:12;2428:52;-1:-1:-1;2499:23:1;;2348:180;-1:-1:-1;2348:180:1:o;2533:260::-;2601:6;2609;2662:2;2650:9;2641:7;2637:23;2633:32;2630:52;;;2678:1;2675;2668:12;2630:52;2701:29;2720:9;2701:29;:::i;:::-;2691:39;;2749:38;2783:2;2772:9;2768:18;2749:38;:::i;:::-;2739:48;;2533:260;;;;;:::o;2798:343::-;2864:6;2872;2925:2;2913:9;2904:7;2900:23;2896:32;2893:52;;;2941:1;2938;2931:12;2893:52;2964:29;2983:9;2964:29;:::i;:::-;2954:39;;3043:2;3032:9;3028:18;3015:32;3087:4;3080:5;3076:16;3069:5;3066:27;3056:55;;3107:1;3104;3097:12;3056:55;3130:5;3120:15;;;2798:343;;;;;:::o;3146:380::-;3225:1;3221:12;;;;3268;;;3289:61;;3343:4;3335:6;3331:17;3321:27;;3289:61;3396:2;3388:6;3385:14;3365:18;3362:38;3359:161;;3442:10;3437:3;3433:20;3430:1;3423:31;3477:4;3474:1;3467:15;3505:4;3502:1;3495:15;3359:161;;3146:380;;;:::o;3531:127::-;3592:10;3587:3;3583:20;3580:1;3573:31;3623:4;3620:1;3613:15;3647:4;3644:1;3637:15;3663:128;3703:3;3734:1;3730:6;3727:1;3724:13;3721:39;;;3740:18;;:::i;:::-;-1:-1:-1;3776:9:1;;3663:128::o;3796:356::-;3998:2;3980:21;;;4017:18;;;4010:30;4076:34;4071:2;4056:18;;4049:62;4143:2;4128:18;;3796:356::o;4970:127::-;5031:10;5026:3;5022:20;5019:1;5012:31;5062:4;5059:1;5052:15;5086:4;5083:1;5076:15;5102:453;-1:-1:-1;;;;;5320:32:1;;5302:51;;5290:2;5275:18;;5383:1;5372:13;;5362:144;;5428:10;5423:3;5419:20;5416:1;5409:31;5463:4;5460:1;5453:15;5491:4;5488:1;5481:15;5362:144;5542:6;5537:2;5526:9;5522:18;5515:34;5102:453;;;;;:::o;8303:127::-;8364:10;8359:3;8355:20;8352:1;8345:31;8395:4;8392:1;8385:15;8419:4;8416:1;8409:15;8435:125;8475:4;8503:1;8500;8497:8;8494:34;;;8508:18;;:::i;:::-;-1:-1:-1;8545:9:1;;8435:125::o;8565:127::-;8626:10;8621:3;8617:20;8614:1;8607:31;8657:4;8654:1;8647:15;8681:4;8678:1;8671:15

Swarm Source

ipfs://6c63391392e75a2aee016057f59e817444dc84cd6cac72a1cc47394c919c994e
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.