ETH Price: $2,238.95 (-8.61%)

Contract

0x79619b34E2F339Fd11d5BBAaA7cE1e95Cb1A6295

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Privileged Call1258670582023-08-28 19:55:07888 days ago1693252507IN
0x79619b34...5Cb1A6295
0 ETH0.000291310.1

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xD3169156...E9Fa44f22
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
ProofFeeds

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

import "./interfaces/public/IProofFeeds.sol";
import "./interfaces/public/ICoreMultidataFeedsReader.sol";
import "./NonProxiedOwnerMultipartyCommons.sol";
import "./AbstractFeedsWithMetrics.sol";


contract ProofFeeds is IProofFeeds, ICoreMultidataFeedsReader, NonProxiedOwnerMultipartyCommons, AbstractFeedsWithMetrics {

    /**
     * @notice Contract version, using SemVer version scheme.
     */
    string public constant override VERSION = "0.1.0";

    bytes32 public constant override MERKLE_TREE_ROOT_TYPE_HASH = keccak256("MerkleTreeRoot(uint32 epoch,bytes32 root)");

    mapping(uint => uint) internal _values;
    mapping(uint => uint32) internal _updateTSs;

    ////////////////////////

    constructor (address sourceContractAddr_, uint sourceChainId_)
        NonProxiedOwnerMultipartyCommons(sourceContractAddr_, sourceChainId_) {

    }

    ///////////////////////

    function requireValidProof(
        SignedMerkleTreeRoot memory signedMerkleTreeRoot_,
        CheckedData memory checkedData_
    ) public view override {
        require(isProofValid(signedMerkleTreeRoot_, checkedData_), "MultidataFeeds: INVALID_PROOF");
    }

    function isProofValid(
        SignedMerkleTreeRoot memory signedMerkleTreeRoot_,
        CheckedData memory checkedData_
    ) public view override returns (bool) {
        bool isSignatureValid = isMessageSignatureValid(
            keccak256(
                abi.encode(MERKLE_TREE_ROOT_TYPE_HASH, signedMerkleTreeRoot_.epoch, signedMerkleTreeRoot_.root)
            ),
            signedMerkleTreeRoot_.v, signedMerkleTreeRoot_.r, signedMerkleTreeRoot_.s
        );

        if (!isSignatureValid) {
            return false;
        }

        bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(
            signedMerkleTreeRoot_.epoch,
            checkedData_.metricName,
            checkedData_.metricValue,
            checkedData_.metricUpdateTs
        ))));

        return MerkleProof.verify(checkedData_.merkleTreeProof, signedMerkleTreeRoot_.root, leaf);
    }

    ////////////////////////////

    function quoteMetrics(string[] calldata names) external view override returns (Quote[] memory quotes) {
        uint length = names.length;
        quotes = new Quote[](length);

        for (uint i; i < length; i++) {
            (bool has, uint id) = hasMetric(names[i]);
            require(has, "MultidataFeeds: INVALID_METRIC_NAME");
            quotes[i] = Quote(_values[id], _updateTSs[id]);
        }
    }

    function quoteMetrics(uint256[] calldata ids) external view override returns (Quote[] memory quotes) {
        uint length = ids.length;
        quotes = new Quote[](length);

        uint metricsCount = getMetricsCount();
        for (uint i; i < length; i++) {
            uint id = ids[i];
            require(id < metricsCount, "MultidataFeeds: INVALID_METRIC");
            quotes[i] = Quote(_values[id], _updateTSs[id]);
        }
    }

    ////////////////////////////

    /**
     * @notice Upload signed value
     * @dev metric in this instance is created if it is not exists. Important: metric id is different from metric ids from other
     *      instances of ProofFeeds and MedianFeed
     */
    function setValue(SignedMerkleTreeRoot calldata signedMerkleTreeRoot_, CheckedData calldata data_) external {
        require(isProofValid(signedMerkleTreeRoot_, data_), "MultidataFeeds: INVALID_PROOF");

        (bool has, uint metricId) = hasMetric(data_.metricName);
        if (!has) {
            metricId = addMetric(Metric(data_.metricName, "", "", new string[](0)));
        }

        require(data_.metricUpdateTs > _updateTSs[metricId], "MultidataFeeds: STALE_UPDATE");

        _values[metricId] = data_.metricValue;
        _updateTSs[metricId] = data_.metricUpdateTs;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;

import "./IVersioned.sol";
import "./IProofFeedsCommons.sol";


interface IProofFeeds is IVersioned, IProofFeedsCommons {

    struct CheckedData {
        bytes32[] merkleTreeProof;
        string metricName;
        uint256 metricValue;
        uint32 metricUpdateTs;
    }

    function requireValidProof(
        SignedMerkleTreeRoot memory signedMerkleTreeRoot_,
        CheckedData memory checkedData_
    ) external view;

    function isProofValid(
        SignedMerkleTreeRoot memory signedMerkleTreeRoot_,
        CheckedData memory checkedData_
    ) external view returns (bool);
}

// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;

import "./IVersioned.sol";


/// @title Reader of MultidataFeeds core data.
interface ICoreMultidataFeedsReader is IVersioned {

    struct Metric {
        string name;    // unique, immutable in a contract
        string description;
        string currency;    // USD, ETH, PCT (for percent), BPS (for basis points), etc
        string[] tags;
    }

    struct Quote {
        uint256 value;
        uint32 updateTS;
    }

    event NewMetric(string name);
    event MetricInfoUpdated(string name);
    /// @notice updated one metric or all if metricId=type(uint256).max-1
    event MetricUpdated(uint indexed epochId, uint indexed metricId);


    /**
     * @notice Gets a list of metrics quoted by this oracle.
     * @return A list of metric info indexed by numerical metric ids.
     */
    function getMetrics() external view returns (Metric[] memory);

    /// @notice Gets a count of metrics quoted by this oracle.
    function getMetricsCount() external view returns (uint);

    /// @notice Gets metric info by a numerical id.
    function getMetric(uint256 id) external view returns (Metric memory);

    /**
     * @notice Checks if a metric is quoted by this oracle.
     * @param name Metric codename.
     * @return has `true` if metric exists.
     * @return id Metric numerical id, set if `has` is true.
     */
    function hasMetric(string calldata name) external view returns (bool has, uint256 id);

    /**
     * @notice Gets last known quotes for specified metrics.
     * @param names Metric codenames to query.
     * @return quotes Values and update timestamps for queried metrics.
     */
    function quoteMetrics(string[] calldata names) external view returns (Quote[] memory quotes);

    /**
     * @notice Gets last known quotes for specified metrics by internal numerical ids.
     * @dev Saves one storage lookup per metric.
     * @param ids Numerical metric ids to query.
     * @return quotes Values and update timestamps for queried metrics.
     */
    function quoteMetrics(uint256[] calldata ids) external view returns (Quote[] memory quotes);
}

// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "./MultipartyCommons.sol";


abstract contract NonProxiedOwnerMultipartyCommons is MultipartyCommons {
    event MPOwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    OwnerMultisignature internal ownerMultisignature_; // informational field
    address internal mpOwner_;   // described by ownerMultisignature

    constructor(address verifyingContract, uint256 chainId) MultipartyCommons(verifyingContract, chainId) {
        address[] memory newParticipants = new address[](1);
        newParticipants[0] = msg.sender;
        changeOwner_(msg.sender, 1, newParticipants);
    }

    /**
     * @notice Changes multiparty owner data.
     * @param newOwner Address of the new mp owner.
     * @param quorum New quorum value.
     * @param newParticipants List of the new participants' addresses
     * @param salt Salt value
     * @param deadline Unix ts at which the work must be interrupted.
     */
    function changeOwner(address newOwner, uint quorum, address[] calldata newParticipants, uint salt, uint deadline)
        external
        selfCall
        applicable(salt, deadline)
    {
        changeOwner_(newOwner, quorum, newParticipants);
    }

    /**
     * @notice Changes multiparty owner data. Internal
     * @param newOwner Address of the new mp owner.
     * @param quorum New quorum value.
     * @param newParticipants List of the new participants' addresses
     */
    function changeOwner_(address newOwner, uint quorum, address[] memory newParticipants)
        internal
    {
        require(newOwner != address(0), "MP: ZERO_ADDRESS");
        emit MPOwnershipTransferred(mpOwner_, newOwner);
        address[] memory oldParticipants = ownerMultisignature_.participants;
        onNewOwner(newOwner, quorum, newParticipants, oldParticipants);
        ownerMultisignature_.quorum = quorum;
        ownerMultisignature_.participants = newParticipants;
        mpOwner_ = newOwner;
    }

    /**
     * @notice The new mp owner handler. Empty implementation
     * @param newOwner Address of the new mp owner.
     * @param newQuorum New quorum value.
     * @param newParticipants List of the new participants' addresses.
     * @param oldParticipants List of the old participants' addresses.
     */
    function onNewOwner(address newOwner, uint newQuorum, address[] memory newParticipants, address[] memory oldParticipants) virtual internal {}

    // @inheritdoc IMpOwnable
    function ownerMultisignature() public view virtual override returns (OwnerMultisignature memory) {
        return ownerMultisignature_;
    }

    // @inheritdoc IMpOwnable
    function mpOwner() public view virtual override returns (address) {
        return mpOwner_;
    }
}

// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;

import "./interfaces/public/ICoreMultidataFeedsReader.sol";


abstract contract AbstractFeedsWithMetrics is ICoreMultidataFeedsReader {

    Metric[] internal metrics;
    // Position of the metric in the `metrics` array, plus 1 because index 0
    // means that metric is not exists (to avoid additional checks of existence).
    mapping(string => uint) internal adjustedMetricId;

    /// @inheritdoc ICoreMultidataFeedsReader
    function getMetrics() public view override returns (Metric[] memory) {
        return metrics;
    }

    /// @inheritdoc ICoreMultidataFeedsReader
    function getMetricsCount() public view override returns (uint) {
        return metrics.length;
    }

    /// @inheritdoc ICoreMultidataFeedsReader
    function getMetric(uint256 id) external view override returns (Metric memory) {
        require(id < metrics.length, "MultidataFeeds: METRIC_NOT_FOUND");
        return metrics[id];
    }

    /// @inheritdoc ICoreMultidataFeedsReader
    function hasMetric(string calldata name) public view override returns (bool has, uint256 id) {
        uint adjustedId = adjustedMetricId[name];
        if (adjustedId != 0) {
            return (true, adjustedId - 1);
        }

        return (false, 0);
    }

    function addMetric(Metric memory metric_) internal returns (uint newMetricId_) {
        uint adjustedId = adjustedMetricId[metric_.name];
        require(adjustedId == 0, "MultidataFeeds: METRIC_EXISTS");

        newMetricId_ = metrics.length;
        adjustedMetricId[metric_.name] = newMetricId_ + 1;
        metrics.push(metric_);

        emit NewMetric(metric_.name);
    }

    function updateMetric(Metric memory metric_) internal {
        uint adjustedId = adjustedMetricId[metric_.name];
        require(adjustedId != 0, "MultidataFeeds: METRIC_NOT_FOUND");

        metrics[adjustedId-1] = metric_;
        emit MetricInfoUpdated(metric_.name);
    }
}

File 7 of 11 : IVersioned.sol
// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;


/// @title Contract supporting versioning using SemVer version scheme.
interface IVersioned {
    /// @notice Contract version, using SemVer version scheme.
    function VERSION() external view returns (string memory);
}

// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;

import "./IVersioned.sol";


interface IProofFeedsCommons {

    struct SignedMerkleTreeRoot {
        uint32 epoch;
        uint8 v;
        bytes32 r;
        bytes32 s;
        bytes32 root;
    }

    /// @dev must be keccak256("MerkleTreeRoot(uint32 epoch,bytes32 root)")
    function MERKLE_TREE_ROOT_TYPE_HASH() external view returns (bytes32);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
        } else if (signature.length == 64) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                let vs := mload(add(signature, 0x40))
                r := mload(add(signature, 0x20))
                s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
                v := add(shr(255, vs), 27)
            }
        } else {
            revert("ECDSA: invalid signature length");
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// SPDX-License-Identifier: bsl-1.1

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "./interfaces/IMpOwnable.sol";


abstract contract MultipartyCommons is IMpOwnable {
    bytes32 immutable internal VOTE_TYPE_HASH;
    bytes32 internal DOMAIN_SEPARATOR;

    mapping(uint => bool) public usedSalt;

    // Self-calls are used to engage builtin deserialization facility (abi parsing) and not parse args ourselves
    modifier selfCall virtual {
        require(msg.sender == address(this), "MP: NO_ACCESS");
        _;
    }

    // Checks if a privileged call can be applied
    modifier applicable(uint salt, uint deadline) virtual {
        require(getTimeNow() <= deadline, "MP: DEADLINE");
        require(!usedSalt[salt], "MP: DUPLICATE");
        usedSalt[salt] = true;
        _;
    }

    constructor(address verifyingContract, uint256 chainId) {
        require(verifyingContract != address(0) && chainId != 0, 'MP: Invalid domain parameters');
        VOTE_TYPE_HASH = keccak256("Vote(bytes calldata)");
        setDomainSeparator(chainId, verifyingContract);
    }

    /**
     * @notice DOMAIN_SEPARATOR setter.
     * @param chainId Chain id of the verifying contract
     * @param verifyingContract Address of the verifying contract
     */
    function setDomainSeparator(uint256 chainId, address verifyingContract) internal {
        DOMAIN_SEPARATOR = buildDomainSeparator(chainId, verifyingContract);
    }

    function buildDomainSeparator(uint256 chainId, address verifyingContract) internal pure returns (bytes32) {
        return keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes("Multidata.Multiparty.Protocol")),
                keccak256(bytes("1")),
                chainId,
                verifyingContract
            )
        );
    }

    /**
     * @notice Performs privileged call to the contract.
     * @param privilegedCallData Method calldata
     * @param v Signature v for the call
     * @param r Signature r for the call
     * @param s Signature s for the call
     */
    function privilegedCall(bytes calldata privilegedCallData, uint8 v, bytes32 r, bytes32 s) external
    {
        checkMessageSignature(keccak256(abi.encode(VOTE_TYPE_HASH, keccak256(privilegedCallData))), v, r, s);

        (bool success, bytes memory returnData) = address(this).call(privilegedCallData);
        if (!success) {
            revert(string(returnData));
        }
    }

    /**
     * @notice Checks the message signature.
     * @param hashStruct Hash of a message struct
     * @param v V of the message signature
     * @param r R of the message signature
     * @param s S of the message signature
     */
    function checkMessageSignature(bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal virtual view {
        require(isMessageSignatureValid(hashStruct, v, r, s), "MP: NO_ACCESS");
    }

    function isMessageSignatureValid(bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal virtual view returns (bool) {
        return ECDSA.recover(generateMessageHash(hashStruct), v, r, s) == mpOwner();
    }

    function checkMessageSignatureForDomain(bytes32 domainSeparator, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal virtual view {
        require(ECDSA.recover(generateMessageHashForDomain(domainSeparator, hashStruct), v, r, s) == mpOwner(), "MP: NO_ACCESS");
    }

    /**
     * @notice Returns hash of the message for the hash of the struct.
     * @param hashStruct Hash of a message struct
     */
    function generateMessageHash(bytes32 hashStruct) internal view returns (bytes32) {
        return generateMessageHashForDomain(DOMAIN_SEPARATOR, hashStruct);
    }

    function generateMessageHashForDomain(bytes32 domainSeparator, bytes32 hashStruct) internal pure returns (bytes32) {
        return keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                hashStruct
            )
        );
    }

    /**
     * @notice Returns current chain time in unix ts.
     */
    function getTimeNow() virtual internal view returns (uint32) {
        return uint32(block.timestamp);
    }

    // @inheritdoc IMpOwnable
    function ownerMultisignature() public view virtual override returns (OwnerMultisignature memory);

    // @inheritdoc IMpOwnable
    function mpOwner() public view virtual override returns (address);
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

interface IMpOwnable {
    struct OwnerMultisignature {
        uint quorum;
        address[] participants;
    }

    // @notice Returns OwnerMultisignature data
    function ownerMultisignature() external view returns (OwnerMultisignature memory);

    // @notice Returns address og the multiparty owner
    function mpOwner() external view returns (address);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"sourceContractAddr_","type":"address"},{"internalType":"uint256","name":"sourceChainId_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"MPOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"MetricInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epochId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"metricId","type":"uint256"}],"name":"MetricUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NewMetric","type":"event"},{"inputs":[],"name":"MERKLE_TREE_ROOT_TYPE_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"address[]","name":"newParticipants","type":"address[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMetric","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"currency","type":"string"},{"internalType":"string[]","name":"tags","type":"string[]"}],"internalType":"struct ICoreMultidataFeedsReader.Metric","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetrics","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"currency","type":"string"},{"internalType":"string[]","name":"tags","type":"string[]"}],"internalType":"struct ICoreMultidataFeedsReader.Metric[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetricsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"hasMetric","outputs":[{"internalType":"bool","name":"has","type":"bool"},{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct IProofFeedsCommons.SignedMerkleTreeRoot","name":"signedMerkleTreeRoot_","type":"tuple"},{"components":[{"internalType":"bytes32[]","name":"merkleTreeProof","type":"bytes32[]"},{"internalType":"string","name":"metricName","type":"string"},{"internalType":"uint256","name":"metricValue","type":"uint256"},{"internalType":"uint32","name":"metricUpdateTs","type":"uint32"}],"internalType":"struct IProofFeeds.CheckedData","name":"checkedData_","type":"tuple"}],"name":"isProofValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mpOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMultisignature","outputs":[{"components":[{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"address[]","name":"participants","type":"address[]"}],"internalType":"struct IMpOwnable.OwnerMultisignature","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"privilegedCallData","type":"bytes"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"privilegedCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"names","type":"string[]"}],"name":"quoteMetrics","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint32","name":"updateTS","type":"uint32"}],"internalType":"struct ICoreMultidataFeedsReader.Quote[]","name":"quotes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"quoteMetrics","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint32","name":"updateTS","type":"uint32"}],"internalType":"struct ICoreMultidataFeedsReader.Quote[]","name":"quotes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct IProofFeedsCommons.SignedMerkleTreeRoot","name":"signedMerkleTreeRoot_","type":"tuple"},{"components":[{"internalType":"bytes32[]","name":"merkleTreeProof","type":"bytes32[]"},{"internalType":"string","name":"metricName","type":"string"},{"internalType":"uint256","name":"metricValue","type":"uint256"},{"internalType":"uint32","name":"metricUpdateTs","type":"uint32"}],"internalType":"struct IProofFeeds.CheckedData","name":"checkedData_","type":"tuple"}],"name":"requireValidProof","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct IProofFeedsCommons.SignedMerkleTreeRoot","name":"signedMerkleTreeRoot_","type":"tuple"},{"components":[{"internalType":"bytes32[]","name":"merkleTreeProof","type":"bytes32[]"},{"internalType":"string","name":"metricName","type":"string"},{"internalType":"uint256","name":"metricValue","type":"uint256"},{"internalType":"uint32","name":"metricUpdateTs","type":"uint32"}],"internalType":"struct IProofFeeds.CheckedData","name":"data_","type":"tuple"}],"name":"setValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedSalt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

