ETH Price: $1,557.16 (-2.19%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

> 10 Internal Transactions found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Get Length222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Address222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Full Deposit...222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Length222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Address222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Half Deposit...222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Length222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Address222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Variable Dep...222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Address222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Address222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Effective Ca...222441042025-04-11 7:08:231 hr ago1744355303
Rocket Pool: Mini pool Queue
0 ETH
Get Length222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Address222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Full Deposit...222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Length222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Address222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Half Deposit...222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Length222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Address222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Variable Dep...222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Address222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Address222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Effective Ca...222440562025-04-11 6:58:471 hr ago1744354727
Rocket Pool: Mini pool Queue
0 ETH
Get Length222431942025-04-11 4:05:594 hrs ago1744344359
Rocket Pool: Mini pool Queue
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RocketMinipoolQueue

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 15000 runs

Other Settings:
default evmVersion, GNU GPLv3 license
File 1 of 12 : RocketMinipoolQueue.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.7.6;

import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/math/SignedSafeMath.sol";
import "@openzeppelin/contracts/utils/SafeCast.sol";

import "../RocketBase.sol";
import "../../interface/minipool/RocketMinipoolInterface.sol";
import "../../interface/minipool/RocketMinipoolQueueInterface.sol";
import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsMinipoolInterface.sol";
import "../../interface/util/AddressQueueStorageInterface.sol";
import "../../types/MinipoolDeposit.sol";

/// @notice Minipool queueing for deposit assignment
contract RocketMinipoolQueue is RocketBase, RocketMinipoolQueueInterface {

    // Libs
    using SafeMath for uint;
    using SignedSafeMath for int;

    // Constants
    bytes32 private constant queueKeyFull = keccak256("minipools.available.full");
    bytes32 private constant queueKeyHalf = keccak256("minipools.available.half");
    bytes32 private constant queueKeyVariable = keccak256("minipools.available.variable");

    // Events
    event MinipoolEnqueued(address indexed minipool, bytes32 indexed queueId, uint256 time);
    event MinipoolDequeued(address indexed minipool, bytes32 indexed queueId, uint256 time);
    event MinipoolRemoved(address indexed minipool, bytes32 indexed queueId, uint256 time);

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

    /// @notice Get the total combined length of the queues
    function getTotalLength() override external view returns (uint256) {
        return (
            getLengthLegacy(queueKeyFull)
        ).add(
            getLengthLegacy(queueKeyHalf)
        ).add(
            getLength()
        );
    }

    /// @notice Returns true if there are any legacy minipools in the queue
    function getContainsLegacy() override external view returns (bool) {
        return getLengthLegacy(queueKeyFull).add(getLengthLegacy(queueKeyHalf)) > 0;
    }

    /// @notice Get the length of a given queue. Returns 0 for invalid queues
    /// @param _depositType Which queue to query the length of
    function getLengthLegacy(MinipoolDeposit _depositType) override external view returns (uint256) {
        if (_depositType == MinipoolDeposit.Full) { return getLengthLegacy(queueKeyFull); }
        if (_depositType == MinipoolDeposit.Half) { return getLengthLegacy(queueKeyHalf); }
        return 0;
    }

    /// @dev Returns a queue length by internal key representation
    /// @param _key The internal key representation of the queue to query the length of
    function getLengthLegacy(bytes32 _key) private view returns (uint256) {
        AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage"));
        return addressQueueStorage.getLength(_key);
    }

    /// @notice Gets the length of the variable (global) queue
    function getLength() override public view returns (uint256) {
        AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage"));
        return addressQueueStorage.getLength(queueKeyVariable);
    }

    /// @notice Get the total combined capacity of the queues
    function getTotalCapacity() override external view returns (uint256) {
        RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool"));
        return (
            getLengthLegacy(queueKeyFull).mul(rocketDAOProtocolSettingsMinipool.getFullDepositUserAmount())
        ).add(
            getLengthLegacy(queueKeyHalf).mul(rocketDAOProtocolSettingsMinipool.getHalfDepositUserAmount())
        ).add(
            getVariableCapacity()
        );
    }

    /// @notice Get the total effective capacity of the queues (used in node demand calculation)
    function getEffectiveCapacity() override external view returns (uint256) {
        RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool"));
        return (
            getLengthLegacy(queueKeyFull).mul(rocketDAOProtocolSettingsMinipool.getFullDepositUserAmount())
        ).add(
            getLengthLegacy(queueKeyHalf).mul(rocketDAOProtocolSettingsMinipool.getHalfDepositUserAmount())
        ).add(
            getVariableCapacity()
        );
    }

    /// @dev Get the ETH capacity of the variable queue
    function getVariableCapacity() internal view returns (uint256) {
        RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool"));
        return getLength().mul(rocketDAOProtocolSettingsMinipool.getVariableDepositAmount());
    }

    /// @notice Get the capacity of the next available minipool. Returns 0 if no minipools are available
    function getNextCapacityLegacy() override external view returns (uint256) {
        RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool"));
        if (getLengthLegacy(queueKeyHalf) > 0) { return rocketDAOProtocolSettingsMinipool.getHalfDepositUserAmount(); }
        if (getLengthLegacy(queueKeyFull) > 0) { return rocketDAOProtocolSettingsMinipool.getFullDepositUserAmount(); }
        return 0;
    }

    /// @notice Get the deposit type of the next available minipool and the number of deposits in that queue.
    ///         Returns None if no minipools are available
    function getNextDepositLegacy() override external view returns (MinipoolDeposit, uint256) {
        uint256 length = getLengthLegacy(queueKeyHalf);
        if (length > 0) { return (MinipoolDeposit.Half, length); }
        length = getLengthLegacy(queueKeyFull);
        if (length > 0) { return (MinipoolDeposit.Full, length); }
        return (MinipoolDeposit.None, 0);
    }

    /// @dev Add a minipool to the end of the appropriate queue. Only accepts calls from the RocketMinipoolManager contract
    /// @param _minipool Address of the minipool to add to the queue
    function enqueueMinipool(address _minipool) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyLatestContract("rocketNodeDeposit", msg.sender) {
        // Enqueue
        AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage"));
        addressQueueStorage.enqueueItem(queueKeyVariable, _minipool);
        // Emit enqueued event
        emit MinipoolEnqueued(_minipool, queueKeyVariable, block.timestamp);
    }

    /// @dev Dequeues a minipool from a legacy queue
    /// @param _depositType The queue to dequeue a minipool from
    function dequeueMinipoolByDepositLegacy(MinipoolDeposit _depositType) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyLatestContract("rocketDepositPool", msg.sender) returns (address minipoolAddress) {
        if (_depositType == MinipoolDeposit.Half) { return dequeueMinipool(queueKeyHalf); }
        if (_depositType == MinipoolDeposit.Full) { return dequeueMinipool(queueKeyFull); }
        require(false, "No minipools are available");
    }

    /// @dev Dequeues multiple minipools from the variable queue and returns them all
    /// @param _maxToDequeue The maximum number of items to dequeue
    function dequeueMinipools(uint256 _maxToDequeue) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyLatestContract("rocketDepositPool", msg.sender) returns (address[] memory minipoolAddress) {
        uint256 queueLength = getLength();
        uint256 count = _maxToDequeue;
        if (count > queueLength) {
            count = queueLength;
        }
        address[] memory minipoolAddresses = new address[](count);
        for (uint256 i = 0; i < count; i++) {
            RocketMinipoolInterface minipool = RocketMinipoolInterface(dequeueMinipool(queueKeyVariable));
            minipoolAddresses[i] = address(minipool);
        }
        return minipoolAddresses;
    }

    /// @dev Dequeues a minipool from a queue given an internal key
    /// @param _key The internal key representation of the queue from which to dequeue a minipool from
    function dequeueMinipool(bytes32 _key) private returns (address) {
        // Dequeue
        AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage"));
        address minipool = addressQueueStorage.dequeueItem(_key);
        // Emit dequeued event
        emit MinipoolDequeued(minipool, _key, block.timestamp);
        // Return
        return minipool;
    }

    /// @dev Remove a minipool from a queue. Only accepts calls from registered minipools
    function removeMinipool(MinipoolDeposit _depositType) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyRegisteredMinipool(msg.sender) {
        // Remove minipool from queue
        if (_depositType == MinipoolDeposit.Half) { return removeMinipool(queueKeyHalf, msg.sender); }
        if (_depositType == MinipoolDeposit.Full) { return removeMinipool(queueKeyFull, msg.sender); }
        if (_depositType == MinipoolDeposit.Variable) { return removeMinipool(queueKeyVariable, msg.sender); }
        require(false, "Invalid minipool deposit type");
    }

    /// @dev Removes a minipool from a queue given an internal key
    /// @param _key The internal key representation of the queue from which to remove a minipool from
    /// @param _minipool The address of a minipool to remove from the specified queue
    function removeMinipool(bytes32 _key, address _minipool) private {
        // Remove
        AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage"));
        addressQueueStorage.removeItem(_key, _minipool);
        // Emit removed event
        emit MinipoolRemoved(_minipool, _key, block.timestamp);
    }

    /// @notice Returns the minipool address of the minipool in the global queue at a given index
    /// @param _index The index into the queue to retrieve
    function getMinipoolAt(uint256 _index) override external view returns(address) {
        AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage"));

        // Check if index is in the half queue
        uint256 halfLength = addressQueueStorage.getLength(queueKeyHalf);
        if (_index < halfLength) {
            return addressQueueStorage.getItem(queueKeyHalf, _index);
        }
        _index = _index.sub(halfLength);

        // Check if index is in the full queue
        uint256 fullLength = addressQueueStorage.getLength(queueKeyFull);
        if (_index < fullLength) {
            return addressQueueStorage.getItem(queueKeyFull, _index);
        }
        _index = _index.sub(fullLength);

        // Check if index is in the full queue
        uint256 variableLength = addressQueueStorage.getLength(queueKeyVariable);
        if (_index < variableLength) {
            return addressQueueStorage.getItem(queueKeyVariable, _index);
        }

        // Index is out of bounds
        return address(0);
    }

    /// @notice Returns the position a given minipool is in the queue
    /// @param _minipool The minipool to query the position of
    function getMinipoolPosition(address _minipool) override external view returns (int256) {
        AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage"));
        int256 position;

        // Check in half queue
        position = addressQueueStorage.getIndexOf(queueKeyHalf, _minipool);
        if (position != -1) {
            return position;
        }
        int256 offset = SafeCast.toInt256(addressQueueStorage.getLength(queueKeyHalf));

        // Check in full queue
        position = addressQueueStorage.getIndexOf(queueKeyFull, _minipool);
        if (position != -1) {
            return offset.add(position);
        }
        offset = offset.add(SafeCast.toInt256(addressQueueStorage.getLength(queueKeyFull)));

        // Check in variable queue
        position = addressQueueStorage.getIndexOf(queueKeyVariable, _minipool);
        if (position != -1) {
            return offset.add(position);
        }

        // Isn't in the queue
        return -1;
    }
}

File 2 of 12 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 3 of 12 : SignedSafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @title SignedSafeMath
 * @dev Signed math operations with safety checks that revert on error.
 */
library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

    /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

        return c;
    }
}

