Holesky Testnet

Contract

0xfFa2313125816EDa782Eb29849d9dd27063fd133

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Pay Out Contract...15165452024-05-10 14:04:48252 days ago1715349888IN
0xfFa23131...7063fd133
0 ETH0.0049043331.84324124

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x0B5Bf362...4120Cb5B3
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
RocketClaimDAO

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 15000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : RocketClaimDAO.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.18;
pragma abicoder v2;

import "../RocketBase.sol";
import "../../interface/RocketVaultInterface.sol";
import "../../interface/rewards/RocketRewardsPoolInterface.sol";
import "../../interface/rewards/claims/RocketClaimDAOInterface.sol";

/// @notice Recipient of pDAO RPL from inflation. Performs treasury spends and handles recurring payments.
contract RocketClaimDAO is RocketBase, RocketClaimDAOInterface {

    // Offsets into storage for contract details
    uint256 constant internal existsOffset = 0;
    uint256 constant internal recipientOffset = 1;
    uint256 constant internal amountOffset = 2;
    uint256 constant internal periodLengthOffset = 3;
    uint256 constant internal lastPaymentOffset = 4;
    uint256 constant internal numPeriodsOffset = 5;
    uint256 constant internal periodsPaidOffset = 6;

    // Events
    event RPLTokensSentByDAOProtocol(string indexed invoiceID, address indexed from, address indexed to, uint256 amount, uint256 time);
    event RPLTreasuryContractPayment(string indexed contractName, address indexed recipient, uint256 amount, uint256 time);
    event RPLTreasuryContractClaimed(address indexed recipient, uint256 amount, uint256 time);
    event RPLTreasuryContractCreated(string indexed contractName, address indexed recipient, uint256 amountPerPeriod, uint256 startTime, uint256 periodLength, uint256 numPeriods);
    event RPLTreasuryContractUpdated(string indexed contractName, address indexed recipient, uint256 amountPerPeriod, uint256 periodLength, uint256 numPeriods);

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

    /// @notice Returns whether a contract with the given name exists
    /// @param _contractName Name of the contract to check existence of
    function getContractExists(string calldata _contractName) external view returns (bool) {
        uint256 contractKey = uint256(keccak256(abi.encodePacked("dao.protocol.treasury.contract", _contractName)));
        return getBool(bytes32(contractKey + existsOffset));
    }

    /// @notice Gets details about a given payment contract
    /// @param _contractName Name of the contract to retrieve details for
    function getContract(string calldata _contractName) override external view returns (PaymentContract memory) {
        // Compute key
        uint256 contractKey = uint256(keccak256(abi.encodePacked("dao.protocol.treasury.contract", _contractName)));
        // Retrieve details
        PaymentContract memory paymentContract;
        paymentContract.recipient = getAddress(bytes32(contractKey + recipientOffset));
        paymentContract.amountPerPeriod = getUint(bytes32(contractKey + amountOffset));
        paymentContract.periodLength = getUint(bytes32(contractKey + periodLengthOffset));
        paymentContract.lastPaymentTime = getUint(bytes32(contractKey + lastPaymentOffset));
        paymentContract.numPeriods = getUint(bytes32(contractKey + numPeriodsOffset));
        paymentContract.periodsPaid = getUint(bytes32(contractKey + periodsPaidOffset));
        return paymentContract;
    }

    /// @notice Gets the outstanding balance owed to a given recipient
    /// @param _recipientAddress The address of the recipient to return the balance of
    function getBalance(address _recipientAddress) override external view returns (uint256) {
        return getUint(keccak256(abi.encodePacked("dao.protocol.treasury.balance", _recipientAddress)));
    }

    /// @notice Spend the network DAOs RPL rewards
    /// @param _invoiceID A string used to identify this payment (not used internally)
    /// @param _recipientAddress The address to send the RPL spend to
    /// @param _amount The amount of RPL to send
    function spend(string memory _invoiceID, address _recipientAddress, uint256 _amount) override external onlyLatestContract("rocketDAOProtocolProposals", msg.sender) onlyLatestContract("rocketClaimDAO", address(this)) {
        // Load contracts
        RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
        // Addresses
        IERC20 rplToken = IERC20(getContractAddress("rocketTokenRPL"));
        // Some initial checks
        require(_amount > 0 && _amount <= rocketVault.balanceOfToken("rocketClaimDAO", rplToken), "You cannot send 0 RPL or more than the DAO has in its account");
        // Send now
        rocketVault.withdrawToken(_recipientAddress, rplToken, _amount);
        // Log it
        emit RPLTokensSentByDAOProtocol(_invoiceID, address(this), _recipientAddress, _amount, block.timestamp);
    }

    /// @notice Creates a new recurring payment contract
    /// @param _contractName A string used to identify this payment
    /// @param _recipientAddress The address which can claim against this recurring payment
    /// @param _amountPerPeriod The amount of RPL that can be claimed each period
    /// @param _periodLength The length (in seconds) of periods of this contract
    /// @param _startTime A unix timestamp of when payments begin
    /// @param _numPeriods The number of periods this contract pays out for
    function newContract(string memory _contractName, address _recipientAddress, uint256 _amountPerPeriod, uint256 _periodLength, uint256 _startTime, uint256 _numPeriods) override external onlyLatestContract("rocketDAOProtocolProposals", msg.sender) onlyLatestContract("rocketClaimDAO", address(this)) {
        uint256 contractKey = uint256(keccak256(abi.encodePacked("dao.protocol.treasury.contract", _contractName)));
        // Ensure contract name uniqueness
        require(getBool(bytes32(contractKey + existsOffset)) == false, "Contract already exists");
        // Write to storage
        setBool(bytes32(contractKey + existsOffset), true);
        setAddress(bytes32(contractKey + recipientOffset), _recipientAddress);
        setUint(bytes32(contractKey + amountOffset), _amountPerPeriod);
        setUint(bytes32(contractKey + periodLengthOffset), _periodLength);
        setUint(bytes32(contractKey + lastPaymentOffset), _startTime);
        setUint(bytes32(contractKey + numPeriodsOffset), _numPeriods);
        // setUint(bytes32(contractKey + periodsPaidOffset), 0);
        // Log it
        emit RPLTreasuryContractCreated(_contractName, _recipientAddress, _amountPerPeriod, _startTime, _periodLength, _numPeriods);
    }

    /// @notice Modifies an existing recurring payment contract
    /// @param _contractName The contract to modify
    /// @param _recipientAddress The address which can claim against this recurring payment
    /// @param _amountPerPeriod The amount of RPL that can be claimed each period
    /// @param _periodLength The length (in seconds) of periods of this contract
    /// @param _numPeriods The number of periods this contract pays out for
    function updateContract(string memory _contractName, address _recipientAddress, uint256 _amountPerPeriod, uint256 _periodLength, uint256 _numPeriods) override external onlyLatestContract("rocketDAOProtocolProposals", msg.sender) onlyLatestContract("rocketClaimDAO", address(this)) {
        uint256 contractKey = uint256(keccak256(abi.encodePacked("dao.protocol.treasury.contract", _contractName)));
        // Check it exists
        require(getBool(bytes32(contractKey + existsOffset)) == true, "Contract does not exist");
        // Write to storage
        uint256 lastPaymentTime = getUint(bytes32(contractKey + lastPaymentOffset));
        // Payout contract per existing parameters if contract has already started
        if (block.timestamp > lastPaymentTime) {
            payOutContract(_contractName);
        }
        // Update the contract
        setAddress(bytes32(contractKey + recipientOffset), _recipientAddress);
        setUint(bytes32(contractKey + amountOffset), _amountPerPeriod);
        setUint(bytes32(contractKey + periodLengthOffset), _periodLength);
        setUint(bytes32(contractKey + numPeriodsOffset), _numPeriods);
        // Log it
        emit RPLTreasuryContractUpdated(_contractName, _recipientAddress, _amountPerPeriod, _periodLength, _numPeriods);
    }

    /// @notice Can be called to withdraw any paid amounts of RPL to the supplied recipient
    /// @param _recipientAddress The recipient address to claim for
    function withdrawBalance(address _recipientAddress) override public onlyLatestContract("rocketClaimDAO", address(this)) {
        // Load contracts
        RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
        // Addresses
        IERC20 rplToken = IERC20(getContractAddress("rocketTokenRPL"));
        // Get pending balance
        bytes32 balanceKey = keccak256(abi.encodePacked("dao.protocol.treasury.balance", _recipientAddress));
        uint256 amount = getUint(balanceKey);
        // Zero out pending balance
        setUint(balanceKey, 0);
        // Some initial checks
        require(amount > 0, "No balance to withdraw");
        require(amount <= rocketVault.balanceOfToken("rocketClaimDAO", rplToken), "Insufficient treasury balance for withdrawal");
        // Send now
        rocketVault.withdrawToken(_recipientAddress, rplToken, amount);
        // Log it
        emit RPLTreasuryContractClaimed(_recipientAddress, amount, block.timestamp);
    }

    /// @notice Executes payout on the given contracts
    /// @param _contractNames An array of contract names to execute a payout on
    function payOutContracts(string[] calldata _contractNames) override external onlyLatestContract("rocketClaimDAO", address(this)) {
        uint256 contractNamesLength = _contractNames.length;
        for (uint256 i = 0; i < contractNamesLength; ++i) {
            payOutContract(_contractNames[i]);
        }
    }

    /// @notice Executes a payout on given contracts and withdraws the resulting balance to the recipient
    /// @param _contractNames An array of contract names to execute a payout and withdraw on
    function payOutContractsAndWithdraw(string[] calldata _contractNames) override external onlyLatestContract("rocketClaimDAO", address(this)) {
        uint256 contractNamesLength = _contractNames.length;
        for (uint256 i = 0; i < contractNamesLength; ++i) {
            // Payout contract
            payOutContract(_contractNames[i]);
            // Withdraw to contract recipient
            uint256 contractKey = uint256(keccak256(abi.encodePacked("dao.protocol.treasury.contract", _contractNames[i])));
            address recipient = getAddress(bytes32(contractKey + recipientOffset));
            withdrawBalance(recipient);
        }
    }

    /// @dev Pays out any outstanding amounts to the recipient of a contract
    function payOutContract(string memory _contractName) internal {
        uint256 contractKey = uint256(keccak256(abi.encodePacked("dao.protocol.treasury.contract", _contractName)));

        uint256 lastPaymentTime = getUint(bytes32(contractKey + lastPaymentOffset));

        // Payments haven't started yet (nothing to do)
        if (block.timestamp < lastPaymentTime) {
            return;
        }

        uint256 periodLength = getUint(bytes32(contractKey + periodLengthOffset));
        uint256 periodsToPay = (block.timestamp - lastPaymentTime) / periodLength;

        uint256 periodsPaid = getUint(bytes32(contractKey + periodsPaidOffset));
        uint256 numPeriods = getUint(bytes32(contractKey + numPeriodsOffset));

        // Calculate how many periods to pay
        if (periodsToPay + periodsPaid > numPeriods) {
            periodsToPay = numPeriods - periodsPaid;
        }

        // Already paid up to date
        if (periodsToPay == 0) {
            return;
        }

        address recipientAddress = getAddress(bytes32(contractKey + recipientOffset));
        uint256 amountPerPeriod = getUint(bytes32(contractKey + amountOffset));
        uint256 amountToPay = periodsToPay * amountPerPeriod;

        // Update last paid timestamp and periods paid
        setUint(bytes32(contractKey + lastPaymentOffset), lastPaymentTime + (periodsToPay * periodLength));
        setUint(bytes32(contractKey + periodsPaidOffset), periodsPaid + periodsToPay);

        // Add to the recipient's balance
        addUint(keccak256(abi.encodePacked("dao.protocol.treasury.balance", recipientAddress)), amountToPay);

        // Emit event
        emit RPLTreasuryContractPayment(_contractName, recipientAddress, amountToPay, block.timestamp);
    }
}