0x60a06040523480156200001157600080fd5b5060405162002768380380620027688339810160408190526200003491620003f2565b818181816001600160a01b038216158015906200005057508015155b620000a25760405162461bcd60e51b815260206004820152601d60248201527f4d503a20496e76616c696420646f6d61696e20706172616d657465727300000060448201526064015b60405180910390fd5b7ff41d3b4f231a07c544469cb2026328741f0376353fcc99c3a11153ecd880cde46080908152604080518082018252601d81527f4d756c7469646174612e4d756c746970617274792e50726f746f636f6c0000006020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f3b99e63aaad889aca6079ce9e1d6deaf934b1fecefb793e9198391788acfcabf818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201529283018490526001600160a01b03851660a0808501919091528251808503909101815260c090930190915281519101206000555050604080516001808252818301909252600091602080830190803683370190505090503381600081518110620001fc57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015262000222336001836200022d565b50505050506200042c565b6001600160a01b038316620002785760405162461bcd60e51b815260206004820152601060248201526f4d503a205a45524f5f4144445245535360801b604482015260640162000099565b6004546040516001600160a01b038086169216907f74b01e0138e401c89cbbea1e0ec9844af6630c030d5834199ae3766a88b4cf5f90600090a3600060026001018054806020026020016040519081016040528092919081815260200182805480156200030f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620002f0575b505050505090506200032a848484846200036b60201b60201c565b600283905581516200034490600390602085019062000371565b5050600480546001600160a01b0319166001600160a01b0394909416939093179092555050565b50505050565b828054828255906000526020600020908101928215620003c9579160200282015b82811115620003c957825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000392565b50620003d7929150620003db565b5090565b5b80821115620003d75760008155600101620003dc565b6000806040838503121562000405578182fd5b82516001600160a01b03811681146200041c578283fd5b6020939093015192949293505050565b60805161232062000448600039600061043601526123206000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637410603011610097578063c0e24ff011610066578063c0e24ff01461025f578063cf4a75be14610272578063df65301f1461027a578063ffa1ad741461029d57600080fd5b806374106030146101ed5780637606f7811461020057806391f32c6514610215578063a9e1f5201461024a57600080fd5b80635621eae7116100d35780635621eae714610170578063582bd8f11461019a578063595c05c1146101ba578063627b876d146101cd57600080fd5b8063221da01f1461010557806327e5d97d14610125578063368458901461013a5780635079f94d1461015d575b600080fd5b6004546040516001600160a01b0390911681526020015b60405180910390f35b610138610133366004611e6c565b6102ce565b005b61014d610148366004611e6c565b61032d565b604051901515815260200161011c565b61013861016b366004611d5c565b610431565b61018361017e366004611dbf565b61052e565b60408051921515835260208301919091520161011c565b6101ad6101a8366004611eb8565b610584565b60405161011c91906120b8565b6101386101c8366004611ca7565b6108cf565b6101e06101db366004611d1d565b610a06565b60405161011c9190612050565b6101386101fb366004611df2565b610b94565b610208610d8f565b60405161011c9190611fef565b61023c7f3837bfa091f1204e612d56f81b7ef5e5000c71738eabe65b6c4cc54239be0e7681565b60405190815260200161011c565b61025261107d565b60405161011c91906120cb565b6101e061026d366004611d1d565b611110565b60055461023c565b61014d610288366004611eb8565b60016020526000908152604090205460ff1681565b6102c1604051806040016040528060058152602001640302e312e360dc1b81525081565b60405161011c91906120a5565b6102d8828261032d565b6103295760405162461bcd60e51b815260206004820152601d60248201527f4d756c74696461746146656564733a20494e56414c49445f50524f4f4600000060448201526064015b60405180910390fd5b5050565b8151608080840151604080517f3837bfa091f1204e612d56f81b7ef5e5000c71738eabe65b6c4cc54239be0e76602082015263ffffffff90941690840152606083015260009182916103a4910160405160208183030381529060405280519060200120856020015186604001518760600151611290565b9050806103b557600091505061042b565b600084600001518460200151856040015186606001516040516020016103de949392919061212c565b60408051601f198184030181528282528051602091820120908301520160405160208183030381529060405280519060200120905061042684600001518660800151836112d4565b925050505b92915050565b6104a27f00000000000000000000000000000000000000000000000000000000000000008686604051610465929190611fc3565b6040519081900381206104849291602001918252602082015260400190565b60405160208183030381529060405280519060200120848484611391565b600080306001600160a01b031687876040516104bf929190611fc3565b6000604051808303816000865af19150503d80600081146104fc576040519150601f19603f3d011682016040523d82523d6000602084013e610501565b606091505b509150915081610525578060405162461bcd60e51b815260040161032091906120a5565b50505050505050565b600080600060068585604051610545929190611fc3565b90815260200160405180910390205490508060001461057457600161056a8183612219565b925092505061057d565b60008092509250505b9250929050565b6105af6040518060800160405280606081526020016060815260200160608152602001606081525090565b60055482106106005760405162461bcd60e51b815260206004820181905260248201527f4d756c74696461746146656564733a204d45545249435f4e4f545f464f554e446044820152606401610320565b6005828154811061062157634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160405180608001604052908160008201805461064a90612268565b80601f016020809104026020016040519081016040528092919081815260200182805461067690612268565b80156106c35780601f10610698576101008083540402835291602001916106c3565b820191906000526020600020905b8154815290600101906020018083116106a657829003601f168201915b505050505081526020016001820180546106dc90612268565b80601f016020809104026020016040519081016040528092919081815260200182805461070890612268565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050815260200160028201805461076e90612268565b80601f016020809104026020016040519081016040528092919081815260200182805461079a90612268565b80156107e75780601f106107bc576101008083540402835291602001916107e7565b820191906000526020600020905b8154815290600101906020018083116107ca57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b828210156108c157838290600052602060002001805461083490612268565b80601f016020809104026020016040519081016040528092919081815260200182805461086090612268565b80156108ad5780601f10610882576101008083540402835291602001916108ad565b820191906000526020600020905b81548152906001019060200180831161089057829003601f168201915b505050505081526020019060010190610815565b505050915250909392505050565b33301461090e5760405162461bcd60e51b815260206004820152600d60248201526c4d503a204e4f5f41434345535360981b6044820152606401610320565b8181804263ffffffff1611156109555760405162461bcd60e51b815260206004820152600c60248201526b4d503a20444541444c494e4560a01b6044820152606401610320565b60008281526001602052604090205460ff16156109a45760405162461bcd60e51b815260206004820152600d60248201526c4d503a204455504c494341544560981b6044820152606401610320565b600082815260016020818152604092839020805460ff1916909217909155815187820281810183019093528781526109fc928b928b92918b918b9182918501908490808284376000920191909152506113df92505050565b5050505050505050565b606081806001600160401b03811115610a2f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a7457816020015b6040805180820190915260008082526020820152815260200190600190039081610a4d5790505b50915060005b81811015610b8c57600080610aba878785818110610aa857634e487b7160e01b600052603260045260246000fd5b905060200281019061017e9190612165565b9150915081610b175760405162461bcd60e51b815260206004820152602360248201527f4d756c74696461746146656564733a20494e56414c49445f4d45545249435f4e604482015262414d4560e81b6064820152608401610320565b604080518082018252600083815260076020908152838220548352848252600881529290205463ffffffff16918101919091528551869085908110610b6c57634e487b7160e01b600052603260045260246000fd5b602002602001018190525050508080610b84906122a3565b915050610a7a565b505092915050565b610baf610ba636849003840184611e4a565b61014883612230565b610bfb5760405162461bcd60e51b815260206004820152601d60248201527f4d756c74696461746146656564733a20494e56414c49445f50524f4f460000006044820152606401610320565b600080610c0e61017e6020850185612165565b9150915081610cc657610cc36040518060800160405280858060200190610c359190612165565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602080820183528482528086019190915281518082018352848152828601528151848152908101909152606090930192919050610cbb565b6060815260200190600190039081610ca65790505b509052611503565b90505b60008181526008602052604090205463ffffffff16610ceb6080850160608601611ed0565b63ffffffff1611610d3e5760405162461bcd60e51b815260206004820152601c60248201527f4d756c74696461746146656564733a205354414c455f555044415445000000006044820152606401610320565b60008181526007602052604090819020908401359055610d646080840160608501611ed0565b600091825260086020526040909120805463ffffffff191663ffffffff909216919091179055505050565b60606005805480602002602001604051908101604052809291908181526020016000905b828210156110745783829060005260206000209060040201604051806080016040529081600082018054610de690612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1290612268565b8015610e5f5780601f10610e3457610100808354040283529160200191610e5f565b820191906000526020600020905b815481529060010190602001808311610e4257829003601f168201915b50505050508152602001600182018054610e7890612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea490612268565b8015610ef15780601f10610ec657610100808354040283529160200191610ef1565b820191906000526020600020905b815481529060010190602001808311610ed457829003601f168201915b50505050508152602001600282018054610f0a90612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3690612268565b8015610f835780601f10610f5857610100808354040283529160200191610f83565b820191906000526020600020905b815481529060010190602001808311610f6657829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561105d578382906000526020600020018054610fd090612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffc90612268565b80156110495780601f1061101e57610100808354040283529160200191611049565b820191906000526020600020905b81548152906001019060200180831161102c57829003601f168201915b505050505081526020019060010190610fb1565b505050508152505081526020019060010190610db3565b50505050905090565b6040805180820190915260008152606060208201526002604051806040016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561110257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e4575b505050505081525050905090565b606081806001600160401b0381111561113957634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561117e57816020015b60408051808201909152600080825260208201528152602001906001900390816111575790505b509150600061118c60055490565b905060005b828110156112875760008686838181106111bb57634e487b7160e01b600052603260045260246000fd5b9050602002013590508281106112135760405162461bcd60e51b815260206004820152601e60248201527f4d756c74696461746146656564733a20494e56414c49445f4d455452494300006044820152606401610320565b604080518082018252600083815260076020908152838220548352848252600881529290205463ffffffff1691810191909152855186908490811061126857634e487b7160e01b600052603260045260246000fd5b602002602001018190525050808061127f906122a3565b915050611191565b50505092915050565b60006112a46004546001600160a01b031690565b6001600160a01b03166112c16112b987611691565b8686866116da565b6001600160a01b03161495945050505050565b600081815b855181101561138657600086828151811061130457634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611346576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611373565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061137e816122a3565b9150506112d9565b509092149392505050565b61139d84848484611290565b6113d95760405162461bcd60e51b815260206004820152600d60248201526c4d503a204e4f5f41434345535360981b6044820152606401610320565b50505050565b6001600160a01b0383166114285760405162461bcd60e51b815260206004820152601060248201526f4d503a205a45524f5f4144445245535360801b6044820152606401610320565b6004546040516001600160a01b038086169216907f74b01e0138e401c89cbbea1e0ec9844af6630c030d5834199ae3766a88b4cf5f90600090a3600060026001018054806020026020016040519081016040528092919081815260200182805480156114bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161149f575b50505050509050600283905581516114dc906003906020850190611883565b5050600480546001600160a01b0319166001600160a01b0394909416939093179092555050565b6000806006836000015160405161151a9190611fd3565b90815260200160405180910390205490508060001461157b5760405162461bcd60e51b815260206004820152601d60248201527f4d756c74696461746146656564733a204d45545249435f4558495354530000006044820152606401610320565b600554915061158b826001612201565b835160405160069161159c91611fd3565b908152604051908190036020908101909120919091556005805460018101825560009190915284518051869360049093027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001926115fe9284929101906118e8565b50602082810151805161161792600185019201906118e8565b50604082015180516116339160028401916020909101906118e8565b506060820151805161164f91600384019160209091019061195c565b505083516040517f3678759a619d50881eef54d84a58228b4cc15adb52cb0458a0f28352846427c1925061168391906120a5565b60405180910390a150919050565b600061042b6000548360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156117575760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610320565b8360ff16601b148061176c57508360ff16601c145b6117c35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610320565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611817573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661187a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610320565b95945050505050565b8280548282559060005260206000209081019282156118d8579160200282015b828111156118d857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906118a3565b506118e49291506119b5565b5090565b8280546118f490612268565b90600052602060002090601f01602090048101928261191657600085556118d8565b82601f1061192f57805160ff19168380011785556118d8565b828001600101855582156118d8579182015b828111156118d8578251825591602001919060010190611941565b8280548282559060005260206000209081019282156119a9579160200282015b828111156119a957825180516119999184916020909101906118e8565b509160200191906001019061197c565b506118e49291506119ca565b5b808211156118e457600081556001016119b6565b808211156118e45760006119de82826119e7565b506001016119ca565b5080546119f390612268565b6000825580601f10611a03575050565b601f016020900490600052602060002090810190611a2191906119b5565b50565b60008083601f840112611a35578182fd5b5081356001600160401b03811115611a4b578182fd5b6020830191508360208260051b850101111561057d57600080fd5b60008083601f840112611a77578182fd5b5081356001600160401b03811115611a8d578182fd5b60208301915083602082850101111561057d57600080fd5b600082601f830112611ab5578081fd5b81356001600160401b03811115611ace57611ace6122d4565b611ae1601f8201601f19166020016121d1565b818152846020838601011115611af5578283fd5b816020850160208301379081016020019190915292915050565b600060808284031215611b20578081fd5b611b286121a9565b905081356001600160401b0380821115611b4157600080fd5b818401915084601f830112611b5557600080fd5b8135602082821115611b6957611b696122d4565b8160051b611b788282016121d1565b8381528281019086840183880185018b1015611b9357600080fd5b600097505b85881015611bb6578035835260019790970196918401918401611b98565b508752505085810135935082841115611bce57600080fd5b611bda87858801611aa5565b818601525050505060408201356040820152611bf860608301611c7d565b606082015292915050565b600060a08284031215611c14578081fd5b60405160a081018181106001600160401b0382111715611c3657611c366122d4565b604052905080611c4583611c7d565b8152611c5360208401611c96565b60208201526040830135604082015260608301356060820152608083013560808201525092915050565b803563ffffffff81168114611c9157600080fd5b919050565b803560ff81168114611c9157600080fd5b60008060008060008060a08789031215611cbf578182fd5b86356001600160a01b0381168114611cd5578283fd5b95506020870135945060408701356001600160401b03811115611cf6578283fd5b611d0289828a01611a24565b979a9699509760608101359660809091013595509350505050565b60008060208385031215611d2f578182fd5b82356001600160401b03811115611d44578283fd5b611d5085828601611a24565b90969095509350505050565b600080600080600060808688031215611d73578081fd5b85356001600160401b03811115611d88578182fd5b611d9488828901611a66565b9096509450611da7905060208701611c96565b94979396509394604081013594506060013592915050565b60008060208385031215611dd1578182fd5b82356001600160401b03811115611de6578283fd5b611d5085828601611a66565b60008082840360c0811215611e05578283fd5b60a0811215611e12578283fd5b5082915060a08301356001600160401b03811115611e2e578182fd5b830160808186031215611e3f578182fd5b809150509250929050565b600060a08284031215611e5b578081fd5b611e658383611c03565b9392505050565b60008060c08385031215611e7e578182fd5b611e888484611c03565b915060a08301356001600160401b03811115611ea2578182fd5b611eae85828601611b0f565b9150509250929050565b600060208284031215611ec9578081fd5b5035919050565b600060208284031215611ee1578081fd5b611e6582611c7d565b60008151808452611f0281602086016020860161223c565b601f01601f19169290920160200192915050565b6000815160808452611f2b6080850182611eea565b905060208084015185830382870152611f448382611eea565b92505060408401518583036040870152611f5e8382611eea565b925050606084015185830360608701528281518085528385019150838160051b8601018484019350865b82811015611fb657601f19878303018452611fa4828651611eea565b94860194938601939150600101611f88565b5098975050505050505050565b8183823760009101908152919050565b60008251611fe581846020870161223c565b9190910192915050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b8281101561204357603f19888603018452612031858351611f16565b94509285019290850190600101612015565b5092979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156120985781518051855286015163ffffffff1686850152928401929085019060010161206d565b5091979650505050505050565b602081526000611e656020830184611eea565b602081526000611e656020830184611f16565b60208082528251828201528281015160408084015280516060840181905260009291820190839060808601905b808310156121215783516001600160a01b031682529284019260019290920191908401906120f8565b509695505050505050565b600063ffffffff80871683526080602084015261214c6080840187611eea565b6040840195909552929092166060909101525092915050565b6000808335601e1984360301811261217b578283fd5b8301803591506001600160401b03821115612194578283fd5b60200191503681900382131561057d57600080fd5b604051608081016001600160401b03811182821017156121cb576121cb6122d4565b60405290565b604051601f8201601f191681016001600160401b03811182821017156121f9576121f96122d4565b604052919050565b60008219821115612214576122146122be565b500190565b60008282101561222b5761222b6122be565b500390565b600061042b3683611b0f565b60005b8381101561225757818101518382015260200161223f565b838111156113d95750506000910152565b600181811c9082168061227c57607f821691505b6020821081141561229d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122b7576122b76122be565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212203bdbe1548d3d30c2e631540ebc0da3043e3c96a2f50714b97d60dbaffbd46f6c64736f6c63430008040033000000000000000000000000144d97f3b1ec026fbb06383681f33934eb3005120000000000000000000000000000000000000000000000000000000000000064

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637410603011610097578063c0e24ff011610066578063c0e24ff01461025f578063cf4a75be14610272578063df65301f1461027a578063ffa1ad741461029d57600080fd5b806374106030146101ed5780637606f7811461020057806391f32c6514610215578063a9e1f5201461024a57600080fd5b80635621eae7116100d35780635621eae714610170578063582bd8f11461019a578063595c05c1146101ba578063627b876d146101cd57600080fd5b8063221da01f1461010557806327e5d97d14610125578063368458901461013a5780635079f94d1461015d575b600080fd5b6004546040516001600160a01b0390911681526020015b60405180910390f35b610138610133366004611e6c565b6102ce565b005b61014d610148366004611e6c565b61032d565b604051901515815260200161011c565b61013861016b366004611d5c565b610431565b61018361017e366004611dbf565b61052e565b60408051921515835260208301919091520161011c565b6101ad6101a8366004611eb8565b610584565b60405161011c91906120b8565b6101386101c8366004611ca7565b6108cf565b6101e06101db366004611d1d565b610a06565b60405161011c9190612050565b6101386101fb366004611df2565b610b94565b610208610d8f565b60405161011c9190611fef565b61023c7f3837bfa091f1204e612d56f81b7ef5e5000c71738eabe65b6c4cc54239be0e7681565b60405190815260200161011c565b61025261107d565b60405161011c91906120cb565b6101e061026d366004611d1d565b611110565b60055461023c565b61014d610288366004611eb8565b60016020526000908152604090205460ff1681565b6102c1604051806040016040528060058152602001640302e312e360dc1b81525081565b60405161011c91906120a5565b6102d8828261032d565b6103295760405162461bcd60e51b815260206004820152601d60248201527f4d756c74696461746146656564733a20494e56414c49445f50524f4f4600000060448201526064015b60405180910390fd5b5050565b8151608080840151604080517f3837bfa091f1204e612d56f81b7ef5e5000c71738eabe65b6c4cc54239be0e76602082015263ffffffff90941690840152606083015260009182916103a4910160405160208183030381529060405280519060200120856020015186604001518760600151611290565b9050806103b557600091505061042b565b600084600001518460200151856040015186606001516040516020016103de949392919061212c565b60408051601f198184030181528282528051602091820120908301520160405160208183030381529060405280519060200120905061042684600001518660800151836112d4565b925050505b92915050565b6104a27ff41d3b4f231a07c544469cb2026328741f0376353fcc99c3a11153ecd880cde48686604051610465929190611fc3565b6040519081900381206104849291602001918252602082015260400190565b60405160208183030381529060405280519060200120848484611391565b600080306001600160a01b031687876040516104bf929190611fc3565b6000604051808303816000865af19150503d80600081146104fc576040519150601f19603f3d011682016040523d82523d6000602084013e610501565b606091505b509150915081610525578060405162461bcd60e51b815260040161032091906120a5565b50505050505050565b600080600060068585604051610545929190611fc3565b90815260200160405180910390205490508060001461057457600161056a8183612219565b925092505061057d565b60008092509250505b9250929050565b6105af6040518060800160405280606081526020016060815260200160608152602001606081525090565b60055482106106005760405162461bcd60e51b815260206004820181905260248201527f4d756c74696461746146656564733a204d45545249435f4e4f545f464f554e446044820152606401610320565b6005828154811061062157634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160405180608001604052908160008201805461064a90612268565b80601f016020809104026020016040519081016040528092919081815260200182805461067690612268565b80156106c35780601f10610698576101008083540402835291602001916106c3565b820191906000526020600020905b8154815290600101906020018083116106a657829003601f168201915b505050505081526020016001820180546106dc90612268565b80601f016020809104026020016040519081016040528092919081815260200182805461070890612268565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050815260200160028201805461076e90612268565b80601f016020809104026020016040519081016040528092919081815260200182805461079a90612268565b80156107e75780601f106107bc576101008083540402835291602001916107e7565b820191906000526020600020905b8154815290600101906020018083116107ca57829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b828210156108c157838290600052602060002001805461083490612268565b80601f016020809104026020016040519081016040528092919081815260200182805461086090612268565b80156108ad5780601f10610882576101008083540402835291602001916108ad565b820191906000526020600020905b81548152906001019060200180831161089057829003601f168201915b505050505081526020019060010190610815565b505050915250909392505050565b33301461090e5760405162461bcd60e51b815260206004820152600d60248201526c4d503a204e4f5f41434345535360981b6044820152606401610320565b8181804263ffffffff1611156109555760405162461bcd60e51b815260206004820152600c60248201526b4d503a20444541444c494e4560a01b6044820152606401610320565b60008281526001602052604090205460ff16156109a45760405162461bcd60e51b815260206004820152600d60248201526c4d503a204455504c494341544560981b6044820152606401610320565b600082815260016020818152604092839020805460ff1916909217909155815187820281810183019093528781526109fc928b928b92918b918b9182918501908490808284376000920191909152506113df92505050565b5050505050505050565b606081806001600160401b03811115610a2f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a7457816020015b6040805180820190915260008082526020820152815260200190600190039081610a4d5790505b50915060005b81811015610b8c57600080610aba878785818110610aa857634e487b7160e01b600052603260045260246000fd5b905060200281019061017e9190612165565b9150915081610b175760405162461bcd60e51b815260206004820152602360248201527f4d756c74696461746146656564733a20494e56414c49445f4d45545249435f4e604482015262414d4560e81b6064820152608401610320565b604080518082018252600083815260076020908152838220548352848252600881529290205463ffffffff16918101919091528551869085908110610b6c57634e487b7160e01b600052603260045260246000fd5b602002602001018190525050508080610b84906122a3565b915050610a7a565b505092915050565b610baf610ba636849003840184611e4a565b61014883612230565b610bfb5760405162461bcd60e51b815260206004820152601d60248201527f4d756c74696461746146656564733a20494e56414c49445f50524f4f460000006044820152606401610320565b600080610c0e61017e6020850185612165565b9150915081610cc657610cc36040518060800160405280858060200190610c359190612165565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602080820183528482528086019190915281518082018352848152828601528151848152908101909152606090930192919050610cbb565b6060815260200190600190039081610ca65790505b509052611503565b90505b60008181526008602052604090205463ffffffff16610ceb6080850160608601611ed0565b63ffffffff1611610d3e5760405162461bcd60e51b815260206004820152601c60248201527f4d756c74696461746146656564733a205354414c455f555044415445000000006044820152606401610320565b60008181526007602052604090819020908401359055610d646080840160608501611ed0565b600091825260086020526040909120805463ffffffff191663ffffffff909216919091179055505050565b60606005805480602002602001604051908101604052809291908181526020016000905b828210156110745783829060005260206000209060040201604051806080016040529081600082018054610de690612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1290612268565b8015610e5f5780601f10610e3457610100808354040283529160200191610e5f565b820191906000526020600020905b815481529060010190602001808311610e4257829003601f168201915b50505050508152602001600182018054610e7890612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea490612268565b8015610ef15780601f10610ec657610100808354040283529160200191610ef1565b820191906000526020600020905b815481529060010190602001808311610ed457829003601f168201915b50505050508152602001600282018054610f0a90612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3690612268565b8015610f835780601f10610f5857610100808354040283529160200191610f83565b820191906000526020600020905b815481529060010190602001808311610f6657829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561105d578382906000526020600020018054610fd090612268565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffc90612268565b80156110495780601f1061101e57610100808354040283529160200191611049565b820191906000526020600020905b81548152906001019060200180831161102c57829003601f168201915b505050505081526020019060010190610fb1565b505050508152505081526020019060010190610db3565b50505050905090565b6040805180820190915260008152606060208201526002604051806040016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561110257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110e4575b505050505081525050905090565b606081806001600160401b0381111561113957634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561117e57816020015b60408051808201909152600080825260208201528152602001906001900390816111575790505b509150600061118c60055490565b905060005b828110156112875760008686838181106111bb57634e487b7160e01b600052603260045260246000fd5b9050602002013590508281106112135760405162461bcd60e51b815260206004820152601e60248201527f4d756c74696461746146656564733a20494e56414c49445f4d455452494300006044820152606401610320565b604080518082018252600083815260076020908152838220548352848252600881529290205463ffffffff1691810191909152855186908490811061126857634e487b7160e01b600052603260045260246000fd5b602002602001018190525050808061127f906122a3565b915050611191565b50505092915050565b60006112a46004546001600160a01b031690565b6001600160a01b03166112c16112b987611691565b8686866116da565b6001600160a01b03161495945050505050565b600081815b855181101561138657600086828151811061130457634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611346576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611373565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061137e816122a3565b9150506112d9565b509092149392505050565b61139d84848484611290565b6113d95760405162461bcd60e51b815260206004820152600d60248201526c4d503a204e4f5f41434345535360981b6044820152606401610320565b50505050565b6001600160a01b0383166114285760405162461bcd60e51b815260206004820152601060248201526f4d503a205a45524f5f4144445245535360801b6044820152606401610320565b6004546040516001600160a01b038086169216907f74b01e0138e401c89cbbea1e0ec9844af6630c030d5834199ae3766a88b4cf5f90600090a3600060026001018054806020026020016040519081016040528092919081815260200182805480156114bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161149f575b50505050509050600283905581516114dc906003906020850190611883565b5050600480546001600160a01b0319166001600160a01b0394909416939093179092555050565b6000806006836000015160405161151a9190611fd3565b90815260200160405180910390205490508060001461157b5760405162461bcd60e51b815260206004820152601d60248201527f4d756c74696461746146656564733a204d45545249435f4558495354530000006044820152606401610320565b600554915061158b826001612201565b835160405160069161159c91611fd3565b908152604051908190036020908101909120919091556005805460018101825560009190915284518051869360049093027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001926115fe9284929101906118e8565b50602082810151805161161792600185019201906118e8565b50604082015180516116339160028401916020909101906118e8565b506060820151805161164f91600384019160209091019061195c565b505083516040517f3678759a619d50881eef54d84a58228b4cc15adb52cb0458a0f28352846427c1925061168391906120a5565b60405180910390a150919050565b600061042b6000548360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156117575760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610320565b8360ff16601b148061176c57508360ff16601c145b6117c35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610320565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611817573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661187a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610320565b95945050505050565b8280548282559060005260206000209081019282156118d8579160200282015b828111156118d857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906118a3565b506118e49291506119b5565b5090565b8280546118f490612268565b90600052602060002090601f01602090048101928261191657600085556118d8565b82601f1061192f57805160ff19168380011785556118d8565b828001600101855582156118d8579182015b828111156118d8578251825591602001919060010190611941565b8280548282559060005260206000209081019282156119a9579160200282015b828111156119a957825180516119999184916020909101906118e8565b509160200191906001019061197c565b506118e49291506119ca565b5b808211156118e457600081556001016119b6565b808211156118e45760006119de82826119e7565b506001016119ca565b5080546119f390612268565b6000825580601f10611a03575050565b601f016020900490600052602060002090810190611a2191906119b5565b50565b60008083601f840112611a35578182fd5b5081356001600160401b03811115611a4b578182fd5b6020830191508360208260051b850101111561057d57600080fd5b60008083601f840112611a77578182fd5b5081356001600160401b03811115611a8d578182fd5b60208301915083602082850101111561057d57600080fd5b600082601f830112611ab5578081fd5b81356001600160401b03811115611ace57611ace6122d4565b611ae1601f8201601f19166020016121d1565b818152846020838601011115611af5578283fd5b816020850160208301379081016020019190915292915050565b600060808284031215611b20578081fd5b611b286121a9565b905081356001600160401b0380821115611b4157600080fd5b818401915084601f830112611b5557600080fd5b8135602082821115611b6957611b696122d4565b8160051b611b788282016121d1565b8381528281019086840183880185018b1015611b9357600080fd5b600097505b85881015611bb6578035835260019790970196918401918401611b98565b508752505085810135935082841115611bce57600080fd5b611bda87858801611aa5565b818601525050505060408201356040820152611bf860608301611c7d565b606082015292915050565b600060a08284031215611c14578081fd5b60405160a081018181106001600160401b0382111715611c3657611c366122d4565b604052905080611c4583611c7d565b8152611c5360208401611c96565b60208201526040830135604082015260608301356060820152608083013560808201525092915050565b803563ffffffff81168114611c9157600080fd5b919050565b803560ff81168114611c9157600080fd5b60008060008060008060a08789031215611cbf578182fd5b86356001600160a01b0381168114611cd5578283fd5b95506020870135945060408701356001600160401b03811115611cf6578283fd5b611d0289828a01611a24565b979a9699509760608101359660809091013595509350505050565b60008060208385031215611d2f578182fd5b82356001600160401b03811115611d44578283fd5b611d5085828601611a24565b90969095509350505050565b600080600080600060808688031215611d73578081fd5b85356001600160401b03811115611d88578182fd5b611d9488828901611a66565b9096509450611da7905060208701611c96565b94979396509394604081013594506060013592915050565b60008060208385031215611dd1578182fd5b82356001600160401b03811115611de6578283fd5b611d5085828601611a66565b60008082840360c0811215611e05578283fd5b60a0811215611e12578283fd5b5082915060a08301356001600160401b03811115611e2e578182fd5b830160808186031215611e3f578182fd5b809150509250929050565b600060a08284031215611e5b578081fd5b611e658383611c03565b9392505050565b60008060c08385031215611e7e578182fd5b611e888484611c03565b915060a08301356001600160401b03811115611ea2578182fd5b611eae85828601611b0f565b9150509250929050565b600060208284031215611ec9578081fd5b5035919050565b600060208284031215611ee1578081fd5b611e6582611c7d565b60008151808452611f0281602086016020860161223c565b601f01601f19169290920160200192915050565b6000815160808452611f2b6080850182611eea565b905060208084015185830382870152611f448382611eea565b92505060408401518583036040870152611f5e8382611eea565b925050606084015185830360608701528281518085528385019150838160051b8601018484019350865b82811015611fb657601f19878303018452611fa4828651611eea565b94860194938601939150600101611f88565b5098975050505050505050565b8183823760009101908152919050565b60008251611fe581846020870161223c565b9190910192915050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b8281101561204357603f19888603018452612031858351611f16565b94509285019290850190600101612015565b5092979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156120985781518051855286015163ffffffff1686850152928401929085019060010161206d565b5091979650505050505050565b602081526000611e656020830184611eea565b602081526000611e656020830184611f16565b60208082528251828201528281015160408084015280516060840181905260009291820190839060808601905b808310156121215783516001600160a01b031682529284019260019290920191908401906120f8565b509695505050505050565b600063ffffffff80871683526080602084015261214c6080840187611eea565b6040840195909552929092166060909101525092915050565b6000808335601e1984360301811261217b578283fd5b8301803591506001600160401b03821115612194578283fd5b60200191503681900382131561057d57600080fd5b604051608081016001600160401b03811182821017156121cb576121cb6122d4565b60405290565b604051601f8201601f191681016001600160401b03811182821017156121f9576121f96122d4565b604052919050565b60008219821115612214576122146122be565b500190565b60008282101561222b5761222b6122be565b500390565b600061042b3683611b0f565b60005b8381101561225757818101518382015260200161223f565b838111156113d95750506000910152565b600181811c9082168061227c57607f821691505b6020821081141561229d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122b7576122b76122be565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212203bdbe1548d3d30c2e631540ebc0da3043e3c96a2f50714b97d60dbaffbd46f6c64736f6c63430008040033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.