Hoodi Testnet

Contract

0x26B4395a5DC086b9aa8a2957e91B4134D098b0c6
Source Code Source Code

Overview

ETH Balance

0 ETH

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount
Submit Reward Sn...15890932025-11-10 0:17:4833 days ago1762733868IN
0x26B4395a...4D098b0c6
0 ETH0.001896973.95157631
Submit Reward Sn...15890762025-11-10 0:14:1233 days ago1762733652IN
0x26B4395a...4D098b0c6
0 ETH0.000910754.00873302
Submit Reward Sn...15763782025-11-08 1:06:4835 days ago1762564008IN
0x26B4395a...4D098b0c6
0 ETH0.002159734.00862762
Submit Reward Sn...15763772025-11-08 1:06:3635 days ago1762563996IN
0x26B4395a...4D098b0c6
0 ETH0.001415124.09460746
Submit Reward Sn...15763772025-11-08 1:06:3635 days ago1762563996IN
0x26B4395a...4D098b0c6
0 ETH0.000931244.09460746
Submit Reward Sn...15632552025-11-06 0:17:0037 days ago1762388220IN
0x26B4395a...4D098b0c6
0 ETH0.001942894.04723855
Submit Reward Sn...15632432025-11-06 0:14:1237 days ago1762388052IN
0x26B4395a...4D098b0c6
0 ETH0.000955884.20736708
Submit Reward Sn...15495532025-11-04 0:17:4839 days ago1762215468IN
0x26B4395a...4D098b0c6
0 ETH0.002029374.22738812
Submit Reward Sn...15495522025-11-04 0:17:3639 days ago1762215456IN
0x26B4395a...4D098b0c6
0 ETH0.000929454.09104377
Submit Reward Sn...15358812025-11-02 0:18:1241 days ago1762042692IN
0x26B4395a...4D098b0c6
0 ETH0.001936034.03305523
Submit Reward Sn...15358612025-11-02 0:14:0041 days ago1762042440IN
0x26B4395a...4D098b0c6
0 ETH0.000892843.9301073
Submit Reward Sn...15222522025-10-31 0:15:1243 days ago1761869712IN
0x26B4395a...4D098b0c6
0 ETH0.001944724.05105507
Submit Reward Sn...15222492025-10-31 0:14:2443 days ago1761869664IN
0x26B4395a...4D098b0c6
0 ETH0.000914954.02721626
Submit Reward Sn...15088062025-10-29 0:17:0045 days ago1761697020IN
0x26B4395a...4D098b0c6
0 ETH0.001889563.93616005
Submit Reward Sn...15087992025-10-29 0:15:2445 days ago1761696924IN
0x26B4395a...4D098b0c6
0 ETH0.000930974.09770685
Submit Reward Sn...14955022025-10-27 0:17:4847 days ago1761524268IN
0x26B4395a...4D098b0c6
0 ETH0.001950464.06301449
Submit Reward Sn...14954982025-10-27 0:17:0047 days ago1761524220IN
0x26B4395a...4D098b0c6
0 ETH0.00091564.03006105
Submit Reward Sn...14825752025-10-25 0:16:3649 days ago1761351396IN
0x26B4395a...4D098b0c6
0 ETH0.00193294.0264229
Submit Reward Sn...14825642025-10-25 0:14:2449 days ago1761351264IN
0x26B4395a...4D098b0c6
0 ETH0.000882223.8831437
Submit Reward Sn...14698082025-10-23 0:15:3651 days ago1761178536IN
0x26B4395a...4D098b0c6
0 ETH0.001910913.98063069
Submit Reward Sn...14698012025-10-23 0:14:0051 days ago1761178440IN
0x26B4395a...4D098b0c6
0 ETH0.000970644.27232855
Submit Reward Sn...14567202025-10-21 0:21:4853 days ago1761006108IN
0x26B4395a...4D098b0c6
0 ETH0.002180434.04706055
Submit Reward Sn...14567132025-10-21 0:20:1253 days ago1761006012IN
0x26B4395a...4D098b0c6
0 ETH0.0009043.97482109
Submit Reward Sn...14428602025-10-19 0:15:4855 days ago1760832948IN
0x26B4395a...4D098b0c6
0 ETH0.002056194.28336708
Submit Reward Sn...14428552025-10-19 0:14:4855 days ago1760832888IN
0x26B4395a...4D098b0c6
0 ETH0.000918094.04123402
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Amount
Relay Rewards15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Withdraw Token15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Transfer Token15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Set Uint15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Set Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Set Uint15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Rewards Clai...15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Uint15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Add Uint15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Inflation Mint T...15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Node Consens...15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Member Count15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Set Uint15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Uint15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Set Bool15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Set Bool15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Bool15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Balance Of15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
Get Address15890932025-11-10 0:17:4833 days ago1762733868
0x26B4395a...4D098b0c6
0 ETH
View All Internal Transactions
Loading...
Loading

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.30+commit.73712a01

Optimization Enabled:
Yes with 15000 runs

Other Settings:
paris EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    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.8.30;

import {RocketStorageInterface} from "../../interface/RocketStorageInterface.sol";
import {RocketVaultInterface} from "../../interface/RocketVaultInterface.sol";
import {RocketDAONodeTrustedInterface} from "../../interface/dao/node/RocketDAONodeTrustedInterface.sol";
import {RocketDAOProtocolSettingsNetworkInterface} from "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsNetworkInterface.sol";
import {RocketDAOProtocolSettingsRewardsInterface} from "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsRewardsInterface.sol";
import {RocketRewardsPoolInterface} from "../../interface/rewards/RocketRewardsPoolInterface.sol";
import {RocketRewardsRelayInterface} from "../../interface/rewards/RocketRewardsRelayInterface.sol";
import {RocketSmoothingPoolInterface} from "../../interface/rewards/RocketSmoothingPoolInterface.sol";
import {RocketTokenRPLInterface} from "../../interface/token/RocketTokenRPLInterface.sol";
import {IERC20} from "../../interface/util/IERC20.sol";
import {RewardSubmission} from "../../types/RewardSubmission.sol";
import {RocketBase} from "../RocketBase.sol";
import {RocketVaultWithdrawerInterface} from "../../interface/RocketVaultWithdrawerInterface.sol";

