Contract 0xacc2d27400029904919ea54ffc0b18bf07c57875 2

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x12e3a0bfa814d2ae01b4b65f0e6c47398cb4a4fa8815d8a0ed6b2e8a255fe2a9Submit Value221432952021-12-04 23:32:411 min ago0x6ffd0dfe81308794357f0f83339a4529e5564695 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.006254393
0x15e4385f4457d859525bc28119b8ad6f788aaa29ba4290747d301c9db3f1dce3Submit Value221428822021-12-04 23:18:3115 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.000572421766
0x6ba91944726a71b0809cc60f473807ba92a5c553c67489c2b7b79beed204ee3fSubmit Value221428822021-12-04 23:18:3115 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.000572421766
0x1a0aa5c57325b9eb6c5645cd6be15272ed5024ce2e6d57bfe65f1e20dd2b0690Submit Value221428822021-12-04 23:18:3115 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.000572421766
0xd0801c60c94cfb69dc4a5f9aad1248213d451d21c6968e55f3424ab62c1b56aaSubmit Value221428822021-12-04 23:18:3115 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.000572468996
0x707ea41df2dfe04c5703116b16614f6a463ae17d1cb5c0a020c4b47a83165ab5Submit Value221428822021-12-04 23:18:3115 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.000572468996
0xf098b6efce65ee7c6180705c3f01603c3b279d9b7168dcccbe51fe7d610d3185Submit Value221422652021-12-04 22:55:0939 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872634
0x4583069721143776d8cbcc0dd6e74ec08b24adca908839e871ecbc0b6c76c0acSubmit Value221422652021-12-04 22:55:0939 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872634
0x3b9163078dbaa94bea3e7921e146d195591e921576a2084d64c5b396a5354d6dSubmit Value221422652021-12-04 22:55:0939 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872634
0x91c5aec96dd7cf2e723bf3ee4fd32f1669b23c44fd729a05c20c0e83cd56ea35Submit Value221422652021-12-04 22:55:0939 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872778
0x83b81d270d402b84c37363fa47eca8de0cbf7f8f131fc34633255b7bb4adde79Submit Value221422652021-12-04 22:55:0939 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872706
0x71650761b4cb32a3b0dc6b97ff0b5087ecb7b5c873eb38909e59d3b8c62a4ccaSubmit Value221418482021-12-04 22:40:2454 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004799487
0xbb09d5cbdf915185baf3d43a0cef81ccac4cd4e270ecc170e1c25cf4a18f265dSubmit Value221418482021-12-04 22:40:2454 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004799883
0xd7a2ee5904f65b062006f24946658701fbcfbcd6af39d521e3875ee5abb4345eSubmit Value221418482021-12-04 22:40:2454 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004799883
0x821bddd1a1d3f10708845458a6f9722954c340d79c2336d7be435fc2f500baf7Submit Value221418482021-12-04 22:40:2454 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004799883
0xc6cd079236bc0dd927d7ae964d0622839e530c1dd5c2440fda5d7fa359eca668Submit Value221415622021-12-04 22:30:321 hr 3 mins ago0x6ffd0dfe81308794357f0f83339a4529e5564695 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.006254909
0xd28dde30f0cea7ba2abc20b46b196b0248505dbf2a6dcd3bed5dfc06aa57ec20Submit Value221405972021-12-04 21:55:091 hr 39 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872634
0x77383d35159aa346ceac622a11b1f394aa09a7dc602018023ba4d806b3960075Submit Value221405972021-12-04 21:55:091 hr 39 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872634
0x435323066d6ea649b951ce9110ab799832af0f93aae8fb5ac6101506bfe6612aSubmit Value221405962021-12-04 21:55:071 hr 39 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872706
0x05162750d4a95dc315ec61a1d4efd07b80fd495727bb47c8b0c4636a743599abSubmit Value221405962021-12-04 21:55:071 hr 39 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872706
0x1cf39fa5c2e77421814712af854a189134f4d67e15b73df955d421a66f0add01Submit Value221405962021-12-04 21:55:071 hr 39 mins ago0x3226c9eac0379f04ba2b1e1e1fcd52ac26309aea IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.00872706
0xb978a661dd632c981e887c285f09358379e58cc64dc934822c910c650c0ee12fSubmit Value221401772021-12-04 21:40:451 hr 53 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004707087
0x243c8f9bed48403208ec0129dfa6db5b5d7ba4aee95cb89a212dd726fb306950Submit Value221401772021-12-04 21:40:451 hr 53 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004799883
0x2bb34a6a86b78fe03ec23a4f617a6f0f66481235e70cae0c43e9c6feb1a9a335Submit Value221401762021-12-04 21:40:431 hr 53 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004799883
0x5785f783859ec1a0e86abd492b978c9d55de7c9b672873809210a34600771614Submit Value221401762021-12-04 21:40:431 hr 53 mins ago0x2537f986a85cb55fc156766cb5010c6550297812 IN  0xacc2d27400029904919ea54ffc0b18bf07c578750 MATIC0.004799883
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TellorMesosphere

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-12
*/

// File: contracts/SafeMath.sol

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

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
// File: @openzeppelin/contracts/utils/Context.sol


pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

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

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

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

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

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

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

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

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

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

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

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

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


pragma solidity >=0.6.0 <0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context {
    using EnumerableSet for EnumerableSet.AddressSet;
    using Address for address;

    struct RoleData {
        EnumerableSet.AddressSet members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }

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

        _revokeRole(role, account);
    }

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

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

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

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

// File: contracts/TellorMesosphere.sol

pragma solidity 0.7.0;