File 2 of 9 : RocketStorageInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

pragma solidity >0.5.0 <0.9.0;

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

interface RocketStorageInterface {

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

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

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

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

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

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

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

File 3 of 9 : RocketBase.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

pragma solidity >0.5.0 <0.9.0;

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

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

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

abstract contract RocketBase {

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

    // Version of the contract
    uint8 public version;

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


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

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

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

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

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

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

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




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

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


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


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


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

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



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

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

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

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

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

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

File 4 of 9 : IERC20.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

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

File 5 of 9 : IERC20Burnable.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

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

File 6 of 9 : RocketVaultInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

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;
}

File 7 of 9 : RewardSubmission.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

pragma solidity >0.5.0 <0.9.0;

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

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

File 8 of 9 : RocketRewardsPoolInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;

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

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

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

File 9 of 9 : RocketClaimDAOInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |  DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0  |
  * +---------------------------------------------------+
  *
  *  Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned,
  *  decentralised, trustless and compatible with staking in Ethereum 2.0.
  *
  *  For more information about Rocket Pool, visit https://rocketpool.net
  *
  *  Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
  *
  */

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

interface RocketClaimDAOInterface {
    // Struct for returning data about a payment contract
    struct PaymentContract {
        address recipient;
        uint256 amountPerPeriod;
        uint256 periodLength;
        uint256 lastPaymentTime;
        uint256 numPeriods;
        uint256 periodsPaid;
    }