/// @notice Holds RPL and ETH generated by the network for distribution each reward cycle
contract RocketRewardsPool is RocketBase, RocketRewardsPoolInterface, RocketVaultWithdrawerInterface {
    // Constants
    uint256 constant internal treeVersion = 1;

    // 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);

    // Construct
    constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) {
        version = 5;
    }

    /// @dev Needs to freely accept ETH withdrawn from the smoothing pool
    receive() payable external {}

    /// @dev Needs to freely accept ETH withdrawn from the vault
    function receiveVaultWithdrawalETH() external payable {}

    /// @notice Accepts incoming ETH from megapool distributions for voter share into vault
    function depositVoterShare() override payable external {
        // Transfer incoming ETH directly to the vault
        RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
        rocketVault.depositEther{value: msg.value}();
    }

    /// @notice Returns the amount of ETH rewards waiting to be distributed
    function getEthBalance() override external view returns (uint256) {
        RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
        return rocketVault.balanceOf("rocketRewardsPool");
    }

    /// @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 Returns the amount of pending voter share ETH ready to be distributed
    function getPendingVoterShare() override public view returns (uint256) {
        RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
        return rocketVault.balanceOf("rocketRewardsPool");
    }

    /// @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 = _submission.treasuryETH + _submission.userETH;
            for (uint256 i = 0; i < _submission.nodeETH.length; ++i) {
                totalRewardsETH = totalRewardsETH + _submission.nodeETH[i];
            }
            uint256 smoothingPoolBalance = getPendingETHRewards();
            require(totalRewardsETH <= smoothingPoolBalance + getPendingVoterShare(), "Invalid ETH rewards");
            require(_submission.smoothingPoolETH <= smoothingPoolBalance, "Invalid smoothing pool balance");
        }
        // 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"));
        // Withdraw ETH from the smoothing pool required for this interval
        if (_submission.smoothingPoolETH > 0) {
            rocketSmoothingPool.withdrawEther(address(this), _submission.smoothingPoolETH);
        }
        // Calculate total amount of ETH required for this reward interval
        uint256 totalETH = _submission.userETH + _submission.treasuryETH;
        for (uint i = 0; i < _submission.nodeETH.length; ++i) {
            totalETH += _submission.nodeETH[i];
        }
        // Withdraw remaining ETH required from the vault
        uint256 vaultBalance = totalETH - _submission.smoothingPoolETH;
        if (vaultBalance > 0) {
            rocketVault.withdrawEther(vaultBalance);
        }
        // Send user share to rETH contract
        if (_submission.userETH > 0) {
            address rocketTokenRETHAddress = getContractAddress("rocketTokenRETH");
            (bool result,) = rocketTokenRETHAddress.call{value: _submission.userETH}("");
            require(result, "Failed to send user rewards");
        }
        // Send pDAO share to treasury
        if (_submission.treasuryETH > 0) {
            address payable rocketClaimDAO = payable(getContractAddress("rocketClaimDAO"));
            (bool result,) = rocketClaimDAO.call{value: _submission.treasuryETH}("");
            require(result, "Failed to send pDAO rewards");
        }
        // 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 directly to the relay
                rocketVault.withdrawToken(address(relay), rplContract, rewardsRPL);
            }
            if (rewardsETH > 0) {
                // Send ETH rewards to the relay
                (bool result,) = address(relay).call{value: rewardsETH}("");
                require(result, "Failed to send ETH rewards to relay");
            }
            // Call into relay contract to handle distribution of rewards
            relay.relayRewards(_submission.rewardIndex, treeVersion, _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.
   *
   */

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

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.
   *
   */

// 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.
   *
   */

// 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.
   *
   */

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;

// 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);
    function getMaxNodeShareSecurityCouncilAdder() external view returns (uint256);
    function getVoterShare() external view returns (uint256);
    function getProtocolDAOShare() external view returns (uint256);
    function getNodeShare() external view returns (uint256);
    function getNodeShareSecurityCouncilAdder() external view returns (uint256);
    function getRethCommission() external view returns (uint256);
    function getEffectiveVoterShare() external view returns (uint256);
    function getEffectiveNodeShare() external view returns (uint256);
    function getAllowListedControllers() external view returns (address[] memory);
    function getMaxRethDelta() external view returns (uint256);
    function isAllowListedController(address _address) external view returns (bool);
    function setNodeShareSecurityCouncilAdder(uint256 _value) external;
    function setNodeCommissionShare(uint256 _value) external;
    function setVoterShare(uint256 _value) external;
    function setProtocolDAOShare(uint256 _value) 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);
}

File 9 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.
   *
   */

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

struct RewardSubmission {
    uint256 rewardIndex;                // Index of the reward submission
    uint256 executionBlock;             // Execution block at which the calculations were made
    uint256 consensusBlock;             // Consensus block containing the execution block
    bytes32 merkleRoot;                 // Merkle root of the reward claims
    uint256 intervalsPassed;            // Number of intervals passed since last submission (usually 1)
    uint256 smoothingPoolETH;           // Balance to extract from smoothing pool to fulfil this reward interval

    uint256 treasuryRPL;                // How much RPL is to be sent to the pDAO treasury
    uint256 treasuryETH;                // Amount of ETH to send to pDAO treasury

    uint256 userETH;                    // Amount to send to rETH