/** 
 @author Tellor Inc.
 @title TellorMesosphere
 @dev  Oracle for Tellor Fellowship
**/
contract TellorMesosphere is AccessControl {

    using SafeMath for uint256;

    /*Storage*/
    mapping(uint256 => mapping(uint256 => uint256)) public values; //requestId -> timestamp -> value
    mapping(uint256 => uint256[]) public timestamps; //timestamp to array of values
    mapping(uint256 => address) public reporters;
    mapping(address => uint256) public reporterIndices;
    mapping(uint256 => mapping(uint256 => uint256)) public latestValues;
    mapping(uint256 => mapping(uint256 => uint256)) public latestTimestamps;
    mapping(uint256 => uint256) public oldestTimestampFromLatestBlock;
    mapping(uint256 => uint256) public numberReportersFromLatestBlock;
    uint256[] public availableReporterIndices;
    uint256 public latestValuesLength;
    uint256 public numberOfReporters;
    uint256 public timeLimit;
    uint256 public maximumDeviation;
    uint256 public quorum;
    bytes32 public constant REPORTER_ROLE = keccak256("reporter");//used in access contract, the role of a given party

    
    
    /*Events*/
    // Emits when a new median value is successfully generated
    event NewMedian(
        uint256 _requestId, 
        uint256 _time, 
        uint256 _value, 
        uint256 _index
    );
    
    // Emits when a reporter submits a new value
    event NewValueSubmitted(
        uint256 _requestId, 
        uint256 _time, 
        uint256 _value,
        address _reporter
    );

    /**
     * @dev Modifier to restrict only to the admin role.
    */
    modifier onlyAdmin() {
        require(isAdmin(msg.sender), "Restricted to admins.");
        _;
    }

    /**
     * @dev Restricted to members of the reporter role.
    */
    modifier onlyReporter() {
        require(isReporter(msg.sender), "Restricted to reporters.");
        _;
    }
    
    /*Functions*/
    /**
     * @dev Constructor to set original quorum, time limit, and maximum deviation
     * @param _quorum Minimum number of valid reporters' submissions to create new median
     * @param _timeLimit Time interval in which submissions are valid for creating new median
     * @param _maximumDeviation Maximum distance from last median a range of submissions can be
     * 
    */
    constructor(uint256 _quorum, uint256 _timeLimit, uint256 _maximumDeviation) {
        quorum = _quorum;
        timeLimit = _timeLimit;
        maximumDeviation = _maximumDeviation;
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setRoleAdmin(REPORTER_ROLE, DEFAULT_ADMIN_ROLE);
    }

    /**
     * @dev Add an address to the admin role. Restricted to admins.
     * @param _admin_address is the admin address to add
    */
    function addAdmin(address _admin_address) external virtual onlyAdmin {
        grantRole(DEFAULT_ADMIN_ROLE, _admin_address);
    }

    /**
     * @dev Add an account to the reporter role. Restricted to admins.
     * @param _reporter_address is the address of the reporter to give permissions to submit data
    */
    function addReporter(address _reporter_address) external virtual onlyAdmin {
        require(!isReporter(_reporter_address), "Address already has reporter role");
        uint256 _newReporterIndex;
        if(availableReporterIndices.length > 0) {
            _newReporterIndex = availableReporterIndices[availableReporterIndices.length-1];
            availableReporterIndices.pop();
        } else {
            _newReporterIndex = numberOfReporters + 1;
            latestValuesLength++;
        }
        reporters[_newReporterIndex] = _reporter_address;
        reporterIndices[_reporter_address] = _newReporterIndex;
        numberOfReporters++;
        grantRole(REPORTER_ROLE, _reporter_address);
    }

    /**
     * @dev Allows admin to change quorum variable
     * @param _quorum is the new quorum value
     */
    function updateQuorum(uint256 _quorum) external onlyAdmin {
        quorum = _quorum;
    }

     /**
     * @dev Allows admin to change maximumDeviation variable
     * @param _maximumDeviation is the new maximumDeviation value
     */
    function updateMaximumDeviation(uint256 _maximumDeviation) external onlyAdmin {
        maximumDeviation = _maximumDeviation;
    }
    
    /**
     * @dev Allows admin to change timeLimit variable
     * @param _timeLimit is the new timeLimit value
     */
    function updateTimeLimit(uint256 _timeLimit) external onlyAdmin {
        timeLimit = _timeLimit;
    }

     /**
     * @dev Allows the user to get the latest value for the requestId specified
     * @param _requestId is the requestId to look up the value for
     * @return ifRetrieve bool true if it is able to retreive a value, the value, and the value's timestamp
     * @return value the value retrieved
     * @return timestampRetrieved the value's timestamp
    */
    function getCurrentValue(uint256 _requestId) public view returns (bool, uint256, uint256) {
        //get index (number of submitted values on requestId) from storage
        uint256 _count = getNewValueCountbyRequestId(_requestId);
        //get timestamp of most recent value submitted for the requestID
        uint256 _time =
            getTimestampbyRequestIDandIndex(_requestId, _count - 1);
        //return the value if it is not disputed
        uint256 _value = retrieveData(_requestId, _time);
        if (_value > 0) return (true, _value, _time);
        return (false, 0, _time);
    }

    /**
     * @dev Allows the user to get the first value for the requestId before the specified timestamp
     * @param _requestId is the requestId to look up the value for
     * @param _timestamp before which to search for first verified value
     * @return ifRetrieve bool true if it is able to retreive a value, the value, and the value's timestamp
     * @return value the value retrieved
     * @return timestampRetrieved the value's timestamp
    */
    function getDataBefore(uint256 _requestId, uint256 _timestamp) public view returns (bool, uint256, uint256) {
        //get index of submitted data of requestID at _timestamp
        (bool _found, uint256 _index) =
            _getIndexForDataBefore(_requestId, _timestamp);
        //catch if invalid timestamp not found
        if (!_found) return (false, 0, 0);
        //get timestamp of median value nearest to _timestamp
        uint256 _time =
            getTimestampbyRequestIDandIndex(_requestId, _index);
        //retrieve the value
        uint256 _value = retrieveData(_requestId, _time);
        //return value if not disputed
        if (_value > 0) return (true, _value, _time);
        return (false, 0, 0);
    }

    /**
     * @dev Remove an account from the reporter role. Restricted to admins.
     * @param _reporter_address is the address of the reporter to remove permissions to submit data
    */
    function removeReporter(address _reporter_address) external virtual onlyAdmin  {
        uint256 _reporterIndex = reporterIndices[_reporter_address];
        reporters[_reporterIndex] = address(0);
        reporterIndices[_reporter_address] = 0;
        availableReporterIndices.push(_reporterIndex);
        numberOfReporters--;
        revokeRole(REPORTER_ROLE, _reporter_address);
    }

    /**
     * @dev Remove oneself from the admin role.
    */
    function renounceAdmin() external virtual {
        renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    /**
     * @dev Function for reporters to submit a value
     * @param _requestId The tellorId to associate the value to
     * @param _value the value for the requestId
    */
    function submitValue(uint256 _requestId, uint256 _value) external onlyReporter {

        //there need to be more reporters than the quorum
        require(
            numberOfReporters >= quorum,
            "not enough reporters"
        );
        latestValues[_requestId][reporterIndices[msg.sender]] = _value;
        latestTimestamps[_requestId][reporterIndices[msg.sender]] = block.timestamp;

        (bool _ifRetrieve, uint256 _median, uint256 _oldestTimestamp, uint256 _numberOfValidReports) = _getNewMedian(_requestId);

        if(_ifRetrieve) {
            uint256 _index;
            if(_oldestTimestamp == oldestTimestampFromLatestBlock[_requestId] && numberReportersFromLatestBlock[_requestId] < numberOfReporters) {
                _index = timestamps[_requestId].length - 1;
                uint256 _previousTimestamp = timestamps[_requestId][_index];
                values[_requestId][_previousTimestamp] = 0;
                timestamps[_requestId][_index] = block.timestamp;
            } else {
                _index = timestamps[_requestId].length;
                timestamps[_requestId].push(block.timestamp);
                oldestTimestampFromLatestBlock[_requestId] = _oldestTimestamp;
            }
            values[_requestId][block.timestamp] = _median;
            numberReportersFromLatestBlock[_requestId] = _numberOfValidReports;
            emit NewMedian(
                _requestId, 
                block.timestamp, 
                _median, 
                _index
            );
        }
        emit NewValueSubmitted(
            _requestId, 
            block.timestamp, 
            _value, 
            msg.sender
        );
    }

    /**
     * @dev Counts the number of values that have been submited for the request
     * @param _requestId the requestId to look up
     * @return uint count of the number of values received for the requestId
    */
    function getNewValueCountbyRequestId(uint256 _requestId) public view returns(uint) {
        return timestamps[_requestId].length;
    }

    /**
     * @dev Gets the timestamp for the value based on their index
     * @param _requestId is the requestId to look up
     * @param _index is the value index to look up
     * @return uint timestamp
    */
    function getTimestampbyRequestIDandIndex(uint256 _requestId, uint256 _index) public view returns(uint256) {
        uint len = timestamps[_requestId].length;
        if(len == 0 || len <= _index) return 0;
        return timestamps[_requestId][_index];
    }

    /**
     * @dev Return `true` if the account belongs to the admin role.
     * @param _admin_address is the admin address to check if they have an admin role
     * @return true if the address has an admin role
     */
    function isAdmin(address _admin_address) public virtual view returns (bool) {
        return hasRole(DEFAULT_ADMIN_ROLE, _admin_address);
    }

    /**
     * @dev Return `true` if the account belongs to the reporter role.
     * @param _reporter_address is the address to check if they have a reporter role
     */
    function isReporter(address _reporter_address) public virtual view returns (bool)  {
        return hasRole(REPORTER_ROLE, _reporter_address);
    }


    /**
     * @dev Retrieve value from oracle based on requestId/timestamp
     * @param _requestId being requested
     * @param _timestamp to retrieve data/value from
     * @return uint value for requestId/timestamp submitted
    */
    function retrieveData(uint256 _requestId, uint256 _timestamp) public view returns(uint256){
        return values[_requestId][_timestamp];
    }

    /**
     * @dev Allows the user to get the index for the requestId for the specified timestamp
     * @param _requestId is the requestId to look up the index based on the _timestamp provided
     * @param _timestamp before which to search for the index
     * @return found true for index found
     * @return index of the timestamp
     */
    function _getIndexForDataBefore(uint256 _requestId, uint256 _timestamp) internal view returns (bool, uint256) {
        uint256 _count = getNewValueCountbyRequestId(_requestId);
        if (_count > 0) {
            uint256 middle;
            uint256 start = 0;
            uint256 end = _count - 1;
            uint256 _time;
            //Checking Boundaries to short-circuit the algorithm
            _time = getTimestampbyRequestIDandIndex(_requestId, start);
            if (_time >= _timestamp) return (false, 0);
            _time = getTimestampbyRequestIDandIndex(_requestId, end);
            if (_time < _timestamp) return (true, end);
            //Since the value is within our boundaries, do a binary search
            while (true) {
                middle = (end - start) / 2 + 1 + start;
                _time = getTimestampbyRequestIDandIndex(
                    _requestId,
                    middle
                );
                if (_time < _timestamp) {
                    //get next value
                    uint256 _nextTime =
                        getTimestampbyRequestIDandIndex(
                            _requestId,
                            middle + 1
                        );
                    if (_nextTime >= _timestamp) {
                        //_time is correct
                        return (true, middle);
                    } else {
                        //look from middle + 1(next value) to end
                        start = middle + 1;
                    }
                } else {
                    uint256 _prevTime =
                        getTimestampbyRequestIDandIndex(
                            _requestId,
                            middle - 1
                        );
                    if (_prevTime < _timestamp) {
                        // _prevtime is correct
                        return (true, middle - 1);
                    } else {
                        //look from start to middle -1(prev value)
                        end = middle - 1;
                    }
                }
            }
        }
        return (false, 0);
    }

    /**
     * @dev Calculates new median if enough values have been submitted within timeLimit to reach quorum and
     * @param _requestId is the requestId to calculate the median for
     * @return bool true if a new valid median could be calculated
     * @return uint256 the newly calculated median value
     * @return uint256 the timestamp of the oldest value used to calculate this new median
     * @return uint256 the quantity of valid reports used to calculate this new median
     */
    function _getNewMedian(uint256 _requestId) internal returns(bool, uint256, uint256, uint256) {
        uint256[] memory _validReports = new uint256[](numberOfReporters);
        uint256[] memory _validReportIndices = new uint256[](numberOfReporters);
        uint256 _numberOfValidReports;
        uint256 _oldestTimestamp = block.timestamp;

        for(uint256 k=1; k<=latestValuesLength; k++) {
            if(latestTimestamps[_requestId][k] > block.timestamp - timeLimit) {
                _validReports[_numberOfValidReports] = latestValues[_requestId][k];
                _validReportIndices[_numberOfValidReports++] = k;
                if(latestTimestamps[_requestId][k] < _oldestTimestamp) {
                    _oldestTimestamp = latestTimestamps[_requestId][k];
                }
            }
        }
        if(_numberOfValidReports < quorum) {
            return(false, 0, 0, 0);
        } else {
            for (uint256 i = 1; i < _numberOfValidReports; i++) {
                for (uint256 j = i; j > 0 && _validReports[j-1]  > _validReports[j]; j--) {
                    uint256 tmp = _validReports[j];
                    uint256 tmpIndices = _validReportIndices[j];
                    _validReports[j] = _validReports[j-1];
                    _validReportIndices[j] = _validReportIndices[j-1];
                    _validReports[j-1] = tmp;
                    _validReportIndices[j-1] = tmpIndices;
                }
            }
            (,uint256 _lastValue,) = getDataBefore(_requestId, block.timestamp-timeLimit);
            if(_lastValue > 0) {
                if ((_validReports[_numberOfValidReports-1] - _validReports[0]) * 10000 / _lastValue > maximumDeviation) {
                    if (_numberOfValidReports-1 >= quorum) {
                        if(max(_validReports[_numberOfValidReports-1], _lastValue) - min(_validReports[_numberOfValidReports-1], _lastValue) >
                            max(_validReports[0], _lastValue) - min(_validReports[0], _lastValue)) {
                            latestTimestamps[_requestId][_validReportIndices[_numberOfValidReports-1]] = 0;
                        } else {
                            latestTimestamps[_requestId][_validReportIndices[0]] = 0;
                        }
                        return(_getNewMedian(_requestId));
                    } else {
                        return(false, 0, 0, 0);
                    }

                }
            }
            uint256 _median;
            if (_numberOfValidReports % 2 == 1) {
                 _median = _validReports[_numberOfValidReports / 2];
            } else {
                _median = _validReports[_numberOfValidReports / 2].add(_validReports[_numberOfValidReports / 2 - 1]) / 2;
            }
            return(true, _median, _oldestTimestamp, _numberOfValidReports);
        }
    }
    
    /**
     * @dev Finds maximum of two values
     * @param _a First value
     * @param _b Second value
    */
    function max(uint256 _a, uint256 _b) public pure returns(uint256) {
        if(_a > _b) {
            return(_a);
        } else {
            return(_b);
        }
    }

    /**
     * @dev Finds minimum of two values
     * @param _a First value
     * @param _b Second value
    */
    function min(uint256 _a, uint256 _b) public pure returns(uint256) {
        if(_a < _b) {
            return(_a);
        } else {
            return(_b);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_quorum","type":"uint256"},{"internalType":"uint256","name":"_timeLimit","type":"uint256"},{"internalType":"uint256","name":"_maximumDeviation","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_index","type":"uint256"}],"name":"NewMedian","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"NewValueSubmitted","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPORTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin_address","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter_address","type":"address"}],"name":"addReporter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"availableReporterIndices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"getCurrentValue","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataBefore","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"getNewValueCountbyRequestId","outputs":[{"internalType":"uint256","name":"","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":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimestampbyRequestIDandIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin_address","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter_address","type":"address"}],"name":"isReporter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"latestTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"latestValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestValuesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"_b","type":"uint256"}],"name":"max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maximumDeviation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"uint256","name":"_b","type":"uint256"}],"name":"min","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numberOfReporters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numberReportersFromLatestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"oldestTimestampFromLatestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter_address","type":"address"}],"name":"removeReporter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reporterIndices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reporters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_requestId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"submitValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"timestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maximumDeviation","type":"uint256"}],"name":"updateMaximumDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quorum","type":"uint256"}],"name":"updateQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeLimit","type":"uint256"}],"name":"updateTimeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"values","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002b6438038062002b64833981810160405260608110156200003757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505082600e8190555081600c8190555080600d81905550620000866000801b33620000c460201b60201c565b620000bb7f176c2b761bfeb5dab89f614b6c08152e31d9230394b3605eabf32249ea1c89a66000801b620000da60201b60201c565b505050620002bc565b620000d682826200013c60201b60201c565b5050565b8060008084815260200190815260200160002060020154837fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a480600080848152602001908152602001600020600201819055505050565b6200016a81600080858152602001908152602001600020600001620001df60201b62001c8e1790919060201c565b15620001db57620001806200021760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200020f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200021f60201b60201c565b905092915050565b600033905090565b60006200023383836200029960201b60201c565b6200028e57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000293565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b61289880620002cc6000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806377fbb6631161013b5780639ee70ff4116100b8578063ca15c8731161007c578063ca15c87314610b03578063d547741f14610b45578063dd8755f214610b93578063e8207c4e14610bd7578063fb0ceb0414610c1957610248565b80639ee70ff414610a0b578063a217fddf14610a4d578063a312ac9714610a6b578063a318370114610a99578063c08d1fe514610ae557610248565b80638ee15314116100ff5780638ee153141461088f5780639010d07c146108db5780639152c29d1461093d57806391d148541461095b57806393fa4915146109bf57610248565b806377fbb6631461078d5780637ae2b5c7146107d957806385524a4f146108255780638bad0c0a146108675780638d1f7daf1461087157610248565b806346eee1c4116101c957806362f551121161018d57806362f551121461061d57806366b44611146106555780636d5433e6146106b157806370480275146106fd57806372d725e61461074157610248565b806346eee1c4146104c9578063550d76be1461050b5780635de5c212146105295780635e02cb7d1461056d5780636231bc11146105c557610248565b80632f2ff15d116102105780632f2ff15d1461038f57806335680dc2146103dd57806336568abe1461040b5780633f60d799146104595780633fcad9641461047757610248565b8063044ad7be1461024d5780631703a018146102a7578063248a9ca3146102c557806324d7806c146103075780632c8b71d414610361575b600080fd5b61028f6004803603602081101561026357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c65565b60405180821515815260200191505060405180910390f35b6102af610c98565b6040518082815260200191505060405180910390f35b6102f1600480360360208110156102db57600080fd5b8101908080359060200190929190505050610c9e565b6040518082815260200191505060405180910390f35b6103496004803603602081101561031d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cbd565b60405180821515815260200191505060405180910390f35b61038d6004803603602081101561037757600080fd5b8101908080359060200190929190505050610cd3565b005b6103db600480360360408110156103a557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d58565b005b610409600480360360208110156103f357600080fd5b8101908080359060200190929190505050610de1565b005b6104576004803603604081101561042157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e66565b005b610461610eff565b6040518082815260200191505060405180910390f35b6104a36004803603602081101561048d57600080fd5b8101908080359060200190929190505050610f23565b604051808415158152602001838152602001828152602001935050505060405180910390f35b6104f5600480360360208110156104df57600080fd5b8101908080359060200190929190505050610f83565b6040518082815260200191505060405180910390f35b610513610fa3565b6040518082815260200191505060405180910390f35b61056b6004803603602081101561053f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fa9565b005b6105996004803603602081101561058357600080fd5b810190808035906020019092919050505061116a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610607600480360360208110156105db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061119d565b6040518082815260200191505060405180910390f35b6106536004803603604081101561063357600080fd5b8101908080359060200190929190803590602001909291905050506111b5565b005b61068b6004803603604081101561066b57600080fd5b8101908080359060200190929190803590602001909291905050506115e5565b604051808415158152602001838152602001828152602001935050505060405180910390f35b6106e7600480360360408110156106c757600080fd5b810190808035906020019092919080359060200190929190505050611661565b6040518082815260200191505060405180910390f35b61073f6004803603602081101561071357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061167d565b005b6107776004803603604081101561075757600080fd5b810190808035906020019092919080359060200190929190505050611708565b6040518082815260200191505060405180910390f35b6107c3600480360360408110156107a357600080fd5b81019080803590602001909291908035906020019092919050505061172d565b6040518082815260200191505060405180910390f35b61080f600480360360408110156107ef57600080fd5b81019080803590602001909291908035906020019092919050505061179a565b6040518082815260200191505060405180910390f35b6108516004803603602081101561083b57600080fd5b81019080803590602001909291905050506117b6565b6040518082815260200191505060405180910390f35b61086f6117d7565b005b6108796117e6565b6040518082815260200191505060405180910390f35b6108c5600480360360408110156108a557600080fd5b8101908080359060200190929190803590602001909291905050506117ec565b6040518082815260200191505060405180910390f35b610911600480360360408110156108f157600080fd5b810190808035906020019092919080359060200190929190505050611811565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610945611842565b6040518082815260200191505060405180910390f35b6109a76004803603604081101561097157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611848565b60405180821515815260200191505060405180910390f35b6109f5600480360360408110156109d557600080fd5b810190808035906020019092919080359060200190929190505050611879565b6040518082815260200191505060405180910390f35b610a3760048036036020811015610a2157600080fd5b81019080803590602001909291905050506118a8565b6040518082815260200191505060405180910390f35b610a556118c0565b6040518082815260200191505060405180910390f35b610a9760048036036020811015610a8157600080fd5b81019080803590602001909291905050506118c7565b005b610acf60048036036040811015610aaf57600080fd5b81019080803590602001909291908035906020019092919050505061194c565b6040518082815260200191505060405180910390f35b610aed611971565b6040518082815260200191505060405180910390f35b610b2f60048036036020811015610b1957600080fd5b8101908080359060200190929190505050611977565b6040518082815260200191505060405180910390f35b610b9160048036036040811015610b5b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061199d565b005b610bd560048036036020811015610ba957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a26565b005b610c0360048036036020811015610bed57600080fd5b8101908080359060200190929190505050611c48565b6040518082815260200191505060405180910390f35b610c4f60048036036040811015610c2f57600080fd5b810190808035906020019092919080359060200190929190505050611c60565b6040518082815260200191505060405180910390f35b6000610c917f176c2b761bfeb5dab89f614b6c08152e31d9230394b3605eabf32249ea1c89a683611848565b9050919050565b600e5481565b6000806000838152602001908152602001600020600201549050919050565b6000610ccc6000801b83611848565b9050919050565b610cdc33610cbd565b610d4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5265737472696374656420746f2061646d696e732e000000000000000000000081525060200191505060405180910390fd5b80600d8190555050565b610d7e60008084815260200190815260200160002060020154610d79611cbe565b611848565b610dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806127b4602f913960400191505060405180910390fd5b610ddd8282611cc6565b5050565b610dea33610cbd565b610e5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5265737472696374656420746f2061646d696e732e000000000000000000000081525060200191505060405180910390fd5b80600e8190555050565b610e6e611cbe565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180612834602f913960400191505060405180910390fd5b610efb8282611d59565b5050565b7f176c2b761bfeb5dab89f614b6c08152e31d9230394b3605eabf32249ea1c89a681565b600080600080610f3285610f83565b90506000610f43866001840361172d565b90506000610f518783611879565b90506000811115610f6e5760018183955095509550505050610f7c565b600080839550955095505050505b9193909250565b600060026000838152602001908152602001600020805490509050919050565b600a5481565b610fb233610cbd565b611024576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5265737472696374656420746f2061646d696e732e000000000000000000000081525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506009819080600181540180825580915050600190039060005260206000200160009091909190915055600b60008154809291906001900391905055506111667f176c2b761bfeb5dab89f614b6c08152e31d9230394b3605eabf32249ea1c89a68361199d565b5050565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915090505481565b6111be33610c65565b611230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f5265737472696374656420746f207265706f72746572732e000000000000000081525060200191505060405180910390fd5b600e54600b5410156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f7420656e6f756768207265706f727465727300000000000000000000000081525060200191505060405180910390fd5b80600560008481526020019081526020016000206000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020019081526020016000208190555042600660008481526020019081526020016000206000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020019081526020016000208190555060008060008061138986611dec565b935093509350935083156115785760006007600088815260200190815260200160002054831480156113cf5750600b546008600089815260200190815260200160002054105b1561147a5760016002600089815260200190815260200160002080549050039050600060026000898152602001908152602001600020828154811061141057fe5b906000526020600020015490506000600160008a815260200190815260200160002060008381526020019081526020016000208190555042600260008a8152602001908152602001600020838154811061146657fe5b9060005260206000200181905550506114e6565b60026000888152602001908152602001600020805490509050600260008881526020019081526020016000204290806001815401808255809150506001900390600052602060002001600090919091909150558260076000898152602001908152602001600020819055505b83600160008981526020019081526020016000206000428152602001908152602001600020819055508160086000898152602001908152602001600020819055507f5bfb28175497f2c143f271fa3e5e33f6dd690f0dc506c558b461d58888e0b629874286846040518085815260200184815260200183815260200182815260200194505050505060405180910390a1505b7f49e226407dfe06ddcf5d52b750c7b5b1281081e3fffc7e9604d3ad1f0dcf2ebe86428733604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a1505050505050565b60008060008060006115f78787612343565b9150915081611612576000806000945094509450505061165a565b600061161e888361172d565b9050600061162c8983611879565b9050600081111561164a57600181839650965096505050505061165a565b6000806000965096509650505050505b9250925092565b60008183111561167357829050611677565b8190505b92915050565b61168633610cbd565b6116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5265737472696374656420746f2061646d696e732e000000000000000000000081525060200191505060405180910390fd5b6117056000801b82610d58565b50565b6006602052816000526040600020602052806000526040600020600091509150505481565b6000806002600085815260200190815260200160002080549050905060008114806117585750828111155b15611767576000915050611794565b60026000858152602001908152602001600020838154811061178557fe5b90600052602060002001549150505b92915050565b6000818310156117ac578290506117b0565b8190505b92915050565b600981815481106117c357fe5b906000526020600020016000915090505481565b6117e46000801b33610e66565b565b600b5481565b6005602052816000526040600020602052806000526040600020600091509150505481565b600061183a8260008086815260200190815260200160002060000161246b90919063ffffffff16565b905092915050565b600d5481565b60006118718260008086815260200190815260200160002060000161248590919063ffffffff16565b905092915050565b600060016000848152602001908152602001600020600083815260200190815260200160002054905092915050565b60086020528060005260406000206000915090505481565b6000801b81565b6118d033610cbd565b611942576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5265737472696374656420746f2061646d696e732e000000000000000000000081525060200191505060405180910390fd5b80600c8190555050565b6001602052816000526040600020602052806000526040600020600091509150505481565b600c5481565b60006119966000808481526020019081526020016000206000016124b5565b9050919050565b6119c3600080848152602001908152602001600020600201546119be611cbe565b611848565b611a18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806127e36030913960400191505060405180910390fd5b611a228282611d59565b5050565b611a2f33610cbd565b611aa1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5265737472696374656420746f2061646d696e732e000000000000000000000081525060200191505060405180910390fd5b611aaa81610c65565b15611b00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128136021913960400191505060405180910390fd5b6000806009805490501115611b5757600960016009805490500381548110611b2457fe5b906000526020600020015490506009805480611b3c57fe5b60019003818190600052602060002001600090559055611b72565b6001600b54019050600a600081548092919060010191905055505b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60008154809291906001019190505550611c447f176c2b761bfeb5dab89f614b6c08152e31d9230394b3605eabf32249ea1c89a683610d58565b5050565b60076020528060005260406000206000915090505481565b60026020528160005260406000208181548110611c7957fe5b90600052602060002001600091509150505481565b6000611cb6836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6124ca565b905092915050565b600033905090565b611ced81600080858152602001908152602001600020600001611c8e90919063ffffffff16565b15611d5557611cfa611cbe565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611d808160008085815260200190815260200160002060000161253a90919063ffffffff16565b15611de857611d8d611cbe565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000806000806060600b5467ffffffffffffffff81118015611e0d57600080fd5b50604051908082528060200260200182016040528015611e3c5781602001602082028036833780820191505090505b5090506060600b5467ffffffffffffffff81118015611e5a57600080fd5b50604051908082528060200260200182016040528015611e895781602001602082028036833780820191505090505b5090506000804290506000600190505b600a548111611f9057600c544203600660008c81526020019081526020016000206000838152602001908152602001600020541115611f8357600560008b8152602001908152602001600020600082815260200190815260200160002054858481518110611f0357fe5b60200260200101818152505080848480600101955081518110611f2257fe5b60200260200101818152505081600660008c81526020019081526020016000206000838152602001908152602001600020541015611f8257600660008b815260200190815260200160002060008281526020019081526020016000205491505b5b8080600101915050611e99565b50600e54821015611fb25760008060008097509750975097505050505061233c565b6000600190505b828110156120e85760008190505b600081118015611fff5750858181518110611fde57fe5b6020026020010151866001830381518110611ff557fe5b6020026020010151115b156120da57600086828151811061201257fe5b60200260200101519050600086838151811061202a57fe5b6020026020010151905087600184038151811061204357fe5b602002602001015188848151811061205757fe5b60200260200101818152505086600184038151811061207257fe5b602002602001015187848151811061208657fe5b602002602001018181525050818860018503815181106120a257fe5b602002602001018181525050808760018503815181106120be57fe5b6020026020010181815250505050808060019003915050611fc7565b508080600101915050611fb9565b5060006120f98a600c5442036115e5565b50915050600081111561229157600d54816127108760008151811061211a57fe5b602002602001015188600188038151811061213157fe5b602002602001015103028161214257fe5b04111561229057600e546001840310612278576121738560008151811061216557fe5b60200260200101518261179a565b6121918660008151811061218357fe5b602002602001015183611661565b036121b28660018603815181106121a457fe5b60200260200101518361179a565b6121d28760018703815181106121c457fe5b602002602001015184611661565b03111561221e576000600660008c815260200190815260200160002060008660018703815181106121ff57fe5b602002602001015181526020019081526020016000208190555061225d565b6000600660008c815260200190815260200160002060008660008151811061224257fe5b60200260200101518152602001908152602001600020819055505b6122668a611dec565b9850985098509850505050505061233c565b6000806000809850985098509850505050505061233c565b5b600060016002858161229f57fe5b0614156122cb5785600285816122b157fe5b04815181106122bc57fe5b60200260200101519050612328565b600261231d876001600288816122dd57fe5b0403815181106122e957fe5b602002602001015188600288816122fc57fe5b048151811061230757fe5b602002602001015161256a90919063ffffffff16565b8161232457fe5b0490505b600181848699509950995099505050505050505b9193509193565b600080600061235185610f83565b9050600081111561245b576000806000905060006001840390506000612377898461172d565b905087811061239157600080965096505050505050612464565b61239b898361172d565b9050878110156123b657600182965096505050505050612464565b5b600115612456578260016002858503816123cd57fe5b04010193506123dc898561172d565b90508781101561241c5760006123f58a6001870161172d565b90508881106124105760018597509750505050505050612464565b60018501935050612451565b600061242b8a6001870361172d565b90508881101561244957600180860397509750505050505050612464565b600185039250505b6123b7565b505050505b60008092509250505b9250929050565b600061247a83600001836125f2565b60001c905092915050565b60006124ad836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612675565b905092915050565b60006124c382600001612698565b9050919050565b60006124d68383612675565b61252f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612534565b600090505b92915050565b6000612562836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6126a9565b905092915050565b6000808284019050838110156125e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600081836000018054905011612653576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127926022913960400191505060405180910390fd5b82600001828154811061266257fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b6000808360010160008481526020019081526020016000205490506000811461278557600060018203905060006001866000018054905003905060008660000182815481106126f457fe5b906000526020600020015490508087600001848154811061271157fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061274957fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061278b565b60009150505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b654164647265737320616c726561647920686173207265706f7274657220726f6c65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212204cd4ca2eaa30bdb4ab4b4c7415417153cb6be65707c78cf392f8d853c735a37864736f6c634300070000330000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000007d0

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

