Contract Overview
Balance:
0 MATIC
My Name Tag:
Not Available
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x15F6fe306E4989F1E092Eb63196A8078a5745b33
Contract Name:
VoteManager
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 100000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./interface/IVoteManager.sol"; import "./interface/IStakeManager.sol"; import "./interface/IRewardManager.sol"; import "./interface/IBlockManager.sol"; import "./storage/VoteStorage.sol"; import "./parameters/child/VoteManagerParams.sol"; import "./StateManager.sol"; import "../Initializable.sol"; contract VoteManager is Initializable, VoteStorage, StateManager, VoteManagerParams, IVoteManager { IStakeManager public stakeManager; IRewardManager public rewardManager; IBlockManager public blockManager; event Committed(uint32 epoch, uint32 stakerId, bytes32 commitment, uint256 timestamp); event Revealed(uint32 epoch, uint32 stakerId, uint48[] values, uint256 timestamp); function initialize( address stakeManagerAddress, address rewardManagerAddress, address blockManagerAddress ) external initializer onlyRole(DEFAULT_ADMIN_ROLE) { stakeManager = IStakeManager(stakeManagerAddress); rewardManager = IRewardManager(rewardManagerAddress); blockManager = IBlockManager(blockManagerAddress); } function commit(uint32 epoch, bytes32 commitment) external initialized checkEpochAndState(State.Commit, epoch, epochLength) { require(commitment != 0x0, "Invalid commitment"); uint32 stakerId = stakeManager.getStakerId(msg.sender); require(!stakeManager.getStaker(stakerId).isSlashed, "VM : staker is slashed"); require(stakerId > 0, "Staker does not exist"); require(commitments[stakerId].epoch != epoch, "already commited"); // slither-disable-next-line reentrancy-events,reentrancy-no-eth if (!blockManager.isBlockConfirmed(epoch - 1)) { blockManager.confirmPreviousEpochBlock(stakerId); } // slither-disable-next-line reentrancy-events,reentrancy-no-eth rewardManager.givePenalties(epoch, stakerId); // Switch to call confirm block only when block in previous epoch has not been confirmed // and if previous epoch do have proposed blocks uint256 thisStakerStake = stakeManager.getStake(stakerId); if (thisStakerStake >= minStake) { commitments[stakerId].epoch = epoch; commitments[stakerId].commitmentHash = commitment; emit Committed(epoch, stakerId, commitment, block.timestamp); } } function reveal( uint32 epoch, uint48[] calldata values, bytes32 secret ) external initialized checkEpochAndState(State.Reveal, epoch, epochLength) { uint32 stakerId = stakeManager.getStakerId(msg.sender); require(stakerId > 0, "Staker does not exist"); require(commitments[stakerId].epoch == epoch, "not committed in this epoch"); require(stakeManager.getStake(stakerId) >= minStake, "stake below minimum"); // avoid innocent staker getting slashed due to empty secret require(secret != 0x0, "secret cannot be empty"); //below line also avoid double reveal attack since once revealed, commitment has will be set to 0x0 require(keccak256(abi.encodePacked(epoch, values, secret)) == commitments[stakerId].commitmentHash, "incorrect secret/value"); //below require was changed from 0 to minstake because someone with very low stake can manipulate randao //TODO: REQUIRE all assets to be revealed commitments[stakerId].commitmentHash = 0x0; votes[stakerId].epoch = epoch; votes[stakerId].values = values; uint256 influence = stakeManager.getInfluence(stakerId); totalInfluenceRevealed[epoch] = totalInfluenceRevealed[epoch] + influence; influenceSnapshot[epoch][stakerId] = influence; secrets = keccak256(abi.encodePacked(secrets, secret)); emit Revealed(epoch, stakerId, values, block.timestamp); } //bounty hunter revealing secret in commit state function snitch( uint32 epoch, uint48[] calldata values, bytes32 secret, address stakerAddress ) external initialized checkEpochAndState(State.Commit, epoch, epochLength) returns (uint32) { require(msg.sender != stakerAddress, "cant snitch on yourself"); uint32 thisStakerId = stakeManager.getStakerId(stakerAddress); require(thisStakerId > 0, "Staker does not exist"); require(commitments[thisStakerId].epoch == epoch, "not committed in this epoch"); // avoid innocent staker getting slashed due to empty secret require(secret != 0x0, "secret cannot be empty"); require(keccak256(abi.encodePacked(epoch, values, secret)) == commitments[thisStakerId].commitmentHash, "incorrect secret/value"); //below line also avoid double reveal attack since once revealed, commitment has will be set to 0x0 commitments[thisStakerId].commitmentHash = 0x0; return stakeManager.slash(epoch, thisStakerId, msg.sender); } function getCommitment(uint32 stakerId) external view returns (Structs.Commitment memory commitment) { //epoch -> stakerid -> commitment return (commitments[stakerId]); } function getVote(uint32 stakerId) external view override returns (Structs.Vote memory vote) { //stakerid->votes return (votes[stakerId]); } function getVoteValue(uint16 assetIndex, uint32 stakerId) external view override returns (uint48) { //stakerid -> assetid -> vote return (votes[stakerId].values[assetIndex]); } function getInfluenceSnapshot(uint32 epoch, uint32 stakerId) external view override returns (uint256) { //epoch -> stakerId return (influenceSnapshot[epoch][stakerId]); } function getTotalInfluenceRevealed(uint32 epoch) external view override returns (uint256) { // epoch -> asset -> stakeWeight return (totalInfluenceRevealed[epoch]); } function getEpochLastCommitted(uint32 stakerId) external view override returns (uint32) { return commitments[stakerId].epoch; } function getEpochLastRevealed(uint32 stakerId) external view override returns (uint32) { return votes[stakerId].epoch; } function getRandaoHash() external view override returns (bytes32) { return (secrets); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; interface IVoteManager { function getVoteValue(uint16 assetId, uint32 stakerId) external view returns (uint48); function getVote(uint32 stakerId) external view returns (Structs.Vote memory vote); function getInfluenceSnapshot(uint32 epoch, uint32 stakerId) external view returns (uint256); function getTotalInfluenceRevealed(uint32 epoch) external view returns (uint256); function getEpochLastRevealed(uint32 stakerId) external view returns (uint32); function getEpochLastCommitted(uint32 stakerId) external view returns (uint32); function getRandaoHash() external view returns (bytes32); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; import "../storage/Constants.sol"; interface IStakeManager { function setStakerStake( uint32 _epoch, uint32 _id, Constants.StakeChanged reason, uint256 _prevStake, uint256 _stake ) external; function slash( uint32 epoch, uint32 stakerId, address bountyHunter ) external returns (uint32); function setStakerAge( uint32 _epoch, uint32 _id, uint32 _age, Constants.AgeChanged reason ) external; function setStakerEpochFirstStakedOrLastPenalized(uint32 _epoch, uint32 _id) external; function escape(address _address) external; function srzrTransfer( address from, address to, uint256 amount, uint32 stakerId ) external; function getStakerId(address _address) external view returns (uint32); function getStaker(uint32 _id) external view returns (Structs.Staker memory staker); function getNumStakers() external view returns (uint32); function getInfluence(uint32 stakerId) external view returns (uint256); function getStake(uint32 stakerId) external view returns (uint256); function getEpochFirstStakedOrLastPenalized(uint32 stakerId) external view returns (uint32); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; interface IRewardManager { function givePenalties(uint32 epoch, uint32 stakerId) external; function giveBlockReward(uint32 epoch, uint32 stakerId) external; function giveInactivityPenalties(uint32 epoch, uint32 stakerId) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; interface IBlockManager { function confirmPreviousEpochBlock(uint32 stakerId) external; function getBlock(uint32 epoch) external view returns (Structs.Block memory _block); function isBlockConfirmed(uint32 epoch) external view returns (bool); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; contract VoteStorage { //stakerid -> commitment mapping(uint32 => Structs.Commitment) public commitments; //stakerid -> vote mapping(uint32 => Structs.Vote) public votes; //epoch -> asset -> stakeWeight mapping(uint32 => uint256) public totalInfluenceRevealed; //epoch -> assetid -> voteValue -> weight // mapping(uint32 => mapping(uint8 => mapping(uint32 => uint256))) public voteWeights; //epoch-> stakerid->influe mapping(uint32 => mapping(uint32 => uint256)) public influenceSnapshot; bytes32 public secrets; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../interfaces/IVoteManagerParams.sol"; import "../ACL.sol"; import "../../storage/Constants.sol"; abstract contract VoteManagerParams is ACL, IVoteManagerParams, Constants { uint16 public epochLength = 300; uint256 public minStake = 1000 * (10**18); function setEpochLength(uint16 _epochLength) external override onlyRole(GOVERNANCE_ROLE) { // slither-disable-next-line events-maths epochLength = _epochLength; } function setMinStake(uint256 _minStake) external override onlyRole(GOVERNANCE_ROLE) { // slither-disable-next-line events-maths minStake = _minStake; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./storage/Constants.sol"; contract StateManager is Constants { modifier checkEpoch(uint32 epoch, uint32 epochLength) { // slither-disable-next-line incorrect-equality require(epoch == _getEpoch(epochLength), "incorrect epoch"); _; } modifier checkState(State state, uint32 epochLength) { // slither-disable-next-line incorrect-equality require(state == _getState(epochLength), "incorrect state"); _; } modifier notState(State state, uint32 epochLength) { // slither-disable-next-line incorrect-equality require(state != _getState(epochLength), "incorrect state"); _; } modifier checkEpochAndState( State state, uint32 epoch, uint32 epochLength ) { // slither-disable-next-line incorrect-equality require(epoch == _getEpoch(epochLength), "incorrect epoch"); // slither-disable-next-line incorrect-equality require(state == _getState(epochLength), "incorrect state"); _; } function _getEpoch(uint32 epochLength) internal view returns (uint32) { return (uint32(block.number) / (epochLength)); } function _getState(uint32 epochLength) internal view returns (State) { uint8 state = uint8(((block.number) / (epochLength / NUM_STATES)) % (NUM_STATES)); return State(state); } }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * Forked from OZ's (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/b9125001f0a1c44d596ca3a47536f1a467e3a29d/contracts/proxy/utils/Initializable.sol) */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "contract already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } modifier initialized() { require(_initialized, "Contract should be initialized"); _; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; library Structs { struct Vote { uint32 epoch; uint48[] values; } struct Commitment { uint32 epoch; bytes32 commitmentHash; } struct Staker { // Slot 1 bool acceptDelegation; bool isSlashed; uint8 commission; uint32 id; uint32 age; address _address; // Slot 2 address tokenAddress; uint32 epochFirstStakedOrLastPenalized; uint32 epochCommissionLastUpdated; // Slot 3 uint256 stake; } struct Lock { uint256 amount; //amount in RZR uint256 commission; uint256 withdrawAfter; // Can be made uint32 later if packing is possible } struct BountyLock { uint32 redeemAfter; address bountyHunter; uint256 amount; //amount in RZR } struct Block { bool valid; uint32 proposerId; uint32[] medians; uint256 iteration; uint256 biggestInfluence; } struct Dispute { uint16 collectionId; uint32 lastVisitedStaker; uint256 accWeight; uint256 accProd; } struct Job { uint16 id; uint8 selectorType; // 0-1 uint8 weight; // 1-100 int8 power; string name; string selector; string url; } struct Collection { bool active; uint16 id; uint16 assetIndex; int8 power; uint32 aggregationMethod; uint16[] jobIDs; string name; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; contract Constants { enum State { Commit, Reveal, Propose, Dispute, Confirm } enum StakeChanged { BlockReward, InactivityPenalty, RandaoPenalty, Slashed } enum AgeChanged { InactivityPenalty, VotingPenalty } uint8 public constant NUM_STATES = 5; address public constant BURN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint16 public constant BASE_DENOMINATOR = 10000; // keccak256("BLOCK_CONFIRMER_ROLE") bytes32 public constant BLOCK_CONFIRMER_ROLE = 0x18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f; // keccak256("ASSET_CONFIRMER_ROLE") bytes32 public constant ASSET_CONFIRMER_ROLE = 0xed202a1bc048f9b31cb3937bc52e7c8fe76413f0674b9146ff4bcc15612ccbc2; // keccak256("STAKER_ACTIVITY_UPDATER_ROLE") bytes32 public constant STAKER_ACTIVITY_UPDATER_ROLE = 0x4cd3070aaa07d03ab33731cbabd0cb27eb9e074a9430ad006c96941d71b77ece; // keccak256("STAKE_MODIFIER_ROLE") bytes32 public constant STAKE_MODIFIER_ROLE = 0xdbaaaff2c3744aa215ebd99971829e1c1b728703a0bf252f96685d29011fc804; // keccak256("REWARD_MODIFIER_ROLE") bytes32 public constant REWARD_MODIFIER_ROLE = 0xcabcaf259dd9a27f23bd8a92bacd65983c2ebf027c853f89f941715905271a8d; // keccak256("ASSET_MODIFIER_ROLE") bytes32 public constant ASSET_MODIFIER_ROLE = 0xca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe4; // keccak256("VOTE_MODIFIER_ROLE") bytes32 public constant VOTE_MODIFIER_ROLE = 0xca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe5; // keccak256("DELEGATOR_MODIFIER_ROLE") bytes32 public constant DELEGATOR_MODIFIER_ROLE = 0x6b7da7a33355c6e035439beb2ac6a052f1558db73f08690b1c9ef5a4e8389597; // keccak256("SECRETS_MODIFIER_ROLE") bytes32 public constant SECRETS_MODIFIER_ROLE = 0x46aaf8a125792dfff6db03d74f94fe1acaf55c8cab22f65297c15809c364465c; // keccak256("PAUSE_ROLE") bytes32 public constant PAUSE_ROLE = 0x139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d; // keccak256("GOVERNANCE_ROLE") bytes32 public constant GOVERNANCE_ROLE = 0x71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb1; // keccak256("STOKEN_ROLE") bytes32 public constant STOKEN_ROLE = 0xce3e6c780f179d7a08d28e380f7be9c36d990f56515174f8adb6287c543e30dc; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IVoteManagerParams { function setEpochLength(uint16 _epochLength) external; function setMinStake(uint256 _minStake) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControl.sol"; contract ACL is AccessControl { constructor() { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// 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) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 100000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"stakerId","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"commitment","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Committed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"stakerId","type":"uint32"},{"indexed":false,"internalType":"uint48[]","name":"values","type":"uint48[]"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Revealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ASSET_CONFIRMER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASSET_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_DENOMINATOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCK_CONFIRMER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATOR_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_STATES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECRETS_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKER_ACTIVITY_UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STOKEN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockManager","outputs":[{"internalType":"contract IBlockManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"bytes32","name":"commitment","type":"bytes32"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"commitments","outputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"bytes32","name":"commitmentHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochLength","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"getCommitment","outputs":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"bytes32","name":"commitmentHash","type":"bytes32"}],"internalType":"struct Structs.Commitment","name":"commitment","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"getEpochLastCommitted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"getEpochLastRevealed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"getInfluenceSnapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRandaoHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"}],"name":"getTotalInfluenceRevealed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"getVote","outputs":[{"components":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint48[]","name":"values","type":"uint48[]"}],"internalType":"struct Structs.Vote","name":"vote","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"assetIndex","type":"uint16"},{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"getVoteValue","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"influenceSnapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakeManagerAddress","type":"address"},{"internalType":"address","name":"rewardManagerAddress","type":"address"},{"internalType":"address","name":"blockManagerAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint48[]","name":"values","type":"uint48[]"},{"internalType":"bytes32","name":"secret","type":"bytes32"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"contract IRewardManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secrets","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_epochLength","type":"uint16"}],"name":"setEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minStake","type":"uint256"}],"name":"setMinStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint48[]","name":"values","type":"uint48[]"},{"internalType":"bytes32","name":"secret","type":"bytes32"},{"internalType":"address","name":"stakerAddress","type":"address"}],"name":"snitch","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeManager","outputs":[{"internalType":"contract IStakeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"totalInfluenceRevealed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"votes","outputs":[{"internalType":"uint32","name":"epoch","type":"uint32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526007805461ffff191661012c179055683635c9adc5dea000006008553480156200002d57600080fd5b506200003b60003362000041565b620000f5565b6200004d828262000051565b5050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff166200004d5760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620000b13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6132f080620001056000396000f3fe608060405234801561001057600080fd5b506004361061030a5760003560e01c806365f9780d1161019c578063b6c472b6116100ee578063d547741f11610097578063ef8bf68411610071578063ef8bf6841461090c578063f36c8f5c14610933578063fccc28131461095a57600080fd5b8063d547741f146108b2578063d9169b32146108c5578063da984295146108e557600080fd5b8063c0c53b8b116100c8578063c0c53b8b14610876578063ca0652bf14610889578063cd7480fa146108a957600080fd5b8063b6c472b6146107d7578063ba3ad0901461084d578063bd8595841461086d57600080fd5b80638b5b922d11610150578063a217fddf1161012a578063a217fddf146107a1578063a7a62a10146107a9578063b0b8a8d6146107b157600080fd5b80638b5b922d146107215780638c80fd901461074857806391d148541461075b57600080fd5b80637542ff95116101815780637542ff95146106b3578063776076e7146106d357806389447125146106fa57600080fd5b806365f9780d1461065e57806372dc31a01461068857600080fd5b806338e692a91161026057806348fd8e7b1161020957806357d775f8116101e357806357d775f8146105ca5780635b070278146105eb5780636074c1841461061257600080fd5b806348fd8e7b146105465780634912b72a1461057c5780634d4b56bd146105a357600080fd5b806340f849251161023a57806340f849251461050d57806344772e4a1461052057806345502afa1461053357600080fd5b806338e692a9146104ab5780633bf90e93146104d15780634007ce18146104fa57600080fd5b80632d93b9a0116102c257806336568abe1161029c57806336568abe14610468578063375b3c0a1461047b578063389ed2671461048457600080fd5b80632d93b9a0146104055780632f2ff15d1461042c5780632f50bcc41461044157600080fd5b80630bb34f56116102f35780630bb34f56146103515780630f4ef8a61461038f578063248a9ca3146103d457600080fd5b806301ffc9a71461030f57806305db56df14610337575b600080fd5b61032261031d366004612bdf565b610975565b60405190151581526020015b60405180910390f35b61033f600581565b60405160ff909116815260200161032e565b61037a61035f366004612d3e565b63ffffffff9081166000908152600260205260409020541690565b60405163ffffffff909116815260200161032e565b600a546103af9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032e565b6103f76103e2366004612b98565b60009081526006602052604090206001015490565b60405190815260200161032e565b6103f77fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe581565b61043f61043a366004612bb0565b610a0e565b005b6103f77f46aaf8a125792dfff6db03d74f94fe1acaf55c8cab22f65297c15809c364465c81565b61043f610476366004612bb0565b610a39565b6103f760085481565b6103f77f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b6103f76104b9366004612d3e565b63ffffffff1660009081526003602052604090205490565b61037a6104df366004612d3e565b63ffffffff9081166000908152600160205260409020541690565b61043f610508366004612ce1565b610af1565b61043f61051b366004612e42565b610b52565b61037a61052e366004612dd0565b61135a565b61043f610541366004612d76565b61193d565b6103f7610554366004612e6d565b63ffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103f77f6b7da7a33355c6e035439beb2ac6a052f1558db73f08690b1c9ef5a4e838959781565b6103f77f4cd3070aaa07d03ab33731cbabd0cb27eb9e074a9430ad006c96941d71b77ece81565b6007546105d89061ffff1681565b60405161ffff909116815260200161032e565b6103f77fce3e6c780f179d7a08d28e380f7be9c36d990f56515174f8adb6287c543e30dc81565b610642610620366004612d3e565b6001602081905260009182526040909120805491015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161032e565b61067161066c366004612cfb565b6120c1565b60405165ffffffffffff909116815260200161032e565b6103f7610696366004612e6d565b600460209081526000928352604080842090915290825290205481565b6009546103af9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f77fdbaaaff2c3744aa215ebd99971829e1c1b728703a0bf252f96685d29011fc80481565b6103f77fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe481565b6103f77fed202a1bc048f9b31cb3937bc52e7c8fe76413f0674b9146ff4bcc15612ccbc281565b61043f610756366004612b98565b612146565b610322610769366004612bb0565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6103f7600081565b6005546103f7565b61037a6107bf366004612d3e565b60026020526000908152604090205463ffffffff1681565b61082c6107e5366004612d3e565b6040805180820182526000808252602091820181905263ffffffff938416815260018083529083902083518085019094528054909416835292909201549181019190915290565b60408051825163ffffffff168152602092830151928101929092520161032e565b6103f761085b366004612d3e565b60036020526000908152604090205481565b6105d861271081565b61043f610884366004612b34565b612177565b61089c610897366004612d3e565b6122d9565b60405161032e9190612fd2565b6103f760055481565b61043f6108c0366004612bb0565b6123a3565b600b546103af9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f77f18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f81565b6103f77fcabcaf259dd9a27f23bd8a92bacd65983c2ebf027c853f89f941715905271a8d81565b6103f77f71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb181565b6103af73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610a0857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600082815260066020526040902060010154610a2a81336123c9565b610a34838361249b565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610ae3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b610aed828261258f565b5050565b7f71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb1610b1c81336123c9565b50600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff92909216919091179055565b60005460ff16610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610ada565b600754600090839061ffff16610bd38161264a565b63ffffffff168263ffffffff1614610c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610ada565b610c5081612656565b6004811115610c88577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836004811115610cc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610ada565b83610d8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420636f6d6d69746d656e7400000000000000000000000000006044820152606401610ada565b6009546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff1690636022a4859060240160206040518083038186803b158015610df957600080fd5b505afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190612d5a565b6009546040517feb04d42a00000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015291925073ffffffffffffffffffffffffffffffffffffffff169063eb04d42a906024016101406040518083038186803b158015610ea257600080fd5b505afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190612c1f565b6020015115610f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f564d203a207374616b657220697320736c6173686564000000000000000000006044820152606401610ada565b60008163ffffffff1611610fb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5374616b657220646f6573206e6f7420657869737400000000000000000000006044820152606401610ada565b63ffffffff81811660009081526001602052604090205481169087161415611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f616c726561647920636f6d6d69746564000000000000000000000000000000006044820152606401610ada565b600b5473ffffffffffffffffffffffffffffffffffffffff16638622f3a961106260018961318b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815263ffffffff91909116600482015260240160206040518083038186803b1580156110b757600080fd5b505afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190612b7e565b61117d57600b546040517fc9e99c2500000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015273ffffffffffffffffffffffffffffffffffffffff9091169063c9e99c2590602401600060405180830381600087803b15801561116457600080fd5b505af1158015611178573d6000803e3d6000fd5b505050505b600a546040517fc30e36b300000000000000000000000000000000000000000000000000000000815263ffffffff80891660048301528316602482015273ffffffffffffffffffffffffffffffffffffffff9091169063c30e36b390604401600060405180830381600087803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b50506009546040517edd998100000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526000935073ffffffffffffffffffffffffffffffffffffffff909116915062dd99819060240160206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b69190612d26565b905060085481106113515763ffffffff82811660008181526001602081815260409283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000016958d1695861781559091018a9055815193845283019190915281018790524260608201527f3fef0fda4fe059f0c45c029fdcc38e25d08645e8a49d9dd6ea84e09e3ce7d2739060800160405180910390a15b50505050505050565b6000805460ff166113c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610ada565b600754600090879061ffff166113dc8161264a565b63ffffffff168263ffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610ada565b61145981612656565b6004811115611491577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8360048111156114ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610ada565b3373ffffffffffffffffffffffffffffffffffffffff861614156115b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616e7420736e69746368206f6e20796f757273656c660000000000000000006044820152606401610ada565b6009546040517f6022a48500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526000921690636022a4859060240160206040518083038186803b15801561161d57600080fd5b505afa158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190612d5a565b905060008163ffffffff16116116c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5374616b657220646f6573206e6f7420657869737400000000000000000000006044820152606401610ada565b63ffffffff8181166000908152600160205260409020548116908b161461174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6e6f7420636f6d6d697474656420696e20746869732065706f636800000000006044820152606401610ada565b866117b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7365637265742063616e6e6f7420626520656d707479000000000000000000006044820152606401610ada565b63ffffffff81166000908152600160208181526040928390209091015491516117e2918d918d918d918d9101612f0b565b604051602081830303815290604052805190602001201461185f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e636f7272656374207365637265742f76616c7565000000000000000000006044820152606401610ada565b63ffffffff81811660008181526001602081905260408083209091019190915560095490517f8f764cf4000000000000000000000000000000000000000000000000000000008152928d166004840152602483019190915233604483015273ffffffffffffffffffffffffffffffffffffffff1690638f764cf490606401602060405180830381600087803b1580156118f757600080fd5b505af115801561190b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192f9190612d5a565b9a9950505050505050505050565b60005460ff166119a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610ada565b600754600190859061ffff166119be8161264a565b63ffffffff168263ffffffff1614611a32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610ada565b611a3b81612656565b6004811115611a73577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836004811115611aac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610ada565b6009546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff1690636022a4859060240160206040518083038186803b158015611b7d57600080fd5b505afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb59190612d5a565b905060008163ffffffff1611611c27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5374616b657220646f6573206e6f7420657869737400000000000000000000006044820152606401610ada565b63ffffffff818116600090815260016020526040902054811690891614611caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6e6f7420636f6d6d697474656420696e20746869732065706f636800000000006044820152606401610ada565b6008546009546040517edd998100000000000000000000000000000000000000000000000000000000815263ffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff9091169062dd99819060240160206040518083038186803b158015611d1a57600080fd5b505afa158015611d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d529190612d26565b1015611dba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f7374616b652062656c6f77206d696e696d756d000000000000000000000000006044820152606401610ada565b84611e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7365637265742063616e6e6f7420626520656d707479000000000000000000006044820152606401610ada565b63ffffffff8116600090815260016020818152604092839020909101549151611e52918b918b918b918b9101612f0b565b6040516020818303038152906040528051906020012014611ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e636f7272656374207365637265742f76616c7565000000000000000000006044820152606401610ada565b63ffffffff81811660009081526001602081815260408084208301849055600290915290912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000016928b16929092178255611f2e910188886129ca565b506009546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015260009173ffffffffffffffffffffffffffffffffffffffff16906305065cd49060240160206040518083038186803b158015611f9f57600080fd5b505afa158015611fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd79190612d26565b63ffffffff8a16600090815260036020526040902054909150611ffb9082906130ff565b63ffffffff8a8116600090815260036020908152604080832094909455600481528382209286168252918252829020839055600554825191820152908101879052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101206005557fdc28da8dd73a7481fa362241d69c6f9d7da770cf42ac4efd533b5ab67937d455906120ae908b9085908c908c904290613038565b60405180910390a1505050505050505050565b63ffffffff81166000908152600260205260408120600101805461ffff8516908110612116577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600591828204019190066006029054906101000a900465ffffffffffff16905092915050565b7f71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb161217181336123c9565b50600855565b600054610100900460ff1680612190575060005460ff16155b6121f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a6564000000006044820152606401610ada565b600054610100900460ff1615801561223557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b600061224181336123c9565b506009805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a8054868416908316179055600b80549285169290911691909117905580156122d357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050565b60408051808201909152600081526060602082015263ffffffff808316600090815260026020908152604091829020825180840184528154909416845260018101805484518185028101850190955280855291938584019390929083018282801561239357602002820191906000526020600020906000905b82829054906101000a900465ffffffffffff1665ffffffffffff16815260200190600601906020826005010492830192600103820291508084116123525790505b5050505050815250509050919050565b6000828152600660205260409020600101546123bf81336123c9565b610a34838361258f565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610aed576124218173ffffffffffffffffffffffffffffffffffffffff1660146126c4565b61242c8360206126c4565b60405160200161243d929190612e8a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610ada91600401612f81565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610aed57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556125313390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610aed57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a08824361312b565b6000806005612665818561312b565b6126759063ffffffff1643613117565b61267f9190613211565b90508060ff1660048111156126bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9392505050565b606060006126d383600261314e565b6126de9060026130ff565b67ffffffffffffffff81111561271d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612747576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061282f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061286b84600261314e565b6128769060016130ff565b90505b6001811115612961577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106128de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061291b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361295a816131dc565b9050612879565b5083156126bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ada565b82805482825590600052602060002090600401600590048101928215612a775791602002820160005b83821115612a4357833565ffffffffffff1683826101000a81548165ffffffffffff021916908365ffffffffffff16021790555092602001926006016020816005010492830192600103026129f3565b8015612a755782816101000a81549065ffffffffffff0219169055600601602081600501049283019260010302612a43565b505b50612a83929150612a87565b5090565b5b80821115612a835760008155600101612a88565b8051612aa781613283565b919050565b60008083601f840112612abd578182fd5b50813567ffffffffffffffff811115612ad4578182fd5b6020830191508360208260051b8501011115612aef57600080fd5b9250929050565b80518015158114612aa757600080fd5b803561ffff81168114612aa757600080fd5b8051612aa7816132a8565b805160ff81168114612aa757600080fd5b600080600060608486031215612b48578283fd5b8335612b5381613283565b92506020840135612b6381613283565b91506040840135612b7381613283565b809150509250925092565b600060208284031215612b8f578081fd5b6126bd82612af6565b600060208284031215612ba9578081fd5b5035919050565b60008060408385031215612bc2578182fd5b823591506020830135612bd481613283565b809150509250929050565b600060208284031215612bf0578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146126bd578182fd5b60006101408284031215612c31578081fd5b612c396130ae565b612c4283612af6565b8152612c5060208401612af6565b6020820152612c6160408401612b23565b6040820152612c7260608401612b18565b6060820152612c8360808401612b18565b6080820152612c9460a08401612a9c565b60a0820152612ca560c08401612a9c565b60c0820152612cb660e08401612b18565b60e0820152610100612cc9818501612b18565b90820152610120928301519281019290925250919050565b600060208284031215612cf2578081fd5b6126bd82612b06565b60008060408385031215612d0d578182fd5b612d1683612b06565b91506020830135612bd4816132a8565b600060208284031215612d37578081fd5b5051919050565b600060208284031215612d4f578081fd5b81356126bd816132a8565b600060208284031215612d6b578081fd5b81516126bd816132a8565b60008060008060608587031215612d8b578182fd5b8435612d96816132a8565b9350602085013567ffffffffffffffff811115612db1578283fd5b612dbd87828801612aac565b9598909750949560400135949350505050565b600080600080600060808688031215612de7578283fd5b8535612df2816132a8565b9450602086013567ffffffffffffffff811115612e0d578384fd5b612e1988828901612aac565b909550935050604086013591506060860135612e3481613283565b809150509295509295909350565b60008060408385031215612e54578182fd5b8235612e5f816132a8565b946020939093013593505050565b60008060408385031215612e7f578182fd5b8235612d16816132a8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612ec28160178501602088016131b0565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351612eff8160288401602088016131b0565b01602801949350505050565b7fffffffff000000000000000000000000000000000000000000000000000000008560e01b16815260006004820185825b86811015612f7057813565ffffffffffff8116808214612f5a578586fd5b8452506020928301929190910190600101612f3c565b505092835250506020019392505050565b6020815260008251806020840152612fa08160408501602087016131b0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252825163ffffffff16828201528281015160408084015280516060840181905260009291820190839060808601905b8083101561302d57835165ffffffffffff168252928401926001929092019190840190613005565b509695505050505050565b63ffffffff868116825285166020808301919091526080604083018190528201849052600090859060a0840190835b8781101561309857833565ffffffffffff8116808214613085578687fd5b8452509281019291810191600101613067565b5050606093909301939093525095945050505050565b604051610140810167ffffffffffffffff811182821017156130f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6000821982111561311257613112613225565b500190565b60008261312657613126613254565b500490565b600063ffffffff8084168061314257613142613254565b92169190910492915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561318657613186613225565b500290565b600063ffffffff838116908316818110156131a8576131a8613225565b039392505050565b60005b838110156131cb5781810151838201526020016131b3565b838111156122d35750506000910152565b6000816131eb576131eb613225565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008261322057613220613254565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146132a557600080fd5b50565b63ffffffff811681146132a557600080fdfea2646970667358221220ee473d66b08a6aa9675589c8ae785ae2e3038a9650f3623c6e9b1449b4b6503d64736f6c63430008040033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|