File 4 of 12 : SafeCast.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= -2**127 && value < 2**127, "SafeCast: value doesn\'t fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= -2**63 && value < 2**63, "SafeCast: value doesn\'t fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= -2**31 && value < 2**31, "SafeCast: value doesn\'t fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= -2**15 && value < 2**15, "SafeCast: value doesn\'t fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= -2**7 && value < 2**7, "SafeCast: value doesn\'t fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        require(value < 2**255, "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

File 5 of 12 : 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 6 of 12 : 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.7.6;

// 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(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 7 of 12 : MinipoolDeposit.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.7.6;

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

// Represents the type of deposits required by a minipool

enum MinipoolDeposit {
    None,       // Marks an invalid deposit type
    Full,       // The minipool requires 32 ETH from the node operator, 16 ETH of which will be refinanced from user deposits
    Half,       // The minipool required 16 ETH from the node operator to be matched with 16 ETH from user deposits
    Empty,      // The minipool requires 0 ETH from the node operator to be matched with 32 ETH from user deposits (trusted nodes only)
    Variable    // Indicates this minipool is of the new generation that supports a variable deposit amount
}

File 8 of 12 : MinipoolStatus.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.7.6;

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

// Represents a minipool's status within the network

enum MinipoolStatus {
    Initialised,    // The minipool has been initialised and is awaiting a deposit of user ETH
    Prelaunch,      // The minipool has enough ETH to begin staking and is awaiting launch by the node operator
    Staking,        // The minipool is currently staking
    Withdrawable,   // NO LONGER USED
    Dissolved       // The minipool has been dissolved and its user deposited ETH has been returned to the deposit pool
}

