Contract 0x7DA1b58f0A7cBb70f756A01412842D5a8796454E 9

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xbd79d326827c1894a2f262f1be26f33d0eeaf5a4d49725e73610c2bf662f6782Batch Update Vol...1331250632023-09-21 8:25:0715 secs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00025419 0.1
0xa8b8130b82a93eb0c1f05dc96ddefbcfc663a7a293a4240701949d95727a89d8Batch Update Vol...1331178492023-09-21 7:55:0730 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00023178 0.1
0xaa5439e19e98bbae58feacff8eb8d416626a74850d8f78ff7051554ec3cb91cbBatch Update Vol...1331106362023-09-21 7:25:071 hr ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00013947 0.1
0x43d78cf793935ed417de9fba7a480836eb6d81d05491e0d50664ecfd2c8f4fd5Batch Update Vol...1331034552023-09-21 6:55:081 hr 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00019589 0.1
0xb30faf2e8a343c10e81664c695e5f9f163a5a21122e86810690f828d22d9fc9dBatch Update Vol...1330962962023-09-21 6:25:072 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00017014 0.1
0xddd67e5b8d836383109d6a6a3b9f174f4c69f054794252b7c06a47063c22b866Batch Update Vol...1330891462023-09-21 5:55:072 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00016757 0.1
0xb278668be3ee320ce3fb6eb07b50e8253d6cb4e3adf8a35de96882635b10101fBatch Update Vol...1330821242023-09-21 5:25:073 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00018823 0.1
0x908ec5b45104a0d6ccb30b851a170c5b0ebabcae7bbf6a4ff76923a27e67db0dBatch Update Vol...1330752542023-09-21 4:55:073 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00019358 0.1
0x177c68cdd8129cfb617925804a60fe00895a8d9f817f791e64f3c07ec397cdcaBatch Update Vol...1330684452023-09-21 4:25:074 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00022124 0.1
0x38d12705a24db216abb12d6c9245affd7217e4dbffd651e1b2ec9eb93ce21b06Batch Update Vol...1330615052023-09-21 3:55:074 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00021326 0.1
0x136d6918bd855f15483df41c53bc2f5c85ec74cf5fb3a5876cf265ba38f04f2dBatch Update Vol...1330545672023-09-21 3:25:085 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00019137 0.1
0x636cd67afdac8c01291535670e5df2fce613a560319dbcf61bb578e9d00976d4Batch Update Vol...1330475552023-09-21 2:55:075 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00016473 0.1
0x2d3c6799cf3abc5395bab4f648cd2f2ea6f6fac747bf73b12df877d632586820Batch Update Vol...1330405142023-09-21 2:25:086 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00018944 0.1
0x4ec82940c41243ed972d57a8b153ded89bb13e306bde4015ba5df6da7e386531Batch Update Vol...1330337232023-09-21 1:55:086 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00018059 0.1
0xf995769543cbf0b62746752aec21cbb05fe13b173b01c05bd3756a29f7a65599Batch Update Vol...1330270522023-09-21 1:25:087 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00017499 0.1
0xfdd0441f2e555628d51f0a607ba2c1ff20ec8a0cc34e7d50eb66b5a76117529cBatch Update Vol...1330066282023-09-20 23:55:088 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.0001495 0.1
0xa8d4e0a56ce211726de3b5d33145c3d8af2562de27d7f70f0750aa403d6f6ba7Batch Update Vol...1330005022023-09-20 23:25:079 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00015676 0.1
0x90256f5996082696721c930f77d32f5729892b38be009c6e9d6877843d3614c6Batch Update Vol...1329941992023-09-20 22:55:079 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00013886 0.1
0x5f8f97dac428ccfd392fb73c31c2e87f03d2c1f65a72ca78c8059e6c5a3d8bc1Batch Update Vol...1329871472023-09-20 22:25:0810 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00015902 0.1
0xdbebd25611d4a6f6c0a81588283a79c3dc87fc15d582f4bdbd4912a3dc3b16faBatch Update Vol...1329801972023-09-20 21:55:0810 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00017475 0.1
0x0f7d8ddea9f1293a0ff6f926fd9424dfa4d1737a4c99b2a1b2cb708bf2d41599Batch Update Vol...1329734082023-09-20 21:25:0811 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00018157 0.1
0xecaed74fdbaaabc2252331f465bee9f4241bdc36165b73932f97c03ca9f8d26dBatch Update Vol...1329668722023-09-20 20:55:0811 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00019325 0.1
0xa605e2d9fb8b2b746125a8bb7d9773f5746a26e153583ebb2803301a067976f5Batch Update Vol...1329597272023-09-20 20:25:0712 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00023316 0.1
0x794678df884fc7cdf775992c89d2860f222bce1414cef1d8885cc346d6cf1f29Batch Update Vol...1329529532023-09-20 19:55:0812 hrs 30 mins ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00025008 0.1
0x1350b56a7a32ec3018b75cd18beafd77d7946f866c7457f9a951d410d38eafaeBatch Update Vol...1329459372023-09-20 19:25:0813 hrs ago0xc1b9dbaa2c6740423bb1d181c3d60d6014f9d8aa IN  0x7da1b58f0a7cbb70f756a01412842d5a8796454e0 ETH0.00017806 0.1
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VolatilityEngine

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license
File 1 of 8 : AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";

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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev 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 2 of 8 : 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 3 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// 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 4 of 8 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";

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

