ETH Price: $2,330.20 (+0.80%)

Contract

0xEE4d2A71cF479e0D3d0c3c2C923dbfEB57E73111
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Submit Reward Sn...244403272026-02-12 11:13:4733 days ago1770894827IN
Rocket Pool: Rewards Pool 2
0 ETH0.001616593.06968733
Submit Reward Sn...244391792026-02-12 7:23:2333 days ago1770881003IN
Rocket Pool: Rewards Pool 2
0 ETH0.000227331.06652172
Submit Reward Sn...244391582026-02-12 7:19:1133 days ago1770880751IN
Rocket Pool: Rewards Pool 2
0 ETH0.000649643.04779437
Submit Reward Sn...244390992026-02-12 7:07:1133 days ago1770880031IN
Rocket Pool: Rewards Pool 2
0 ETH0.00065163.05699763
Submit Reward Sn...244390332026-02-12 6:53:5933 days ago1770879239IN
Rocket Pool: Rewards Pool 2
0 ETH0.000649993.04944792
Submit Reward Sn...244389122026-02-12 6:29:4733 days ago1770877787IN
Rocket Pool: Rewards Pool 2
0 ETH0.000703223.05413123
Submit Reward Sn...242385972026-01-15 7:24:1161 days ago1768461851IN
Rocket Pool: Rewards Pool 2
0 ETH0.001613553.06404624
Submit Reward Sn...242385522026-01-15 7:14:5961 days ago1768461299IN
Rocket Pool: Rewards Pool 2
0 ETH0.00065023.05075202
Submit Reward Sn...242385372026-01-15 7:11:5961 days ago1768461119IN
Rocket Pool: Rewards Pool 2
0 ETH0.000653463.06606515
Submit Reward Sn...242384872026-01-15 7:01:5961 days ago1768460519IN
Rocket Pool: Rewards Pool 2
0 ETH0.000650843.05375833
Submit Reward Sn...242384712026-01-15 6:58:4761 days ago1768460327IN
Rocket Pool: Rewards Pool 2
0 ETH0.000653683.06707217
Submit Reward Sn...242384632026-01-15 6:57:1161 days ago1768460231IN
Rocket Pool: Rewards Pool 2
0 ETH0.000653693.06714064
Submit Reward Sn...242383792026-01-15 6:40:2361 days ago1768459223IN
Rocket Pool: Rewards Pool 2
0 ETH0.000708663.0780944
Submit Reward Sn...240383052025-12-18 8:29:5989 days ago1766046599IN
Rocket Pool: Rewards Pool 2
0 ETH0.001595343.02946365
Submit Reward Sn...240382602025-12-18 8:20:5989 days ago1766046059IN
Rocket Pool: Rewards Pool 2
0 ETH0.000645633.02931701
Submit Reward Sn...240379802025-12-18 7:24:2389 days ago1766042663IN
Rocket Pool: Rewards Pool 2
0 ETH0.000645583.02909165
Submit Reward Sn...240379332025-12-18 7:14:5989 days ago1766042099IN
Rocket Pool: Rewards Pool 2
0 ETH0.000645553.02891878
Submit Reward Sn...240379042025-12-18 7:09:1189 days ago1766041751IN
Rocket Pool: Rewards Pool 2
0 ETH0.000645323.02788184
Submit Reward Sn...240378732025-12-18 7:02:5989 days ago1766041379IN
Rocket Pool: Rewards Pool 2
0 ETH0.000645453.02847612
Submit Reward Sn...240378492025-12-18 6:58:1189 days ago1766041091IN
Rocket Pool: Rewards Pool 2
0 ETH0.000697243.02846496
Submit Reward Sn...238403452025-11-20 12:47:11117 days ago1763642831IN
Rocket Pool: Rewards Pool 2
0 ETH0.001640733.11559883
Submit Reward Sn...238390722025-11-20 8:29:59117 days ago1763627399IN
Rocket Pool: Rewards Pool 2
0 ETH0.000685493.21616479
Submit Reward Sn...238390242025-11-20 8:20:11117 days ago1763626811IN
Rocket Pool: Rewards Pool 2
0 ETH0.000716983.36392172
Submit Reward Sn...238388062025-11-20 7:35:59117 days ago1763624159IN
Rocket Pool: Rewards Pool 2
0 ETH0.001259195.90781092
Submit Reward Sn...238386952025-11-20 7:13:35117 days ago1763622815IN
Rocket Pool: Rewards Pool 2
0 ETH0.00099954.68942618
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Relay Rewards244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Withdraw Ether244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Withdraw Token244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Withdraw Ether244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Transfer Token244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Set Uint244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Set Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Set Uint244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Rewards Clai...244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Uint244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Add Uint244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Inflation Mint T...244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Member Count244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Node Consens...244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Address244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Set Uint244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Get Uint244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Set Bool244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
Set Bool244403272026-02-12 11:13:4733 days ago1770894827
Rocket Pool: Rewards Pool 2
0 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RocketRewardsPool

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 15000 runs

Other Settings:
default evmVersion, GNU GPLv3 license
/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity 0.8.18;
pragma abicoder v2;

// SPDX-License-Identifier: GPL-3.0-only

import "../RocketBase.sol";
import "../../interface/token/RocketTokenRPLInterface.sol";
import "../../interface/rewards/RocketRewardsPoolInterface.sol";
import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsNetworkInterface.sol";
import "../../interface/dao/node/RocketDAONodeTrustedInterface.sol";
import "../../interface/network/RocketNetworkBalancesInterface.sol";
import "../../interface/RocketVaultInterface.sol";
import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsRewardsInterface.sol";
import "../../interface/rewards/RocketRewardsRelayInterface.sol";
import "../../interface/rewards/RocketSmoothingPoolInterface.sol";
import "../../types/RewardSubmission.sol";