File 9 of 12 : RocketMinipoolInterface.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 "../../types/MinipoolDeposit.sol";
import "../../types/MinipoolStatus.sol";
import "../RocketStorageInterface.sol";

interface RocketMinipoolInterface {
    function version() external view returns (uint8);
    function initialise(address _nodeAddress) external;
    function getStatus() external view returns (MinipoolStatus);
    function getFinalised() external view returns (bool);
    function getStatusBlock() external view returns (uint256);
    function getStatusTime() external view returns (uint256);
    function getScrubVoted(address _member) external view returns (bool);
    function getDepositType() external view returns (MinipoolDeposit);
    function getNodeAddress() external view returns (address);
    function getNodeFee() external view returns (uint256);
    function getNodeDepositBalance() external view returns (uint256);
    function getNodeRefundBalance() external view returns (uint256);
    function getNodeDepositAssigned() external view returns (bool);
    function getPreLaunchValue() external view returns (uint256);
    function getNodeTopUpValue() external view returns (uint256);
    function getVacant() external view returns (bool);
    function getPreMigrationBalance() external view returns (uint256);
    function getUserDistributed() external view returns (bool);
    function getUserDepositBalance() external view returns (uint256);
    function getUserDepositAssigned() external view returns (bool);
    function getUserDepositAssignedTime() external view returns (uint256);
    function getTotalScrubVotes() external view returns (uint256);
    function calculateNodeShare(uint256 _balance) external view returns (uint256);
    function calculateUserShare(uint256 _balance) external view returns (uint256);
    function preDeposit(uint256 _bondingValue, bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) external payable;
    function deposit() external payable;
    function userDeposit() external payable;
    function distributeBalance(bool _rewardsOnly) external;
    function beginUserDistribute() external;
    function userDistributeAllowed() external view returns (bool);
    function refund() external;
    function slash() external;
    function finalise() external;
    function canStake() external view returns (bool);
    function canPromote() external view returns (bool);
    function stake(bytes calldata _validatorSignature, bytes32 _depositDataRoot) external;
    function prepareVacancy(uint256 _bondAmount, uint256 _currentBalance) external;
    function promote() external;
    function dissolve() external;
    function close() external;
    function voteScrub() external;
    function reduceBondAmount() external;
}

