ETH Price: $3,441.29 (-1.14%)
Gas: 10 Gwei

Token

Jelly Token (JELLY)
 

Overview

Max Total Supply

431,038,446 JELLY

Holders

258 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
425.043426227893373229 JELLY

Value
$0.00
0xf02df97ea80e4b00f4ad077cef7e349202686a8f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Jelly is a community driven protocol for distributing token rewards.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Jelly

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-28
*/

pragma solidity 0.8.6;

/**
* @title Jelly Token:
*     
*              ,,,,
*            g@@@@@@K
*           ]@@@@@@@@P
*            $@@@@@@@"                   ]@@@  ]@@@
*             "*NNM"                     ]@@@  ]@@@
*                                        ]@@@  ]@@@
*             ,g@@@g        ,,gg@gg,     ]@@@  ]@@@ ,ggg          ,ggg
*            @@@@@@@@p    g@@@BPMBB@@W   ]@@@  ]@@@  $@@@        ,@@@P
*           ]@@@@@@@@@   @@@P      ]@@@  ]@@@  ]@@@   $@@g      ,@@@P
*           ]@@@@@@@@@  $@@D,,,,,,,,]@@@ ]@@@  ]@@@   '@@@p     @@@C
*           ]@@@@@@@@@  @@@@NNNNNNNNNNNN ]@@@  ]@@@    "@@@p   @@@P
*           ]@@@@@@@@@  ]@@K             ]@@@  ]@@@     '@@@, @@@P
*            @@@@@@@@@   %@@@,    ,g@@@  ]@@@  ]@@@      ^@@@@@@C
*            "@@@@@@@@    "N@@@@@@@@N*   ]@@@  ]@@@       "*@@@P
*             "B@@@@@@        "**""       '''   '''        @@@P
*    ,gg@@g    "B@@@P                                     @@@P
*   @@@@@@@@p    B@@'                                    @@@P
*   @@@@@@@@P    ]@h                                    RNNP
*   'B@@@@@@     $P
*       "NE@@@p"'          
*         
*
*/

/** 
* @author ProfWobble & Jiggle
* @dev
*  - Ability for holders to burn (destroy) their tokens
*  - Minter role that allows for token minting
*  - Token transfers paused on deployment (Jelly not set yet!). 
*  - An operator role that allows for transfers of unset tokens.
*  - SetJelly() function that allows $JELLY to transfer when ready. 
*
*/



/**
 * @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 External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);

    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

    function renounceRole(bytes32 role, address account) external;
}


/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface OZIERC20 {
    /**
     * @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);
}


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// Part: IERC20Metadata

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is OZIERC20 {
    /**
     * @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);
}


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


/**
 * @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, OZIERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    // PW: Changed to internal here to be able to setJelly()
    string internal _name;
    string internal _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 {}
}


contract JellyAdminAccess is AccessControl {

    /// @dev Whether access is initialised.
    bool private initAccess;

    /// @notice Events for adding and removing various roles.
    event AdminRoleGranted(
        address indexed beneficiary,
        address indexed caller
    );

    event AdminRoleRemoved(
        address indexed beneficiary,
        address indexed caller
    );


    /// @notice The deployer is automatically given the admin role which will allow them to then grant roles to other addresses.
    constructor() {
        initAccessControls(_msgSender());
    }

    /**
     * @notice Initializes access controls.
     * @param _admin Admins address.
     */
    function initAccessControls(address _admin) public {
        require(!initAccess, "Already initialised");
        _setupRole(DEFAULT_ADMIN_ROLE, _admin);
        initAccess = true;
    }

    /////////////
    // Lookups //
    /////////////

    /**
     * @notice Used to check whether an address has the admin role.
     * @param _address EOA or contract being checked.
     * @return bool True if the account has the role or false if it does not.
     */
    function hasAdminRole(address _address) public  view returns (bool) {
        return hasRole(DEFAULT_ADMIN_ROLE, _address);
    }

    ///////////////
    // Modifiers //
    ///////////////

    /**
     * @notice Grants the admin role to an address.
     * @dev The sender must have the admin role.
     * @param _address EOA or contract receiving the new role.
     */
    function addAdminRole(address _address) external {
        grantRole(DEFAULT_ADMIN_ROLE, _address);
        emit AdminRoleGranted(_address, _msgSender());
    }

    /**
     * @notice Removes the admin role from an address.
     * @dev The sender must have the admin role.
     * @param _address EOA or contract affected.
     */
    function removeAdminRole(address _address) external {
        revokeRole(DEFAULT_ADMIN_ROLE, _address);
        emit AdminRoleRemoved(_address, _msgSender());
    }
}


contract JellyOperatorAccess is JellyAdminAccess {
    /// @notice Role definitions
    bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");

    /// @notice Events for adding and removing various roles

    event OperatorRoleGranted(
        address indexed beneficiary,
        address indexed caller
    );

    event OperatorRoleRemoved(
        address indexed beneficiary,
        address indexed caller
    );


    constructor()  {
    }


    /////////////
    // Lookups //
    /////////////

    /**
     * @notice Used to check whether an address has the operator role
     * @param _address EOA or contract being checked
     * @return bool True if the account has the role or false if it does not
     */
    function hasOperatorRole(address _address) public view returns (bool) {
        return hasRole(OPERATOR_ROLE, _address);
    }

    ///////////////
    // Modifiers //
    ///////////////

    /**
     * @notice Grants the operator role to an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract receiving the new role
     */
    function addOperatorRole(address _address) external {
        grantRole(OPERATOR_ROLE, _address);
        emit OperatorRoleGranted(_address, _msgSender());
    }

    /**
     * @notice Removes the operator role from an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract affected
     */
    function removeOperatorRole(address _address) external {
        revokeRole(OPERATOR_ROLE, _address);
        emit OperatorRoleRemoved(_address, _msgSender());
    }


}


contract JellyMinterAccess is JellyOperatorAccess {
    /// @notice Role definitions
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    /// @notice Events for adding and removing various roles

    event MinterRoleGranted(
        address indexed beneficiary,
        address indexed caller
    );

    event MinterRoleRemoved(
        address indexed beneficiary,
        address indexed caller
    );

    constructor()  {
    }


    /////////////
    // Lookups //
    /////////////

    /**
     * @notice Used to check whether an address has the minter role
     * @param _address EOA or contract being checked
     * @return bool True if the account has the role or false if it does not
     */
    function hasMinterRole(address _address) public view returns (bool) {
        return hasRole(MINTER_ROLE, _address);
    }

    ///////////////
    // Modifiers //
    ///////////////

    /**
     * @notice Grants the minter role to an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract receiving the new role
     */
    function addMinterRole(address _address) external {
        grantRole(MINTER_ROLE, _address);
        emit MinterRoleGranted(_address, _msgSender());
    }

    /**
     * @notice Removes the minter role from an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract affected
     */
    function removeMinterRole(address _address) external {
        revokeRole(MINTER_ROLE, _address);
        emit MinterRoleRemoved(_address, _msgSender());
    }


}

/**
 * @dev Jelly {ERC20} token:
 *
 *  - A minter role that allows for token minting
 *  - Ability for holders to burn (destroy) their tokens
 *  - Token transfers paused on deployment (unset jelly). 
 *  - An operator role that allows for transfers of unset tokens.
 *  - SetJelly() function that allows for $JELLY to trade freely. 
 *
 */

