ETH Price: $2,687.91 (-1.70%)

Token

Elastic Finance Token (EEFI)
 

Overview

Max Total Supply

83,906 EEFI

Holders

68

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
13.85 EEFI

Value
$0.00
0x7c9392da11ede5775acb2c1ff559c5a6c49e0aae
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EEFIToken

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-26
*/

// SPDX-License-Identifier: GPL-3.0-or-later
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.7.6;

// solhint-disable

/**
 * @dev Reverts if `condition` is false, with a revert reason containing `errorCode`. Only codes up to 999 are
 * supported.
 */
function _require(bool condition, uint256 errorCode) pure {
    if (!condition) _revert(errorCode);
}

/**
 * @dev Reverts with a revert reason containing `errorCode`. Only codes up to 999 are supported.
 */
function _revert(uint256 errorCode) pure {
    // We're going to dynamically create a revert string based on the error code, with the following format:
    // 'BAL#{errorCode}'
    // where the code is left-padded with zeroes to three digits (so they range from 000 to 999).
    //
    // We don't have revert strings embedded in the contract to save bytecode size: it takes much less space to store a
    // number (8 to 16 bits) than the individual string characters.
    //
    // The dynamic string creation algorithm that follows could be implemented in Solidity, but assembly allows for a
    // much denser implementation, again saving bytecode size. Given this function unconditionally reverts, this is a
    // safe place to rely on it without worrying about how its usage might affect e.g. memory contents.
    assembly {
        // First, we need to compute the ASCII representation of the error code. We assume that it is in the 0-999
        // range, so we only need to convert three digits. To convert the digits to ASCII, we add 0x30, the value for
        // the '0' character.

        let units := add(mod(errorCode, 10), 0x30)

        errorCode := div(errorCode, 10)
        let tenths := add(mod(errorCode, 10), 0x30)

        errorCode := div(errorCode, 10)
        let hundreds := add(mod(errorCode, 10), 0x30)

        // With the individual characters, we can now construct the full string. The "BAL#" part is a known constant
        // (0x42414c23): we simply shift this by 24 (to provide space for the 3 bytes of the error code), and add the
        // characters to it, each shifted by a multiple of 8.
        // The revert reason is then shifted left by 200 bits (256 minus the length of the string, 7 characters * 8 bits
        // per character = 56) to locate it in the most significant part of the 256 slot (the beginning of a byte
        // array).

        let revertReason := shl(200, add(0x42414c23000000, add(add(units, shl(8, tenths)), shl(16, hundreds))))

        // We can now encode the reason in memory, which can be safely overwritten as we're about to revert. The encoded
        // message will have the following layout:
        // [ revert reason identifier ] [ string location offset ] [ string length ] [ string contents ]

        // The Solidity revert reason identifier is 0x08c739a0, the function selector of the Error(string) function. We
        // also write zeroes to the next 28 bytes of memory, but those are about to be overwritten.
        mstore(0x0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
        // Next is the offset to the location of the string, which will be placed immediately after (20 bytes away).
        mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020)
        // The string length is fixed: 7 characters.
        mstore(0x24, 7)
        // Finally, the string itself is stored.
        mstore(0x44, revertReason)

        // Even if the string is only 7 bytes long, we need to return a full 32 byte slot containing it. The length of
        // the encoded message is therefore 4 + 32 + 32 + 32 = 100.
        revert(0, 100)
    }
}