File 10 of 12 : RocketMinipoolQueueInterface.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 "../../types/MinipoolDeposit.sol";

interface RocketMinipoolQueueInterface {
    function getTotalLength() external view returns (uint256);
    function getContainsLegacy() external view returns (bool);
    function getLengthLegacy(MinipoolDeposit _depositType) external view returns (uint256);
    function getLength() external view returns (uint256);
    function getTotalCapacity() external view returns (uint256);
    function getEffectiveCapacity() external view returns (uint256);
    function getNextCapacityLegacy() external view returns (uint256);
    function getNextDepositLegacy() external view returns (MinipoolDeposit, uint256);
    function enqueueMinipool(address _minipool) external;
    function dequeueMinipoolByDepositLegacy(MinipoolDeposit _depositType) external returns (address minipoolAddress);
    function dequeueMinipools(uint256 _maxToDequeue) external returns (address[] memory minipoolAddress);
    function removeMinipool(MinipoolDeposit _depositType) external;
    function getMinipoolAt(uint256 _index) external view returns(address);
    function getMinipoolPosition(address _minipool) external view returns (int256);
}

File 11 of 12 : RocketDAOProtocolSettingsMinipoolInterface.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 "../../../../types/MinipoolDeposit.sol";

interface RocketDAOProtocolSettingsMinipoolInterface {
    function getLaunchBalance() external view returns (uint256);
    function getPreLaunchValue() external pure returns (uint256);
    function getDepositUserAmount(MinipoolDeposit _depositType) external view returns (uint256);
    function getFullDepositUserAmount() external view returns (uint256);
    function getHalfDepositUserAmount() external view returns (uint256);
    function getVariableDepositAmount() external view returns (uint256);
    function getSubmitWithdrawableEnabled() external view returns (bool);
    function getBondReductionEnabled() external view returns (bool);
    function getLaunchTimeout() external view returns (uint256);
    function getMaximumCount() external view returns (uint256);
    function isWithinUserDistributeWindow(uint256 _time) external view returns (bool);
    function hasUserDistributeWindowPassed(uint256 _time) external view returns (bool);
    function getUserDistributeWindowStart() external view returns (uint256);
    function getUserDistributeWindowLength() external view returns (uint256);
}

