Contract 0x1240012026278d25761698ff1b42a2b20a4b8725

Contract Overview

Balance:
0 MATIC
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xcd917b84eb7fd75fed1511e7f544bb562390f3b222c8df6db0a6d0f8307c8e01Commit253650152022-03-03 19:04:11115 days 19 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850021.500000015
0xd5c266f0e7390b25b8fbc1dc7aa342ea455148986c191aee37c3ee73f13105ffReveal253647732022-03-03 18:31:07115 days 20 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.500000015
0xd5efdf6656df227a92b88c134a49da9e0ccaa79366147651f2cbc2d428358b74Commit253647162022-03-03 18:23:11115 days 20 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850011.500000012
0x60bd4fed55a5ff499f911e50f649263f5ef149f60ae10f14095e97c6fc3f92e5Reveal253644732022-03-03 17:51:42115 days 20 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125031.500000029
0xe96510cca083c86ee13fcebee1e96db44938de5a5bee52cf5619fb1391a88950Commit253644132022-03-03 17:41:41115 days 21 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850041.500000031
0x9be487a152775a2a78a3feb2a1b215486929ec07bfdd8a56a9aec1a043dd8b10Reveal253641732022-03-03 17:06:58115 days 21 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125031.500000031
0x3e63f17a2539fff7f266e11ecdfbe552d356767714a54954c64e1578b778265cCommit253641142022-03-03 17:00:52115 days 21 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850091.500000063
0xaede2094873e0dfc5afb258b1255540605c68edfbfd425ab78f894f27a8513e7Reveal253638732022-03-03 16:27:33115 days 22 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125091.500000084
0x52c77f75feb575167734b5cd4b3048c5eb4051cc1138b671a45dad4b02691ca1Commit253638152022-03-03 16:19:52115 days 22 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850461.500000319
0x8a831cefbdd24c38cfd4da63b256df65a32777ba491b719d49b8ea7348018f7eReveal253635732022-03-03 15:48:08115 days 23 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125051.500000049
0x544285ed22ac2c24f829d0f2c74e665933e430b9a2598449c34fe468a7153539Commit253635162022-03-03 15:38:52115 days 23 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850021.500000015
0xe0d553aa9310396307b7e6448f23c15d72a12d7354984ba1c5552cc568815302Reveal253632742022-03-03 15:18:39115 days 23 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.500000012
0xde78adf212adc1a05fd95b96010710d1d18a466233fe797b23e5b5dccf7b9f58Commit253632152022-03-03 15:13:43115 days 23 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850011.500000011
0x11a72b4679e8785bf4b5e11ed2a410f1f64554a8d6f4253b7fecf7417c18767dReveal253629752022-03-03 14:53:39115 days 23 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.500000012
0x5f8881d4428b7c00658d64edd76e1fe76f7084f6606543431001a425869a263dCommit253629142022-03-03 14:48:33116 days ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850021.500000014
0x476aa5d518bff1f31f0f3478ea2594b35d0206a9e73426f773ba6034245df7b0Reveal253626742022-03-03 14:28:29116 days 20 mins ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.500000014
0xc73acdcc3d649ae82ea336d86d5ca436007aeaeef3b59d86816ae75668dc3ce4Commit253626152022-03-03 14:23:33116 days 25 mins ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850021.500000017
0xa5553068e8e2be680afee8a9c85fe007c3ff1d55cd177c6d953a54b3b831ad11Reveal253623752022-03-03 14:03:30116 days 45 mins ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.500000017
0x44a9fb8924848c6c9ed90236682c9242704a5b88456228823028b70ea2ba62adCommit253623142022-03-03 13:58:24116 days 51 mins ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850031.500000026
0x24bc4f79054c549cc8f44c0c0f13e942765ae8ded45c9d9dc9b50a009a276019Reveal253620742022-03-03 13:38:20116 days 1 hr ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.500000017
0x24bfcf1df51f38cf5d9b32ec88b80b8dc870c8eb6756cd65792d60e46062c704Commit253620142022-03-03 13:33:19116 days 1 hr ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850041.500000029
0x7578c08d649e14cae0a0a036be0021ac41f1c96c9b498c9eb55c5bb6dc44ead5Reveal253617742022-03-03 13:13:15116 days 1 hr ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.500000011
0x331d65c3617d969137ba0ff287aa1f2c453a2977653614ff3e680fa717d2b260Commit253617152022-03-03 13:08:19116 days 1 hr ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850011.500000012
0xd4dbd43f7ac20ccff4196c6d85de9c3fd4f51bdf38b21ac1f7cfdd8e759f5472Reveal253614742022-03-03 12:48:11116 days 2 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0001756125011.50000001
0x39dff8a01cd3685cd2a531b2c1810ae2444b61c43fcf18bc3541073aa7b04d2dCommit253614152022-03-03 12:43:15116 days 2 hrs ago0x5c34de343480d3e3a7f058fa26dbe28a6bc991c0 IN  0x1240012026278d25761698ff1b42a2b20a4b87250 MATIC0.0002168850011.500000011
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

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)