    uint256[] trustedNodeRPL;           // Mapping of RPL rewards for oDAO members on each network
    uint256[] nodeRPL;                  // Mapping of RPL rewards for nodes on each network
    uint256[] nodeETH;                  // Mapping of ETH rewards for nodes on each network
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    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 getEthBalance() external view returns (uint256);
    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 getPendingVoterShare() 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;
    function depositVoterShare() payable 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;
pragma abicoder v2;

struct Claim {
    uint256 rewardIndex;
    uint256 amountRPL;
    uint256 amountSmoothingPoolETH;
    uint256 amountVoterETH;
    bytes32[] merkleProof;
}

interface RocketRewardsRelayInterface {
    function relayRewards(uint256 _intervalIndex, uint256 _treeVersion, bytes32 _merkleRoot, uint256 _rewardsRPL, uint256 _rewardsETH) external;
    function claim(address _nodeAddress, Claim[] calldata _claims) external;
    function claimAndStake(address _nodeAddress, Claim[] calldata _claims, 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;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    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;
}

/**
   *       .
   *      / \
   *     |.'.|
   *     |'.'|
   *   ,'|   |'.
   *  |,-'-|-'-.|
   *   __|_| |         _        _      _____           _
   *  | ___ \|        | |      | |    | ___ \         | |
   *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
   *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
   *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
   *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
   * +---------------------------------------------------+
   * |    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 sender that isn't a registered megapool
    */
    modifier onlyRegisteredMegapool(address _megapoolAddress) {
        require(getBool(keccak256(abi.encodePacked("megapool.exists", _megapoolAddress))), "Invalid megapool");
        _;
    }

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