library Errors {
    // Math
    uint256 internal constant ADD_OVERFLOW = 0;
    uint256 internal constant SUB_OVERFLOW = 1;
    uint256 internal constant SUB_UNDERFLOW = 2;
    uint256 internal constant MUL_OVERFLOW = 3;
    uint256 internal constant ZERO_DIVISION = 4;
    uint256 internal constant DIV_INTERNAL = 5;
    uint256 internal constant X_OUT_OF_BOUNDS = 6;
    uint256 internal constant Y_OUT_OF_BOUNDS = 7;
    uint256 internal constant PRODUCT_OUT_OF_BOUNDS = 8;
    uint256 internal constant INVALID_EXPONENT = 9;

    // Input
    uint256 internal constant OUT_OF_BOUNDS = 100;
    uint256 internal constant UNSORTED_ARRAY = 101;
    uint256 internal constant UNSORTED_TOKENS = 102;
    uint256 internal constant INPUT_LENGTH_MISMATCH = 103;
    uint256 internal constant ZERO_TOKEN = 104;

    // Shared pools
    uint256 internal constant MIN_TOKENS = 200;
    uint256 internal constant MAX_TOKENS = 201;
    uint256 internal constant MAX_SWAP_FEE_PERCENTAGE = 202;
    uint256 internal constant MIN_SWAP_FEE_PERCENTAGE = 203;
    uint256 internal constant MINIMUM_BPT = 204;
    uint256 internal constant CALLER_NOT_VAULT = 205;
    uint256 internal constant UNINITIALIZED = 206;
    uint256 internal constant BPT_IN_MAX_AMOUNT = 207;
    uint256 internal constant BPT_OUT_MIN_AMOUNT = 208;
    uint256 internal constant EXPIRED_PERMIT = 209;
    uint256 internal constant NOT_TWO_TOKENS = 210;

    // Pools
    uint256 internal constant MIN_AMP = 300;
    uint256 internal constant MAX_AMP = 301;
    uint256 internal constant MIN_WEIGHT = 302;
    uint256 internal constant MAX_STABLE_TOKENS = 303;
    uint256 internal constant MAX_IN_RATIO = 304;
    uint256 internal constant MAX_OUT_RATIO = 305;
    uint256 internal constant MIN_BPT_IN_FOR_TOKEN_OUT = 306;
    uint256 internal constant MAX_OUT_BPT_FOR_TOKEN_IN = 307;
    uint256 internal constant NORMALIZED_WEIGHT_INVARIANT = 308;
    uint256 internal constant INVALID_TOKEN = 309;
    uint256 internal constant UNHANDLED_JOIN_KIND = 310;
    uint256 internal constant ZERO_INVARIANT = 311;
    uint256 internal constant ORACLE_INVALID_SECONDS_QUERY = 312;
    uint256 internal constant ORACLE_NOT_INITIALIZED = 313;
    uint256 internal constant ORACLE_QUERY_TOO_OLD = 314;
    uint256 internal constant ORACLE_INVALID_INDEX = 315;
    uint256 internal constant ORACLE_BAD_SECS = 316;
    uint256 internal constant AMP_END_TIME_TOO_CLOSE = 317;
    uint256 internal constant AMP_ONGOING_UPDATE = 318;
    uint256 internal constant AMP_RATE_TOO_HIGH = 319;
    uint256 internal constant AMP_NO_ONGOING_UPDATE = 320;
    uint256 internal constant STABLE_INVARIANT_DIDNT_CONVERGE = 321;
    uint256 internal constant STABLE_GET_BALANCE_DIDNT_CONVERGE = 322;
    uint256 internal constant RELAYER_NOT_CONTRACT = 323;
    uint256 internal constant BASE_POOL_RELAYER_NOT_CALLED = 324;
    uint256 internal constant REBALANCING_RELAYER_REENTERED = 325;
    uint256 internal constant GRADUAL_UPDATE_TIME_TRAVEL = 326;
    uint256 internal constant SWAPS_DISABLED = 327;
    uint256 internal constant CALLER_IS_NOT_LBP_OWNER = 328;
    uint256 internal constant PRICE_RATE_OVERFLOW = 329;
    uint256 internal constant INVALID_JOIN_EXIT_KIND_WHILE_SWAPS_DISABLED = 330;
    uint256 internal constant WEIGHT_CHANGE_TOO_FAST = 331;
    uint256 internal constant LOWER_GREATER_THAN_UPPER_TARGET = 332;
    uint256 internal constant UPPER_TARGET_TOO_HIGH = 333;
    uint256 internal constant UNHANDLED_BY_LINEAR_POOL = 334;
    uint256 internal constant OUT_OF_TARGET_RANGE = 335;

    // Lib
    uint256 internal constant REENTRANCY = 400;
    uint256 internal constant SENDER_NOT_ALLOWED = 401;
    uint256 internal constant PAUSED = 402;
    uint256 internal constant PAUSE_WINDOW_EXPIRED = 403;
    uint256 internal constant MAX_PAUSE_WINDOW_DURATION = 404;
    uint256 internal constant MAX_BUFFER_PERIOD_DURATION = 405;
    uint256 internal constant INSUFFICIENT_BALANCE = 406;
    uint256 internal constant INSUFFICIENT_ALLOWANCE = 407;
    uint256 internal constant ERC20_TRANSFER_FROM_ZERO_ADDRESS = 408;
    uint256 internal constant ERC20_TRANSFER_TO_ZERO_ADDRESS = 409;
    uint256 internal constant ERC20_MINT_TO_ZERO_ADDRESS = 410;
    uint256 internal constant ERC20_BURN_FROM_ZERO_ADDRESS = 411;
    uint256 internal constant ERC20_APPROVE_FROM_ZERO_ADDRESS = 412;
    uint256 internal constant ERC20_APPROVE_TO_ZERO_ADDRESS = 413;
    uint256 internal constant ERC20_TRANSFER_EXCEEDS_ALLOWANCE = 414;
    uint256 internal constant ERC20_DECREASED_ALLOWANCE_BELOW_ZERO = 415;
    uint256 internal constant ERC20_TRANSFER_EXCEEDS_BALANCE = 416;
    uint256 internal constant ERC20_BURN_EXCEEDS_ALLOWANCE = 417;
    uint256 internal constant SAFE_ERC20_CALL_FAILED = 418;
    uint256 internal constant ADDRESS_INSUFFICIENT_BALANCE = 419;
    uint256 internal constant ADDRESS_CANNOT_SEND_VALUE = 420;
    uint256 internal constant SAFE_CAST_VALUE_CANT_FIT_INT256 = 421;
    uint256 internal constant GRANT_SENDER_NOT_ADMIN = 422;
    uint256 internal constant REVOKE_SENDER_NOT_ADMIN = 423;
    uint256 internal constant RENOUNCE_SENDER_NOT_ALLOWED = 424;
    uint256 internal constant BUFFER_PERIOD_EXPIRED = 425;
    uint256 internal constant CALLER_IS_NOT_OWNER = 426;
    uint256 internal constant NEW_OWNER_IS_ZERO = 427;
    uint256 internal constant CODE_DEPLOYMENT_FAILED = 428;
    uint256 internal constant CALL_TO_NON_CONTRACT = 429;
    uint256 internal constant LOW_LEVEL_CALL_FAILED = 430;

    // Vault
    uint256 internal constant INVALID_POOL_ID = 500;
    uint256 internal constant CALLER_NOT_POOL = 501;
    uint256 internal constant SENDER_NOT_ASSET_MANAGER = 502;
    uint256 internal constant USER_DOESNT_ALLOW_RELAYER = 503;
    uint256 internal constant INVALID_SIGNATURE = 504;
    uint256 internal constant EXIT_BELOW_MIN = 505;
    uint256 internal constant JOIN_ABOVE_MAX = 506;
    uint256 internal constant SWAP_LIMIT = 507;
    uint256 internal constant SWAP_DEADLINE = 508;
    uint256 internal constant CANNOT_SWAP_SAME_TOKEN = 509;
    uint256 internal constant UNKNOWN_AMOUNT_IN_FIRST_SWAP = 510;
    uint256 internal constant MALCONSTRUCTED_MULTIHOP_SWAP = 511;
    uint256 internal constant INTERNAL_BALANCE_OVERFLOW = 512;
    uint256 internal constant INSUFFICIENT_INTERNAL_BALANCE = 513;
    uint256 internal constant INVALID_ETH_INTERNAL_BALANCE = 514;
    uint256 internal constant INVALID_POST_LOAN_BALANCE = 515;
    uint256 internal constant INSUFFICIENT_ETH = 516;
    uint256 internal constant UNALLOCATED_ETH = 517;
    uint256 internal constant ETH_TRANSFER = 518;
    uint256 internal constant CANNOT_USE_ETH_SENTINEL = 519;
    uint256 internal constant TOKENS_MISMATCH = 520;
    uint256 internal constant TOKEN_NOT_REGISTERED = 521;
    uint256 internal constant TOKEN_ALREADY_REGISTERED = 522;
    uint256 internal constant TOKENS_ALREADY_SET = 523;
    uint256 internal constant TOKENS_LENGTH_MUST_BE_2 = 524;
    uint256 internal constant NONZERO_TOKEN_BALANCE = 525;
    uint256 internal constant BALANCE_TOTAL_OVERFLOW = 526;
    uint256 internal constant POOL_NO_TOKENS = 527;
    uint256 internal constant INSUFFICIENT_FLASH_LOAN_BALANCE = 528;

    // Fees
    uint256 internal constant SWAP_FEE_PERCENTAGE_TOO_HIGH = 600;
    uint256 internal constant FLASH_LOAN_FEE_PERCENTAGE_TOO_HIGH = 601;
    uint256 internal constant INSUFFICIENT_FLASH_LOAN_FEE_AMOUNT = 602;
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // The original OpenZeppelin implementation uses a generic Set type with bytes32 values: this was replaced with
    // AddressSet, which uses address keys natively, resulting in more dense bytecode.

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

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

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

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

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

            // The swap is only necessary if we're not removing the last element
            if (toDeleteIndex != lastIndex) {
                address lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = toDeleteIndex + 1; // All indexes are 1-based
            }

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    /**
     * @dev Same as {at}, except this doesn't revert if `index` it outside of the set (i.e. if it is equal or larger
     * than {length}). O(1).
     *
     * This function performs one less storage read than {at}, but should only be used when `index` is known to be
     * within bounds.
     */
    function unchecked_at(AddressSet storage set, uint256 index) internal view returns (address) {
        return set._values[index];
    }

    function rawIndexOf(AddressSet storage set, address value) internal view returns (uint256) {
        return set._indexes[value] - 1;
    }
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms.
 *
 * 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 {
    using EnumerableSet for EnumerableSet.AddressSet;

    struct RoleData {
        EnumerableSet.AddressSet 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 Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].members.contains(account);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view returns (uint256) {
        return _roles[role].members.length();
    }

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
        return _roles[role].members.at(index);
    }

    /**
     * @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 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 {
        _require(hasRole(_roles[role].adminRole, msg.sender), Errors.GRANT_SENDER_NOT_ADMIN);

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had already been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual {
        _require(hasRole(_roles[role].adminRole, msg.sender), Errors.REVOKE_SENDER_NOT_ADMIN);

        _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 {
        _require(account == msg.sender, Errors.RENOUNCE_SENDER_NOT_ALLOWED);

        _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 {
        emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (_roles[role].members.add(account)) {
            emit RoleGranted(role, account, msg.sender);
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (_roles[role].members.remove(account)) {
            emit RoleRevoked(role, account, msg.sender);
        }
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        _require(c >= a, Errors.ADD_OVERFLOW);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, Errors.SUB_OVERFLOW);
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, uint256 errorCode) internal pure returns (uint256) {
        _require(b <= a, errorCode);
        uint256 c = a - b;

        return c;
    }
}

/**
 * @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 guidelines: functions revert instead
 * of 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 IERC20 {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view 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 {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view 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(msg.sender, 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(msg.sender, 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);
        _approve(
            sender,
            msg.sender,
            _allowances[sender][msg.sender].sub(amount, Errors.ERC20_TRANSFER_EXCEEDS_ALLOWANCE)
        );
        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(msg.sender, spender, _allowances[msg.sender][spender].add(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) {
        _approve(
            msg.sender,
            spender,
            _allowances[msg.sender][spender].sub(subtractedValue, Errors.ERC20_DECREASED_ALLOWANCE_BELOW_ZERO)
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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), Errors.ERC20_TRANSFER_FROM_ZERO_ADDRESS);
        _require(recipient != address(0), Errors.ERC20_TRANSFER_TO_ZERO_ADDRESS);

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, Errors.ERC20_TRANSFER_EXCEEDS_BALANCE);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(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:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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), Errors.ERC20_BURN_FROM_ZERO_ADDRESS);

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

        _balances[account] = _balances[account].sub(amount, Errors.ERC20_BURN_EXCEEDS_ALLOWANCE);
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @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 to 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 Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is ERC20 {
    using SafeMath for uint256;

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

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, msg.sender).sub(amount, Errors.ERC20_BURN_EXCEEDS_ALLOWANCE);

        _approve(account, msg.sender, decreasedAllowance);
        _burn(account, amount);
    }
}

contract EEFIToken is ERC20Burnable, AccessControl {

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    constructor() 
    ERC20("Elastic Finance Token", "EEFI")
    AccessControl() {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    function mint(address account, uint256 amount) public {
        require(hasRole(MINTER_ROLE, msg.sender), "EEFIToken: must have minter role to mint");
        _mint(account, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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"},{"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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"account","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":[{"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":[],"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"}]

60806040523480156200001157600080fd5b50604080518082018252601581527f456c61737469632046696e616e636520546f6b656e00000000000000000000006020808301918252835180850190945260048452634545464960e01b9084015281519192916200007391600391620001af565b50805162000089906004906020840190620001af565b50506005805460ff1916601217905550620000a6600033620000ac565b6200025b565b620000b88282620000bc565b5050565b6000828152600660209081526040909120620000e3918390620008fd62000125821b17901c565b15620000b85760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60006200013383836200018e565b6200018457508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b0386169081179091558554908252828601909352604090209190915562000188565b5060005b92915050565b6001600160a01b031660009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001e7576000855562000232565b82601f106200020257805160ff191683800117855562000232565b8280016001018555821562000232579182015b828111156200023257825182559160200191906001019062000215565b506200024092915062000244565b5090565b5b8082111562000240576000815560010162000245565b610f19806200026b6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a457c2d71161007c578063a457c2d714610436578063a9059cbb14610462578063ca15c8731461048e578063d5391393146104ab578063d547741f146104b3578063dd62ed3e146104df5761014d565b806370a082311461036957806379cc67901461038f5780639010d07c146103bb57806391d14854146103fa57806395d89b4114610426578063a217fddf1461042e5761014d565b80632f2ff15d116101155780632f2ff15d1461027c578063313ce567146102aa57806336568abe146102c857806339509351146102f457806340c10f191461032057806342966c681461034c5761014d565b806306fdde0314610152578063095ea7b3146101cf57806318160ddd1461020f57806323b872dd14610229578063248a9ca31461025f575b600080fd5b61015a61050d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019457818101518382015260200161017c565b50505050905090810190601f1680156101c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360408110156101e557600080fd5b506001600160a01b0381351690602001356105a3565b604080519115158252519081900360200190f35b6102176105ba565b60408051918252519081900360200190f35b6101fb6004803603606081101561023f57600080fd5b506001600160a01b038135811691602081013590911690604001356105c0565b6102176004803603602081101561027557600080fd5b5035610614565b6102a86004803603604081101561029257600080fd5b50803590602001356001600160a01b0316610629565b005b6102b261065f565b6040805160ff9092168252519081900360200190f35b6102a8600480360360408110156102de57600080fd5b50803590602001356001600160a01b0316610668565b6101fb6004803603604081101561030a57600080fd5b506001600160a01b038135169060200135610689565b6102a86004803603604081101561033657600080fd5b506001600160a01b0381351690602001356106bf565b6102a86004803603602081101561036257600080fd5b503561072e565b6102176004803603602081101561037f57600080fd5b50356001600160a01b031661073b565b6102a8600480360360408110156103a557600080fd5b506001600160a01b038135169060200135610756565b6103de600480360360408110156103d157600080fd5b508035906020013561078c565b604080516001600160a01b039092168252519081900360200190f35b6101fb6004803603604081101561041057600080fd5b50803590602001356001600160a01b03166107ab565b61015a6107c3565b610217610824565b6101fb6004803603604081101561044c57600080fd5b506001600160a01b038135169060200135610829565b6101fb6004803603604081101561047857600080fd5b506001600160a01b038135169060200135610862565b610217600480360360208110156104a457600080fd5b503561086f565b610217610886565b6102a8600480360360408110156104c957600080fd5b50803590602001356001600160a01b03166108aa565b610217600480360360408110156104f557600080fd5b506001600160a01b03813581169160200135166108d2565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105995780601f1061056e57610100808354040283529160200191610599565b820191906000526020600020905b81548152906001019060200180831161057c57829003601f168201915b5050505050905090565b60006105b0338484610960565b5060015b92915050565b60025490565b60006105cd8484846109c2565b6001600160a01b03841660009081526001602090815260408083203380855292529091205461060a918691610605908661019e610aaa565b610960565b5060019392505050565b60009081526006602052604090206002015490565b6000828152600660205260409020600201546106519061064990336107ab565b6101a6610ac0565b61065b8282610ace565b5050565b60055460ff1690565b61067f6001600160a01b03821633146101a8610ac0565b61065b8282610b27565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105b09185906106059086610b80565b6106e97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336107ab565b6107245760405162461bcd60e51b8152600401808060200182810382526028815260200180610ebc6028913960400191505060405180910390fd5b61065b8282610b92565b6107383382610c27565b50565b6001600160a01b031660009081526020819052604090205490565b6000610770826101a161076986336108d2565b9190610aaa565b905061077d833383610960565b6107878383610c27565b505050565b60008281526006602052604081206107a49083610cde565b9392505050565b60008281526006602052604081206107a49083610cfa565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105995780601f1061056e57610100808354040283529160200191610599565b600081565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105b0918590610605908661019f610aaa565b60006105b03384846109c2565b60008181526006602052604081206105b490610d1b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b60008281526006602052604090206002015461067f906108ca90336107ab565b6101a7610ac0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60006109098383610cfa565b61095857508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b038616908117909155855490825282860190935260409020919091556105b4565b5060006105b4565b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6109d96001600160a01b0384161515610198610ac0565b6109f06001600160a01b0383161515610199610ac0565b6109fb838383610787565b6001600160a01b038316600090815260208190526040902054610a2190826101a0610aaa565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610a509082610b80565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000610ab98484111583610ac0565b5050900390565b8161065b5761065b81610d1f565b6000828152600660205260409020610ae690826108fd565b1561065b5760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b6000828152600660205260409020610b3f9082610d72565b1561065b5760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b60008282016107a48482101583610ac0565b610b9e60008383610787565b600254610bab9082610b80565b6002556001600160a01b038216600090815260208190526040902054610bd19082610b80565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b610c3e6001600160a01b038316151561019b610ac0565b610c4a82600083610787565b6001600160a01b038216600090815260208190526040902054610c7090826101a1610aaa565b6001600160a01b038316600090815260208190526040902055600254610c969082610e80565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b8154600090610cf09083106064610ac0565b6107a48383610e8e565b6001600160a01b031660009081526001919091016020526040902054151590565b5490565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6001600160a01b03811660009081526001830160205260408120548015610e765783546000198083019101808214610e1e576000866000018281548110610db557fe5b60009182526020909120015487546001600160a01b0390911691508190889085908110610dde57fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018881019092526040902090830190555b8554869080610e2957fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03871682526001888101909152604082209190915593506105b492505050565b60009150506105b4565b60006107a483836001610aaa565b6000826000018281548110610e9f57fe5b6000918252602090912001546001600160a01b0316939250505056fe45454649546f6b656e3a206d7573742068617665206d696e74657220726f6c6520746f206d696e74a2646970667358221220384bcaa2adb957436250d77248619ab9de211e5c46ac3a1032c41dbca0fe54ac64736f6c63430007060033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a457c2d71161007c578063a457c2d714610436578063a9059cbb14610462578063ca15c8731461048e578063d5391393146104ab578063d547741f146104b3578063dd62ed3e146104df5761014d565b806370a082311461036957806379cc67901461038f5780639010d07c146103bb57806391d14854146103fa57806395d89b4114610426578063a217fddf1461042e5761014d565b80632f2ff15d116101155780632f2ff15d1461027c578063313ce567146102aa57806336568abe146102c857806339509351146102f457806340c10f191461032057806342966c681461034c5761014d565b806306fdde0314610152578063095ea7b3146101cf57806318160ddd1461020f57806323b872dd14610229578063248a9ca31461025f575b600080fd5b61015a61050d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019457818101518382015260200161017c565b50505050905090810190601f1680156101c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360408110156101e557600080fd5b506001600160a01b0381351690602001356105a3565b604080519115158252519081900360200190f35b6102176105ba565b60408051918252519081900360200190f35b6101fb6004803603606081101561023f57600080fd5b506001600160a01b038135811691602081013590911690604001356105c0565b6102176004803603602081101561027557600080fd5b5035610614565b6102a86004803603604081101561029257600080fd5b50803590602001356001600160a01b0316610629565b005b6102b261065f565b6040805160ff9092168252519081900360200190f35b6102a8600480360360408110156102de57600080fd5b50803590602001356001600160a01b0316610668565b6101fb6004803603604081101561030a57600080fd5b506001600160a01b038135169060200135610689565b6102a86004803603604081101561033657600080fd5b506001600160a01b0381351690602001356106bf565b6102a86004803603602081101561036257600080fd5b503561072e565b6102176004803603602081101561037f57600080fd5b50356001600160a01b031661073b565b6102a8600480360360408110156103a557600080fd5b506001600160a01b038135169060200135610756565b6103de600480360360408110156103d157600080fd5b508035906020013561078c565b604080516001600160a01b039092168252519081900360200190f35b6101fb6004803603604081101561041057600080fd5b50803590602001356001600160a01b03166107ab565b61015a6107c3565b610217610824565b6101fb6004803603604081101561044c57600080fd5b506001600160a01b038135169060200135610829565b6101fb6004803603604081101561047857600080fd5b506001600160a01b038135169060200135610862565b610217600480360360208110156104a457600080fd5b503561086f565b610217610886565b6102a8600480360360408110156104c957600080fd5b50803590602001356001600160a01b03166108aa565b610217600480360360408110156104f557600080fd5b506001600160a01b03813581169160200135166108d2565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105995780601f1061056e57610100808354040283529160200191610599565b820191906000526020600020905b81548152906001019060200180831161057c57829003601f168201915b5050505050905090565b60006105b0338484610960565b5060015b92915050565b60025490565b60006105cd8484846109c2565b6001600160a01b03841660009081526001602090815260408083203380855292529091205461060a918691610605908661019e610aaa565b610960565b5060019392505050565b60009081526006602052604090206002015490565b6000828152600660205260409020600201546106519061064990336107ab565b6101a6610ac0565b61065b8282610ace565b5050565b60055460ff1690565b61067f6001600160a01b03821633146101a8610ac0565b61065b8282610b27565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105b09185906106059086610b80565b6106e97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336107ab565b6107245760405162461bcd60e51b8152600401808060200182810382526028815260200180610ebc6028913960400191505060405180910390fd5b61065b8282610b92565b6107383382610c27565b50565b6001600160a01b031660009081526020819052604090205490565b6000610770826101a161076986336108d2565b9190610aaa565b905061077d833383610960565b6107878383610c27565b505050565b60008281526006602052604081206107a49083610cde565b9392505050565b60008281526006602052604081206107a49083610cfa565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105995780601f1061056e57610100808354040283529160200191610599565b600081565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105b0918590610605908661019f610aaa565b60006105b03384846109c2565b60008181526006602052604081206105b490610d1b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b60008281526006602052604090206002015461067f906108ca90336107ab565b6101a7610ac0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60006109098383610cfa565b61095857508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b038616908117909155855490825282860190935260409020919091556105b4565b5060006105b4565b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6109d96001600160a01b0384161515610198610ac0565b6109f06001600160a01b0383161515610199610ac0565b6109fb838383610787565b6001600160a01b038316600090815260208190526040902054610a2190826101a0610aaa565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610a509082610b80565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000610ab98484111583610ac0565b5050900390565b8161065b5761065b81610d1f565b6000828152600660205260409020610ae690826108fd565b1561065b5760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b6000828152600660205260409020610b3f9082610d72565b1561065b5760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b60008282016107a48482101583610ac0565b610b9e60008383610787565b600254610bab9082610b80565b6002556001600160a01b038216600090815260208190526040902054610bd19082610b80565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b610c3e6001600160a01b038316151561019b610ac0565b610c4a82600083610787565b6001600160a01b038216600090815260208190526040902054610c7090826101a1610aaa565b6001600160a01b038316600090815260208190526040902055600254610c969082610e80565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b8154600090610cf09083106064610ac0565b6107a48383610e8e565b6001600160a01b031660009081526001919091016020526040902054151590565b5490565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6001600160a01b03811660009081526001830160205260408120548015610e765783546000198083019101808214610e1e576000866000018281548110610db557fe5b60009182526020909120015487546001600160a01b0390911691508190889085908110610dde57fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018881019092526040902090830190555b8554869080610e2957fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03871682526001888101909152604082209190915593506105b492505050565b60009150506105b4565b60006107a483836001610aaa565b6000826000018281548110610e9f57fe5b6000918252602090912001546001600160a01b0316939250505056fe45454649546f6b656e3a206d7573742068617665206d696e74657220726f6c6520746f206d696e74a2646970667358221220384bcaa2adb957436250d77248619ab9de211e5c46ac3a1032c41dbca0fe54ac64736f6c63430007060033

Deployed Bytecode Sourcemap

40935:472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31021:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33125:167;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33125:167:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32096:100;;;:::i;:::-;;;;;;;;;;;;;;;;33774:398;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33774:398:0;;;;;;;;;;;;;;;;;:::i;21151:114::-;;;;;;;;;;;;;;;;-1:-1:-1;21151:114:0;;:::i;21527:206::-;;;;;;;;;;;;;;;;-1:-1:-1;21527:206:0;;;;;;-1:-1:-1;;;;;21527:206:0;;:::i;:::-;;31948:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22702:193;;;;;;;;;;;;;;;;-1:-1:-1;22702:193:0;;;;;;-1:-1:-1;;;;;22702:193:0;;:::i;34581:214::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34581:214:0;;;;;;;;:::i;41213:191::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41213:191:0;;;;;;;;:::i;40232:89::-;;;;;;;;;;;;;;;;-1:-1:-1;40232:89:0;;:::i;32259:119::-;;;;;;;;;;;;;;;;-1:-1:-1;32259:119:0;-1:-1:-1;;;;;32259:119:0;;:::i;40640:288::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40640:288:0;;;;;;;;:::i;20824:138::-;;;;;;;;;;;;;;;;-1:-1:-1;20824:138:0;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;20824:138:0;;;;;;;;;;;;;;19777:147;;;;;;;;;;;;;;;;-1:-1:-1;19777:147:0;;;;;;-1:-1:-1;;;;;19777:147:0;;:::i;31223:87::-;;;:::i;18522:49::-;;;:::i;35298:319::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35298:319:0;;;;;;;;:::i;32591:173::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32591:173:0;;;;;;;;:::i;20098:127::-;;;;;;;;;;;;;;;;-1:-1:-1;20098:127:0;;:::i;40995:62::-;;;:::i;21986:209::-;;;;;;;;;;;;;;;;-1:-1:-1;21986:209:0;;;;;;-1:-1:-1;;;;;21986:209:0;;:::i;32827:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32827:151:0;;;;;;;;;;:::i;31021:83::-;31091:5;31084:12;;;;;;;;-1:-1:-1;;31084:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31058:13;;31084:12;;31091:5;;31084:12;;31091:5;31084:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31021:83;:::o;33125:167::-;33208:4;33225:37;33234:10;33246:7;33255:6;33225:8;:37::i;:::-;-1:-1:-1;33280:4:0;33125:167;;;;;:::o;32096:100::-;32176:12;;32096:100;:::o;33774:398::-;33914:4;33931:36;33941:6;33949:9;33960:6;33931:9;:36::i;:::-;-1:-1:-1;;;;;34047:19:0;;;;;;:11;:19;;;;;;;;34022:10;34047:31;;;;;;;;;33978:164;;34001:6;;34047:84;;34083:6;8897:3;34047:35;:84::i;:::-;33978:8;:164::i;:::-;-1:-1:-1;34160:4:0;33774:398;;;;;:::o;21151:114::-;21208:7;21235:12;;;:6;:12;;;;;:22;;;;21151:114::o;21527:206::-;21620:12;;;;:6;:12;;;;;:22;;;21603:84;;21612:43;;21644:10;21612:7;:43::i;:::-;9431:3;21603:8;:84::i;:::-;21700:25;21711:4;21717:7;21700:10;:25::i;:::-;21527:206;;:::o;31948:83::-;32014:9;;;;31948:83;:::o;22702:193::-;22781:67;-1:-1:-1;;;;;22790:21:0;;22801:10;22790:21;9559:3;22781:8;:67::i;:::-;22861:26;22873:4;22879:7;22861:11;:26::i;34581:214::-;34695:10;34669:4;34716:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;34716:32:0;;;;;;;;;;34669:4;;34686:79;;34707:7;;34716:48;;34753:10;34716:36;:48::i;41213:191::-;41286:32;41033:24;41307:10;41286:7;:32::i;:::-;41278:85;;;;-1:-1:-1;;;41278:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41374:22;41380:7;41389:6;41374:5;:22::i;40232:89::-;40288:25;40294:10;40306:6;40288:5;:25::i;:::-;40232:89;:::o;32259:119::-;-1:-1:-1;;;;;32352:18:0;32325:7;32352:18;;;;;;;;;;;;32259:119::o;40640:288::-;40717:26;40746:79;40781:6;9108:3;40746:30;40756:7;40765:10;40746:9;:30::i;:::-;:34;:79;:34;:79::i;:::-;40717:108;;40838:49;40847:7;40856:10;40868:18;40838:8;:49::i;:::-;40898:22;40904:7;40913:6;40898:5;:22::i;:::-;40640:288;;;:::o;20824:138::-;20897:7;20924:12;;;:6;:12;;;;;:30;;20948:5;20924:23;:30::i;:::-;20917:37;20824:138;-1:-1:-1;;;20824:138:0:o;19777:147::-;19854:4;19878:12;;;:6;:12;;;;;:38;;19908:7;19878:29;:38::i;31223:87::-;31295:7;31288:14;;;;;;;;-1:-1:-1;;31288:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31262:13;;31288:14;;31295:7;;31288:14;;31295:7;31288:14;;;;;;;;;;;;;;;;;;;;;;;;18522:49;18567:4;18522:49;:::o;35298:319::-;35431:10;35391:4;35478:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;35478:32:0;;;;;;;;;;35391:4;;35408:179;;35456:7;;35478:98;;35515:15;8972:3;35478:36;:98::i;32591:173::-;32677:4;32694:40;32704:10;32716:9;32727:6;32694:9;:40::i;20098:127::-;20161:7;20188:12;;;:6;:12;;;;;:29;;:27;:29::i;40995:62::-;41033:24;40995:62;:::o;21986:209::-;22080:12;;;;:6;:12;;;;;:22;;;22063:85;;22072:43;;22104:10;22072:7;:43::i;:::-;9493:3;22063:8;:85::i;32827:151::-;-1:-1:-1;;;;;32943:18:0;;;32916:7;32943:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32827:151::o;13270:420::-;13340:4;13362:20;13371:3;13376:5;13362:8;:20::i;:::-;13357:326;;-1:-1:-1;13399:23:0;;;;;;;;-1:-1:-1;13399:23:0;;;;;;;;;;;;-1:-1:-1;;;;;;13399:23:0;-1:-1:-1;;;;;13399:23:0;;;;;;;;13582:18;;13560:19;;;:12;;;:19;;;;;;:40;;;;13615:11;;13357:326;-1:-1:-1;13666:5:0;13659:12;;38450:220;-1:-1:-1;;;;;38578:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;38630:32;;;;;;;;;;;;;;;;;38450:220;;;:::o;36107:572::-;36239:71;-1:-1:-1;;;;;36248:20:0;;;;8487:3;36239:8;:71::i;:::-;36321:72;-1:-1:-1;;;;;36330:23:0;;;;8556:3;36321:8;:72::i;:::-;36406:47;36427:6;36435:9;36446:6;36406:20;:47::i;:::-;-1:-1:-1;;;;;36486:17:0;;:9;:17;;;;;;;;;;;:68;;36508:6;9041:3;36486:21;:68::i;:::-;-1:-1:-1;;;;;36466:17:0;;;:9;:17;;;;;;;;;;;:88;;;;36588:20;;;;;;;:32;;36613:6;36588:24;:32::i;:::-;-1:-1:-1;;;;;36565:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;36636:35;;;;;;;36565:20;;36636:35;;;;;;;;;;;;;36107:572;;;:::o;28788:181::-;28865:7;28885:27;28899:1;28894;:6;;28902:9;28885:8;:27::i;:::-;-1:-1:-1;;28935:5:0;;;28788:181::o;887:103::-;957:9;952:34;;968:18;976:9;968:7;:18::i;23929:186::-;24003:12;;;;:6;:12;;;;;:33;;24028:7;24003:24;:33::i;:::-;23999:109;;;24058:38;;24085:10;;-1:-1:-1;;;;;24058:38:0;;;24070:4;;24058:38;;;;;23929:186;;:::o;24123:190::-;24198:12;;;;:6;:12;;;;;:36;;24226:7;24198:27;:36::i;:::-;24194:112;;;24256:38;;24283:10;;-1:-1:-1;;;;;24256:38:0;;;24268:4;;24256:38;;;;;24123:190;;:::o;27907:172::-;27965:7;27997:5;;;28013:37;28022:6;;;;27965:7;28013:8;:37::i;36961:300::-;37037:49;37066:1;37070:7;37079:6;37037:20;:49::i;:::-;37114:12;;:24;;37131:6;37114:16;:24::i;:::-;37099:12;:39;-1:-1:-1;;;;;37170:18:0;;:9;:18;;;;;;;;;;;:30;;37193:6;37170:22;:30::i;:::-;-1:-1:-1;;;;;37149:18:0;;:9;:18;;;;;;;;;;;:51;;;;37216:37;;;;;;;37149:18;;:9;;37216:37;;;;;;;;;;36961:300;;:::o;37594:418::-;37670:68;-1:-1:-1;;;;;37679:21:0;;;;8688:3;37670:8;:68::i;:::-;37751:49;37772:7;37789:1;37793:6;37751:20;:49::i;:::-;-1:-1:-1;;;;;37834:18:0;;:9;:18;;;;;;;;;;;:67;;37857:6;9108:3;37834:22;:67::i;:::-;-1:-1:-1;;;;;37813:18:0;;:9;:18;;;;;;;;;;:88;37927:12;;:24;;37944:6;37927:16;:24::i;:::-;37912:12;:39;37967:37;;;;;;;;37993:1;;-1:-1:-1;;;;;37967:37:0;;;;;;;;;;;;37594:418;;:::o;16144:202::-;16247:18;;16218:7;;16238:58;;16247:26;-1:-1:-1;4933:3:0;16238:8;:58::i;:::-;16314:24;16327:3;16332:5;16314:12;:24::i;15452:136::-;-1:-1:-1;;;;;15556:19:0;15532:4;15556:19;;;:12;;;;;:19;;;;;;:24;;;15452:136::o;15674:116::-;15764:18;;15674:116::o;1102:3223::-;-1:-1:-1;;;3655:3:0;3648:79;;;3868:66;3862:4;3855:80;4012:1;4006:4;3999:15;3058:73;2254:2;2289:18;;;2335;;;2259:4;2331:29;;;3099:1;3095:14;2239:18;;;;3084:26;;;;2385:18;;;;2433;;;2429:29;;;3116:2;3112:17;3080:50;;;;3058:73;3053:3;3049:83;4081:4;4074:26;4311:3;;4301:14;13866:1500;-1:-1:-1;;;;;14078:19:0;;13939:4;14078:19;;;:12;;;:19;;;;;;14114:15;;14110:1249;;14562:18;;-1:-1:-1;;14513:14:0;;;;14562:22;14687:26;;;14683:396;;14734:17;14754:3;:11;;14766:9;14754:22;;;;;;;;;;;;;;;;;;14879:26;;-1:-1:-1;;;;;14754:22:0;;;;-1:-1:-1;14754:22:0;;14879:3;;14891:13;;14879:26;;;;;;;;;;;;;;;;;;:38;;-1:-1:-1;;;;;;14879:38:0;-1:-1:-1;;;;;14879:38:0;;;;;;14993:23;;;;;;-1:-1:-1;14993:12:0;;;:23;;;;;;15019:17;;;14993:43;;14683:396;15160:17;;:3;;:17;;;;;;;;;;;;;;;-1:-1:-1;;15160:17:0;;;;;-1:-1:-1;;;;;;15160:17:0;;;;;;;;;-1:-1:-1;;;;;15255:19:0;;;;15160:17;15255:12;;;:19;;;;;;15248:26;;;;15160:17;-1:-1:-1;15291:11:0;;-1:-1:-1;;;15291:11:0;14110:1249;15342:5;15335:12;;;;;28362:123;28420:7;28447:30;28451:1;28454;4454;28447:3;:30::i;16667:137::-;16751:7;16778:3;:11;;16790:5;16778:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16778:18:0;;16667:137;-1:-1:-1;;;16667:137:0:o

Swarm Source

ipfs://384bcaa2adb957436250d77248619ab9de211e5c46ac3a1032c41dbca0fe54ac
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.