Contract 0xe142fa0eb62557eab51b9e9ed3ec33a301e7cf94

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8089121c99fab0cd9b1ea4bd61a4c2db38cd1cfcd29ad552e4eaf3c5b03b8a150x6080604014628142022-02-09 14:32:00358 days 4 hrs agoLido: Deployer IN  Create: OracleMaster0 MOVR0.007126146
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
OracleMaster

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 10 : OracleMaster.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;

import "Pausable.sol";
import "Clones.sol";

import "IOracle.sol";
import "ILido.sol";
import "ILedger.sol";
import "IAuthManager.sol";

import "LedgerUtils.sol";

contract OracleMaster is Pausable {
    using Clones for address;
    using LedgerUtils for Types.OracleData;

    event MemberAdded(address member);
    event MemberRemoved(address member);
    event QuorumChanged(uint8 QUORUM);

    // current era id
    uint64 public eraId;

    // Oracle members
    address[] public members;

    // ledger -> oracle pairing
    mapping(address => address) private oracleForLedger;


    // address of oracle clone template contract
    address public ORACLE_CLONE;

    // Lido smart contract
    address public LIDO;

    // Quorum threshold
    uint8 public QUORUM;

    // Relay era id on updating
    uint64 public ANCHOR_ERA_ID;

    // Relay timestamp on updating
    uint64 public ANCHOR_TIMESTAMP;

    // Relay seconds per era
    uint64 public SECONDS_PER_ERA;

    /// Maximum number of oracle committee members
    uint256 public constant MAX_MEMBERS = 255;

    // Missing member index
    uint256 internal constant MEMBER_NOT_FOUND = type(uint256).max;

    // Spec manager role
    bytes32 internal constant ROLE_SPEC_MANAGER = keccak256("ROLE_SPEC_MANAGER");

    // General oracle manager role
    bytes32 internal constant ROLE_PAUSE_MANAGER = keccak256("ROLE_PAUSE_MANAGER");

    // Oracle members manager role
    bytes32 internal constant ROLE_ORACLE_MEMBERS_MANAGER = keccak256("ROLE_ORACLE_MEMBERS_MANAGER");

    // Oracle members manager role
    bytes32 internal constant ROLE_ORACLE_QUORUM_MANAGER = keccak256("ROLE_ORACLE_QUORUM_MANAGER");

    // Allows function calls only from member with specific role
    modifier auth(bytes32 role) {
        require(IAuthManager(ILido(LIDO).AUTH_MANAGER()).has(role, msg.sender), "OM: UNAUTHOROZED");
        _;
    }

    // Allows function calls only from LIDO
    modifier onlyLido() {
        require(msg.sender == LIDO, "OM: CALLER_NOT_LIDO");
        _;
    }


    /**
    * @notice Initialize oracle master contract, allowed to call only once
    * @param _oracleClone oracle clone contract address
    * @param _quorum inital quorum threshold
    */
    function initialize(
        address _oracleClone,
        uint8 _quorum
    ) external {
        require(ORACLE_CLONE == address(0), "OM: ALREADY_INITIALIZED");
        require(_oracleClone != address(0), "OM: INCORRECT_CLONE_ADDRESS");
        require(_quorum > 0 && _quorum < MAX_MEMBERS, "OM: INCORRECT_QUORUM");

        ORACLE_CLONE = _oracleClone;
        QUORUM = _quorum;
    }

    /**
    * @notice Set lido contract address, allowed to only once
    * @param _lido lido contract address
    */
    function setLido(address _lido) external {
        require(LIDO == address(0), "OM: LIDO_ALREADY_DEFINED");
        require(_lido != address(0), "OM: INCORRECT_LIDO_ADDRESS");

        LIDO = _lido;
    }

    /**
    * @notice Set the number of exactly the same reports needed to finalize the era
              allowed to call only by ROLE_ORACLE_QUORUM_MANAGER
    * @param _quorum new value of quorum threshold
    */
    function setQuorum(uint8 _quorum) external auth(ROLE_ORACLE_QUORUM_MANAGER) {
        require(_quorum > 0 && _quorum < MAX_MEMBERS, "OM: QUORUM_WONT_BE_MADE");
        uint8 oldQuorum = QUORUM;
        QUORUM = _quorum;

        // If the QUORUM value lowered, check existing reports whether it is time to push
        if (oldQuorum > _quorum) {
            address[] memory ledgers = ILido(LIDO).getLedgerAddresses();
            uint256 _length = ledgers.length;
            for (uint256 i = 0; i < _length; ++i) {
                address oracle = oracleForLedger[ledgers[i]];
                if (oracle != address(0)) {
                    IOracle(oracle).softenQuorum(_quorum, eraId);
                }
            }
        }
        emit QuorumChanged(_quorum);
    }

    /**
    * @notice Return oracle contract for the given ledger
    * @param  _ledger ledger contract address
    * @return linked oracle address
    */
    function getOracle(address _ledger) external view returns (address) {
        return oracleForLedger[_ledger];
    }

    /**
    * @notice Return current Era according to relay chain spec
    * @return current era id
    */
    function getCurrentEraId() public view returns (uint64) {
        return _getCurrentEraId();
    }

    /**
    * @notice Return relay chain stash account addresses. This function used in oracle service
    * @return Array of bytes32 relaychain stash accounts
    */
    function getStashAccounts() external view returns (bytes32[] memory) {
        return ILido(LIDO).getStashAccounts();
    }

    /**
    * @notice Return last reported era and oracle is already reported indicator
    * @param _oracleMember - oracle member address
    * @param _stash - stash account id
    * @return lastEra - last reported era
    * @return isReported - true if oracle member already reported for given stash, else false
    */
    function isReportedLastEra(address _oracleMember, bytes32 _stash)
        external
        view
        returns (
            uint64 lastEra,
            bool isReported
        )
    {
        uint64 lastEra = eraId;

        uint256 memberIdx = _getMemberId(_oracleMember);
        if (memberIdx == MEMBER_NOT_FOUND) {
            return (lastEra, false);
        }

        address ledger = ILido(LIDO).findLedger(_stash);
        if (ledger == address(0)) {
            return (lastEra, false);
        }

        return (lastEra, IOracle(oracleForLedger[ledger]).isReported(memberIdx));
    }

    /**
    * @notice Stop pool routine operations (reportRelay), allowed to call only by ROLE_PAUSE_MANAGER
    */
    function pause() external auth(ROLE_PAUSE_MANAGER) {
        _pause();
    }

    /**
    * @notice Resume pool routine operations (reportRelay), allowed to call only by ROLE_PAUSE_MANAGER
    */
    function resume() external auth(ROLE_PAUSE_MANAGER) {
        _unpause();
    }

    /**
    * @notice Add new member to the oracle member committee list, allowed to call only by ROLE_ORACLE_MEMBERS_MANAGER
    * @param _member proposed member address
    */
    function addOracleMember(address _member) external auth(ROLE_ORACLE_MEMBERS_MANAGER) {
        require(_member != address(0), "OM: BAD_ARGUMENT");
        require(_getMemberId(_member) == MEMBER_NOT_FOUND, "OM: MEMBER_EXISTS");
        require(members.length < MAX_MEMBERS - 1, "OM: MEMBERS_TOO_MANY");

        members.push(_member);
        emit MemberAdded(_member);
    }

    /**
    * @notice Remove `_member` from the oracle member committee list, allowed to call only by ROLE_ORACLE_MEMBERS_MANAGER
    */
    function removeOracleMember(address _member) external auth(ROLE_ORACLE_MEMBERS_MANAGER) {
        uint256 index = _getMemberId(_member);
        require(index != MEMBER_NOT_FOUND, "OM: MEMBER_NOT_FOUND");
        uint256 last = members.length - 1;
        if (index != last) members[index] = members[last];
        members.pop();
        emit MemberRemoved(_member);

        // delete the data for the last eraId, let remained oracles report it again
        _clearReporting();
    }

    /**
    * @notice Add ledger to oracle set, allowed to call only by lido contract
    * @param _ledger Ledger contract
    */
    function addLedger(address _ledger) external onlyLido {
        require(ORACLE_CLONE != address(0), "OM: ORACLE_CLONE_UNINITIALIZED");
        IOracle newOracle = IOracle(ORACLE_CLONE.cloneDeterministic(bytes32(uint256(uint160(_ledger)) << 96)));
        newOracle.initialize(address(this), _ledger);
        oracleForLedger[_ledger] = address(newOracle);
    }

    /**
    * @notice Remove ledger from oracle set, allowed to call only by lido contract
    * @param _ledger ledger contract
    */
    function removeLedger(address _ledger) external onlyLido {
        oracleForLedger[_ledger] = address(0);
    }

    /**
    * @notice Accept oracle committee member reports from the relay side
    * @param _eraId relaychain era
    * @param _report relaychain data report
    */
    function reportRelay(uint64 _eraId, Types.OracleData calldata _report) external whenNotPaused {
        require(_report.isConsistent(), "OM: INCORRECT_REPORT");

        uint256 memberIndex = _getMemberId(msg.sender);
        require(memberIndex != MEMBER_NOT_FOUND, "OM: MEMBER_NOT_FOUND");

        address ledger = ILido(LIDO).findLedger(_report.stashAccount);
        address oracle = oracleForLedger[ledger];
        require(oracle != address(0), "OM: ORACLE_FOR_LEDGER_NOT_FOUND");
        require(_eraId >= eraId, "OM: ERA_TOO_OLD");

        // new era
        if (_eraId > eraId) {
            require(_eraId <= _getCurrentEraId(), "OM: UNEXPECTED_NEW_ERA");
            eraId = _eraId;
            _clearReporting();
            ILido(LIDO).flushStakes();
        }

        IOracle(oracle).reportRelay(memberIndex, QUORUM, _eraId, _report);
    }

    /**
    * @notice Set parameters from relay chain for accurately calculation of current era id
    * @param _anchorEraId - current relay chain era id
    * @param _anchorTimestamp - current relay chain timestamp
    * @param _secondsPerEra - current relay chain era duration in seconds
    */
    function setAnchorEra(uint64 _anchorEraId, uint64 _anchorTimestamp, uint64 _secondsPerEra) external auth(ROLE_SPEC_MANAGER) {
        require(_secondsPerEra > 0, "OM: BAD_SECONDS_PER_ERA");
        require(uint64(block.timestamp) >= _anchorTimestamp, "OM: BAD_TIMESTAMP");
        uint64 newEra = _anchorEraId + (uint64(block.timestamp) - _anchorTimestamp) / _secondsPerEra;
        require(newEra >= eraId, "OM: ERA_COLLISION");

        ANCHOR_ERA_ID = _anchorEraId;
        ANCHOR_TIMESTAMP = _anchorTimestamp;
        SECONDS_PER_ERA = _secondsPerEra;
    }

    /**
    * @notice Return oracle instance index in the member array
    * @param _member member address
    * @return member index
    */
    function _getMemberId(address _member) internal view returns (uint256) {
        uint256 length = members.length;
        for (uint256 i = 0; i < length; ++i) {
            if (members[i] == _member) {
                return i;
            }
        }
        return MEMBER_NOT_FOUND;
    }

    /**
    * @notice Calculate current expected era id
    * @dev Calculation based on relaychain genesis timestamp and era duratation
    * @return current era id
    */
    function _getCurrentEraId() internal view returns (uint64) {
        return ANCHOR_ERA_ID + (uint64(block.timestamp) - ANCHOR_TIMESTAMP) / SECONDS_PER_ERA;
    }

    /**
    * @notice Delete interim data for current Era, free storage memory for each oracle
    */
    function _clearReporting() internal {
        address[] memory ledgers = ILido(LIDO).getLedgerAddresses();
        uint256 _length = ledgers.length;
        for (uint256 i = 0; i < _length; ++i) {
            address oracle = oracleForLedger[ledgers[i]];
            if (oracle != address(0)) {
                IOracle(oracle).clearReporting();
            }
        }
    }
}