File 1 of 19 : VoteManager.sol
// 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);
    }
}

File 2 of 19 : IVoteManager.sol
// 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);
}

File 3 of 19 : IStakeManager.sol
// 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);
}

File 4 of 19 : IRewardManager.sol
// 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;
}

File 5 of 19 : IBlockManager.sol
// 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);
}

File 6 of 19 : VoteStorage.sol
// 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;
}

File 7 of 19 : VoteManagerParams.sol
// 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;
    }
}

File 8 of 19 : StateManager.sol
// 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);
    }
}

File 9 of 19 : Initializable.sol
// 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");
        _;
    }
}

File 10 of 19 : Structs.sol
// 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;
    }
}

File 11 of 19 : Constants.sol
// 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;
}

File 12 of 19 : IVoteManagerParams.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

interface IVoteManagerParams {
    function setEpochLength(uint16 _epochLength) external;

    function setMinStake(uint256 _minStake) external;
}

File 13 of 19 : ACL.sol
// 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);
    }
}

File 14 of 19 : AccessControl.sol
// 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());
        }
    }
}

File 15 of 19 : IAccessControl.sol
// 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;
}

File 16 of 19 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 17 of 19 : Strings.sol
// 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);
    }
}

File 18 of 19 : ERC165.sol
// 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;
    }
}

File 19 of 19 : IERC165.sol
// 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);
}

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

Contract ABI

[{"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"}]