contract Jelly is ERC20, Pausable, JellyMinterAccess {

    uint public cap;
    event CapUpdated(uint256 cap);
    event JellySet();

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE` to the account that deploys the contract 
     *      and `OPERATOR_ROLE` to the vault to be able to move those tokens.
    */
    constructor(string memory _name, string memory _symbol, address _vault, uint256 _initialSupply, uint256 _cap) ERC20(_name,_symbol) {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(OPERATOR_ROLE, _vault);
        require(_cap >= _initialSupply, "Cap exceeded");
        cap = _cap;
        _mint(_vault, _initialSupply);
        _pause();
    }

    /**
     * @dev Serves $JELLY when the time is just right.
     */
    function setJelly() external {
        require(
            hasAdminRole(_msgSender()),
            "JELLY.setJelly: Sender must be admin"
        );
        _unpause();
        emit JellySet();
    }

    /**
     * @dev Sets the hard cap on token supply. 
     */
    function setCap(uint _cap) external  {
        require(
            hasAdminRole(_msgSender()),
            "JELLY.setCap: Sender must be admin"
        );
        require( _cap >= totalSupply(), "JELLY: Cap less than totalSupply");
        cap = _cap;
        emit CapUpdated(cap);
    }

    /**
     * @dev Checks if Jelly is ready yet. 
     */
    function canTransfer(
        address _from
    ) external view returns (bool _status) {
        return (!paused() || hasOperatorRole(_msgSender()));
    }

    /**
     * @dev Returns the amount a user is permitted to mint. 
     */
    function availableToMint() external view returns (uint256 tokens) {
        if (hasMinterRole(_msgSender())) {
            if (cap > 0) {
                tokens = cap - totalSupply();
            } 
        } 
    }

    /**
     * @dev Creates `amount` new tokens for `to`.
     */
    function mint(address to, uint256 amount) public {
        require(to != address(0), "JELLY: no mint to zero address");
        require(hasMinterRole(_msgSender()), "JELLY: must have minter role to mint");
        require(totalSupply() + amount <= cap, "Cap exceeded");
        _mint(to, amount);
    }

    /**
     * @dev Destroys `amount` tokens from the caller.
     */
    function burn(uint256 amount) public {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     *      allowance.
     */
    function burnFrom(address account, uint256 amount) public {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "JELLY: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }

    /**
     * @dev Requires hasOperatorRole for token transfers before Jelly has been set. 
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (paused()) {
            require(hasOperatorRole(_msgSender()), "JELLY: tokens cannot be transferred until setJelly has been executed");
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"uint256","name":"_cap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"AdminRoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"AdminRoleRemoved","type":"event"},{"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":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"CapUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"JellySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"MinterRoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"MinterRoleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"OperatorRoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"OperatorRoleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addOperatorRole","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":[],"name":"availableToMint","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"view","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":"address","name":"_from","type":"address"}],"name":"canTransfer","outputs":[{"internalType":"bool","name":"_status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasAdminRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasMinterRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasOperatorRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_admin","type":"address"}],"name":"initAccessControls","outputs":[],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setJelly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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"}]

60806040523480156200001157600080fd5b5060405162002283380380620022838339810160408190526200003491620005f5565b8451859085906200004d90600390602085019062000498565b5080516200006390600490602084019062000498565b50506005805460ff19169055506200007b336200011f565b6200008860003362000191565b620000b47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298462000191565b81811015620000f95760405162461bcd60e51b815260206004820152600c60248201526b10d85c08195e18d95959195960a21b60448201526064015b60405180910390fd5b60088190556200010a8383620001a1565b6200011462000294565b50505050506200070d565b60075460ff1615620001745760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c69736564000000000000000000000000006044820152606401620000f0565b6200018160008262000191565b506007805460ff19166001179055565b6200019d82826200032f565b5050565b6001600160a01b038216620001f95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620000f0565b6200020760008383620003d3565b80600260008282546200021b919062000693565b90915550506001600160a01b038216600090815260208190526040812080548392906200024a90849062000693565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60055460ff1615620002dc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620000f0565b6005805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003123390565b6040516001600160a01b03909116815260200160405180910390a1565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff166200019d5760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200038f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60055460ff161562000493573360009081527f61f0f4fc423bfa88e8d2f029f9b768dd4a7c569ac8e600b83668449acadcfc5a602052604090205460ff16620004935760405162461bcd60e51b8152602060048201526044602482018190527f4a454c4c593a20746f6b656e732063616e6e6f74206265207472616e73666572908201527f72656420756e74696c207365744a656c6c7920686173206265656e20657865636064820152631d5d195960e21b608482015260a401620000f0565b505050565b828054620004a690620006ba565b90600052602060002090601f016020900481019282620004ca576000855562000515565b82601f10620004e557805160ff191683800117855562000515565b8280016001018555821562000515579182015b8281111562000515578251825591602001919060010190620004f8565b506200052392915062000527565b5090565b5b8082111562000523576000815560010162000528565b600082601f8301126200055057600080fd5b81516001600160401b03808211156200056d576200056d620006f7565b604051601f8301601f19908116603f01168101908282118183101715620005985762000598620006f7565b81604052838152602092508683858801011115620005b557600080fd5b600091505b83821015620005d95785820183015181830184015290820190620005ba565b83821115620005eb5760008385830101525b9695505050505050565b600080600080600060a086880312156200060e57600080fd5b85516001600160401b03808211156200062657600080fd5b6200063489838a016200053e565b965060208801519150808211156200064b57600080fd5b506200065a888289016200053e565b604088015190955090506001600160a01b03811681146200067a57600080fd5b6060870151608090970151959894975095949392505050565b60008219821115620006b557634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620006cf57607f821691505b60208210811415620006f157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611b66806200071d6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806374601c3c1161013b578063adbf3776116100b8578063dccfe3101161007c578063dccfe310146104c6578063dd62ed3e146104d9578063e6594abd14610512578063f5b541a614610525578063fc4e3e0a1461053a57600080fd5b8063adbf377614610465578063b7928b1d14610478578063c395fcb31461048b578063d53913931461049e578063d547741f146104b357600080fd5b806395d89b41116100ff57806395d89b4114610427578063996fa3e11461042f578063a217fddf14610437578063a457c2d71461043f578063a9059cbb1461045257600080fd5b806374601c3c146103d357806378fc3cb3146103db57806379cc6790146103ee57806391d14854146104015780639478941c1461041457600080fd5b8063355274ea116101c957806347786d371161018d57806347786d371461036657806354f1e126146103795780635c975abb1461038c5780636595171c1461039757806370a08231146103aa57600080fd5b8063355274ea1461031157806336568abe1461031a578063395093511461032d57806340c10f191461034057806342966c681461035357600080fd5b806318160ddd1161021057806318160ddd146102a557806323b872dd146102b7578063248a9ca3146102ca5780632f2ff15d146102ed578063313ce5671461030257600080fd5b806301ffc9a71461024257806306fdde031461026a578063095ea7b31461027f578063099db01714610292575b600080fd5b610255610250366004611910565b61054d565b60405190151581526020015b60405180910390f35b610272610584565b60405161026191906119af565b61025561028d3660046118aa565b610616565b6102556102a0366004611820565b61062c565b6002545b604051908152602001610261565b6102556102c536600461186e565b610646565b6102a96102d83660046118d4565b60009081526006602052604090206001015490565b6103006102fb3660046118ed565b6106f5565b005b60405160128152602001610261565b6102a960085481565b6103006103283660046118ed565b610720565b61025561033b3660046118aa565b61079e565b61030061034e3660046118aa565b6107da565b6103006103613660046118d4565b6108ef565b6103006103743660046118d4565b6108fc565b610300610387366004611820565b6109e9565b60055460ff16610255565b6103006103a5366004611820565b610a3a565b6102a96103b8366004611820565b6001600160a01b031660009081526020819052604090205490565b6102a9610a7e565b6102556103e9366004611820565b610aac565b6103006103fc3660046118aa565b610aca565b61025561040f3660046118ed565b610b4b565b610300610422366004611820565b610b76565b610272610bc7565b610300610bd6565b6102a9600081565b61025561044d3660046118aa565b610c6a565b6102556104603660046118aa565b610d03565b610300610473366004611820565b610d10565b610300610486366004611820565b610d61565b610255610499366004611820565b610db2565b6102a9600080516020611b1183398151915281565b6103006104c13660046118ed565b610dbe565b6103006104d4366004611820565b610de4565b6102a96104e736600461183b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610300610520366004611820565b610e28565b6102a9600080516020611af183398151915281565b610255610548366004611820565b610e8c565b60006001600160e01b03198216637965db0b60e01b148061057e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461059390611a73565b80601f01602080910402602001604051908101604052809291908181526020018280546105bf90611a73565b801561060c5780601f106105e15761010080835404028352916020019161060c565b820191906000526020600020905b8154815290600101906020018083116105ef57829003601f168201915b5050505050905090565b6000610623338484610ea6565b50600192915050565b600061057e600080516020611b1183398151915283610b4b565b6000610653848484610fca565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106dd5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106ea8533858403610ea6565b506001949350505050565b60008281526006602052604090206001015461071181336111a5565b61071b8383611209565b505050565b6001600160a01b03811633146107905760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016106d4565b61079a828261128f565b5050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106239185906107d59086906119e2565b610ea6565b6001600160a01b0382166108305760405162461bcd60e51b815260206004820152601e60248201527f4a454c4c593a206e6f206d696e7420746f207a65726f2061646472657373000060448201526064016106d4565b6108393361062c565b6108915760405162461bcd60e51b8152602060048201526024808201527f4a454c4c593a206d7573742068617665206d696e74657220726f6c6520746f206044820152631b5a5b9d60e21b60648201526084016106d4565b6008548161089e60025490565b6108a891906119e2565b11156108e55760405162461bcd60e51b815260206004820152600c60248201526b10d85c08195e18d95959195960a21b60448201526064016106d4565b61079a82826112f6565b6108f933826113e1565b50565b61090533610db2565b61095c5760405162461bcd60e51b815260206004820152602260248201527f4a454c4c592e7365744361703a2053656e646572206d7573742062652061646d60448201526134b760f11b60648201526084016106d4565b6002548110156109ae5760405162461bcd60e51b815260206004820181905260248201527f4a454c4c593a20436170206c657373207468616e20746f74616c537570706c7960448201526064016106d4565b60088190556040518181527f3c8eb7c49d332f4c1e4d92a27cda93c31cc9452f7a408e0c6109fcddbc9946ea9060200160405180910390a150565b610a01600080516020611b1183398151915282610dbe565b60405133906001600160a01b038316907f56692a161ffec953ddf9def93b958ea8d1ec95e21b80870c66be91a4374dc4e390600090a350565b610a456000826106f5565b60405133906001600160a01b038316907f2570ac42fd8b322dc453ada624dc2ed0e9bdd67f16f201a25bbd30468f2aa18790600090a350565b6000610a893361062c565b15610aa95760085415610aa957600254600854610aa69190611a19565b90505b90565b6000610aba60055460ff1690565b158061057e575061057e33610e8c565b6000610ad683336104e7565b905081811015610b345760405162461bcd60e51b8152602060048201526024808201527f4a454c4c593a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016106d4565b610b418333848403610ea6565b61071b83836113e1565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610b8e600080516020611af183398151915282610dbe565b60405133906001600160a01b038316907f70b25138b6fadeb9992d18b9653564271823e34b3e3257515d12a6d4b15fcddf90600090a350565b60606004805461059390611a73565b610bdf33610db2565b610c375760405162461bcd60e51b8152602060048201526024808201527f4a454c4c592e7365744a656c6c793a2053656e646572206d75737420626520616044820152633236b4b760e11b60648201526084016106d4565b610c3f61153b565b6040517ff8cae5c6689c0438a60eefc96cc182e609e583494ec7611e57ef82f651888f0c90600090a1565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610cec5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106d4565b610cf93385858403610ea6565b5060019392505050565b6000610623338484610fca565b610d28600080516020611b11833981519152826106f5565b60405133906001600160a01b038316907f0be6ab9784c7401fafb73f7bc47bc67cc4ef8c47a60ad3cb66d1de0353a0784c90600090a350565b610d79600080516020611af1833981519152826106f5565b60405133906001600160a01b038316907f2d45ee102874989882745a26688d0b4fffee125a18df26536b12582c7fde4e1790600090a350565b600061057e8183610b4b565b600082815260066020526040902060010154610dda81336111a5565b61071b838361128f565b610def600082610dbe565b60405133906001600160a01b038316907f21ba1239795d4e22874e3dc55f0a9d7b65bfb23069d32965d7c23be9524ccf9590600090a350565b60075460ff1615610e715760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5cd959606a1b60448201526064016106d4565b610e7c6000826115c3565b506007805460ff19166001179055565b600061057e600080516020611af183398151915283610b4b565b6001600160a01b038316610f085760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106d4565b6001600160a01b038216610f695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106d4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661102e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106d4565b6001600160a01b0382166110905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106d4565b61109b8383836115cd565b6001600160a01b038316600090815260208190526040902054818110156111135760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106d4565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061114a9084906119e2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161119691815260200190565b60405180910390a35b50505050565b6111af8282610b4b565b61079a576111c7816001600160a01b03166014611661565b6111d2836020611661565b6040516020016111e392919061193a565b60408051601f198184030181529082905262461bcd60e51b82526106d4916004016119af565b6112138282610b4b565b61079a5760008281526006602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561124b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6112998282610b4b565b1561079a5760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b03821661134c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106d4565b611358600083836115cd565b806002600082825461136a91906119e2565b90915550506001600160a01b038216600090815260208190526040812080548392906113979084906119e2565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166114415760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106d4565b61144d826000836115cd565b6001600160a01b038216600090815260208190526040902054818110156114c15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106d4565b6001600160a01b03831660009081526020819052604081208383039055600280548492906114f0908490611a19565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055460ff166115845760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106d4565b6005805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b61079a8282611209565b60055460ff161561071b576115e133610e8c565b61071b5760405162461bcd60e51b8152602060048201526044602482018190527f4a454c4c593a20746f6b656e732063616e6e6f74206265207472616e73666572908201527f72656420756e74696c207365744a656c6c7920686173206265656e20657865636064820152631d5d195960e21b608482015260a4016106d4565b606060006116708360026119fa565b61167b9060026119e2565b67ffffffffffffffff81111561169357611693611ada565b6040519080825280601f01601f1916602001820160405280156116bd576020820181803683370190505b509050600360fc1b816000815181106116d8576116d8611ac4565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061170757611707611ac4565b60200101906001600160f81b031916908160001a905350600061172b8460026119fa565b6117369060016119e2565b90505b60018111156117ae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061176a5761176a611ac4565b1a60f81b82828151811061178057611780611ac4565b60200101906001600160f81b031916908160001a90535060049490941c936117a781611a5c565b9050611739565b5083156117fd5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106d4565b9392505050565b80356001600160a01b038116811461181b57600080fd5b919050565b60006020828403121561183257600080fd5b6117fd82611804565b6000806040838503121561184e57600080fd5b61185783611804565b915061186560208401611804565b90509250929050565b60008060006060848603121561188357600080fd5b61188c84611804565b925061189a60208501611804565b9150604084013590509250925092565b600080604083850312156118bd57600080fd5b6118c683611804565b946020939093013593505050565b6000602082840312156118e657600080fd5b5035919050565b6000806040838503121561190057600080fd5b8235915061186560208401611804565b60006020828403121561192257600080fd5b81356001600160e01b0319811681146117fd57600080fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611972816017850160208801611a30565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516119a3816028840160208801611a30565b01602801949350505050565b60208152600082518060208401526119ce816040850160208701611a30565b601f01601f19169190910160400192915050565b600082198211156119f5576119f5611aae565b500190565b6000816000190483118215151615611a1457611a14611aae565b500290565b600082821015611a2b57611a2b611aae565b500390565b60005b83811015611a4b578181015183820152602001611a33565b8381111561119f5750506000910152565b600081611a6b57611a6b611aae565b506000190190565b600181811c90821680611a8757607f821691505b60208210811415611aa857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9299f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212200f11667a9fa29c4dc807e2afaad0db4abef4cc3600dffdb6a370dfc01a37deb764736f6c6343000806003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005aae9bbbd739216766de5c6d714c2bcb9e03e11f0000000000000000000000000000000000000000001f04ef12cb04cf158000000000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000000000000000000000000000000000000000000b4a656c6c7920546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a454c4c59000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806374601c3c1161013b578063adbf3776116100b8578063dccfe3101161007c578063dccfe310146104c6578063dd62ed3e146104d9578063e6594abd14610512578063f5b541a614610525578063fc4e3e0a1461053a57600080fd5b8063adbf377614610465578063b7928b1d14610478578063c395fcb31461048b578063d53913931461049e578063d547741f146104b357600080fd5b806395d89b41116100ff57806395d89b4114610427578063996fa3e11461042f578063a217fddf14610437578063a457c2d71461043f578063a9059cbb1461045257600080fd5b806374601c3c146103d357806378fc3cb3146103db57806379cc6790146103ee57806391d14854146104015780639478941c1461041457600080fd5b8063355274ea116101c957806347786d371161018d57806347786d371461036657806354f1e126146103795780635c975abb1461038c5780636595171c1461039757806370a08231146103aa57600080fd5b8063355274ea1461031157806336568abe1461031a578063395093511461032d57806340c10f191461034057806342966c681461035357600080fd5b806318160ddd1161021057806318160ddd146102a557806323b872dd146102b7578063248a9ca3146102ca5780632f2ff15d146102ed578063313ce5671461030257600080fd5b806301ffc9a71461024257806306fdde031461026a578063095ea7b31461027f578063099db01714610292575b600080fd5b610255610250366004611910565b61054d565b60405190151581526020015b60405180910390f35b610272610584565b60405161026191906119af565b61025561028d3660046118aa565b610616565b6102556102a0366004611820565b61062c565b6002545b604051908152602001610261565b6102556102c536600461186e565b610646565b6102a96102d83660046118d4565b60009081526006602052604090206001015490565b6103006102fb3660046118ed565b6106f5565b005b60405160128152602001610261565b6102a960085481565b6103006103283660046118ed565b610720565b61025561033b3660046118aa565b61079e565b61030061034e3660046118aa565b6107da565b6103006103613660046118d4565b6108ef565b6103006103743660046118d4565b6108fc565b610300610387366004611820565b6109e9565b60055460ff16610255565b6103006103a5366004611820565b610a3a565b6102a96103b8366004611820565b6001600160a01b031660009081526020819052604090205490565b6102a9610a7e565b6102556103e9366004611820565b610aac565b6103006103fc3660046118aa565b610aca565b61025561040f3660046118ed565b610b4b565b610300610422366004611820565b610b76565b610272610bc7565b610300610bd6565b6102a9600081565b61025561044d3660046118aa565b610c6a565b6102556104603660046118aa565b610d03565b610300610473366004611820565b610d10565b610300610486366004611820565b610d61565b610255610499366004611820565b610db2565b6102a9600080516020611b1183398151915281565b6103006104c13660046118ed565b610dbe565b6103006104d4366004611820565b610de4565b6102a96104e736600461183b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610300610520366004611820565b610e28565b6102a9600080516020611af183398151915281565b610255610548366004611820565b610e8c565b60006001600160e01b03198216637965db0b60e01b148061057e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461059390611a73565b80601f01602080910402602001604051908101604052809291908181526020018280546105bf90611a73565b801561060c5780601f106105e15761010080835404028352916020019161060c565b820191906000526020600020905b8154815290600101906020018083116105ef57829003601f168201915b5050505050905090565b6000610623338484610ea6565b50600192915050565b600061057e600080516020611b1183398151915283610b4b565b6000610653848484610fca565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156106dd5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106ea8533858403610ea6565b506001949350505050565b60008281526006602052604090206001015461071181336111a5565b61071b8383611209565b505050565b6001600160a01b03811633146107905760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016106d4565b61079a828261128f565b5050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106239185906107d59086906119e2565b610ea6565b6001600160a01b0382166108305760405162461bcd60e51b815260206004820152601e60248201527f4a454c4c593a206e6f206d696e7420746f207a65726f2061646472657373000060448201526064016106d4565b6108393361062c565b6108915760405162461bcd60e51b8152602060048201526024808201527f4a454c4c593a206d7573742068617665206d696e74657220726f6c6520746f206044820152631b5a5b9d60e21b60648201526084016106d4565b6008548161089e60025490565b6108a891906119e2565b11156108e55760405162461bcd60e51b815260206004820152600c60248201526b10d85c08195e18d95959195960a21b60448201526064016106d4565b61079a82826112f6565b6108f933826113e1565b50565b61090533610db2565b61095c5760405162461bcd60e51b815260206004820152602260248201527f4a454c4c592e7365744361703a2053656e646572206d7573742062652061646d60448201526134b760f11b60648201526084016106d4565b6002548110156109ae5760405162461bcd60e51b815260206004820181905260248201527f4a454c4c593a20436170206c657373207468616e20746f74616c537570706c7960448201526064016106d4565b60088190556040518181527f3c8eb7c49d332f4c1e4d92a27cda93c31cc9452f7a408e0c6109fcddbc9946ea9060200160405180910390a150565b610a01600080516020611b1183398151915282610dbe565b60405133906001600160a01b038316907f56692a161ffec953ddf9def93b958ea8d1ec95e21b80870c66be91a4374dc4e390600090a350565b610a456000826106f5565b60405133906001600160a01b038316907f2570ac42fd8b322dc453ada624dc2ed0e9bdd67f16f201a25bbd30468f2aa18790600090a350565b6000610a893361062c565b15610aa95760085415610aa957600254600854610aa69190611a19565b90505b90565b6000610aba60055460ff1690565b158061057e575061057e33610e8c565b6000610ad683336104e7565b905081811015610b345760405162461bcd60e51b8152602060048201526024808201527f4a454c4c593a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016106d4565b610b418333848403610ea6565b61071b83836113e1565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610b8e600080516020611af183398151915282610dbe565b60405133906001600160a01b038316907f70b25138b6fadeb9992d18b9653564271823e34b3e3257515d12a6d4b15fcddf90600090a350565b60606004805461059390611a73565b610bdf33610db2565b610c375760405162461bcd60e51b8152602060048201526024808201527f4a454c4c592e7365744a656c6c793a2053656e646572206d75737420626520616044820152633236b4b760e11b60648201526084016106d4565b610c3f61153b565b6040517ff8cae5c6689c0438a60eefc96cc182e609e583494ec7611e57ef82f651888f0c90600090a1565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610cec5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106d4565b610cf93385858403610ea6565b5060019392505050565b6000610623338484610fca565b610d28600080516020611b11833981519152826106f5565b60405133906001600160a01b038316907f0be6ab9784c7401fafb73f7bc47bc67cc4ef8c47a60ad3cb66d1de0353a0784c90600090a350565b610d79600080516020611af1833981519152826106f5565b60405133906001600160a01b038316907f2d45ee102874989882745a26688d0b4fffee125a18df26536b12582c7fde4e1790600090a350565b600061057e8183610b4b565b600082815260066020526040902060010154610dda81336111a5565b61071b838361128f565b610def600082610dbe565b60405133906001600160a01b038316907f21ba1239795d4e22874e3dc55f0a9d7b65bfb23069d32965d7c23be9524ccf9590600090a350565b60075460ff1615610e715760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5cd959606a1b60448201526064016106d4565b610e7c6000826115c3565b506007805460ff19166001179055565b600061057e600080516020611af183398151915283610b4b565b6001600160a01b038316610f085760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106d4565b6001600160a01b038216610f695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106d4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661102e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106d4565b6001600160a01b0382166110905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106d4565b61109b8383836115cd565b6001600160a01b038316600090815260208190526040902054818110156111135760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106d4565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061114a9084906119e2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161119691815260200190565b60405180910390a35b50505050565b6111af8282610b4b565b61079a576111c7816001600160a01b03166014611661565b6111d2836020611661565b6040516020016111e392919061193a565b60408051601f198184030181529082905262461bcd60e51b82526106d4916004016119af565b6112138282610b4b565b61079a5760008281526006602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561124b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6112998282610b4b565b1561079a5760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b03821661134c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106d4565b611358600083836115cd565b806002600082825461136a91906119e2565b90915550506001600160a01b038216600090815260208190526040812080548392906113979084906119e2565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166114415760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106d4565b61144d826000836115cd565b6001600160a01b038216600090815260208190526040902054818110156114c15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106d4565b6001600160a01b03831660009081526020819052604081208383039055600280548492906114f0908490611a19565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055460ff166115845760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106d4565b6005805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b61079a8282611209565b60055460ff161561071b576115e133610e8c565b61071b5760405162461bcd60e51b8152602060048201526044602482018190527f4a454c4c593a20746f6b656e732063616e6e6f74206265207472616e73666572908201527f72656420756e74696c207365744a656c6c7920686173206265656e20657865636064820152631d5d195960e21b608482015260a4016106d4565b606060006116708360026119fa565b61167b9060026119e2565b67ffffffffffffffff81111561169357611693611ada565b6040519080825280601f01601f1916602001820160405280156116bd576020820181803683370190505b509050600360fc1b816000815181106116d8576116d8611ac4565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061170757611707611ac4565b60200101906001600160f81b031916908160001a905350600061172b8460026119fa565b6117369060016119e2565b90505b60018111156117ae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061176a5761176a611ac4565b1a60f81b82828151811061178057611780611ac4565b60200101906001600160f81b031916908160001a90535060049490941c936117a781611a5c565b9050611739565b5083156117fd5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106d4565b9392505050565b80356001600160a01b038116811461181b57600080fd5b919050565b60006020828403121561183257600080fd5b6117fd82611804565b6000806040838503121561184e57600080fd5b61185783611804565b915061186560208401611804565b90509250929050565b60008060006060848603121561188357600080fd5b61188c84611804565b925061189a60208501611804565b9150604084013590509250925092565b600080604083850312156118bd57600080fd5b6118c683611804565b946020939093013593505050565b6000602082840312156118e657600080fd5b5035919050565b6000806040838503121561190057600080fd5b8235915061186560208401611804565b60006020828403121561192257600080fd5b81356001600160e01b0319811681146117fd57600080fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611972816017850160208801611a30565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516119a3816028840160208801611a30565b01602801949350505050565b60208152600082518060208401526119ce816040850160208701611a30565b601f01601f19169190910160400192915050565b600082198211156119f5576119f5611aae565b500190565b6000816000190483118215151615611a1457611a14611aae565b500290565b600082821015611a2b57611a2b611aae565b500390565b60005b83811015611a4b578181015183820152602001611a33565b8381111561119f5750506000910152565b600081611a6b57611a6b611aae565b506000190190565b600181811c90821680611a8757607f821691505b60208210811415611aa857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9299f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a26469706673582212200f11667a9fa29c4dc807e2afaad0db4abef4cc3600dffdb6a370dfc01a37deb764736f6c63430008060033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005aae9bbbd739216766de5c6d714c2bcb9e03e11f0000000000000000000000000000000000000000001f04ef12cb04cf158000000000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000000000000000000000000000000000000000000b4a656c6c7920546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a454c4c59000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Jelly Token
Arg [1] : _symbol (string): JELLY
Arg [2] : _vault (address): 0x5AAE9bBBd739216766de5c6D714C2bCb9e03E11F
Arg [3] : _initialSupply (uint256): 37500000000000000000000000
Arg [4] : _cap (uint256): 1000000000000000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000005aae9bbbd739216766de5c6d714c2bcb9e03e11f
Arg [3] : 0000000000000000000000000000000000000000001f04ef12cb04cf15800000
Arg [4] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [6] : 4a656c6c7920546f6b656e000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 4a454c4c59000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37828:3346:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15410:204;;;;;;:::i;:::-;;:::i;:::-;;;3324:14:1;;3317:22;3299:41;;3287:2;3272:18;15410:204:0;;;;;;;;22078:100;;;:::i;:::-;;;;;;;:::i;24245:169::-;;;;;;:::i;:::-;;:::i;36583:124::-;;;;;;:::i;:::-;;:::i;23198:108::-;23286:12;;23198:108;;;3497:25:1;;;3485:2;3470:18;23198:108:0;3452:76:1;24896:492:0;;;;;;:::i;:::-;;:::i;16821:123::-;;;;;;:::i;:::-;16887:7;16914:12;;;:6;:12;;;;;:22;;;;16821:123;17206:147;;;;;;:::i;:::-;;:::i;:::-;;23040:93;;;23123:2;12880:36:1;;12868:2;12853:18;23040:93:0;12835:87:1;37890:15:0;;;;;;18254:218;;;;;;:::i;:::-;;:::i;25797:215::-;;;;;;:::i;:::-;;:::i;39803:307::-;;;;;;:::i;:::-;;:::i;40191:83::-;;;;;;:::i;:::-;;:::i;38892:296::-;;;;;;:::i;:::-;;:::i;37301:162::-;;;;;;:::i;:::-;;:::i;10694:86::-;10765:7;;;;10694:86;;33624:163;;;;;;:::i;:::-;;:::i;23369:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23470:18:0;23443:7;23470:18;;;;;;;;;;;;23369:127;39505:221;;;:::i;39258:159::-;;;;;;:::i;:::-;;:::i;40406:360::-;;;;;;:::i;:::-;;:::i;15706:139::-;;;;;;:::i;:::-;;:::i;35645:168::-;;;;;;:::i;:::-;;:::i;22297:104::-;;;:::i;38610:207::-;;;:::i;13684:49::-;;13729:4;13684:49;;26515:413;;;;;;:::i;:::-;;:::i;23709:175::-;;;;;;:::i;:::-;;:::i;36963:158::-;;;;;;:::i;:::-;;:::i;35299:164::-;;;;;;:::i;:::-;;:::i;33235:131::-;;;;;;:::i;:::-;;:::i;35917:62::-;;-1:-1:-1;;;;;;;;;;;35917:62:0;;17598:149;;;;;;:::i;:::-;;:::i;33969:167::-;;;;;;:::i;:::-;;:::i;23947:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24063:18:0;;;24036:7;24063:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23947:151;32757:190;;;;;;:::i;:::-;;:::i;34235:66::-;;-1:-1:-1;;;;;;;;;;;34235:66:0;;34913:128;;;;;;:::i;:::-;;:::i;15410:204::-;15495:4;-1:-1:-1;;;;;;15519:47:0;;-1:-1:-1;;;15519:47:0;;:87;;-1:-1:-1;;;;;;;;;;9079:40:0;;;15570:36;15512:94;15410:204;-1:-1:-1;;15410:204:0:o;22078:100::-;22132:13;22165:5;22158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22078:100;:::o;24245:169::-;24328:4;24345:39;2154:10;24368:7;24377:6;24345:8;:39::i;:::-;-1:-1:-1;24402:4:0;24245:169;;;;:::o;36583:124::-;36645:4;36669:30;-1:-1:-1;;;;;;;;;;;36690:8:0;36669:7;:30::i;24896:492::-;25036:4;25053:36;25063:6;25071:9;25082:6;25053:9;:36::i;:::-;-1:-1:-1;;;;;25129:19:0;;25102:24;25129:19;;;:11;:19;;;;;;;;2154:10;25129:33;;;;;;;;25181:26;;;;25173:79;;;;-1:-1:-1;;;25173:79:0;;8446:2:1;25173:79:0;;;8428:21:1;8485:2;8465:18;;;8458:30;8524:34;8504:18;;;8497:62;-1:-1:-1;;;8575:18:1;;;8568:38;8623:19;;25173:79:0;;;;;;;;;25288:57;25297:6;2154:10;25338:6;25319:16;:25;25288:8;:57::i;:::-;-1:-1:-1;25376:4:0;;24896:492;-1:-1:-1;;;;24896:492:0:o;17206:147::-;16887:7;16914:12;;;:6;:12;;;;;:22;;;15288:30;15299:4;2154:10;15288;:30::i;:::-;17320:25:::1;17331:4;17337:7;17320:10;:25::i;:::-;17206:147:::0;;;:::o;18254:218::-;-1:-1:-1;;;;;18350:23:0;;2154:10;18350:23;18342:83;;;;-1:-1:-1;;;18342:83:0;;11982:2:1;18342:83:0;;;11964:21:1;12021:2;12001:18;;;11994:30;12060:34;12040:18;;;12033:62;-1:-1:-1;;;12111:18:1;;;12104:45;12166:19;;18342:83:0;11954:237:1;18342:83:0;18438:26;18450:4;18456:7;18438:11;:26::i;:::-;18254:218;;:::o;25797:215::-;2154:10;25885:4;25934:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;25934:34:0;;;;;;;;;;25885:4;;25902:80;;25925:7;;25934:47;;25971:10;;25934:47;:::i;:::-;25902:8;:80::i;39803:307::-;-1:-1:-1;;;;;39871:16:0;;39863:59;;;;-1:-1:-1;;;39863:59:0;;10066:2:1;39863:59:0;;;10048:21:1;10105:2;10085:18;;;10078:30;10144:32;10124:18;;;10117:60;10194:18;;39863:59:0;10038:180:1;39863:59:0;39941:27;2154:10;36583:124;:::i;39941:27::-;39933:76;;;;-1:-1:-1;;;39933:76:0;;10830:2:1;39933:76:0;;;10812:21:1;10869:2;10849:18;;;10842:30;10908:34;10888:18;;;10881:62;-1:-1:-1;;;10959:18:1;;;10952:34;11003:19;;39933:76:0;10802:226:1;39933:76:0;40054:3;;40044:6;40028:13;23286:12;;;23198:108;40028:13;:22;;;;:::i;:::-;:29;;40020:54;;;;-1:-1:-1;;;40020:54:0;;11235:2:1;40020:54:0;;;11217:21:1;11274:2;11254:18;;;11247:30;-1:-1:-1;;;11293:18:1;;;11286:42;11345:18;;40020:54:0;11207:162:1;40020:54:0;40085:17;40091:2;40095:6;40085:5;:17::i;40191:83::-;40239:27;2154:10;40259:6;40239:5;:27::i;:::-;40191:83;:::o;38892:296::-;38962:26;2154:10;33235:131;:::i;38962:26::-;38940:110;;;;-1:-1:-1;;;38940:110:0;;8855:2:1;38940:110:0;;;8837:21:1;8894:2;8874:18;;;8867:30;8933:34;8913:18;;;8906:62;-1:-1:-1;;;8984:18:1;;;8977:32;9026:19;;38940:110:0;8827:224:1;38940:110:0;23286:12;;39070:4;:21;;39061:67;;;;-1:-1:-1;;;39061:67:0;;7273:2:1;39061:67:0;;;7255:21:1;;;7292:18;;;7285:30;7351:34;7331:18;;;7324:62;7403:18;;39061:67:0;7245:182:1;39061:67:0;39139:3;:10;;;39165:15;;3497:25:1;;;39165:15:0;;3485:2:1;3470:18;39165:15:0;;;;;;;38892:296;:::o;37301:162::-;37365:33;-1:-1:-1;;;;;;;;;;;37389:8:0;37365:10;:33::i;:::-;37414:41;;2154:10;;-1:-1:-1;;;;;37414:41:0;;;;;;;;37301:162;:::o;33624:163::-;33684:39;13729:4;33714:8;33684:9;:39::i;:::-;33739:40;;2154:10;;-1:-1:-1;;;;;33739:40:0;;;;;;;;33624:163;:::o;39505:221::-;39555:14;39586:27;2154:10;36583:124;:::i;39586:27::-;39582:136;;;39634:3;;:7;39630:76;;23286:12;;39671:3;;:19;;;;:::i;:::-;39662:28;;39630:76;39505:221;:::o;39258:159::-;39333:12;39367:8;10765:7;;;;;10694:86;39367:8;39366:9;:42;;;-1:-1:-1;39379:29:0;2154:10;34913:128;:::i;40406:360::-;40475:24;40502:32;40512:7;2154:10;23947:151;:::i;40502:32::-;40475:59;;40573:6;40553:16;:26;;40545:75;;;;-1:-1:-1;;;40545:75:0;;6391:2:1;40545:75:0;;;6373:21:1;6430:2;6410:18;;;6403:30;6469:34;6449:18;;;6442:62;-1:-1:-1;;;6520:18:1;;;6513:34;6564:19;;40545:75:0;6363:226:1;40545:75:0;40656:58;40665:7;2154:10;40707:6;40688:16;:25;40656:8;:58::i;:::-;40736:22;40742:7;40751:6;40736:5;:22::i;15706:139::-;15784:4;15808:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;15808:29:0;;;;;;;;;;;;;;;15706:139::o;35645:168::-;35711:35;-1:-1:-1;;;;;;;;;;;35737:8:0;35711:10;:35::i;:::-;35762:43;;2154:10;;-1:-1:-1;;;;;35762:43:0;;;;;;;;35645:168;:::o;22297:104::-;22353:13;22386:7;22379:14;;;;;:::i;38610:207::-;38672:26;2154:10;33235:131;:::i;38672:26::-;38650:112;;;;-1:-1:-1;;;38650:112:0;;8041:2:1;38650:112:0;;;8023:21:1;8080:2;8060:18;;;8053:30;8119:34;8099:18;;;8092:62;-1:-1:-1;;;8170:18:1;;;8163:34;8214:19;;38650:112:0;8013:226:1;38650:112:0;38773:10;:8;:10::i;:::-;38799;;;;;;;38610:207::o;26515:413::-;2154:10;26608:4;26652:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;26652:34:0;;;;;;;;;;26705:35;;;;26697:85;;;;-1:-1:-1;;;26697:85:0;;11576:2:1;26697:85:0;;;11558:21:1;11615:2;11595:18;;;11588:30;11654:34;11634:18;;;11627:62;-1:-1:-1;;;11705:18:1;;;11698:35;11750:19;;26697:85:0;11548:227:1;26697:85:0;26818:67;2154:10;26841:7;26869:15;26850:16;:34;26818:8;:67::i;:::-;-1:-1:-1;26916:4:0;;26515:413;-1:-1:-1;;;26515:413:0:o;23709:175::-;23795:4;23812:42;2154:10;23836:9;23847:6;23812:9;:42::i;36963:158::-;37024:32;-1:-1:-1;;;;;;;;;;;37047:8:0;37024:9;:32::i;:::-;37072:41;;2154:10;;-1:-1:-1;;;;;37072:41:0;;;;;;;;36963:158;:::o;35299:164::-;35362:34;-1:-1:-1;;;;;;;;;;;35387:8:0;35362:9;:34::i;:::-;35412:43;;2154:10;;-1:-1:-1;;;;;35412:43:0;;;;;;;;35299:164;:::o;33235:131::-;33297:4;33321:37;33297:4;33349:8;33321:7;:37::i;17598:149::-;16887:7;16914:12;;;:6;:12;;;;;:22;;;15288:30;15299:4;2154:10;15288;:30::i;:::-;17713:26:::1;17725:4;17731:7;17713:11;:26::i;33969:167::-:0;34032:40;13729:4;34063:8;34032:10;:40::i;:::-;34088;;2154:10;;-1:-1:-1;;;;;34088:40:0;;;;;;;;33969:167;:::o;32757:190::-;32828:10;;;;32827:11;32819:43;;;;-1:-1:-1;;;32819:43:0;;4123:2:1;32819:43:0;;;4105:21:1;4162:2;4142:18;;;4135:30;-1:-1:-1;;;4181:18:1;;;4174:49;4240:18;;32819:43:0;4095:169:1;32819:43:0;32873:38;13729:4;32904:6;32873:10;:38::i;:::-;-1:-1:-1;32922:10:0;:17;;-1:-1:-1;;32922:17:0;32935:4;32922:17;;;32757:190::o;34913:128::-;34977:4;35001:32;-1:-1:-1;;;;;;;;;;;35024:8:0;35001:7;:32::i;30199:380::-;-1:-1:-1;;;;;30335:19:0;;30327:68;;;;-1:-1:-1;;;30327:68:0;;10425:2:1;30327:68:0;;;10407:21:1;10464:2;10444:18;;;10437:30;10503:34;10483:18;;;10476:62;-1:-1:-1;;;10554:18:1;;;10547:34;10598:19;;30327:68:0;10397:226:1;30327:68:0;-1:-1:-1;;;;;30414:21:0;;30406:68;;;;-1:-1:-1;;;30406:68:0;;5988:2:1;30406:68:0;;;5970:21:1;6027:2;6007:18;;;6000:30;6066:34;6046:18;;;6039:62;-1:-1:-1;;;6117:18:1;;;6110:32;6159:19;;30406:68:0;5960:224:1;30406:68:0;-1:-1:-1;;;;;30487:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30539:32;;3497:25:1;;;30539:32:0;;3470:18:1;30539:32:0;;;;;;;30199:380;;;:::o;27418:733::-;-1:-1:-1;;;;;27558:20:0;;27550:70;;;;-1:-1:-1;;;27550:70:0;;9660:2:1;27550:70:0;;;9642:21:1;9699:2;9679:18;;;9672:30;9738:34;9718:18;;;9711:62;-1:-1:-1;;;9789:18:1;;;9782:35;9834:19;;27550:70:0;9632:227:1;27550:70:0;-1:-1:-1;;;;;27639:23:0;;27631:71;;;;-1:-1:-1;;;27631:71:0;;4832:2:1;27631:71:0;;;4814:21:1;4871:2;4851:18;;;4844:30;4910:34;4890:18;;;4883:62;-1:-1:-1;;;4961:18:1;;;4954:33;5004:19;;27631:71:0;4804:225:1;27631:71:0;27715:47;27736:6;27744:9;27755:6;27715:20;:47::i;:::-;-1:-1:-1;;;;;27799:17:0;;27775:21;27799:17;;;;;;;;;;;27835:23;;;;27827:74;;;;-1:-1:-1;;;27827:74:0;;7634:2:1;27827:74:0;;;7616:21:1;7673:2;7653:18;;;7646:30;7712:34;7692:18;;;7685:62;-1:-1:-1;;;7763:18:1;;;7756:36;7809:19;;27827:74:0;7606:228:1;27827:74:0;-1:-1:-1;;;;;27937:17:0;;;:9;:17;;;;;;;;;;;27957:22;;;27937:42;;28001:20;;;;;;;;:30;;27973:6;;27937:9;28001:30;;27973:6;;28001:30;:::i;:::-;;;;;;;;28066:9;-1:-1:-1;;;;;28049:35:0;28058:6;-1:-1:-1;;;;;28049:35:0;;28077:6;28049:35;;;;3497:25:1;;3485:2;3470:18;;3452:76;28049:35:0;;;;;;;;28097:46;27539:612;27418:733;;;:::o;16135:497::-;16216:22;16224:4;16230:7;16216;:22::i;:::-;16211:414;;16404:41;16432:7;-1:-1:-1;;;;;16404:41:0;16442:2;16404:19;:41::i;:::-;16518:38;16546:4;16553:2;16518:19;:38::i;:::-;16309:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16309:270:0;;;;;;;;;;-1:-1:-1;;;16255:358:0;;;;;;;:::i;19558:229::-;19633:22;19641:4;19647:7;19633;:22::i;:::-;19628:152;;19672:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19672:29:0;;;;;;;;;:36;;-1:-1:-1;;19672:36:0;19704:4;19672:36;;;19755:12;2154:10;;2074:98;19755:12;-1:-1:-1;;;;;19728:40:0;19746:7;-1:-1:-1;;;;;19728:40:0;19740:4;19728:40;;;;;;;;;;19558:229;;:::o;19795:230::-;19870:22;19878:4;19884:7;19870;:22::i;:::-;19866:152;;;19941:5;19909:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19909:29:0;;;;;;;;;;:37;;-1:-1:-1;;19909:37:0;;;19966:40;2154:10;;19909:12;;19966:40;;19941:5;19966:40;19795:230;;:::o;28438:399::-;-1:-1:-1;;;;;28522:21:0;;28514:65;;;;-1:-1:-1;;;28514:65:0;;12398:2:1;28514:65:0;;;12380:21:1;12437:2;12417:18;;;12410:30;12476:33;12456:18;;;12449:61;12527:18;;28514:65:0;12370:181:1;28514:65:0;28592:49;28621:1;28625:7;28634:6;28592:20;:49::i;:::-;28670:6;28654:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;28687:18:0;;:9;:18;;;;;;;;;;:28;;28709:6;;28687:9;:28;;28709:6;;28687:28;:::i;:::-;;;;-1:-1:-1;;28731:37:0;;3497:25:1;;;-1:-1:-1;;;;;28731:37:0;;;28748:1;;28731:37;;3485:2:1;3470:18;28731:37:0;;;;;;;18254:218;;:::o;29170:591::-;-1:-1:-1;;;;;29254:21:0;;29246:67;;;;-1:-1:-1;;;29246:67:0;;9258:2:1;29246:67:0;;;9240:21:1;9297:2;9277:18;;;9270:30;9336:34;9316:18;;;9309:62;-1:-1:-1;;;9387:18:1;;;9380:31;9428:19;;29246:67:0;9230:223:1;29246:67:0;29326:49;29347:7;29364:1;29368:6;29326:20;:49::i;:::-;-1:-1:-1;;;;;29413:18:0;;29388:22;29413:18;;;;;;;;;;;29450:24;;;;29442:71;;;;-1:-1:-1;;;29442:71:0;;5585:2:1;29442:71:0;;;5567:21:1;5624:2;5604:18;;;5597:30;5663:34;5643:18;;;5636:62;-1:-1:-1;;;5714:18:1;;;5707:32;5756:19;;29442:71:0;5557:224:1;29442:71:0;-1:-1:-1;;;;;29549:18:0;;:9;:18;;;;;;;;;;29570:23;;;29549:44;;29615:12;:22;;29587:6;;29549:9;29615:22;;29587:6;;29615:22;:::i;:::-;;;;-1:-1:-1;;29655:37:0;;3497:25:1;;;29681:1:0;;-1:-1:-1;;;;;29655:37:0;;;;;3485:2:1;3470:18;29655:37:0;;;;;;;17206:147;;;:::o;11753:120::-;10765:7;;;;11289:41;;;;-1:-1:-1;;;11289:41:0;;5236:2:1;11289:41:0;;;5218:21:1;5275:2;5255:18;;;5248:30;-1:-1:-1;;;5294:18:1;;;5287:50;5354:18;;11289:41:0;5208:170:1;11289:41:0;11812:7:::1;:15:::0;;-1:-1:-1;;11812:15:0::1;::::0;;11843:22:::1;::::0;;2154:10;3097:51:1;;11843:22:0;;::::1;::::0;;;;3085:2:1;11843:22:0;;::::1;11753:120::o:0;19055:112::-;19134:25;19145:4;19151:7;19134:10;:25::i;40878:293::-;10765:7;;;;41013:151;;;41050:29;2154:10;34913:128;:::i;41050:29::-;41042:110;;;;-1:-1:-1;;;41042:110:0;;6796:2:1;41042:110:0;;;6778:21:1;6835:2;6815:18;;;6808:30;;;6874:34;6854:18;;;6847:62;6945:34;6925:18;;;6918:62;-1:-1:-1;;;6996:19:1;;;6989:35;7041:19;;41042:110:0;6768:298:1;7812:451:0;7887:13;7913:19;7945:10;7949:6;7945:1;:10;:::i;:::-;:14;;7958:1;7945:14;:::i;:::-;7935:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7935:25:0;;7913:47;;-1:-1:-1;;;7971:6:0;7978:1;7971:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;7971:15:0;;;;;;;;;-1:-1:-1;;;7997:6:0;8004:1;7997:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;7997:15:0;;;;;;;;-1:-1:-1;8028:9:0;8040:10;8044:6;8040:1;:10;:::i;:::-;:14;;8053:1;8040:14;:::i;:::-;8028:26;;8023:135;8060:1;8056;:5;8023:135;;;-1:-1:-1;;;8108:5:0;8116:3;8108:11;8095:25;;;;;;;:::i;:::-;;;;8083:6;8090:1;8083:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;8083:37:0;;;;;;;;-1:-1:-1;8145:1:0;8135:11;;;;;8063:3;;;:::i;:::-;;;8023:135;;;-1:-1:-1;8176:10:0;;8168:55;;;;-1:-1:-1;;;8168:55:0;;4471:2:1;8168:55:0;;;4453:21:1;;;4490:18;;;4483:30;4549:34;4529:18;;;4522:62;4601:18;;8168:55:0;4443:182:1;8168:55:0;8248:6;7812:451;-1:-1:-1;;;7812:451:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:254::-;1049:6;1057;1110:2;1098:9;1089:7;1085:23;1081:32;1078:2;;;1126:1;1123;1116:12;1078:2;1149:29;1168:9;1149:29;:::i;:::-;1139:39;1225:2;1210:18;;;;1197:32;;-1:-1:-1;;;1068:167:1:o;1240:180::-;1299:6;1352:2;1340:9;1331:7;1327:23;1323:32;1320:2;;;1368:1;1365;1358:12;1320:2;-1:-1:-1;1391:23:1;;1310:110;-1:-1:-1;1310:110:1:o;1425:254::-;1493:6;1501;1554:2;1542:9;1533:7;1529:23;1525:32;1522:2;;;1570:1;1567;1560:12;1522:2;1606:9;1593:23;1583:33;;1635:38;1669:2;1658:9;1654:18;1635:38;:::i;1684:286::-;1742:6;1795:2;1783:9;1774:7;1770:23;1766:32;1763:2;;;1811:1;1808;1801:12;1763:2;1837:23;;-1:-1:-1;;;;;;1889:32:1;;1879:43;;1869:2;;1936:1;1933;1926:12;2160:786;2571:25;2566:3;2559:38;2541:3;2626:6;2620:13;2642:62;2697:6;2692:2;2687:3;2683:12;2676:4;2668:6;2664:17;2642:62;:::i;:::-;-1:-1:-1;;;2763:2:1;2723:16;;;2755:11;;;2748:40;2813:13;;2835:63;2813:13;2884:2;2876:11;;2869:4;2857:17;;2835:63;:::i;:::-;2918:17;2937:2;2914:26;;2549:397;-1:-1:-1;;;;2549:397:1:o;3533:383::-;3682:2;3671:9;3664:21;3645:4;3714:6;3708:13;3757:6;3752:2;3741:9;3737:18;3730:34;3773:66;3832:6;3827:2;3816:9;3812:18;3807:2;3799:6;3795:15;3773:66;:::i;:::-;3900:2;3879:15;-1:-1:-1;;3875:29:1;3860:45;;;;3907:2;3856:54;;3654:262;-1:-1:-1;;3654:262:1:o;12927:128::-;12967:3;12998:1;12994:6;12991:1;12988:13;12985:2;;;13004:18;;:::i;:::-;-1:-1:-1;13040:9:1;;12975:80::o;13060:168::-;13100:7;13166:1;13162;13158:6;13154:14;13151:1;13148:21;13143:1;13136:9;13129:17;13125:45;13122:2;;;13173:18;;:::i;:::-;-1:-1:-1;13213:9:1;;13112:116::o;13233:125::-;13273:4;13301:1;13298;13295:8;13292:2;;;13306:18;;:::i;:::-;-1:-1:-1;13343:9:1;;13282:76::o;13363:258::-;13435:1;13445:113;13459:6;13456:1;13453:13;13445:113;;;13535:11;;;13529:18;13516:11;;;13509:39;13481:2;13474:10;13445:113;;;13576:6;13573:1;13570:13;13567:2;;;-1:-1:-1;;13611:1:1;13593:16;;13586:27;13416:205::o;13626:136::-;13665:3;13693:5;13683:2;;13702:18;;:::i;:::-;-1:-1:-1;;;13738:18:1;;13673:89::o;13767:380::-;13846:1;13842:12;;;;13889;;;13910:2;;13964:4;13956:6;13952:17;13942:27;;13910:2;14017;14009:6;14006:14;13986:18;13983:38;13980:2;;;14063:10;14058:3;14054:20;14051:1;14044:31;14098:4;14095:1;14088:15;14126:4;14123:1;14116:15;13980:2;;13822:325;;;:::o;14152:127::-;14213:10;14208:3;14204:20;14201:1;14194:31;14244:4;14241:1;14234:15;14268:4;14265:1;14258:15;14284:127;14345:10;14340:3;14336:20;14333:1;14326:31;14376:4;14373:1;14366:15;14400:4;14397:1;14390:15;14416:127;14477:10;14472:3;14468:20;14465:1;14458:31;14508:4;14505:1;14498:15;14532:4;14529:1;14522:15

Swarm Source

ipfs://0f11667a9fa29c4dc807e2afaad0db4abef4cc3600dffdb6a370dfc01a37deb7
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.