    /**
    * @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.
   *
   */

pragma solidity >0.5.0 <0.9.0;

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

interface RocketVaultWithdrawerInterface {
    function receiveVaultWithdrawalETH() external payable; 
}

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

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":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","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":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"}],"indexed":false,"internalType":"struct RewardSubmission","name":"submission","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RewardSnapshotSubmitted","type":"event"},{"inputs":[],"name":"depositVoterShare","outputs":[],"stateMutability":"payable","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":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","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":"getEthBalance","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":"getPendingVoterShare","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":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","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":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","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":[],"name":"receiveVaultWithdrawalETH","outputs":[],"stateMutability":"payable","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":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","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"},{"stateMutability":"payable","type":"receive"}]

608034608157601f612e7e38819003918201601f19168301916001600160401b03831184841017608657808492602094604052833981010312608157516001600160a01b0381168103608157600080546001600160a81b03191660089290921b610100600160a81b0316919091176005179055604051612de1908161009d8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c908163043877d014610c635781630febabeb14610c08578163204e2a0a14610b715781632198e62c14610b5757816350a2f7e514610b3d57816354fd4d5014610b1e5781635af3ad5d14610a0d5781635f3c56f7146109e657816370ed0ada1461010b5781637425f1e7146109cc578163ab772cb11461094f578163b0aa28de146108b4578163b81bda511461088e578163ba34cb4b14610874578163c095415d14610866578163cdfd4e1c14610659578163e2d9f7b3146102b5578163f21c150c14610293578163f6a3f6ef146101a6578163f7b65fb214610110575063f96fef660361000e575b610cf3565b806003193601126101a35773ffffffffffffffffffffffffffffffffffffffff61014061013b611063565b611eed565b1681813b156101a35780600492604051938480927f98ea5fca00000000000000000000000000000000000000000000000000000000825234905af18015610196576101885780f35b61019191610d0e565b818180f35b50604051903d90823e3d90fd5b80fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c5760206101dc610231923690600401610dd0565b73ffffffffffffffffffffffffffffffffffffffff6101fc61013b6111de565b1660405180809581947fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b03915afa90811561028857829161024e575b602082604051908152f35b90506020813d602011610280575b8161026960209383610d0e565b8101031261027c57602091505182610243565b5080fd5b3d915061025c565b6040513d84823e3d90fd5b346101a357806003193601126101a35760206102ad61216a565b604051908152f35b346101a3576102c336610cbf565b61036973ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b60405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b519020611fb2565b1630146112da565b61037161216a565b8135036105d5576103c560405160208101906103bd816103918685611432565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b5190206121ee565b73ffffffffffffffffffffffffffffffffffffffff6103e561013b611477565b169073ffffffffffffffffffffffffffffffffffffffff61040761013b61133f565b169181670de0b6b3a76400000291670de0b6b3a76400008304036105a85790602060049392604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa92831561059d578593610563575b50610475600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa918215610558578492610520575b50106104c2576104bf906122f3565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e207265616368656400006044820152fd5b9091506020813d602011610550575b8161053c60209383610d0e565b8101031261054c575190846104b0565b8380fd5b3d915061052f565b6040513d86823e3d90fd5b92506020833d602011610595575b8161057e60209383610d0e565b8101031261059157915191610475610466565b8480fd5b3d9150610571565b6040513d87823e3d90fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f6400000000000000000000000000000000000000000000006064820152fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c573660238201121561027c5780600401359061069682610d7e565b916106a46040519384610d0e565b80835260051b8101602401602083013682116105915760248301905b82821061083657858573ffffffffffffffffffffffffffffffffffffffff6106e961013b6111de565b1681519061070f6106f983610d7e565b926107076040519485610d0e565b808452610d7e565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019401368537845b81518110156107f1578060206107556107899385611e12565b51604051809481927fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b0381875afa80156107e65787906107b0575b600192506107a98287611e12565b520161073c565b506020823d82116107de575b816107c960209383610d0e565b810103126107da576001915161079b565b8680fd5b3d91506107bc565b6040513d89823e3d90fd5b50505090604051928392602084019060208552518091526040840192915b81811061081d575050500390f35b825184528594506020938401939092019160010161080f565b813567ffffffffffffffff81116107da5760209161085b839260243691890101610dd0565b8152019101906106c0565b806003193601126101a35780f35b346101a357806003193601126101a35760206102ad6120e6565b346101a357806003193601126101a35760206108ab61013b611dd7565b31604051908152f35b346101a35760206003193601126101a35760206109316040518281019061035981610391600435856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346101a35760206003193601126101a35760206102ad604051828101906103bd81610391600435856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b346101a357806003193601126101a35760206102ad611d32565b346101a35760206102ad6109f936610cbf565b6040516103bd816103918682019485611432565b346101a357610a1b36610cbf565b610a3e73ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b610ab260405160208101907f64616f2e747275737465646e6f6465732e00000000000000000000000000000082527f6d656d626572000000000000000000000000000000000000000000000000000060318201523360601b6037820152602b8152610aaa604b82610d0e565b519020611e70565b15610ac0576104bf906114b2565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f64650000000000000000000000006044820152fd5b346101a357806003193601126101a35760ff6020915416604051908152f35b346101a357806003193601126101a35760206102ad611219565b346101a357806003193601126101a35760206102ad6110d9565b346101a35760406003193601126101a3576020610bfe610b8f610c97565b604051610aaa816103918682019460243590866040909392919360608152601f60608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff60a08201951660208201520152565b6040519015158152f35b346101a35760406003193601126101a357610c21610c97565b6024359167ffffffffffffffff83116101a35761018060031984360301126101a357604051602090610bfe9080830190610aaa8161039160048a018986610fdc565b346101a357806003193601126101a35760206102ad610c89610c836120e6565b42610e17565b610c91611219565b90610e53565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610cba57565b600080fd5b6020600319820112610cba576004359067ffffffffffffffff8211610cba576003198261018092030112610cba5760040190565b34610cba576000600319360112610cba5760206102ad611c91565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d4f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610d4f5760051b60200190565b67ffffffffffffffff8111610d4f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610cba57803590610de782610d96565b92610df56040519485610d0e565b82845260208383010111610cba57816000926020809301838601378301015290565b91908203918211610e2457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8115610e5d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215610cba57016020813591019167ffffffffffffffff8211610cba578160051b36038313610cba57565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311610cba5760209260051b809284830137010190565b610fd991813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100820135610100820152610fca610fbe610fa1610f8d610120860186610e8c565b610180610120870152610180860191610edf565b610faf610140860186610e8c565b90858303610140870152610edf565b92610160810190610e8c565b91610160818503910152610edf565b90565b60c09073ffffffffffffffffffffffffffffffffffffffff610fd9949360608352602360608401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808401527f6b6579000000000000000000000000000000000000000000000000000000000060a08401521660208201528160408201520190610f1c565b60405190611072604083610d0e565b600b82527f726f636b65745661756c740000000000000000000000000000000000000000006020830152565b604051906110ad604083610d0e565b600e82527f726f636b6574546f6b656e52504c0000000000000000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6110f961013b611063565b16602073ffffffffffffffffffffffffffffffffffffffff61111c61013b61109e565b1660405192838080937feccefff60000000000000000000000000000000000000000000000000000000082526040600483015261118760448301604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b90602483015203915afa9081156111d2576000916111a3575090565b90506020813d6020116111ca575b816111be60209383610d0e565b81010312610cba575190565b3d91506111b1565b6040513d6000823e3d90fd5b604051906111ed604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e6773526577617264736020830152565b6004602073ffffffffffffffffffffffffffffffffffffffff61123d61013b6111de565b16604051928380927f94e5d5120000000000000000000000000000000000000000000000000000000082525afa9081156111d2576000916111a3575090565b6040519061128b604083610d0e565b601182527f726f636b657452657761726473506f6f6c0000000000000000000000000000006020830152565b60005b8381106112ca5750506000910152565b81810151838201526020016112ba565b156112e157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e7472616374000000006044820152fd5b6040519061134e604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b6020830152565b90816020910312610cba57518015158103610cba5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610cba570180359067ffffffffffffffff8211610cba57602001918160051b36038313610cba57565b91908110156113f65760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908201809211610e2457565b906080610fd99260408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e7460608201528160208201520190610f1c565b60405190611486604083610d0e565b601482527f726f636b657444414f4e6f6465547275737465640000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6114d261013b61133f565b16906040517f63ed62da000000000000000000000000000000000000000000000000000000008152602081600481865afa9081156111d257600091611c62575b5015611bde5761152061216a565b90803593828511611b5a57608082013515611ad6576101408201926115458484611392565b61012085019291506115578386611392565b9190501480611ab2575b15611a545760009560c08501355b6115798787611392565b90508810156115ab576115a360019161159c8a6115968b8b611392565b906113e6565b3590611425565b97019661156f565b965091945091956000955b6115c08686611392565b90508710156115e5576115dd60019161159c896115968a8a611392565b9601956115b6565b91955093509490946115f5611d32565b106119f65761160d61010083013560e0840135611425565b926000935b61016084016116218186611392565b90508610156116465760019161159c8761159661163e9489611392565b940193611612565b5090935094909493919361165b61013b611dd7565b319061166e611668611c91565b83611425565b106119985760a08501351161193a57604051602081019061169481610391883386610fdc565b5190206116a081611e70565b6118dc576116ad90612062565b60408051606060208201818152601f60808401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a08401523393830193909352810185905261170e91906117068160c08101610391565b519020612062565b6040516020810190611724816103918885611432565b51902092611731846121ee565b9360018501809511610e24578461174791612252565b80604051604081527f60e3a6abeddae923bd65a9a5dcd11f9a8e38f12f885eef210b91203f3ca872b161177d6040830189610f1c565b914260208201528033930390a3036118d75773ffffffffffffffffffffffffffffffffffffffff6117af61013b611477565b169180670de0b6b3a76400000290670de0b6b3a7640000820403610e24576020600493604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa9283156111d2576000936118a1575b5061181c600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa9182156111d25760009261186d575b5010156118625750565b61186b906122f3565b565b9091506020813d602011611899575b8161188960209383610d0e565b81010312610cba57519038611858565b3d915061187c565b92506020833d6020116118cf575b816118bc60209383610d0e565b81010312610cba5791519161181c61180d565b3d91506118af565b505050565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f646500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420736d6f6f7468696e6720706f6f6c2062616c616e636500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c6964204554482072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c2072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e6774680000000000000000000000006044820152fd5b50611abd8285611392565b9050611acd610160860186611392565b91905014611561565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e65787400000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c65640000000000000000000000000000000000000000000000006064820152fd5b611c84915060203d602011611c8a575b611c7c8183610d0e565b81019061137a565b38611512565b503d611c72565b73ffffffffffffffffffffffffffffffffffffffff611cb161013b611063565b16602060405180927f35ee5f870000000000000000000000000000000000000000000000000000000082528260048301528180611d1c60248201604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b03915afa9081156111d2576000916111a3575090565b6004602073ffffffffffffffffffffffffffffffffffffffff611d5661013b61109e565b16604051928380927fc1a260060000000000000000000000000000000000000000000000000000000082525afa80156111d257600090611da3575b610fd99150611d9e6110d9565b611425565b506020813d602011611dcf575b81611dbd60209383610d0e565b81010312610cba57610fd99051611d91565b3d9150611db0565b60405190611de6604083610d0e565b601382527f726f636b6574536d6f6f7468696e67506f6f6c000000000000000000000000006020830152565b80518210156113f65760209160051b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452611e6981518092816020880152602088880191016112b7565b0116010190565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f7ae1cfca00000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091611ed4575090565b610fd9915060203d602011611c8a57611c7c8183610d0e565b611f359060405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b73ffffffffffffffffffffffffffffffffffffffff811615611f545790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f21f8a72100000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091612016575090565b6020813d60201161205a575b8161202f60209383610d0e565b8101031261027c57519073ffffffffffffffffffffffffffffffffffffffff821682036101a3575090565b3d9150612022565b60009073ffffffffffffffffffffffffffffffffffffffff825460081c1690813b156120e25782916044839260405194859384927fabfdcced0000000000000000000000000000000000000000000000000000000084526004840152600160248401525af18015610288576120d5575050565b816120df91610d0e565b50565b8280fd5b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee260048301525afa9081156111d2576000916111a3575090565b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760048301525afa9081156111d2576000916111a3575090565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937fbd02d0f500000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d2576000916111a3575090565b60009173ffffffffffffffffffffffffffffffffffffffff835460081c1691823b1561054c5790604484928360405195869485937fe2a4853a000000000000000000000000000000000000000000000000000000008552600485015260248401525af18015610288576120d5575050565b3d156122ee573d906122d482610d96565b916122e26040519384610d0e565b82523d6000602084013e565b606090565b6122fe61013b61109e565b9073ffffffffffffffffffffffffffffffffffffffff6000921673ffffffffffffffffffffffffffffffffffffffff61233861013b611063565b16916040517f0882400300000000000000000000000000000000000000000000000000000000815260208160048188875af1801561059d57612d7c575b5073ffffffffffffffffffffffffffffffffffffffff845460081c16803b15610591578480916044604051809481937fadb353dc0000000000000000000000000000000000000000000000000000000083527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f76004840152600160248401525af1801561059d57612d68575b5061240a6120e6565b94612413611219565b608083013590818102918183041490151715612d3b5794866124587fcdc52a6101e59cdabb15ba2e286593326138db03833e45895356994d978d28f996978399611425565b908435968791604051809160808252612474608083018a610f1c565b9060208301528560408301524260608301520390a26124fc60405160208101906124f2816103918b856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b5190204390612252565b6040516020810190612562816103918a856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b51902073ffffffffffffffffffffffffffffffffffffffff835460081c1690813b1561054c5783916044839260405194859384927fca446dd900000000000000000000000000000000000000000000000000000000845260048401523060248401525af1908115612c08578391612d26575b505460081c73ffffffffffffffffffffffffffffffffffffffff1690813b156120e25782916044839260405194859384927fe2a4853a0000000000000000000000000000000000000000000000000000000084527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2600485015260248401525af1801561028857612d11575b5060c083013580612c77575b505073ffffffffffffffffffffffffffffffffffffffff61268e61013b611dd7565b16928660a08401359485612c13575b50506101008301359560e0840135956126b68789611425565b9689975b61016087018b6126ca828a611392565b90508b10156126f0575060019161159c8b6115966126e8948c611392565b9801976126ba565b94989190506127059295995099929599610e17565b80612ba3575b5080612aea575b505080612a23575b50855b610140830161272c8185611392565b9050821015612a1957612746826115966127599387611392565b3561159c83611596610120880188611392565b61276b82611596610160870187611392565b35811591828093612a11575b612a065773ffffffffffffffffffffffffffffffffffffffff6127d360405160208101907f726577617264732e72656c61792e616464726573730000000000000000000000825287603582015260358152610359605582610d0e565b16918215612982578a9315612910575b8061286f575b823b1561054c5760a484928360405195869485937f44701afb0000000000000000000000000000000000000000000000000000000085528b60048601526001602486015260608d01356044860152606485015260848401525af180156102885761285a575b50506001905b0161271d565b8161286491610d0e565b6107da57863861284e565b9280808086865af161287f6122c3565b501561288c5789926127e9565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4661696c656420746f2073656e6420455448207265776172647320746f20726560448201527f6c617900000000000000000000000000000000000000000000000000000000006064820152fd5b873b1561054c576040517f01e336670000000000000000000000000000000000000000000000000000000081528360048201528960248201528260448201528481606481838d5af190811561059d57859161296d575b50506127e3565b8161297791610d0e565b61054c578338612966565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b000000000000000000000000000000000000006064820152fd5b505050600190612854565b508115612777565b5050505050509050565b8680808060409473ffffffffffffffffffffffffffffffffffffffff612a7d8751612a4e8982610d0e565b600e81527f726f636b6574436c61696d44414f0000000000000000000000000000000000006020820152611eed565b165af1612a886122c3565b5061271a57606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e64207044414f207265776172647300000000006044820152fd5b81808092612b2e604051612aff604082610d0e565b600f81527f726f636b6574546f6b656e5245544800000000000000000000000000000000006020820152611eed565b5af1612b386122c3565b5015612b45578638612712565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e642075736572207265776172647300000000006044820152fd5b863b156120e257604051907f3bed33ce00000000000000000000000000000000000000000000000000000000825260048201528281602481838b5af1908115612c08578391612bf3575b5061270b565b81612bfd91610d0e565b61027c578138612bed565b6040513d85823e3d90fd5b803b1561027c578180916044604051809481937f522f68150000000000000000000000000000000000000000000000000000000083523060048401528b60248401525af18015610288571561269d5781612c6c91610d0e565b6107da57863861269d565b863b1561027c57604051907fee91035e00000000000000000000000000000000000000000000000000000000825260606004830152600e60648301527f726f636b6574436c61696d44414f00000000000000000000000000000000000060848301528560248301526044820152818160a481838b5af18015610288571561266c5781612d0291610d0e565b612d0d57853861266c565b8580fd5b81612d1b91610d0e565b612d0d578538612660565b81612d3091610d0e565b61027c5781386125d4565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b84612d7591959295610d0e565b9238612401565b6020813d602011612da3575b81612d9560209383610d0e565b810103126105915751612375565b3d9150612d8856fea2646970667358221220e402ac624678d598c825bf0a57e7228412f39692667673c53da6f73559c278f664736f6c634300081e0033000000000000000000000000f4d539f1babdaa6e47b1112bc9fa1c83cf0ffe59

Deployed Bytecode

0x6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c908163043877d014610c635781630febabeb14610c08578163204e2a0a14610b715781632198e62c14610b5757816350a2f7e514610b3d57816354fd4d5014610b1e5781635af3ad5d14610a0d5781635f3c56f7146109e657816370ed0ada1461010b5781637425f1e7146109cc578163ab772cb11461094f578163b0aa28de146108b4578163b81bda511461088e578163ba34cb4b14610874578163c095415d14610866578163cdfd4e1c14610659578163e2d9f7b3146102b5578163f21c150c14610293578163f6a3f6ef146101a6578163f7b65fb214610110575063f96fef660361000e575b610cf3565b806003193601126101a35773ffffffffffffffffffffffffffffffffffffffff61014061013b611063565b611eed565b1681813b156101a35780600492604051938480927f98ea5fca00000000000000000000000000000000000000000000000000000000825234905af18015610196576101885780f35b61019191610d0e565b818180f35b50604051903d90823e3d90fd5b80fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c5760206101dc610231923690600401610dd0565b73ffffffffffffffffffffffffffffffffffffffff6101fc61013b6111de565b1660405180809581947fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b03915afa90811561028857829161024e575b602082604051908152f35b90506020813d602011610280575b8161026960209383610d0e565b8101031261027c57602091505182610243565b5080fd5b3d915061025c565b6040513d84823e3d90fd5b346101a357806003193601126101a35760206102ad61216a565b604051908152f35b346101a3576102c336610cbf565b61036973ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b60405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b519020611fb2565b1630146112da565b61037161216a565b8135036105d5576103c560405160208101906103bd816103918685611432565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b5190206121ee565b73ffffffffffffffffffffffffffffffffffffffff6103e561013b611477565b169073ffffffffffffffffffffffffffffffffffffffff61040761013b61133f565b169181670de0b6b3a76400000291670de0b6b3a76400008304036105a85790602060049392604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa92831561059d578593610563575b50610475600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa918215610558578492610520575b50106104c2576104bf906122f3565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e207265616368656400006044820152fd5b9091506020813d602011610550575b8161053c60209383610d0e565b8101031261054c575190846104b0565b8380fd5b3d915061052f565b6040513d86823e3d90fd5b92506020833d602011610595575b8161057e60209383610d0e565b8101031261059157915191610475610466565b8480fd5b3d9150610571565b6040513d87823e3d90fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f6400000000000000000000000000000000000000000000006064820152fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c573660238201121561027c5780600401359061069682610d7e565b916106a46040519384610d0e565b80835260051b8101602401602083013682116105915760248301905b82821061083657858573ffffffffffffffffffffffffffffffffffffffff6106e961013b6111de565b1681519061070f6106f983610d7e565b926107076040519485610d0e565b808452610d7e565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019401368537845b81518110156107f1578060206107556107899385611e12565b51604051809481927fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b0381875afa80156107e65787906107b0575b600192506107a98287611e12565b520161073c565b506020823d82116107de575b816107c960209383610d0e565b810103126107da576001915161079b565b8680fd5b3d91506107bc565b6040513d89823e3d90fd5b50505090604051928392602084019060208552518091526040840192915b81811061081d575050500390f35b825184528594506020938401939092019160010161080f565b813567ffffffffffffffff81116107da5760209161085b839260243691890101610dd0565b8152019101906106c0565b806003193601126101a35780f35b346101a357806003193601126101a35760206102ad6120e6565b346101a357806003193601126101a35760206108ab61013b611dd7565b31604051908152f35b346101a35760206003193601126101a35760206109316040518281019061035981610391600435856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346101a35760206003193601126101a35760206102ad604051828101906103bd81610391600435856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b346101a357806003193601126101a35760206102ad611d32565b346101a35760206102ad6109f936610cbf565b6040516103bd816103918682019485611432565b346101a357610a1b36610cbf565b610a3e73ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b610ab260405160208101907f64616f2e747275737465646e6f6465732e00000000000000000000000000000082527f6d656d626572000000000000000000000000000000000000000000000000000060318201523360601b6037820152602b8152610aaa604b82610d0e565b519020611e70565b15610ac0576104bf906114b2565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f64650000000000000000000000006044820152fd5b346101a357806003193601126101a35760ff6020915416604051908152f35b346101a357806003193601126101a35760206102ad611219565b346101a357806003193601126101a35760206102ad6110d9565b346101a35760406003193601126101a3576020610bfe610b8f610c97565b604051610aaa816103918682019460243590866040909392919360608152601f60608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff60a08201951660208201520152565b6040519015158152f35b346101a35760406003193601126101a357610c21610c97565b6024359167ffffffffffffffff83116101a35761018060031984360301126101a357604051602090610bfe9080830190610aaa8161039160048a018986610fdc565b346101a357806003193601126101a35760206102ad610c89610c836120e6565b42610e17565b610c91611219565b90610e53565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610cba57565b600080fd5b6020600319820112610cba576004359067ffffffffffffffff8211610cba576003198261018092030112610cba5760040190565b34610cba576000600319360112610cba5760206102ad611c91565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d4f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610d4f5760051b60200190565b67ffffffffffffffff8111610d4f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610cba57803590610de782610d96565b92610df56040519485610d0e565b82845260208383010111610cba57816000926020809301838601378301015290565b91908203918211610e2457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8115610e5d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215610cba57016020813591019167ffffffffffffffff8211610cba578160051b36038313610cba57565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311610cba5760209260051b809284830137010190565b610fd991813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100820135610100820152610fca610fbe610fa1610f8d610120860186610e8c565b610180610120870152610180860191610edf565b610faf610140860186610e8c565b90858303610140870152610edf565b92610160810190610e8c565b91610160818503910152610edf565b90565b60c09073ffffffffffffffffffffffffffffffffffffffff610fd9949360608352602360608401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808401527f6b6579000000000000000000000000000000000000000000000000000000000060a08401521660208201528160408201520190610f1c565b60405190611072604083610d0e565b600b82527f726f636b65745661756c740000000000000000000000000000000000000000006020830152565b604051906110ad604083610d0e565b600e82527f726f636b6574546f6b656e52504c0000000000000000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6110f961013b611063565b16602073ffffffffffffffffffffffffffffffffffffffff61111c61013b61109e565b1660405192838080937feccefff60000000000000000000000000000000000000000000000000000000082526040600483015261118760448301604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b90602483015203915afa9081156111d2576000916111a3575090565b90506020813d6020116111ca575b816111be60209383610d0e565b81010312610cba575190565b3d91506111b1565b6040513d6000823e3d90fd5b604051906111ed604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e6773526577617264736020830152565b6004602073ffffffffffffffffffffffffffffffffffffffff61123d61013b6111de565b16604051928380927f94e5d5120000000000000000000000000000000000000000000000000000000082525afa9081156111d2576000916111a3575090565b6040519061128b604083610d0e565b601182527f726f636b657452657761726473506f6f6c0000000000000000000000000000006020830152565b60005b8381106112ca5750506000910152565b81810151838201526020016112ba565b156112e157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e7472616374000000006044820152fd5b6040519061134e604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b6020830152565b90816020910312610cba57518015158103610cba5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610cba570180359067ffffffffffffffff8211610cba57602001918160051b36038313610cba57565b91908110156113f65760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908201809211610e2457565b906080610fd99260408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e7460608201528160208201520190610f1c565b60405190611486604083610d0e565b601482527f726f636b657444414f4e6f6465547275737465640000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6114d261013b61133f565b16906040517f63ed62da000000000000000000000000000000000000000000000000000000008152602081600481865afa9081156111d257600091611c62575b5015611bde5761152061216a565b90803593828511611b5a57608082013515611ad6576101408201926115458484611392565b61012085019291506115578386611392565b9190501480611ab2575b15611a545760009560c08501355b6115798787611392565b90508810156115ab576115a360019161159c8a6115968b8b611392565b906113e6565b3590611425565b97019661156f565b965091945091956000955b6115c08686611392565b90508710156115e5576115dd60019161159c896115968a8a611392565b9601956115b6565b91955093509490946115f5611d32565b106119f65761160d61010083013560e0840135611425565b926000935b61016084016116218186611392565b90508610156116465760019161159c8761159661163e9489611392565b940193611612565b5090935094909493919361165b61013b611dd7565b319061166e611668611c91565b83611425565b106119985760a08501351161193a57604051602081019061169481610391883386610fdc565b5190206116a081611e70565b6118dc576116ad90612062565b60408051606060208201818152601f60808401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a08401523393830193909352810185905261170e91906117068160c08101610391565b519020612062565b6040516020810190611724816103918885611432565b51902092611731846121ee565b9360018501809511610e24578461174791612252565b80604051604081527f60e3a6abeddae923bd65a9a5dcd11f9a8e38f12f885eef210b91203f3ca872b161177d6040830189610f1c565b914260208201528033930390a3036118d75773ffffffffffffffffffffffffffffffffffffffff6117af61013b611477565b169180670de0b6b3a76400000290670de0b6b3a7640000820403610e24576020600493604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa9283156111d2576000936118a1575b5061181c600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa9182156111d25760009261186d575b5010156118625750565b61186b906122f3565b565b9091506020813d602011611899575b8161188960209383610d0e565b81010312610cba57519038611858565b3d915061187c565b92506020833d6020116118cf575b816118bc60209383610d0e565b81010312610cba5791519161181c61180d565b3d91506118af565b505050565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f646500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420736d6f6f7468696e6720706f6f6c2062616c616e636500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c6964204554482072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c2072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e6774680000000000000000000000006044820152fd5b50611abd8285611392565b9050611acd610160860186611392565b91905014611561565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e65787400000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c65640000000000000000000000000000000000000000000000006064820152fd5b611c84915060203d602011611c8a575b611c7c8183610d0e565b81019061137a565b38611512565b503d611c72565b73ffffffffffffffffffffffffffffffffffffffff611cb161013b611063565b16602060405180927f35ee5f870000000000000000000000000000000000000000000000000000000082528260048301528180611d1c60248201604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b03915afa9081156111d2576000916111a3575090565b6004602073ffffffffffffffffffffffffffffffffffffffff611d5661013b61109e565b16604051928380927fc1a260060000000000000000000000000000000000000000000000000000000082525afa80156111d257600090611da3575b610fd99150611d9e6110d9565b611425565b506020813d602011611dcf575b81611dbd60209383610d0e565b81010312610cba57610fd99051611d91565b3d9150611db0565b60405190611de6604083610d0e565b601382527f726f636b6574536d6f6f7468696e67506f6f6c000000000000000000000000006020830152565b80518210156113f65760209160051b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452611e6981518092816020880152602088880191016112b7565b0116010190565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f7ae1cfca00000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091611ed4575090565b610fd9915060203d602011611c8a57611c7c8183610d0e565b611f359060405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b73ffffffffffffffffffffffffffffffffffffffff811615611f545790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f21f8a72100000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091612016575090565b6020813d60201161205a575b8161202f60209383610d0e565b8101031261027c57519073ffffffffffffffffffffffffffffffffffffffff821682036101a3575090565b3d9150612022565b60009073ffffffffffffffffffffffffffffffffffffffff825460081c1690813b156120e25782916044839260405194859384927fabfdcced0000000000000000000000000000000000000000000000000000000084526004840152600160248401525af18015610288576120d5575050565b816120df91610d0e565b50565b8280fd5b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee260048301525afa9081156111d2576000916111a3575090565b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760048301525afa9081156111d2576000916111a3575090565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937fbd02d0f500000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d2576000916111a3575090565b60009173ffffffffffffffffffffffffffffffffffffffff835460081c1691823b1561054c5790604484928360405195869485937fe2a4853a000000000000000000000000000000000000000000000000000000008552600485015260248401525af18015610288576120d5575050565b3d156122ee573d906122d482610d96565b916122e26040519384610d0e565b82523d6000602084013e565b606090565b6122fe61013b61109e565b9073ffffffffffffffffffffffffffffffffffffffff6000921673ffffffffffffffffffffffffffffffffffffffff61233861013b611063565b16916040517f0882400300000000000000000000000000000000000000000000000000000000815260208160048188875af1801561059d57612d7c575b5073ffffffffffffffffffffffffffffffffffffffff845460081c16803b15610591578480916044604051809481937fadb353dc0000000000000000000000000000000000000000000000000000000083527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f76004840152600160248401525af1801561059d57612d68575b5061240a6120e6565b94612413611219565b608083013590818102918183041490151715612d3b5794866124587fcdc52a6101e59cdabb15ba2e286593326138db03833e45895356994d978d28f996978399611425565b908435968791604051809160808252612474608083018a610f1c565b9060208301528560408301524260608301520390a26124fc60405160208101906124f2816103918b856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b5190204390612252565b6040516020810190612562816103918a856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b51902073ffffffffffffffffffffffffffffffffffffffff835460081c1690813b1561054c5783916044839260405194859384927fca446dd900000000000000000000000000000000000000000000000000000000845260048401523060248401525af1908115612c08578391612d26575b505460081c73ffffffffffffffffffffffffffffffffffffffff1690813b156120e25782916044839260405194859384927fe2a4853a0000000000000000000000000000000000000000000000000000000084527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2600485015260248401525af1801561028857612d11575b5060c083013580612c77575b505073ffffffffffffffffffffffffffffffffffffffff61268e61013b611dd7565b16928660a08401359485612c13575b50506101008301359560e0840135956126b68789611425565b9689975b61016087018b6126ca828a611392565b90508b10156126f0575060019161159c8b6115966126e8948c611392565b9801976126ba565b94989190506127059295995099929599610e17565b80612ba3575b5080612aea575b505080612a23575b50855b610140830161272c8185611392565b9050821015612a1957612746826115966127599387611392565b3561159c83611596610120880188611392565b61276b82611596610160870187611392565b35811591828093612a11575b612a065773ffffffffffffffffffffffffffffffffffffffff6127d360405160208101907f726577617264732e72656c61792e616464726573730000000000000000000000825287603582015260358152610359605582610d0e565b16918215612982578a9315612910575b8061286f575b823b1561054c5760a484928360405195869485937f44701afb0000000000000000000000000000000000000000000000000000000085528b60048601526001602486015260608d01356044860152606485015260848401525af180156102885761285a575b50506001905b0161271d565b8161286491610d0e565b6107da57863861284e565b9280808086865af161287f6122c3565b501561288c5789926127e9565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4661696c656420746f2073656e6420455448207265776172647320746f20726560448201527f6c617900000000000000000000000000000000000000000000000000000000006064820152fd5b873b1561054c576040517f01e336670000000000000000000000000000000000000000000000000000000081528360048201528960248201528260448201528481606481838d5af190811561059d57859161296d575b50506127e3565b8161297791610d0e565b61054c578338612966565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b000000000000000000000000000000000000006064820152fd5b505050600190612854565b508115612777565b5050505050509050565b8680808060409473ffffffffffffffffffffffffffffffffffffffff612a7d8751612a4e8982610d0e565b600e81527f726f636b6574436c61696d44414f0000000000000000000000000000000000006020820152611eed565b165af1612a886122c3565b5061271a57606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e64207044414f207265776172647300000000006044820152fd5b81808092612b2e604051612aff604082610d0e565b600f81527f726f636b6574546f6b656e5245544800000000000000000000000000000000006020820152611eed565b5af1612b386122c3565b5015612b45578638612712565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e642075736572207265776172647300000000006044820152fd5b863b156120e257604051907f3bed33ce00000000000000000000000000000000000000000000000000000000825260048201528281602481838b5af1908115612c08578391612bf3575b5061270b565b81612bfd91610d0e565b61027c578138612bed565b6040513d85823e3d90fd5b803b1561027c578180916044604051809481937f522f68150000000000000000000000000000000000000000000000000000000083523060048401528b60248401525af18015610288571561269d5781612c6c91610d0e565b6107da57863861269d565b863b1561027c57604051907fee91035e00000000000000000000000000000000000000000000000000000000825260606004830152600e60648301527f726f636b6574436c61696d44414f00000000000000000000000000000000000060848301528560248301526044820152818160a481838b5af18015610288571561266c5781612d0291610d0e565b612d0d57853861266c565b8580fd5b81612d1b91610d0e565b612d0d578538612660565b81612d3091610d0e565b61027c5781386125d4565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b84612d7591959295610d0e565b9238612401565b6020813d602011612da3575b81612d9560209383610d0e565b810103126105915751612375565b3d9150612d8856fea2646970667358221220e402ac624678d598c825bf0a57e7228412f39692667673c53da6f73559c278f664736f6c634300081e0033

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

000000000000000000000000f4d539f1babdaa6e47b1112bc9fa1c83cf0ffe59

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f4d539f1babdaa6e47b1112bc9fa1c83cf0ffe59


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
0x26B4395a5DC086b9aa8a2957e91B4134D098b0c6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.