    function getContractExists(string calldata _contractName) external view returns (bool);
    function getContract(string calldata _contractName) external view returns (PaymentContract memory);
    function getBalance(address _recipientAddress) external view returns (uint256);
    function spend(string memory _invoiceID, address _recipientAddress, uint256 _amount) external;
    function newContract(string memory _contractName, address _recipientAddress, uint256 _amountPerPeriod, uint256 _periodLength, uint256 _startTime, uint256 _numPeriods) external;
    function updateContract(string memory _contractName, address _recipientAddress, uint256 _amountPerPeriod, uint256 _periodLength, uint256 _numPeriods) external;
    function withdrawBalance(address _recipientAddress) external;
    function payOutContracts(string[] calldata _contractNames) external;
    function payOutContractsAndWithdraw(string[] calldata _contractNames) external;
}

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

Contract ABI

[{"inputs":[{"internalType":"contract RocketStorageInterface","name":"_rocketStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"invoiceID","type":"string"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RPLTokensSentByDAOProtocol","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RPLTreasuryContractClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"contractName","type":"string"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPerPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"periodLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numPeriods","type":"uint256"}],"name":"RPLTreasuryContractCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"contractName","type":"string"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RPLTreasuryContractPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"contractName","type":"string"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPerPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"periodLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numPeriods","type":"uint256"}],"name":"RPLTreasuryContractUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_recipientAddress","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_contractName","type":"string"}],"name":"getContract","outputs":[{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountPerPeriod","type":"uint256"},{"internalType":"uint256","name":"periodLength","type":"uint256"},{"internalType":"uint256","name":"lastPaymentTime","type":"uint256"},{"internalType":"uint256","name":"numPeriods","type":"uint256"},{"internalType":"uint256","name":"periodsPaid","type":"uint256"}],"internalType":"struct RocketClaimDAOInterface.PaymentContract","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_contractName","type":"string"}],"name":"getContractExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_contractName","type":"string"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"_amountPerPeriod","type":"uint256"},{"internalType":"uint256","name":"_periodLength","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_numPeriods","type":"uint256"}],"name":"newContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_contractNames","type":"string[]"}],"name":"payOutContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_contractNames","type":"string[]"}],"name":"payOutContractsAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_invoiceID","type":"string"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"spend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractName","type":"string"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"_amountPerPeriod","type":"uint256"},{"internalType":"uint256","name":"_periodLength","type":"uint256"},{"internalType":"uint256","name":"_numPeriods","type":"uint256"}],"name":"updateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipientAddress","type":"address"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100be5760003560e01c806354fd4d501161007657806379bfbbab1161005b57806379bfbbab146101cd578063b110221f146101e0578063f8b2cb4f146101f357600080fd5b806354fd4d501461019b578063756af45f146101ba57600080fd5b806322b5b367116100a757806322b5b367146100eb578063283dee8114610113578063358177731461012657600080fd5b8063082ef32b146100c35780631fe9dbc8146100d8575b600080fd5b6100d66100d1366004611edb565b610214565b005b6100d66100e6366004611f35565b6106ed565b6100fe6100f9366004611faa565b610851565b60405190151581526020015b60405180910390f35b6100d661012136600461200a565b6108bc565b610139610134366004611faa565b610c31565b60405161010a9190600060c08201905073ffffffffffffffffffffffffffffffffffffffff83511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b6000546101a89060ff1681565b60405160ff909116815260200161010a565b6100d66101c8366004612074565b610d89565b6100d66101db366004611f35565b611220565b6100d66101ee366004612098565b6113bd565b610206610201366004612074565b61170d565b60405190815260200161010a565b6040518060400160405280601a81526020017f726f636b657444414f50726f746f636f6c50726f706f73616c730000000000008152503361027a8260405160200161025f919061213a565b60405160208183030381529060405280519060200120611787565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064015b60405180910390fd5b6040518060400160405280600e81526020017f726f636b6574436c61696d44414f0000000000000000000000000000000000008152503061035e8260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b60006104326040518060400160405280600b81526020017f726f636b65745661756c7400000000000000000000000000000000000000000081525061181f565b905060006104746040518060400160405280600e81526020017f726f636b6574546f6b656e52504c00000000000000000000000000000000000081525061181f565b905060008711801561054b5750604080517feccefff60000000000000000000000000000000000000000000000000000000081526004810191909152600e60448201527f726f636b6574436c61696d44414f000000000000000000000000000000000000606482015273ffffffffffffffffffffffffffffffffffffffff828116602483015283169063eccefff690608401602060405180830381865afa158015610523573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610547919061216c565b8711155b6105d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f596f752063616e6e6f742073656e6420302052504c206f72206d6f726520746860448201527f616e207468652044414f2068617320696e20697473206163636f756e74000000606482015260840161030a565b6040517f01e3366700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528281166024830152604482018990528316906301e3366790606401600060405180830381600087803b15801561064f57600080fd5b505af1158015610663573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168a6040516106a39190612185565b604080519182900382208b8352426020840152917f67bc1df65bfeb7ba2e83fb564e265ea67b0dbe2adc511918505cd75fef5d3dd9910160405180910390a4505050505050505050565b6040518060400160405280600e81526020017f726f636b6574436c61696d44414f000000000000000000000000000000000000815250306107388260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b8260005b81811015610849576108398686838181106107ed576107ed612191565b90506020028101906107ff91906121c0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118b592505050565b6108428161225b565b90506107d0565b505050505050565b6000808383604051602001610867929190612293565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090506108b26108ad6000836122cc565b611af6565b9150505b92915050565b6040518060400160405280601a81526020017f726f636b657444414f50726f746f636f6c50726f706f73616c73000000000000815250336109078260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461099b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b6040518060400160405280600e81526020017f726f636b6574436c61696d44414f000000000000000000000000000000000000815250306109e68260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b600089604051602001610a8d91906122df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050610ad36108ad6000836122cc565b1515600114610b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436f6e747261637420646f6573206e6f74206578697374000000000000000000604482015260640161030a565b6000610b53610b4e6004846122cc565b611b8e565b905080421115610b6657610b668b6118b5565b610b7a610b746001846122cc565b8b611c26565b610b8e610b886002846122cc565b8a611cb5565b610ba2610b9c6003846122cc565b89611cb5565b610bb6610bb06005846122cc565b88611cb5565b8973ffffffffffffffffffffffffffffffffffffffff168b604051610bdb9190612185565b604080519182900382208c8352602083018c90529082018a9052907ffa56d0791aff69b5708fda8c9063ef271b9d86a8edf1a71d09dd957626873e08906060015b60405180910390a35050505050505050505050565b610c806040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b60008383604051602001610c95929190612293565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060c0840183526000808552918401829052918301819052606083018190526080830181905260a08301529150610d0a610d056001846122cc565b611787565b73ffffffffffffffffffffffffffffffffffffffff168152610d30610b4e6002846122cc565b6020820152610d43610b4e6003846122cc565b6040820152610d56610b4e6004846122cc565b6060820152610d69610b4e6005846122cc565b6080820152610d7c610b4e6006846122cc565b60a0820152949350505050565b6040518060400160405280600e81526020017f726f636b6574436c61696d44414f00000000000000000000000000000000000081525030610dd48260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b6000610ea86040518060400160405280600b81526020017f726f636b65745661756c7400000000000000000000000000000000000000000081525061181f565b90506000610eea6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c00000000000000000000000000000000000081525061181f565b6040517f64616f2e70726f746f636f6c2e74726561737572792e62616c616e636500000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16603d8201529091506000906051016040516020818303038152906040528051906020012090506000610f6b82611b8e565b9050610f78826000611cb5565b60008111610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f2062616c616e636520746f20776974686472617700000000000000000000604482015260640161030a565b604080517feccefff60000000000000000000000000000000000000000000000000000000081526004810191909152600e60448201527f726f636b6574436c61696d44414f000000000000000000000000000000000000606482015273ffffffffffffffffffffffffffffffffffffffff848116602483015285169063eccefff690608401602060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a8919061216c565b811115611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f496e73756666696369656e742074726561737572792062616c616e636520666f60448201527f72207769746864726177616c0000000000000000000000000000000000000000606482015260840161030a565b6040517f01e3366700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528481166024830152604482018390528516906301e3366790606401600060405180830381600087803b1580156111af57600080fd5b505af11580156111c3573d6000803e3d6000fd5b50506040805184815242602082015273ffffffffffffffffffffffffffffffffffffffff8b1693507f631de3344f76ff7d4da6e58dcb5b4442ef60511d6f6cd53c13d32cb2bdf5105d92500160405180910390a250505050505050565b6040518060400160405280600e81526020017f726f636b6574436c61696d44414f0000000000000000000000000000000000008152503061126b8260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b8260005b81811015610849576113208686838181106107ed576107ed612191565b600086868381811061133457611334612191565b905060200281019061134691906121c0565b604051602001611357929190612293565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050600061139f610d056001846122cc565b90506113aa81610d89565b5050806113b69061225b565b9050611303565b6040518060400160405280601a81526020017f726f636b657444414f50726f746f636f6c50726f706f73616c73000000000000815250336114088260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461149c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b6040518060400160405280600e81526020017f726f636b6574436c61696d44414f000000000000000000000000000000000000815250306114e78260405160200161025f919061213a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015260640161030a565b60008a60405160200161158e91906122df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090506115d46108ad6000836122cc565b1561163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436f6e747261637420616c726561647920657869737473000000000000000000604482015260640161030a565b6116506116496000836122cc565b6001611d17565b61165e610b746001836122cc565b61166c610b886002836122cc565b61167a610b9c6003836122cc565b611688610bb06004836122cc565b61169c6116966005836122cc565b87611cb5565b8973ffffffffffffffffffffffffffffffffffffffff168b6040516116c19190612185565b604080519182900382208c8352602083018b90529082018b905260608201899052907ff88d6c208815ad2a911935f9b27c477f802d162e3abf33cc676411ba70b2f4bd90608001610c1c565b6040517f64616f2e70726f746f636f6c2e74726561737572792e62616c616e636500000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b16603d8201526000906108b69060510160405160208183030381529060405280519060200120611b8e565b600080546040517f21f8a7210000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff16906321f8a72190602401602060405180830381865afa1580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190612311565b6000806118368360405160200161025f919061213a565b905073ffffffffffffffffffffffffffffffffffffffff81166108b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e640000000000000000000000000000604482015260640161030a565b6000816040516020016118c891906122df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090506000611910610b4e6004846122cc565b90508042101561191f57505050565b600061192f610b4e6003856122cc565b905060008161193e844261232e565b6119489190612341565b9050600061195a610b4e6006876122cc565b9050600061196c610b4e6005886122cc565b90508061197983856122cc565b111561198c57611989828261232e565b92505b8260000361199d5750505050505050565b60006119ad610d056001896122cc565b905060006119bf610b4e60028a6122cc565b905060006119cd828761237c565b90506119f66119dd60048b6122cc565b6119e7898961237c565b6119f1908b6122cc565b611cb5565b611a0e611a0460068b6122cc565b6119f188886122cc565b6040517f64616f2e70726f746f636f6c2e74726561737572792e62616c616e636500000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16603d820152611a86906051016040516020818303038152906040528051906020012082611d7a565b8273ffffffffffffffffffffffffffffffffffffffff168a604051611aab9190612185565b60408051918290038220848352426020840152917f207b08b29cb6f7384a852c47050c9d8d0604b62bbbf71316b6108c92b1fd9e18910160405180910390a350505050505050505050565b600080546040517f7ae1cfca0000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff1690637ae1cfca90602401602060405180830381865afa158015611b6a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190612393565b600080546040517fbd02d0f50000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff169063bd02d0f590602401602060405180830381865afa158015611c02573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b6919061216c565b6000546040517fca446dd90000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff83811660248301526101009092049091169063ca446dd9906044015b600060405180830381600087803b158015611ca157600080fd5b505af1158015610849573d6000803e3d6000fd5b6000546040517fe2a4853a000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063e2a4853a90604401611c87565b6000546040517fabfdcced00000000000000000000000000000000000000000000000000000000815260048101849052821515602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063abfdcced90604401611c87565b6000546040517fadb353dc000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063adb353dc90604401611c87565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112611e1c57600080fd5b813567ffffffffffffffff80821115611e3757611e37611ddc565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611e7d57611e7d611ddc565b81604052838152866020858801011115611e9657600080fd5b836020870160208301376000602085830101528094505050505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114611ed857600080fd5b50565b600080600060608486031215611ef057600080fd5b833567ffffffffffffffff811115611f0757600080fd5b611f1386828701611e0b565b9350506020840135611f2481611eb6565b929592945050506040919091013590565b60008060208385031215611f4857600080fd5b823567ffffffffffffffff80821115611f6057600080fd5b818501915085601f830112611f7457600080fd5b813581811115611f8357600080fd5b8660208260051b8501011115611f9857600080fd5b60209290920196919550909350505050565b60008060208385031215611fbd57600080fd5b823567ffffffffffffffff80821115611fd557600080fd5b818501915085601f830112611fe957600080fd5b813581811115611ff857600080fd5b866020828501011115611f9857600080fd5b600080600080600060a0868803121561202257600080fd5b853567ffffffffffffffff81111561203957600080fd5b61204588828901611e0b565b955050602086013561205681611eb6565b94979496505050506040830135926060810135926080909101359150565b60006020828403121561208657600080fd5b813561209181611eb6565b9392505050565b60008060008060008060c087890312156120b157600080fd5b863567ffffffffffffffff8111156120c857600080fd5b6120d489828a01611e0b565b96505060208701356120e581611eb6565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6000815160005b8181101561212b5760208185018101518683015201612111565b50600093019283525090919050565b7f636f6e74726163742e616464726573730000000000000000000000000000000081526000612091601083018461210a565b60006020828403121561217e57600080fd5b5051919050565b6000612091828461210a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126121f557600080fd5b83018035915067ffffffffffffffff82111561221057600080fd5b60200191503681900382131561222557600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361228c5761228c61222c565b5060010190565b7f64616f2e70726f746f636f6c2e74726561737572792e636f6e7472616374000081528183601e83013760009101601e01908152919050565b808201808211156108b6576108b661222c565b7f64616f2e70726f746f636f6c2e74726561737572792e636f6e7472616374000081526000612091601e83018461210a565b60006020828403121561232357600080fd5b815161209181611eb6565b818103818111156108b6576108b661222c565b600082612377577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176108b6576108b661222c565b6000602082840312156123a557600080fd5b8151801515811461209157600080fdfea26469706673582212208f71e7ae63712de755b0e79d1c43ab4aaf8b7655039f3387f58865b7ebdfa37164736f6c63430008120033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.