File 5 of 8 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 6 of 8 : IERC165.sol
// SPDX-License-Identifier: MIT
// 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 7 of 8 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 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 10, 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 * 8) < value ? 1 : 0);
        }
    }
}

File 8 of 8 : VolatilityEngine.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity =0.8.18;

// Contracts
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";

interface ISsovV3 {
    function currentEpoch() external view returns (uint256 epoch);

    function getEpochTimes(
        uint256 epoch
    ) external view returns (uint256 start, uint256 end);
}

/// @title Volatility Engine
/// @author witherblock
/// @notice This contract stores the volatility of different tokens (token periods) for all Dopex Products
contract VolatilityEngine is AccessControl {
    /*==== PUBLIC VARS ====*/

    /// @dev Keeper Role
    bytes32 public constant KEEPER_ROLE = keccak256("KEEPER_ROLE");

    /// @dev DEFAULT_HEARTBEAT of 60 minutes ensures that the volatility data does not remain stale with any new volatility tracking for any token(and token period)
    uint256 public constant DEFAULT_HEARTBEAT = 60 minutes;

    /// @dev SSOV address => id
    /// This mapping is required to allow the use of the deprecated getVolatility
    mapping(address => bytes32) public ssovToId;

    /// @dev id => heartbeat
    mapping(bytes32 => uint256) public heartbeats;

    /// @dev id => expiry => strike => Volatility
    mapping(bytes32 => mapping(uint256 => mapping(uint256 => Volatility)))
        public volatilities;

    /// @dev id => isFlatVolatility
    mapping(bytes32 => bool) public isFlatVolatility;

    /// @dev id => Volatility
    mapping(bytes32 => Volatility) public flatVolatilities;

    struct Volatility {
        /// @dev the volatility
        uint256 volatility;
        /// @dev last updated at timestamp
        uint256 lastUpdated;
    }

    /*==== EVENTS ====*/

    /// @notice The event is emitted on setting an ssov to an id
    /// @param id id
    /// @param ssov ssov
    event SetSsovToId(bytes32 id, address ssov);

    /// @notice The event is emitted on setting heartbeat for an id
    /// @param id id
    /// @param heartbeat heartbeat
    event SetHeartbeat(bytes32 id, uint256 heartbeat);

    /// @notice The event is emitted on setting if an id is using flat volatilities
    /// @param id id
    /// @param isFlatVolatility isFlatVolatility
    event SetIsFlatVolatility(bytes32 id, bool isFlatVolatility);

    /// @notice The event is emitted on updating of a volatility for an id
    /// @param id id
    /// @param expiry expiry
    /// @param strikes the strikes
    /// @param vols the volatilites
    event VolatilityUpdated(
        bytes32 id,
        uint256 expiry,
        uint256[] strikes,
        uint256[] vols
    );

    /// @notice The event is emitted on updating of a flat volatility for an id
    /// @param id id
    /// @param vol volatility
    event FlatVolatilityUpdated(bytes32 id, uint256 vol);

    /*==== ERRORS ====*/

    /// @notice Emitted if the heartbeat of a certain volatility is not met
    error HeartbeatNotFulfilled();

    /*==== CONSTRUCTOR ====*/

    constructor() {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    /*==== SETTER FUNCTIONS (ONLY ADMIN) ====*/

    /// @notice Set ssovs to an id
    /// @param _ssov ssov address
    /// @param _id id
    function setSsovToId(
        bytes32 _id,
        address _ssov
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        ssovToId[_ssov] = _id;

        emit SetSsovToId(_id, _ssov);
    }

    /// @notice Set heartbeat for an id
    /// @param _id id
    /// @param _heartbeat heartbeat
    function setHeartbeat(
        bytes32 _id,
        uint256 _heartbeat
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        heartbeats[_id] = _heartbeat;

        emit SetHeartbeat(_id, _heartbeat);
    }

    /// @notice Set isFlatVolatility for an id
    /// @param _id id
    /// @param _isFlatVolatility isFlatVolatility
    function setIsFlatVolatility(
        bytes32 _id,
        bool _isFlatVolatility
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        isFlatVolatility[_id] = _isFlatVolatility;

        emit SetIsFlatVolatility(_id, _isFlatVolatility);
    }

    /*==== KEEPER FUNCTIONS (ONLY KEEPER) ====*/

    /**
     * @notice Updates the volatility
     * @param _id id
     * @param _expiry expiry
     * @param _strikes strikes
     * @param _vols volatilities
     */
    function updateVolatility(
        bytes32 _id,
        uint256 _expiry,
        uint256[] memory _strikes,
        uint256[] memory _vols
    ) public onlyRole(KEEPER_ROLE) {
        require(_strikes.length == _vols.length, "Input lengths must match");
        require(
            !isFlatVolatility[_id],
            "Use updateFlatVolatility to update flat volatilities"
        );

        uint256 blockTimestamp = block.timestamp;
        uint256 strikesLength = _strikes.length;

        for (uint256 i; i < strikesLength; ) {
            require(_vols[i] > 0, "Volatility cannot be 0");
            volatilities[_id][_expiry][_strikes[i]] = Volatility({
                volatility: _vols[i],
                lastUpdated: blockTimestamp
            });

            unchecked {
                ++i;
            }
        }

        emit VolatilityUpdated(_id, _expiry, _strikes, _vols);
    }

    /**
     * @notice Batch updates the volatility
     * @param _ids ids
     * @param _expiries expiries
     * @param _strikes strikes
     * @param _vols volatilities
     */
    function batchUpdateVolatilities(
        bytes32[] memory _ids,
        uint256[] memory _expiries,
        uint256[][] memory _strikes,
        uint256[][] memory _vols
    ) external onlyRole(KEEPER_ROLE) {
        require(_ids.length == _expiries.length, "Input lengths must match");

        uint256 idsLength = _ids.length;

        for (uint256 i; i < idsLength; ) {
            updateVolatility(_ids[i], _expiries[i], _strikes[i], _vols[i]);

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Updates the volatility
     * @param _id id
     * @param _vol volatility
     */
    function updateFlatVolatility(
        bytes32 _id,
        uint256 _vol
    ) public onlyRole(KEEPER_ROLE) {
        require(
            isFlatVolatility[_id],
            "Use updateVolatility to update non flat volatilities"
        );

        flatVolatilities[_id] = Volatility({
            volatility: _vol,
            lastUpdated: block.timestamp
        });

        emit FlatVolatilityUpdated(_id, _vol);
    }

    /**
     * @notice Batch updates flat volatilities
     * @param _ids ids
     * @param _vols volatilities
     */
    function batchUpdateFlatVolatilities(
        bytes32[] memory _ids,
        uint256[] memory _vols
    ) public onlyRole(KEEPER_ROLE) {
        require(_ids.length == _vols.length, "Input lengths must match");

        uint256 idsLength = _ids.length;

        for (uint256 i; i < idsLength; ) {
            updateFlatVolatility(_ids[i], _vols[i]);

            unchecked {
                ++i;
            }
        }
    }

    /*==== VIEWS ====*/

    /**
     * @notice Gets the volatility of a strike
     * @param _id id
     * @param _expiry expiry
     * @param _strike strike
     * @return volatility
     */
    function getVolatility(
        bytes32 _id,
        uint256 _expiry,
        uint256 _strike
    ) external view returns (uint256) {
        Volatility memory vol;

        if (isFlatVolatility[_id]) {
            vol = flatVolatilities[_id];
        } else {
            vol = volatilities[_id][_expiry][_strike];
        }

        uint256 _heartbeat = heartbeats[_id] > 0
            ? heartbeats[_id]
            : DEFAULT_HEARTBEAT;

        if (block.timestamp > vol.lastUpdated + _heartbeat) {
            revert HeartbeatNotFulfilled();
        }

        return vol.volatility;
    }

    /**
     * @notice DEPRECATED Gets the volatility of a strike for an ssov
     * @param _strike strike
     * @return volatility
     */
    function getVolatility(uint256 _strike) external view returns (uint256) {
        bytes32 id = ssovToId[msg.sender];

        Volatility memory vol;

        if (isFlatVolatility[id]) {
            vol = flatVolatilities[id];
        } else {
            uint256 epoch = ISsovV3(msg.sender).currentEpoch();

            (, uint256 expiry) = ISsovV3(msg.sender).getEpochTimes(epoch);

            vol = volatilities[id][expiry][_strike];
        }

        uint256 _heartbeat = heartbeats[id] > 0
            ? heartbeats[id]
            : DEFAULT_HEARTBEAT;

        if (block.timestamp > vol.lastUpdated + _heartbeat) {
            revert HeartbeatNotFulfilled();
        }

        return vol.volatility;
    }
}

Settings
{
  "evmVersion": "paris",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"HeartbeatNotFulfilled","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"vol","type":"uint256"}],"name":"FlatVolatilityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"heartbeat","type":"uint256"}],"name":"SetHeartbeat","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"isFlatVolatility","type":"bool"}],"name":"SetIsFlatVolatility","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"ssov","type":"address"}],"name":"SetSsovToId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"strikes","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"vols","type":"uint256[]"}],"name":"VolatilityUpdated","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_HEARTBEAT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KEEPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_ids","type":"bytes32[]"},{"internalType":"uint256[]","name":"_vols","type":"uint256[]"}],"name":"batchUpdateFlatVolatilities","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_ids","type":"bytes32[]"},{"internalType":"uint256[]","name":"_expiries","type":"uint256[]"},{"internalType":"uint256[][]","name":"_strikes","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_vols","type":"uint256[][]"}],"name":"batchUpdateVolatilities","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"flatVolatilities","outputs":[{"internalType":"uint256","name":"volatility","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_expiry","type":"uint256"},{"internalType":"uint256","name":"_strike","type":"uint256"}],"name":"getVolatility","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_strike","type":"uint256"}],"name":"getVolatility","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"heartbeats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isFlatVolatility","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":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_heartbeat","type":"uint256"}],"name":"setHeartbeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"bool","name":"_isFlatVolatility","type":"bool"}],"name":"setIsFlatVolatility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_ssov","type":"address"}],"name":"setSsovToId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ssovToId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_vol","type":"uint256"}],"name":"updateFlatVolatility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_expiry","type":"uint256"},{"internalType":"uint256[]","name":"_strikes","type":"uint256[]"},{"internalType":"uint256[]","name":"_vols","type":"uint256[]"}],"name":"updateVolatility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"volatilities","outputs":[{"internalType":"uint256","name":"volatility","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50620000276000801b336200002d60201b60201c565b620001a6565b6200003f82826200004360201b60201c565b5050565b6200005582826200013460201b60201c565b6200013057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620000d56200019e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6127ab80620001b66000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806355ceaddb116100c3578063c482e8a81161007c578063c482e8a8146103d5578063c61736db146103f1578063d547741f1461040d578063e0400f3014610429578063f0f2119314610445578063fb7b58ea146104755761014d565b806355ceaddb146102ef578063644b68401461030b57806391d148541461033b578063a217fddf1461036b578063bc32035314610389578063c189c19b146103a55761014d565b806320f415e21161011557806320f415e21461021c578063248a9ca3146102385780632f2ff15d14610268578063364bc15a1461028457806336568abe146102a25780634266164e146102be5761014d565b806301ffc9a71461015257806308453cf8146101825780630beb3196146101a057806313109593146101bc578063164cedce146101ec575b600080fd5b61016c60048036038101906101679190611757565b6104a6565b604051610179919061179f565b60405180910390f35b61018a610520565b60405161019791906117d3565b60405180910390f35b6101ba60048036038101906101b59190611b4d565b610526565b005b6101d660048036038101906101d19190611c82565b61062d565b6040516101e39190611cbe565b60405180910390f35b61020660048036038101906102019190611cd9565b610645565b60405161021391906117d3565b60405180910390f35b61023660048036038101906102319190611d2c565b610799565b005b610252600480360381019061024d9190611dcb565b6109c2565b60405161025f9190611cbe565b60405180910390f35b610282600480360381019061027d9190611df8565b6109e1565b005b61028c610a02565b6040516102999190611cbe565b60405180910390f35b6102bc60048036038101906102b79190611df8565b610a26565b005b6102d860048036038101906102d39190611cd9565b610aa9565b6040516102e6929190611e38565b60405180910390f35b61030960048036038101906103049190611e61565b610ae7565b005b61032560048036038101906103209190611dcb565b610bee565b60405161033291906117d3565b60405180910390f35b61035560048036038101906103509190611df8565b610c06565b604051610362919061179f565b60405180910390f35b610373610c70565b6040516103809190611cbe565b60405180910390f35b6103a3600480360381019061039e9190611e61565b610c77565b005b6103bf60048036038101906103ba9190611ea1565b610cda565b6040516103cc91906117d3565b60405180910390f35b6103ef60048036038101906103ea9190611ece565b610f63565b005b61040b60048036038101906104069190611df8565b611032565b005b61042760048036038101906104229190611df8565b6110c1565b005b610443600480360381019061043e9190611f72565b6110e2565b005b61045f600480360381019061045a9190611dcb565b611158565b60405161046c919061179f565b60405180910390f35b61048f600480360381019061048a9190611dcb565b611178565b60405161049d929190611e38565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051957506105188261119c565b5b9050919050565b610e1081565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab61055081611206565b8351855114610594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058b9061200f565b60405180910390fd5b60008551905060005b81811015610624576106198782815181106105bb576105ba61202f565b5b60200260200101518783815181106105d6576105d561202f565b5b60200260200101518784815181106105f1576105f061202f565b5b602002602001015187858151811061060c5761060b61202f565b5b6020026020010151610799565b80600101905061059d565b50505050505050565b60016020528060005260406000206000915090505481565b600061064f6116d1565b6004600086815260200190815260200160002060009054906101000a900460ff16156106ae5760056000868152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050610705565b60036000868152602001908152602001600020600085815260200190815260200160002060008481526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090505b60008060026000888152602001908152602001600020541161072957610e1061073e565b60026000878152602001908152602001600020545b9050808260200151610750919061208d565b421115610789576040517fb009dcac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160000151925050509392505050565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab6107c381611206565b8151835114610807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fe9061200f565b60405180910390fd5b6004600086815260200190815260200160002060009054906101000a900460ff1615610868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085f90612133565b60405180910390fd5b600042905060008451905060005b8181101561097b5760008582815181106108935761089261202f565b5b6020026020010151116108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d29061219f565b60405180910390fd5b60405180604001604052808683815181106108f9576108f861202f565b5b6020026020010151815260200184815250600360008a8152602001908152602001600020600089815260200190815260200160002060008884815181106109435761094261202f565b5b602002602001015181526020019081526020016000206000820151816000015560208201518160010155905050806001019050610876565b507f89a7b42bf165ac5e7cd44670a4a86ab0389e2cf26533ce9ab86f8e60a23e37c2878787876040516109b1949392919061227d565b60405180910390a150505050505050565b6000806000838152602001908152602001600020600101549050919050565b6109ea826109c2565b6109f381611206565b6109fd838361121a565b505050565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab81565b610a2e6112fa565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9290612342565b60405180910390fd5b610aa58282611302565b5050565b600360205282600052604060002060205281600052604060002060205280600052604060002060009250925050508060000154908060010154905082565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610b1181611206565b6004600084815260200190815260200160002060009054906101000a900460ff16610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b68906123d4565b60405180910390fd5b6040518060400160405280838152602001428152506005600085815260200190815260200160002060008201518160000155602082015181600101559050507f61afe4071f7a3106f9aef8f8c066e554bcd338e1a0add18332ee2d0adced23038383604051610be19291906123f4565b60405180910390a1505050565b60026020528060005260406000206000915090505481565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b6000801b610c8481611206565b8160026000858152602001908152602001600020819055507f095e4958bc1b3a9ec00acd2303b9b62ad49f2ad5c3b8d4e711c590e2613bbed18383604051610ccd9291906123f4565b60405180910390a1505050565b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610d276116d1565b6004600083815260200190815260200160002060009054906101000a900460ff1615610d865760056000838152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050610ed0565b60003373ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df79190612432565b905060003373ffffffffffffffffffffffffffffffffffffffff16636f56f56f836040518263ffffffff1660e01b8152600401610e3491906117d3565b6040805180830381865afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e74919061245f565b915050600360008581526020019081526020016000206000828152602001908152602001600020600087815260200190815260200160002060405180604001604052908160008201548152602001600182015481525050925050505b600080600260008581526020019081526020016000205411610ef457610e10610f09565b60026000848152602001908152602001600020545b9050808260200151610f1b919061208d565b421115610f54576040517fb009dcac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600001519350505050919050565b7ffc8737ab85eb45125971625a9ebdb75cc78e01d5c1fa80c4c6e5203f47bc4fab610f8d81611206565b8151835114610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc89061200f565b60405180910390fd5b60008351905060005b8181101561102b57611020858281518110610ff857610ff761202f565b5b60200260200101518583815181106110135761101261202f565b5b6020026020010151610ae7565b806001019050610fda565b5050505050565b6000801b61103f81611206565b82600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f74707ab68363a5ddf2c0f4af26df2831cea2b5c507c39153f32fa713f69e4ed783836040516110b49291906124ae565b60405180910390a1505050565b6110ca826109c2565b6110d381611206565b6110dd8383611302565b505050565b6000801b6110ef81611206565b816004600085815260200190815260200160002060006101000a81548160ff0219169083151502179055507f8c59d8a83e39684d620f26844b13eef64bd2cc322739c0ff5cce314f4caf3094838360405161114b9291906124d7565b60405180910390a1505050565b60046020528060005260406000206000915054906101000a900460ff1681565b60056020528060005260406000206000915090508060000154908060010154905082565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611217816112126112fa565b6113e3565b50565b6112248282610c06565b6112f657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061129b6112fa565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b61130c8282610c06565b156113df57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113846112fa565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6113ed8282610c06565b611464576113fa81611468565b6114088360001c6020611495565b604051602001611419929190612609565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b919061267c565b60405180910390fd5b5050565b606061148e8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611495565b9050919050565b6060600060028360026114a8919061269e565b6114b2919061208d565b67ffffffffffffffff8111156114cb576114ca611804565b5b6040519080825280601f01601f1916602001820160405280156114fd5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106115355761153461202f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106115995761159861202f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026115d9919061269e565b6115e3919061208d565b90505b6001811115611683577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106116255761162461202f565b5b1a60f81b82828151811061163c5761163b61202f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061167c906126e0565b90506115e6565b50600084146116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be90612755565b60405180910390fd5b8091505092915050565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611734816116ff565b811461173f57600080fd5b50565b6000813590506117518161172b565b92915050565b60006020828403121561176d5761176c6116f5565b5b600061177b84828501611742565b91505092915050565b60008115159050919050565b61179981611784565b82525050565b60006020820190506117b46000830184611790565b92915050565b6000819050919050565b6117cd816117ba565b82525050565b60006020820190506117e860008301846117c4565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61183c826117f3565b810181811067ffffffffffffffff8211171561185b5761185a611804565b5b80604052505050565b600061186e6116eb565b905061187a8282611833565b919050565b600067ffffffffffffffff82111561189a57611899611804565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6118c3816118b0565b81146118ce57600080fd5b50565b6000813590506118e0816118ba565b92915050565b60006118f96118f48461187f565b611864565b9050808382526020820190506020840283018581111561191c5761191b6118ab565b5b835b81811015611945578061193188826118d1565b84526020840193505060208101905061191e565b5050509392505050565b600082601f830112611964576119636117ee565b5b81356119748482602086016118e6565b91505092915050565b600067ffffffffffffffff82111561199857611997611804565b5b602082029050602081019050919050565b6119b2816117ba565b81146119bd57600080fd5b50565b6000813590506119cf816119a9565b92915050565b60006119e86119e38461197d565b611864565b90508083825260208201905060208402830185811115611a0b57611a0a6118ab565b5b835b81811015611a345780611a2088826119c0565b845260208401935050602081019050611a0d565b5050509392505050565b600082601f830112611a5357611a526117ee565b5b8135611a638482602086016119d5565b91505092915050565b600067ffffffffffffffff821115611a8757611a86611804565b5b602082029050602081019050919050565b6000611aab611aa684611a6c565b611864565b90508083825260208201905060208402830185811115611ace57611acd6118ab565b5b835b81811015611b1557803567ffffffffffffffff811115611af357611af26117ee565b5b808601611b008982611a3e565b85526020850194505050602081019050611ad0565b5050509392505050565b600082601f830112611b3457611b336117ee565b5b8135611b44848260208601611a98565b91505092915050565b60008060008060808587031215611b6757611b666116f5565b5b600085013567ffffffffffffffff811115611b8557611b846116fa565b5b611b918782880161194f565b945050602085013567ffffffffffffffff811115611bb257611bb16116fa565b5b611bbe87828801611a3e565b935050604085013567ffffffffffffffff811115611bdf57611bde6116fa565b5b611beb87828801611b1f565b925050606085013567ffffffffffffffff811115611c0c57611c0b6116fa565b5b611c1887828801611b1f565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c4f82611c24565b9050919050565b611c5f81611c44565b8114611c6a57600080fd5b50565b600081359050611c7c81611c56565b92915050565b600060208284031215611c9857611c976116f5565b5b6000611ca684828501611c6d565b91505092915050565b611cb8816118b0565b82525050565b6000602082019050611cd36000830184611caf565b92915050565b600080600060608486031215611cf257611cf16116f5565b5b6000611d00868287016118d1565b9350506020611d11868287016119c0565b9250506040611d22868287016119c0565b9150509250925092565b60008060008060808587031215611d4657611d456116f5565b5b6000611d54878288016118d1565b9450506020611d65878288016119c0565b935050604085013567ffffffffffffffff811115611d8657611d856116fa565b5b611d9287828801611a3e565b925050606085013567ffffffffffffffff811115611db357611db26116fa565b5b611dbf87828801611a3e565b91505092959194509250565b600060208284031215611de157611de06116f5565b5b6000611def848285016118d1565b91505092915050565b60008060408385031215611e0f57611e0e6116f5565b5b6000611e1d858286016118d1565b9250506020611e2e85828601611c6d565b9150509250929050565b6000604082019050611e4d60008301856117c4565b611e5a60208301846117c4565b9392505050565b60008060408385031215611e7857611e776116f5565b5b6000611e86858286016118d1565b9250506020611e97858286016119c0565b9150509250929050565b600060208284031215611eb757611eb66116f5565b5b6000611ec5848285016119c0565b91505092915050565b60008060408385031215611ee557611ee46116f5565b5b600083013567ffffffffffffffff811115611f0357611f026116fa565b5b611f0f8582860161194f565b925050602083013567ffffffffffffffff811115611f3057611f2f6116fa565b5b611f3c85828601611a3e565b9150509250929050565b611f4f81611784565b8114611f5a57600080fd5b50565b600081359050611f6c81611f46565b92915050565b60008060408385031215611f8957611f886116f5565b5b6000611f97858286016118d1565b9250506020611fa885828601611f5d565b9150509250929050565b600082825260208201905092915050565b7f496e707574206c656e67746873206d757374206d617463680000000000000000600082015250565b6000611ff9601883611fb2565b915061200482611fc3565b602082019050919050565b6000602082019050818103600083015261202881611fec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612098826117ba565b91506120a3836117ba565b92508282019050808211156120bb576120ba61205e565b5b92915050565b7f55736520757064617465466c6174566f6c6174696c69747920746f207570646160008201527f746520666c617420766f6c6174696c6974696573000000000000000000000000602082015250565b600061211d603483611fb2565b9150612128826120c1565b604082019050919050565b6000602082019050818103600083015261214c81612110565b9050919050565b7f566f6c6174696c6974792063616e6e6f74206265203000000000000000000000600082015250565b6000612189601683611fb2565b915061219482612153565b602082019050919050565b600060208201905081810360008301526121b88161217c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6121f4816117ba565b82525050565b600061220683836121eb565b60208301905092915050565b6000602082019050919050565b600061222a826121bf565b61223481856121ca565b935061223f836121db565b8060005b8381101561227057815161225788826121fa565b975061226283612212565b925050600181019050612243565b5085935050505092915050565b60006080820190506122926000830187611caf565b61229f60208301866117c4565b81810360408301526122b1818561221f565b905081810360608301526122c5818461221f565b905095945050505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061232c602f83611fb2565b9150612337826122d0565b604082019050919050565b6000602082019050818103600083015261235b8161231f565b9050919050565b7f55736520757064617465566f6c6174696c69747920746f20757064617465206e60008201527f6f6e20666c617420766f6c6174696c6974696573000000000000000000000000602082015250565b60006123be603483611fb2565b91506123c982612362565b604082019050919050565b600060208201905081810360008301526123ed816123b1565b9050919050565b60006040820190506124096000830185611caf565b61241660208301846117c4565b9392505050565b60008151905061242c816119a9565b92915050565b600060208284031215612448576124476116f5565b5b60006124568482850161241d565b91505092915050565b60008060408385031215612476576124756116f5565b5b60006124848582860161241d565b92505060206124958582860161241d565b9150509250929050565b6124a881611c44565b82525050565b60006040820190506124c36000830185611caf565b6124d0602083018461249f565b9392505050565b60006040820190506124ec6000830185611caf565b6124f96020830184611790565b9392505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612541601783612500565b915061254c8261250b565b601782019050919050565b600081519050919050565b60005b83811015612580578082015181840152602081019050612565565b60008484015250505050565b600061259782612557565b6125a18185612500565b93506125b1818560208601612562565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006125f3601183612500565b91506125fe826125bd565b601182019050919050565b600061261482612534565b9150612620828561258c565b915061262b826125e6565b9150612637828461258c565b91508190509392505050565b600061264e82612557565b6126588185611fb2565b9350612668818560208601612562565b612671816117f3565b840191505092915050565b600060208201905081810360008301526126968184612643565b905092915050565b60006126a9826117ba565b91506126b4836117ba565b92508282026126c2816117ba565b915082820484148315176126d9576126d861205e565b5b5092915050565b60006126eb826117ba565b9150600082036126fe576126fd61205e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061273f602083611fb2565b915061274a82612709565b602082019050919050565b6000602082019050818103600083015261276e81612732565b905091905056fea26469706673582212203f6c9752e9238da284cd5defe62fbd58a279ff4fa92e295ec582befc3e8adfd164736f6c63430008120033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.