Address Contract Partially Verified
Address
0x6Cc65bF618F55ce2433f9D8d827Fc44117D81399
Balance
0 ETH
Nonce
1
Code Size
5789 bytes
Creator
0x27e80dB1...603D at tx 0x74585cdd...692541
Indexed Transactions
0
Contract Bytecode
5789 bytes
0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063979611ea1161005b578063979611ea146100e45780639dba66af146100f7578063c4c8d0ad146100ff578063f1eda6341461010757600080fd5b806354fd4d501461008d57806389c51c7c146100b15780639100c13d146100c6578063964d042c146100dc575b600080fd5b60005461009a9060ff1681565b60405160ff90911681526020015b60405180910390f35b6100c46100bf3660046114c8565b61010f565b005b6100ce61070f565b6040519081526020016100a8565b6100ce61073f565b6100c46100f23660046114c8565b61076a565b6100ce610f9c565b6100ce610ff1565b6100ce61101c565b6040518060400160405280601581526020017f726f636b65744e6574776f726b42616c616e6365730000000000000000000000815250306101758260405160200161015a9190611503565b60405160208183030381529060405280519060200120611047565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e74726163740000000060448201526064015b60405180910390fd5b600061024e6040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b8152506110e5565b90508073ffffffffffffffffffffffffffffffffffffffff1663fcdb60db6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561029b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102bf919061155b565b61034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375626d697474696e672062616c616e6365732069732063757272656e746c7960448201527f2064697361626c656400000000000000000000000000000000000000000000006064820152608401610205565b4388106103da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f42616c616e6365732063616e206e6f74206265207375626d697474656420666f60448201527f7220612066757475726520626c6f636b000000000000000000000000000000006064820152608401610205565b6103e261070f565b8811610470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4e6574776f726b2062616c616e63657320666f7220616e20657175616c206f7260448201527f2068696768657220626c6f636b206172652073657400000000000000000000006064820152608401610205565b858511156104da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c6964206e6574776f726b2062616c616e63657300000000000000006044820152606401610205565b604080517f6e6574776f726b2e62616c616e6365732e7375626d69747465642e636f756e746020820152908101899052606081018890526080810187905260a0810186905260c0810185905260009060e001604051602081830303815290604052805190602001209050600061054f8261117b565b905060006105916040518060400160405280601481526020017f726f636b657444414f4e6f6465547275737465640000000000000000000000008152506110e5565b90508373ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106029190611584565b8173ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106719190611584565b61068384670de0b6b3a76400006115cc565b61068d91906115e3565b10156106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f436f6e73656e73757320686173206e6f74206265656e207265616368656400006044820152606401610205565b6107028b8b8b8b8b611213565b5050505050505050505050565b600061073a7f8e228cc95820b1264270ce3b51a2a54e17242e0b792a7f57c45f45e402f44c7461117b565b905090565b600061073a7f9dc185b46ed0f11d151f055e45fde635375a9680c34e501b43a82eb6c09c095161117b565b6040518060400160405280601581526020017f726f636b65744e6574776f726b42616c616e6365730000000000000000000000815250306107b58260405160200161015a9190611503565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e7472616374000000006044820152606401610205565b336108f0816040516020016108d591907f64616f2e747275737465646e6f6465732e00000000000000000000000000000081527f6d656d6265720000000000000000000000000000000000000000000000000000601182015260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166017820152602b0190565b6040516020818303038152906040528051906020012061128e565b610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c69642074727573746564206e6f64650000000000000000000000006044820152606401610205565b60006109966040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b8152506110e5565b90508073ffffffffffffffffffffffffffffffffffffffff1663fcdb60db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a07919061155b565b610a93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375626d697474696e672062616c616e6365732069732063757272656e746c7960448201527f2064697361626c656400000000000000000000000000000000000000000000006064820152608401610205565b438910610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f42616c616e6365732063616e206e6f74206265207375626d697474656420666f60448201527f7220612066757475726520626c6f636b000000000000000000000000000000006064820152608401610205565b6000610b2c61070f565b9050808a1015610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4e6574776f726b2062616c616e63657320666f7220612068696768657220626c60448201527f6f636b20617265207365740000000000000000000000000000000000000000006064820152608401610205565b604080517f6e6574776f726b2e62616c616e6365732e7375626d69747465642e6e6f6465006020808301919091523360601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016603f830152605382018d9052607382018c9052609382018b905260b382018a905260d38083018a90528351808403909101815260f3830184528051908201207f6e6574776f726b2e62616c616e6365732e7375626d69747465642e636f756e7461011384015261013383018e905261015383018d905261017383018c905261019383018b90526101b38084018b9052845180850390910181526101d39093019093528151910120610cc28261128e565b15610d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4475706c6963617465207375626d697373696f6e2066726f6d206e6f646500006044820152606401610205565b610d34826001611326565b6040517f6e6574776f726b2e62616c616e6365732e7375626d69747465642e6e6f64650060208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16603f820152605381018d9052610db390607301604051602081830303815290604052805190602001206001611326565b6000610dbe8261117b565b610dc990600161161e565b9050610dd582826113bb565b604080518e8152602081018e90529081018c9052606081018b9052608081018a90524260a082015233907f9b240d5b912ab6df93782930ae851a85b25e5a419c05cbb84d1b9e4b86a3c5739060c00160405180910390a2838d03610e3d575050505050610f92565b6000610e7d6040518060400160405280601481526020017f726f636b657444414f4e6f6465547275737465640000000000000000000000008152506110e5565b90508573ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eee9190611584565b8173ffffffffffffffffffffffffffffffffffffffff1663997072f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d9190611584565b610f6f84670de0b6b3a76400006115cc565b610f7991906115e3565b10610f8b57610f8b8e8e8e8e8e611213565b5050505050505b5050505050505050565b600080610fa761073f565b90506000610fb361101c565b905081600003610fcd57670de0b6b3a76400009250505090565b81610fe082670de0b6b3a76400006115cc565b610fea91906115e3565b9250505090565b600061073a7f5b3a7b8bdde2122fad4dc45e51ae0c5cedc887473a999474f2ead5a8faadfe3c61117b565b600061073a7f60ada356ca70f00927cab348673259fa737f98b9c6c4cb8433c182af17149aef61117b565b600080546040517f21f8a7210000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff16906321f8a72190602401602060405180830381865afa1580156110bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110df9190611631565b92915050565b6000806110fc8360405160200161015a9190611503565b905073ffffffffffffffffffffffffffffffffffffffff81166110df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610205565b600080546040517fbd02d0f50000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff169063bd02d0f590602401602060405180830381865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110df9190611584565b61121c8561141d565b6112258361144a565b61122e82611474565b6112378161149e565b60408051858152602081018590529081018390526060810182905242608082015285907fdd27295717c4fbd48b1840f846e18be6f0b7bd6b55608e697e53b15848cecdf99060a00160405180910390a25050505050565b600080546040517f7ae1cfca0000000000000000000000000000000000000000000000000000000081526004810184905261010090910473ffffffffffffffffffffffffffffffffffffffff1690637ae1cfca90602401602060405180830381865afa158015611302573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110df919061155b565b6000546040517fabfdcced00000000000000000000000000000000000000000000000000000000815260048101849052821515602482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063abfdcced906044015b600060405180830381600087803b15801561139f57600080fd5b505af11580156113b3573d6000803e3d6000fd5b505050505050565b6000546040517fe2a4853a000000000000000000000000000000000000000000000000000000008152600481018490526024810183905261010090910473ffffffffffffffffffffffffffffffffffffffff169063e2a4853a90604401611385565b6114477f8e228cc95820b1264270ce3b51a2a54e17242e0b792a7f57c45f45e402f44c74826113bb565b50565b6114477f9dc185b46ed0f11d151f055e45fde635375a9680c34e501b43a82eb6c09c0951826113bb565b6114477f60ada356ca70f00927cab348673259fa737f98b9c6c4cb8433c182af17149aef826113bb565b6114477f5b3a7b8bdde2122fad4dc45e51ae0c5cedc887473a999474f2ead5a8faadfe3c826113bb565b600080600080600060a086880312156114e057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b7f636f6e74726163742e616464726573730000000000000000000000000000000081526000825160005b8181101561154a576020818601810151601086840101520161152d565b506000920160100191825250919050565b60006020828403121561156d57600080fd5b8151801515811461157d57600080fd5b9392505050565b60006020828403121561159657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176110df576110df61159d565b600082611619577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156110df576110df61159d565b60006020828403121561164357600080fd5b815173ffffffffffffffffffffffffffffffffffffffff8116811461157d57600080fdfea2646970667358221220d99e58e80666ee507865d8eaffb099444571fce3e1a1d5d0c2482cb75703da4364736f6c63430008120033
Verified Source Code Partial Match
Compiler: v0.8.18+commit.87f61d96
EVM: paris
Optimization: Yes (15000 runs)
RocketBase.sol 190 lines
/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | 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); }
}
RocketStorageInterface.sol 79 lines
/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | 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;
}
RocketNetworkBalances.sol 161 lines
/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, permissionless, & trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authored by the Rocket Pool Core Team
* Contributors: https://github.com/rocket-pool/rocketpool/graphs/contributors
* A special thanks to the Rocket Pool community for all their contributions.
*
*/
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.18;
pragma abicoder v2;
import "../RocketBase.sol";
import "../../interface/dao/node/RocketDAONodeTrustedInterface.sol";
import "../../interface/network/RocketNetworkBalancesInterface.sol";
import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsNetworkInterface.sol";
/// @notice Oracle contract for network balance data
contract RocketNetworkBalances is RocketBase, RocketNetworkBalancesInterface {
// Events
event BalancesSubmitted(address indexed from, uint256 block, uint256 slotTimestamp, uint256 totalEth, uint256 stakingEth, uint256 rethSupply, uint256 blockTimestamp);
event BalancesUpdated(uint256 indexed block, uint256 slotTimestamp, uint256 totalEth, uint256 stakingEth, uint256 rethSupply, uint256 blockTimestamp);
constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) {
version = 3;
}
/// @notice The block number which balances are current for
function getBalancesBlock() override public view returns (uint256) {
return getUint(keccak256("network.balances.updated.block"));
}
/// @notice Sets the block number which balances are current for
function setBalancesBlock(uint256 _value) private {
setUint(keccak256("network.balances.updated.block"), _value);
}
/// @notice The current RP network total ETH balance
function getTotalETHBalance() override public view returns (uint256) {
return getUint(keccak256("network.balance.total"));
}
/// @notice Sets the current RP network total ETH balance
function setTotalETHBalance(uint256 _value) private {
setUint(keccak256("network.balance.total"), _value);
}
/// @notice The current RP network staking ETH balance
function getStakingETHBalance() override public view returns (uint256) {
return getUint(keccak256("network.balance.staking"));
}
/// @notice Sets the current RP network staking ETH balance
function setStakingETHBalance(uint256 _value) private {
setUint(keccak256("network.balance.staking"), _value);
}
/// @notice The current RP network total rETH supply
function getTotalRETHSupply() override external view returns (uint256) {
return getUint(keccak256("network.balance.reth.supply"));
}
/// @notice Sets the current RP network total rETH supply
function setTotalRETHSupply(uint256 _value) private {
setUint(keccak256("network.balance.reth.supply"), _value);
}
/// @notice Get the current RP network ETH utilization rate as a fraction of 1 ETH
/// Represents what % of the network's balance is actively earning rewards
function getETHUtilizationRate() override external view returns (uint256) {
uint256 totalEthBalance = getTotalETHBalance();
uint256 stakingEthBalance = getStakingETHBalance();
if (totalEthBalance == 0) { return calcBase; }
return calcBase * stakingEthBalance / totalEthBalance;
}
/// @notice Submit network balances for a block.
/// Only accepts calls from trusted (oracle) nodes.
function submitBalances(uint256 _block, uint256 _slotTimestamp, uint256 _totalEth, uint256 _stakingEth, uint256 _rethSupply) override external onlyLatestContract("rocketNetworkBalances", address(this)) onlyTrustedNode(msg.sender) {
// Check settings
RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
require(rocketDAOProtocolSettingsNetwork.getSubmitBalancesEnabled(), "Submitting balances is currently disabled");
// Check block
require(_block < block.number, "Balances can not be submitted for a future block");
uint256 lastBalancesBlock = getBalancesBlock();
require(_block >= lastBalancesBlock, "Network balances for a higher block are set");
// Get submission keys
bytes32 nodeSubmissionKey = keccak256(abi.encodePacked("network.balances.submitted.node", msg.sender, _block, _slotTimestamp, _totalEth, _stakingEth, _rethSupply));
bytes32 submissionCountKey = keccak256(abi.encodePacked("network.balances.submitted.count", _block, _slotTimestamp, _totalEth, _stakingEth, _rethSupply));
// Check & update node submission status
require(!getBool(nodeSubmissionKey), "Duplicate submission from node");
setBool(nodeSubmissionKey, true);
setBool(keccak256(abi.encodePacked("network.balances.submitted.node", msg.sender, _block)), true);
// Increment submission count
uint256 submissionCount = getUint(submissionCountKey) + 1;
setUint(submissionCountKey, submissionCount);
// Emit balances submitted event
emit BalancesSubmitted(msg.sender, _block, _slotTimestamp, _totalEth, _stakingEth, _rethSupply, block.timestamp);
// If voting past consensus, return
if (_block == lastBalancesBlock) {
return;
}
// Check submission count & update network balances
RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
if (calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold()) {
updateBalances(_block, _slotTimestamp, _totalEth, _stakingEth, _rethSupply);
}
}
/// @notice Executes updateBalances if consensus threshold is reached
function executeUpdateBalances(uint256 _block, uint256 _slotTimestamp, uint256 _totalEth, uint256 _stakingEth, uint256 _rethSupply) override external onlyLatestContract("rocketNetworkBalances", address(this)) {
// Check settings
RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
require(rocketDAOProtocolSettingsNetwork.getSubmitBalancesEnabled(), "Submitting balances is currently disabled");
// Check block
require(_block < block.number, "Balances can not be submitted for a future block");
require(_block > getBalancesBlock(), "Network balances for an equal or higher block are set");
// Check balances
require(_stakingEth <= _totalEth, "Invalid network balances");
// Get submission keys
bytes32 submissionCountKey = keccak256(abi.encodePacked("network.balances.submitted.count", _block, _slotTimestamp, _totalEth, _stakingEth, _rethSupply));
// Get submission count
uint256 submissionCount = getUint(submissionCountKey);
// Check submission count & update network balances
RocketDAONodeTrustedInterface rocketDAONodeTrusted = RocketDAONodeTrustedInterface(getContractAddress("rocketDAONodeTrusted"));
require(calcBase * submissionCount / rocketDAONodeTrusted.getMemberCount() >= rocketDAOProtocolSettingsNetwork.getNodeConsensusThreshold(), "Consensus has not been reached");
updateBalances(_block, _slotTimestamp, _totalEth, _stakingEth, _rethSupply);
}
/// @dev Internal method to update network balances
function updateBalances(uint256 _block, uint256 _slotTimestamp, uint256 _totalEth, uint256 _stakingEth, uint256 _rethSupply) private {
// Update balances
setBalancesBlock(_block);
setTotalETHBalance(_totalEth);
setStakingETHBalance(_stakingEth);
setTotalRETHSupply(_rethSupply);
// Emit balances updated event
emit BalancesUpdated(_block, _slotTimestamp, _totalEth, _stakingEth, _rethSupply, block.timestamp);
}
}
RocketDAONodeTrustedInterface.sol 56 lines
/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | 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;
}
RocketNetworkBalancesInterface.sol 41 lines
/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | 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;
}
RocketDAOProtocolSettingsNetworkInterface.sol 48 lines
/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |'.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | 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);
}
Read Contract
getBalancesBlock 0x9100c13d → uint256
getETHUtilizationRate 0x9dba66af → uint256
getStakingETHBalance 0xf1eda634 → uint256
getTotalETHBalance 0x964d042c → uint256
getTotalRETHSupply 0xc4c8d0ad → uint256
version 0x54fd4d50 → uint8
Write Contract 2 functions
These functions modify contract state and require a wallet transaction to execute.
executeUpdateBalances 0x89c51c7c
uint256 _block
uint256 _slotTimestamp
uint256 _totalEth
uint256 _stakingEth
uint256 _rethSupply
submitBalances 0x979611ea
uint256 _block
uint256 _slotTimestamp
uint256 _totalEth
uint256 _stakingEth
uint256 _rethSupply
Recent Transactions
No transactions found for this address