File 2 of 10 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 3 of 10 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 10 : Clones.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt, address deployer) internal pure returns (address predicted) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

File 5 of 10 : IOracle.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "Types.sol";

interface IOracle {
    function initialize(address oracleMaster, address ledger) external;

    function reportRelay(uint256 index, uint256 quorum, uint64 eraId, Types.OracleData calldata staking) external;

    function softenQuorum(uint8 quorum, uint64 _eraId) external;

    function clearReporting() external;

    function isReported(uint256 index) external view returns (bool);
}

File 6 of 10 : Types.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface Types {
    struct Fee{
        uint16 total;
        uint16 operators;
        uint16 developers;
        uint16 treasury;
    }

    struct Stash {
        bytes32 stashAccount;
        uint64  eraId;
    }

    enum LedgerStatus {
        // bonded but not participate in staking
        Idle,
        // participate as nominator
        Nominator,
        // participate as validator
        Validator,
        // not bonded not participate in staking
        None
    }

    struct UnlockingChunk {
        uint128 balance;
        uint64 era;
    }

    struct OracleData {
        bytes32 stashAccount;
        bytes32 controllerAccount;
        LedgerStatus stakeStatus;
        // active part of stash balance
        uint128 activeBalance;
        // locked for stake stash balance.
        uint128 totalBalance;
        // totalBalance = activeBalance + sum(unlocked.balance)
        UnlockingChunk[] unlocking;
        uint32[] claimedRewards;
        // stash account balance. It includes locked (totalBalance) balance assigned
        // to a controller.
        uint128 stashBalance;
        // slashing spans for ledger
        uint32 slashingSpans;
    }

    struct RelaySpec {
        uint16 maxValidatorsPerLedger;
        uint128 minNominatorBalance;
        uint128 ledgerMinimumActiveBalance;
        uint256 maxUnlockingChunks;
    }
}

