ETH Price: $3,518.70 (-1.10%)
Gas: 18 Gwei

Token

 

Overview

Max Total Supply

0

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-10
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/access/IAccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @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 {AccessControl-_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) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/contracts/utils/math/SignedMath.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;




/**
 * @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:
 *
 * ```solidity
 * 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}:
 *
 * ```solidity
 * 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. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
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 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);
        _;
    }

    /**
     * @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 virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @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 virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " 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 virtual 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.
     *
     * May emit a {RoleGranted} event.
     */
    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.
     *
     * May emit a {RoleRevoked} event.
     */
    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 revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    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.
     *
     * May emit a {RoleGranted} event.
     *
     * [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}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    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);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/PreStakingContract.sol


pragma solidity 0.8.0;


contract PreStakingContract is AccessControl {
    
    // Define a constant variable to represent the ADMIN_ROLE using a unique keccak256 hash.
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");

    // Declare state variables to keep track of various contract information.
    address public constant LEGACY_TVK_TOKEN = 0xd084B83C305daFD76AE3E1b4E1F1fe2eCcCb3988; // replace with you token address
    IERC20 public token;
    uint256 public totalStaked;
    uint256 public totalWithdrawn;
    bool public claimTokensActive;
    bool public isStakingTokensActive;

    // Declare events to log important contract actions.
    event Staked(address indexed staker, uint256 amount, uint256 timestamp);
    event Withdrawn(address indexed beneficiary, uint256 amount);
    event TokensClaimed(address indexed staker, uint256 amount);
    event TokensClaimingActivated(address indexed admin, uint256 indexed timestamp);
    event TokensClaimingDeactivated(address indexed admin, uint256 indexed timestamp);
    event TokensStakingActivated(address indexed admin, uint256 indexed timestamp);
    event TokensStakingDeactivated(address indexed admin, uint256 indexed timestamp);

    // Create a private mapping to store the staked balances of each user.
    mapping(address => uint256) private stakedBalances;

    constructor() {
        token = IERC20(LEGACY_TVK_TOKEN);
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); 
        _setupRole(ADMIN_ROLE, msg.sender); 
        
    }

    // Modifier to restrict a function's execution to users with the ADMIN_ROLE.
    modifier onlyWithAdminRole() {
        require(hasRole(ADMIN_ROLE, msg.sender), "Caller is not in the Admin Role");
        _;
    }

    /**
    * @dev Allows a user to stake a specified amount of tokens into the contract.
    * Users can only stake when the staking phase is active, and the staked amount must be greater than 0.
    * @param _amount The amount of tokens to stake.
    */
    function stake(uint256 _amount) external {
        require(isStakingTokensActive, "PreStaking: Staking is not active yet");
        require(_amount != 0, "PreStaking: Amount must be greater than 0");

        stakedBalances[msg.sender] += _amount;
        totalStaked += _amount;
        token.transferFrom(msg.sender, address(this), _amount);
       
        emit Staked(msg.sender, _amount, block.timestamp);
    }

    /**
    * @dev Allows an admin to withdraw a specified amount of tokens from the contract for a beneficiary.
    * Tokens can only be withdrawn when the staking phase is paused, and there must be a sufficient staked balance in the contract.
    * @param _beneficiary The address of the beneficiary to receive the withdrawn tokens.
    * @param _amount The amount of tokens to withdraw.
    */
    function withdraw(address _beneficiary, uint256 _amount) external onlyWithAdminRole {
        require(!isStakingTokensActive, "PreStaking: Staking is not paused yet");
        require(!claimTokensActive, "PreStaking: Token claiming must be paused to withdraw");
        require(_amount != 0, "PreStaking: Withdrawal amount must be greater than 0");
        require(totalStaked -totalWithdrawn >= _amount, "PreStaking: Insufficient staked balance in the contract");

        totalWithdrawn += _amount;
        token.transfer(_beneficiary, _amount);

        emit Withdrawn(_beneficiary, _amount);
    }

    /**
    * @dev Allows an admin to activate the claiming of tokens by users.
    * Tokens can only be claimed if they are not already claimable.
    */
    function activateClaimTokens() external onlyWithAdminRole {
        require(!claimTokensActive, "PreStaking: Tokens claiming is already active");
        claimTokensActive = true;
        emit TokensClaimingActivated(msg.sender, block.timestamp);
    }

    /**
    * @dev Allows an admin to deactivate the claiming of tokens by users.
    * Tokens can only be deactivated if they are already claimable.
    */
    function deactivateClaimTokens() external onlyWithAdminRole {
        require(claimTokensActive, "PreStaking: Tokens claiming is already deactivated");
        claimTokensActive = false;
        emit TokensClaimingDeactivated(msg.sender, block.timestamp);
    }

    /**
    * @dev Allows an admin to activate the staking of tokens by users.
    * Tokens can only be activated if they are not already stakable.
    */
    function activateStaking() external onlyWithAdminRole {
        require(!isStakingTokensActive, "PreStaking: Tokens staking is already active");
        isStakingTokensActive = true;
        emit TokensStakingActivated(msg.sender, block.timestamp);
    }

    /**
    * @dev Allows an admin to deactivate the staking of tokens by users.
    * Tokens can only be deactivated if they are already stakable.
    */
    function deactivateStaking() external onlyWithAdminRole {
        require(isStakingTokensActive, "PreStaking: Tokens staking is already deactivated");
        isStakingTokensActive = false;
        emit TokensStakingDeactivated(msg.sender, block.timestamp);
    }

    /**
    * @dev Allows a user to claim their staked tokens if the claiming phase is active.
    * Users can only claim tokens if they have staked tokens, and tokens must be claimable.
    * The user's staked balance is reset to zero, and the total staked amount is updated accordingly.
    * @notice This function is available to all users, not just admins.
    */
    function claimTokens() external {
        require(claimTokensActive, "PreStaking: Claim tokens not active");
        uint256 stakedAmount = stakedBalances[msg.sender];
        require(stakedAmount != 0, "PreStaking: No staked tokens");

        stakedBalances[msg.sender] = 0;
        totalStaked -= stakedAmount;

        token.transfer(msg.sender, stakedAmount);
        emit TokensClaimed(msg.sender, stakedAmount);
    }

    /**
    * @dev Allows a user to claim their staked tokens if the claiming phase is active.
    * Users can only claim tokens if they have staked tokens, and tokens must be claimable.
    * The user's staked balance is reset to zero, and the total staked amount is updated accordingly.
    * @notice This function is available to all users, not just admins.
    */
    function balanceOf(address _account) external view returns (uint256) {
        return stakedBalances[_account];
    }

    /**
    * @dev Retrieves the token balance held by this contract.
    * @return The balance of tokens held by the contract.
    */
    function getTokenBalance() public view returns (uint256) {
        return token.balanceOf(address(this));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimingActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimingDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensStakingActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensStakingDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGACY_TVK_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateClaimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokensActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deactivateClaimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenBalance","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":[],"name":"isStakingTokensActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","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":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5073d084b83c305dafd76ae3e1b4e1f1fe2ecccb3988600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200007c6000801b33620000b460201b60201c565b620000ae7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533620000b460201b60201c565b6200022d565b620000c68282620000ca60201b60201c565b5050565b620000dc8282620001bb60201b60201c565b620001b757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200015c6200022560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b612774806200023d6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806375b238fc116100c3578063a217fddf1161007c578063a217fddf14610330578063a694fc3a1461034e578063c6cdfe421461036a578063d547741f14610388578063f3fef3a3146103a4578063fc0c546a146103c05761014d565b806375b238fc14610292578063817b1cd2146102b057806382b2e257146102ce57806391d14854146102ec57806393af01701461031c5780639e1855a9146103265761014d565b80632f2ff15d116101155780632f2ff15d146101f857806336568abe1461021457806348c54b9d146102305780634b3197131461023a57806357b7778f1461025857806370a08231146102625761014d565b806301ffc9a714610152578063066cb72a146101825780630f995839146101a057806312496103146101be578063248a9ca3146101c8575b600080fd5b61016c600480360381019061016791906119fd565b6103de565b60405161017991906121ea565b60405180910390f35b61018a610458565b60405161019791906121ea565b60405180910390f35b6101a861046b565b6040516101b5919061216f565b60405180910390f35b6101c6610483565b005b6101e260048036038101906101dd9190611998565b61059c565b6040516101ef9190612205565b60405180910390f35b610212600480360381019061020d91906119c1565b6105bb565b005b61022e600480360381019061022991906119c1565b6105dc565b005b61023861065f565b005b610242610895565b60405161024f919061243d565b60405180910390f35b61026061089b565b005b61027c6004803603810190610277919061190a565b6109b5565b604051610289919061243d565b60405180910390f35b61029a6109fe565b6040516102a79190612205565b60405180910390f35b6102b8610a22565b6040516102c5919061243d565b60405180910390f35b6102d6610a28565b6040516102e3919061243d565b60405180910390f35b610306600480360381019061030191906119c1565b610ada565b60405161031391906121ea565b60405180910390f35b610324610b44565b005b61032e610c5e565b005b610338610d77565b6040516103459190612205565b60405180910390f35b61036860048036038101906103639190611a26565b610d7e565b005b610372610f85565b60405161037f91906121ea565b60405180910390f35b6103a2600480360381019061039d91906119c1565b610f98565b005b6103be60048036038101906103b99190611933565b610fb9565b005b6103c8611273565b6040516103d59190612220565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610451575061045082611299565b5b9050919050565b600460009054906101000a900460ff1681565b73d084b83c305dafd76ae3e1b4e1f1fe2ecccb398881565b6104ad7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b6104ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e3906123fd565b60405180910390fd5b600460019054906101000a900460ff1661053b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610532906122bd565b60405180910390fd5b6000600460016101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167f826805604626dccb3424580378bd75e129a27c5699496d4bd12c3bf3104a48aa60405160405180910390a3565b6000806000838152602001908152602001600020600101549050919050565b6105c48261059c565b6105cd81611303565b6105d78383611317565b505050565b6105e46113f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610651576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106489061241d565b60405180910390fd5b61065b82826113ff565b5050565b600460009054906101000a900460ff166106ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a59061239d565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d9061225d565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806002600082825461078d9190612558565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016107f19291906121c1565b602060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610843919061196f565b503373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e4308260405161088a919061243d565b60405180910390a250565b60035481565b6108c57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb906123fd565b60405180910390fd5b600460009054906101000a900460ff1615610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b9061235d565b60405180910390fd5b6001600460006101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167ffce7d75060ed6646d14449e08813d3cb4d015ed28739f268fbcc29c2143d2d5860405160405180910390a3565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b60025481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a85919061216f565b60206040518083038186803b158015610a9d57600080fd5b505afa158015610ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190611a4f565b905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b6e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba4906123fd565b60405180910390fd5b600460019054906101000a900460ff1615610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906123bd565b60405180910390fd5b6001600460016101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167fcfac895b55f97ea05d9202bad21979988a97a450fa16f72aa57b64c1bb62637660405160405180910390a3565b610c887fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe906123fd565b60405180910390fd5b600460009054906101000a900460ff16610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d9061233d565b60405180910390fd5b6000600460006101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167ff3dcca438b00aab5f6c96eadd1d7e67449ba8efac49a162fb7378c40d8f87c4260405160405180910390a3565b6000801b81565b600460019054906101000a900460ff16610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc49061229d565b60405180910390fd5b6000811415610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e08906122dd565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e6091906124a8565b925050819055508060026000828254610e7991906124a8565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610edf9392919061218a565b602060405180830381600087803b158015610ef957600080fd5b505af1158015610f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f31919061196f565b503373ffffffffffffffffffffffffffffffffffffffff167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee908242604051610f7a929190612458565b60405180910390a250565b600460019054906101000a900460ff1681565b610fa18261059c565b610faa81611303565b610fb483836113ff565b505050565b610fe37fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b611022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611019906123fd565b60405180910390fd5b600460019054906101000a900460ff1615611072576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611069906122fd565b60405180910390fd5b600460009054906101000a900460ff16156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b9906123dd565b60405180910390fd5b6000811415611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd9061231d565b60405180910390fd5b806003546002546111179190612558565b1015611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f9061237d565b60405180910390fd5b806003600082825461116a91906124a8565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016111ce9291906121c1565b602060405180830381600087803b1580156111e857600080fd5b505af11580156111fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611220919061196f565b508173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051611267919061243d565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113148161130f6113f7565b6114e0565b50565b6113218282610ada565b6113f357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113986113f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b6114098282610ada565b156114dc57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506114816113f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6114ea8282610ada565b611561576114f781611565565b6115058360001c6020611592565b604051602001611516929190612135565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611558919061223b565b60405180910390fd5b5050565b606061158b8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611592565b9050919050565b6060600060028360026115a591906124fe565b6115af91906124a8565b67ffffffffffffffff8111156115ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156116205781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611708577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261174891906124fe565b61175291906124a8565b90505b600181111561183e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106117ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106117f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061183790612661565b9050611755565b5060008414611882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118799061227d565b60405180910390fd5b8091505092915050565b60008135905061189b816126cb565b92915050565b6000815190506118b0816126e2565b92915050565b6000813590506118c5816126f9565b92915050565b6000813590506118da81612710565b92915050565b6000813590506118ef81612727565b92915050565b60008151905061190481612727565b92915050565b60006020828403121561191c57600080fd5b600061192a8482850161188c565b91505092915050565b6000806040838503121561194657600080fd5b60006119548582860161188c565b9250506020611965858286016118e0565b9150509250929050565b60006020828403121561198157600080fd5b600061198f848285016118a1565b91505092915050565b6000602082840312156119aa57600080fd5b60006119b8848285016118b6565b91505092915050565b600080604083850312156119d457600080fd5b60006119e2858286016118b6565b92505060206119f38582860161188c565b9150509250929050565b600060208284031215611a0f57600080fd5b6000611a1d848285016118cb565b91505092915050565b600060208284031215611a3857600080fd5b6000611a46848285016118e0565b91505092915050565b600060208284031215611a6157600080fd5b6000611a6f848285016118f5565b91505092915050565b611a818161258c565b82525050565b611a908161259e565b82525050565b611a9f816125aa565b82525050565b611aae8161260a565b82525050565b6000611abf82612481565b611ac9818561248c565b9350611ad981856020860161262e565b611ae2816126ba565b840191505092915050565b6000611af882612481565b611b02818561249d565b9350611b1281856020860161262e565b80840191505092915050565b6000611b2b601c8361248c565b91507f5072655374616b696e673a204e6f207374616b656420746f6b656e73000000006000830152602082019050919050565b6000611b6b60208361248c565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000611bab60258361248c565b91507f5072655374616b696e673a205374616b696e67206973206e6f7420616374697660008301527f65207965740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611c1160318361248c565b91507f5072655374616b696e673a20546f6b656e73207374616b696e6720697320616c60008301527f72656164792064656163746976617465640000000000000000000000000000006020830152604082019050919050565b6000611c7760298361248c565b91507f5072655374616b696e673a20416d6f756e74206d75737420626520677265617460008301527f6572207468616e203000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611cdd60258361248c565b91507f5072655374616b696e673a205374616b696e67206973206e6f7420706175736560008301527f64207965740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d4360348361248c565b91507f5072655374616b696e673a205769746864726177616c20616d6f756e74206d7560008301527f73742062652067726561746572207468616e20300000000000000000000000006020830152604082019050919050565b6000611da960328361248c565b91507f5072655374616b696e673a20546f6b656e7320636c61696d696e67206973206160008301527f6c726561647920646561637469766174656400000000000000000000000000006020830152604082019050919050565b6000611e0f602d8361248c565b91507f5072655374616b696e673a20546f6b656e7320636c61696d696e67206973206160008301527f6c726561647920616374697665000000000000000000000000000000000000006020830152604082019050919050565b6000611e7560378361248c565b91507f5072655374616b696e673a20496e73756666696369656e74207374616b65642060008301527f62616c616e636520696e2074686520636f6e74726163740000000000000000006020830152604082019050919050565b6000611edb60238361248c565b91507f5072655374616b696e673a20436c61696d20746f6b656e73206e6f742061637460008301527f69766500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611f41602c8361248c565b91507f5072655374616b696e673a20546f6b656e73207374616b696e6720697320616c60008301527f72656164792061637469766500000000000000000000000000000000000000006020830152604082019050919050565b6000611fa760358361248c565b91507f5072655374616b696e673a20546f6b656e20636c61696d696e67206d7573742060008301527f62652070617573656420746f20776974686472617700000000000000000000006020830152604082019050919050565b600061200d60178361249d565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b600061204d601f8361248c565b91507f43616c6c6572206973206e6f7420696e207468652041646d696e20526f6c65006000830152602082019050919050565b600061208d60118361249d565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006120cd602f8361248c565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61212f81612600565b82525050565b600061214082612000565b915061214c8285611aed565b915061215782612080565b91506121638284611aed565b91508190509392505050565b60006020820190506121846000830184611a78565b92915050565b600060608201905061219f6000830186611a78565b6121ac6020830185611a78565b6121b96040830184612126565b949350505050565b60006040820190506121d66000830185611a78565b6121e36020830184612126565b9392505050565b60006020820190506121ff6000830184611a87565b92915050565b600060208201905061221a6000830184611a96565b92915050565b60006020820190506122356000830184611aa5565b92915050565b600060208201905081810360008301526122558184611ab4565b905092915050565b6000602082019050818103600083015261227681611b1e565b9050919050565b6000602082019050818103600083015261229681611b5e565b9050919050565b600060208201905081810360008301526122b681611b9e565b9050919050565b600060208201905081810360008301526122d681611c04565b9050919050565b600060208201905081810360008301526122f681611c6a565b9050919050565b6000602082019050818103600083015261231681611cd0565b9050919050565b6000602082019050818103600083015261233681611d36565b9050919050565b6000602082019050818103600083015261235681611d9c565b9050919050565b6000602082019050818103600083015261237681611e02565b9050919050565b6000602082019050818103600083015261239681611e68565b9050919050565b600060208201905081810360008301526123b681611ece565b9050919050565b600060208201905081810360008301526123d681611f34565b9050919050565b600060208201905081810360008301526123f681611f9a565b9050919050565b6000602082019050818103600083015261241681612040565b9050919050565b60006020820190508181036000830152612436816120c0565b9050919050565b60006020820190506124526000830184612126565b92915050565b600060408201905061246d6000830185612126565b61247a6020830184612126565b9392505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006124b382612600565b91506124be83612600565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156124f3576124f261268b565b5b828201905092915050565b600061250982612600565b915061251483612600565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561254d5761254c61268b565b5b828202905092915050565b600061256382612600565b915061256e83612600565b9250828210156125815761258061268b565b5b828203905092915050565b6000612597826125e0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006126158261261c565b9050919050565b6000612627826125e0565b9050919050565b60005b8381101561264c578082015181840152602081019050612631565b8381111561265b576000848401525b50505050565b600061266c82612600565b915060008214156126805761267f61268b565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000601f19601f8301169050919050565b6126d48161258c565b81146126df57600080fd5b50565b6126eb8161259e565b81146126f657600080fd5b50565b612702816125aa565b811461270d57600080fd5b50565b612719816125b4565b811461272457600080fd5b50565b61273081612600565b811461273b57600080fd5b5056fea264697066735822122038847c788078211124d653cc44c6f1d4dff68bc22395fffbdfccbce72f26ae3964736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806375b238fc116100c3578063a217fddf1161007c578063a217fddf14610330578063a694fc3a1461034e578063c6cdfe421461036a578063d547741f14610388578063f3fef3a3146103a4578063fc0c546a146103c05761014d565b806375b238fc14610292578063817b1cd2146102b057806382b2e257146102ce57806391d14854146102ec57806393af01701461031c5780639e1855a9146103265761014d565b80632f2ff15d116101155780632f2ff15d146101f857806336568abe1461021457806348c54b9d146102305780634b3197131461023a57806357b7778f1461025857806370a08231146102625761014d565b806301ffc9a714610152578063066cb72a146101825780630f995839146101a057806312496103146101be578063248a9ca3146101c8575b600080fd5b61016c600480360381019061016791906119fd565b6103de565b60405161017991906121ea565b60405180910390f35b61018a610458565b60405161019791906121ea565b60405180910390f35b6101a861046b565b6040516101b5919061216f565b60405180910390f35b6101c6610483565b005b6101e260048036038101906101dd9190611998565b61059c565b6040516101ef9190612205565b60405180910390f35b610212600480360381019061020d91906119c1565b6105bb565b005b61022e600480360381019061022991906119c1565b6105dc565b005b61023861065f565b005b610242610895565b60405161024f919061243d565b60405180910390f35b61026061089b565b005b61027c6004803603810190610277919061190a565b6109b5565b604051610289919061243d565b60405180910390f35b61029a6109fe565b6040516102a79190612205565b60405180910390f35b6102b8610a22565b6040516102c5919061243d565b60405180910390f35b6102d6610a28565b6040516102e3919061243d565b60405180910390f35b610306600480360381019061030191906119c1565b610ada565b60405161031391906121ea565b60405180910390f35b610324610b44565b005b61032e610c5e565b005b610338610d77565b6040516103459190612205565b60405180910390f35b61036860048036038101906103639190611a26565b610d7e565b005b610372610f85565b60405161037f91906121ea565b60405180910390f35b6103a2600480360381019061039d91906119c1565b610f98565b005b6103be60048036038101906103b99190611933565b610fb9565b005b6103c8611273565b6040516103d59190612220565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610451575061045082611299565b5b9050919050565b600460009054906101000a900460ff1681565b73d084b83c305dafd76ae3e1b4e1f1fe2ecccb398881565b6104ad7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b6104ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e3906123fd565b60405180910390fd5b600460019054906101000a900460ff1661053b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610532906122bd565b60405180910390fd5b6000600460016101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167f826805604626dccb3424580378bd75e129a27c5699496d4bd12c3bf3104a48aa60405160405180910390a3565b6000806000838152602001908152602001600020600101549050919050565b6105c48261059c565b6105cd81611303565b6105d78383611317565b505050565b6105e46113f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610651576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106489061241d565b60405180910390fd5b61065b82826113ff565b5050565b600460009054906101000a900460ff166106ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a59061239d565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d9061225d565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806002600082825461078d9190612558565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016107f19291906121c1565b602060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610843919061196f565b503373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e4308260405161088a919061243d565b60405180910390a250565b60035481565b6108c57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb906123fd565b60405180910390fd5b600460009054906101000a900460ff1615610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b9061235d565b60405180910390fd5b6001600460006101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167ffce7d75060ed6646d14449e08813d3cb4d015ed28739f268fbcc29c2143d2d5860405160405180910390a3565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b60025481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a85919061216f565b60206040518083038186803b158015610a9d57600080fd5b505afa158015610ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190611a4f565b905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b6e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba4906123fd565b60405180910390fd5b600460019054906101000a900460ff1615610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906123bd565b60405180910390fd5b6001600460016101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167fcfac895b55f97ea05d9202bad21979988a97a450fa16f72aa57b64c1bb62637660405160405180910390a3565b610c887fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe906123fd565b60405180910390fd5b600460009054906101000a900460ff16610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d9061233d565b60405180910390fd5b6000600460006101000a81548160ff021916908315150217905550423373ffffffffffffffffffffffffffffffffffffffff167ff3dcca438b00aab5f6c96eadd1d7e67449ba8efac49a162fb7378c40d8f87c4260405160405180910390a3565b6000801b81565b600460019054906101000a900460ff16610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc49061229d565b60405180910390fd5b6000811415610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e08906122dd565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e6091906124a8565b925050819055508060026000828254610e7991906124a8565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610edf9392919061218a565b602060405180830381600087803b158015610ef957600080fd5b505af1158015610f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f31919061196f565b503373ffffffffffffffffffffffffffffffffffffffff167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee908242604051610f7a929190612458565b60405180910390a250565b600460019054906101000a900460ff1681565b610fa18261059c565b610faa81611303565b610fb483836113ff565b505050565b610fe37fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177533610ada565b611022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611019906123fd565b60405180910390fd5b600460019054906101000a900460ff1615611072576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611069906122fd565b60405180910390fd5b600460009054906101000a900460ff16156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b9906123dd565b60405180910390fd5b6000811415611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd9061231d565b60405180910390fd5b806003546002546111179190612558565b1015611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f9061237d565b60405180910390fd5b806003600082825461116a91906124a8565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016111ce9291906121c1565b602060405180830381600087803b1580156111e857600080fd5b505af11580156111fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611220919061196f565b508173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051611267919061243d565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113148161130f6113f7565b6114e0565b50565b6113218282610ada565b6113f357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113986113f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b6114098282610ada565b156114dc57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506114816113f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6114ea8282610ada565b611561576114f781611565565b6115058360001c6020611592565b604051602001611516929190612135565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611558919061223b565b60405180910390fd5b5050565b606061158b8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611592565b9050919050565b6060600060028360026115a591906124fe565b6115af91906124a8565b67ffffffffffffffff8111156115ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156116205781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061167e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611708577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261174891906124fe565b61175291906124a8565b90505b600181111561183e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106117ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106117f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061183790612661565b9050611755565b5060008414611882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118799061227d565b60405180910390fd5b8091505092915050565b60008135905061189b816126cb565b92915050565b6000815190506118b0816126e2565b92915050565b6000813590506118c5816126f9565b92915050565b6000813590506118da81612710565b92915050565b6000813590506118ef81612727565b92915050565b60008151905061190481612727565b92915050565b60006020828403121561191c57600080fd5b600061192a8482850161188c565b91505092915050565b6000806040838503121561194657600080fd5b60006119548582860161188c565b9250506020611965858286016118e0565b9150509250929050565b60006020828403121561198157600080fd5b600061198f848285016118a1565b91505092915050565b6000602082840312156119aa57600080fd5b60006119b8848285016118b6565b91505092915050565b600080604083850312156119d457600080fd5b60006119e2858286016118b6565b92505060206119f38582860161188c565b9150509250929050565b600060208284031215611a0f57600080fd5b6000611a1d848285016118cb565b91505092915050565b600060208284031215611a3857600080fd5b6000611a46848285016118e0565b91505092915050565b600060208284031215611a6157600080fd5b6000611a6f848285016118f5565b91505092915050565b611a818161258c565b82525050565b611a908161259e565b82525050565b611a9f816125aa565b82525050565b611aae8161260a565b82525050565b6000611abf82612481565b611ac9818561248c565b9350611ad981856020860161262e565b611ae2816126ba565b840191505092915050565b6000611af882612481565b611b02818561249d565b9350611b1281856020860161262e565b80840191505092915050565b6000611b2b601c8361248c565b91507f5072655374616b696e673a204e6f207374616b656420746f6b656e73000000006000830152602082019050919050565b6000611b6b60208361248c565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000611bab60258361248c565b91507f5072655374616b696e673a205374616b696e67206973206e6f7420616374697660008301527f65207965740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611c1160318361248c565b91507f5072655374616b696e673a20546f6b656e73207374616b696e6720697320616c60008301527f72656164792064656163746976617465640000000000000000000000000000006020830152604082019050919050565b6000611c7760298361248c565b91507f5072655374616b696e673a20416d6f756e74206d75737420626520677265617460008301527f6572207468616e203000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611cdd60258361248c565b91507f5072655374616b696e673a205374616b696e67206973206e6f7420706175736560008301527f64207965740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d4360348361248c565b91507f5072655374616b696e673a205769746864726177616c20616d6f756e74206d7560008301527f73742062652067726561746572207468616e20300000000000000000000000006020830152604082019050919050565b6000611da960328361248c565b91507f5072655374616b696e673a20546f6b656e7320636c61696d696e67206973206160008301527f6c726561647920646561637469766174656400000000000000000000000000006020830152604082019050919050565b6000611e0f602d8361248c565b91507f5072655374616b696e673a20546f6b656e7320636c61696d696e67206973206160008301527f6c726561647920616374697665000000000000000000000000000000000000006020830152604082019050919050565b6000611e7560378361248c565b91507f5072655374616b696e673a20496e73756666696369656e74207374616b65642060008301527f62616c616e636520696e2074686520636f6e74726163740000000000000000006020830152604082019050919050565b6000611edb60238361248c565b91507f5072655374616b696e673a20436c61696d20746f6b656e73206e6f742061637460008301527f69766500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611f41602c8361248c565b91507f5072655374616b696e673a20546f6b656e73207374616b696e6720697320616c60008301527f72656164792061637469766500000000000000000000000000000000000000006020830152604082019050919050565b6000611fa760358361248c565b91507f5072655374616b696e673a20546f6b656e20636c61696d696e67206d7573742060008301527f62652070617573656420746f20776974686472617700000000000000000000006020830152604082019050919050565b600061200d60178361249d565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b600061204d601f8361248c565b91507f43616c6c6572206973206e6f7420696e207468652041646d696e20526f6c65006000830152602082019050919050565b600061208d60118361249d565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b60006120cd602f8361248c565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b61212f81612600565b82525050565b600061214082612000565b915061214c8285611aed565b915061215782612080565b91506121638284611aed565b91508190509392505050565b60006020820190506121846000830184611a78565b92915050565b600060608201905061219f6000830186611a78565b6121ac6020830185611a78565b6121b96040830184612126565b949350505050565b60006040820190506121d66000830185611a78565b6121e36020830184612126565b9392505050565b60006020820190506121ff6000830184611a87565b92915050565b600060208201905061221a6000830184611a96565b92915050565b60006020820190506122356000830184611aa5565b92915050565b600060208201905081810360008301526122558184611ab4565b905092915050565b6000602082019050818103600083015261227681611b1e565b9050919050565b6000602082019050818103600083015261229681611b5e565b9050919050565b600060208201905081810360008301526122b681611b9e565b9050919050565b600060208201905081810360008301526122d681611c04565b9050919050565b600060208201905081810360008301526122f681611c6a565b9050919050565b6000602082019050818103600083015261231681611cd0565b9050919050565b6000602082019050818103600083015261233681611d36565b9050919050565b6000602082019050818103600083015261235681611d9c565b9050919050565b6000602082019050818103600083015261237681611e02565b9050919050565b6000602082019050818103600083015261239681611e68565b9050919050565b600060208201905081810360008301526123b681611ece565b9050919050565b600060208201905081810360008301526123d681611f34565b9050919050565b600060208201905081810360008301526123f681611f9a565b9050919050565b6000602082019050818103600083015261241681612040565b9050919050565b60006020820190508181036000830152612436816120c0565b9050919050565b60006020820190506124526000830184612126565b92915050565b600060408201905061246d6000830185612126565b61247a6020830184612126565b9392505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006124b382612600565b91506124be83612600565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156124f3576124f261268b565b5b828201905092915050565b600061250982612600565b915061251483612600565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561254d5761254c61268b565b5b828202905092915050565b600061256382612600565b915061256e83612600565b9250828210156125815761258061268b565b5b828203905092915050565b6000612597826125e0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006126158261261c565b9050919050565b6000612627826125e0565b9050919050565b60005b8381101561264c578082015181840152602081019050612631565b8381111561265b576000848401525b50505050565b600061266c82612600565b915060008214156126805761267f61268b565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000601f19601f8301169050919050565b6126d48161258c565b81146126df57600080fd5b50565b6126eb8161259e565b81146126f657600080fd5b50565b612702816125aa565b811461270d57600080fd5b50565b612719816125b4565b811461272457600080fd5b50565b61273081612600565b811461273b57600080fd5b5056fea264697066735822122038847c788078211124d653cc44c6f1d4dff68bc22395fffbdfccbce72f26ae3964736f6c63430008000033

Deployed Bytecode Sourcemap

34520:6763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28776:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35041:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34820:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39436:267;;;:::i;:::-;;30599:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31040:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32184:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40085:434;;;:::i;:::-;;35005:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38154:256;;;:::i;:::-;;40901:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34672:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34972:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41167:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29072:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39011:258;;;:::i;:::-;;38579:265;;;:::i;:::-;;28177:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36540:425;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35077:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31480:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37376:611;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34946:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28776:204;28861:4;28900:32;28885:47;;;:11;:47;;;;:87;;;;28936:36;28960:11;28936:23;:36::i;:::-;28885:87;28878:94;;28776:204;;;:::o;35041:29::-;;;;;;;;;;;;;:::o;34820:85::-;34863:42;34820:85;:::o;39436:267::-;36184:31;34709:23;36204:10;36184:7;:31::i;:::-;36176:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39511:21:::1;;;;;;;;;;;39503:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;39621:5;39597:21;;:29;;;;;;;;;;;;;;;;;;39679:15;39667:10;39642:53;;;;;;;;;;;;39436:267::o:0;30599:131::-;30673:7;30700:6;:12;30707:4;30700:12;;;;;;;;;;;:22;;;30693:29;;30599:131;;;:::o;31040:147::-;31123:18;31136:4;31123:12;:18::i;:::-;28668:16;28679:4;28668:10;:16::i;:::-;31154:25:::1;31165:4;31171:7;31154:10;:25::i;:::-;31040:147:::0;;;:::o;32184:218::-;32291:12;:10;:12::i;:::-;32280:23;;:7;:23;;;32272:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;32368:26;32380:4;32386:7;32368:11;:26::i;:::-;32184:218;;:::o;40085:434::-;40136:17;;;;;;;;;;;40128:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40204:20;40227:14;:26;40242:10;40227:26;;;;;;;;;;;;;;;;40204:49;;40288:1;40272:12;:17;;40264:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40364:1;40335:14;:26;40350:10;40335:26;;;;;;;;;;;;;;;:30;;;;40391:12;40376:11;;:27;;;;;;;:::i;:::-;;;;;;;;40416:5;;;;;;;;;;;:14;;;40431:10;40443:12;40416:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40486:10;40472:39;;;40498:12;40472:39;;;;;;:::i;:::-;;;;;;;;40085:434;:::o;35005:29::-;;;;:::o;38154:256::-;36184:31;34709:23;36204:10;36184:7;:31::i;:::-;36176:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;38232:17:::1;;;;;;;;;;;38231:18;38223:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38330:4;38310:17;;:24;;;;;;;;;;;;;;;;;;38386:15;38374:10;38350:52;;;;;;;;;;;;38154:256::o:0;40901:119::-;40961:7;40988:14;:24;41003:8;40988:24;;;;;;;;;;;;;;;;40981:31;;40901:119;;;:::o;34672:60::-;34709:23;34672:60;:::o;34972:26::-;;;;:::o;41167:113::-;41215:7;41242:5;;;;;;;;;;;:15;;;41266:4;41242:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41235:37;;41167:113;:::o;29072:147::-;29158:4;29182:6;:12;29189:4;29182:12;;;;;;;;;;;:20;;:29;29203:7;29182:29;;;;;;;;;;;;;;;;;;;;;;;;;29175:36;;29072:147;;;;:::o;39011:258::-;36184:31;34709:23;36204:10;36184:7;:31::i;:::-;36176:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39085:21:::1;;;;;;;;;;;39084:22;39076:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;39190:4;39166:21;;:28;;;;;;;;;;;;;;;;;;39245:15;39233:10;39210:51;;;;;;;;;;;;39011:258::o:0;38579:265::-;36184:31;34709:23;36204:10;36184:7;:31::i;:::-;36176:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;38658:17:::1;;;;;;;;;;;38650:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;38761:5;38741:17;;:25;;;;;;;;;;;;;;;;;;38820:15;38808:10;38782:54;;;;;;;;;;;;38579:265::o:0;28177:49::-;28222:4;28177:49;;;:::o;36540:425::-;36600:21;;;;;;;;;;;36592:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36693:1;36682:7;:12;;36674:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36783:7;36753:14;:26;36768:10;36753:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;36816:7;36801:11;;:22;;;;;;;:::i;:::-;;;;;;;;36834:5;;;;;;;;;;;:18;;;36853:10;36873:4;36880:7;36834:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36920:10;36913:44;;;36932:7;36941:15;36913:44;;;;;;;:::i;:::-;;;;;;;;36540:425;:::o;35077:33::-;;;;;;;;;;;;;:::o;31480:149::-;31564:18;31577:4;31564:12;:18::i;:::-;28668:16;28679:4;28668:10;:16::i;:::-;31595:26:::1;31607:4;31613:7;31595:11;:26::i;:::-;31480:149:::0;;;:::o;37376:611::-;36184:31;34709:23;36204:10;36184:7;:31::i;:::-;36176:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37480:21:::1;;;;;;;;;;;37479:22;37471:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;37563:17;;;;;;;;;;;37562:18;37554:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;37668:1;37657:7;:12;;37649:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;37776:7;37758:14;;37745:11;;:27;;;;:::i;:::-;:38;;37737:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;37874:7;37856:14;;:25;;;;;;;:::i;:::-;;;;;;;;37892:5;;;;;;;;;;;:14;;;37907:12;37921:7;37892:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37957:12;37947:32;;;37971:7;37947:32;;;;;;:::i;:::-;;;;;;;;37376:611:::0;;:::o;34946:19::-;;;;;;;;;;;;;:::o;25910:157::-;25995:4;26034:25;26019:40;;;:11;:40;;;;26012:47;;25910:157;;;:::o;29523:105::-;29590:30;29601:4;29607:12;:10;:12::i;:::-;29590:10;:30::i;:::-;29523:105;:::o;33781:238::-;33865:22;33873:4;33879:7;33865;:22::i;:::-;33860:152;;33936:4;33904:6;:12;33911:4;33904:12;;;;;;;;;;;:20;;:29;33925:7;33904:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;33987:12;:10;:12::i;:::-;33960:40;;33978:7;33960:40;;33972:4;33960:40;;;;;;;;;;33860:152;33781:238;;:::o;6596:98::-;6649:7;6676:10;6669:17;;6596:98;:::o;34199:239::-;34283:22;34291:4;34297:7;34283;:22::i;:::-;34279:152;;;34354:5;34322:6;:12;34329:4;34322:12;;;;;;;;;;;:20;;:29;34343:7;34322:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;34406:12;:10;:12::i;:::-;34379:40;;34397:7;34379:40;;34391:4;34379:40;;;;;;;;;;34279:152;34199:239;;:::o;29918:492::-;30007:22;30015:4;30021:7;30007;:22::i;:::-;30002:401;;30195:28;30215:7;30195:19;:28::i;:::-;30296:38;30324:4;30316:13;;30331:2;30296:19;:38::i;:::-;30100:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30046:345;;;;;;;;;;;:::i;:::-;;;;;;;;30002:401;29918:492;;:::o;23744:151::-;23802:13;23835:52;23863:4;23847:22;;21619:2;23835:52;;:11;:52::i;:::-;23828:59;;23744:151;;;:::o;23140:447::-;23215:13;23241:19;23286:1;23277:6;23273:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23263:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23241:47;;23299:15;:6;23306:1;23299:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;23325;:6;23332:1;23325:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;23356:9;23381:1;23372:6;23368:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23356:26;;23351:131;23388:1;23384;:5;23351:131;;;23423:8;23440:3;23432:5;:11;23423:21;;;;;;;;;;;;;;;;;;23411:6;23418:1;23411:9;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;23469:1;23459:11;;;;;23391:3;;;;:::i;:::-;;;23351:131;;;;23509:1;23500:5;:10;23492:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23572:6;23558:21;;;23140:447;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:137::-;;523:6;510:20;501:29;;539:32;565:5;539:32;:::i;:::-;491:86;;;;:::o;583:139::-;;667:6;654:20;645:29;;683:33;710:5;683:33;:::i;:::-;635:87;;;;:::o;728:143::-;;816:6;810:13;801:22;;832:33;859:5;832:33;:::i;:::-;791:80;;;;:::o;877:262::-;;985:2;973:9;964:7;960:23;956:32;953:2;;;1001:1;998;991:12;953:2;1044:1;1069:53;1114:7;1105:6;1094:9;1090:22;1069:53;:::i;:::-;1059:63;;1015:117;943:196;;;;:::o;1145:407::-;;;1270:2;1258:9;1249:7;1245:23;1241:32;1238:2;;;1286:1;1283;1276:12;1238:2;1329:1;1354:53;1399:7;1390:6;1379:9;1375:22;1354:53;:::i;:::-;1344:63;;1300:117;1456:2;1482:53;1527:7;1518:6;1507:9;1503:22;1482:53;:::i;:::-;1472:63;;1427:118;1228:324;;;;;:::o;1558:278::-;;1674:2;1662:9;1653:7;1649:23;1645:32;1642:2;;;1690:1;1687;1680:12;1642:2;1733:1;1758:61;1811:7;1802:6;1791:9;1787:22;1758:61;:::i;:::-;1748:71;;1704:125;1632:204;;;;:::o;1842:262::-;;1950:2;1938:9;1929:7;1925:23;1921:32;1918:2;;;1966:1;1963;1956:12;1918:2;2009:1;2034:53;2079:7;2070:6;2059:9;2055:22;2034:53;:::i;:::-;2024:63;;1980:117;1908:196;;;;:::o;2110:407::-;;;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;2251:1;2248;2241:12;2203:2;2294:1;2319:53;2364:7;2355:6;2344:9;2340:22;2319:53;:::i;:::-;2309:63;;2265:117;2421:2;2447:53;2492:7;2483:6;2472:9;2468:22;2447:53;:::i;:::-;2437:63;;2392:118;2193:324;;;;;:::o;2523:260::-;;2630:2;2618:9;2609:7;2605:23;2601:32;2598:2;;;2646:1;2643;2636:12;2598:2;2689:1;2714:52;2758:7;2749:6;2738:9;2734:22;2714:52;:::i;:::-;2704:62;;2660:116;2588:195;;;;:::o;2789:262::-;;2897:2;2885:9;2876:7;2872:23;2868:32;2865:2;;;2913:1;2910;2903:12;2865:2;2956:1;2981:53;3026:7;3017:6;3006:9;3002:22;2981:53;:::i;:::-;2971:63;;2927:117;2855:196;;;;:::o;3057:284::-;;3176:2;3164:9;3155:7;3151:23;3147:32;3144:2;;;3192:1;3189;3182:12;3144:2;3235:1;3260:64;3316:7;3307:6;3296:9;3292:22;3260:64;:::i;:::-;3250:74;;3206:128;3134:207;;;;:::o;3347:118::-;3434:24;3452:5;3434:24;:::i;:::-;3429:3;3422:37;3412:53;;:::o;3471:109::-;3552:21;3567:5;3552:21;:::i;:::-;3547:3;3540:34;3530:50;;:::o;3586:118::-;3673:24;3691:5;3673:24;:::i;:::-;3668:3;3661:37;3651:53;;:::o;3710:157::-;3810:50;3854:5;3810:50;:::i;:::-;3805:3;3798:63;3788:79;;:::o;3873:364::-;;3989:39;4022:5;3989:39;:::i;:::-;4044:71;4108:6;4103:3;4044:71;:::i;:::-;4037:78;;4124:52;4169:6;4164:3;4157:4;4150:5;4146:16;4124:52;:::i;:::-;4201:29;4223:6;4201:29;:::i;:::-;4196:3;4192:39;4185:46;;3965:272;;;;;:::o;4243:377::-;;4377:39;4410:5;4377:39;:::i;:::-;4432:89;4514:6;4509:3;4432:89;:::i;:::-;4425:96;;4530:52;4575:6;4570:3;4563:4;4556:5;4552:16;4530:52;:::i;:::-;4607:6;4602:3;4598:16;4591:23;;4353:267;;;;;:::o;4626:326::-;;4789:67;4853:2;4848:3;4789:67;:::i;:::-;4782:74;;4886:30;4882:1;4877:3;4873:11;4866:51;4943:2;4938:3;4934:12;4927:19;;4772:180;;;:::o;4958:330::-;;5121:67;5185:2;5180:3;5121:67;:::i;:::-;5114:74;;5218:34;5214:1;5209:3;5205:11;5198:55;5279:2;5274:3;5270:12;5263:19;;5104:184;;;:::o;5294:369::-;;5457:67;5521:2;5516:3;5457:67;:::i;:::-;5450:74;;5554:34;5550:1;5545:3;5541:11;5534:55;5620:7;5615:2;5610:3;5606:12;5599:29;5654:2;5649:3;5645:12;5638:19;;5440:223;;;:::o;5669:381::-;;5832:67;5896:2;5891:3;5832:67;:::i;:::-;5825:74;;5929:34;5925:1;5920:3;5916:11;5909:55;5995:19;5990:2;5985:3;5981:12;5974:41;6041:2;6036:3;6032:12;6025:19;;5815:235;;;:::o;6056:373::-;;6219:67;6283:2;6278:3;6219:67;:::i;:::-;6212:74;;6316:34;6312:1;6307:3;6303:11;6296:55;6382:11;6377:2;6372:3;6368:12;6361:33;6420:2;6415:3;6411:12;6404:19;;6202:227;;;:::o;6435:369::-;;6598:67;6662:2;6657:3;6598:67;:::i;:::-;6591:74;;6695:34;6691:1;6686:3;6682:11;6675:55;6761:7;6756:2;6751:3;6747:12;6740:29;6795:2;6790:3;6786:12;6779:19;;6581:223;;;:::o;6810:384::-;;6973:67;7037:2;7032:3;6973:67;:::i;:::-;6966:74;;7070:34;7066:1;7061:3;7057:11;7050:55;7136:22;7131:2;7126:3;7122:12;7115:44;7185:2;7180:3;7176:12;7169:19;;6956:238;;;:::o;7200:382::-;;7363:67;7427:2;7422:3;7363:67;:::i;:::-;7356:74;;7460:34;7456:1;7451:3;7447:11;7440:55;7526:20;7521:2;7516:3;7512:12;7505:42;7573:2;7568:3;7564:12;7557:19;;7346:236;;;:::o;7588:377::-;;7751:67;7815:2;7810:3;7751:67;:::i;:::-;7744:74;;7848:34;7844:1;7839:3;7835:11;7828:55;7914:15;7909:2;7904:3;7900:12;7893:37;7956:2;7951:3;7947:12;7940:19;;7734:231;;;:::o;7971:387::-;;8134:67;8198:2;8193:3;8134:67;:::i;:::-;8127:74;;8231:34;8227:1;8222:3;8218:11;8211:55;8297:25;8292:2;8287:3;8283:12;8276:47;8349:2;8344:3;8340:12;8333:19;;8117:241;;;:::o;8364:367::-;;8527:67;8591:2;8586:3;8527:67;:::i;:::-;8520:74;;8624:34;8620:1;8615:3;8611:11;8604:55;8690:5;8685:2;8680:3;8676:12;8669:27;8722:2;8717:3;8713:12;8706:19;;8510:221;;;:::o;8737:376::-;;8900:67;8964:2;8959:3;8900:67;:::i;:::-;8893:74;;8997:34;8993:1;8988:3;8984:11;8977:55;9063:14;9058:2;9053:3;9049:12;9042:36;9104:2;9099:3;9095:12;9088:19;;8883:230;;;:::o;9119:385::-;;9282:67;9346:2;9341:3;9282:67;:::i;:::-;9275:74;;9379:34;9375:1;9370:3;9366:11;9359:55;9445:23;9440:2;9435:3;9431:12;9424:45;9495:2;9490:3;9486:12;9479:19;;9265:239;;;:::o;9510:357::-;;9691:85;9773:2;9768:3;9691:85;:::i;:::-;9684:92;;9806:25;9802:1;9797:3;9793:11;9786:46;9858:2;9853:3;9849:12;9842:19;;9674:193;;;:::o;9873:329::-;;10036:67;10100:2;10095:3;10036:67;:::i;:::-;10029:74;;10133:33;10129:1;10124:3;10120:11;10113:54;10193:2;10188:3;10184:12;10177:19;;10019:183;;;:::o;10208:351::-;;10389:85;10471:2;10466:3;10389:85;:::i;:::-;10382:92;;10504:19;10500:1;10495:3;10491:11;10484:40;10550:2;10545:3;10541:12;10534:19;;10372:187;;;:::o;10565:379::-;;10728:67;10792:2;10787:3;10728:67;:::i;:::-;10721:74;;10825:34;10821:1;10816:3;10812:11;10805:55;10891:17;10886:2;10881:3;10877:12;10870:39;10935:2;10930:3;10926:12;10919:19;;10711:233;;;:::o;10950:118::-;11037:24;11055:5;11037:24;:::i;:::-;11032:3;11025:37;11015:53;;:::o;11074:967::-;;11478:148;11622:3;11478:148;:::i;:::-;11471:155;;11643:95;11734:3;11725:6;11643:95;:::i;:::-;11636:102;;11755:148;11899:3;11755:148;:::i;:::-;11748:155;;11920:95;12011:3;12002:6;11920:95;:::i;:::-;11913:102;;12032:3;12025:10;;11460:581;;;;;:::o;12047:222::-;;12178:2;12167:9;12163:18;12155:26;;12191:71;12259:1;12248:9;12244:17;12235:6;12191:71;:::i;:::-;12145:124;;;;:::o;12275:442::-;;12462:2;12451:9;12447:18;12439:26;;12475:71;12543:1;12532:9;12528:17;12519:6;12475:71;:::i;:::-;12556:72;12624:2;12613:9;12609:18;12600:6;12556:72;:::i;:::-;12638;12706:2;12695:9;12691:18;12682:6;12638:72;:::i;:::-;12429:288;;;;;;:::o;12723:332::-;;12882:2;12871:9;12867:18;12859:26;;12895:71;12963:1;12952:9;12948:17;12939:6;12895:71;:::i;:::-;12976:72;13044:2;13033:9;13029:18;13020:6;12976:72;:::i;:::-;12849:206;;;;;:::o;13061:210::-;;13186:2;13175:9;13171:18;13163:26;;13199:65;13261:1;13250:9;13246:17;13237:6;13199:65;:::i;:::-;13153:118;;;;:::o;13277:222::-;;13408:2;13397:9;13393:18;13385:26;;13421:71;13489:1;13478:9;13474:17;13465:6;13421:71;:::i;:::-;13375:124;;;;:::o;13505:248::-;;13649:2;13638:9;13634:18;13626:26;;13662:84;13743:1;13732:9;13728:17;13719:6;13662:84;:::i;:::-;13616:137;;;;:::o;13759:313::-;;13910:2;13899:9;13895:18;13887:26;;13959:9;13953:4;13949:20;13945:1;13934:9;13930:17;13923:47;13987:78;14060:4;14051:6;13987:78;:::i;:::-;13979:86;;13877:195;;;;:::o;14078:419::-;;14282:2;14271:9;14267:18;14259:26;;14331:9;14325:4;14321:20;14317:1;14306:9;14302:17;14295:47;14359:131;14485:4;14359:131;:::i;:::-;14351:139;;14249:248;;;:::o;14503:419::-;;14707:2;14696:9;14692:18;14684:26;;14756:9;14750:4;14746:20;14742:1;14731:9;14727:17;14720:47;14784:131;14910:4;14784:131;:::i;:::-;14776:139;;14674:248;;;:::o;14928:419::-;;15132:2;15121:9;15117:18;15109:26;;15181:9;15175:4;15171:20;15167:1;15156:9;15152:17;15145:47;15209:131;15335:4;15209:131;:::i;:::-;15201:139;;15099:248;;;:::o;15353:419::-;;15557:2;15546:9;15542:18;15534:26;;15606:9;15600:4;15596:20;15592:1;15581:9;15577:17;15570:47;15634:131;15760:4;15634:131;:::i;:::-;15626:139;;15524:248;;;:::o;15778:419::-;;15982:2;15971:9;15967:18;15959:26;;16031:9;16025:4;16021:20;16017:1;16006:9;16002:17;15995:47;16059:131;16185:4;16059:131;:::i;:::-;16051:139;;15949:248;;;:::o;16203:419::-;;16407:2;16396:9;16392:18;16384:26;;16456:9;16450:4;16446:20;16442:1;16431:9;16427:17;16420:47;16484:131;16610:4;16484:131;:::i;:::-;16476:139;;16374:248;;;:::o;16628:419::-;;16832:2;16821:9;16817:18;16809:26;;16881:9;16875:4;16871:20;16867:1;16856:9;16852:17;16845:47;16909:131;17035:4;16909:131;:::i;:::-;16901:139;;16799:248;;;:::o;17053:419::-;;17257:2;17246:9;17242:18;17234:26;;17306:9;17300:4;17296:20;17292:1;17281:9;17277:17;17270:47;17334:131;17460:4;17334:131;:::i;:::-;17326:139;;17224:248;;;:::o;17478:419::-;;17682:2;17671:9;17667:18;17659:26;;17731:9;17725:4;17721:20;17717:1;17706:9;17702:17;17695:47;17759:131;17885:4;17759:131;:::i;:::-;17751:139;;17649:248;;;:::o;17903:419::-;;18107:2;18096:9;18092:18;18084:26;;18156:9;18150:4;18146:20;18142:1;18131:9;18127:17;18120:47;18184:131;18310:4;18184:131;:::i;:::-;18176:139;;18074:248;;;:::o;18328:419::-;;18532:2;18521:9;18517:18;18509:26;;18581:9;18575:4;18571:20;18567:1;18556:9;18552:17;18545:47;18609:131;18735:4;18609:131;:::i;:::-;18601:139;;18499:248;;;:::o;18753:419::-;;18957:2;18946:9;18942:18;18934:26;;19006:9;19000:4;18996:20;18992:1;18981:9;18977:17;18970:47;19034:131;19160:4;19034:131;:::i;:::-;19026:139;;18924:248;;;:::o;19178:419::-;;19382:2;19371:9;19367:18;19359:26;;19431:9;19425:4;19421:20;19417:1;19406:9;19402:17;19395:47;19459:131;19585:4;19459:131;:::i;:::-;19451:139;;19349:248;;;:::o;19603:419::-;;19807:2;19796:9;19792:18;19784:26;;19856:9;19850:4;19846:20;19842:1;19831:9;19827:17;19820:47;19884:131;20010:4;19884:131;:::i;:::-;19876:139;;19774:248;;;:::o;20028:419::-;;20232:2;20221:9;20217:18;20209:26;;20281:9;20275:4;20271:20;20267:1;20256:9;20252:17;20245:47;20309:131;20435:4;20309:131;:::i;:::-;20301:139;;20199:248;;;:::o;20453:222::-;;20584:2;20573:9;20569:18;20561:26;;20597:71;20665:1;20654:9;20650:17;20641:6;20597:71;:::i;:::-;20551:124;;;;:::o;20681:332::-;;20840:2;20829:9;20825:18;20817:26;;20853:71;20921:1;20910:9;20906:17;20897:6;20853:71;:::i;:::-;20934:72;21002:2;20991:9;20987:18;20978:6;20934:72;:::i;:::-;20807:206;;;;;:::o;21019:99::-;;21105:5;21099:12;21089:22;;21078:40;;;:::o;21124:169::-;;21242:6;21237:3;21230:19;21282:4;21277:3;21273:14;21258:29;;21220:73;;;;:::o;21299:148::-;;21438:3;21423:18;;21413:34;;;;:::o;21453:305::-;;21512:20;21530:1;21512:20;:::i;:::-;21507:25;;21546:20;21564:1;21546:20;:::i;:::-;21541:25;;21700:1;21632:66;21628:74;21625:1;21622:81;21619:2;;;21706:18;;:::i;:::-;21619:2;21750:1;21747;21743:9;21736:16;;21497:261;;;;:::o;21764:348::-;;21827:20;21845:1;21827:20;:::i;:::-;21822:25;;21861:20;21879:1;21861:20;:::i;:::-;21856:25;;22049:1;21981:66;21977:74;21974:1;21971:81;21966:1;21959:9;21952:17;21948:105;21945:2;;;22056:18;;:::i;:::-;21945:2;22104:1;22101;22097:9;22086:20;;21812:300;;;;:::o;22118:191::-;;22178:20;22196:1;22178:20;:::i;:::-;22173:25;;22212:20;22230:1;22212:20;:::i;:::-;22207:25;;22251:1;22248;22245:8;22242:2;;;22256:18;;:::i;:::-;22242:2;22301:1;22298;22294:9;22286:17;;22163:146;;;;:::o;22315:96::-;;22381:24;22399:5;22381:24;:::i;:::-;22370:35;;22360:51;;;:::o;22417:90::-;;22494:5;22487:13;22480:21;22469:32;;22459:48;;;:::o;22513:77::-;;22579:5;22568:16;;22558:32;;;:::o;22596:149::-;;22672:66;22665:5;22661:78;22650:89;;22640:105;;;:::o;22751:126::-;;22828:42;22821:5;22817:54;22806:65;;22796:81;;;:::o;22883:77::-;;22949:5;22938:16;;22928:32;;;:::o;22966:152::-;;23062:50;23106:5;23062:50;:::i;:::-;23049:63;;23039:79;;;:::o;23124:126::-;;23220:24;23238:5;23220:24;:::i;:::-;23207:37;;23197:53;;;:::o;23256:307::-;23324:1;23334:113;23348:6;23345:1;23342:13;23334:113;;;23433:1;23428:3;23424:11;23418:18;23414:1;23409:3;23405:11;23398:39;23370:2;23367:1;23363:10;23358:15;;23334:113;;;23465:6;23462:1;23459:13;23456:2;;;23545:1;23536:6;23531:3;23527:16;23520:27;23456:2;23305:258;;;;:::o;23569:171::-;;23631:24;23649:5;23631:24;:::i;:::-;23622:33;;23677:4;23670:5;23667:15;23664:2;;;23685:18;;:::i;:::-;23664:2;23732:1;23725:5;23721:13;23714:20;;23612:128;;;:::o;23746:180::-;23794:77;23791:1;23784:88;23891:4;23888:1;23881:15;23915:4;23912:1;23905:15;23932:102;;24024:2;24020:7;24015:2;24008:5;24004:14;24000:28;23990:38;;23980:54;;;:::o;24040:122::-;24113:24;24131:5;24113:24;:::i;:::-;24106:5;24103:35;24093:2;;24152:1;24149;24142:12;24093:2;24083:79;:::o;24168:116::-;24238:21;24253:5;24238:21;:::i;:::-;24231:5;24228:32;24218:2;;24274:1;24271;24264:12;24218:2;24208:76;:::o;24290:122::-;24363:24;24381:5;24363:24;:::i;:::-;24356:5;24353:35;24343:2;;24402:1;24399;24392:12;24343:2;24333:79;:::o;24418:120::-;24490:23;24507:5;24490:23;:::i;:::-;24483:5;24480:34;24470:2;;24528:1;24525;24518:12;24470:2;24460:78;:::o;24544:122::-;24617:24;24635:5;24617:24;:::i;:::-;24610:5;24607:35;24597:2;;24656:1;24653;24646:12;24597:2;24587:79;:::o

Swarm Source

ipfs://38847c788078211124d653cc44c6f1d4dff68bc22395fffbdfccbce72f26ae39
Loading...
Loading
[ 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.