Contract Overview
Balance:
0 MOVR
MOVR Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x8089121c99fab0cd9b1ea4bd61a4c2db38cd1cfcd29ad552e4eaf3c5b03b8a15 | 0x60806040 | 1462814 | 358 days 4 hrs ago | Lido: Deployer | IN | Create: OracleMaster | 0 MOVR | 0.007126146 |
[ Download CSV Export ]
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 Name:
OracleMaster
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// 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(); } } } }
// 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()); } }
// 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; } }
// 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)); } }
// 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); }
// 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; } }
// 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); }
// 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); }
// 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; }
// 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; } }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "OracleMaster.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "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"}]
Contract Creation Code
608060405234801561001057600080fd5b506000805460ff19169055612abb8061002a6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806379292235116100de5780639f04e9ac11610097578063cbe48ee811610071578063cbe48ee814610380578063d381787a14610393578063ea0e35b1146103a6578063f98fae81146103bc57600080fd5b80639f04e9ac14610340578063ae2df7c014610353578063b164e4371461036d57600080fd5b806379292235146102d25780637d4a3d43146102e55780637d774e31146102ff5780638456cb59146103125780638b21f1701461031a578063943b24b21461032d57600080fd5b80633f109d23116101305780633f109d2314610239578063559ccc55146102515780635c975abb146102645780635daf08ca1461027a5780635e6f8df31461028d5780636dcab78f146102bf57600080fd5b8063046f7da21461017857806310d3d22e146101825780631d55fde4146101cb57806329d009f2146101e05780632e80d9b61461020057806333bc709014610226575b600080fd5b6101806103cf565b005b6101ae6101903660046120fe565b6001600160a01b039081166000908152600260205260409020541690565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d3610528565b6040516101c2919061211b565b6101e86105b9565b6040516001600160401b0390911681526020016101c2565b60045461021490600160a01b900460ff1681565b60405160ff90911681526020016101c2565b6003546101ae906001600160a01b031681565b6000546101e89061010090046001600160401b031681565b6005546101e8906001600160401b031681565b60005460ff1660405190151581526020016101c2565b6101ae61028836600461215f565b6105c3565b6102a061029b366004612178565b6105ed565b604080516001600160401b0390931683529015156020830152016101c2565b6101806102cd3660046121ba565b61075f565b6101806102e03660046121ec565b610ad8565b6005546101e890600160401b90046001600160401b031681565b61018061030d3660046120fe565b610e8a565b610180610f5b565b6004546101ae906001600160a01b031681565b61018061033b366004612241565b6110a8565b61018061034e3660046120fe565b6111f2565b6004546101e890600160a81b90046001600160401b031681565b61018061037b3660046120fe565b611359565b61018061038e366004612276565b61160b565b6101806103a13660046120fe565b6118d4565b6103ae60ff81565b6040519081526020016101c2565b6101806103ca3660046120fe565b61194b565b7fd76e3374742c17bd14ffaf46cd349ec292baf7d8425512fa8fe132557a4c967b600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561044057600080fd5b505af1158015610454573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047891906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b1580156104c057600080fd5b505afa1580156104d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f891906122d6565b61051d5760405162461bcd60e51b8152600401610514906122f8565b60405180910390fd5b610525611bed565b50565b6060600460009054906101000a90046001600160a01b03166001600160a01b0316631d55fde46040518163ffffffff1660e01b815260040160006040518083038186803b15801561057857600080fd5b505afa15801561058c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b491908101906123d6565b905090565b60006105b4611c80565b600181815481106105d357600080fd5b6000918252602090912001546001600160a01b0316905081565b60008054819061010090046001600160401b03168161060b86611cca565b90506000198114156106235750915060009050610758565b60048054604051630900d66f60e21b81529182018790526000916001600160a01b039091169063240359bc9060240160206040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a291906122b9565b90506001600160a01b0381166106c15782600094509450505050610758565b6001600160a01b03818116600090815260026020526040908190205490516389b8036160e01b815260048101859052859291909116906389b803619060240160206040518083038186803b15801561071857600080fd5b505afa15801561072c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075091906122d6565b945094505050505b9250929050565b7f8ac38a2a3c56dddd46cb8bc53ef71a94590a3862aefd3143ed3126454af63731600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107d057600080fd5b505af11580156107e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080891906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b15801561085057600080fd5b505afa158015610864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088891906122d6565b6108a45760405162461bcd60e51b8152600401610514906122f8565b60008260ff161180156108ba575060ff8260ff16105b6109065760405162461bcd60e51b815260206004820152601760248201527f4f4d3a2051554f52554d5f574f4e545f42455f4d4144450000000000000000006044820152606401610514565b6004805460ff848116600160a01b81810260ff60a01b19851617909455929091041690811115610a9d576000600460009054906101000a90046001600160a01b03166001600160a01b031663df1979566040518163ffffffff1660e01b815260040160006040518083038186803b15801561098057600080fd5b505afa158015610994573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109bc919081019061246b565b805190915060005b81811015610a99576000600260008584815181106109e4576109e46124f9565b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541690508015610a885760005460405163cb35cf3160e01b815260ff891660048201526101009091046001600160401b031660248201526001600160a01b0382169063cb35cf3190604401600060405180830381600087803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050505b50610a9281612525565b90506109c4565b5050505b60405160ff841681527fd6ecd940f5784ceceeeb048268900f819851986dbe41c49f6e754b988868df879060200160405180910390a1505050565b60005460ff1615610b1e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610514565b610b2f610b2a82612674565b611d34565b610b725760405162461bcd60e51b815260206004820152601460248201527313d34e88125390d3d4949150d517d4915413d49560621b6044820152606401610514565b6000610b7d33611cca565b9050600019811415610bc85760405162461bcd60e51b815260206004820152601460248201527313d34e8813515350915497d393d517d193d5539160621b6044820152606401610514565b60048054604051630900d66f60e21b81526000926001600160a01b039092169163240359bc91610bff918735910190815260200190565b60206040518083038186803b158015610c1757600080fd5b505afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f91906122b9565b6001600160a01b038082166000908152600260205260409020549192501680610cba5760405162461bcd60e51b815260206004820152601f60248201527f4f4d3a204f5241434c455f464f525f4c45444745525f4e4f545f464f554e44006044820152606401610514565b6000546001600160401b0361010090910481169086161015610d105760405162461bcd60e51b815260206004820152600f60248201526e13d34e8811549057d513d3d7d3d311608a1b6044820152606401610514565b6000546001600160401b0361010090910481169086161115610e1357610d34611c80565b6001600160401b0316856001600160401b03161115610d8e5760405162461bcd60e51b81526020600482015260166024820152754f4d3a20554e45585045435445445f4e45575f45524160501b6044820152606401610514565b6000805468ffffffffffffffff0019166101006001600160401b03881602179055610db7611dad565b600480546040805163fa597e0760e01b815290516001600160a01b039092169263fa597e0792828201926000929082900301818387803b158015610dfa57600080fd5b505af1158015610e0e573d6000803e3d6000fd5b505050505b600480546040516314541bb560e21b81526001600160a01b038416926351506ed492610e51928892600160a01b90920460ff16918b918b9101612898565b600060405180830381600087803b158015610e6b57600080fd5b505af1158015610e7f573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b031615610ee35760405162461bcd60e51b815260206004820152601860248201527f4f4d3a204c49444f5f414c52454144595f444546494e454400000000000000006044820152606401610514565b6001600160a01b038116610f395760405162461bcd60e51b815260206004820152601a60248201527f4f4d3a20494e434f52524543545f4c49444f5f414444524553530000000000006044820152606401610514565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b7fd76e3374742c17bd14ffaf46cd349ec292baf7d8425512fa8fe132557a4c967b600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fcc57600080fd5b505af1158015610fe0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100491906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b15801561104c57600080fd5b505afa158015611060573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108491906122d6565b6110a05760405162461bcd60e51b8152600401610514906122f8565b610525611efb565b6003546001600160a01b0316156111015760405162461bcd60e51b815260206004820152601760248201527f4f4d3a20414c52454144595f494e495449414c495a45440000000000000000006044820152606401610514565b6001600160a01b0382166111575760405162461bcd60e51b815260206004820152601b60248201527f4f4d3a20494e434f52524543545f434c4f4e455f4144445245535300000000006044820152606401610514565b60008160ff1611801561116d575060ff8160ff16105b6111b05760405162461bcd60e51b81526020600482015260146024820152734f4d3a20494e434f52524543545f51554f52554d60601b6044820152606401610514565b600380546001600160a01b039093166001600160a01b0319909316929092179091556004805460ff909216600160a01b0260ff60a01b19909216919091179055565b6004546001600160a01b031633146112425760405162461bcd60e51b81526020600482015260136024820152724f4d3a2043414c4c45525f4e4f545f4c49444f60681b6044820152606401610514565b6003546001600160a01b031661129a5760405162461bcd60e51b815260206004820152601e60248201527f4f4d3a204f5241434c455f434c4f4e455f554e494e495449414c495a454400006044820152606401610514565b6003546000906112c6906001600160a01b03166bffffffffffffffffffffffff19606085901b16611f76565b60405163485cc95560e01b81523060048201526001600160a01b0384811660248301529192509082169063485cc95590604401600060405180830381600087803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b505050506001600160a01b03918216600090815260026020526040902080546001600160a01b03191691909216179055565b7f390fb325ad2241104ec9502c1fe8ca89f34a50b811d77948772f75454c563ceb600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113ca57600080fd5b505af11580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b15801561144a57600080fd5b505afa15801561145e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148291906122d6565b61149e5760405162461bcd60e51b8152600401610514906122f8565b6001600160a01b0382166114e75760405162461bcd60e51b815260206004820152601060248201526f13d34e8810905117d05491d55351539560821b6044820152606401610514565b6000196114f383611cca565b146115345760405162461bcd60e51b81526020600482015260116024820152704f4d3a204d454d4245525f45584953545360781b6044820152606401610514565b611540600160ff6129af565b600154106115875760405162461bcd60e51b81526020600482015260146024820152734f4d3a204d454d424552535f544f4f5f4d414e5960601b6044820152606401610514565b6001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384169081179091556040519081527fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd9149060200160405180910390a15050565b7f2c204f3ef59cc164f843cf6919920470e37721ba425db7893d02e60cfd0bafdc600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b491906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b1580156116fc57600080fd5b505afa158015611710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173491906122d6565b6117505760405162461bcd60e51b8152600401610514906122f8565b6000826001600160401b0316116117a95760405162461bcd60e51b815260206004820152601760248201527f4f4d3a204241445f5345434f4e44535f5045525f4552410000000000000000006044820152606401610514565b826001600160401b0316426001600160401b031610156117ff5760405162461bcd60e51b815260206004820152601160248201527004f4d3a204241445f54494d455354414d5607c1b6044820152606401610514565b60008261180c85426129c6565b61181691906129ee565b6118209086612a22565b6000549091506001600160401b036101009091048116908216101561187b5760405162461bcd60e51b815260206004820152601160248201527027a69d1022a920afa1a7a62624a9a4a7a760791b6044820152606401610514565b5050600480546001600160401b03948516600160a81b0267ffffffffffffffff60a81b1990911617905560058054918416600160401b026fffffffffffffffffffffffffffffffff199092169290931691909117179055565b6004546001600160a01b031633146119245760405162461bcd60e51b81526020600482015260136024820152724f4d3a2043414c4c45525f4e4f545f4c49444f60681b6044820152606401610514565b6001600160a01b0316600090815260026020526040902080546001600160a01b0319169055565b7f390fb325ad2241104ec9502c1fe8ca89f34a50b811d77948772f75454c563ceb600460009054906101000a90046001600160a01b03166001600160a01b031663a1e206c76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156119bc57600080fd5b505af11580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f491906122b9565b604051633bfc46cb60e21b8152600481018390523360248201526001600160a01b03919091169063eff11b2c9060440160206040518083038186803b158015611a3c57600080fd5b505afa158015611a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7491906122d6565b611a905760405162461bcd60e51b8152600401610514906122f8565b6000611a9b83611cca565b9050600019811415611ae65760405162461bcd60e51b815260206004820152601460248201527313d34e8813515350915497d393d517d193d5539160621b6044820152606401610514565b60018054600091611af6916129af565b9050808214611b6d5760018181548110611b1257611b126124f9565b600091825260209091200154600180546001600160a01b039092169184908110611b3e57611b3e6124f9565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6001805480611b7e57611b7e612a4d565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040516001600160a01b03861681527f6e76fb4c77256006d9c38ec7d82b45a8c8f3c27b1d6766fffc42dfb8de684492910160405180910390a1611be7611dad565b50505050565b60005460ff16611c365760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610514565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6005546000906001600160401b03600160401b8204811691611ca39116426129c6565b611cad91906129ee565b6004546105b49190600160a81b90046001600160401b0316612a22565b600154600090815b81811015611d2957836001600160a01b031660018281548110611cf757611cf76124f9565b6000918252602090912001546001600160a01b03161415611d19579392505050565b611d2281612525565b9050611cd2565b506000199392505050565b600080611d4283600061201c565b50905060ff80168360a0015151108015611d805750808360600151611d679190612a63565b6001600160801b031683608001516001600160801b0316145b8015611da6575082608001516001600160801b03168360e001516001600160801b031610155b9392505050565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663df1979566040518163ffffffff1660e01b815260040160006040518083038186803b158015611dfd57600080fd5b505afa158015611e11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e39919081019061246b565b805190915060005b81811015611ef657600060026000858481518110611e6157611e616124f9565b6020908102919091018101516001600160a01b03908116835290820192909252604001600020541690508015611ee557806001600160a01b031663b75b518c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050505b50611eef81612525565b9050611e41565b505050565b60005460ff1615611f415760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610514565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c633390565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528360601b60148201526e5af43d82803e903d91602b57fd5bf360881b6028820152826037826000f59150506001600160a01b0381166120165760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152606401610514565b92915050565b60008060008060005b8660a00151518110156120dd578660a001518181518110612048576120486124f9565b6020026020010151600001518361205f9190612a63565b9250856001600160401b03168760a001518281518110612081576120816124f9565b6020026020010151602001516001600160401b0316116120cb578660a0015181815181106120b1576120b16124f9565b602002602001015160000151826120c89190612a63565b91505b806120d581612525565b915050612025565b50909590945092505050565b6001600160a01b038116811461052557600080fd5b60006020828403121561211057600080fd5b8135611da6816120e9565b6020808252825182820181905260009190848201906040850190845b8181101561215357835183529284019291840191600101612137565b50909695505050505050565b60006020828403121561217157600080fd5b5035919050565b6000806040838503121561218b57600080fd5b8235612196816120e9565b946020939093013593505050565b803560ff811681146121b557600080fd5b919050565b6000602082840312156121cc57600080fd5b611da6826121a4565b80356001600160401b03811681146121b557600080fd5b600080604083850312156121ff57600080fd5b612208836121d5565b915060208301356001600160401b0381111561222357600080fd5b8301610120818603121561223657600080fd5b809150509250929050565b6000806040838503121561225457600080fd5b823561225f816120e9565b915061226d602084016121a4565b90509250929050565b60008060006060848603121561228b57600080fd5b612294846121d5565b92506122a2602085016121d5565b91506122b0604085016121d5565b90509250925092565b6000602082840312156122cb57600080fd5b8151611da6816120e9565b6000602082840312156122e857600080fd5b81518015158114611da657600080fd5b60208082526010908201526f13d34e8815539055551213d493d6915160821b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561235a5761235a612322565b60405290565b60405161012081016001600160401b038111828210171561235a5761235a612322565b604051601f8201601f191681016001600160401b03811182821017156123ab576123ab612322565b604052919050565b60006001600160401b038211156123cc576123cc612322565b5060051b60200190565b600060208083850312156123e957600080fd5b82516001600160401b038111156123ff57600080fd5b8301601f8101851361241057600080fd5b805161242361241e826123b3565b612383565b81815260059190911b8201830190838101908783111561244257600080fd5b928401925b8284101561246057835182529284019290840190612447565b979650505050505050565b6000602080838503121561247e57600080fd5b82516001600160401b0381111561249457600080fd5b8301601f810185136124a557600080fd5b80516124b361241e826123b3565b81815260059190911b820183019083810190878311156124d257600080fd5b928401925b828410156124605783516124ea816120e9565b825292840192908401906124d7565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156125395761253961250f565b5060010190565b8035600481106121b557600080fd5b80356001600160801b03811681146121b557600080fd5b600082601f83011261257757600080fd5b8135602061258761241e836123b3565b82815260069290921b840181019181810190868411156125a657600080fd5b8286015b848110156125f357604081890312156125c35760008081fd5b6125cb612338565b6125d48261254f565b81526125e18583016121d5565b818601528352918301916040016125aa565b509695505050505050565b803563ffffffff811681146121b557600080fd5b600082601f83011261262357600080fd5b8135602061263361241e836123b3565b82815260059290921b8401810191818101908684111561265257600080fd5b8286015b848110156125f357612667816125fe565b8352918301918301612656565b6000610120823603121561268757600080fd5b61268f612360565b82358152602083013560208201526126a960408401612540565b60408201526126ba6060840161254f565b60608201526126cb6080840161254f565b608082015260a08301356001600160401b03808211156126ea57600080fd5b6126f636838701612566565b60a084015260c085013591508082111561270f57600080fd5b5061271c36828601612612565b60c08301525061272e60e0840161254f565b60e08201526101006127418185016125fe565b9082015292915050565b6004811061276957634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e1984360301811261278457600080fd5b83016020810192503590506001600160401b038111156127a357600080fd5b8060061b360383131561075857600080fd5b8183526000602080850194508260005b8581101561280c576001600160801b036127de8361254f565b1687526001600160401b036127f48484016121d5565b168784015260409687019691909101906001016127c5565b509495945050505050565b6000808335601e1984360301811261282e57600080fd5b83016020810192503590506001600160401b0381111561284d57600080fd5b8060051b360383131561075857600080fd5b8183526000602080850194508260005b8581101561280c5763ffffffff612885836125fe565b168752958201959082019060010161286f565b84815260ff841660208201526001600160401b03831660408201526080606082015281356080820152602082013560a082015260006128d960408401612540565b6128e660c084018261274b565b506128f36060840161254f565b6001600160801b031660e083015261290d6080840161254f565b610100612924818501836001600160801b03169052565b61293160a086018661276d565b6101208681015292506129496101a0860184836127b5565b92505061295960c0860186612817565b858403607f190161014087015261297184828461285f565b9350505061298160e0860161254f565b6001600160801b031661016085015261299b8582016125fe565b63ffffffff811661018086015290506125f3565b6000828210156129c1576129c161250f565b500390565b60006001600160401b03838116908316818110156129e6576129e661250f565b039392505050565b60006001600160401b0380841680612a1657634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b60006001600160401b03808316818516808303821115612a4457612a4461250f565b01949350505050565b634e487b7160e01b600052603160045260246000fd5b60006001600160801b03808316818516808303821115612a4457612a4461250f56fea26469706673582212208228dd91d287cc79538058bfbc72f5819d3e1daf90249df7c9756da506dfaaba64736f6c63430008090033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.