0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000007d0

-----Decoded View---------------
Arg [0] : _quorum (uint256): 1
Arg [1] : _timeLimit (uint256): 60
Arg [2] : _maximumDeviation (uint256): 2000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [2] : 00000000000000000000000000000000000000000000000000000000000007d0


Deployed ByteCode Sourcemap

28006:17980:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38867:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28897:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24614:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38538:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32158:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24990:227;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31909:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26199:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28925:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32917:609;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37673:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28749:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34950:396;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28297:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28348:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35719:1719;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34002:745;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45504:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30731:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28479:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38040:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45807:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28701:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35420:105;;;:::i;:::-;;28789:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28405:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24287:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28859:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23248:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39270:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28629:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21993:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32429:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28110:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28828:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23561:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25462:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31060:724;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28557:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28212:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38867:150;38943:4;38968:41;28965:21;38991:17;38968:7;:41::i;:::-;38961:48;;38867:150;;;:::o;28897:21::-;;;;:::o;24614:114::-;24671:7;24698:6;:12;24705:4;24698:12;;;;;;;;;;;:22;;;24691:29;;24614:114;;;:::o;38538:145::-;38608:4;38632:43;22038:4;38640:18;;38660:14;38632:7;:43::i;:::-;38625:50;;38538:145;;;:::o;32158:133::-;29592:19;29600:10;29592:7;:19::i;:::-;29584:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32266:17:::1;32247:16;:36;;;;32158:133:::0;:::o;24990:227::-;25074:45;25082:6;:12;25089:4;25082:12;;;;;;;;;;;:22;;;25106:12;:10;:12::i;:::-;25074:7;:45::i;:::-;25066:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25184:25;25195:4;25201:7;25184:10;:25::i;:::-;24990:227;;:::o;31909:93::-;29592:19;29600:10;29592:7;:19::i;:::-;29584:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31987:7:::1;31978:6;:16;;;;31909:93:::0;:::o;26199:209::-;26297:12;:10;:12::i;:::-;26286:23;;:7;:23;;;26278:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26374:26;26386:4;26392:7;26374:11;:26::i;:::-;26199:209;;:::o;28925:61::-;28965:21;28925:61;:::o;32917:609::-;32983:4;32989:7;32998;33094:14;33111:39;33139:10;33111:27;:39::i;:::-;33094:56;;33235:13;33264:55;33296:10;33317:1;33308:6;:10;33264:31;:55::i;:::-;33235:84;;33380:14;33397:31;33410:10;33422:5;33397:12;:31::i;:::-;33380:48;;33452:1;33443:6;:10;33439:44;;;33463:4;33469:6;33477:5;33455:28;;;;;;;;;;;33439:44;33502:5;33509:1;33512:5;33494:24;;;;;;;;;32917:609;;;;;;:::o;37673:138::-;37750:4;37774:10;:22;37785:10;37774:22;;;;;;;;;;;:29;;;;37767:36;;37673:138;;;:::o;28749:33::-;;;;:::o;34950:396::-;29592:19;29600:10;29592:7;:19::i;:::-;29584:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35040:22:::1;35065:15;:34;35081:17;35065:34;;;;;;;;;;;;;;;;35040:59;;35146:1;35110:9;:25;35120:14;35110:25;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;35196:1;35159:15;:34;35175:17;35159:34;;;;;;;;;;;;;;;:38;;;;35208:24;35238:14;35208:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35264:17;;:19;;;;;;;;;;;;;;35294:44;28965:21;35320:17;35294:10;:44::i;:::-;29648:1;34950:396:::0;:::o;28297:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;28348:50::-;;;;;;;;;;;;;;;;;:::o;35719:1719::-;29782:22;29793:10;29782;:22::i;:::-;29774:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35913:6:::1;;35892:17;;:27;;35870:97;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;36034:6;35978:12;:24;35991:10;35978:24;;;;;;;;;;;:53;36003:15;:27;36019:10;36003:27;;;;;;;;;;;;;;;;35978:53;;;;;;;;;;;:62;;;;36111:15;36051:16;:28;36068:10;36051:28;;;;;;;;;;;:57;36080:15;:27;36096:10;36080:27;;;;;;;;;;;;;;;;36051:57;;;;;;;;;;;:75;;;;36140:16;36158:15:::0;36175:24:::1;36201:29:::0;36234:25:::1;36248:10;36234:13;:25::i;:::-;36139:120;;;;;;;;36275:11;36272:1011;;;36303:14;36355:30;:42;36386:10;36355:42;;;;;;;;;;;;36335:16;:62;:128;;;;;36446:17;;36401:30;:42;36432:10;36401:42;;;;;;;;;;;;:62;36335:128;36332:638;;;36525:1;36493:10;:22;36504:10;36493:22;;;;;;;;;;;:29;;;;:33;36484:42;;36545:26;36574:10;:22;36585:10;36574:22;;;;;;;;;;;36597:6;36574:30;;;;;;;;;;;;;;;;36545:59;;36664:1;36623:6;:18;36630:10;36623:18;;;;;;;;;;;:38;36642:18;36623:38;;;;;;;;;;;:42;;;;36717:15;36684:10;:22;36695:10;36684:22;;;;;;;;;;;36707:6;36684:30;;;;;;;;;;;;;;;:48;;;;36332:638;;;;36782:10;:22;36793:10;36782:22;;;;;;;;;;;:29;;;;36773:38;;36830:10;:22;36841:10;36830:22;;;;;;;;;;;36858:15;36830:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36938:16;36893:30;:42;36924:10;36893:42;;;;;;;;;;;:61;;;;36332:638;37022:7;36984:6;:18;36991:10;36984:18;;;;;;;;;;;:35;37003:15;36984:35;;;;;;;;;;;:45;;;;37089:21;37044:30;:42;37075:10;37044:42;;;;;;;;;;;:66;;;;37130:141;37158:10;37188:15;37223:7;37250:6;37130:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36272:1011;;37298:132;37330:10;37356:15;37387:6;37409:10;37298:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29844:1;;;;35719:1719:::0;;:::o;34002:745::-;34086:4;34092:7;34101;34188:11;34201:14;34232:46;34255:10;34267;34232:22;:46::i;:::-;34187:91;;;;34342:6;34337:33;;34358:5;34365:1;34368;34350:20;;;;;;;;;;34337:33;34444:13;34473:51;34505:10;34517:6;34473:31;:51::i;:::-;34444:80;;34565:14;34582:31;34595:10;34607:5;34582:12;:31::i;:::-;34565:48;;34677:1;34668:6;:10;34664:44;;;34688:4;34694:6;34702:5;34680:28;;;;;;;;;;;;34664:44;34727:5;34734:1;34737;34719:20;;;;;;;;;;34002:745;;;;;;:::o;45504:176::-;45561:7;45589:2;45584;:7;45581:92;;;45615:2;45608:10;;;;45581:92;45658:2;45651:10;;45504:176;;;;;:::o;30731:133::-;29592:19;29600:10;29592:7;:19::i;:::-;29584:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30811:45:::1;22038:4;30821:18:::0;::::1;30841:14;30811:9;:45::i;:::-;30731:133:::0;:::o;28479:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38040:262::-;38137:7;38157:8;38168:10;:22;38179:10;38168:22;;;;;;;;;;;:29;;;;38157:40;;38218:1;38211:3;:8;:25;;;;38230:6;38223:3;:13;;38211:25;38208:38;;;38245:1;38238:8;;;;;38208:38;38264:10;:22;38275:10;38264:22;;;;;;;;;;;38287:6;38264:30;;;;;;;;;;;;;;;;38257:37;;;38040:262;;;;;:::o;45807:176::-;45864:7;45892:2;45887;:7;45884:92;;;45918:2;45911:10;;;;45884:92;45961:2;45954:10;;45807:176;;;;;:::o;28701:41::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35420:105::-;35473:44;22038:4;35486:18;;35506:10;35473:12;:44::i;:::-;35420:105::o;28789:32::-;;;;:::o;28405:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24287:138::-;24360:7;24387:30;24411:5;24387:6;:12;24394:4;24387:12;;;;;;;;;;;:20;;:23;;:30;;;;:::i;:::-;24380:37;;24287:138;;;;:::o;28859:31::-;;;;:::o;23248:139::-;23317:4;23341:38;23371:7;23341:6;:12;23348:4;23341:12;;;;;;;;;;;:20;;:29;;:38;;;;:::i;:::-;23334:45;;23248:139;;;;:::o;39270:146::-;39352:7;39378:6;:18;39385:10;39378:18;;;;;;;;;;;:30;39397:10;39378:30;;;;;;;;;;;;39371:37;;39270:146;;;;:::o;28629:65::-;;;;;;;;;;;;;;;;;:::o;21993:49::-;22038:4;21993:49;;;:::o;32429:105::-;29592:19;29600:10;29592:7;:19::i;:::-;29584:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32516:10:::1;32504:9;:22;;;;32429:105:::0;:::o;28110:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28828:24::-;;;;:::o;23561:127::-;23624:7;23651:29;:6;:12;23658:4;23651:12;;;;;;;;;;;:20;;:27;:29::i;:::-;23644:36;;23561:127;;;:::o;25462:230::-;25547:45;25555:6;:12;25562:4;25555:12;;;;;;;;;;;:22;;;25579:12;:10;:12::i;:::-;25547:7;:45::i;:::-;25539:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25658:26;25670:4;25676:7;25658:11;:26::i;:::-;25462:230;;:::o;31060:724::-;29592:19;29600:10;29592:7;:19::i;:::-;29584:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31155:29:::1;31166:17;31155:10;:29::i;:::-;31154:30;31146:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31233:25;31306:1:::0;31272:24:::1;:31;;;;:35;31269:300;;;31344:24;31401:1;31369:24;:31;;;;:33;31344:59;;;;;;;;;;;;;;;;31324:79;;31418:24;:30;;;;;;;;;;;;;;;;;;;;;;;;31269:300;;;31521:1;31501:17;;:21;31481:41;;31537:18;;:20;;;;;;;;;;;;;31269:300;31610:17;31579:9;:28;31589:17;31579:28;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;31675:17;31638:15;:34;31654:17;31638:34;;;;;;;;;;;;;;;:54;;;;31703:17;;:19;;;;;;;;;;;;;31733:43;28965:21;31758:17;31733:9;:43::i;:::-;29648:1;31060:724:::0;:::o;28557:65::-;;;;;;;;;;;;;;;;;:::o;28212:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17224:152::-;17294:4;17318:50;17323:3;:10;;17359:5;17343:23;;17335:32;;17318:4;:50::i;:::-;17311:57;;17224:152;;;;:::o;2185:106::-;2238:15;2273:10;2266:17;;2185:106;:::o;27442:188::-;27516:33;27541:7;27516:6;:12;27523:4;27516:12;;;;;;;;;;;:20;;:24;;:33;;;;:::i;:::-;27512:111;;;27598:12;:10;:12::i;:::-;27571:40;;27589:7;27571:40;;27583:4;27571:40;;;;;;;;;;27512:111;27442:188;;:::o;27638:192::-;27713:36;27741:7;27713:6;:12;27720:4;27713:12;;;;;;;;;;;:20;;:27;;:36;;;;:::i;:::-;27709:114;;;27798:12;:10;:12::i;:::-;27771:40;;27789:7;27771:40;;27783:4;27771:40;;;;;;;;;;27709:114;27638:192;;:::o;42473:2900::-;42533:4;42539:7;42548;42557;42577:30;42624:17;;42610:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42577:65;;42653:36;42706:17;;42692:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42653:71;;42735:29;42775:24;42802:15;42775:42;;42834:9;42844:1;42834:11;;42830:471;42850:18;;42847:1;:21;42830:471;;42945:9;;42927:15;:27;42893:16;:28;42910:10;42893:28;;;;;;;;;;;:31;42922:1;42893:31;;;;;;;;;;;;:61;42890:400;;;43014:12;:24;43027:10;43014:24;;;;;;;;;;;:27;43039:1;43014:27;;;;;;;;;;;;42975:13;42989:21;42975:36;;;;;;;;;;;;;:66;;;;;43107:1;43060:19;43080:23;;;;;;43060:44;;;;;;;;;;;;;:48;;;;;43164:16;43130;:28;43147:10;43130:28;;;;;;;;;;;:31;43159:1;43130:31;;;;;;;;;;;;:50;43127:148;;;43224:16;:28;43241:10;43224:28;;;;;;;;;;;:31;43253:1;43224:31;;;;;;;;;;;;43205:50;;43127:148;42890:400;42870:3;;;;;;;42830:471;;;;43338:6;;43314:21;:30;43311:2055;;;43368:5;43375:1;43378;43381;43361:22;;;;;;;;;;;;;;43311:2055;43421:9;43433:1;43421:13;;43416:538;43440:21;43436:1;:25;43416:538;;;43492:9;43504:1;43492:13;;43487:452;43511:1;43507;:5;:47;;;;;43538:13;43552:1;43538:16;;;;;;;;;;;;;;43516:13;43532:1;43530;:3;43516:18;;;;;;;;;;;;;;:38;43507:47;43487:452;;;43584:11;43598:13;43612:1;43598:16;;;;;;;;;;;;;;43584:30;;43637:18;43658:19;43678:1;43658:22;;;;;;;;;;;;;;43637:43;;43722:13;43738:1;43736;:3;43722:18;;;;;;;;;;;;;;43703:13;43717:1;43703:16;;;;;;;;;;;;;:37;;;;;43788:19;43810:1;43808;:3;43788:24;;;;;;;;;;;;;;43763:19;43783:1;43763:22;;;;;;;;;;;;;:49;;;;;43856:3;43835:13;43851:1;43849;:3;43835:18;;;;;;;;;;;;;:24;;;;;43909:10;43882:19;43904:1;43902;:3;43882:24;;;;;;;;;;;;;:37;;;;;43487:452;;43556:3;;;;;;;;43487:452;;;;43463:3;;;;;;;43416:538;;;;43970:18;43993:52;44007:10;44035:9;;44019:15;:25;43993:13;:52::i;:::-;43968:77;;;;44076:1;44063:10;:14;44060:907;;;44185:16;;44172:10;44164:5;44144:13;44158:1;44144:16;;;;;;;;;;;;;;44103:13;44139:1;44117:21;:23;44103:38;;;;;;;;;;;;;;:57;44102:67;:80;;;;;;:99;44098:854;;;44257:6;;44252:1;44230:21;:23;:33;44226:705;;44476:33;44480:13;44494:1;44480:16;;;;;;;;;;;;;;44498:10;44476:3;:33::i;:::-;44440;44444:13;44458:1;44444:16;;;;;;;;;;;;;;44462:10;44440:3;:33::i;:::-;:69;44353:55;44357:13;44393:1;44371:21;:23;44357:38;;;;;;;;;;;;;;44397:10;44353:3;:55::i;:::-;44295;44299:13;44335:1;44313:21;:23;44299:38;;;;;;;;;;;;;;44339:10;44295:3;:55::i;:::-;:113;:214;44292:477;;;44619:1;44542:16;:28;44559:10;44542:28;;;;;;;;;;;:74;44571:19;44613:1;44591:21;:23;44571:44;;;;;;;;;;;;;;44542:74;;;;;;;;;;;:78;;;;44292:477;;;44740:1;44685:16;:28;44702:10;44685:28;;;;;;;;;;;:52;44714:19;44734:1;44714:22;;;;;;;;;;;;;;44685:52;;;;;;;;;;;:56;;;;44292:477;44802:25;44816:10;44802:13;:25::i;:::-;44795:33;;;;;;;;;;;;;;;44226:705;44892:5;44899:1;44902;44905;44885:22;;;;;;;;;;;;;;;44098:854;44060:907;44981:15;45044:1;45039;45015:21;:25;;;;;;:30;45011:267;;;45077:13;45115:1;45091:21;:25;;;;;;45077:40;;;;;;;;;;;;;;45067:50;;45011:267;;;45261:1;45168:90;45213:13;45255:1;45251;45227:21;:25;;;;;;:29;45213:44;;;;;;;;;;;;;;45168:13;45206:1;45182:21;:25;;;;;;45168:40;;;;;;;;;;;;;;:44;;:90;;;;:::i;:::-;:94;;;;;;45158:104;;45011:267;45299:4;45305:7;45314:16;45332:21;45292:62;;;;;;;;;;;;;;42473:2900;;;;;;:::o;39776:2185::-;39871:4;39877:7;39897:14;39914:39;39942:10;39914:27;:39::i;:::-;39897:56;;39977:1;39968:6;:10;39964:1962;;;39995:14;40024:13;40040:1;40024:17;;40056:11;40079:1;40070:6;:10;40056:24;;40095:13;40197:50;40229:10;40241:5;40197:31;:50::i;:::-;40189:58;;40275:10;40266:5;:19;40262:42;;40295:5;40302:1;40287:17;;;;;;;;;;;40262:42;40327:48;40359:10;40371:3;40327:31;:48::i;:::-;40319:56;;40402:10;40394:5;:18;40390:42;;;40422:4;40428:3;40414:18;;;;;;;;;;;40390:42;40523:1392;40530:4;40523:1392;;;40588:5;40584:1;40580;40571:5;40565:3;:11;40564:17;;;;;;:21;:29;40555:38;;40620:112;40674:10;40707:6;40620:31;:112::i;:::-;40612:120;;40763:10;40755:5;:18;40751:1149;;;40836:17;40881:140;40943:10;40993:1;40984:6;:10;40881:31;:140::i;:::-;40836:185;;41061:10;41048:9;:23;41044:287;;41152:4;41158:6;41144:21;;;;;;;;;;;;41044:287;41306:1;41297:6;:10;41289:18;;40751:1149;;;;41379:17;41424:140;41486:10;41536:1;41527:6;:10;41424:31;:140::i;:::-;41379:185;;41603:10;41591:9;:22;41587:294;;;41699:4;41714:1;41705:6;:10;41691:25;;;;;;;;;;;;41587:294;41856:1;41847:6;:10;41841:16;;40751:1149;;40523:1392;;;39964:1962;;;;;41944:5;41951:1;41936:17;;;;;39776:2185;;;;;;:::o;18510:158::-;18584:7;18635:22;18639:3;:10;;18651:5;18635:3;:22::i;:::-;18627:31;;18604:56;;18510:158;;;;:::o;17796:167::-;17876:4;17900:55;17910:3;:10;;17946:5;17930:23;;17922:32;;17900:9;:55::i;:::-;17893:62;;17796:167;;;;:::o;18049:117::-;18112:7;18139:19;18147:3;:10;;18139:7;:19::i;:::-;18132:26;;18049:117;;;:::o;12288:414::-;12351:4;12373:21;12383:3;12388:5;12373:9;:21::i;:::-;12368:327;;12411:3;:11;;12428:5;12411:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12594:3;:11;;:18;;;;12572:3;:12;;:19;12585:5;12572:19;;;;;;;;;;;:40;;;;12634:4;12627:11;;;;12368:327;12678:5;12671:12;;12288:414;;;;;:::o;17552:158::-;17625:4;17649:53;17657:3;:10;;17693:5;17677:23;;17669:32;;17649:7;:53::i;:::-;17642:60;;17552:158;;;;:::o;120:179::-;178:7;198:9;214:1;210;:5;198:17;;239:1;234;:6;;226:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;290:1;283:8;;;120:179;;;;:::o;15176:204::-;15243:7;15292:5;15271:3;:11;;:18;;;;:26;15263:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15354:3;:11;;15366:5;15354:18;;;;;;;;;;;;;;;;15347:25;;15176:204;;;;:::o;14508:129::-;14581:4;14628:1;14605:3;:12;;:19;14618:5;14605:19;;;;;;;;;;;;:24;;14598:31;;14508:129;;;;:::o;14723:109::-;14779:7;14806:3;:11;;:18;;;;14799:25;;14723:109;;;:::o;12878:1544::-;12944:4;13062:18;13083:3;:12;;:19;13096:5;13083:19;;;;;;;;;;;;13062:40;;13133:1;13119:10;:15;13115:1300;;13481:21;13518:1;13505:10;:14;13481:38;;13534:17;13575:1;13554:3;:11;;:18;;;;:22;13534:42;;13821:17;13841:3;:11;;13853:9;13841:22;;;;;;;;;;;;;;;;13821:42;;13987:9;13958:3;:11;;13970:13;13958:26;;;;;;;;;;;;;;;:38;;;;14106:1;14090:13;:17;14064:3;:12;;:23;14077:9;14064:23;;;;;;;;;;;:43;;;;14216:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;14311:3;:12;;:19;14324:5;14311:19;;;;;;;;;;;14304:26;;;14354:4;14347:11;;;;;;;;13115:1300;14398:5;14391:12;;;12878:1544;;;;;:::o

Swarm Source

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