File 7 of 10 : ILido.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "Types.sol";

interface ILido {
    function MAX_ALLOWABLE_DIFFERENCE() external view returns(uint128);

    function developers() external view returns(address);

    function deposit(uint256 amount) external returns (uint256);
    
    function distributeRewards(uint256 totalRewards, uint256 ledgerBalance) external;

    function distributeLosses(uint256 totalLosses, uint256 ledgerBalance) external;

    function getStashAccounts() external view returns (bytes32[] memory);

    function getLedgerAddresses() external view returns (address[] memory);

    function ledgerStake(address ledger) external view returns (uint256);

    function ledgerShares(address ledger) external view returns (uint256);

    function avaliableForStake() external view returns (uint256);

    function transferFromLedger(uint256 amount) external;

    function transferToLedger(uint256 amount) external;

    function flushStakes() external;

    function findLedger(bytes32 stash) external view returns (address);

    function AUTH_MANAGER() external returns(address);

    function ORACLE_MASTER() external view returns (address);

    function getPooledKSMByShares(uint256 sharesAmount) external view returns (uint256);

    function getSharesByPooledKSM(uint256 amount) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

File 8 of 10 : ILedger.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "Types.sol";

interface ILedger {
    function initialize(
        bytes32 _stashAccount,
        bytes32 controllerAccount,
        address vKSM,
        address controller,
        uint128 minNominatorBalance,
        address lido,
        uint128 _minimumBalance,
        uint256 _maxUnlockingChunks
    ) external;