File 12 of 12 : AddressQueueStorageInterface.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 AddressQueueStorageInterface {
    function getLength(bytes32 _key) external view returns (uint);
    function getItem(bytes32 _key, uint _index) external view returns (address);
    function getIndexOf(bytes32 _key, address _value) external view returns (int);
    function enqueueItem(bytes32 _key, address _value) external;
    function dequeueItem(bytes32 _key) external returns (address);
    function removeItem(bytes32 _key, address _value) external;
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract RocketStorageInterface","name":"_rocketStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minipool","type":"address"},{"indexed":true,"internalType":"bytes32","name":"queueId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"MinipoolDequeued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minipool","type":"address"},{"indexed":true,"internalType":"bytes32","name":"queueId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"MinipoolEnqueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minipool","type":"address"},{"indexed":true,"internalType":"bytes32","name":"queueId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"MinipoolRemoved","type":"event"},{"inputs":[{"internalType":"enum MinipoolDeposit","name":"_depositType","type":"uint8"}],"name":"dequeueMinipoolByDepositLegacy","outputs":[{"internalType":"address","name":"minipoolAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxToDequeue","type":"uint256"}],"name":"dequeueMinipools","outputs":[{"internalType":"address[]","name":"minipoolAddress","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minipool","type":"address"}],"name":"enqueueMinipool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContainsLegacy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEffectiveCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum MinipoolDeposit","name":"_depositType","type":"uint8"}],"name":"getLengthLegacy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getMinipoolAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minipool","type":"address"}],"name":"getMinipoolPosition","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextCapacityLegacy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextDepositLegacy","outputs":[{"internalType":"enum MinipoolDeposit","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum MinipoolDeposit","name":"_depositType","type":"uint8"}],"name":"removeMinipool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