/// @notice Holds RPL generated by the network for claiming from stakers (node operators etc)
contract RocketRewardsPool is RocketBase, RocketRewardsPoolInterface {

    // Events
    event RewardSnapshotSubmitted(address indexed from, uint256 indexed rewardIndex, RewardSubmission submission, uint256 time);
    event RewardSnapshot(uint256 indexed rewardIndex, RewardSubmission submission, uint256 intervalStartTime, uint256 intervalEndTime, uint256 time);

    constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) {
        version = 4;
    }

    /// @notice Get the reward index
    function getRewardIndex() override public view returns(uint256) {
        return getUint(keccak256("rewards.snapshot.index"));
    }

    /// @notice Increment the reward index
    function incrementRewardIndex() private {
        addUint(keccak256("rewards.snapshot.index"), 1);
    }

    /// @notice Get how much RPL the Rewards Pool contract currently has assigned to it as a whole
    /// @return uint256 Returns rpl balance of rocket rewards contract
    function getRPLBalance() override public view returns(uint256) {
        // Get the vault contract instance
        RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
        // Check contract RPL balance
        return rocketVault.balanceOfToken("rocketRewardsPool", IERC20(getContractAddress("rocketTokenRPL")));
    }

    /// @notice Returns the total amount of RPL that needs to be distributed to claimers at the current block
    function getPendingRPLRewards() override public view returns (uint256) {
        RocketTokenRPLInterface rplContract = RocketTokenRPLInterface(getContractAddress("rocketTokenRPL"));
        uint256 pendingInflation = rplContract.inflationCalculate();
        // Any inflation that has accrued so far plus any amount that would be minted if we called it now
        return getRPLBalance() + pendingInflation;
    }

    /// @notice  Returns the total amount of ETH in the smoothing pool ready to be distributed
    function getPendingETHRewards() override public view returns (uint256) {
        address rocketSmoothingPoolAddress = getContractAddress("rocketSmoothingPool");
        return rocketSmoothingPoolAddress.balance;
    }

    /// @notice Get the last set interval start time
    /// @return uint256 Last set start timestamp for a claim interval
    function getClaimIntervalTimeStart() override public view returns(uint256) {
        return getUint(keccak256("rewards.pool.claim.interval.time.start"));
    }

    /// @notice Get how many seconds in a claim interval
    /// @return uint256 Number of seconds in a claim interval
    function getClaimIntervalTime() override public view returns(uint256) {
        // Get from the DAO settings
        RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
        return daoSettingsRewards.getRewardsClaimIntervalTime();
    }

    /// @notice Compute intervals since last claim period
    /// @return uint256 Time intervals since last update
    function getClaimIntervalsPassed() override public view returns(uint256) {
        return (block.timestamp - getClaimIntervalTimeStart()) / getClaimIntervalTime();
    }

    /// @notice Returns the block number that the given claim interval was executed at
    /// @param _interval The interval for which to grab the execution block of
    function getClaimIntervalExecutionBlock(uint256 _interval) override external view returns(uint256) {
        return getUint(keccak256(abi.encodePacked("rewards.pool.interval.execution.block", _interval)));
    }

    /// @notice Returns the address of the contract which was used to execute this reward interval
    /// @param _interval The interval for which to grab the address of
    function getClaimIntervalExecutionAddress(uint256 _interval) override external view returns(address) {
        return getAddress(keccak256(abi.encodePacked("rewards.pool.interval.execution.address", _interval)));
    }

    /// @notice Get the percentage this contract can claim in this interval
    /// @return uint256 Rewards percentage this contract can claim in this interval
    function getClaimingContractPerc(string memory _claimingContract) override public view returns (uint256) {
        // Load contract
        RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
        // Get the % amount allocated to this claim contract
        return daoSettingsRewards.getRewardsClaimerPerc(_claimingContract);
    }

    /// @notice Get an array of percentages that the given contracts can claim in this interval
    /// @return uint256[] Array of percentages in the order of the supplied contract names
    function getClaimingContractsPerc(string[] memory _claimingContracts) override external view returns (uint256[] memory) {
        // Load contract
        RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
        // Get the % amount allocated to this claim contract
        uint256[] memory percentages = new uint256[](_claimingContracts.length);
        for (uint256 i = 0; i < _claimingContracts.length; ++i){
            percentages[i] = daoSettingsRewards.getRewardsClaimerPerc(_claimingContracts[i]);
        }
        return percentages;
    }

    /// @notice Returns whether a trusted node has submitted for a given reward index
    function getTrustedNodeSubmitted(address _trustedNodeAddress, uint256 _rewardIndex) override external view returns (bool) {
        return getBool(keccak256(abi.encode("rewards.snapshot.submitted.node", _trustedNodeAddress, _rewardIndex)));
    }

    /// @notice Returns whether a trusted node has submitted a specific RewardSubmission
    function getSubmissionFromNodeExists(address _trustedNodeAddress, RewardSubmission calldata _submission) override external view returns (bool) {
        return getBool(keccak256(abi.encode("rewards.snapshot.submitted.node.key", _trustedNodeAddress, _submission)));
    }

    /// @notice Returns the number of trusted nodes who have agreed to the given submission
    function getSubmissionCount(RewardSubmission calldata _submission) override external view returns (uint256) {
        return getUint(keccak256(abi.encode("rewards.snapshot.submitted.count", _submission)));
    }

    /// @notice Submit a reward snapshot. Only accepts calls from trusted (oracle) nodes
    function submitRewardSnapshot(RewardSubmission calldata _submission) override external onlyLatestContract("rocketRewardsPool", address(this)) onlyTrustedNode(msg.sender) {
        // Get contracts
        RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
        // Check submission is currently enabled
        require(rocketDAOProtocolSettingsNetwork.getSubmitRewardsEnabled(), "Submitting rewards is currently disabled");
        // Validate inputs
        uint256 rewardIndex = getRewardIndex();
        require(_submission.rewardIndex <= rewardIndex, "Can only submit snapshot for periods up to next");
        require(_submission.intervalsPassed > 0, "Invalid number of intervals passed");
        require(_submission.nodeRPL.length == _submission.trustedNodeRPL.length && _submission.trustedNodeRPL.length == _submission.nodeETH.length, "Invalid array length");
        // Calculate RPL reward total and validate
        { // Scope to prevent stack too deep
            uint256 totalRewardsRPL = _submission.treasuryRPL;
            for (uint256 i = 0; i < _submission.nodeRPL.length; ++i){
                totalRewardsRPL = totalRewardsRPL + _submission.nodeRPL[i];
            }
            for (uint256 i = 0; i < _submission.trustedNodeRPL.length; ++i){
                totalRewardsRPL = totalRewardsRPL + _submission.trustedNodeRPL[i];
            }
            require(totalRewardsRPL <= getPendingRPLRewards(), "Invalid RPL rewards");
        }
        // Calculate ETH reward total and validate
        { // Scope to prevent stack too deep
            uint256 totalRewardsETH = 0;
            for (uint256 i = 0; i < _submission.nodeETH.length; ++i){
                totalRewardsETH = totalRewardsETH + _submission.nodeETH[i];
            }
            require(totalRewardsETH <= getPendingETHRewards(), "Invalid ETH rewards");
        }
        // Store and increment vote
        uint256 submissionCount;
        { // Scope to prevent stack too deep
            // Check & update node submission status
            bytes32 nodeSubmissionKey = keccak256(abi.encode("rewards.snapshot.submitted.node.key", msg.sender, _submission));
            require(!getBool(nodeSubmissionKey), "Duplicate submission from node");
            setBool(nodeSubmissionKey, true);
            setBool(keccak256(abi.encode("rewards.snapshot.submitted.node", msg.sender, _submission.rewardIndex)), true);
        }
        { // Scope to prevent stack too deep
            // Increment submission count
            bytes32 submissionCountKey = keccak256(abi.encode("rewards.snapshot.submitted.count", _submission));
            submissionCount = getUint(submissionCountKey) + 1;
            setUint(submissionCountKey, submissionCount);
        }
        // Emit snapshot submitted event
        emit RewardSnapshotSubmitted(msg.sender, _submission.rewardIndex, _submission, block.timestamp);
        // Return if already executed
        if (_submission.rewardIndex != rewardIndex) {
            return;
        }
        // If consensus is reached, execute the snapshot
        RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
        if (calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold()) {
            _executeRewardSnapshot(_submission);
        }
    }

    /// @notice Executes reward snapshot if consensus threshold is reached
    function executeRewardSnapshot(RewardSubmission calldata _submission) override external onlyLatestContract("rocketRewardsPool", address(this)) {
        // Validate reward index of submission
        require(_submission.rewardIndex == getRewardIndex(), "Can only execute snapshot for next period");
        // Get submission count
        bytes32 submissionCountKey = keccak256(abi.encode("rewards.snapshot.submitted.count", _submission));
        uint256 submissionCount = getUint(submissionCountKey);
        // Confirm consensus and execute
        RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
        RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
        require(calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold(), "Consensus has not been reached");
        _executeRewardSnapshot(_submission);
    }

    /// @notice Executes reward snapshot and sends assets to the relays for distribution to reward recipients
    function _executeRewardSnapshot(RewardSubmission calldata _submission) private {
        // Get contract
        RocketTokenRPLInterface rplContract = RocketTokenRPLInterface(getContractAddress("rocketTokenRPL"));
        RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
        // Execute inflation if required
        rplContract.inflationMintTokens();
        // Increment the reward index and update the claim interval timestamp
        incrementRewardIndex();
        uint256 claimIntervalTimeStart = getClaimIntervalTimeStart();
        uint256 claimIntervalTimeEnd = claimIntervalTimeStart + (getClaimIntervalTime() * _submission.intervalsPassed);
        // Emit reward snapshot event
        emit RewardSnapshot(_submission.rewardIndex, _submission, claimIntervalTimeStart, claimIntervalTimeEnd, block.timestamp);
        setUint(keccak256(abi.encodePacked("rewards.pool.interval.execution.block", _submission.rewardIndex)), block.number);
        setAddress(keccak256(abi.encodePacked("rewards.pool.interval.execution.address", _submission.rewardIndex)), address(this));
        setUint(keccak256("rewards.pool.claim.interval.time.start"), claimIntervalTimeEnd);
        // Send out the treasury rewards
        if (_submission.treasuryRPL > 0) {
            rocketVault.transferToken("rocketClaimDAO", rplContract, _submission.treasuryRPL);
        }
        // Get the smoothing pool instance
        RocketSmoothingPoolInterface rocketSmoothingPool = RocketSmoothingPoolInterface(getContractAddress("rocketSmoothingPool"));
        // Send deposit pool user's ETH
        if (_submission.userETH > 0) {
            address rocketTokenRETHAddress = getContractAddress("rocketTokenRETH");
            rocketSmoothingPool.withdrawEther(rocketTokenRETHAddress, _submission.userETH);
        }
        // Loop over each network and distribute rewards
        for (uint i = 0; i < _submission.nodeRPL.length; ++i) {
            // Quick out if no rewards for this network
            uint256 rewardsRPL = _submission.nodeRPL[i] + _submission.trustedNodeRPL[i];
            uint256 rewardsETH = _submission.nodeETH[i];
            if (rewardsRPL == 0 && rewardsETH == 0) {
                continue;
            }
            // Grab the relay address
            RocketRewardsRelayInterface relay;
            { // Scope to prevent stack too deep
                address networkRelayAddress;
                bytes32 networkRelayKey = keccak256(abi.encodePacked("rewards.relay.address", i));
                networkRelayAddress = getAddress(networkRelayKey);
                // Validate network is valid
                require (networkRelayAddress != address(0), "Snapshot contains rewards for invalid network");
                relay = RocketRewardsRelayInterface(networkRelayAddress);
            }
            // Transfer rewards
            if (rewardsRPL > 0) {
                // RPL rewards are withdrawn from the vault
                rocketVault.withdrawToken(address(relay), rplContract, rewardsRPL);
            }
            if (rewardsETH > 0) {
                // ETH rewards are withdrawn from the smoothing pool
                rocketSmoothingPool.withdrawEther(address(relay), rewardsETH);
            }
            // Call into relay contract to handle distribution of rewards
            relay.relayRewards(_submission.rewardIndex, _submission.merkleRoot, rewardsRPL, rewardsETH);
        }
    }
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;