    function pushData(uint64 eraId, Types.OracleData calldata staking) external;

    function nominate(bytes32[] calldata validators) external;

    function status() external view returns (Types.LedgerStatus);

    function isEmpty() external view returns (bool);

    function stashAccount() external view returns (bytes32);

    function totalBalance() external view returns (uint128);

    function setRelaySpecs(uint128 minNominatorBalance, uint128 minimumBalance, uint256 _maxUnlockingChunks) external;

    function cachedTotalBalance() external view returns (uint128);
}

File 9 of 10 : IAuthManager.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IAuthManager {
    function has(bytes32 role, address member) external view returns (bool);

    function add(bytes32 role, address member) external;

    function remove(bytes32 role, address member) external;
}

File 10 of 10 : LedgerUtils.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "Types.sol";


library LedgerUtils {
    /// @notice Return unlocking and withdrawable balances
    function getTotalUnlocking(Types.OracleData memory report, uint64 _eraId) internal pure returns (uint128, uint128) {
        uint128 _total = 0;
        uint128 _withdrawble = 0;
        for (uint i = 0; i < report.unlocking.length; i++) {
            _total += report.unlocking[i].balance;
            if (report.unlocking[i].era <= _eraId) {
                _withdrawble += report.unlocking[i].balance;
            }
        }
        return (_total, _withdrawble);
    }
    /// @notice Return stash balance that can be freely transfer or allocated for stake
    function getFreeBalance(Types.OracleData memory report) internal pure returns (uint128) {
        return report.stashBalance - report.totalBalance;
    }

    /// @notice Return true if report is consistent
    function isConsistent(Types.OracleData memory report) internal pure returns (bool) {
        (uint128 _total,) = getTotalUnlocking(report, 0);
        return report.unlocking.length < type(uint8).max
            && report.totalBalance == (report.activeBalance + _total)
            && report.stashBalance >= report.totalBalance;
    }
}

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

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"member","type":"address"}],"name":"MemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"member","type":"address"}],"name":"MemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"QUORUM","type":"uint8"}],"name":"QuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ANCHOR_ERA_ID","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ANCHOR_TIMESTAMP","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MEMBERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_CLONE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUORUM","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_ERA","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ledger","type":"address"}],"name":"addLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"addOracleMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eraId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEraId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ledger","type":"address"}],"name":"getOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStashAccounts","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleClone","type":"address"},{"internalType":"uint8","name":"_quorum","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleMember","type":"address"},{"internalType":"bytes32","name":"_stash","type":"bytes32"}],"name":"isReportedLastEra","outputs":[{"internalType":"uint64","name":"lastEra","type":"uint64"},{"internalType":"bool","name":"isReported","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"members","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ledger","type":"address"}],"name":"removeLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"removeOracleMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_eraId","type":"uint64"},{"components":[{"internalType":"bytes32","name":"stashAccount","type":"bytes32"},{"internalType":"bytes32","name":"controllerAccount","type":"bytes32"},{"internalType":"enum Types.LedgerStatus","name":"stakeStatus","type":"uint8"},{"internalType":"uint128","name":"activeBalance","type":"uint128"},{"internalType":"uint128","name":"totalBalance","type":"uint128"},{"components":[{"internalType":"uint128","name":"balance","type":"uint128"},{"internalType":"uint64","name":"era","type":"uint64"}],"internalType":"struct Types.UnlockingChunk[]","name":"unlocking","type":"tuple[]"},{"internalType":"uint32[]","name":"claimedRewards","type":"uint32[]"},{"internalType":"uint128","name":"stashBalance","type":"uint128"},{"internalType":"uint32","name":"slashingSpans","type":"uint32"}],"internalType":"struct Types.OracleData","name":"_report","type":"tuple"}],"name":"reportRelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_anchorEraId","type":"uint64"},{"internalType":"uint64","name":"_anchorTimestamp","type":"uint64"},{"internalType":"uint64","name":"_secondsPerEra","type":"uint64"}],"name":"setAnchorEra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lido","type":"address"}],"name":"setLido","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quorum","type":"uint8"}],"name":"setQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506000805460ff19169055612abb8061002a6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806379292235116100de5780639f04e9ac11610097578063cbe48ee811610071578063cbe48ee814610380578063d381787a14610393578063ea0e35b1146103a6578063f98fae81146103bc57600080fd5b80639f04e9ac14610340578063ae2df7c014610353578063b164e4371461036d57600080fd5b806379292235146102d25780637d4a3d43146102e55780637d774e31146102ff5780638456cb59146103125780638b21f1701461031a578063943b24b21461032d57600080fd5b80633f109d23116101305780633f109d2314610239578063559ccc55146102515780635c975abb146102645780635daf08ca1461027a5780635e6f8df31461028d5780636dcab78f146102bf57600080fd5b8063046f7da21461017857806310d3d22e146101825780631d55fde4146101cb57806329d009f2146101e05780632e80d9b61461020057806333bc709014610226575b600080fd5b6101806103cf565b005b6101ae6101903660046120fe565b6001600160a01b039081166000908152600260205260409020541690565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d3610528565b6040516101c2919061211b565b6101e86105b9565b6040516001600160401b0390911681526020016101c2565b60045461021490600160a01b900460ff1681565b60405160ff90911681526020016101c2565b6003546101ae906001600160a01b031681565b6000546101e89061010090046001600160401b031681565b6005546101e8906001600160401b031681565b60005460ff1660405190151581526020016101c2565b6101ae61028836600461215f565b6105c3565b6102a061029b366004612178565b6105ed565b604080516001600160401b0390931683529015156020830152016101c2565b6101806102cd3660046121ba565b61075f565b6101806102e03660046121ec565b610ad8565b6005546101e890600160401b90046001600160401b031681565b61018061030d3660046120fe565b610e8a565b610180610f5b565b6004546101ae906001600160a01b031681565b61018061033b366004612241565b6110a8565b61018061034e3660046120fe565b6111f2565b6004546101e890600160a81b90046001600160401b031681565b61018061037b3660046120fe565b611359565b61018061038e366004612276565b61160b565b6101806103a13660046120fe565b6118d4565b6103ae60ff81565b6040519081526020016101c2565b6101806103ca3660046120fe565b61194b565b7fd76e3374742c17bd14ffaf46cd349ec292baf7d8425512fa8fe132557a4c967b600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561044057600080fd5b505af1158015610454573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047891906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b1580156104c057600080fd5b505afa1580156104d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f891906122d6565b61051d5760405162461bcd60e51b8152600401610514906122f8565b60405180910390fd5b610525611bed565b50565b6060600460009054906101000a90046001600160a01b03166001600160a01b0316631d55fde46040518163ffffffff1660e01b815260040160006040518083038186803b15801561057857600080fd5b505afa15801561058c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b491908101906123d6565b905090565b60006105b4611c80565b600181815481106105d357600080fd5b6000918252602090912001546001600160a01b0316905081565b60008054819061010090046001600160401b03168161060b86611cca565b90506000198114156106235750915060009050610758565b60048054604051630900d66f60e21b81529182018790526000916001600160a01b039091169063240359bc9060240160206040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a291906122b9565b90506001600160a01b0381166106c15782600094509450505050610758565b6001600160a01b03818116600090815260026020526040908190205490516389b8036160e01b815260048101859052859291909116906389b803619060240160206040518083038186803b15801561071857600080fd5b505afa15801561072c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075091906122d6565b945094505050505b9250929050565b7f8ac38a2a3c56dddd46cb8bc53ef71a94590a3862aefd3143ed3126454af63731600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107d057600080fd5b505af11580156107e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080891906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b15801561085057600080fd5b505afa158015610864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088891906122d6565b6108a45760405162461bcd60e51b8152600401610514906122f8565b60008260ff161180156108ba575060ff8260ff16105b6109065760405162461bcd60e51b815260206004820152601760248201527f4f4d3a2051554f52554d5f574f4e545f42455f4d4144450000000000000000006044820152606401610514565b6004805460ff848116600160a01b81810260ff60a01b19851617909455929091041690811115610a9d576000600460009054906101000a90046001600160a01b03166001600160a01b031663df1979566040518163ffffffff1660e01b815260040160006040518083038186803b15801561098057600080fd5b505afa158015610994573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109bc919081019061246b565b805190915060005b81811015610a99576000600260008584815181106109e4576109e46124f9565b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541690508015610a885760005460405163cb35cf3160e01b815260ff891660048201526101009091046001600160401b031660248201526001600160a01b0382169063cb35cf3190604401600060405180830381600087803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050505b50610a9281612525565b90506109c4565b5050505b60405160ff841681527fd6ecd940f5784ceceeeb048268900f819851986dbe41c49f6e754b988868df879060200160405180910390a1505050565b60005460ff1615610b1e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610514565b610b2f610b2a82612674565b611d34565b610b725760405162461bcd60e51b815260206004820152601460248201527313d34e88125390d3d4949150d517d4915413d49560621b6044820152606401610514565b6000610b7d33611cca565b9050600019811415610bc85760405162461bcd60e51b815260206004820152601460248201527313d34e8813515350915497d393d517d193d5539160621b6044820152606401610514565b60048054604051630900d66f60e21b81526000926001600160a01b039092169163240359bc91610bff918735910190815260200190565b60206040518083038186803b158015610c1757600080fd5b505afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f91906122b9565b6001600160a01b038082166000908152600260205260409020549192501680610cba5760405162461bcd60e51b815260206004820152601f60248201527f4f4d3a204f5241434c455f464f525f4c45444745525f4e4f545f464f554e44006044820152606401610514565b6000546001600160401b0361010090910481169086161015610d105760405162461bcd60e51b815260206004820152600f60248201526e13d34e8811549057d513d3d7d3d311608a1b6044820152606401610514565b6000546001600160401b0361010090910481169086161115610e1357610d34611c80565b6001600160401b0316856001600160401b03161115610d8e5760405162461bcd60e51b81526020600482015260166024820152754f4d3a20554e45585045435445445f4e45575f45524160501b6044820152606401610514565b6000805468ffffffffffffffff0019166101006001600160401b03881602179055610db7611dad565b600480546040805163fa597e0760e01b815290516001600160a01b039092169263fa597e0792828201926000929082900301818387803b158015610dfa57600080fd5b505af1158015610e0e573d6000803e3d6000fd5b505050505b600480546040516314541bb560e21b81526001600160a01b038416926351506ed492610e51928892600160a01b90920460ff16918b918b9101612898565b600060405180830381600087803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b031615610ee35760405162461bcd60e51b815260206004820152601860248201527f4f4d3a204c49444f5f414c52454144595f444546494e454400000000000000006044820152606401610514565b6001600160a01b038116610f395760405162461bcd60e51b815260206004820152601a60248201527f4f4d3a20494e434f52524543545f4c49444f5f414444524553530000000000006044820152606401610514565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b7fd76e3374742c17bd14ffaf46cd349ec292baf7d8425512fa8fe132557a4c967b600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fcc57600080fd5b505af1158015610fe0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100491906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b15801561104c57600080fd5b505afa158015611060573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108491906122d6565b6110a05760405162461bcd60e51b8152600401610514906122f8565b610525611efb565b6003546001600160a01b0316156111015760405162461bcd60e51b815260206004820152601760248201527f4f4d3a20414c52454144595f494e495449414c495a45440000000000000000006044820152606401610514565b6001600160a01b0382166111575760405162461bcd60e51b815260206004820152601b60248201527f4f4d3a20494e434f52524543545f434c4f4e455f4144445245535300000000006044820152606401610514565b60008160ff1611801561116d575060ff8160ff16105b6111b05760405162461bcd60e51b81526020600482015260146024820152734f4d3a20494e434f52524543545f51554f52554d60601b6044820152606401610514565b600380546001600160a01b039093166001600160a01b0319909316929092179091556004805460ff909216600160a01b0260ff60a01b19909216919091179055565b6004546001600160a01b031633146112425760405162461bcd60e51b81526020600482015260136024820152724f4d3a2043414c4c45525f4e4f545f4c49444f60681b6044820152606401610514565b6003546001600160a01b031661129a5760405162461bcd60e51b815260206004820152601e60248201527f4f4d3a204f5241434c455f434c4f4e455f554e494e495449414c495a454400006044820152606401610514565b6003546000906112c6906001600160a01b03166bffffffffffffffffffffffff19606085901b16611f76565b60405163485cc95560e01b81523060048201526001600160a01b0384811660248301529192509082169063485cc95590604401600060405180830381600087803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b505050506001600160a01b03918216600090815260026020526040902080546001600160a01b03191691909216179055565b7f390fb325ad2241104ec9502c1fe8ca89f34a50b811d77948772f75454c563ceb600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113ca57600080fd5b505af11580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b15801561144a57600080fd5b505afa15801561145e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148291906122d6565b61149e5760405162461bcd60e51b8152600401610514906122f8565b6001600160a01b0382166114e75760405162461bcd60e51b815260206004820152601060248201526f13d34e8810905117d05491d55351539560821b6044820152606401610514565b6000196114f383611cca565b146115345760405162461bcd60e51b81526020600482015260116024820152704f4d3a204d454d4245525f45584953545360781b6044820152606401610514565b611540600160ff6129af565b600154106115875760405162461bcd60e51b81526020600482015260146024820152734f4d3a204d454d424552535f544f4f5f4d414e5960601b6044820152606401610514565b6001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384169081179091556040519081527fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd9149060200160405180910390a15050565b7f2c204f3ef59cc164f843cf6919920470e37721ba425db7893d02e60cfd0bafdc600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b491906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b1580156116fc57600080fd5b505afa158015611710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173491906122d6565b6117505760405162461bcd60e51b8152600401610514906122f8565b6000826001600160401b0316116117a95760405162461bcd60e51b815260206004820152601760248201527f4f4d3a204241445f5345434f4e44535f5045525f4552410000000000000000006044820152606401610514565b826001600160401b0316426001600160401b031610156117ff5760405162461bcd60e51b815260206004820152601160248201527004f4d3a204241445f54494d455354414d5607c1b6044820152606401610514565b60008261180c85426129c6565b61181691906129ee565b6118209086612a22565b6000549091506001600160401b036101009091048116908216101561187b5760405162461bcd60e51b815260206004820152601160248201527027a69d1022a920afa1a7a62624a9a4a7a760791b6044820152606401610514565b5050600480546001600160401b03948516600160a81b0267ffffffffffffffff60a81b1990911617905560058054918416600160401b026fffffffffffffffffffffffffffffffff199092169290931691909117179055565b6004546001600160a01b031633146119245760405162461bcd60e51b81526020600482015260136024820152724f4d3a2043414c4c45525f4e4f545f4c49444f60681b6044820152606401610514565b6001600160a01b0316600090815260026020526040902080546001600160a01b0319169055565b7f390fb325ad2241104ec9502c1fe8ca89f34a50b811d77948772f75454c563ceb600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156119bc57600080fd5b505af11580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f491906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b158015611a3c57600080fd5b505afa158015611a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7491906122d6565b611a905760405162461bcd60e51b8152600401610514906122f8565b6000611a9b83611cca565b9050600019811415611ae65760405162461bcd60e51b815260206004820152601460248201527313d34e8813515350915497d393d517d193d5539160621b6044820152606401610514565b60018054600091611af6916129af565b9050808214611b6d5760018181548110611b1257611b126124f9565b600091825260209091200154600180546001600160a01b039092169184908110611b3e57611b3e6124f9565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6001805480611b7e57611b7e612a4d565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040516001600160a01b03861681527f6e76fb4c77256006d9c38ec7d82b45a8c8f3c27b1d6766fffc42dfb8de684492910160405180910390a1611be7611dad565b50505050565b60005460ff16611c365760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610514565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6005546000906001600160401b03600160401b8204811691611ca39116426129c6565b611cad91906129ee565b6004546105b49190600160a81b90046001600160401b0316612a22565b600154600090815b81811015611d2957836001600160a01b031660018281548110611cf757611cf76124f9565b6000918252602090912001546001600160a01b03161415611d19579392505050565b611d2281612525565b9050611cd2565b506000199392505050565b600080611d4283600061201c565b50905060ff80168360a0015151108015611d805750808360600151611d679190612a63565b6001600160801b031683608001516001600160801b0316145b8015611da6575082608001516001600160801b03168360e001516001600160801b031610155b9392505050565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663df1979566040518163ffffffff1660e01b815260040160006040518083038186803b158015611dfd57600080fd5b505afa158015611e11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e39919081019061246b565b805190915060005b81811015611ef657600060026000858481518110611e6157611e616124f9565b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541690508015611ee557806001600160a01b031663b75b518c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050505b50611eef81612525565b9050611e41565b505050565b60005460ff1615611f415760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610514565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c633390565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528360601b60148201526e5af43d82803e903d91602b57fd5bf360881b6028820152826037826000f59150506001600160a01b0381166120165760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152606401610514565b92915050565b60008060008060005b8660a00151518110156120dd578660a001518181518110612048576120486124f9565b6020026020010151600001518361205f9190612a63565b9250856001600160401b03168760a001518281518110612081576120816124f9565b6020026020010151602001516001600160401b0316116120cb578660a0015181815181106120b1576120b16124f9565b602002602001015160000151826120c89190612a63565b91505b806120d581612525565b915050612025565b50909590945092505050565b6001600160a01b038116811461052557600080fd5b60006020828403121561211057600080fd5b8135611da6816120e9565b6020808252825182820181905260009190848201906040850190845b8181101561215357835183529284019291840191600101612137565b50909695505050505050565b60006020828403121561217157600080fd5b5035919050565b6000806040838503121561218b57600080fd5b8235612196816120e9565b946020939093013593505050565b803560ff811681146121b557600080fd5b919050565b6000602082840312156121cc57600080fd5b611da6826121a4565b80356001600160401b03811681146121b557600080fd5b600080604083850312156121ff57600080fd5b612208836121d5565b915060208301356001600160401b0381111561222357600080fd5b8301610120818603121561223657600080fd5b809150509250929050565b6000806040838503121561225457600080fd5b823561225f816120e9565b915061226d602084016121a4565b90509250929050565b60008060006060848603121561228b57600080fd5b612294846121d5565b92506122a2602085016121d5565b91506122b0604085016121d5565b90509250925092565b6000602082840312156122cb57600080fd5b8151611da6816120e9565b6000602082840312156122e857600080fd5b81518015158114611da657600080fd5b60208082526010908201526f13d34e8815539055551213d493d6915160821b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561235a5761235a612322565b60405290565b60405161012081016001600160401b038111828210171561235a5761235a612322565b604051601f8201601f191681016001600160401b03811182821017156123ab576123ab612322565b604052919050565b60006001600160401b038211156123cc576123cc612322565b5060051b60200190565b600060208083850312156123e957600080fd5b82516001600160401b038111156123ff57600080fd5b8301601f8101851361241057600080fd5b805161242361241e826123b3565b612383565b81815260059190911b8201830190838101908783111561244257600080fd5b928401925b8284101561246057835182529284019290840190612447565b979650505050505050565b6000602080838503121561247e57600080fd5b82516001600160401b0381111561249457600080fd5b8301601f810185136124a557600080fd5b80516124b361241e826123b3565b81815260059190911b820183019083810190878311156124d257600080fd5b928401925b828410156124605783516124ea816120e9565b825292840192908401906124d7565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156125395761253961250f565b5060010190565b8035600481106121b557600080fd5b80356001600160801b03811681146121b557600080fd5b600082601f83011261257757600080fd5b8135602061258761241e836123b3565b82815260069290921b840181019181810190868411156125a657600080fd5b8286015b848110156125f357604081890312156125c35760008081fd5b6125cb612338565b6125d48261254f565b81526125e18583016121d5565b818601528352918301916040016125aa565b509695505050505050565b803563ffffffff811681146121b557600080fd5b600082601f83011261262357600080fd5b8135602061263361241e836123b3565b82815260059290921b8401810191818101908684111561265257600080fd5b8286015b848110156125f357612667816125fe565b8352918301918301612656565b6000610120823603121561268757600080fd5b61268f612360565b82358152602083013560208201526126a960408401612540565b60408201526126ba6060840161254f565b60608201526126cb6080840161254f565b608082015260a08301356001600160401b03808211156126ea57600080fd5b6126f636838701612566565b60a084015260c085013591508082111561270f57600080fd5b5061271c36828601612612565b60c08301525061272e60e0840161254f565b60e08201526101006127418185016125fe565b9082015292915050565b6004811061276957634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e1984360301811261278457600080fd5b83016020810192503590506001600160401b038111156127a357600080fd5b8060061b360383131561075857600080fd5b8183526000602080850194508260005b8581101561280c576001600160801b036127de8361254f565b1687526001600160401b036127f48484016121d5565b168784015260409687019691909101906001016127c5565b509495945050505050565b6000808335601e1984360301811261282e57600080fd5b83016020810192503590506001600160401b0381111561284d57600080fd5b8060051b360383131561075857600080fd5b8183526000602080850194508260005b8581101561280c5763ffffffff612885836125fe565b168752958201959082019060010161286f565b84815260ff841660208201526001600160401b03831660408201526080606082015281356080820152602082013560a082015260006128d960408401612540565b6128e660c084018261274b565b506128f36060840161254f565b6001600160801b031660e083015261290d6080840161254f565b610100612924818501836001600160801b03169052565b61293160a086018661276d565b6101208681015292506129496101a0860184836127b5565b92505061295960c0860186612817565b858403607f190161014087015261297184828461285f565b9350505061298160e0860161254f565b6001600160801b031661016085015261299b8582016125fe565b63ffffffff811661018086015290506125f3565b6000828210156129c1576129c161250f565b500390565b60006001600160401b03838116908316818110156129e6576129e661250f565b039392505050565b60006001600160401b0380841680612a1657634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b60006001600160401b03808316818516808303821115612a4457612a4461250f565b01949350505050565b634e487b7160e01b600052603160045260246000fd5b60006001600160801b03808316818516808303821115612a4457612a4461250f56fea26469706673582212208228dd91d287cc79538058bfbc72f5819d3e1daf90249df7c9756da506dfaaba64736f6c63430008090033

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.