Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 144 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Submit Reward Sn... | 1589093 | 33 days ago | IN | 0 ETH | 0.00189697 | ||||
| Submit Reward Sn... | 1589076 | 33 days ago | IN | 0 ETH | 0.00091075 | ||||
| Submit Reward Sn... | 1576378 | 35 days ago | IN | 0 ETH | 0.00215973 | ||||
| Submit Reward Sn... | 1576377 | 35 days ago | IN | 0 ETH | 0.00141512 | ||||
| Submit Reward Sn... | 1576377 | 35 days ago | IN | 0 ETH | 0.00093124 | ||||
| Submit Reward Sn... | 1563255 | 37 days ago | IN | 0 ETH | 0.00194289 | ||||
| Submit Reward Sn... | 1563243 | 37 days ago | IN | 0 ETH | 0.00095588 | ||||
| Submit Reward Sn... | 1549553 | 39 days ago | IN | 0 ETH | 0.00202937 | ||||
| Submit Reward Sn... | 1549552 | 39 days ago | IN | 0 ETH | 0.00092945 | ||||
| Submit Reward Sn... | 1535881 | 41 days ago | IN | 0 ETH | 0.00193603 | ||||
| Submit Reward Sn... | 1535861 | 41 days ago | IN | 0 ETH | 0.00089284 | ||||
| Submit Reward Sn... | 1522252 | 43 days ago | IN | 0 ETH | 0.00194472 | ||||
| Submit Reward Sn... | 1522249 | 43 days ago | IN | 0 ETH | 0.00091495 | ||||
| Submit Reward Sn... | 1508806 | 45 days ago | IN | 0 ETH | 0.00188956 | ||||
| Submit Reward Sn... | 1508799 | 45 days ago | IN | 0 ETH | 0.00093097 | ||||
| Submit Reward Sn... | 1495502 | 47 days ago | IN | 0 ETH | 0.00195046 | ||||
| Submit Reward Sn... | 1495498 | 47 days ago | IN | 0 ETH | 0.0009156 | ||||
| Submit Reward Sn... | 1482575 | 49 days ago | IN | 0 ETH | 0.0019329 | ||||
| Submit Reward Sn... | 1482564 | 49 days ago | IN | 0 ETH | 0.00088222 | ||||
| Submit Reward Sn... | 1469808 | 51 days ago | IN | 0 ETH | 0.00191091 | ||||
| Submit Reward Sn... | 1469801 | 51 days ago | IN | 0 ETH | 0.00097064 | ||||
| Submit Reward Sn... | 1456720 | 53 days ago | IN | 0 ETH | 0.00218043 | ||||
| Submit Reward Sn... | 1456713 | 53 days ago | IN | 0 ETH | 0.000904 | ||||
| Submit Reward Sn... | 1442860 | 55 days ago | IN | 0 ETH | 0.00205619 | ||||
| Submit Reward Sn... | 1442855 | 55 days ago | IN | 0 ETH | 0.00091809 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
Amount
|
||
|---|---|---|---|---|---|---|---|
| Relay Rewards | 1589093 | 33 days ago | 0 ETH | ||||
| Withdraw Token | 1589093 | 33 days ago | 0 ETH | ||||
| Get Address | 1589093 | 33 days ago | 0 ETH | ||||
| Get Address | 1589093 | 33 days ago | 0 ETH | ||||
| Transfer Token | 1589093 | 33 days ago | 0 ETH | ||||
| Set Uint | 1589093 | 33 days ago | 0 ETH | ||||
| Set Address | 1589093 | 33 days ago | 0 ETH | ||||
| Set Uint | 1589093 | 33 days ago | 0 ETH | ||||
| Get Rewards Clai... | 1589093 | 33 days ago | 0 ETH | ||||
| Get Address | 1589093 | 33 days ago | 0 ETH | ||||
| Get Uint | 1589093 | 33 days ago | 0 ETH | ||||
| Add Uint | 1589093 | 33 days ago | 0 ETH | ||||
| Inflation Mint T... | 1589093 | 33 days ago | 0 ETH | ||||
| Get Address | 1589093 | 33 days ago | 0 ETH | ||||
| Get Address | 1589093 | 33 days ago | 0 ETH | ||||
| Get Node Consens... | 1589093 | 33 days ago | 0 ETH | ||||
| Get Member Count | 1589093 | 33 days ago | 0 ETH | ||||
| Get Address | 1589093 | 33 days ago | 0 ETH | ||||
| Set Uint | 1589093 | 33 days ago | 0 ETH | ||||
| Get Uint | 1589093 | 33 days ago | 0 ETH | ||||
| Set Bool | 1589093 | 33 days ago | 0 ETH | ||||
| Set Bool | 1589093 | 33 days ago | 0 ETH | ||||
| Get Bool | 1589093 | 33 days ago | 0 ETH | ||||
| Balance Of | 1589093 | 33 days ago | 0 ETH | ||||
| Get Address | 1589093 | 33 days ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RocketRewardsPool
Compiler Version
v0.8.30+commit.73712a01
Contract Source Code (Solidity Standard Json-Input format)
/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.30;
import {RocketStorageInterface} from "../../interface/RocketStorageInterface.sol";
import {RocketVaultInterface} from "../../interface/RocketVaultInterface.sol";
import {RocketDAONodeTrustedInterface} from "../../interface/dao/node/RocketDAONodeTrustedInterface.sol";
import {RocketDAOProtocolSettingsNetworkInterface} from "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsNetworkInterface.sol";
import {RocketDAOProtocolSettingsRewardsInterface} from "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsRewardsInterface.sol";
import {RocketRewardsPoolInterface} from "../../interface/rewards/RocketRewardsPoolInterface.sol";
import {RocketRewardsRelayInterface} from "../../interface/rewards/RocketRewardsRelayInterface.sol";
import {RocketSmoothingPoolInterface} from "../../interface/rewards/RocketSmoothingPoolInterface.sol";
import {RocketTokenRPLInterface} from "../../interface/token/RocketTokenRPLInterface.sol";
import {IERC20} from "../../interface/util/IERC20.sol";
import {RewardSubmission} from "../../types/RewardSubmission.sol";
import {RocketBase} from "../RocketBase.sol";
import {RocketVaultWithdrawerInterface} from "../../interface/RocketVaultWithdrawerInterface.sol";
/// @notice Holds RPL and ETH generated by the network for distribution each reward cycle
contract RocketRewardsPool is RocketBase, RocketRewardsPoolInterface, RocketVaultWithdrawerInterface {
// Constants
uint256 constant internal treeVersion = 1;
// Events
event RewardSnapshotSubmitted(address indexed from, uint256 indexed rewardIndex, RewardSubmission submission, uint256 time);
event RewardSnapshot(uint256 indexed rewardIndex, RewardSubmission submission, uint256 intervalStartTime, uint256 intervalEndTime, uint256 time);
// Construct
constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) {
version = 5;
}
/// @dev Needs to freely accept ETH withdrawn from the smoothing pool
receive() payable external {}
/// @dev Needs to freely accept ETH withdrawn from the vault
function receiveVaultWithdrawalETH() external payable {}
/// @notice Accepts incoming ETH from megapool distributions for voter share into vault
function depositVoterShare() override payable external {
// Transfer incoming ETH directly to the vault
RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
rocketVault.depositEther{value: msg.value}();
}
/// @notice Returns the amount of ETH rewards waiting to be distributed
function getEthBalance() override external view returns (uint256) {
RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
return rocketVault.balanceOf("rocketRewardsPool");
}
/// @notice Get the reward index
function getRewardIndex() override public view returns (uint256) {
return getUint(keccak256("rewards.snapshot.index"));
}
/// @notice Increment the reward index
function incrementRewardIndex() private {
addUint(keccak256("rewards.snapshot.index"), 1);
}
/// @notice Get how much RPL the Rewards Pool contract currently has assigned to it as a whole
/// @return uint256 Returns rpl balance of rocket rewards contract
function getRPLBalance() override public view returns (uint256) {
// Get the vault contract instance
RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
// Check contract RPL balance
return rocketVault.balanceOfToken("rocketRewardsPool", IERC20(getContractAddress("rocketTokenRPL")));
}
/// @notice Returns the total amount of RPL that needs to be distributed to claimers at the current block
function getPendingRPLRewards() override public view returns (uint256) {
RocketTokenRPLInterface rplContract = RocketTokenRPLInterface(getContractAddress("rocketTokenRPL"));
uint256 pendingInflation = rplContract.inflationCalculate();
// Any inflation that has accrued so far plus any amount that would be minted if we called it now
return getRPLBalance() + pendingInflation;
}
/// @notice Returns the total amount of ETH in the smoothing pool ready to be distributed
function getPendingETHRewards() override public view returns (uint256) {
address rocketSmoothingPoolAddress = getContractAddress("rocketSmoothingPool");
return rocketSmoothingPoolAddress.balance;
}
/// @notice Returns the amount of pending voter share ETH ready to be distributed
function getPendingVoterShare() override public view returns (uint256) {
RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
return rocketVault.balanceOf("rocketRewardsPool");
}
/// @notice Get the last set interval start time
/// @return uint256 Last set start timestamp for a claim interval
function getClaimIntervalTimeStart() override public view returns (uint256) {
return getUint(keccak256("rewards.pool.claim.interval.time.start"));
}
/// @notice Get how many seconds in a claim interval
/// @return uint256 Number of seconds in a claim interval
function getClaimIntervalTime() override public view returns (uint256) {
// Get from the DAO settings
RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
return daoSettingsRewards.getRewardsClaimIntervalTime();
}
/// @notice Compute intervals since last claim period
/// @return uint256 Time intervals since last update
function getClaimIntervalsPassed() override public view returns (uint256) {
return (block.timestamp - getClaimIntervalTimeStart()) / getClaimIntervalTime();
}
/// @notice Returns the block number that the given claim interval was executed at
/// @param _interval The interval for which to grab the execution block of
function getClaimIntervalExecutionBlock(uint256 _interval) override external view returns (uint256) {
return getUint(keccak256(abi.encodePacked("rewards.pool.interval.execution.block", _interval)));
}
/// @notice Returns the address of the contract which was used to execute this reward interval
/// @param _interval The interval for which to grab the address of
function getClaimIntervalExecutionAddress(uint256 _interval) override external view returns (address) {
return getAddress(keccak256(abi.encodePacked("rewards.pool.interval.execution.address", _interval)));
}
/// @notice Get the percentage this contract can claim in this interval
/// @return uint256 Rewards percentage this contract can claim in this interval
function getClaimingContractPerc(string memory _claimingContract) override public view returns (uint256) {
// Load contract
RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
// Get the % amount allocated to this claim contract
return daoSettingsRewards.getRewardsClaimerPerc(_claimingContract);
}
/// @notice Get an array of percentages that the given contracts can claim in this interval
/// @return uint256[] Array of percentages in the order of the supplied contract names
function getClaimingContractsPerc(string[] memory _claimingContracts) override external view returns (uint256[] memory) {
// Load contract
RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
// Get the % amount allocated to this claim contract
uint256[] memory percentages = new uint256[](_claimingContracts.length);
for (uint256 i = 0; i < _claimingContracts.length; ++i) {
percentages[i] = daoSettingsRewards.getRewardsClaimerPerc(_claimingContracts[i]);
}
return percentages;
}
/// @notice Returns whether a trusted node has submitted for a given reward index
function getTrustedNodeSubmitted(address _trustedNodeAddress, uint256 _rewardIndex) override external view returns (bool) {
return getBool(keccak256(abi.encode("rewards.snapshot.submitted.node", _trustedNodeAddress, _rewardIndex)));
}
/// @notice Returns whether a trusted node has submitted a specific RewardSubmission
function getSubmissionFromNodeExists(address _trustedNodeAddress, RewardSubmission calldata _submission) override external view returns (bool) {
return getBool(keccak256(abi.encode("rewards.snapshot.submitted.node.key", _trustedNodeAddress, _submission)));
}
/// @notice Returns the number of trusted nodes who have agreed to the given submission
function getSubmissionCount(RewardSubmission calldata _submission) override external view returns (uint256) {
return getUint(keccak256(abi.encode("rewards.snapshot.submitted.count", _submission)));
}
/// @notice Submit a reward snapshot. Only accepts calls from trusted (oracle) nodes
function submitRewardSnapshot(RewardSubmission calldata _submission) override external onlyLatestContract("rocketRewardsPool", address(this)) onlyTrustedNode(msg.sender) {
// Get contracts
RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
// Check submission is currently enabled
require(rocketDAOProtocolSettingsNetwork.getSubmitRewardsEnabled(), "Submitting rewards is currently disabled");
// Validate inputs
uint256 rewardIndex = getRewardIndex();
require(_submission.rewardIndex <= rewardIndex, "Can only submit snapshot for periods up to next");
require(_submission.intervalsPassed > 0, "Invalid number of intervals passed");
require(_submission.nodeRPL.length == _submission.trustedNodeRPL.length && _submission.trustedNodeRPL.length == _submission.nodeETH.length, "Invalid array length");
// Calculate RPL reward total and validate
{ // Scope to prevent stack too deep
uint256 totalRewardsRPL = _submission.treasuryRPL;
for (uint256 i = 0; i < _submission.nodeRPL.length; ++i) {
totalRewardsRPL = totalRewardsRPL + _submission.nodeRPL[i];
}
for (uint256 i = 0; i < _submission.trustedNodeRPL.length; ++i) {
totalRewardsRPL = totalRewardsRPL + _submission.trustedNodeRPL[i];
}
require(totalRewardsRPL <= getPendingRPLRewards(), "Invalid RPL rewards");
}
// Calculate ETH reward total and validate
{ // Scope to prevent stack too deep
uint256 totalRewardsETH = _submission.treasuryETH + _submission.userETH;
for (uint256 i = 0; i < _submission.nodeETH.length; ++i) {
totalRewardsETH = totalRewardsETH + _submission.nodeETH[i];
}
uint256 smoothingPoolBalance = getPendingETHRewards();
require(totalRewardsETH <= smoothingPoolBalance + getPendingVoterShare(), "Invalid ETH rewards");
require(_submission.smoothingPoolETH <= smoothingPoolBalance, "Invalid smoothing pool balance");
}
// Store and increment vote
uint256 submissionCount;
{ // Scope to prevent stack too deep
// Check & update node submission status
bytes32 nodeSubmissionKey = keccak256(abi.encode("rewards.snapshot.submitted.node.key", msg.sender, _submission));
require(!getBool(nodeSubmissionKey), "Duplicate submission from node");
setBool(nodeSubmissionKey, true);
setBool(keccak256(abi.encode("rewards.snapshot.submitted.node", msg.sender, _submission.rewardIndex)), true);
}
{ // Scope to prevent stack too deep
// Increment submission count
bytes32 submissionCountKey = keccak256(abi.encode("rewards.snapshot.submitted.count", _submission));
submissionCount = getUint(submissionCountKey) + 1;
setUint(submissionCountKey, submissionCount);
}
// Emit snapshot submitted event
emit RewardSnapshotSubmitted(msg.sender, _submission.rewardIndex, _submission, block.timestamp);
// Return if already executed
if (_submission.rewardIndex != rewardIndex) {
return;
}
// If consensus is reached, execute the snapshot
RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
if (calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold()) {
_executeRewardSnapshot(_submission);
}
}
/// @notice Executes reward snapshot if consensus threshold is reached
function executeRewardSnapshot(RewardSubmission calldata _submission) override external onlyLatestContract("rocketRewardsPool", address(this)) {
// Validate reward index of submission
require(_submission.rewardIndex == getRewardIndex(), "Can only execute snapshot for next period");
// Get submission count
bytes32 submissionCountKey = keccak256(abi.encode("rewards.snapshot.submitted.count", _submission));
uint256 submissionCount = getUint(submissionCountKey);
// Confirm consensus and execute
RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
require(calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold(), "Consensus has not been reached");
_executeRewardSnapshot(_submission);
}
/// @notice Executes reward snapshot and sends assets to the relays for distribution to reward recipients
function _executeRewardSnapshot(RewardSubmission calldata _submission) private {
// Get contract
RocketTokenRPLInterface rplContract = RocketTokenRPLInterface(getContractAddress("rocketTokenRPL"));
RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
// Execute inflation if required
rplContract.inflationMintTokens();
// Increment the reward index and update the claim interval timestamp
incrementRewardIndex();
uint256 claimIntervalTimeStart = getClaimIntervalTimeStart();
uint256 claimIntervalTimeEnd = claimIntervalTimeStart + (getClaimIntervalTime() * _submission.intervalsPassed);
// Emit reward snapshot event
emit RewardSnapshot(_submission.rewardIndex, _submission, claimIntervalTimeStart, claimIntervalTimeEnd, block.timestamp);
setUint(keccak256(abi.encodePacked("rewards.pool.interval.execution.block", _submission.rewardIndex)), block.number);
setAddress(keccak256(abi.encodePacked("rewards.pool.interval.execution.address", _submission.rewardIndex)), address(this));
setUint(keccak256("rewards.pool.claim.interval.time.start"), claimIntervalTimeEnd);
// Send out the treasury rewards
if (_submission.treasuryRPL > 0) {
rocketVault.transferToken("rocketClaimDAO", rplContract, _submission.treasuryRPL);
}
// Get the smoothing pool instance
RocketSmoothingPoolInterface rocketSmoothingPool = RocketSmoothingPoolInterface(getContractAddress("rocketSmoothingPool"));
// Withdraw ETH from the smoothing pool required for this interval
if (_submission.smoothingPoolETH > 0) {
rocketSmoothingPool.withdrawEther(address(this), _submission.smoothingPoolETH);
}
// Calculate total amount of ETH required for this reward interval
uint256 totalETH = _submission.userETH + _submission.treasuryETH;
for (uint i = 0; i < _submission.nodeETH.length; ++i) {
totalETH += _submission.nodeETH[i];
}
// Withdraw remaining ETH required from the vault
uint256 vaultBalance = totalETH - _submission.smoothingPoolETH;
if (vaultBalance > 0) {
rocketVault.withdrawEther(vaultBalance);
}
// Send user share to rETH contract
if (_submission.userETH > 0) {
address rocketTokenRETHAddress = getContractAddress("rocketTokenRETH");
(bool result,) = rocketTokenRETHAddress.call{value: _submission.userETH}("");
require(result, "Failed to send user rewards");
}
// Send pDAO share to treasury
if (_submission.treasuryETH > 0) {
address payable rocketClaimDAO = payable(getContractAddress("rocketClaimDAO"));
(bool result,) = rocketClaimDAO.call{value: _submission.treasuryETH}("");
require(result, "Failed to send pDAO rewards");
}
// Loop over each network and distribute rewards
for (uint i = 0; i < _submission.nodeRPL.length; ++i) {
// Quick out if no rewards for this network
uint256 rewardsRPL = _submission.nodeRPL[i] + _submission.trustedNodeRPL[i];
uint256 rewardsETH = _submission.nodeETH[i];
if (rewardsRPL == 0 && rewardsETH == 0) {
continue;
}
// Grab the relay address
RocketRewardsRelayInterface relay;
{ // Scope to prevent stack too deep
address networkRelayAddress;
bytes32 networkRelayKey = keccak256(abi.encodePacked("rewards.relay.address", i));
networkRelayAddress = getAddress(networkRelayKey);
// Validate network is valid
require(networkRelayAddress != address(0), "Snapshot contains rewards for invalid network");
relay = RocketRewardsRelayInterface(networkRelayAddress);
}
// Transfer rewards
if (rewardsRPL > 0) {
// RPL rewards are withdrawn from the vault directly to the relay
rocketVault.withdrawToken(address(relay), rplContract, rewardsRPL);
}
if (rewardsETH > 0) {
// Send ETH rewards to the relay
(bool result,) = address(relay).call{value: rewardsETH}("");
require(result, "Failed to send ETH rewards to relay");
}
// Call into relay contract to handle distribution of rewards
relay.relayRewards(_submission.rewardIndex, treeVersion, _submission.merkleRoot, rewardsRPL, rewardsETH);
}
}
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
interface RocketStorageInterface {
// Deploy status
function getDeployedStatus() external view returns (bool);
// Guardian
function getGuardian() external view returns(address);
function setGuardian(address _newAddress) external;
function confirmGuardian() external;
// Getters
function getAddress(bytes32 _key) external view returns (address);
function getUint(bytes32 _key) external view returns (uint);
function getString(bytes32 _key) external view returns (string memory);
function getBytes(bytes32 _key) external view returns (bytes memory);
function getBool(bytes32 _key) external view returns (bool);
function getInt(bytes32 _key) external view returns (int);
function getBytes32(bytes32 _key) external view returns (bytes32);
// Setters
function setAddress(bytes32 _key, address _value) external;
function setUint(bytes32 _key, uint _value) external;
function setString(bytes32 _key, string calldata _value) external;
function setBytes(bytes32 _key, bytes calldata _value) external;
function setBool(bytes32 _key, bool _value) external;
function setInt(bytes32 _key, int _value) external;
function setBytes32(bytes32 _key, bytes32 _value) external;
// Deleters
function deleteAddress(bytes32 _key) external;
function deleteUint(bytes32 _key) external;
function deleteString(bytes32 _key) external;
function deleteBytes(bytes32 _key) external;
function deleteBool(bytes32 _key) external;
function deleteInt(bytes32 _key) external;
function deleteBytes32(bytes32 _key) external;
// Arithmetic
function addUint(bytes32 _key, uint256 _amount) external;
function subUint(bytes32 _key, uint256 _amount) external;
// Protected storage
function getNodeWithdrawalAddress(address _nodeAddress) external view returns (address);
function getNodePendingWithdrawalAddress(address _nodeAddress) external view returns (address);
function setWithdrawalAddress(address _nodeAddress, address _newWithdrawalAddress, bool _confirm) external;
function confirmWithdrawalAddress(address _nodeAddress) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity >0.5.0 <0.9.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
import "./IERC20.sol";
pragma solidity >0.5.0 <0.9.0;
interface IERC20Burnable is IERC20 {
function burn(uint256 amount) external;
function burnFrom(address account, uint256 amount) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
import "./util/IERC20Burnable.sol";
interface RocketVaultInterface {
function balanceOf(string memory _networkContractName) external view returns (uint256);
function depositEther() external payable;
function withdrawEther(uint256 _amount) external;
function depositToken(string memory _networkContractName, IERC20 _tokenAddress, uint256 _amount) external;
function withdrawToken(address _withdrawalAddress, IERC20 _tokenAddress, uint256 _amount) external;
function balanceOfToken(string memory _networkContractName, IERC20 _tokenAddress) external view returns (uint256);
function transferToken(string memory _networkContractName, IERC20 _tokenAddress, uint256 _amount) external;
function burnToken(IERC20Burnable _tokenAddress, uint256 _amount) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketDAONodeTrustedInterface {
function getBootstrapModeDisabled() external view returns (bool);
function getMemberQuorumVotesRequired() external view returns (uint256);
function getMemberAt(uint256 _index) external view returns (address);
function getMemberCount() external view returns (uint256);
function getMemberMinRequired() external view returns (uint256);
function getMemberIsValid(address _nodeAddress) external view returns (bool);
function getMemberLastProposalTime(address _nodeAddress) external view returns (uint256);
function getMemberID(address _nodeAddress) external view returns (string memory);
function getMemberUrl(address _nodeAddress) external view returns (string memory);
function getMemberJoinedTime(address _nodeAddress) external view returns (uint256);
function getMemberProposalExecutedTime(string memory _proposalType, address _nodeAddress) external view returns (uint256);
function getMemberRPLBondAmount(address _nodeAddress) external view returns (uint256);
function getMemberIsChallenged(address _nodeAddress) external view returns (bool);
function getMemberUnbondedValidatorCount(address _nodeAddress) external view returns (uint256);
function incrementMemberUnbondedValidatorCount(address _nodeAddress) external;
function decrementMemberUnbondedValidatorCount(address _nodeAddress) external;
function bootstrapMember(string memory _id, string memory _url, address _nodeAddress) external;
function bootstrapSettingUint(string memory _settingContractName, string memory _settingPath, uint256 _value) external;
function bootstrapSettingBool(string memory _settingContractName, string memory _settingPath, bool _value) external;
function bootstrapUpgrade(string memory _type, string memory _name, string memory _contractAbi, address _contractAddress) external;
function bootstrapDisable(bool _confirmDisableBootstrapMode) external;
function memberJoinRequired(string memory _id, string memory _url) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketDAOProtocolSettingsNetworkInterface {
function getNodeConsensusThreshold() external view returns (uint256);
function getNodePenaltyThreshold() external view returns (uint256);
function getPerPenaltyRate() external view returns (uint256);
function getSubmitBalancesEnabled() external view returns (bool);
function getSubmitBalancesFrequency() external view returns (uint256);
function getSubmitPricesEnabled() external view returns (bool);
function getSubmitPricesFrequency() external view returns (uint256);
function getMinimumNodeFee() external view returns (uint256);
function getTargetNodeFee() external view returns (uint256);
function getMaximumNodeFee() external view returns (uint256);
function getNodeFeeDemandRange() external view returns (uint256);
function getTargetRethCollateralRate() external view returns (uint256);
function getRethDepositDelay() external view returns (uint256);
function getSubmitRewardsEnabled() external view returns (bool);
function getMaxNodeShareSecurityCouncilAdder() external view returns (uint256);
function getVoterShare() external view returns (uint256);
function getProtocolDAOShare() external view returns (uint256);
function getNodeShare() external view returns (uint256);
function getNodeShareSecurityCouncilAdder() external view returns (uint256);
function getRethCommission() external view returns (uint256);
function getEffectiveVoterShare() external view returns (uint256);
function getEffectiveNodeShare() external view returns (uint256);
function getAllowListedControllers() external view returns (address[] memory);
function getMaxRethDelta() external view returns (uint256);
function isAllowListedController(address _address) external view returns (bool);
function setNodeShareSecurityCouncilAdder(uint256 _value) external;
function setNodeCommissionShare(uint256 _value) external;
function setVoterShare(uint256 _value) external;
function setProtocolDAOShare(uint256 _value) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
interface RocketDAOProtocolSettingsRewardsInterface {
function setSettingRewardsClaimers(uint256 _trustedNodePercent, uint256 _protocolPercent, uint256 _nodePercent) external;
function getRewardsClaimerPerc(string memory _contractName) external view returns (uint256);
function getRewardsClaimersPerc() external view returns (uint256 _trustedNodePercent, uint256 _protocolPercent, uint256 _nodePercent);
function getRewardsClaimersTrustedNodePerc() external view returns (uint256);
function getRewardsClaimersProtocolPerc() external view returns (uint256);
function getRewardsClaimersNodePerc() external view returns (uint256);
function getRewardsClaimersTimeUpdated() external view returns (uint256);
function getRewardsClaimIntervalPeriods() external view returns (uint256);
function getRewardsClaimIntervalTime() external view returns (uint256);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
struct RewardSubmission {
uint256 rewardIndex; // Index of the reward submission
uint256 executionBlock; // Execution block at which the calculations were made
uint256 consensusBlock; // Consensus block containing the execution block
bytes32 merkleRoot; // Merkle root of the reward claims
uint256 intervalsPassed; // Number of intervals passed since last submission (usually 1)
uint256 smoothingPoolETH; // Balance to extract from smoothing pool to fulfil this reward interval
uint256 treasuryRPL; // How much RPL is to be sent to the pDAO treasury
uint256 treasuryETH; // Amount of ETH to send to pDAO treasury
uint256 userETH; // Amount to send to rETH
uint256[] trustedNodeRPL; // Mapping of RPL rewards for oDAO members on each network
uint256[] nodeRPL; // Mapping of RPL rewards for nodes on each network
uint256[] nodeETH; // Mapping of ETH rewards for nodes on each network
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
import "../../types/RewardSubmission.sol";
// SPDX-License-Identifier: GPL-3.0-only
interface RocketRewardsPoolInterface {
function getEthBalance() external view returns (uint256);
function getRewardIndex() external view returns(uint256);
function getRPLBalance() external view returns(uint256);
function getPendingRPLRewards() external view returns (uint256);
function getPendingETHRewards() external view returns (uint256);
function getPendingVoterShare() external view returns (uint256);
function getClaimIntervalTimeStart() external view returns(uint256);
function getClaimIntervalTime() external view returns(uint256);
function getClaimIntervalsPassed() external view returns(uint256);
function getClaimIntervalExecutionBlock(uint256 _interval) external view returns(uint256);
function getClaimIntervalExecutionAddress(uint256 _interval) external view returns(address);
function getClaimingContractPerc(string memory _claimingContract) external view returns(uint256);
function getClaimingContractsPerc(string[] memory _claimingContracts) external view returns (uint256[] memory);
function getTrustedNodeSubmitted(address _trustedNodeAddress, uint256 _rewardIndex) external view returns (bool);
function getSubmissionFromNodeExists(address _trustedNodeAddress, RewardSubmission calldata _submission) external view returns (bool);
function getSubmissionCount(RewardSubmission calldata _submission) external view returns (uint256);
function submitRewardSnapshot(RewardSubmission calldata _submission) external;
function executeRewardSnapshot(RewardSubmission calldata _submission) external;
function depositVoterShare() payable external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
struct Claim {
uint256 rewardIndex;
uint256 amountRPL;
uint256 amountSmoothingPoolETH;
uint256 amountVoterETH;
bytes32[] merkleProof;
}
interface RocketRewardsRelayInterface {
function relayRewards(uint256 _intervalIndex, uint256 _treeVersion, bytes32 _merkleRoot, uint256 _rewardsRPL, uint256 _rewardsETH) external;
function claim(address _nodeAddress, Claim[] calldata _claims) external;
function claimAndStake(address _nodeAddress, Claim[] calldata _claims, uint256 _stakeAmount) external;
function isClaimed(uint256 _intervalIndex, address _claimer) external view returns (bool);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
interface RocketSmoothingPoolInterface {
function withdrawEther(address _to, uint256 _amount) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
import "../util/IERC20.sol";
interface RocketTokenRPLInterface is IERC20 {
function getInflationCalcTime() external view returns(uint256);
function getInflationIntervalTime() external view returns(uint256);
function getInflationIntervalRate() external view returns(uint256);
function getInflationIntervalsPassed() external view returns(uint256);
function getInflationIntervalStartTime() external view returns(uint256);
function getInflationRewardsContractAddress() external view returns(address);
function inflationCalculate() external view returns (uint256);
function inflationMintTokens() external returns (uint256);
function swapTokens(uint256 _amount) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
import "../interface/RocketStorageInterface.sol";
/// @title Base settings / modifiers for each contract in Rocket Pool
/// @author David Rugendyke
abstract contract RocketBase {
// Calculate using this as the base
uint256 constant calcBase = 1 ether;
// Version of the contract
uint8 public version;
// The main storage contract where primary persistant storage is maintained
RocketStorageInterface rocketStorage = RocketStorageInterface(address(0));
/*** Modifiers **********************************************************/
/**
* @dev Throws if called by any sender that doesn't match a Rocket Pool network contract
*/
modifier onlyLatestNetworkContract() {
require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract");
_;
}
/**
* @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract
*/
modifier onlyLatestContract(string memory _contractName, address _contractAddress) {
require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered node
*/
modifier onlyRegisteredNode(address _nodeAddress) {
require(getBool(keccak256(abi.encodePacked("node.exists", _nodeAddress))), "Invalid node");
_;
}
/**
* @dev Throws if called by any sender that isn't a trusted node DAO member
*/
modifier onlyTrustedNode(address _nodeAddress) {
require(getBool(keccak256(abi.encodePacked("dao.trustednodes.", "member", _nodeAddress))), "Invalid trusted node");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered minipool
*/
modifier onlyRegisteredMinipool(address _minipoolAddress) {
require(getBool(keccak256(abi.encodePacked("minipool.exists", _minipoolAddress))), "Invalid minipool");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered megapool
*/
modifier onlyRegisteredMegapool(address _megapoolAddress) {
require(getBool(keccak256(abi.encodePacked("megapool.exists", _megapoolAddress))), "Invalid megapool");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered minipool or megapool
*/
modifier onlyRegisteredMinipoolOrMegapool(address _caller) {
require(
getBool(keccak256(abi.encodePacked("megapool.exists", _caller))) ||
getBool(keccak256(abi.encodePacked("minipool.exists", _caller)))
, "Invalid caller");
_;
}
/**
* @dev Throws if called by any account other than a guardian account (temporary account allowed access to settings before DAO is fully enabled)
*/
modifier onlyGuardian() {
require(msg.sender == rocketStorage.getGuardian(), "Account is not a temporary guardian");
_;
}
/*** Methods **********************************************************/
/// @dev Set the main Rocket Storage address
constructor(RocketStorageInterface _rocketStorageAddress) {
// Update the contract address
rocketStorage = RocketStorageInterface(_rocketStorageAddress);
}
/// @dev Get the address of a network contract by name
function getContractAddress(string memory _contractName) internal view returns (address) {
// Get the current contract address
address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
// Check it
require(contractAddress != address(0x0), "Contract not found");
// Return
return contractAddress;
}
/// @dev Get the address of a network contract by name (returns address(0x0) instead of reverting if contract does not exist)
function getContractAddressUnsafe(string memory _contractName) internal view returns (address) {
// Get the current contract address
address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
// Return
return contractAddress;
}
/// @dev Get the name of a network contract by address
function getContractName(address _contractAddress) internal view returns (string memory) {
// Get the contract name
string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress)));
// Check it
require(bytes(contractName).length > 0, "Contract not found");
// Return
return contractName;
}
/// @dev Get revert error message from a .call method
function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
// If the _res length is less than 68, then the transaction failed silently (without a revert message)
if (_returnData.length < 68) return "Transaction reverted silently";
assembly {
// Slice the sighash.
_returnData := add(_returnData, 0x04)
}
return abi.decode(_returnData, (string)); // All that remains is the revert string
}
/*** Rocket Storage Methods ****************************************/
// Note: Unused helpers have been removed to keep contract sizes down
/// @dev Storage get methods
function getAddress(bytes32 _key) internal view returns (address) { return rocketStorage.getAddress(_key); }
function getUint(bytes32 _key) internal view returns (uint) { return rocketStorage.getUint(_key); }
function getString(bytes32 _key) internal view returns (string memory) { return rocketStorage.getString(_key); }
function getBytes(bytes32 _key) internal view returns (bytes memory) { return rocketStorage.getBytes(_key); }
function getBool(bytes32 _key) internal view returns (bool) { return rocketStorage.getBool(_key); }
function getInt(bytes32 _key) internal view returns (int) { return rocketStorage.getInt(_key); }
function getBytes32(bytes32 _key) internal view returns (bytes32) { return rocketStorage.getBytes32(_key); }
/// @dev Storage set methods
function setAddress(bytes32 _key, address _value) internal { rocketStorage.setAddress(_key, _value); }
function setUint(bytes32 _key, uint _value) internal { rocketStorage.setUint(_key, _value); }
function setString(bytes32 _key, string memory _value) internal { rocketStorage.setString(_key, _value); }
function setBytes(bytes32 _key, bytes memory _value) internal { rocketStorage.setBytes(_key, _value); }
function setBool(bytes32 _key, bool _value) internal { rocketStorage.setBool(_key, _value); }
function setInt(bytes32 _key, int _value) internal { rocketStorage.setInt(_key, _value); }
function setBytes32(bytes32 _key, bytes32 _value) internal { rocketStorage.setBytes32(_key, _value); }
/// @dev Storage delete methods
function deleteAddress(bytes32 _key) internal { rocketStorage.deleteAddress(_key); }
function deleteUint(bytes32 _key) internal { rocketStorage.deleteUint(_key); }
function deleteString(bytes32 _key) internal { rocketStorage.deleteString(_key); }
function deleteBytes(bytes32 _key) internal { rocketStorage.deleteBytes(_key); }
function deleteBool(bytes32 _key) internal { rocketStorage.deleteBool(_key); }
function deleteInt(bytes32 _key) internal { rocketStorage.deleteInt(_key); }
function deleteBytes32(bytes32 _key) internal { rocketStorage.deleteBytes32(_key); }
/// @dev Storage arithmetic methods
function addUint(bytes32 _key, uint256 _amount) internal { rocketStorage.addUint(_key, _amount); }
function subUint(bytes32 _key, uint256 _amount) internal { rocketStorage.subUint(_key, _amount); }
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketVaultWithdrawerInterface {
function receiveVaultWithdrawalETH() external payable;
}{
"viaIR": true,
"optimizer": {
"enabled": true,
"runs": 15000
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract ABI
API[{"inputs":[{"internalType":"contract RocketStorageInterface","name":"_rocketStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"}],"indexed":false,"internalType":"struct RewardSubmission","name":"submission","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"intervalStartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"intervalEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RewardSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"}],"indexed":false,"internalType":"struct RewardSubmission","name":"submission","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RewardSnapshotSubmitted","type":"event"},{"inputs":[],"name":"depositVoterShare","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"executeRewardSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"getClaimIntervalExecutionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"getClaimIntervalExecutionBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalTimeStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalsPassed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_claimingContract","type":"string"}],"name":"getClaimingContractPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_claimingContracts","type":"string[]"}],"name":"getClaimingContractsPerc","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingETHRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingRPLRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingVoterShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRPLBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"getSubmissionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedNodeAddress","type":"address"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"getSubmissionFromNodeExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedNodeAddress","type":"address"},{"internalType":"uint256","name":"_rewardIndex","type":"uint256"}],"name":"getTrustedNodeSubmitted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveVaultWithdrawalETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"smoothingPoolETH","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256","name":"treasuryETH","type":"uint256"},{"internalType":"uint256","name":"userETH","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"submitRewardSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608034608157601f612e7e38819003918201601f19168301916001600160401b03831184841017608657808492602094604052833981010312608157516001600160a01b0381168103608157600080546001600160a81b03191660089290921b610100600160a81b0316919091176005179055604051612de1908161009d8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c908163043877d014610c635781630febabeb14610c08578163204e2a0a14610b715781632198e62c14610b5757816350a2f7e514610b3d57816354fd4d5014610b1e5781635af3ad5d14610a0d5781635f3c56f7146109e657816370ed0ada1461010b5781637425f1e7146109cc578163ab772cb11461094f578163b0aa28de146108b4578163b81bda511461088e578163ba34cb4b14610874578163c095415d14610866578163cdfd4e1c14610659578163e2d9f7b3146102b5578163f21c150c14610293578163f6a3f6ef146101a6578163f7b65fb214610110575063f96fef660361000e575b610cf3565b806003193601126101a35773ffffffffffffffffffffffffffffffffffffffff61014061013b611063565b611eed565b1681813b156101a35780600492604051938480927f98ea5fca00000000000000000000000000000000000000000000000000000000825234905af18015610196576101885780f35b61019191610d0e565b818180f35b50604051903d90823e3d90fd5b80fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c5760206101dc610231923690600401610dd0565b73ffffffffffffffffffffffffffffffffffffffff6101fc61013b6111de565b1660405180809581947fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b03915afa90811561028857829161024e575b602082604051908152f35b90506020813d602011610280575b8161026960209383610d0e565b8101031261027c57602091505182610243565b5080fd5b3d915061025c565b6040513d84823e3d90fd5b346101a357806003193601126101a35760206102ad61216a565b604051908152f35b346101a3576102c336610cbf565b61036973ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b60405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b519020611fb2565b1630146112da565b61037161216a565b8135036105d5576103c560405160208101906103bd816103918685611432565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b5190206121ee565b73ffffffffffffffffffffffffffffffffffffffff6103e561013b611477565b169073ffffffffffffffffffffffffffffffffffffffff61040761013b61133f565b169181670de0b6b3a76400000291670de0b6b3a76400008304036105a85790602060049392604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa92831561059d578593610563575b50610475600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa918215610558578492610520575b50106104c2576104bf906122f3565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e207265616368656400006044820152fd5b9091506020813d602011610550575b8161053c60209383610d0e565b8101031261054c575190846104b0565b8380fd5b3d915061052f565b6040513d86823e3d90fd5b92506020833d602011610595575b8161057e60209383610d0e565b8101031261059157915191610475610466565b8480fd5b3d9150610571565b6040513d87823e3d90fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f6400000000000000000000000000000000000000000000006064820152fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c573660238201121561027c5780600401359061069682610d7e565b916106a46040519384610d0e565b80835260051b8101602401602083013682116105915760248301905b82821061083657858573ffffffffffffffffffffffffffffffffffffffff6106e961013b6111de565b1681519061070f6106f983610d7e565b926107076040519485610d0e565b808452610d7e565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019401368537845b81518110156107f1578060206107556107899385611e12565b51604051809481927fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b0381875afa80156107e65787906107b0575b600192506107a98287611e12565b520161073c565b506020823d82116107de575b816107c960209383610d0e565b810103126107da576001915161079b565b8680fd5b3d91506107bc565b6040513d89823e3d90fd5b50505090604051928392602084019060208552518091526040840192915b81811061081d575050500390f35b825184528594506020938401939092019160010161080f565b813567ffffffffffffffff81116107da5760209161085b839260243691890101610dd0565b8152019101906106c0565b806003193601126101a35780f35b346101a357806003193601126101a35760206102ad6120e6565b346101a357806003193601126101a35760206108ab61013b611dd7565b31604051908152f35b346101a35760206003193601126101a35760206109316040518281019061035981610391600435856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346101a35760206003193601126101a35760206102ad604051828101906103bd81610391600435856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b346101a357806003193601126101a35760206102ad611d32565b346101a35760206102ad6109f936610cbf565b6040516103bd816103918682019485611432565b346101a357610a1b36610cbf565b610a3e73ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b610ab260405160208101907f64616f2e747275737465646e6f6465732e00000000000000000000000000000082527f6d656d626572000000000000000000000000000000000000000000000000000060318201523360601b6037820152602b8152610aaa604b82610d0e565b519020611e70565b15610ac0576104bf906114b2565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f64650000000000000000000000006044820152fd5b346101a357806003193601126101a35760ff6020915416604051908152f35b346101a357806003193601126101a35760206102ad611219565b346101a357806003193601126101a35760206102ad6110d9565b346101a35760406003193601126101a3576020610bfe610b8f610c97565b604051610aaa816103918682019460243590866040909392919360608152601f60608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff60a08201951660208201520152565b6040519015158152f35b346101a35760406003193601126101a357610c21610c97565b6024359167ffffffffffffffff83116101a35761018060031984360301126101a357604051602090610bfe9080830190610aaa8161039160048a018986610fdc565b346101a357806003193601126101a35760206102ad610c89610c836120e6565b42610e17565b610c91611219565b90610e53565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610cba57565b600080fd5b6020600319820112610cba576004359067ffffffffffffffff8211610cba576003198261018092030112610cba5760040190565b34610cba576000600319360112610cba5760206102ad611c91565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d4f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610d4f5760051b60200190565b67ffffffffffffffff8111610d4f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610cba57803590610de782610d96565b92610df56040519485610d0e565b82845260208383010111610cba57816000926020809301838601378301015290565b91908203918211610e2457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8115610e5d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215610cba57016020813591019167ffffffffffffffff8211610cba578160051b36038313610cba57565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311610cba5760209260051b809284830137010190565b610fd991813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100820135610100820152610fca610fbe610fa1610f8d610120860186610e8c565b610180610120870152610180860191610edf565b610faf610140860186610e8c565b90858303610140870152610edf565b92610160810190610e8c565b91610160818503910152610edf565b90565b60c09073ffffffffffffffffffffffffffffffffffffffff610fd9949360608352602360608401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808401527f6b6579000000000000000000000000000000000000000000000000000000000060a08401521660208201528160408201520190610f1c565b60405190611072604083610d0e565b600b82527f726f636b65745661756c740000000000000000000000000000000000000000006020830152565b604051906110ad604083610d0e565b600e82527f726f636b6574546f6b656e52504c0000000000000000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6110f961013b611063565b16602073ffffffffffffffffffffffffffffffffffffffff61111c61013b61109e565b1660405192838080937feccefff60000000000000000000000000000000000000000000000000000000082526040600483015261118760448301604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b90602483015203915afa9081156111d2576000916111a3575090565b90506020813d6020116111ca575b816111be60209383610d0e565b81010312610cba575190565b3d91506111b1565b6040513d6000823e3d90fd5b604051906111ed604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e6773526577617264736020830152565b6004602073ffffffffffffffffffffffffffffffffffffffff61123d61013b6111de565b16604051928380927f94e5d5120000000000000000000000000000000000000000000000000000000082525afa9081156111d2576000916111a3575090565b6040519061128b604083610d0e565b601182527f726f636b657452657761726473506f6f6c0000000000000000000000000000006020830152565b60005b8381106112ca5750506000910152565b81810151838201526020016112ba565b156112e157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e7472616374000000006044820152fd5b6040519061134e604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b6020830152565b90816020910312610cba57518015158103610cba5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610cba570180359067ffffffffffffffff8211610cba57602001918160051b36038313610cba57565b91908110156113f65760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908201809211610e2457565b906080610fd99260408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e7460608201528160208201520190610f1c565b60405190611486604083610d0e565b601482527f726f636b657444414f4e6f6465547275737465640000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6114d261013b61133f565b16906040517f63ed62da000000000000000000000000000000000000000000000000000000008152602081600481865afa9081156111d257600091611c62575b5015611bde5761152061216a565b90803593828511611b5a57608082013515611ad6576101408201926115458484611392565b61012085019291506115578386611392565b9190501480611ab2575b15611a545760009560c08501355b6115798787611392565b90508810156115ab576115a360019161159c8a6115968b8b611392565b906113e6565b3590611425565b97019661156f565b965091945091956000955b6115c08686611392565b90508710156115e5576115dd60019161159c896115968a8a611392565b9601956115b6565b91955093509490946115f5611d32565b106119f65761160d61010083013560e0840135611425565b926000935b61016084016116218186611392565b90508610156116465760019161159c8761159661163e9489611392565b940193611612565b5090935094909493919361165b61013b611dd7565b319061166e611668611c91565b83611425565b106119985760a08501351161193a57604051602081019061169481610391883386610fdc565b5190206116a081611e70565b6118dc576116ad90612062565b60408051606060208201818152601f60808401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a08401523393830193909352810185905261170e91906117068160c08101610391565b519020612062565b6040516020810190611724816103918885611432565b51902092611731846121ee565b9360018501809511610e24578461174791612252565b80604051604081527f60e3a6abeddae923bd65a9a5dcd11f9a8e38f12f885eef210b91203f3ca872b161177d6040830189610f1c565b914260208201528033930390a3036118d75773ffffffffffffffffffffffffffffffffffffffff6117af61013b611477565b169180670de0b6b3a76400000290670de0b6b3a7640000820403610e24576020600493604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa9283156111d2576000936118a1575b5061181c600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa9182156111d25760009261186d575b5010156118625750565b61186b906122f3565b565b9091506020813d602011611899575b8161188960209383610d0e565b81010312610cba57519038611858565b3d915061187c565b92506020833d6020116118cf575b816118bc60209383610d0e565b81010312610cba5791519161181c61180d565b3d91506118af565b505050565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f646500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420736d6f6f7468696e6720706f6f6c2062616c616e636500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c6964204554482072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c2072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e6774680000000000000000000000006044820152fd5b50611abd8285611392565b9050611acd610160860186611392565b91905014611561565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e65787400000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c65640000000000000000000000000000000000000000000000006064820152fd5b611c84915060203d602011611c8a575b611c7c8183610d0e565b81019061137a565b38611512565b503d611c72565b73ffffffffffffffffffffffffffffffffffffffff611cb161013b611063565b16602060405180927f35ee5f870000000000000000000000000000000000000000000000000000000082528260048301528180611d1c60248201604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b03915afa9081156111d2576000916111a3575090565b6004602073ffffffffffffffffffffffffffffffffffffffff611d5661013b61109e565b16604051928380927fc1a260060000000000000000000000000000000000000000000000000000000082525afa80156111d257600090611da3575b610fd99150611d9e6110d9565b611425565b506020813d602011611dcf575b81611dbd60209383610d0e565b81010312610cba57610fd99051611d91565b3d9150611db0565b60405190611de6604083610d0e565b601382527f726f636b6574536d6f6f7468696e67506f6f6c000000000000000000000000006020830152565b80518210156113f65760209160051b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452611e6981518092816020880152602088880191016112b7565b0116010190565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f7ae1cfca00000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091611ed4575090565b610fd9915060203d602011611c8a57611c7c8183610d0e565b611f359060405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b73ffffffffffffffffffffffffffffffffffffffff811615611f545790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f21f8a72100000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091612016575090565b6020813d60201161205a575b8161202f60209383610d0e565b8101031261027c57519073ffffffffffffffffffffffffffffffffffffffff821682036101a3575090565b3d9150612022565b60009073ffffffffffffffffffffffffffffffffffffffff825460081c1690813b156120e25782916044839260405194859384927fabfdcced0000000000000000000000000000000000000000000000000000000084526004840152600160248401525af18015610288576120d5575050565b816120df91610d0e565b50565b8280fd5b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee260048301525afa9081156111d2576000916111a3575090565b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760048301525afa9081156111d2576000916111a3575090565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937fbd02d0f500000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d2576000916111a3575090565b60009173ffffffffffffffffffffffffffffffffffffffff835460081c1691823b1561054c5790604484928360405195869485937fe2a4853a000000000000000000000000000000000000000000000000000000008552600485015260248401525af18015610288576120d5575050565b3d156122ee573d906122d482610d96565b916122e26040519384610d0e565b82523d6000602084013e565b606090565b6122fe61013b61109e565b9073ffffffffffffffffffffffffffffffffffffffff6000921673ffffffffffffffffffffffffffffffffffffffff61233861013b611063565b16916040517f0882400300000000000000000000000000000000000000000000000000000000815260208160048188875af1801561059d57612d7c575b5073ffffffffffffffffffffffffffffffffffffffff845460081c16803b15610591578480916044604051809481937fadb353dc0000000000000000000000000000000000000000000000000000000083527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f76004840152600160248401525af1801561059d57612d68575b5061240a6120e6565b94612413611219565b608083013590818102918183041490151715612d3b5794866124587fcdc52a6101e59cdabb15ba2e286593326138db03833e45895356994d978d28f996978399611425565b908435968791604051809160808252612474608083018a610f1c565b9060208301528560408301524260608301520390a26124fc60405160208101906124f2816103918b856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b5190204390612252565b6040516020810190612562816103918a856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b51902073ffffffffffffffffffffffffffffffffffffffff835460081c1690813b1561054c5783916044839260405194859384927fca446dd900000000000000000000000000000000000000000000000000000000845260048401523060248401525af1908115612c08578391612d26575b505460081c73ffffffffffffffffffffffffffffffffffffffff1690813b156120e25782916044839260405194859384927fe2a4853a0000000000000000000000000000000000000000000000000000000084527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2600485015260248401525af1801561028857612d11575b5060c083013580612c77575b505073ffffffffffffffffffffffffffffffffffffffff61268e61013b611dd7565b16928660a08401359485612c13575b50506101008301359560e0840135956126b68789611425565b9689975b61016087018b6126ca828a611392565b90508b10156126f0575060019161159c8b6115966126e8948c611392565b9801976126ba565b94989190506127059295995099929599610e17565b80612ba3575b5080612aea575b505080612a23575b50855b610140830161272c8185611392565b9050821015612a1957612746826115966127599387611392565b3561159c83611596610120880188611392565b61276b82611596610160870187611392565b35811591828093612a11575b612a065773ffffffffffffffffffffffffffffffffffffffff6127d360405160208101907f726577617264732e72656c61792e616464726573730000000000000000000000825287603582015260358152610359605582610d0e565b16918215612982578a9315612910575b8061286f575b823b1561054c5760a484928360405195869485937f44701afb0000000000000000000000000000000000000000000000000000000085528b60048601526001602486015260608d01356044860152606485015260848401525af180156102885761285a575b50506001905b0161271d565b8161286491610d0e565b6107da57863861284e565b9280808086865af161287f6122c3565b501561288c5789926127e9565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4661696c656420746f2073656e6420455448207265776172647320746f20726560448201527f6c617900000000000000000000000000000000000000000000000000000000006064820152fd5b873b1561054c576040517f01e336670000000000000000000000000000000000000000000000000000000081528360048201528960248201528260448201528481606481838d5af190811561059d57859161296d575b50506127e3565b8161297791610d0e565b61054c578338612966565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b000000000000000000000000000000000000006064820152fd5b505050600190612854565b508115612777565b5050505050509050565b8680808060409473ffffffffffffffffffffffffffffffffffffffff612a7d8751612a4e8982610d0e565b600e81527f726f636b6574436c61696d44414f0000000000000000000000000000000000006020820152611eed565b165af1612a886122c3565b5061271a57606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e64207044414f207265776172647300000000006044820152fd5b81808092612b2e604051612aff604082610d0e565b600f81527f726f636b6574546f6b656e5245544800000000000000000000000000000000006020820152611eed565b5af1612b386122c3565b5015612b45578638612712565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e642075736572207265776172647300000000006044820152fd5b863b156120e257604051907f3bed33ce00000000000000000000000000000000000000000000000000000000825260048201528281602481838b5af1908115612c08578391612bf3575b5061270b565b81612bfd91610d0e565b61027c578138612bed565b6040513d85823e3d90fd5b803b1561027c578180916044604051809481937f522f68150000000000000000000000000000000000000000000000000000000083523060048401528b60248401525af18015610288571561269d5781612c6c91610d0e565b6107da57863861269d565b863b1561027c57604051907fee91035e00000000000000000000000000000000000000000000000000000000825260606004830152600e60648301527f726f636b6574436c61696d44414f00000000000000000000000000000000000060848301528560248301526044820152818160a481838b5af18015610288571561266c5781612d0291610d0e565b612d0d57853861266c565b8580fd5b81612d1b91610d0e565b612d0d578538612660565b81612d3091610d0e565b61027c5781386125d4565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b84612d7591959295610d0e565b9238612401565b6020813d602011612da3575b81612d9560209383610d0e565b810103126105915751612375565b3d9150612d8856fea2646970667358221220e402ac624678d598c825bf0a57e7228412f39692667673c53da6f73559c278f664736f6c634300081e0033000000000000000000000000f4d539f1babdaa6e47b1112bc9fa1c83cf0ffe59
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c908163043877d014610c635781630febabeb14610c08578163204e2a0a14610b715781632198e62c14610b5757816350a2f7e514610b3d57816354fd4d5014610b1e5781635af3ad5d14610a0d5781635f3c56f7146109e657816370ed0ada1461010b5781637425f1e7146109cc578163ab772cb11461094f578163b0aa28de146108b4578163b81bda511461088e578163ba34cb4b14610874578163c095415d14610866578163cdfd4e1c14610659578163e2d9f7b3146102b5578163f21c150c14610293578163f6a3f6ef146101a6578163f7b65fb214610110575063f96fef660361000e575b610cf3565b806003193601126101a35773ffffffffffffffffffffffffffffffffffffffff61014061013b611063565b611eed565b1681813b156101a35780600492604051938480927f98ea5fca00000000000000000000000000000000000000000000000000000000825234905af18015610196576101885780f35b61019191610d0e565b818180f35b50604051903d90823e3d90fd5b80fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c5760206101dc610231923690600401610dd0565b73ffffffffffffffffffffffffffffffffffffffff6101fc61013b6111de565b1660405180809581947fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b03915afa90811561028857829161024e575b602082604051908152f35b90506020813d602011610280575b8161026960209383610d0e565b8101031261027c57602091505182610243565b5080fd5b3d915061025c565b6040513d84823e3d90fd5b346101a357806003193601126101a35760206102ad61216a565b604051908152f35b346101a3576102c336610cbf565b61036973ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b60405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b519020611fb2565b1630146112da565b61037161216a565b8135036105d5576103c560405160208101906103bd816103918685611432565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d0e565b5190206121ee565b73ffffffffffffffffffffffffffffffffffffffff6103e561013b611477565b169073ffffffffffffffffffffffffffffffffffffffff61040761013b61133f565b169181670de0b6b3a76400000291670de0b6b3a76400008304036105a85790602060049392604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa92831561059d578593610563575b50610475600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa918215610558578492610520575b50106104c2576104bf906122f3565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e207265616368656400006044820152fd5b9091506020813d602011610550575b8161053c60209383610d0e565b8101031261054c575190846104b0565b8380fd5b3d915061052f565b6040513d86823e3d90fd5b92506020833d602011610595575b8161057e60209383610d0e565b8101031261059157915191610475610466565b8480fd5b3d9150610571565b6040513d87823e3d90fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f6400000000000000000000000000000000000000000000006064820152fd5b346101a35760206003193601126101a35760043567ffffffffffffffff811161027c573660238201121561027c5780600401359061069682610d7e565b916106a46040519384610d0e565b80835260051b8101602401602083013682116105915760248301905b82821061083657858573ffffffffffffffffffffffffffffffffffffffff6106e961013b6111de565b1681519061070f6106f983610d7e565b926107076040519485610d0e565b808452610d7e565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019401368537845b81518110156107f1578060206107556107899385611e12565b51604051809481927fd4f4697e00000000000000000000000000000000000000000000000000000000835260048301611e26565b0381875afa80156107e65787906107b0575b600192506107a98287611e12565b520161073c565b506020823d82116107de575b816107c960209383610d0e565b810103126107da576001915161079b565b8680fd5b3d91506107bc565b6040513d89823e3d90fd5b50505090604051928392602084019060208552518091526040840192915b81811061081d575050500390f35b825184528594506020938401939092019160010161080f565b813567ffffffffffffffff81116107da5760209161085b839260243691890101610dd0565b8152019101906106c0565b806003193601126101a35780f35b346101a357806003193601126101a35760206102ad6120e6565b346101a357806003193601126101a35760206108ab61013b611dd7565b31604051908152f35b346101a35760206003193601126101a35760206109316040518281019061035981610391600435856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346101a35760206003193601126101a35760206102ad604051828101906103bd81610391600435856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b346101a357806003193601126101a35760206102ad611d32565b346101a35760206102ad6109f936610cbf565b6040516103bd816103918682019485611432565b346101a357610a1b36610cbf565b610a3e73ffffffffffffffffffffffffffffffffffffffff6103616102e661127c565b610ab260405160208101907f64616f2e747275737465646e6f6465732e00000000000000000000000000000082527f6d656d626572000000000000000000000000000000000000000000000000000060318201523360601b6037820152602b8152610aaa604b82610d0e565b519020611e70565b15610ac0576104bf906114b2565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f64650000000000000000000000006044820152fd5b346101a357806003193601126101a35760ff6020915416604051908152f35b346101a357806003193601126101a35760206102ad611219565b346101a357806003193601126101a35760206102ad6110d9565b346101a35760406003193601126101a3576020610bfe610b8f610c97565b604051610aaa816103918682019460243590866040909392919360608152601f60608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff60a08201951660208201520152565b6040519015158152f35b346101a35760406003193601126101a357610c21610c97565b6024359167ffffffffffffffff83116101a35761018060031984360301126101a357604051602090610bfe9080830190610aaa8161039160048a018986610fdc565b346101a357806003193601126101a35760206102ad610c89610c836120e6565b42610e17565b610c91611219565b90610e53565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610cba57565b600080fd5b6020600319820112610cba576004359067ffffffffffffffff8211610cba576003198261018092030112610cba5760040190565b34610cba576000600319360112610cba5760206102ad611c91565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d4f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610d4f5760051b60200190565b67ffffffffffffffff8111610d4f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610cba57803590610de782610d96565b92610df56040519485610d0e565b82845260208383010111610cba57816000926020809301838601378301015290565b91908203918211610e2457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8115610e5d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215610cba57016020813591019167ffffffffffffffff8211610cba578160051b36038313610cba57565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311610cba5760209260051b809284830137010190565b610fd991813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100820135610100820152610fca610fbe610fa1610f8d610120860186610e8c565b610180610120870152610180860191610edf565b610faf610140860186610e8c565b90858303610140870152610edf565b92610160810190610e8c565b91610160818503910152610edf565b90565b60c09073ffffffffffffffffffffffffffffffffffffffff610fd9949360608352602360608401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808401527f6b6579000000000000000000000000000000000000000000000000000000000060a08401521660208201528160408201520190610f1c565b60405190611072604083610d0e565b600b82527f726f636b65745661756c740000000000000000000000000000000000000000006020830152565b604051906110ad604083610d0e565b600e82527f726f636b6574546f6b656e52504c0000000000000000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6110f961013b611063565b16602073ffffffffffffffffffffffffffffffffffffffff61111c61013b61109e565b1660405192838080937feccefff60000000000000000000000000000000000000000000000000000000082526040600483015261118760448301604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b90602483015203915afa9081156111d2576000916111a3575090565b90506020813d6020116111ca575b816111be60209383610d0e565b81010312610cba575190565b3d91506111b1565b6040513d6000823e3d90fd5b604051906111ed604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e6773526577617264736020830152565b6004602073ffffffffffffffffffffffffffffffffffffffff61123d61013b6111de565b16604051928380927f94e5d5120000000000000000000000000000000000000000000000000000000082525afa9081156111d2576000916111a3575090565b6040519061128b604083610d0e565b601182527f726f636b657452657761726473506f6f6c0000000000000000000000000000006020830152565b60005b8381106112ca5750506000910152565b81810151838201526020016112ba565b156112e157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e7472616374000000006044820152fd5b6040519061134e604083610d0e565b602082527f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b6020830152565b90816020910312610cba57518015158103610cba5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610cba570180359067ffffffffffffffff8211610cba57602001918160051b36038313610cba57565b91908110156113f65760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908201809211610e2457565b906080610fd99260408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e7460608201528160208201520190610f1c565b60405190611486604083610d0e565b601482527f726f636b657444414f4e6f6465547275737465640000000000000000000000006020830152565b73ffffffffffffffffffffffffffffffffffffffff6114d261013b61133f565b16906040517f63ed62da000000000000000000000000000000000000000000000000000000008152602081600481865afa9081156111d257600091611c62575b5015611bde5761152061216a565b90803593828511611b5a57608082013515611ad6576101408201926115458484611392565b61012085019291506115578386611392565b9190501480611ab2575b15611a545760009560c08501355b6115798787611392565b90508810156115ab576115a360019161159c8a6115968b8b611392565b906113e6565b3590611425565b97019661156f565b965091945091956000955b6115c08686611392565b90508710156115e5576115dd60019161159c896115968a8a611392565b9601956115b6565b91955093509490946115f5611d32565b106119f65761160d61010083013560e0840135611425565b926000935b61016084016116218186611392565b90508610156116465760019161159c8761159661163e9489611392565b940193611612565b5090935094909493919361165b61013b611dd7565b319061166e611668611c91565b83611425565b106119985760a08501351161193a57604051602081019061169481610391883386610fdc565b5190206116a081611e70565b6118dc576116ad90612062565b60408051606060208201818152601f60808401527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a08401523393830193909352810185905261170e91906117068160c08101610391565b519020612062565b6040516020810190611724816103918885611432565b51902092611731846121ee565b9360018501809511610e24578461174791612252565b80604051604081527f60e3a6abeddae923bd65a9a5dcd11f9a8e38f12f885eef210b91203f3ca872b161177d6040830189610f1c565b914260208201528033930390a3036118d75773ffffffffffffffffffffffffffffffffffffffff6117af61013b611477565b169180670de0b6b3a76400000290670de0b6b3a7640000820403610e24576020600493604051948580927f997072f70000000000000000000000000000000000000000000000000000000082525afa9283156111d2576000936118a1575b5061181c600493602092610e53565b91604051938480927f1f66e8ed0000000000000000000000000000000000000000000000000000000082525afa9182156111d25760009261186d575b5010156118625750565b61186b906122f3565b565b9091506020813d602011611899575b8161188960209383610d0e565b81010312610cba57519038611858565b3d915061187c565b92506020833d6020116118cf575b816118bc60209383610d0e565b81010312610cba5791519161181c61180d565b3d91506118af565b505050565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f646500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420736d6f6f7468696e6720706f6f6c2062616c616e636500006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c6964204554482072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c2072657761726473000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e6774680000000000000000000000006044820152fd5b50611abd8285611392565b9050611acd610160860186611392565b91905014611561565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e65787400000000000000000000000000000000006064820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c65640000000000000000000000000000000000000000000000006064820152fd5b611c84915060203d602011611c8a575b611c7c8183610d0e565b81019061137a565b38611512565b503d611c72565b73ffffffffffffffffffffffffffffffffffffffff611cb161013b611063565b16602060405180927f35ee5f870000000000000000000000000000000000000000000000000000000082528260048301528180611d1c60248201604090601181527f726f636b657452657761726473506f6f6c00000000000000000000000000000060208201520190565b03915afa9081156111d2576000916111a3575090565b6004602073ffffffffffffffffffffffffffffffffffffffff611d5661013b61109e565b16604051928380927fc1a260060000000000000000000000000000000000000000000000000000000082525afa80156111d257600090611da3575b610fd99150611d9e6110d9565b611425565b506020813d602011611dcf575b81611dbd60209383610d0e565b81010312610cba57610fd99051611d91565b3d9150611db0565b60405190611de6604083610d0e565b601382527f726f636b6574536d6f6f7468696e67506f6f6c000000000000000000000000006020830152565b80518210156113f65760209160051b010190565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452611e6981518092816020880152602088880191016112b7565b0116010190565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f7ae1cfca00000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091611ed4575090565b610fd9915060203d602011611c8a57611c7c8183610d0e565b611f359060405161035960308260208101947f636f6e74726163742e6164647265737300000000000000000000000000000000865261032a81518092602086860191016112b7565b73ffffffffffffffffffffffffffffffffffffffff811615611f545790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937f21f8a72100000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d257600091612016575090565b6020813d60201161205a575b8161202f60209383610d0e565b8101031261027c57519073ffffffffffffffffffffffffffffffffffffffff821682036101a3575090565b3d9150612022565b60009073ffffffffffffffffffffffffffffffffffffffff825460081c1690813b156120e25782916044839260405194859384927fabfdcced0000000000000000000000000000000000000000000000000000000084526004840152600160248401525af18015610288576120d5575050565b816120df91610d0e565b50565b8280fd5b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee260048301525afa9081156111d2576000916111a3575090565b6024602073ffffffffffffffffffffffffffffffffffffffff60005460081c16604051928380927fbd02d0f50000000000000000000000000000000000000000000000000000000082527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760048301525afa9081156111d2576000916111a3575090565b602073ffffffffffffffffffffffffffffffffffffffff60005460081c16916024604051809481937fbd02d0f500000000000000000000000000000000000000000000000000000000835260048301525afa9081156111d2576000916111a3575090565b60009173ffffffffffffffffffffffffffffffffffffffff835460081c1691823b1561054c5790604484928360405195869485937fe2a4853a000000000000000000000000000000000000000000000000000000008552600485015260248401525af18015610288576120d5575050565b3d156122ee573d906122d482610d96565b916122e26040519384610d0e565b82523d6000602084013e565b606090565b6122fe61013b61109e565b9073ffffffffffffffffffffffffffffffffffffffff6000921673ffffffffffffffffffffffffffffffffffffffff61233861013b611063565b16916040517f0882400300000000000000000000000000000000000000000000000000000000815260208160048188875af1801561059d57612d7c575b5073ffffffffffffffffffffffffffffffffffffffff845460081c16803b15610591578480916044604051809481937fadb353dc0000000000000000000000000000000000000000000000000000000083527f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f76004840152600160248401525af1801561059d57612d68575b5061240a6120e6565b94612413611219565b608083013590818102918183041490151715612d3b5794866124587fcdc52a6101e59cdabb15ba2e286593326138db03833e45895356994d978d28f996978399611425565b908435968791604051809160808252612474608083018a610f1c565b9060208301528560408301524260608301520390a26124fc60405160208101906124f2816103918b856045917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f626c6f636b000000000000000000000000000000000000000000000000000000602083015260258201520190565b5190204390612252565b6040516020810190612562816103918a856047917f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e82527f6164647265737300000000000000000000000000000000000000000000000000602083015260278201520190565b51902073ffffffffffffffffffffffffffffffffffffffff835460081c1690813b1561054c5783916044839260405194859384927fca446dd900000000000000000000000000000000000000000000000000000000845260048401523060248401525af1908115612c08578391612d26575b505460081c73ffffffffffffffffffffffffffffffffffffffff1690813b156120e25782916044839260405194859384927fe2a4853a0000000000000000000000000000000000000000000000000000000084527f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2600485015260248401525af1801561028857612d11575b5060c083013580612c77575b505073ffffffffffffffffffffffffffffffffffffffff61268e61013b611dd7565b16928660a08401359485612c13575b50506101008301359560e0840135956126b68789611425565b9689975b61016087018b6126ca828a611392565b90508b10156126f0575060019161159c8b6115966126e8948c611392565b9801976126ba565b94989190506127059295995099929599610e17565b80612ba3575b5080612aea575b505080612a23575b50855b610140830161272c8185611392565b9050821015612a1957612746826115966127599387611392565b3561159c83611596610120880188611392565b61276b82611596610160870187611392565b35811591828093612a11575b612a065773ffffffffffffffffffffffffffffffffffffffff6127d360405160208101907f726577617264732e72656c61792e616464726573730000000000000000000000825287603582015260358152610359605582610d0e565b16918215612982578a9315612910575b8061286f575b823b1561054c5760a484928360405195869485937f44701afb0000000000000000000000000000000000000000000000000000000085528b60048601526001602486015260608d01356044860152606485015260848401525af180156102885761285a575b50506001905b0161271d565b8161286491610d0e565b6107da57863861284e565b9280808086865af161287f6122c3565b501561288c5789926127e9565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4661696c656420746f2073656e6420455448207265776172647320746f20726560448201527f6c617900000000000000000000000000000000000000000000000000000000006064820152fd5b873b1561054c576040517f01e336670000000000000000000000000000000000000000000000000000000081528360048201528960248201528260448201528481606481838d5af190811561059d57859161296d575b50506127e3565b8161297791610d0e565b61054c578338612966565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b000000000000000000000000000000000000006064820152fd5b505050600190612854565b508115612777565b5050505050509050565b8680808060409473ffffffffffffffffffffffffffffffffffffffff612a7d8751612a4e8982610d0e565b600e81527f726f636b6574436c61696d44414f0000000000000000000000000000000000006020820152611eed565b165af1612a886122c3565b5061271a57606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e64207044414f207265776172647300000000006044820152fd5b81808092612b2e604051612aff604082610d0e565b600f81527f726f636b6574546f6b656e5245544800000000000000000000000000000000006020820152611eed565b5af1612b386122c3565b5015612b45578638612712565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f2073656e642075736572207265776172647300000000006044820152fd5b863b156120e257604051907f3bed33ce00000000000000000000000000000000000000000000000000000000825260048201528281602481838b5af1908115612c08578391612bf3575b5061270b565b81612bfd91610d0e565b61027c578138612bed565b6040513d85823e3d90fd5b803b1561027c578180916044604051809481937f522f68150000000000000000000000000000000000000000000000000000000083523060048401528b60248401525af18015610288571561269d5781612c6c91610d0e565b6107da57863861269d565b863b1561027c57604051907fee91035e00000000000000000000000000000000000000000000000000000000825260606004830152600e60648301527f726f636b6574436c61696d44414f00000000000000000000000000000000000060848301528560248301526044820152818160a481838b5af18015610288571561266c5781612d0291610d0e565b612d0d57853861266c565b8580fd5b81612d1b91610d0e565b612d0d578538612660565b81612d3091610d0e565b61027c5781386125d4565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b84612d7591959295610d0e565b9238612401565b6020813d602011612da3575b81612d9560209383610d0e565b810103126105915751612375565b3d9150612d8856fea2646970667358221220e402ac624678d598c825bf0a57e7228412f39692667673c53da6f73559c278f664736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f4d539f1babdaa6e47b1112bc9fa1c83cf0ffe59
-----Decoded View---------------
Arg [0] : _rocketStorageAddress (address): 0xf4D539F1babDAa6E47b1112Bc9Fa1C83cF0FfE59
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f4d539f1babdaa6e47b1112bc9fa1c83cf0ffe59
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.