// SPDX-License-Identifier: GPL-3.0-only

interface RocketStorageInterface {

    // Deploy status
    function getDeployedStatus() external view returns (bool);

    // Guardian
    function getGuardian() external view returns(address);
    function setGuardian(address _newAddress) external;
    function confirmGuardian() external;

    // Getters
    function getAddress(bytes32 _key) external view returns (address);
    function getUint(bytes32 _key) external view returns (uint);
    function getString(bytes32 _key) external view returns (string memory);
    function getBytes(bytes32 _key) external view returns (bytes memory);
    function getBool(bytes32 _key) external view returns (bool);
    function getInt(bytes32 _key) external view returns (int);
    function getBytes32(bytes32 _key) external view returns (bytes32);

    // Setters
    function setAddress(bytes32 _key, address _value) external;
    function setUint(bytes32 _key, uint _value) external;
    function setString(bytes32 _key, string calldata _value) external;
    function setBytes(bytes32 _key, bytes calldata _value) external;
    function setBool(bytes32 _key, bool _value) external;
    function setInt(bytes32 _key, int _value) external;
    function setBytes32(bytes32 _key, bytes32 _value) external;

    // Deleters
    function deleteAddress(bytes32 _key) external;
    function deleteUint(bytes32 _key) external;
    function deleteString(bytes32 _key) external;
    function deleteBytes(bytes32 _key) external;
    function deleteBool(bytes32 _key) external;
    function deleteInt(bytes32 _key) external;
    function deleteBytes32(bytes32 _key) external;

    // Arithmetic
    function addUint(bytes32 _key, uint256 _amount) external;
    function subUint(bytes32 _key, uint256 _amount) external;

    // Protected storage
    function getNodeWithdrawalAddress(address _nodeAddress) external view returns (address);
    function getNodePendingWithdrawalAddress(address _nodeAddress) external view returns (address);
    function setWithdrawalAddress(address _nodeAddress, address _newWithdrawalAddress, bool _confirm) external;
    function confirmWithdrawalAddress(address _nodeAddress) external;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;

// SPDX-License-Identifier: GPL-3.0-only

import "../interface/RocketStorageInterface.sol";

/// @title Base settings / modifiers for each contract in Rocket Pool
/// @author David Rugendyke

abstract contract RocketBase {

    // Calculate using this as the base
    uint256 constant calcBase = 1 ether;

    // Version of the contract
    uint8 public version;

    // The main storage contract where primary persistant storage is maintained
    RocketStorageInterface rocketStorage = RocketStorageInterface(address(0));


    /*** Modifiers **********************************************************/

    /**
    * @dev Throws if called by any sender that doesn't match a Rocket Pool network contract
    */
    modifier onlyLatestNetworkContract() {
        require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract");
        _;
    }

    /**
    * @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract
    */
    modifier onlyLatestContract(string memory _contractName, address _contractAddress) {
        require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract");
        _;
    }

    /**
    * @dev Throws if called by any sender that isn't a registered node
    */
    modifier onlyRegisteredNode(address _nodeAddress) {
        require(getBool(keccak256(abi.encodePacked("node.exists", _nodeAddress))), "Invalid node");
        _;
    }

    /**
    * @dev Throws if called by any sender that isn't a trusted node DAO member
    */
    modifier onlyTrustedNode(address _nodeAddress) {
        require(getBool(keccak256(abi.encodePacked("dao.trustednodes.", "member", _nodeAddress))), "Invalid trusted node");
        _;
    }

    /**
    * @dev Throws if called by any sender that isn't a registered minipool
    */
    modifier onlyRegisteredMinipool(address _minipoolAddress) {
        require(getBool(keccak256(abi.encodePacked("minipool.exists", _minipoolAddress))), "Invalid minipool");
        _;
    }
    

    /**
    * @dev Throws if called by any account other than a guardian account (temporary account allowed access to settings before DAO is fully enabled)
    */
    modifier onlyGuardian() {
        require(msg.sender == rocketStorage.getGuardian(), "Account is not a temporary guardian");
        _;
    }




    /*** Methods **********************************************************/

    /// @dev Set the main Rocket Storage address
    constructor(RocketStorageInterface _rocketStorageAddress) {
        // Update the contract address
        rocketStorage = RocketStorageInterface(_rocketStorageAddress);
    }


    /// @dev Get the address of a network contract by name
    function getContractAddress(string memory _contractName) internal view returns (address) {
        // Get the current contract address
        address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
        // Check it
        require(contractAddress != address(0x0), "Contract not found");
        // Return
        return contractAddress;
    }


    /// @dev Get the address of a network contract by name (returns address(0x0) instead of reverting if contract does not exist)
    function getContractAddressUnsafe(string memory _contractName) internal view returns (address) {
        // Get the current contract address
        address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
        // Return
        return contractAddress;
    }


    /// @dev Get the name of a network contract by address
    function getContractName(address _contractAddress) internal view returns (string memory) {
        // Get the contract name
        string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress)));
        // Check it
        require(bytes(contractName).length > 0, "Contract not found");
        // Return
        return contractName;
    }

    /// @dev Get revert error message from a .call method
    function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return "Transaction reverted silently";
        assembly {
            // Slice the sighash.
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }



    /*** Rocket Storage Methods ****************************************/

    // Note: Unused helpers have been removed to keep contract sizes down

    /// @dev Storage get methods
    function getAddress(bytes32 _key) internal view returns (address) { return rocketStorage.getAddress(_key); }
    function getUint(bytes32 _key) internal view returns (uint) { return rocketStorage.getUint(_key); }
    function getString(bytes32 _key) internal view returns (string memory) { return rocketStorage.getString(_key); }
    function getBytes(bytes32 _key) internal view returns (bytes memory) { return rocketStorage.getBytes(_key); }
    function getBool(bytes32 _key) internal view returns (bool) { return rocketStorage.getBool(_key); }
    function getInt(bytes32 _key) internal view returns (int) { return rocketStorage.getInt(_key); }
    function getBytes32(bytes32 _key) internal view returns (bytes32) { return rocketStorage.getBytes32(_key); }

    /// @dev Storage set methods
    function setAddress(bytes32 _key, address _value) internal { rocketStorage.setAddress(_key, _value); }
    function setUint(bytes32 _key, uint _value) internal { rocketStorage.setUint(_key, _value); }
    function setString(bytes32 _key, string memory _value) internal { rocketStorage.setString(_key, _value); }
    function setBytes(bytes32 _key, bytes memory _value) internal { rocketStorage.setBytes(_key, _value); }
    function setBool(bytes32 _key, bool _value) internal { rocketStorage.setBool(_key, _value); }
    function setInt(bytes32 _key, int _value) internal { rocketStorage.setInt(_key, _value); }
    function setBytes32(bytes32 _key, bytes32 _value) internal { rocketStorage.setBytes32(_key, _value); }

    /// @dev Storage delete methods
    function deleteAddress(bytes32 _key) internal { rocketStorage.deleteAddress(_key); }
    function deleteUint(bytes32 _key) internal { rocketStorage.deleteUint(_key); }
    function deleteString(bytes32 _key) internal { rocketStorage.deleteString(_key); }
    function deleteBytes(bytes32 _key) internal { rocketStorage.deleteBytes(_key); }
    function deleteBool(bytes32 _key) internal { rocketStorage.deleteBool(_key); }
    function deleteInt(bytes32 _key) internal { rocketStorage.deleteInt(_key); }
    function deleteBytes32(bytes32 _key) internal { rocketStorage.deleteBytes32(_key); }

    /// @dev Storage arithmetic methods
    function addUint(bytes32 _key, uint256 _amount) internal { rocketStorage.addUint(_key, _amount); }
    function subUint(bytes32 _key, uint256 _amount) internal { rocketStorage.subUint(_key, _amount); }
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity >0.5.0 <0.9.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;