60806040526007805461ffff191661012c179055683635c9adc5dea000006008553480156200002d57600080fd5b506200003b60003362000041565b620000f5565b6200004d828262000051565b5050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff166200004d5760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620000b13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6132f080620001056000396000f3fe608060405234801561001057600080fd5b506004361061030a5760003560e01c806365f9780d1161019c578063b6c472b6116100ee578063d547741f11610097578063ef8bf68411610071578063ef8bf6841461090c578063f36c8f5c14610933578063fccc28131461095a57600080fd5b8063d547741f146108b2578063d9169b32146108c5578063da984295146108e557600080fd5b8063c0c53b8b116100c8578063c0c53b8b14610876578063ca0652bf14610889578063cd7480fa146108a957600080fd5b8063b6c472b6146107d7578063ba3ad0901461084d578063bd8595841461086d57600080fd5b80638b5b922d11610150578063a217fddf1161012a578063a217fddf146107a1578063a7a62a10146107a9578063b0b8a8d6146107b157600080fd5b80638b5b922d146107215780638c80fd901461074857806391d148541461075b57600080fd5b80637542ff95116101815780637542ff95146106b3578063776076e7146106d357806389447125146106fa57600080fd5b806365f9780d1461065e57806372dc31a01461068857600080fd5b806338e692a91161026057806348fd8e7b1161020957806357d775f8116101e357806357d775f8146105ca5780635b070278146105eb5780636074c1841461061257600080fd5b806348fd8e7b146105465780634912b72a1461057c5780634d4b56bd146105a357600080fd5b806340f849251161023a57806340f849251461050d57806344772e4a1461052057806345502afa1461053357600080fd5b806338e692a9146104ab5780633bf90e93146104d15780634007ce18146104fa57600080fd5b80632d93b9a0116102c257806336568abe1161029c57806336568abe14610468578063375b3c0a1461047b578063389ed2671461048457600080fd5b80632d93b9a0146104055780632f2ff15d1461042c5780632f50bcc41461044157600080fd5b80630bb34f56116102f35780630bb34f56146103515780630f4ef8a61461038f578063248a9ca3146103d457600080fd5b806301ffc9a71461030f57806305db56df14610337575b600080fd5b61032261031d366004612bdf565b610975565b60405190151581526020015b60405180910390f35b61033f600581565b60405160ff909116815260200161032e565b61037a61035f366004612d3e565b63ffffffff9081166000908152600260205260409020541690565b60405163ffffffff909116815260200161032e565b600a546103af9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032e565b6103f76103e2366004612b98565b60009081526006602052604090206001015490565b60405190815260200161032e565b6103f77fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe581565b61043f61043a366004612bb0565b610a0e565b005b6103f77f46aaf8a125792dfff6db03d74f94fe1acaf55c8cab22f65297c15809c364465c81565b61043f610476366004612bb0565b610a39565b6103f760085481565b6103f77f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b6103f76104b9366004612d3e565b63ffffffff1660009081526003602052604090205490565b61037a6104df366004612d3e565b63ffffffff9081166000908152600160205260409020541690565b61043f610508366004612ce1565b610af1565b61043f61051b366004612e42565b610b52565b61037a61052e366004612dd0565b61135a565b61043f610541366004612d76565b61193d565b6103f7610554366004612e6d565b63ffffffff918216600090815260046020908152604080832093909416825291909152205490565b6103f77f6b7da7a33355c6e035439beb2ac6a052f1558db73f08690b1c9ef5a4e838959781565b6103f77f4cd3070aaa07d03ab33731cbabd0cb27eb9e074a9430ad006c96941d71b77ece81565b6007546105d89061ffff1681565b60405161ffff909116815260200161032e565b6103f77fce3e6c780f179d7a08d28e380f7be9c36d990f56515174f8adb6287c543e30dc81565b610642610620366004612d3e565b6001602081905260009182526040909120805491015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161032e565b61067161066c366004612cfb565b6120c1565b60405165ffffffffffff909116815260200161032e565b6103f7610696366004612e6d565b600460209081526000928352604080842090915290825290205481565b6009546103af9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f77fdbaaaff2c3744aa215ebd99971829e1c1b728703a0bf252f96685d29011fc80481565b6103f77fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe481565b6103f77fed202a1bc048f9b31cb3937bc52e7c8fe76413f0674b9146ff4bcc15612ccbc281565b61043f610756366004612b98565b612146565b610322610769366004612bb0565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6103f7600081565b6005546103f7565b61037a6107bf366004612d3e565b60026020526000908152604090205463ffffffff1681565b61082c6107e5366004612d3e565b6040805180820182526000808252602091820181905263ffffffff938416815260018083529083902083518085019094528054909416835292909201549181019190915290565b60408051825163ffffffff168152602092830151928101929092520161032e565b6103f761085b366004612d3e565b60036020526000908152604090205481565b6105d861271081565b61043f610884366004612b34565b612177565b61089c610897366004612d3e565b6122d9565b60405161032e9190612fd2565b6103f760055481565b61043f6108c0366004612bb0565b6123a3565b600b546103af9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f77f18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f81565b6103f77fcabcaf259dd9a27f23bd8a92bacd65983c2ebf027c853f89f941715905271a8d81565b6103f77f71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb181565b6103af73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610a0857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600082815260066020526040902060010154610a2a81336123c9565b610a34838361249b565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610ae3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b610aed828261258f565b5050565b7f71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb1610b1c81336123c9565b50600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff92909216919091179055565b60005460ff16610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610ada565b600754600090839061ffff16610bd38161264a565b63ffffffff168263ffffffff1614610c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610ada565b610c5081612656565b6004811115610c88577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836004811115610cc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610ada565b83610d8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420636f6d6d69746d656e7400000000000000000000000000006044820152606401610ada565b6009546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff1690636022a4859060240160206040518083038186803b158015610df957600080fd5b505afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190612d5a565b6009546040517feb04d42a00000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015291925073ffffffffffffffffffffffffffffffffffffffff169063eb04d42a906024016101406040518083038186803b158015610ea257600080fd5b505afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190612c1f565b6020015115610f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f564d203a207374616b657220697320736c6173686564000000000000000000006044820152606401610ada565b60008163ffffffff1611610fb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5374616b657220646f6573206e6f7420657869737400000000000000000000006044820152606401610ada565b63ffffffff81811660009081526001602052604090205481169087161415611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f616c726561647920636f6d6d69746564000000000000000000000000000000006044820152606401610ada565b600b5473ffffffffffffffffffffffffffffffffffffffff16638622f3a961106260018961318b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815263ffffffff91909116600482015260240160206040518083038186803b1580156110b757600080fd5b505afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef9190612b7e565b61117d57600b546040517fc9e99c2500000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015273ffffffffffffffffffffffffffffffffffffffff9091169063c9e99c2590602401600060405180830381600087803b15801561116457600080fd5b505af1158015611178573d6000803e3d6000fd5b505050505b600a546040517fc30e36b300000000000000000000000000000000000000000000000000000000815263ffffffff80891660048301528316602482015273ffffffffffffffffffffffffffffffffffffffff9091169063c30e36b390604401600060405180830381600087803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b50506009546040517edd998100000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526000935073ffffffffffffffffffffffffffffffffffffffff909116915062dd99819060240160206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b69190612d26565b905060085481106113515763ffffffff82811660008181526001602081815260409283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000016958d1695861781559091018a9055815193845283019190915281018790524260608201527f3fef0fda4fe059f0c45c029fdcc38e25d08645e8a49d9dd6ea84e09e3ce7d2739060800160405180910390a15b50505050505050565b6000805460ff166113c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610ada565b600754600090879061ffff166113dc8161264a565b63ffffffff168263ffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610ada565b61145981612656565b6004811115611491577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8360048111156114ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610ada565b3373ffffffffffffffffffffffffffffffffffffffff861614156115b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616e7420736e69746368206f6e20796f757273656c660000000000000000006044820152606401610ada565b6009546040517f6022a48500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526000921690636022a4859060240160206040518083038186803b15801561161d57600080fd5b505afa158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190612d5a565b905060008163ffffffff16116116c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5374616b657220646f6573206e6f7420657869737400000000000000000000006044820152606401610ada565b63ffffffff8181166000908152600160205260409020548116908b161461174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6e6f7420636f6d6d697474656420696e20746869732065706f636800000000006044820152606401610ada565b866117b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7365637265742063616e6e6f7420626520656d707479000000000000000000006044820152606401610ada565b63ffffffff81166000908152600160208181526040928390209091015491516117e2918d918d918d918d9101612f0b565b604051602081830303815290604052805190602001201461185f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e636f7272656374207365637265742f76616c7565000000000000000000006044820152606401610ada565b63ffffffff81811660008181526001602081905260408083209091019190915560095490517f8f764cf4000000000000000000000000000000000000000000000000000000008152928d166004840152602483019190915233604483015273ffffffffffffffffffffffffffffffffffffffff1690638f764cf490606401602060405180830381600087803b1580156118f757600080fd5b505af115801561190b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192f9190612d5a565b9a9950505050505050505050565b60005460ff166119a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610ada565b600754600190859061ffff166119be8161264a565b63ffffffff168263ffffffff1614611a32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610ada565b611a3b81612656565b6004811115611a73577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836004811115611aac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610ada565b6009546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff1690636022a4859060240160206040518083038186803b158015611b7d57600080fd5b505afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb59190612d5a565b905060008163ffffffff1611611c27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5374616b657220646f6573206e6f7420657869737400000000000000000000006044820152606401610ada565b63ffffffff818116600090815260016020526040902054811690891614611caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6e6f7420636f6d6d697474656420696e20746869732065706f636800000000006044820152606401610ada565b6008546009546040517edd998100000000000000000000000000000000000000000000000000000000815263ffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff9091169062dd99819060240160206040518083038186803b158015611d1a57600080fd5b505afa158015611d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d529190612d26565b1015611dba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f7374616b652062656c6f77206d696e696d756d000000000000000000000000006044820152606401610ada565b84611e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7365637265742063616e6e6f7420626520656d707479000000000000000000006044820152606401610ada565b63ffffffff8116600090815260016020818152604092839020909101549151611e52918b918b918b918b9101612f0b565b6040516020818303038152906040528051906020012014611ecf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e636f7272656374207365637265742f76616c7565000000000000000000006044820152606401610ada565b63ffffffff81811660009081526001602081815260408084208301849055600290915290912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000016928b16929092178255611f2e910188886129ca565b506009546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015260009173ffffffffffffffffffffffffffffffffffffffff16906305065cd49060240160206040518083038186803b158015611f9f57600080fd5b505afa158015611fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd79190612d26565b63ffffffff8a16600090815260036020526040902054909150611ffb9082906130ff565b63ffffffff8a8116600090815260036020908152604080832094909455600481528382209286168252918252829020839055600554825191820152908101879052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020909101206005557fdc28da8dd73a7481fa362241d69c6f9d7da770cf42ac4efd533b5ab67937d455906120ae908b9085908c908c904290613038565b60405180910390a1505050505050505050565b63ffffffff81166000908152600260205260408120600101805461ffff8516908110612116577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600591828204019190066006029054906101000a900465ffffffffffff16905092915050565b7f71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb161217181336123c9565b50600855565b600054610100900460ff1680612190575060005460ff16155b6121f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f636f6e747261637420616c726561647920696e697469616c697a6564000000006044820152606401610ada565b600054610100900460ff1615801561223557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b600061224181336123c9565b506009805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a8054868416908316179055600b80549285169290911691909117905580156122d357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050565b60408051808201909152600081526060602082015263ffffffff808316600090815260026020908152604091829020825180840184528154909416845260018101805484518185028101850190955280855291938584019390929083018282801561239357602002820191906000526020600020906000905b82829054906101000a900465ffffffffffff1665ffffffffffff16815260200190600601906020826005010492830192600103820291508084116123525790505b5050505050815250509050919050565b6000828152600660205260409020600101546123bf81336123c9565b610a34838361258f565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610aed576124218173ffffffffffffffffffffffffffffffffffffffff1660146126c4565b61242c8360206126c4565b60405160200161243d929190612e8a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610ada91600401612f81565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610aed57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556125313390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610aed57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a08824361312b565b6000806005612665818561312b565b6126759063ffffffff1643613117565b61267f9190613211565b90508060ff1660048111156126bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9392505050565b606060006126d383600261314e565b6126de9060026130ff565b67ffffffffffffffff81111561271d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612747576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061282f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061286b84600261314e565b6128769060016130ff565b90505b6001811115612961577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106128de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061291b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361295a816131dc565b9050612879565b5083156126bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ada565b82805482825590600052602060002090600401600590048101928215612a775791602002820160005b83821115612a4357833565ffffffffffff1683826101000a81548165ffffffffffff021916908365ffffffffffff16021790555092602001926006016020816005010492830192600103026129f3565b8015612a755782816101000a81549065ffffffffffff0219169055600601602081600501049283019260010302612a43565b505b50612a83929150612a87565b5090565b5b80821115612a835760008155600101612a88565b8051612aa781613283565b919050565b60008083601f840112612abd578182fd5b50813567ffffffffffffffff811115612ad4578182fd5b6020830191508360208260051b8501011115612aef57600080fd5b9250929050565b80518015158114612aa757600080fd5b803561ffff81168114612aa757600080fd5b8051612aa7816132a8565b805160ff81168114612aa757600080fd5b600080600060608486031215612b48578283fd5b8335612b5381613283565b92506020840135612b6381613283565b91506040840135612b7381613283565b809150509250925092565b600060208284031215612b8f578081fd5b6126bd82612af6565b600060208284031215612ba9578081fd5b5035919050565b60008060408385031215612bc2578182fd5b823591506020830135612bd481613283565b809150509250929050565b600060208284031215612bf0578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146126bd578182fd5b60006101408284031215612c31578081fd5b612c396130ae565b612c4283612af6565b8152612c5060208401612af6565b6020820152612c6160408401612b23565b6040820152612c7260608401612b18565b6060820152612c8360808401612b18565b6080820152612c9460a08401612a9c565b60a0820152612ca560c08401612a9c565b60c0820152612cb660e08401612b18565b60e0820152610100612cc9818501612b18565b90820152610120928301519281019290925250919050565b600060208284031215612cf2578081fd5b6126bd82612b06565b60008060408385031215612d0d578182fd5b612d1683612b06565b91506020830135612bd4816132a8565b600060208284031215612d37578081fd5b5051919050565b600060208284031215612d4f578081fd5b81356126bd816132a8565b600060208284031215612d6b578081fd5b81516126bd816132a8565b60008060008060608587031215612d8b578182fd5b8435612d96816132a8565b9350602085013567ffffffffffffffff811115612db1578283fd5b612dbd87828801612aac565b9598909750949560400135949350505050565b600080600080600060808688031215612de7578283fd5b8535612df2816132a8565b9450602086013567ffffffffffffffff811115612e0d578384fd5b612e1988828901612aac565b909550935050604086013591506060860135612e3481613283565b809150509295509295909350565b60008060408385031215612e54578182fd5b8235612e5f816132a8565b946020939093013593505050565b60008060408385031215612e7f578182fd5b8235612d16816132a8565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612ec28160178501602088016131b0565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351612eff8160288401602088016131b0565b01602801949350505050565b7fffffffff000000000000000000000000000000000000000000000000000000008560e01b16815260006004820185825b86811015612f7057813565ffffffffffff8116808214612f5a578586fd5b8452506020928301929190910190600101612f3c565b505092835250506020019392505050565b6020815260008251806020840152612fa08160408501602087016131b0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252825163ffffffff16828201528281015160408084015280516060840181905260009291820190839060808601905b8083101561302d57835165ffffffffffff168252928401926001929092019190840190613005565b509695505050505050565b63ffffffff868116825285166020808301919091526080604083018190528201849052600090859060a0840190835b8781101561309857833565ffffffffffff8116808214613085578687fd5b8452509281019291810191600101613067565b5050606093909301939093525095945050505050565b604051610140810167ffffffffffffffff811182821017156130f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6000821982111561311257613112613225565b500190565b60008261312657613126613254565b500490565b600063ffffffff8084168061314257613142613254565b92169190910492915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561318657613186613225565b500290565b600063ffffffff838116908316818110156131a8576131a8613225565b039392505050565b60005b838110156131cb5781810151838201526020016131b3565b838111156122d35750506000910152565b6000816131eb576131eb613225565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008261322057613220613254565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146132a557600080fd5b50565b63ffffffff811681146132a557600080fdfea2646970667358221220ee473d66b08a6aa9675589c8ae785ae2e3038a9650f3623c6e9b1449b4b6503d64736f6c63430008040033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading