Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 238 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Submit Reward Sn... | 24440327 | 33 days ago | IN | 0 ETH | 0.00161659 | ||||
| Submit Reward Sn... | 24439179 | 33 days ago | IN | 0 ETH | 0.00022733 | ||||
| Submit Reward Sn... | 24439158 | 33 days ago | IN | 0 ETH | 0.00064964 | ||||
| Submit Reward Sn... | 24439099 | 33 days ago | IN | 0 ETH | 0.0006516 | ||||
| Submit Reward Sn... | 24439033 | 33 days ago | IN | 0 ETH | 0.00064999 | ||||
| Submit Reward Sn... | 24438912 | 33 days ago | IN | 0 ETH | 0.00070322 | ||||
| Submit Reward Sn... | 24238597 | 61 days ago | IN | 0 ETH | 0.00161355 | ||||
| Submit Reward Sn... | 24238552 | 61 days ago | IN | 0 ETH | 0.0006502 | ||||
| Submit Reward Sn... | 24238537 | 61 days ago | IN | 0 ETH | 0.00065346 | ||||
| Submit Reward Sn... | 24238487 | 61 days ago | IN | 0 ETH | 0.00065084 | ||||
| Submit Reward Sn... | 24238471 | 61 days ago | IN | 0 ETH | 0.00065368 | ||||
| Submit Reward Sn... | 24238463 | 61 days ago | IN | 0 ETH | 0.00065369 | ||||
| Submit Reward Sn... | 24238379 | 61 days ago | IN | 0 ETH | 0.00070866 | ||||
| Submit Reward Sn... | 24038305 | 89 days ago | IN | 0 ETH | 0.00159534 | ||||
| Submit Reward Sn... | 24038260 | 89 days ago | IN | 0 ETH | 0.00064563 | ||||
| Submit Reward Sn... | 24037980 | 89 days ago | IN | 0 ETH | 0.00064558 | ||||
| Submit Reward Sn... | 24037933 | 89 days ago | IN | 0 ETH | 0.00064555 | ||||
| Submit Reward Sn... | 24037904 | 89 days ago | IN | 0 ETH | 0.00064532 | ||||
| Submit Reward Sn... | 24037873 | 89 days ago | IN | 0 ETH | 0.00064545 | ||||
| Submit Reward Sn... | 24037849 | 89 days ago | IN | 0 ETH | 0.00069724 | ||||
| Submit Reward Sn... | 23840345 | 117 days ago | IN | 0 ETH | 0.00164073 | ||||
| Submit Reward Sn... | 23839072 | 117 days ago | IN | 0 ETH | 0.00068549 | ||||
| Submit Reward Sn... | 23839024 | 117 days ago | IN | 0 ETH | 0.00071698 | ||||
| Submit Reward Sn... | 23838806 | 117 days ago | IN | 0 ETH | 0.00125919 | ||||
| Submit Reward Sn... | 23838695 | 117 days ago | IN | 0 ETH | 0.0009995 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RocketRewardsPool
Compiler Version
v0.8.18+commit.87f61d96
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.
*
*/
pragma solidity 0.8.18;
pragma abicoder v2;
// SPDX-License-Identifier: GPL-3.0-only
import "../RocketBase.sol";
import "../../interface/token/RocketTokenRPLInterface.sol";
import "../../interface/rewards/RocketRewardsPoolInterface.sol";
import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsNetworkInterface.sol";
import "../../interface/dao/node/RocketDAONodeTrustedInterface.sol";
import "../../interface/network/RocketNetworkBalancesInterface.sol";
import "../../interface/RocketVaultInterface.sol";
import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsRewardsInterface.sol";
import "../../interface/rewards/RocketRewardsRelayInterface.sol";
import "../../interface/rewards/RocketSmoothingPoolInterface.sol";
import "../../types/RewardSubmission.sol";
/// @notice Holds RPL generated by the network for claiming from stakers (node operators etc)
contract RocketRewardsPool is RocketBase, RocketRewardsPoolInterface {
// Events
event RewardSnapshotSubmitted(address indexed from, uint256 indexed rewardIndex, RewardSubmission submission, uint256 time);
event RewardSnapshot(uint256 indexed rewardIndex, RewardSubmission submission, uint256 intervalStartTime, uint256 intervalEndTime, uint256 time);
constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) {
version = 4;
}
/// @notice Get the reward index
function getRewardIndex() override public view returns(uint256) {
return getUint(keccak256("rewards.snapshot.index"));
}
/// @notice Increment the reward index
function incrementRewardIndex() private {
addUint(keccak256("rewards.snapshot.index"), 1);
}
/// @notice Get how much RPL the Rewards Pool contract currently has assigned to it as a whole
/// @return uint256 Returns rpl balance of rocket rewards contract
function getRPLBalance() override public view returns(uint256) {
// Get the vault contract instance
RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
// Check contract RPL balance
return rocketVault.balanceOfToken("rocketRewardsPool", IERC20(getContractAddress("rocketTokenRPL")));
}
/// @notice Returns the total amount of RPL that needs to be distributed to claimers at the current block
function getPendingRPLRewards() override public view returns (uint256) {
RocketTokenRPLInterface rplContract = RocketTokenRPLInterface(getContractAddress("rocketTokenRPL"));
uint256 pendingInflation = rplContract.inflationCalculate();
// Any inflation that has accrued so far plus any amount that would be minted if we called it now
return getRPLBalance() + pendingInflation;
}
/// @notice Returns the total amount of ETH in the smoothing pool ready to be distributed
function getPendingETHRewards() override public view returns (uint256) {
address rocketSmoothingPoolAddress = getContractAddress("rocketSmoothingPool");
return rocketSmoothingPoolAddress.balance;
}
/// @notice Get the last set interval start time
/// @return uint256 Last set start timestamp for a claim interval
function getClaimIntervalTimeStart() override public view returns(uint256) {
return getUint(keccak256("rewards.pool.claim.interval.time.start"));
}
/// @notice Get how many seconds in a claim interval
/// @return uint256 Number of seconds in a claim interval
function getClaimIntervalTime() override public view returns(uint256) {
// Get from the DAO settings
RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
return daoSettingsRewards.getRewardsClaimIntervalTime();
}
/// @notice Compute intervals since last claim period
/// @return uint256 Time intervals since last update
function getClaimIntervalsPassed() override public view returns(uint256) {
return (block.timestamp - getClaimIntervalTimeStart()) / getClaimIntervalTime();
}
/// @notice Returns the block number that the given claim interval was executed at
/// @param _interval The interval for which to grab the execution block of
function getClaimIntervalExecutionBlock(uint256 _interval) override external view returns(uint256) {
return getUint(keccak256(abi.encodePacked("rewards.pool.interval.execution.block", _interval)));
}
/// @notice Returns the address of the contract which was used to execute this reward interval
/// @param _interval The interval for which to grab the address of
function getClaimIntervalExecutionAddress(uint256 _interval) override external view returns(address) {
return getAddress(keccak256(abi.encodePacked("rewards.pool.interval.execution.address", _interval)));
}
/// @notice Get the percentage this contract can claim in this interval
/// @return uint256 Rewards percentage this contract can claim in this interval
function getClaimingContractPerc(string memory _claimingContract) override public view returns (uint256) {
// Load contract
RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
// Get the % amount allocated to this claim contract
return daoSettingsRewards.getRewardsClaimerPerc(_claimingContract);
}
/// @notice Get an array of percentages that the given contracts can claim in this interval
/// @return uint256[] Array of percentages in the order of the supplied contract names
function getClaimingContractsPerc(string[] memory _claimingContracts) override external view returns (uint256[] memory) {
// Load contract
RocketDAOProtocolSettingsRewardsInterface daoSettingsRewards = RocketDAOProtocolSettingsRewardsInterface(getContractAddress("rocketDAOProtocolSettingsRewards"));
// Get the % amount allocated to this claim contract
uint256[] memory percentages = new uint256[](_claimingContracts.length);
for (uint256 i = 0; i < _claimingContracts.length; ++i){
percentages[i] = daoSettingsRewards.getRewardsClaimerPerc(_claimingContracts[i]);
}
return percentages;
}
/// @notice Returns whether a trusted node has submitted for a given reward index
function getTrustedNodeSubmitted(address _trustedNodeAddress, uint256 _rewardIndex) override external view returns (bool) {
return getBool(keccak256(abi.encode("rewards.snapshot.submitted.node", _trustedNodeAddress, _rewardIndex)));
}
/// @notice Returns whether a trusted node has submitted a specific RewardSubmission
function getSubmissionFromNodeExists(address _trustedNodeAddress, RewardSubmission calldata _submission) override external view returns (bool) {
return getBool(keccak256(abi.encode("rewards.snapshot.submitted.node.key", _trustedNodeAddress, _submission)));
}
/// @notice Returns the number of trusted nodes who have agreed to the given submission
function getSubmissionCount(RewardSubmission calldata _submission) override external view returns (uint256) {
return getUint(keccak256(abi.encode("rewards.snapshot.submitted.count", _submission)));
}
/// @notice Submit a reward snapshot. Only accepts calls from trusted (oracle) nodes
function submitRewardSnapshot(RewardSubmission calldata _submission) override external onlyLatestContract("rocketRewardsPool", address(this)) onlyTrustedNode(msg.sender) {
// Get contracts
RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
// Check submission is currently enabled
require(rocketDAOProtocolSettingsNetwork.getSubmitRewardsEnabled(), "Submitting rewards is currently disabled");
// Validate inputs
uint256 rewardIndex = getRewardIndex();
require(_submission.rewardIndex <= rewardIndex, "Can only submit snapshot for periods up to next");
require(_submission.intervalsPassed > 0, "Invalid number of intervals passed");
require(_submission.nodeRPL.length == _submission.trustedNodeRPL.length && _submission.trustedNodeRPL.length == _submission.nodeETH.length, "Invalid array length");
// Calculate RPL reward total and validate
{ // Scope to prevent stack too deep
uint256 totalRewardsRPL = _submission.treasuryRPL;
for (uint256 i = 0; i < _submission.nodeRPL.length; ++i){
totalRewardsRPL = totalRewardsRPL + _submission.nodeRPL[i];
}
for (uint256 i = 0; i < _submission.trustedNodeRPL.length; ++i){
totalRewardsRPL = totalRewardsRPL + _submission.trustedNodeRPL[i];
}
require(totalRewardsRPL <= getPendingRPLRewards(), "Invalid RPL rewards");
}
// Calculate ETH reward total and validate
{ // Scope to prevent stack too deep
uint256 totalRewardsETH = 0;
for (uint256 i = 0; i < _submission.nodeETH.length; ++i){
totalRewardsETH = totalRewardsETH + _submission.nodeETH[i];
}
require(totalRewardsETH <= getPendingETHRewards(), "Invalid ETH rewards");
}
// Store and increment vote
uint256 submissionCount;
{ // Scope to prevent stack too deep
// Check & update node submission status
bytes32 nodeSubmissionKey = keccak256(abi.encode("rewards.snapshot.submitted.node.key", msg.sender, _submission));
require(!getBool(nodeSubmissionKey), "Duplicate submission from node");
setBool(nodeSubmissionKey, true);
setBool(keccak256(abi.encode("rewards.snapshot.submitted.node", msg.sender, _submission.rewardIndex)), true);
}
{ // Scope to prevent stack too deep
// Increment submission count
bytes32 submissionCountKey = keccak256(abi.encode("rewards.snapshot.submitted.count", _submission));
submissionCount = getUint(submissionCountKey) + 1;
setUint(submissionCountKey, submissionCount);
}
// Emit snapshot submitted event
emit RewardSnapshotSubmitted(msg.sender, _submission.rewardIndex, _submission, block.timestamp);
// Return if already executed
if (_submission.rewardIndex != rewardIndex) {
return;
}
// If consensus is reached, execute the snapshot
RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
if (calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold()) {
_executeRewardSnapshot(_submission);
}
}
/// @notice Executes reward snapshot if consensus threshold is reached
function executeRewardSnapshot(RewardSubmission calldata _submission) override external onlyLatestContract("rocketRewardsPool", address(this)) {
// Validate reward index of submission
require(_submission.rewardIndex == getRewardIndex(), "Can only execute snapshot for next period");
// Get submission count
bytes32 submissionCountKey = keccak256(abi.encode("rewards.snapshot.submitted.count", _submission));
uint256 submissionCount = getUint(submissionCountKey);
// Confirm consensus and execute
RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
require(calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold(), "Consensus has not been reached");
_executeRewardSnapshot(_submission);
}
/// @notice Executes reward snapshot and sends assets to the relays for distribution to reward recipients
function _executeRewardSnapshot(RewardSubmission calldata _submission) private {
// Get contract
RocketTokenRPLInterface rplContract = RocketTokenRPLInterface(getContractAddress("rocketTokenRPL"));
RocketVaultInterface rocketVault = RocketVaultInterface(getContractAddress("rocketVault"));
// Execute inflation if required
rplContract.inflationMintTokens();
// Increment the reward index and update the claim interval timestamp
incrementRewardIndex();
uint256 claimIntervalTimeStart = getClaimIntervalTimeStart();
uint256 claimIntervalTimeEnd = claimIntervalTimeStart + (getClaimIntervalTime() * _submission.intervalsPassed);
// Emit reward snapshot event
emit RewardSnapshot(_submission.rewardIndex, _submission, claimIntervalTimeStart, claimIntervalTimeEnd, block.timestamp);
setUint(keccak256(abi.encodePacked("rewards.pool.interval.execution.block", _submission.rewardIndex)), block.number);
setAddress(keccak256(abi.encodePacked("rewards.pool.interval.execution.address", _submission.rewardIndex)), address(this));
setUint(keccak256("rewards.pool.claim.interval.time.start"), claimIntervalTimeEnd);
// Send out the treasury rewards
if (_submission.treasuryRPL > 0) {
rocketVault.transferToken("rocketClaimDAO", rplContract, _submission.treasuryRPL);
}
// Get the smoothing pool instance
RocketSmoothingPoolInterface rocketSmoothingPool = RocketSmoothingPoolInterface(getContractAddress("rocketSmoothingPool"));
// Send deposit pool user's ETH
if (_submission.userETH > 0) {
address rocketTokenRETHAddress = getContractAddress("rocketTokenRETH");
rocketSmoothingPool.withdrawEther(rocketTokenRETHAddress, _submission.userETH);
}
// Loop over each network and distribute rewards
for (uint i = 0; i < _submission.nodeRPL.length; ++i) {
// Quick out if no rewards for this network
uint256 rewardsRPL = _submission.nodeRPL[i] + _submission.trustedNodeRPL[i];
uint256 rewardsETH = _submission.nodeETH[i];
if (rewardsRPL == 0 && rewardsETH == 0) {
continue;
}
// Grab the relay address
RocketRewardsRelayInterface relay;
{ // Scope to prevent stack too deep
address networkRelayAddress;
bytes32 networkRelayKey = keccak256(abi.encodePacked("rewards.relay.address", i));
networkRelayAddress = getAddress(networkRelayKey);
// Validate network is valid
require (networkRelayAddress != address(0), "Snapshot contains rewards for invalid network");
relay = RocketRewardsRelayInterface(networkRelayAddress);
}
// Transfer rewards
if (rewardsRPL > 0) {
// RPL rewards are withdrawn from the vault
rocketVault.withdrawToken(address(relay), rplContract, rewardsRPL);
}
if (rewardsETH > 0) {
// ETH rewards are withdrawn from the smoothing pool
rocketSmoothingPool.withdrawEther(address(relay), rewardsETH);
}
// Call into relay contract to handle distribution of rewards
relay.relayRewards(_submission.rewardIndex, _submission.merkleRoot, rewardsRPL, rewardsETH);
}
}
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketStorageInterface {
// Deploy status
function getDeployedStatus() external view returns (bool);
// Guardian
function getGuardian() external view returns(address);
function setGuardian(address _newAddress) external;
function confirmGuardian() external;
// Getters
function getAddress(bytes32 _key) external view returns (address);
function getUint(bytes32 _key) external view returns (uint);
function getString(bytes32 _key) external view returns (string memory);
function getBytes(bytes32 _key) external view returns (bytes memory);
function getBool(bytes32 _key) external view returns (bool);
function getInt(bytes32 _key) external view returns (int);
function getBytes32(bytes32 _key) external view returns (bytes32);
// Setters
function setAddress(bytes32 _key, address _value) external;
function setUint(bytes32 _key, uint _value) external;
function setString(bytes32 _key, string calldata _value) external;
function setBytes(bytes32 _key, bytes calldata _value) external;
function setBool(bytes32 _key, bool _value) external;
function setInt(bytes32 _key, int _value) external;
function setBytes32(bytes32 _key, bytes32 _value) external;
// Deleters
function deleteAddress(bytes32 _key) external;
function deleteUint(bytes32 _key) external;
function deleteString(bytes32 _key) external;
function deleteBytes(bytes32 _key) external;
function deleteBool(bytes32 _key) external;
function deleteInt(bytes32 _key) external;
function deleteBytes32(bytes32 _key) external;
// Arithmetic
function addUint(bytes32 _key, uint256 _amount) external;
function subUint(bytes32 _key, uint256 _amount) external;
// Protected storage
function getNodeWithdrawalAddress(address _nodeAddress) external view returns (address);
function getNodePendingWithdrawalAddress(address _nodeAddress) external view returns (address);
function setWithdrawalAddress(address _nodeAddress, address _newWithdrawalAddress, bool _confirm) external;
function confirmWithdrawalAddress(address _nodeAddress) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
import "../interface/RocketStorageInterface.sol";
/// @title Base settings / modifiers for each contract in Rocket Pool
/// @author David Rugendyke
abstract contract RocketBase {
// Calculate using this as the base
uint256 constant calcBase = 1 ether;
// Version of the contract
uint8 public version;
// The main storage contract where primary persistant storage is maintained
RocketStorageInterface rocketStorage = RocketStorageInterface(address(0));
/*** Modifiers **********************************************************/
/**
* @dev Throws if called by any sender that doesn't match a Rocket Pool network contract
*/
modifier onlyLatestNetworkContract() {
require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract");
_;
}
/**
* @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract
*/
modifier onlyLatestContract(string memory _contractName, address _contractAddress) {
require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered node
*/
modifier onlyRegisteredNode(address _nodeAddress) {
require(getBool(keccak256(abi.encodePacked("node.exists", _nodeAddress))), "Invalid node");
_;
}
/**
* @dev Throws if called by any sender that isn't a trusted node DAO member
*/
modifier onlyTrustedNode(address _nodeAddress) {
require(getBool(keccak256(abi.encodePacked("dao.trustednodes.", "member", _nodeAddress))), "Invalid trusted node");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered minipool
*/
modifier onlyRegisteredMinipool(address _minipoolAddress) {
require(getBool(keccak256(abi.encodePacked("minipool.exists", _minipoolAddress))), "Invalid minipool");
_;
}
/**
* @dev Throws if called by any account other than a guardian account (temporary account allowed access to settings before DAO is fully enabled)
*/
modifier onlyGuardian() {
require(msg.sender == rocketStorage.getGuardian(), "Account is not a temporary guardian");
_;
}
/*** Methods **********************************************************/
/// @dev Set the main Rocket Storage address
constructor(RocketStorageInterface _rocketStorageAddress) {
// Update the contract address
rocketStorage = RocketStorageInterface(_rocketStorageAddress);
}
/// @dev Get the address of a network contract by name
function getContractAddress(string memory _contractName) internal view returns (address) {
// Get the current contract address
address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
// Check it
require(contractAddress != address(0x0), "Contract not found");
// Return
return contractAddress;
}
/// @dev Get the address of a network contract by name (returns address(0x0) instead of reverting if contract does not exist)
function getContractAddressUnsafe(string memory _contractName) internal view returns (address) {
// Get the current contract address
address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
// Return
return contractAddress;
}
/// @dev Get the name of a network contract by address
function getContractName(address _contractAddress) internal view returns (string memory) {
// Get the contract name
string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress)));
// Check it
require(bytes(contractName).length > 0, "Contract not found");
// Return
return contractName;
}
/// @dev Get revert error message from a .call method
function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
// If the _res length is less than 68, then the transaction failed silently (without a revert message)
if (_returnData.length < 68) return "Transaction reverted silently";
assembly {
// Slice the sighash.
_returnData := add(_returnData, 0x04)
}
return abi.decode(_returnData, (string)); // All that remains is the revert string
}
/*** Rocket Storage Methods ****************************************/
// Note: Unused helpers have been removed to keep contract sizes down
/// @dev Storage get methods
function getAddress(bytes32 _key) internal view returns (address) { return rocketStorage.getAddress(_key); }
function getUint(bytes32 _key) internal view returns (uint) { return rocketStorage.getUint(_key); }
function getString(bytes32 _key) internal view returns (string memory) { return rocketStorage.getString(_key); }
function getBytes(bytes32 _key) internal view returns (bytes memory) { return rocketStorage.getBytes(_key); }
function getBool(bytes32 _key) internal view returns (bool) { return rocketStorage.getBool(_key); }
function getInt(bytes32 _key) internal view returns (int) { return rocketStorage.getInt(_key); }
function getBytes32(bytes32 _key) internal view returns (bytes32) { return rocketStorage.getBytes32(_key); }
/// @dev Storage set methods
function setAddress(bytes32 _key, address _value) internal { rocketStorage.setAddress(_key, _value); }
function setUint(bytes32 _key, uint _value) internal { rocketStorage.setUint(_key, _value); }
function setString(bytes32 _key, string memory _value) internal { rocketStorage.setString(_key, _value); }
function setBytes(bytes32 _key, bytes memory _value) internal { rocketStorage.setBytes(_key, _value); }
function setBool(bytes32 _key, bool _value) internal { rocketStorage.setBool(_key, _value); }
function setInt(bytes32 _key, int _value) internal { rocketStorage.setInt(_key, _value); }
function setBytes32(bytes32 _key, bytes32 _value) internal { rocketStorage.setBytes32(_key, _value); }
/// @dev Storage delete methods
function deleteAddress(bytes32 _key) internal { rocketStorage.deleteAddress(_key); }
function deleteUint(bytes32 _key) internal { rocketStorage.deleteUint(_key); }
function deleteString(bytes32 _key) internal { rocketStorage.deleteString(_key); }
function deleteBytes(bytes32 _key) internal { rocketStorage.deleteBytes(_key); }
function deleteBool(bytes32 _key) internal { rocketStorage.deleteBool(_key); }
function deleteInt(bytes32 _key) internal { rocketStorage.deleteInt(_key); }
function deleteBytes32(bytes32 _key) internal { rocketStorage.deleteBytes32(_key); }
/// @dev Storage arithmetic methods
function addUint(bytes32 _key, uint256 _amount) internal { rocketStorage.addUint(_key, _amount); }
function subUint(bytes32 _key, uint256 _amount) internal { rocketStorage.subUint(_key, _amount); }
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity >0.5.0 <0.9.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
import "../util/IERC20.sol";
interface RocketTokenRPLInterface is IERC20 {
function getInflationCalcTime() external view returns(uint256);
function getInflationIntervalTime() external view returns(uint256);
function getInflationIntervalRate() external view returns(uint256);
function getInflationIntervalsPassed() external view returns(uint256);
function getInflationIntervalStartTime() external view returns(uint256);
function getInflationRewardsContractAddress() external view returns(address);
function inflationCalculate() external view returns (uint256);
function inflationMintTokens() external returns (uint256);
function swapTokens(uint256 _amount) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
struct RewardSubmission {
uint256 rewardIndex;
uint256 executionBlock;
uint256 consensusBlock;
bytes32 merkleRoot;
string merkleTreeCID;
uint256 intervalsPassed;
uint256 treasuryRPL;
uint256[] trustedNodeRPL;
uint256[] nodeRPL;
uint256[] nodeETH;
uint256 userETH;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
import "../../types/RewardSubmission.sol";
// SPDX-License-Identifier: GPL-3.0-only
interface RocketRewardsPoolInterface {
function getRewardIndex() external view returns(uint256);
function getRPLBalance() external view returns(uint256);
function getPendingRPLRewards() external view returns (uint256);
function getPendingETHRewards() external view returns (uint256);
function getClaimIntervalTimeStart() external view returns(uint256);
function getClaimIntervalTime() external view returns(uint256);
function getClaimIntervalsPassed() external view returns(uint256);
function getClaimIntervalExecutionBlock(uint256 _interval) external view returns(uint256);
function getClaimIntervalExecutionAddress(uint256 _interval) external view returns(address);
function getClaimingContractPerc(string memory _claimingContract) external view returns(uint256);
function getClaimingContractsPerc(string[] memory _claimingContracts) external view returns (uint256[] memory);
function getTrustedNodeSubmitted(address _trustedNodeAddress, uint256 _rewardIndex) external view returns (bool);
function getSubmissionFromNodeExists(address _trustedNodeAddress, RewardSubmission calldata _submission) external view returns (bool);
function getSubmissionCount(RewardSubmission calldata _submission) external view returns (uint256);
function submitRewardSnapshot(RewardSubmission calldata _submission) external;
function executeRewardSnapshot(RewardSubmission calldata _submission) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketDAOProtocolSettingsNetworkInterface {
function getNodeConsensusThreshold() external view returns (uint256);
function getNodePenaltyThreshold() external view returns (uint256);
function getPerPenaltyRate() external view returns (uint256);
function getSubmitBalancesEnabled() external view returns (bool);
function getSubmitBalancesFrequency() external view returns (uint256);
function getSubmitPricesEnabled() external view returns (bool);
function getSubmitPricesFrequency() external view returns (uint256);
function getMinimumNodeFee() external view returns (uint256);
function getTargetNodeFee() external view returns (uint256);
function getMaximumNodeFee() external view returns (uint256);
function getNodeFeeDemandRange() external view returns (uint256);
function getTargetRethCollateralRate() external view returns (uint256);
function getRethDepositDelay() external view returns (uint256);
function getSubmitRewardsEnabled() external view returns (bool);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketDAONodeTrustedInterface {
function getBootstrapModeDisabled() external view returns (bool);
function getMemberQuorumVotesRequired() external view returns (uint256);
function getMemberAt(uint256 _index) external view returns (address);
function getMemberCount() external view returns (uint256);
function getMemberMinRequired() external view returns (uint256);
function getMemberIsValid(address _nodeAddress) external view returns (bool);
function getMemberLastProposalTime(address _nodeAddress) external view returns (uint256);
function getMemberID(address _nodeAddress) external view returns (string memory);
function getMemberUrl(address _nodeAddress) external view returns (string memory);
function getMemberJoinedTime(address _nodeAddress) external view returns (uint256);
function getMemberProposalExecutedTime(string memory _proposalType, address _nodeAddress) external view returns (uint256);
function getMemberRPLBondAmount(address _nodeAddress) external view returns (uint256);
function getMemberIsChallenged(address _nodeAddress) external view returns (bool);
function getMemberUnbondedValidatorCount(address _nodeAddress) external view returns (uint256);
function incrementMemberUnbondedValidatorCount(address _nodeAddress) external;
function decrementMemberUnbondedValidatorCount(address _nodeAddress) external;
function bootstrapMember(string memory _id, string memory _url, address _nodeAddress) external;
function bootstrapSettingUint(string memory _settingContractName, string memory _settingPath, uint256 _value) external;
function bootstrapSettingBool(string memory _settingContractName, string memory _settingPath, bool _value) external;
function bootstrapUpgrade(string memory _type, string memory _name, string memory _contractAbi, address _contractAddress) external;
function bootstrapDisable(bool _confirmDisableBootstrapMode) external;
function memberJoinRequired(string memory _id, string memory _url) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketNetworkBalancesInterface {
function getBalancesBlock() external view returns (uint256);
function getTotalETHBalance() external view returns (uint256);
function getStakingETHBalance() external view returns (uint256);
function getTotalRETHSupply() external view returns (uint256);
function getETHUtilizationRate() external view returns (uint256);
function submitBalances(uint256 _block, uint256 _slotTimestamp, uint256 _total, uint256 _staking, uint256 _rethSupply) external;
function executeUpdateBalances(uint256 _block, uint256 _slotTimestamp, uint256 _totalEth, uint256 _stakingEth, uint256 _rethSupply) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
import "./IERC20.sol";
pragma solidity >0.5.0 <0.9.0;
interface IERC20Burnable is IERC20 {
function burn(uint256 amount) external;
function burnFrom(address account, uint256 amount) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
pragma solidity >0.5.0 <0.9.0;
// SPDX-License-Identifier: GPL-3.0-only
import "./util/IERC20Burnable.sol";
interface RocketVaultInterface {
function balanceOf(string memory _networkContractName) external view returns (uint256);
function depositEther() external payable;
function withdrawEther(uint256 _amount) external;
function depositToken(string memory _networkContractName, IERC20 _tokenAddress, uint256 _amount) external;
function withdrawToken(address _withdrawalAddress, IERC20 _tokenAddress, uint256 _amount) external;
function balanceOfToken(string memory _networkContractName, IERC20 _tokenAddress) external view returns (uint256);
function transferToken(string memory _networkContractName, IERC20 _tokenAddress, uint256 _amount) external;
function burnToken(IERC20Burnable _tokenAddress, uint256 _amount) external;
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
interface RocketDAOProtocolSettingsRewardsInterface {
function setSettingRewardsClaimers(uint256 _trustedNodePercent, uint256 _protocolPercent, uint256 _nodePercent) external;
function getRewardsClaimerPerc(string memory _contractName) external view returns (uint256);
function getRewardsClaimersPerc() external view returns (uint256 _trustedNodePercent, uint256 _protocolPercent, uint256 _nodePercent);
function getRewardsClaimersTrustedNodePerc() external view returns (uint256);
function getRewardsClaimersProtocolPerc() external view returns (uint256);
function getRewardsClaimersNodePerc() external view returns (uint256);
function getRewardsClaimersTimeUpdated() external view returns (uint256);
function getRewardsClaimIntervalPeriods() external view returns (uint256);
function getRewardsClaimIntervalTime() external view returns (uint256);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
interface RocketRewardsRelayInterface {
function relayRewards(uint256 _intervalIndex, bytes32 _merkleRoot, uint256 _rewardsRPL, uint256 _rewardsETH) external;
function claim(address _nodeAddress, uint256[] calldata _intervalIndex, uint256[] calldata _amountRPL, uint256[] calldata _amountETH, bytes32[][] calldata _merkleProof) external;
function claimAndStake(address _nodeAddress, uint256[] calldata _intervalIndex, uint256[] calldata _amountRPL, uint256[] calldata _amountETH, bytes32[][] calldata _merkleProof, uint256 _stakeAmount) external;
function isClaimed(uint256 _intervalIndex, address _claimer) external view returns (bool);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >0.5.0 <0.9.0;
pragma abicoder v2;
interface RocketSmoothingPoolInterface {
function withdrawEther(address _to, uint256 _amount) external;
}{
"optimizer": {
"enabled": true,
"runs": 15000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract RocketStorageInterface","name":"_rocketStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"indexed":false,"internalType":"struct RewardSubmission","name":"submission","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"intervalStartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"intervalEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RewardSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"indexed":false,"internalType":"struct RewardSubmission","name":"submission","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"RewardSnapshotSubmitted","type":"event"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"executeRewardSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"getClaimIntervalExecutionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"getClaimIntervalExecutionBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalTimeStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimIntervalsPassed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_claimingContract","type":"string"}],"name":"getClaimingContractPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_claimingContracts","type":"string[]"}],"name":"getClaimingContractsPerc","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingETHRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingRPLRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRPLBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"getSubmissionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedNodeAddress","type":"address"},{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"getSubmissionFromNodeExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedNodeAddress","type":"address"},{"internalType":"uint256","name":"_rewardIndex","type":"uint256"}],"name":"getTrustedNodeSubmitted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"executionBlock","type":"uint256"},{"internalType":"uint256","name":"consensusBlock","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"merkleTreeCID","type":"string"},{"internalType":"uint256","name":"intervalsPassed","type":"uint256"},{"internalType":"uint256","name":"treasuryRPL","type":"uint256"},{"internalType":"uint256[]","name":"trustedNodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeRPL","type":"uint256[]"},{"internalType":"uint256[]","name":"nodeETH","type":"uint256[]"},{"internalType":"uint256","name":"userETH","type":"uint256"}],"internalType":"struct RewardSubmission","name":"_submission","type":"tuple"}],"name":"submitRewardSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405260008054610100600160a81b03191690553480156200002257600080fd5b5060405162002e4c38038062002e4c83398101604081905262000045916200007a565b6000805460ff196001600160a01b0390931661010002929092166001600160a81b0319909216919091176004179055620000ac565b6000602082840312156200008d57600080fd5b81516001600160a01b0381168114620000a557600080fd5b9392505050565b612d9080620000bc6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80637425f1e7116100b2578063ba34cb4b11610081578063e51920d311610066578063e51920d31461024b578063f21c150c1461025e578063f6a3f6ef1461026657600080fd5b8063ba34cb4b14610223578063cdfd4e1c1461022b57600080fd5b80637425f1e7146101c8578063ab772cb1146101d0578063b0aa28de146101e3578063b81bda511461021b57600080fd5b806347e884ef116100ee57806347e884ef1461017957806350a2f7e51461018e57806354fd4d50146101965780635d3e8ffa146101b557600080fd5b8063043877d014610120578063204e2a0a1461013b5780632198e62c1461015e5780633bfae5d914610166575b600080fd5b610128610279565b6040519081526020015b60405180910390f35b61014e610149366004612435565b6102a4565b6040519015158152602001610132565b610128610335565b61014e61017436600461247a565b61049b565b61018c6101873660046124ca565b6104b3565b005b610128610879565b6000546101a39060ff1681565b60405160ff9091168152602001610132565b61018c6101c33660046124ca565b610907565b6101286112fc565b6101286101de366004612507565b6113cc565b6101f66101f1366004612507565b61144f565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610132565b6101286114b7565b610128611515565b61023e61023936600461262c565b611540565b60405161013291906126ef565b6101286102593660046124ca565b6116a0565b6101286116b6565b610128610274366004612733565b6116e1565b6000610283610879565b61028b611515565b6102959042612797565b61029f91906127aa565b905090565b600061032c83836040516020016103119291906060808252601f908201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff929092166020830152604082015260a00190565b604051602081830303815290604052805190602001206117bf565b90505b92915050565b6000806103766040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff1663eccefff66103d26040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526004810191909152601160448201527f726f636b657452657761726473506f6f6c000000000000000000000000000000606482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152608401602060405180830381865afa158015610471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049591906127e5565b91505090565b600061032c8383604051602001610311929190612a47565b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610519826040516020016104fe9190612af4565b604051602081830303815290604052805190602001206118ed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064015b60405180910390fd5b6105ba6116b6565b833514610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f64000000000000000000000000000000000000000000000060648201526084016105a9565b60008360405160200161065c9190612b39565b604051602081830303815290604052805190602001209050600061067f82611985565b905060006106c16040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b905060006107036040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077491906127e5565b8273ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e391906127e5565b6107f585670de0b6b3a7640000612b80565b6107ff91906127aa565b1015610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e2072656163686564000060448201526064016105a9565b61087087611a1d565b50505050505050565b6000806108ba6040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166394e5d5126040518163ffffffff1660e01b8152600401602060405180830381865afa158015610471573d6000803e3d6000fd5b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610952826040516020016104fe9190612af4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064016105a9565b33610a728160405160200161031191907f64616f2e747275737465646e6f6465732e00000000000000000000000000000081527f6d656d6265720000000000000000000000000000000000000000000000000000601182015260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166017820152602b0190565b610ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f646500000000000000000000000060448201526064016105a9565b6000610b186040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166363ed62da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190612b97565b610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c656400000000000000000000000000000000000000000000000060648201526084016105a9565b6000610c1f6116b6565b90508535811015610cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e657874000000000000000000000000000000000060648201526084016105a9565b60008660a0013511610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f656400000000000000000000000000000000000000000000000000000000000060648201526084016105a9565b610d5360e0870187612bb9565b9050610d63610100880188612bb9565b9050148015610d8e5750610d7b610120870187612bb9565b9050610d8a60e0880188612bb9565b9050145b610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e67746800000000000000000000000060448201526064016105a9565b60c086013560005b610e0a610100890189612bb9565b9050811015610e5557610e21610100890189612bb9565b82818110610e3157610e31612c21565b9050602002013582610e439190612c50565b9150610e4e81612c63565b9050610dfc565b5060005b610e6660e0890189612bb9565b9050811015610eb057610e7c60e0890189612bb9565b82818110610e8c57610e8c612c21565b9050602002013582610e9e9190612c50565b9150610ea981612c63565b9050610e59565b50610eb96112fc565b811115610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c20726577617264730000000000000000000000000060448201526064016105a9565b506000805b610f35610120890189612bb9565b9050811015610f8057610f4c610120890189612bb9565b82818110610f5c57610f5c612c21565b9050602002013582610f6e9190612c50565b9150610f7981612c63565b9050610f27565b50610f896114b7565b811115610ff2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642045544820726577617264730000000000000000000000000060448201526064016105a9565b506000803388604051602001611009929190612a47565b60405160208183030381529060405280519060200120905061102a816117bf565b15611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f6465000060448201526064016105a9565b61109c816001612225565b60408051606060208201819052601f60808301527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a0830152339282019290925289359181019190915261110b9060c001604051602081830303815290604052805190602001206001612225565b5060008760405160200161111f9190612b39565b60405160208183030381529060405280519060200120905061114081611985565b61114b906001612c50565b915061115781836122ba565b5060405187359033907ffd79146848f3e0373e2f8c70e8dcaa5e38ccdff023f81b209bdbadde07a917ca9061118f908b904290612c9b565b60405180910390a3863582146111a7575050506112f6565b60006111e76040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b90508373ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125891906127e5565b8173ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c791906127e5565b6112d984670de0b6b3a7640000612b80565b6112e391906127aa565b106112f1576112f188611a1d565b505050505b50505050565b60008061133d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b905060008173ffffffffffffffffffffffffffffffffffffffff1663c1a260066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b091906127e5565b9050806113bb610335565b6113c59190612c50565b9250505090565b600061032f8260405160200161143491907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f626c6f636b0000000000000000000000000000000000000000000000000000006020820152602581019190915260450190565b60405160208183030381529060405280519060200120611985565b600061032f826040516020016104fe91907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f61646472657373000000000000000000000000000000000000000000000000006020820152602781019190915260470190565b6000806114f86040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b73ffffffffffffffffffffffffffffffffffffffff163192915050565b600061029f7f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2611985565b606060006115826040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90506000835167ffffffffffffffff8111156115a0576115a0612520565b6040519080825280602002602001820160405280156115c9578160200160208202803683370190505b50905060005b8451811015611698578273ffffffffffffffffffffffffffffffffffffffff1663d4f4697e86838151811061160657611606612c21565b60200260200101516040518263ffffffff1660e01b815260040161162a9190612cbd565b602060405180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906127e5565b82828151811061167d5761167d612c21565b602090810291909101015261169181612c63565b90506115cf565b509392505050565b600061032f826040516020016114349190612b39565b600061029f7f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f7611985565b6000806117226040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b6040517fd4f4697e00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063d4f4697e90611777908690600401612cbd565b602060405180830381865afa158015611794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b891906127e5565b9392505050565b600080546040517f7ae1cfca0000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff1690637ae1cfca90602401602060405180830381865afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612b97565b60008061186e836040516020016104fe9190612af4565b905073ffffffffffffffffffffffffffffffffffffffff811661032f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e64000000000000000000000000000060448201526064016105a9565b600080546040517f21f8a7210000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff16906321f8a72190602401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612d0e565b600080546040517fbd02d0f50000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff169063bd02d0f590602401602060405180830381865afa1580156119f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f91906127e5565b6000611a5d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b90506000611a9f6040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508173ffffffffffffffffffffffffffffffffffffffff1663088240036040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1291906127e5565b50611b1b61231c565b6000611b25611515565b905060008460a00135611b36610879565b611b409190612b80565b611b4a9083612c50565b905084600001357f61caab0be2a0f10d869a5f437dab4535eb8e9c868b8c1fc68f3e5c10d0cd8f6686848442604051611b869493929190612d2b565b60405180910390a2604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f626c6f636b0000000000000000000000000000000000000000000000000000009181019190915285356045820152611c0a9060650160405160208183030381529060405280519060200120436122ba565b604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f61646472657373000000000000000000000000000000000000000000000000009181019190915285356047820152611c86906067016040516020818303038152906040528051906020012030612349565b611cb07f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2826122ba565b60c085013515611d7a576040517fee91035e00000000000000000000000000000000000000000000000000000000815260606004820152600e60648201527f726f636b6574436c61696d44414f000000000000000000000000000000000000608482015273ffffffffffffffffffffffffffffffffffffffff858116602483015260c0870135604483015284169063ee91035e9060a401600060405180830381600087803b158015611d6157600080fd5b505af1158015611d75573d6000803e3d6000fd5b505050505b6000611dba6040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b905061014086013515611e99576000611e076040518060400160405280600f81526020017f726f636b6574546f6b656e524554480000000000000000000000000000000000815250611857565b6040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301526101408a013560248301529192509083169063522f681590604401600060405180830381600087803b158015611e7f57600080fd5b505af1158015611e93573d6000803e3d6000fd5b50505050505b60005b611eaa610100880188612bb9565b9050811015610870576000611ec260e0890189612bb9565b83818110611ed257611ed2612c21565b9050602002013588806101000190611eea9190612bb9565b84818110611efa57611efa612c21565b90506020020135611f0b9190612c50565b90506000611f1d6101208a018a612bb9565b84818110611f2d57611f2d612c21565b905060200201359050816000148015611f44575080155b15611f50575050612215565b6040517f726577617264732e72656c61792e61646472657373000000000000000000000060208201526035810184905260009081908190605501604051602081830303815290604052805190602001209050611fab816118ed565b915073ffffffffffffffffffffffffffffffffffffffff8216612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b0000000000000000000000000000000000000060648201526084016105a9565b50905082156120ea576040517f01e3366700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528a81166024830152604482018590528916906301e3366790606401600060405180830381600087803b1580156120d157600080fd5b505af11580156120e5573d6000803e3d6000fd5b505050505b8115612179576040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905286169063522f681590604401600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b505050505b6040517fe44ba18f0000000000000000000000000000000000000000000000000000000081528a35600482015260608b01356024820152604481018490526064810183905273ffffffffffffffffffffffffffffffffffffffff82169063e44ba18f90608401600060405180830381600087803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b505050505050505b61221e81612c63565b9050611e9c565b6000546040517fabfdcced00000000000000000000000000000000000000000000000000000000815260048101849052821515602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063abfdcced906044015b600060405180830381600087803b15801561229e57600080fd5b505af11580156122b2573d6000803e3d6000fd5b505050505050565b6000546040517fe2a4853a000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063e2a4853a90604401612284565b6123477f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760016123ae565b565b6000546040517fca446dd90000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff83811660248301526101009092049091169063ca446dd990604401612284565b6000546040517fadb353dc000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063adb353dc90604401612284565b73ffffffffffffffffffffffffffffffffffffffff8116811461243257600080fd5b50565b6000806040838503121561244857600080fd5b823561245381612410565b946020939093013593505050565b6000610160828403121561247457600080fd5b50919050565b6000806040838503121561248d57600080fd5b823561249881612410565b9150602083013567ffffffffffffffff8111156124b457600080fd5b6124c085828601612461565b9150509250929050565b6000602082840312156124dc57600080fd5b813567ffffffffffffffff8111156124f357600080fd5b6124ff84828501612461565b949350505050565b60006020828403121561251957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561259657612596612520565b604052919050565b600082601f8301126125af57600080fd5b813567ffffffffffffffff8111156125c9576125c9612520565b6125fa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161254f565b81815284602083860101111561260f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561263f57600080fd5b823567ffffffffffffffff8082111561265757600080fd5b818501915085601f83011261266b57600080fd5b81358181111561267d5761267d612520565b8060051b61268c85820161254f565b91825283810185019185810190898411156126a657600080fd5b86860192505b838310156126e2578235858111156126c45760008081fd5b6126d28b89838a010161259e565b83525091860191908601906126ac565b9998505050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127275783518352928401929184019160010161270b565b50909695505050505050565b60006020828403121561274557600080fd5b813567ffffffffffffffff81111561275c57600080fd5b6124ff8482850161259e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561032f5761032f612768565b6000826127e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602082840312156127f757600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261283357600080fd5b830160208101925035905067ffffffffffffffff81111561285357600080fd5b80360382131561286257600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128e757600080fd5b830160208101925035905067ffffffffffffffff81111561290757600080fd5b8060051b360382131561286257600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561294b57600080fd5b8260051b80836020870137939093016020019392505050565b60006101608235845260208301356020850152604083013560408501526060830135606085015261299860808401846127fe565b8260808701526129ab8387018284612869565b9250505060a083013560a085015260c083013560c08501526129d060e08401846128b2565b85830360e08701526129e3838284612919565b925050506101006129f6818501856128b2565b86840383880152612a08848284612919565b9350505050610120612a1c818501856128b2565b86840383880152612a2e848284612919565b6101409687013597909601969096525092949350505050565b60608152602360608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808201527f6b6579000000000000000000000000000000000000000000000000000000000060a082015273ffffffffffffffffffffffffffffffffffffffff8316602082015260c0604082015260006124ff60c0830184612964565b60005b83811015612aeb578181015183820152602001612ad3565b50506000910152565b7f636f6e74726163742e6164647265737300000000000000000000000000000000815260008251612b2c816010850160208701612ad0565b9190910160100192915050565b60408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e74606082015260806020820152600061032c6080830184612964565b808202811582820484141761032f5761032f612768565b600060208284031215612ba957600080fd5b815180151581146117b857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612bee57600080fd5b83018035915067ffffffffffffffff821115612c0957600080fd5b6020019150600581901b360382131561286257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8082018082111561032f5761032f612768565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612c9457612c94612768565b5060010190565b604081526000612cae6040830185612964565b90508260208301529392505050565b6020815260008251806020840152612cdc816040850160208701612ad0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215612d2057600080fd5b81516117b881612410565b608081526000612d3e6080830187612964565b602083019590955250604081019290925260609091015291905056fea26469706673582212202de6c8a3b713d11cf22f20d964609f958ed285c9fa7954ded516163ee341af7b64736f6c634300081200330000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061011b5760003560e01c80637425f1e7116100b2578063ba34cb4b11610081578063e51920d311610066578063e51920d31461024b578063f21c150c1461025e578063f6a3f6ef1461026657600080fd5b8063ba34cb4b14610223578063cdfd4e1c1461022b57600080fd5b80637425f1e7146101c8578063ab772cb1146101d0578063b0aa28de146101e3578063b81bda511461021b57600080fd5b806347e884ef116100ee57806347e884ef1461017957806350a2f7e51461018e57806354fd4d50146101965780635d3e8ffa146101b557600080fd5b8063043877d014610120578063204e2a0a1461013b5780632198e62c1461015e5780633bfae5d914610166575b600080fd5b610128610279565b6040519081526020015b60405180910390f35b61014e610149366004612435565b6102a4565b6040519015158152602001610132565b610128610335565b61014e61017436600461247a565b61049b565b61018c6101873660046124ca565b6104b3565b005b610128610879565b6000546101a39060ff1681565b60405160ff9091168152602001610132565b61018c6101c33660046124ca565b610907565b6101286112fc565b6101286101de366004612507565b6113cc565b6101f66101f1366004612507565b61144f565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610132565b6101286114b7565b610128611515565b61023e61023936600461262c565b611540565b60405161013291906126ef565b6101286102593660046124ca565b6116a0565b6101286116b6565b610128610274366004612733565b6116e1565b6000610283610879565b61028b611515565b6102959042612797565b61029f91906127aa565b905090565b600061032c83836040516020016103119291906060808252601f908201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f646500608082015273ffffffffffffffffffffffffffffffffffffffff929092166020830152604082015260a00190565b604051602081830303815290604052805190602001206117bf565b90505b92915050565b6000806103766040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff1663eccefff66103d26040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526004810191909152601160448201527f726f636b657452657761726473506f6f6c000000000000000000000000000000606482015273ffffffffffffffffffffffffffffffffffffffff9091166024820152608401602060405180830381865afa158015610471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049591906127e5565b91505090565b600061032c8383604051602001610311929190612a47565b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610519826040516020016104fe9190612af4565b604051602081830303815290604052805190602001206118ed565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064015b60405180910390fd5b6105ba6116b6565b833514610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c79206578656375746520736e617073686f7420666f72206e6560448201527f787420706572696f64000000000000000000000000000000000000000000000060648201526084016105a9565b60008360405160200161065c9190612b39565b604051602081830303815290604052805190602001209050600061067f82611985565b905060006106c16040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b905060006107036040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077491906127e5565b8273ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e391906127e5565b6107f585670de0b6b3a7640000612b80565b6107ff91906127aa565b1015610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e2072656163686564000060448201526064016105a9565b61087087611a1d565b50505050505050565b6000806108ba6040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166394e5d5126040518163ffffffff1660e01b8152600401602060405180830381865afa158015610471573d6000803e3d6000fd5b6040518060400160405280601181526020017f726f636b657452657761726473506f6f6c00000000000000000000000000000081525030610952826040516020016104fe9190612af4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064016105a9565b33610a728160405160200161031191907f64616f2e747275737465646e6f6465732e00000000000000000000000000000081527f6d656d6265720000000000000000000000000000000000000000000000000000601182015260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166017820152602b0190565b610ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f646500000000000000000000000060448201526064016105a9565b6000610b186040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b815250611857565b90508073ffffffffffffffffffffffffffffffffffffffff166363ed62da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190612b97565b610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5375626d697474696e6720726577617264732069732063757272656e746c792060448201527f64697361626c656400000000000000000000000000000000000000000000000060648201526084016105a9565b6000610c1f6116b6565b90508535811015610cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f43616e206f6e6c79207375626d697420736e617073686f7420666f722070657260448201527f696f647320757020746f206e657874000000000000000000000000000000000060648201526084016105a9565b60008660a0013511610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964206e756d626572206f6620696e74657276616c73207061737360448201527f656400000000000000000000000000000000000000000000000000000000000060648201526084016105a9565b610d5360e0870187612bb9565b9050610d63610100880188612bb9565b9050148015610d8e5750610d7b610120870187612bb9565b9050610d8a60e0880188612bb9565b9050145b610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c6964206172726179206c656e67746800000000000000000000000060448201526064016105a9565b60c086013560005b610e0a610100890189612bb9565b9050811015610e5557610e21610100890189612bb9565b82818110610e3157610e31612c21565b9050602002013582610e439190612c50565b9150610e4e81612c63565b9050610dfc565b5060005b610e6660e0890189612bb9565b9050811015610eb057610e7c60e0890189612bb9565b82818110610e8c57610e8c612c21565b9050602002013582610e9e9190612c50565b9150610ea981612c63565b9050610e59565b50610eb96112fc565b811115610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642052504c20726577617264730000000000000000000000000060448201526064016105a9565b506000805b610f35610120890189612bb9565b9050811015610f8057610f4c610120890189612bb9565b82818110610f5c57610f5c612c21565b9050602002013582610f6e9190612c50565b9150610f7981612c63565b9050610f27565b50610f896114b7565b811115610ff2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642045544820726577617264730000000000000000000000000060448201526064016105a9565b506000803388604051602001611009929190612a47565b60405160208183030381529060405280519060200120905061102a816117bf565b15611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f6465000060448201526064016105a9565b61109c816001612225565b60408051606060208201819052601f60808301527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64650060a0830152339282019290925289359181019190915261110b9060c001604051602081830303815290604052805190602001206001612225565b5060008760405160200161111f9190612b39565b60405160208183030381529060405280519060200120905061114081611985565b61114b906001612c50565b915061115781836122ba565b5060405187359033907ffd79146848f3e0373e2f8c70e8dcaa5e38ccdff023f81b209bdbadde07a917ca9061118f908b904290612c9b565b60405180910390a3863582146111a7575050506112f6565b60006111e76040518060400160405280601481526020017f726f636b657444414f4e6f646554727573746564000000000000000000000000815250611857565b90508373ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125891906127e5565b8173ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c791906127e5565b6112d984670de0b6b3a7640000612b80565b6112e391906127aa565b106112f1576112f188611a1d565b505050505b50505050565b60008061133d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b905060008173ffffffffffffffffffffffffffffffffffffffff1663c1a260066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b091906127e5565b9050806113bb610335565b6113c59190612c50565b9250505090565b600061032f8260405160200161143491907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f626c6f636b0000000000000000000000000000000000000000000000000000006020820152602581019190915260450190565b60405160208183030381529060405280519060200120611985565b600061032f826040516020016104fe91907f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e81527f61646472657373000000000000000000000000000000000000000000000000006020820152602781019190915260470190565b6000806114f86040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b73ffffffffffffffffffffffffffffffffffffffff163192915050565b600061029f7f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2611985565b606060006115826040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b90506000835167ffffffffffffffff8111156115a0576115a0612520565b6040519080825280602002602001820160405280156115c9578160200160208202803683370190505b50905060005b8451811015611698578273ffffffffffffffffffffffffffffffffffffffff1663d4f4697e86838151811061160657611606612c21565b60200260200101516040518263ffffffff1660e01b815260040161162a9190612cbd565b602060405180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906127e5565b82828151811061167d5761167d612c21565b602090810291909101015261169181612c63565b90506115cf565b509392505050565b600061032f826040516020016114349190612b39565b600061029f7f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f7611985565b6000806117226040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e677352657761726473815250611857565b6040517fd4f4697e00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063d4f4697e90611777908690600401612cbd565b602060405180830381865afa158015611794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b891906127e5565b9392505050565b600080546040517f7ae1cfca0000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff1690637ae1cfca90602401602060405180830381865afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612b97565b60008061186e836040516020016104fe9190612af4565b905073ffffffffffffffffffffffffffffffffffffffff811661032f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e64000000000000000000000000000060448201526064016105a9565b600080546040517f21f8a7210000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff16906321f8a72190602401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f9190612d0e565b600080546040517fbd02d0f50000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff169063bd02d0f590602401602060405180830381865afa1580156119f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032f91906127e5565b6000611a5d6040518060400160405280600e81526020017f726f636b6574546f6b656e52504c000000000000000000000000000000000000815250611857565b90506000611a9f6040518060400160405280600b81526020017f726f636b65745661756c74000000000000000000000000000000000000000000815250611857565b90508173ffffffffffffffffffffffffffffffffffffffff1663088240036040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1291906127e5565b50611b1b61231c565b6000611b25611515565b905060008460a00135611b36610879565b611b409190612b80565b611b4a9083612c50565b905084600001357f61caab0be2a0f10d869a5f437dab4535eb8e9c868b8c1fc68f3e5c10d0cd8f6686848442604051611b869493929190612d2b565b60405180910390a2604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f626c6f636b0000000000000000000000000000000000000000000000000000009181019190915285356045820152611c0a9060650160405160208183030381529060405280519060200120436122ba565b604080517f726577617264732e706f6f6c2e696e74657276616c2e657865637574696f6e2e60208201527f61646472657373000000000000000000000000000000000000000000000000009181019190915285356047820152611c86906067016040516020818303038152906040528051906020012030612349565b611cb07f4fe51b56935f087fa6dd937224299a085a629f85787014a3716e94b165668ee2826122ba565b60c085013515611d7a576040517fee91035e00000000000000000000000000000000000000000000000000000000815260606004820152600e60648201527f726f636b6574436c61696d44414f000000000000000000000000000000000000608482015273ffffffffffffffffffffffffffffffffffffffff858116602483015260c0870135604483015284169063ee91035e9060a401600060405180830381600087803b158015611d6157600080fd5b505af1158015611d75573d6000803e3d6000fd5b505050505b6000611dba6040518060400160405280601381526020017f726f636b6574536d6f6f7468696e67506f6f6c00000000000000000000000000815250611857565b905061014086013515611e99576000611e076040518060400160405280600f81526020017f726f636b6574546f6b656e524554480000000000000000000000000000000000815250611857565b6040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301526101408a013560248301529192509083169063522f681590604401600060405180830381600087803b158015611e7f57600080fd5b505af1158015611e93573d6000803e3d6000fd5b50505050505b60005b611eaa610100880188612bb9565b9050811015610870576000611ec260e0890189612bb9565b83818110611ed257611ed2612c21565b9050602002013588806101000190611eea9190612bb9565b84818110611efa57611efa612c21565b90506020020135611f0b9190612c50565b90506000611f1d6101208a018a612bb9565b84818110611f2d57611f2d612c21565b905060200201359050816000148015611f44575080155b15611f50575050612215565b6040517f726577617264732e72656c61792e61646472657373000000000000000000000060208201526035810184905260009081908190605501604051602081830303815290604052805190602001209050611fab816118ed565b915073ffffffffffffffffffffffffffffffffffffffff8216612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f536e617073686f7420636f6e7461696e73207265776172647320666f7220696e60448201527f76616c6964206e6574776f726b0000000000000000000000000000000000000060648201526084016105a9565b50905082156120ea576040517f01e3366700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528a81166024830152604482018590528916906301e3366790606401600060405180830381600087803b1580156120d157600080fd5b505af11580156120e5573d6000803e3d6000fd5b505050505b8115612179576040517f522f681500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905286169063522f681590604401600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b505050505b6040517fe44ba18f0000000000000000000000000000000000000000000000000000000081528a35600482015260608b01356024820152604481018490526064810183905273ffffffffffffffffffffffffffffffffffffffff82169063e44ba18f90608401600060405180830381600087803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b505050505050505b61221e81612c63565b9050611e9c565b6000546040517fabfdcced00000000000000000000000000000000000000000000000000000000815260048101849052821515602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063abfdcced906044015b600060405180830381600087803b15801561229e57600080fd5b505af11580156122b2573d6000803e3d6000fd5b505050505050565b6000546040517fe2a4853a000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063e2a4853a90604401612284565b6123477f27219897303c7009208494bfca902012e7331aba8a8f23e5edd89abeb61748f760016123ae565b565b6000546040517fca446dd90000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff83811660248301526101009092049091169063ca446dd990604401612284565b6000546040517fadb353dc000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063adb353dc90604401612284565b73ffffffffffffffffffffffffffffffffffffffff8116811461243257600080fd5b50565b6000806040838503121561244857600080fd5b823561245381612410565b946020939093013593505050565b6000610160828403121561247457600080fd5b50919050565b6000806040838503121561248d57600080fd5b823561249881612410565b9150602083013567ffffffffffffffff8111156124b457600080fd5b6124c085828601612461565b9150509250929050565b6000602082840312156124dc57600080fd5b813567ffffffffffffffff8111156124f357600080fd5b6124ff84828501612461565b949350505050565b60006020828403121561251957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561259657612596612520565b604052919050565b600082601f8301126125af57600080fd5b813567ffffffffffffffff8111156125c9576125c9612520565b6125fa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161254f565b81815284602083860101111561260f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561263f57600080fd5b823567ffffffffffffffff8082111561265757600080fd5b818501915085601f83011261266b57600080fd5b81358181111561267d5761267d612520565b8060051b61268c85820161254f565b91825283810185019185810190898411156126a657600080fd5b86860192505b838310156126e2578235858111156126c45760008081fd5b6126d28b89838a010161259e565b83525091860191908601906126ac565b9998505050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127275783518352928401929184019160010161270b565b50909695505050505050565b60006020828403121561274557600080fd5b813567ffffffffffffffff81111561275c57600080fd5b6124ff8482850161259e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561032f5761032f612768565b6000826127e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602082840312156127f757600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261283357600080fd5b830160208101925035905067ffffffffffffffff81111561285357600080fd5b80360382131561286257600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128e757600080fd5b830160208101925035905067ffffffffffffffff81111561290757600080fd5b8060051b360382131561286257600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561294b57600080fd5b8260051b80836020870137939093016020019392505050565b60006101608235845260208301356020850152604083013560408501526060830135606085015261299860808401846127fe565b8260808701526129ab8387018284612869565b9250505060a083013560a085015260c083013560c08501526129d060e08401846128b2565b85830360e08701526129e3838284612919565b925050506101006129f6818501856128b2565b86840383880152612a08848284612919565b9350505050610120612a1c818501856128b2565b86840383880152612a2e848284612919565b6101409687013597909601969096525092949350505050565b60608152602360608201527f726577617264732e736e617073686f742e7375626d69747465642e6e6f64652e60808201527f6b6579000000000000000000000000000000000000000000000000000000000060a082015273ffffffffffffffffffffffffffffffffffffffff8316602082015260c0604082015260006124ff60c0830184612964565b60005b83811015612aeb578181015183820152602001612ad3565b50506000910152565b7f636f6e74726163742e6164647265737300000000000000000000000000000000815260008251612b2c816010850160208701612ad0565b9190910160100192915050565b60408152602060408201527f726577617264732e736e617073686f742e7375626d69747465642e636f756e74606082015260806020820152600061032c6080830184612964565b808202811582820484141761032f5761032f612768565b600060208284031215612ba957600080fd5b815180151581146117b857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612bee57600080fd5b83018035915067ffffffffffffffff821115612c0957600080fd5b6020019150600581901b360382131561286257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8082018082111561032f5761032f612768565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612c9457612c94612768565b5060010190565b604081526000612cae6040830185612964565b90508260208301529392505050565b6020815260008251806020840152612cdc816040850160208701612ad0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215612d2057600080fd5b81516117b881612410565b608081526000612d3e6080830187612964565b602083019590955250604081019290925260609091015291905056fea26469706673582212202de6c8a3b713d11cf22f20d964609f958ed285c9fa7954ded516163ee341af7b64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46
-----Decoded View---------------
Arg [0] : _rocketStorageAddress (address): 0x1d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.