// SPDX-License-Identifier: GPL-3.0-only

import "../util/IERC20.sol";

interface RocketTokenRPLInterface is IERC20 {
    function getInflationCalcTime() external view returns(uint256);
    function getInflationIntervalTime() external view returns(uint256);
    function getInflationIntervalRate() external view returns(uint256);
    function getInflationIntervalsPassed() external view returns(uint256);
    function getInflationIntervalStartTime() external view returns(uint256);
    function getInflationRewardsContractAddress() external view returns(address);
    function inflationCalculate() external view returns (uint256);
    function inflationMintTokens() external returns (uint256);
    function swapTokens(uint256 _amount) external;
}

File 6 of 15 : RewardSubmission.sol
/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;

// SPDX-License-Identifier: GPL-3.0-only

struct RewardSubmission {
    uint256 rewardIndex;
    uint256 executionBlock;
    uint256 consensusBlock;
    bytes32 merkleRoot;
    string merkleTreeCID;
    uint256 intervalsPassed;
    uint256 treasuryRPL;
    uint256[] trustedNodeRPL;
    uint256[] nodeRPL;
    uint256[] nodeETH;
    uint256 userETH;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;

import "../../types/RewardSubmission.sol";

// SPDX-License-Identifier: GPL-3.0-only

interface RocketRewardsPoolInterface {
    function getRewardIndex() external view returns(uint256);
    function getRPLBalance() external view returns(uint256);
    function getPendingRPLRewards() external view returns (uint256);
    function getPendingETHRewards() external view returns (uint256);
    function getClaimIntervalTimeStart() external view returns(uint256);
    function getClaimIntervalTime() external view returns(uint256);
    function getClaimIntervalsPassed() external view returns(uint256);
    function getClaimIntervalExecutionBlock(uint256 _interval) external view returns(uint256);
    function getClaimIntervalExecutionAddress(uint256 _interval) external view returns(address);
    function getClaimingContractPerc(string memory _claimingContract) external view returns(uint256);
    function getClaimingContractsPerc(string[] memory _claimingContracts) external view returns (uint256[] memory);
    function getTrustedNodeSubmitted(address _trustedNodeAddress, uint256 _rewardIndex) external view returns (bool);
    function getSubmissionFromNodeExists(address _trustedNodeAddress, RewardSubmission calldata _submission) external view returns (bool);
    function getSubmissionCount(RewardSubmission calldata _submission) external view returns (uint256);
    function submitRewardSnapshot(RewardSubmission calldata _submission) external;
    function executeRewardSnapshot(RewardSubmission calldata _submission) external;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;

// SPDX-License-Identifier: GPL-3.0-only

interface RocketDAOProtocolSettingsNetworkInterface {
    function getNodeConsensusThreshold() external view returns (uint256);
    function getNodePenaltyThreshold() external view returns (uint256);
    function getPerPenaltyRate() external view returns (uint256);
    function getSubmitBalancesEnabled() external view returns (bool);
    function getSubmitBalancesFrequency() external view returns (uint256);
    function getSubmitPricesEnabled() external view returns (bool);
    function getSubmitPricesFrequency() external view returns (uint256);
    function getMinimumNodeFee() external view returns (uint256);
    function getTargetNodeFee() external view returns (uint256);
    function getMaximumNodeFee() external view returns (uint256);
    function getNodeFeeDemandRange() external view returns (uint256);
    function getTargetRethCollateralRate() external view returns (uint256);
    function getRethDepositDelay() external view returns (uint256);
    function getSubmitRewardsEnabled() external view returns (bool);
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;

// SPDX-License-Identifier: GPL-3.0-only

interface RocketDAONodeTrustedInterface {
    function getBootstrapModeDisabled() external view returns (bool);
    function getMemberQuorumVotesRequired() external view returns (uint256);
    function getMemberAt(uint256 _index) external view returns (address);
    function getMemberCount() external view returns (uint256);
    function getMemberMinRequired() external view returns (uint256);
    function getMemberIsValid(address _nodeAddress) external view returns (bool);
    function getMemberLastProposalTime(address _nodeAddress) external view returns (uint256);
    function getMemberID(address _nodeAddress) external view returns (string memory);
    function getMemberUrl(address _nodeAddress) external view returns (string memory);
    function getMemberJoinedTime(address _nodeAddress) external view returns (uint256);
    function getMemberProposalExecutedTime(string memory _proposalType, address _nodeAddress) external view returns (uint256);
    function getMemberRPLBondAmount(address _nodeAddress) external view returns (uint256);
    function getMemberIsChallenged(address _nodeAddress) external view returns (bool);
    function getMemberUnbondedValidatorCount(address _nodeAddress) external view returns (uint256);
    function incrementMemberUnbondedValidatorCount(address _nodeAddress) external;
    function decrementMemberUnbondedValidatorCount(address _nodeAddress) external;
    function bootstrapMember(string memory _id, string memory _url, address _nodeAddress) external;
    function bootstrapSettingUint(string memory _settingContractName, string memory _settingPath, uint256 _value) external;
    function bootstrapSettingBool(string memory _settingContractName, string memory _settingPath, bool _value) external;
    function bootstrapUpgrade(string memory _type, string memory _name, string memory _contractAbi, address _contractAddress) external;
    function bootstrapDisable(bool _confirmDisableBootstrapMode) external;
    function memberJoinRequired(string memory _id, string memory _url) external;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
// SPDX-License-Identifier: GPL-3.0-only

interface RocketNetworkBalancesInterface {
    function getBalancesBlock() external view returns (uint256);
    function getTotalETHBalance() external view returns (uint256);
    function getStakingETHBalance() external view returns (uint256);
    function getTotalRETHSupply() external view returns (uint256);
    function getETHUtilizationRate() external view returns (uint256);
    function submitBalances(uint256 _block, uint256 _slotTimestamp, uint256 _total, uint256 _staking, uint256 _rethSupply) external;
    function executeUpdateBalances(uint256 _block, uint256 _slotTimestamp, uint256 _totalEth, uint256 _stakingEth, uint256 _rethSupply) external;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

import "./IERC20.sol";

pragma solidity >0.5.0 <0.9.0;

interface IERC20Burnable is IERC20 {
    function burn(uint256 amount) external;
    function burnFrom(address account, uint256 amount) external;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

pragma solidity >0.5.0 <0.9.0;

// SPDX-License-Identifier: GPL-3.0-only
import "./util/IERC20Burnable.sol";

interface RocketVaultInterface {
    function balanceOf(string memory _networkContractName) external view returns (uint256);
    function depositEther() external payable;
    function withdrawEther(uint256 _amount) external;
    function depositToken(string memory _networkContractName, IERC20 _tokenAddress, uint256 _amount) external;
    function withdrawToken(address _withdrawalAddress, IERC20 _tokenAddress, uint256 _amount) external;
    function balanceOfToken(string memory _networkContractName, IERC20 _tokenAddress) external view returns (uint256);
    function transferToken(string memory _networkContractName, IERC20 _tokenAddress, uint256 _amount) external;
    function burnToken(IERC20Burnable _tokenAddress, uint256 _amount) external;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;

interface RocketDAOProtocolSettingsRewardsInterface {
    function setSettingRewardsClaimers(uint256 _trustedNodePercent, uint256 _protocolPercent, uint256 _nodePercent) external;
    function getRewardsClaimerPerc(string memory _contractName) external view returns (uint256);
    function getRewardsClaimersPerc() external view returns (uint256 _trustedNodePercent, uint256 _protocolPercent, uint256 _nodePercent);
    function getRewardsClaimersTrustedNodePerc() external view returns (uint256);
    function getRewardsClaimersProtocolPerc() external view returns (uint256);
    function getRewardsClaimersNodePerc() external view returns (uint256);
    function getRewardsClaimersTimeUpdated() external view returns (uint256);
    function getRewardsClaimIntervalPeriods() external view returns (uint256);
    function getRewardsClaimIntervalTime() external view returns (uint256);
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;

interface RocketRewardsRelayInterface {
    function relayRewards(uint256 _intervalIndex, bytes32 _merkleRoot, uint256 _rewardsRPL, uint256 _rewardsETH) external;
    function claim(address _nodeAddress, uint256[] calldata _intervalIndex, uint256[] calldata _amountRPL, uint256[] calldata _amountETH, bytes32[][] calldata _merkleProof) external;
    function claimAndStake(address _nodeAddress, uint256[] calldata _intervalIndex, uint256[] calldata _amountRPL, uint256[] calldata _amountETH, bytes32[][] calldata _merkleProof, uint256 _stakeAmount) external;
    function isClaimed(uint256 _intervalIndex, address _claimer) external view returns (bool);
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    DECENTRALISED STAKING PROTOCOL FOR ETHEREUM    |
   * +---------------------------------------------------+
   *
   *  Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
   *  be community-owned, decentralised, permissionless, & trustless.
   *
   *  For more information about Rocket Pool, visit https://rocketpool.net
   *
   *  Authored by the Rocket Pool Core Team
   *  Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
   *  A special thanks to the Rocket Pool community for all their contributions.
   *
   */

// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;

interface RocketSmoothingPoolInterface {
    function withdrawEther(address _to, uint256 _amount) external;
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract RocketStorageInterface","name":"_rocketStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"indexed":false,"internalType":"struct RewardSubmission","name":"submission","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"intervalStartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"intervalEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RewardSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"indexed":false,"internalType":"struct RewardSubmission","name":"submission","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RewardSnapshotSubmitted","type":"event"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"executeRewardSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"getClaimIntervalExecutionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"getClaimIntervalExecutionBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalTimeStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalsPassed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_claimingContract","type":"string"}],"name":"getClaimingContractPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_claimingContracts","type":"string[]"}],"name":"getClaimingContractsPerc","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingETHRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingRPLRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRPLBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"getSubmissionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedNodeAddress","type":"address"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"getSubmissionFromNodeExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedNodeAddress","type":"address"},{"internalType":"uint256","name":"_rewardIndex","type":"uint256"}],"name":"getTrustedNodeSubmitted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"submitRewardSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

608060405260008054610100600160a81b03191690553480156200002257600080fd5b5060405162002e4c38038062002e4c83398101604081905262000045916200007a565b6000805460ff196001600160a01b0390931661010002929092166001600160a81b0319909216919091176004179055620000ac565b6000602082840312156200008d57600080fd5b81516001600160a01b0381168114620000a557600080fd5b9392505050565b612d9080620000bc6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80637425f1e7116100b2578063ba34cb4b11610081578063e51920d311610066578063e51920d31461024b578063f21c150c1461025e578063f6a3f6ef1461026657600080fd5b8063ba34cb4b14610223578063cdfd4e1c1461022b57600080fd5b80637425f1e7146101c8578063ab772cb1146101d0578063b0aa28de146101e3578063b81bda511461021b57600080fd5b806347e884ef116100ee57806347e884ef1461017957806350a2f7e51461018e57806354fd4d50146101965780635d3e8ffa146101b557600080fd5b8063043877d014610120578063204e2a0a1461013b5780632198e62c1461015e5780633bfae5d914610166575b600080fd5b610128610279565b6040519081526020015b60405180910390f35b61014e610149366004612435565b6102a4565b6040519015158152602001610132565b610128610335565b61014e61017436600461247a565b61049b565b61018c6101873660046124ca565b6104b3565b005b610128610879565b6000546101a39060ff1681565b60405160ff9091168152602001610132565b61018c6101c33660046124ca565b610907565b6101286112fc565b6101286101de366004612507565b6113cc565b6101f66101f1366004612507565b61144f565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610132565b6101286114b7565b610128611515565b61023e61023936600461262c565b611540565b60405161013291906126ef565b6101286102593660046124ca565b6116a0565b6101286116b6565b610128610274366004612733565b6116e1565b6000610283610879565b61028b611515565b6102959042612797565b61029f91906127aa565b905090565b600061032c83836040516020016103119291906060808252601f908201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff929092166020830152604082015260a00190565b604051602081830303815290604052805190602001206117bf565b90505b92915050565b6000806103766040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff1663eccefff66103d26040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526004810191909152601160448201527f726f636b657452657761726473506f6f6c000000000000000000000000000000606482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152608401602060405180830381865afa158015610471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049591906127e5565b91505090565b600061032c8383604051602001610311929190612a47565b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610519826040516020016104fe9190612af4565b604051602081830303815290604052805190602001206118ed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064015b60405180910390fd5b6105ba6116b6565b833514610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f64000000000000000000000000000000000000000000000060648201526084016105a9565b60008360405160200161065c9190612b39565b604051602081830303815290604052805190602001209050600061067f82611985565b905060006106c16040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b905060006107036040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077491906127e5565b8273ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e391906127e5565b6107f585670de0b6b3a7640000612b80565b6107ff91906127aa565b1015610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e2072656163686564000060448201526064016105a9565b61087087611a1d565b50505050505050565b6000806108ba6040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166394e5d5126040518163ffffffff1660e01b8152600401602060405180830381865afa158015610471573d6000803e3d6000fd5b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610952826040516020016104fe9190612af4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064016105a9565b33610a728160405160200161031191907f64616f2e747275737465646e6f6465732e00000000000000000000000000000081527f6d656d6265720000000000000000000000000000000000000000000000000000601182015260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166017820152602b0190565b610ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f646500000000000000000000000060448201526064016105a9565b6000610b186040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166363ed62da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190612b97565b610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c656400000000000000000000000000000000000000000000000060648201526084016105a9565b6000610c1f6116b6565b90508535811015610cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e657874000000000000000000000000000000000060648201526084016105a9565b60008660a0013511610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f656400000000000000000000000000000000000000000000000000000000000060648201526084016105a9565b610d5360e0870187612bb9565b9050610d63610100880188612bb9565b9050148015610d8e5750610d7b610120870187612bb9565b9050610d8a60e0880188612bb9565b9050145b610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e67746800000000000000000000000060448201526064016105a9565b60c086013560005b610e0a610100890189612bb9565b9050811015610e5557610e21610100890189612bb9565b82818110610e3157610e31612c21565b9050602002013582610e439190612c50565b9150610e4e81612c63565b9050610dfc565b5060005b610e6660e0890189612bb9565b9050811015610eb057610e7c60e0890189612bb9565b82818110610e8c57610e8c612c21565b9050602002013582610e9e9190612c50565b9150610ea981612c63565b9050610e59565b50610eb96112fc565b811115610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c20726577617264730000000000000000000000000060448201526064016105a9565b506000805b610f35610120890189612bb9565b9050811015610f8057610f4c610120890189612bb9565b82818110610f5c57610f5c612c21565b9050602002013582610f6e9190612c50565b9150610f7981612c63565b9050610f27565b50610f896114b7565b811115610ff2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642045544820726577617264730000000000000000000000000060448201526064016105a9565b506000803388604051602001611009929190612a47565b60405160208183030381529060405280519060200120905061102a816117bf565b15611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f6465000060448201526064016105a9565b61109c816001612225565b60408051606060208201819052601f60808301527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a0830152339282019290925289359181019190915261110b9060c001604051602081830303815290604052805190602001206001612225565b5060008760405160200161111f9190612b39565b60405160208183030381529060405280519060200120905061114081611985565b61114b906001612c50565b915061115781836122ba565b5060405187359033907ffd79146848f3e0373e2f8c70e8dcaa5e38ccdff023f81b209bdbadde07a917ca9061118f908b904290612c9b565b60405180910390a3863582146111a7575050506112f6565b60006111e76040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b90508373ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125891906127e5565b8173ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c791906127e5565b6112d984670de0b6b3a7640000612b80565b6112e391906127aa565b106112f1576112f188611a1d565b505050505b50505050565b60008061133d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b905060008173ffffffffffffffffffffffffffffffffffffffff1663c1a260066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b091906127e5565b9050806113bb610335565b6113c59190612c50565b9250505090565b600061032f8260405160200161143491907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f626c6f636b0000000000000000000000000000000000000000000000000000006020820152602581019190915260450190565b60405160208183030381529060405280519060200120611985565b600061032f826040516020016104fe91907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f61646472657373000000000000000000000000000000000000000000000000006020820152602781019190915260470190565b6000806114f86040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b73ffffffffffffffffffffffffffffffffffffffff163192915050565b600061029f7f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2611985565b606060006115826040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90506000835167ffffffffffffffff8111156115a0576115a0612520565b6040519080825280602002602001820160405280156115c9578160200160208202803683370190505b50905060005b8451811015611698578273ffffffffffffffffffffffffffffffffffffffff1663d4f4697e86838151811061160657611606612c21565b60200260200101516040518263ffffffff1660e01b815260040161162a9190612cbd565b602060405180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906127e5565b82828151811061167d5761167d612c21565b602090810291909101015261169181612c63565b90506115cf565b509392505050565b600061032f826040516020016114349190612b39565b600061029f7f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f7611985565b6000806117226040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b6040517fd4f4697e00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063d4f4697e90611777908690600401612cbd565b602060405180830381865afa158015611794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b891906127e5565b9392505050565b600080546040517f7ae1cfca0000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff1690637ae1cfca90602401602060405180830381865afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612b97565b60008061186e836040516020016104fe9190612af4565b905073ffffffffffffffffffffffffffffffffffffffff811661032f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e64000000000000000000000000000060448201526064016105a9565b600080546040517f21f8a7210000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff16906321f8a72190602401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612d0e565b600080546040517fbd02d0f50000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff169063bd02d0f590602401602060405180830381865afa1580156119f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f91906127e5565b6000611a5d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b90506000611a9f6040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508173ffffffffffffffffffffffffffffffffffffffff1663088240036040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1291906127e5565b50611b1b61231c565b6000611b25611515565b905060008460a00135611b36610879565b611b409190612b80565b611b4a9083612c50565b905084600001357f61caab0be2a0f10d869a5f437dab4535eb8e9c868b8c1fc68f3e5c10d0cd8f6686848442604051611b869493929190612d2b565b60405180910390a2604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f626c6f636b0000000000000000000000000000000000000000000000000000009181019190915285356045820152611c0a9060650160405160208183030381529060405280519060200120436122ba565b604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f61646472657373000000000000000000000000000000000000000000000000009181019190915285356047820152611c86906067016040516020818303038152906040528051906020012030612349565b611cb07f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2826122ba565b60c085013515611d7a576040517fee91035e00000000000000000000000000000000000000000000000000000000815260606004820152600e60648201527f726f636b6574436c61696d44414f000000000000000000000000000000000000608482015273ffffffffffffffffffffffffffffffffffffffff858116602483015260c0870135604483015284169063ee91035e9060a401600060405180830381600087803b158015611d6157600080fd5b505af1158015611d75573d6000803e3d6000fd5b505050505b6000611dba6040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b905061014086013515611e99576000611e076040518060400160405280600f81526020017f726f636b6574546f6b656e524554480000000000000000000000000000000000815250611857565b6040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301526101408a013560248301529192509083169063522f681590604401600060405180830381600087803b158015611e7f57600080fd5b505af1158015611e93573d6000803e3d6000fd5b50505050505b60005b611eaa610100880188612bb9565b9050811015610870576000611ec260e0890189612bb9565b83818110611ed257611ed2612c21565b9050602002013588806101000190611eea9190612bb9565b84818110611efa57611efa612c21565b90506020020135611f0b9190612c50565b90506000611f1d6101208a018a612bb9565b84818110611f2d57611f2d612c21565b905060200201359050816000148015611f44575080155b15611f50575050612215565b6040517f726577617264732e72656c61792e61646472657373000000000000000000000060208201526035810184905260009081908190605501604051602081830303815290604052805190602001209050611fab816118ed565b915073ffffffffffffffffffffffffffffffffffffffff8216612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b0000000000000000000000000000000000000060648201526084016105a9565b50905082156120ea576040517f01e3366700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528a81166024830152604482018590528916906301e3366790606401600060405180830381600087803b1580156120d157600080fd5b505af11580156120e5573d6000803e3d6000fd5b505050505b8115612179576040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905286169063522f681590604401600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b505050505b6040517fe44ba18f0000000000000000000000000000000000000000000000000000000081528a35600482015260608b01356024820152604481018490526064810183905273ffffffffffffffffffffffffffffffffffffffff82169063e44ba18f90608401600060405180830381600087803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b505050505050505b61221e81612c63565b9050611e9c565b6000546040517fabfdcced00000000000000000000000000000000000000000000000000000000815260048101849052821515602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063abfdcced906044015b600060405180830381600087803b15801561229e57600080fd5b505af11580156122b2573d6000803e3d6000fd5b505050505050565b6000546040517fe2a4853a000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063e2a4853a90604401612284565b6123477f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760016123ae565b565b6000546040517fca446dd90000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff83811660248301526101009092049091169063ca446dd990604401612284565b6000546040517fadb353dc000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063adb353dc90604401612284565b73ffffffffffffffffffffffffffffffffffffffff8116811461243257600080fd5b50565b6000806040838503121561244857600080fd5b823561245381612410565b946020939093013593505050565b6000610160828403121561247457600080fd5b50919050565b6000806040838503121561248d57600080fd5b823561249881612410565b9150602083013567ffffffffffffffff8111156124b457600080fd5b6124c085828601612461565b9150509250929050565b6000602082840312156124dc57600080fd5b813567ffffffffffffffff8111156124f357600080fd5b6124ff84828501612461565b949350505050565b60006020828403121561251957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561259657612596612520565b604052919050565b600082601f8301126125af57600080fd5b813567ffffffffffffffff8111156125c9576125c9612520565b6125fa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161254f565b81815284602083860101111561260f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561263f57600080fd5b823567ffffffffffffffff8082111561265757600080fd5b818501915085601f83011261266b57600080fd5b81358181111561267d5761267d612520565b8060051b61268c85820161254f565b91825283810185019185810190898411156126a657600080fd5b86860192505b838310156126e2578235858111156126c45760008081fd5b6126d28b89838a010161259e565b83525091860191908601906126ac565b9998505050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127275783518352928401929184019160010161270b565b50909695505050505050565b60006020828403121561274557600080fd5b813567ffffffffffffffff81111561275c57600080fd5b6124ff8482850161259e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561032f5761032f612768565b6000826127e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602082840312156127f757600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261283357600080fd5b830160208101925035905067ffffffffffffffff81111561285357600080fd5b80360382131561286257600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128e757600080fd5b830160208101925035905067ffffffffffffffff81111561290757600080fd5b8060051b360382131561286257600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561294b57600080fd5b8260051b80836020870137939093016020019392505050565b60006101608235845260208301356020850152604083013560408501526060830135606085015261299860808401846127fe565b8260808701526129ab8387018284612869565b9250505060a083013560a085015260c083013560c08501526129d060e08401846128b2565b85830360e08701526129e3838284612919565b925050506101006129f6818501856128b2565b86840383880152612a08848284612919565b9350505050610120612a1c818501856128b2565b86840383880152612a2e848284612919565b6101409687013597909601969096525092949350505050565b60608152602360608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808201527f6b6579000000000000000000000000000000000000000000000000000000000060a082015273ffffffffffffffffffffffffffffffffffffffff8316602082015260c0604082015260006124ff60c0830184612964565b60005b83811015612aeb578181015183820152602001612ad3565b50506000910152565b7f636f6e74726163742e6164647265737300000000000000000000000000000000815260008251612b2c816010850160208701612ad0565b9190910160100192915050565b60408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e74606082015260806020820152600061032c6080830184612964565b808202811582820484141761032f5761032f612768565b600060208284031215612ba957600080fd5b815180151581146117b857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612bee57600080fd5b83018035915067ffffffffffffffff821115612c0957600080fd5b6020019150600581901b360382131561286257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8082018082111561032f5761032f612768565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612c9457612c94612768565b5060010190565b604081526000612cae6040830185612964565b90508260208301529392505050565b6020815260008251806020840152612cdc816040850160208701612ad0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215612d2057600080fd5b81516117b881612410565b608081526000612d3e6080830187612964565b602083019590955250604081019290925260609091015291905056fea26469706673582212202de6c8a3b713d11cf22f20d964609f958ed285c9fa7954ded516163ee341af7b64736f6c634300081200330000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061011b5760003560e01c80637425f1e7116100b2578063ba34cb4b11610081578063e51920d311610066578063e51920d31461024b578063f21c150c1461025e578063f6a3f6ef1461026657600080fd5b8063ba34cb4b14610223578063cdfd4e1c1461022b57600080fd5b80637425f1e7146101c8578063ab772cb1146101d0578063b0aa28de146101e3578063b81bda511461021b57600080fd5b806347e884ef116100ee57806347e884ef1461017957806350a2f7e51461018e57806354fd4d50146101965780635d3e8ffa146101b557600080fd5b8063043877d014610120578063204e2a0a1461013b5780632198e62c1461015e5780633bfae5d914610166575b600080fd5b610128610279565b6040519081526020015b60405180910390f35b61014e610149366004612435565b6102a4565b6040519015158152602001610132565b610128610335565b61014e61017436600461247a565b61049b565b61018c6101873660046124ca565b6104b3565b005b610128610879565b6000546101a39060ff1681565b60405160ff9091168152602001610132565b61018c6101c33660046124ca565b610907565b6101286112fc565b6101286101de366004612507565b6113cc565b6101f66101f1366004612507565b61144f565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610132565b6101286114b7565b610128611515565b61023e61023936600461262c565b611540565b60405161013291906126ef565b6101286102593660046124ca565b6116a0565b6101286116b6565b610128610274366004612733565b6116e1565b6000610283610879565b61028b611515565b6102959042612797565b61029f91906127aa565b905090565b600061032c83836040516020016103119291906060808252601f908201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff929092166020830152604082015260a00190565b604051602081830303815290604052805190602001206117bf565b90505b92915050565b6000806103766040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff1663eccefff66103d26040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526004810191909152601160448201527f726f636b657452657761726473506f6f6c000000000000000000000000000000606482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152608401602060405180830381865afa158015610471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049591906127e5565b91505090565b600061032c8383604051602001610311929190612a47565b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610519826040516020016104fe9190612af4565b604051602081830303815290604052805190602001206118ed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064015b60405180910390fd5b6105ba6116b6565b833514610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f64000000000000000000000000000000000000000000000060648201526084016105a9565b60008360405160200161065c9190612b39565b604051602081830303815290604052805190602001209050600061067f82611985565b905060006106c16040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b905060006107036040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077491906127e5565b8273ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e391906127e5565b6107f585670de0b6b3a7640000612b80565b6107ff91906127aa565b1015610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e2072656163686564000060448201526064016105a9565b61087087611a1d565b50505050505050565b6000806108ba6040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166394e5d5126040518163ffffffff1660e01b8152600401602060405180830381865afa158015610471573d6000803e3d6000fd5b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610952826040516020016104fe9190612af4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064016105a9565b33610a728160405160200161031191907f64616f2e747275737465646e6f6465732e00000000000000000000000000000081527f6d656d6265720000000000000000000000000000000000000000000000000000601182015260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166017820152602b0190565b610ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f646500000000000000000000000060448201526064016105a9565b6000610b186040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166363ed62da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190612b97565b610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c656400000000000000000000000000000000000000000000000060648201526084016105a9565b6000610c1f6116b6565b90508535811015610cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e657874000000000000000000000000000000000060648201526084016105a9565b60008660a0013511610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f656400000000000000000000000000000000000000000000000000000000000060648201526084016105a9565b610d5360e0870187612bb9565b9050610d63610100880188612bb9565b9050148015610d8e5750610d7b610120870187612bb9565b9050610d8a60e0880188612bb9565b9050145b610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e67746800000000000000000000000060448201526064016105a9565b60c086013560005b610e0a610100890189612bb9565b9050811015610e5557610e21610100890189612bb9565b82818110610e3157610e31612c21565b9050602002013582610e439190612c50565b9150610e4e81612c63565b9050610dfc565b5060005b610e6660e0890189612bb9565b9050811015610eb057610e7c60e0890189612bb9565b82818110610e8c57610e8c612c21565b9050602002013582610e9e9190612c50565b9150610ea981612c63565b9050610e59565b50610eb96112fc565b811115610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c20726577617264730000000000000000000000000060448201526064016105a9565b506000805b610f35610120890189612bb9565b9050811015610f8057610f4c610120890189612bb9565b82818110610f5c57610f5c612c21565b9050602002013582610f6e9190612c50565b9150610f7981612c63565b9050610f27565b50610f896114b7565b811115610ff2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642045544820726577617264730000000000000000000000000060448201526064016105a9565b506000803388604051602001611009929190612a47565b60405160208183030381529060405280519060200120905061102a816117bf565b15611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f6465000060448201526064016105a9565b61109c816001612225565b60408051606060208201819052601f60808301527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a0830152339282019290925289359181019190915261110b9060c001604051602081830303815290604052805190602001206001612225565b5060008760405160200161111f9190612b39565b60405160208183030381529060405280519060200120905061114081611985565b61114b906001612c50565b915061115781836122ba565b5060405187359033907ffd79146848f3e0373e2f8c70e8dcaa5e38ccdff023f81b209bdbadde07a917ca9061118f908b904290612c9b565b60405180910390a3863582146111a7575050506112f6565b60006111e76040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b90508373ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125891906127e5565b8173ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c791906127e5565b6112d984670de0b6b3a7640000612b80565b6112e391906127aa565b106112f1576112f188611a1d565b505050505b50505050565b60008061133d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b905060008173ffffffffffffffffffffffffffffffffffffffff1663c1a260066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b091906127e5565b9050806113bb610335565b6113c59190612c50565b9250505090565b600061032f8260405160200161143491907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f626c6f636b0000000000000000000000000000000000000000000000000000006020820152602581019190915260450190565b60405160208183030381529060405280519060200120611985565b600061032f826040516020016104fe91907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f61646472657373000000000000000000000000000000000000000000000000006020820152602781019190915260470190565b6000806114f86040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b73ffffffffffffffffffffffffffffffffffffffff163192915050565b600061029f7f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2611985565b606060006115826040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90506000835167ffffffffffffffff8111156115a0576115a0612520565b6040519080825280602002602001820160405280156115c9578160200160208202803683370190505b50905060005b8451811015611698578273ffffffffffffffffffffffffffffffffffffffff1663d4f4697e86838151811061160657611606612c21565b60200260200101516040518263ffffffff1660e01b815260040161162a9190612cbd565b602060405180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906127e5565b82828151811061167d5761167d612c21565b602090810291909101015261169181612c63565b90506115cf565b509392505050565b600061032f826040516020016114349190612b39565b600061029f7f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f7611985565b6000806117226040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b6040517fd4f4697e00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063d4f4697e90611777908690600401612cbd565b602060405180830381865afa158015611794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b891906127e5565b9392505050565b600080546040517f7ae1cfca0000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff1690637ae1cfca90602401602060405180830381865afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612b97565b60008061186e836040516020016104fe9190612af4565b905073ffffffffffffffffffffffffffffffffffffffff811661032f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e64000000000000000000000000000060448201526064016105a9565b600080546040517f21f8a7210000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff16906321f8a72190602401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612d0e565b600080546040517fbd02d0f50000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff169063bd02d0f590602401602060405180830381865afa1580156119f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f91906127e5565b6000611a5d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b90506000611a9f6040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508173ffffffffffffffffffffffffffffffffffffffff1663088240036040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1291906127e5565b50611b1b61231c565b6000611b25611515565b905060008460a00135611b36610879565b611b409190612b80565b611b4a9083612c50565b905084600001357f61caab0be2a0f10d869a5f437dab4535eb8e9c868b8c1fc68f3e5c10d0cd8f6686848442604051611b869493929190612d2b565b60405180910390a2604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f626c6f636b0000000000000000000000000000000000000000000000000000009181019190915285356045820152611c0a9060650160405160208183030381529060405280519060200120436122ba565b604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f61646472657373000000000000000000000000000000000000000000000000009181019190915285356047820152611c86906067016040516020818303038152906040528051906020012030612349565b611cb07f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2826122ba565b60c085013515611d7a576040517fee91035e00000000000000000000000000000000000000000000000000000000815260606004820152600e60648201527f726f636b6574436c61696d44414f000000000000000000000000000000000000608482015273ffffffffffffffffffffffffffffffffffffffff858116602483015260c0870135604483015284169063ee91035e9060a401600060405180830381600087803b158015611d6157600080fd5b505af1158015611d75573d6000803e3d6000fd5b505050505b6000611dba6040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b905061014086013515611e99576000611e076040518060400160405280600f81526020017f726f636b6574546f6b656e524554480000000000000000000000000000000000815250611857565b6040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301526101408a013560248301529192509083169063522f681590604401600060405180830381600087803b158015611e7f57600080fd5b505af1158015611e93573d6000803e3d6000fd5b50505050505b60005b611eaa610100880188612bb9565b9050811015610870576000611ec260e0890189612bb9565b83818110611ed257611ed2612c21565b9050602002013588806101000190611eea9190612bb9565b84818110611efa57611efa612c21565b90506020020135611f0b9190612c50565b90506000611f1d6101208a018a612bb9565b84818110611f2d57611f2d612c21565b905060200201359050816000148015611f44575080155b15611f50575050612215565b6040517f726577617264732e72656c61792e61646472657373000000000000000000000060208201526035810184905260009081908190605501604051602081830303815290604052805190602001209050611fab816118ed565b915073ffffffffffffffffffffffffffffffffffffffff8216612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b0000000000000000000000000000000000000060648201526084016105a9565b50905082156120ea576040517f01e3366700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528a81166024830152604482018590528916906301e3366790606401600060405180830381600087803b1580156120d157600080fd5b505af11580156120e5573d6000803e3d6000fd5b505050505b8115612179576040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905286169063522f681590604401600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b505050505b6040517fe44ba18f0000000000000000000000000000000000000000000000000000000081528a35600482015260608b01356024820152604481018490526064810183905273ffffffffffffffffffffffffffffffffffffffff82169063e44ba18f90608401600060405180830381600087803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b505050505050505b61221e81612c63565b9050611e9c565b6000546040517fabfdcced00000000000000000000000000000000000000000000000000000000815260048101849052821515602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063abfdcced906044015b600060405180830381600087803b15801561229e57600080fd5b505af11580156122b2573d6000803e3d6000fd5b505050505050565b6000546040517fe2a4853a000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063e2a4853a90604401612284565b6123477f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760016123ae565b565b6000546040517fca446dd90000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff83811660248301526101009092049091169063ca446dd990604401612284565b6000546040517fadb353dc000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063adb353dc90604401612284565b73ffffffffffffffffffffffffffffffffffffffff8116811461243257600080fd5b50565b6000806040838503121561244857600080fd5b823561245381612410565b946020939093013593505050565b6000610160828403121561247457600080fd5b50919050565b6000806040838503121561248d57600080fd5b823561249881612410565b9150602083013567ffffffffffffffff8111156124b457600080fd5b6124c085828601612461565b9150509250929050565b6000602082840312156124dc57600080fd5b813567ffffffffffffffff8111156124f357600080fd5b6124ff84828501612461565b949350505050565b60006020828403121561251957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561259657612596612520565b604052919050565b600082601f8301126125af57600080fd5b813567ffffffffffffffff8111156125c9576125c9612520565b6125fa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161254f565b81815284602083860101111561260f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561263f57600080fd5b823567ffffffffffffffff8082111561265757600080fd5b818501915085601f83011261266b57600080fd5b81358181111561267d5761267d612520565b8060051b61268c85820161254f565b91825283810185019185810190898411156126a657600080fd5b86860192505b838310156126e2578235858111156126c45760008081fd5b6126d28b89838a010161259e565b83525091860191908601906126ac565b9998505050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127275783518352928401929184019160010161270b565b50909695505050505050565b60006020828403121561274557600080fd5b813567ffffffffffffffff81111561275c57600080fd5b6124ff8482850161259e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561032f5761032f612768565b6000826127e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602082840312156127f757600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261283357600080fd5b830160208101925035905067ffffffffffffffff81111561285357600080fd5b80360382131561286257600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128e757600080fd5b830160208101925035905067ffffffffffffffff81111561290757600080fd5b8060051b360382131561286257600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561294b57600080fd5b8260051b80836020870137939093016020019392505050565b60006101608235845260208301356020850152604083013560408501526060830135606085015261299860808401846127fe565b8260808701526129ab8387018284612869565b9250505060a083013560a085015260c083013560c08501526129d060e08401846128b2565b85830360e08701526129e3838284612919565b925050506101006129f6818501856128b2565b86840383880152612a08848284612919565b9350505050610120612a1c818501856128b2565b86840383880152612a2e848284612919565b6101409687013597909601969096525092949350505050565b60608152602360608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808201527f6b6579000000000000000000000000000000000000000000000000000000000060a082015273ffffffffffffffffffffffffffffffffffffffff8316602082015260c0604082015260006124ff60c0830184612964565b60005b83811015612aeb578181015183820152602001612ad3565b50506000910152565b7f636f6e74726163742e6164647265737300000000000000000000000000000000815260008251612b2c816010850160208701612ad0565b9190910160100192915050565b60408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e74606082015260806020820152600061032c6080830184612964565b808202811582820484141761032f5761032f612768565b600060208284031215612ba957600080fd5b815180151581146117b857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612bee57600080fd5b83018035915067ffffffffffffffff821115612c0957600080fd5b6020019150600581901b360382131561286257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8082018082111561032f5761032f612768565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612c9457612c94612768565b5060010190565b604081526000612cae6040830185612964565b90508260208301529392505050565b6020815260008251806020840152612cdc816040850160208701612ad0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215612d2057600080fd5b81516117b881612410565b608081526000612d3e6080830187612964565b602083019590955250604081019290925260609091015291905056fea26469706673582212202de6c8a3b713d11cf22f20d964609f958ed285c9fa7954ded516163ee341af7b64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000001d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46

-----Decoded View---------------
Arg [0] : _rocketStorageAddress (address): 0x1d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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