608060405260008054610100600160a81b031916905534801561002157600080fd5b506040516128483803806128488339818101604052602081101561004457600080fd5b50516000805460ff196001600160a01b0390931661010002610100600160a81b0319909116179190911660021790556127c6806100826000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80637e0e497b11610097578063de1bdc8f11610066578063de1bdc8f1461028b578063e60b40bf146101ac578063e99f75c8146102ab578063eff7319f146102f4576100f5565b80637e0e497b146101f257806380d8ad9c1461025f5780638ed8045314610267578063be1c766b14610283576100f5565b80632f3eb409116100d35780632f3eb40914610177578063442c18f3146101ac57806354fd4d50146101b45780635e83d2d7146101d2576100f5565b8063043887b4146100fa57806304b5466b1461013f57806323b9eec01461016f575b600080fd5b61012d6004803603602081101561011057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610311565b60408051918252519081900360200190f35b61014761077e565b6040518083600481111561015757fe5b81526020018281526020019250505060405180910390f35b61012d610808565b6101aa6004803603602081101561018d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610876565b005b61012d610c71565b6101bc610ded565b6040805160ff9092168252519081900360200190f35b61012d600480360360208110156101e857600080fd5b503560ff16610df6565b61020f6004803603602081101561020857600080fd5b5035610e81565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561024b578181015183820152602001610233565b505050509050019250505060405180910390f35b61012d6111bd565b61026f61130e565b604080519115158252519081900360200190f35b61012d611343565b6101aa600480360360208110156102a157600080fd5b503560ff16611429565b6102cb600480360360208110156102c157600080fd5b503560ff16611746565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102cb6004803603602081101561030a57600080fd5b5035611a8a565b6000806103526040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff166368ee92c97f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d602081101561040f57600080fd5b505190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146104435791506107799050565b60006104ea8373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b505afa1580156104cd573d6000803e3d6000fd5b505050506040513d60208110156104e357600080fd5b5051611fe6565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561057b57600080fd5b505afa15801561058f573d6000803e3d6000fd5b505050506040513d60208110156105a557600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146105e4576105da8183612064565b9350505050610779565b61066261065b8473ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b8290612064565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d602081101561071d57600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214610752576105da8183612064565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93505050505b919050565b60008060006107ac7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b905080156107bf57600292509050610804565b6107e87f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b905080156107fb57600192509050610804565b60008092509250505b9091565b6000610870610815611343565b61086a6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b61086a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b906121b1565b90505b90565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c5175657565000000000000000000000000008152503061094b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090b5780518252601f1990920191602091820191016108ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612225565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744e6f64654465706f73697400000000000000000000000000000081525033610a788260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6000610b516040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff166380323a467fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610be457600080fd5b505af1158015610bf8573d6000803e3d6000fd5b50506040805142815290517fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca935073ffffffffffffffffffffffffffffffffffffffff8a1692507fbb0085efc3718b7af2204fd1f1fda8ef9d3fbaa40f8fc7f4b04ae90d692e4fca9181900360200190a3505050505050565b600080610c9560405180606001604052806021815260200161272760219139611efc565b9050610de7610ca26122cb565b61086a610d498473ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b5051610d437f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b9061236e565b61086a8573ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9257600080fd5b505afa158015610da6573d6000803e3d6000fd5b505050506040513d6020811015610dbc57600080fd5b5051610d437f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b91505090565b60005460ff1681565b60006001826004811115610e0657fe5b1415610e3c57610e357f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b9050610779565b6002826004811115610e4a57fe5b1415610e7957610e357f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b506000919050565b60606040518060400160405280601381526020017f726f636b65744d696e69706f6f6c51756575650000000000000000000000000081525030610f178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336110448260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60006110e7611343565b905086818111156110f55750805b60008167ffffffffffffffff8111801561110e57600080fd5b50604051908082528060200260200182016040528015611138578160200160208202803683370190505b50905060005b828110156111ae5760006111717fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6123e1565b90508083838151811061118057fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525060010161113e565b50965050505b50505050919050565b6000806111e160405180606001604052806021815260200161272760219139611efc565b9050600061120e7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b111561128f578073ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b505afa15801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b505191506108739050565b60006112ba7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b1115611306578073ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b600091505090565b60008061133d6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b11905090565b6000806113846040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b505191505090565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306114bd8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461155657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b604080517f6d696e69706f6f6c2e657869737473000000000000000000000000000000000060208083019190915233606081901b602f84015283516023818503018152604390930190935281519101206115af906124fd565b61161a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964206d696e69706f6f6c00000000000000000000000000000000604482015290519081900360640190fd5b600284600481111561162857fe5b141561165d576116587f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb896621818833612571565b611740565b600184600481111561166b57fe5b141561169b576116587f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff7833612571565b60048460048111156116a957fe5b14156116d9576116587fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca33612571565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c6964206d696e69706f6f6c206465706f7369742074797065000000604482015290519081900360640190fd5b50505050565b60006040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306117dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461187557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336119098260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60028660048111156119b057fe5b14156119e6576119df7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886123e1565b94506111b4565b60018660048111156119f457fe5b1415611a23576119df7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786123e1565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f206d696e69706f6f6c732061726520617661696c61626c65000000000000604482015290519081900360640190fd5b600080611acb6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611b4057600080fd5b505afa158015611b54573d6000803e3d6000fd5b505050506040513d6020811015611b6a57600080fd5b5051905080841015611c25578173ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d6020811015611c1957600080fd5b50519250610779915050565b611c2f848261268e565b935060008273ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d6020811015611cce57600080fd5b5051905080851015611d8a578273ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051935061077992505050565b611d94858261268e565b945060008373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e0957600080fd5b505afa158015611e1d573d6000803e3d6000fd5b505050506040513d6020811015611e3357600080fd5b5051905080861015611ef0578373ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611eb857600080fd5b505afa158015611ecc573d6000803e3d6000fd5b505050506040513d6020811015611ee257600080fd5b505194506107799350505050565b50600095945050505050565b600080611f5c8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b905073ffffffffffffffffffffffffffffffffffffffff8116611fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e640000000000000000000000000000604482015290519081900360640190fd5b92915050565b60007f80000000000000000000000000000000000000000000000000000000000000008210612060576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806127696028913960400191505060405180910390fd5b5090565b60008282018183128015906120795750838112155b8061208e575060008312801561208e57508381125b6120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127066021913960400191505060405180910390fd5b9392505050565b60008061212b6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561217e57600080fd5b505afa158015612192573d6000803e3d6000fd5b505050506040513d60208110156121a857600080fd5b50519392505050565b6000828201838110156120e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b505afa1580156122ad573d6000803e3d6000fd5b505050506040513d60208110156122c357600080fd5b505192915050565b6000806122ef60405180606001604052806021815260200161272760219139611efc565b9050610de78173ffffffffffffffffffffffffffffffffffffffff16633469f7b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051610d43611343565b60008261237d57506000611fe0565b8282028284828161238a57fe5b04146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127486021913960400191505060405180910390fd5b6000806124226040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663dc5be997856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b505050506040513d60208110156124a357600080fd5b5051604080514281529051919250859173ffffffffffffffffffffffffffffffffffffffff8416917fc7d9de0aecd8d5829d96dfdb22c26b4625da22c5098c557e8b034a58015f189a919081900360200190a39392505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b60006125b16040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663f79b36ad84846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505060408051428152905186935073ffffffffffffffffffffffffffffffffffffffff861692507fb6d64f28f41bc6e066bffb445f6bc0fd239b21ec1f771ce451fad263637be4b49181900360200190a3505050565b6000828211156126ff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77726f636b657444414f50726f746f636f6c53657474696e67734d696e69706f6f6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e74323536a26469706673582212205d26846ed29ad9feac2251891ab57b112c12d1879ca7d668aaea01eb2e24bae164736f6c634300070600330000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80637e0e497b11610097578063de1bdc8f11610066578063de1bdc8f1461028b578063e60b40bf146101ac578063e99f75c8146102ab578063eff7319f146102f4576100f5565b80637e0e497b146101f257806380d8ad9c1461025f5780638ed8045314610267578063be1c766b14610283576100f5565b80632f3eb409116100d35780632f3eb40914610177578063442c18f3146101ac57806354fd4d50146101b45780635e83d2d7146101d2576100f5565b8063043887b4146100fa57806304b5466b1461013f57806323b9eec01461016f575b600080fd5b61012d6004803603602081101561011057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610311565b60408051918252519081900360200190f35b61014761077e565b6040518083600481111561015757fe5b81526020018281526020019250505060405180910390f35b61012d610808565b6101aa6004803603602081101561018d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610876565b005b61012d610c71565b6101bc610ded565b6040805160ff9092168252519081900360200190f35b61012d600480360360208110156101e857600080fd5b503560ff16610df6565b61020f6004803603602081101561020857600080fd5b5035610e81565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561024b578181015183820152602001610233565b505050509050019250505060405180910390f35b61012d6111bd565b61026f61130e565b604080519115158252519081900360200190f35b61012d611343565b6101aa600480360360208110156102a157600080fd5b503560ff16611429565b6102cb600480360360208110156102c157600080fd5b503560ff16611746565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102cb6004803603602081101561030a57600080fd5b5035611a8a565b6000806103526040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff166368ee92c97f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d602081101561040f57600080fd5b505190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146104435791506107799050565b60006104ea8373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b505afa1580156104cd573d6000803e3d6000fd5b505050506040513d60208110156104e357600080fd5b5051611fe6565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561057b57600080fd5b505afa15801561058f573d6000803e3d6000fd5b505050506040513d60208110156105a557600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146105e4576105da8183612064565b9350505050610779565b61066261065b8473ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b8290612064565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d602081101561071d57600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214610752576105da8183612064565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93505050505b919050565b60008060006107ac7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b905080156107bf57600292509050610804565b6107e87f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b905080156107fb57600192509050610804565b60008092509250505b9091565b6000610870610815611343565b61086a6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b61086a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b906121b1565b90505b90565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c5175657565000000000000000000000000008152503061094b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090b5780518252601f1990920191602091820191016108ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612225565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744e6f64654465706f73697400000000000000000000000000000081525033610a788260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6000610b516040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff166380323a467fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610be457600080fd5b505af1158015610bf8573d6000803e3d6000fd5b50506040805142815290517fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca935073ffffffffffffffffffffffffffffffffffffffff8a1692507fbb0085efc3718b7af2204fd1f1fda8ef9d3fbaa40f8fc7f4b04ae90d692e4fca9181900360200190a3505050505050565b600080610c9560405180606001604052806021815260200161272760219139611efc565b9050610de7610ca26122cb565b61086a610d498473ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b5051610d437f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b9061236e565b61086a8573ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9257600080fd5b505afa158015610da6573d6000803e3d6000fd5b505050506040513d6020811015610dbc57600080fd5b5051610d437f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b91505090565b60005460ff1681565b60006001826004811115610e0657fe5b1415610e3c57610e357f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b9050610779565b6002826004811115610e4a57fe5b1415610e7957610e357f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b506000919050565b60606040518060400160405280601381526020017f726f636b65744d696e69706f6f6c51756575650000000000000000000000000081525030610f178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336110448260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60006110e7611343565b905086818111156110f55750805b60008167ffffffffffffffff8111801561110e57600080fd5b50604051908082528060200260200182016040528015611138578160200160208202803683370190505b50905060005b828110156111ae5760006111717fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6123e1565b90508083838151811061118057fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525060010161113e565b50965050505b50505050919050565b6000806111e160405180606001604052806021815260200161272760219139611efc565b9050600061120e7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b111561128f578073ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b505afa15801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b505191506108739050565b60006112ba7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b1115611306578073ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b600091505090565b60008061133d6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b11905090565b6000806113846040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b505191505090565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306114bd8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461155657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b604080517f6d696e69706f6f6c2e657869737473000000000000000000000000000000000060208083019190915233606081901b602f84015283516023818503018152604390930190935281519101206115af906124fd565b61161a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964206d696e69706f6f6c00000000000000000000000000000000604482015290519081900360640190fd5b600284600481111561162857fe5b141561165d576116587f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb896621818833612571565b611740565b600184600481111561166b57fe5b141561169b576116587f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff7833612571565b60048460048111156116a957fe5b14156116d9576116587fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca33612571565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c6964206d696e69706f6f6c206465706f7369742074797065000000604482015290519081900360640190fd5b50505050565b60006040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306117dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461187557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336119098260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60028660048111156119b057fe5b14156119e6576119df7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886123e1565b94506111b4565b60018660048111156119f457fe5b1415611a23576119df7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786123e1565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f206d696e69706f6f6c732061726520617661696c61626c65000000000000604482015290519081900360640190fd5b600080611acb6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611b4057600080fd5b505afa158015611b54573d6000803e3d6000fd5b505050506040513d6020811015611b6a57600080fd5b5051905080841015611c25578173ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d6020811015611c1957600080fd5b50519250610779915050565b611c2f848261268e565b935060008273ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d6020811015611cce57600080fd5b5051905080851015611d8a578273ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051935061077992505050565b611d94858261268e565b945060008373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e0957600080fd5b505afa158015611e1d573d6000803e3d6000fd5b505050506040513d6020811015611e3357600080fd5b5051905080861015611ef0578373ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611eb857600080fd5b505afa158015611ecc573d6000803e3d6000fd5b505050506040513d6020811015611ee257600080fd5b505194506107799350505050565b50600095945050505050565b600080611f5c8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b905073ffffffffffffffffffffffffffffffffffffffff8116611fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e640000000000000000000000000000604482015290519081900360640190fd5b92915050565b60007f80000000000000000000000000000000000000000000000000000000000000008210612060576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806127696028913960400191505060405180910390fd5b5090565b60008282018183128015906120795750838112155b8061208e575060008312801561208e57508381125b6120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127066021913960400191505060405180910390fd5b9392505050565b60008061212b6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561217e57600080fd5b505afa158015612192573d6000803e3d6000fd5b505050506040513d60208110156121a857600080fd5b50519392505050565b6000828201838110156120e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b505afa1580156122ad573d6000803e3d6000fd5b505050506040513d60208110156122c357600080fd5b505192915050565b6000806122ef60405180606001604052806021815260200161272760219139611efc565b9050610de78173ffffffffffffffffffffffffffffffffffffffff16633469f7b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051610d43611343565b60008261237d57506000611fe0565b8282028284828161238a57fe5b04146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127486021913960400191505060405180910390fd5b6000806124226040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663dc5be997856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b505050506040513d60208110156124a357600080fd5b5051604080514281529051919250859173ffffffffffffffffffffffffffffffffffffffff8416917fc7d9de0aecd8d5829d96dfdb22c26b4625da22c5098c557e8b034a58015f189a919081900360200190a39392505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b60006125b16040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663f79b36ad84846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505060408051428152905186935073ffffffffffffffffffffffffffffffffffffffff861692507fb6d64f28f41bc6e066bffb445f6bc0fd239b21ec1f771ce451fad263637be4b49181900360200190a3505050565b6000828211156126ff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77726f636b657444414f50726f746f636f6c53657474696e67734d696e69706f6f6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e74323536a26469706673582212205d26846ed29ad9feac2251891ab57b112c12d1879ca7d668aaea01eb2e24bae164736f6c63430007060033

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

0000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46

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

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.