Feature Tip: Add private address tag to any address under My Name Tag !
Latest 25 from a total of 137,703 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 24200849 | 1 hr ago | IN | 0 ETH | 0.00000156 | ||||
| Approve | 24200615 | 2 hrs ago | IN | 0 ETH | 0.00004925 | ||||
| Approve | 24200592 | 2 hrs ago | IN | 0 ETH | 0.00004931 | ||||
| Approve | 24200565 | 2 hrs ago | IN | 0 ETH | 0.00004908 | ||||
| Approve | 24200157 | 3 hrs ago | IN | 0 ETH | 0.00000173 | ||||
| Approve | 24200101 | 3 hrs ago | IN | 0 ETH | 0.00000163 | ||||
| Approve | 24199983 | 4 hrs ago | IN | 0 ETH | 0.00000122 | ||||
| Transfer | 24199555 | 5 hrs ago | IN | 0 ETH | 0.00000177 | ||||
| Burn | 24199431 | 6 hrs ago | IN | 0 ETH | 0.00000465 | ||||
| Approve | 24199187 | 7 hrs ago | IN | 0 ETH | 0.00000448 | ||||
| Transfer | 24198800 | 8 hrs ago | IN | 0 ETH | 0.00000427 | ||||
| Approve | 24198724 | 8 hrs ago | IN | 0 ETH | 0.00000432 | ||||
| Approve | 24198719 | 8 hrs ago | IN | 0 ETH | 0.00000378 | ||||
| Transfer | 24198713 | 8 hrs ago | IN | 0 ETH | 0.00000362 | ||||
| Transfer | 24198711 | 8 hrs ago | IN | 0 ETH | 0.00000434 | ||||
| Approve | 24198342 | 9 hrs ago | IN | 0 ETH | 0.00000505 | ||||
| Transfer | 24198007 | 10 hrs ago | IN | 0 ETH | 0.00001223 | ||||
| Approve | 24197986 | 11 hrs ago | IN | 0 ETH | 0.00000544 | ||||
| Approve | 24197835 | 11 hrs ago | IN | 0 ETH | 0.00000933 | ||||
| Burn | 24197818 | 11 hrs ago | IN | 0 ETH | 0.00003228 | ||||
| Burn | 24197746 | 11 hrs ago | IN | 0 ETH | 0.00001746 | ||||
| Approve | 24197715 | 11 hrs ago | IN | 0 ETH | 0.00000695 | ||||
| Approve | 24197546 | 12 hrs ago | IN | 0 ETH | 0.00009628 | ||||
| Approve | 24197026 | 14 hrs ago | IN | 0 ETH | 0.00000201 | ||||
| Approve | 24196784 | 15 hrs ago | IN | 0 ETH | 0.00000202 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24200603 | 2 hrs ago | 24 ETH | ||||
| Transfer | 24199858 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199857 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199856 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199855 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199854 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199853 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199852 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199851 | 4 hrs ago | 24 ETH | ||||
| Transfer | 24199431 | 6 hrs ago | 0.01999255 ETH | ||||
| Transfer | 24198541 | 9 hrs ago | 24.00126531 ETH | ||||
| Transfer | 24198027 | 10 hrs ago | 0.01200334 ETH | ||||
| Transfer | 24198027 | 10 hrs ago | 24.00547646 ETH | ||||
| Transfer | 24197818 | 11 hrs ago | 0.24988815 ETH | ||||
| Transfer | 24197746 | 11 hrs ago | 121.27044035 ETH | ||||
| Transfer | 24196346 | 16 hrs ago | 1.01779084 ETH | ||||
| Transfer | 24195100 | 20 hrs ago | 0.01265163 ETH | ||||
| Transfer | 24194872 | 21 hrs ago | 0.02239647 ETH | ||||
| Transfer | 24194871 | 21 hrs ago | 0.01116754 ETH | ||||
| Transfer | 24194743 | 21 hrs ago | 0.01639755 ETH | ||||
| Transfer | 24194742 | 21 hrs ago | 0.0163995 ETH | ||||
| Transfer | 24194522 | 22 hrs ago | 2.008741 ETH | ||||
| Transfer | 24193650 | 25 hrs ago | 0.12237525 ETH | ||||
| Transfer | 24193228 | 26 hrs ago | 0.00661681 ETH | ||||
| Transfer | 24192841 | 28 hrs ago | 0.01471519 ETH |
Loading...
Loading
Cross-Chain Transactions
Produced Blocks
Latest 10 blocks produced
| Block | Transaction | Difficulty | Gas Used | Reward | |
|---|---|---|---|---|---|
| 18355168 | 817 days ago | 0 | 0.00 TH | 0 (0.00%) | 0 ETH |
| 17299295 | 965 days ago | 172 | 0.00 TH | 20,158,528 (67.20%) | 0.064131974673082078 ETH |
| 16526584 | 1074 days ago | 135 | 0.00 TH | 26,241,787 (87.47%) | 0.017786390247549948 ETH |
| 16325296 | 1102 days ago | 155 | 0.00 TH | 15,825,035 (52.75%) | 0.028825420452683385 ETH |
| 16318844 | 1103 days ago | 192 | 0.00 TH | 29,968,841 (99.90%) | 0.034896613353431294 ETH |
| 16131426 | 1129 days ago | 136 | 0.00 TH | 10,524,341 (35.08%) | 0.021924745877401257 ETH |
| 16091319 | 1135 days ago | 243 | 0.00 TH | 15,414,445 (51.38%) | 0.093641255022400852 ETH |
| 16081047 | 1136 days ago | 122 | 0.00 TH | 15,180,225 (50.60%) | 0.036227278360160405 ETH |
| 15890832 | 1163 days ago | 294 | 0.00 TH | 29,194,286 (97.31%) | 0.090270066988551029 ETH |
| 15690664 | 1191 days ago | 166 | 0.00 TH | 17,799,857 (59.33%) | 0.035648422008887846 ETH |
Loading...
Loading
Contract Name:
RocketTokenRETH
Compiler Version
v0.7.6+commit.7338295f
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, and trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
*
*/
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "../RocketBase.sol";
import "../../interface/deposit/RocketDepositPoolInterface.sol";
import "../../interface/network/RocketNetworkBalancesInterface.sol";
import "../../interface/token/RocketTokenRETHInterface.sol";
import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsNetworkInterface.sol";
// rETH is a tokenised stake in the Rocket Pool network
// rETH is backed by ETH (subject to liquidity) at a variable exchange rate
contract RocketTokenRETH is RocketBase, ERC20, RocketTokenRETHInterface {
// Libs
using SafeMath for uint;
// Events
event EtherDeposited(address indexed from, uint256 amount, uint256 time);
event TokensMinted(address indexed to, uint256 amount, uint256 ethAmount, uint256 time);
event TokensBurned(address indexed from, uint256 amount, uint256 ethAmount, uint256 time);
// Construct with our token details
constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) ERC20("Rocket Pool ETH", "rETH") {
// Version
version = 1;
}
// Receive an ETH deposit from a minipool or generous individual
receive() external payable {
// Emit ether deposited event
emit EtherDeposited(msg.sender, msg.value, block.timestamp);
}
// Calculate the amount of ETH backing an amount of rETH
function getEthValue(uint256 _rethAmount) override public view returns (uint256) {
// Get network balances
RocketNetworkBalancesInterface rocketNetworkBalances = RocketNetworkBalancesInterface(getContractAddress("rocketNetworkBalances"));
uint256 totalEthBalance = rocketNetworkBalances.getTotalETHBalance();
uint256 rethSupply = rocketNetworkBalances.getTotalRETHSupply();
// Use 1:1 ratio if no rETH is minted
if (rethSupply == 0) { return _rethAmount; }
// Calculate and return
return _rethAmount.mul(totalEthBalance).div(rethSupply);
}
// Calculate the amount of rETH backed by an amount of ETH
function getRethValue(uint256 _ethAmount) override public view returns (uint256) {
// Get network balances
RocketNetworkBalancesInterface rocketNetworkBalances = RocketNetworkBalancesInterface(getContractAddress("rocketNetworkBalances"));
uint256 totalEthBalance = rocketNetworkBalances.getTotalETHBalance();
uint256 rethSupply = rocketNetworkBalances.getTotalRETHSupply();
// Use 1:1 ratio if no rETH is minted
if (rethSupply == 0) { return _ethAmount; }
// Check network ETH balance
require(totalEthBalance > 0, "Cannot calculate rETH token amount while total network balance is zero");
// Calculate and return
return _ethAmount.mul(rethSupply).div(totalEthBalance);
}
// Get the current ETH : rETH exchange rate
// Returns the amount of ETH backing 1 rETH
function getExchangeRate() override external view returns (uint256) {
return getEthValue(1 ether);
}
// Get the total amount of collateral available
// Includes rETH contract balance & excess deposit pool balance
function getTotalCollateral() override public view returns (uint256) {
RocketDepositPoolInterface rocketDepositPool = RocketDepositPoolInterface(getContractAddress("rocketDepositPool"));
return rocketDepositPool.getExcessBalance().add(address(this).balance);
}
// Get the current ETH collateral rate
// Returns the portion of rETH backed by ETH in the contract as a fraction of 1 ether
function getCollateralRate() override public view returns (uint256) {
uint256 totalEthValue = getEthValue(totalSupply());
if (totalEthValue == 0) { return calcBase; }
return calcBase.mul(address(this).balance).div(totalEthValue);
}
// Deposit excess ETH from deposit pool
// Only accepts calls from the RocketDepositPool contract
function depositExcess() override external payable onlyLatestContract("rocketDepositPool", msg.sender) {
// Emit ether deposited event
emit EtherDeposited(msg.sender, msg.value, block.timestamp);
}
// Mint rETH
// Only accepts calls from the RocketDepositPool contract
function mint(uint256 _ethAmount, address _to) override external onlyLatestContract("rocketDepositPool", msg.sender) {
// Get rETH amount
uint256 rethAmount = getRethValue(_ethAmount);
// Check rETH amount
require(rethAmount > 0, "Invalid token mint amount");
// Update balance & supply
_mint(_to, rethAmount);
// Emit tokens minted event
emit TokensMinted(_to, rethAmount, _ethAmount, block.timestamp);
}
// Burn rETH for ETH
function burn(uint256 _rethAmount) override external {
// Check rETH amount
require(_rethAmount > 0, "Invalid token burn amount");
require(balanceOf(msg.sender) >= _rethAmount, "Insufficient rETH balance");
// Get ETH amount
uint256 ethAmount = getEthValue(_rethAmount);
// Get & check ETH balance
uint256 ethBalance = getTotalCollateral();
require(ethBalance >= ethAmount, "Insufficient ETH balance for exchange");
// Update balance & supply
_burn(msg.sender, _rethAmount);
// Withdraw ETH from deposit pool if required
withdrawDepositCollateral(ethAmount);
// Transfer ETH to sender
msg.sender.transfer(ethAmount);
// Emit tokens burned event
emit TokensBurned(msg.sender, _rethAmount, ethAmount, block.timestamp);
}
// Withdraw ETH from the deposit pool for collateral if required
function withdrawDepositCollateral(uint256 _ethRequired) private {
// Check rETH contract balance
uint256 ethBalance = address(this).balance;
if (ethBalance >= _ethRequired) { return; }
// Withdraw
RocketDepositPoolInterface rocketDepositPool = RocketDepositPoolInterface(getContractAddress("rocketDepositPool"));
rocketDepositPool.withdrawExcessBalance(_ethRequired.sub(ethBalance));
}
// Sends any excess ETH from this contract to the deposit pool (as determined by target collateral rate)
function depositExcessCollateral() external override {
// Load contracts
RocketDAOProtocolSettingsNetworkInterface rocketDAOProtocolSettingsNetwork = RocketDAOProtocolSettingsNetworkInterface(getContractAddress("rocketDAOProtocolSettingsNetwork"));
RocketDepositPoolInterface rocketDepositPool = RocketDepositPoolInterface(getContractAddress("rocketDepositPool"));
// Get collateral and target collateral rate
uint256 collateralRate = getCollateralRate();
uint256 targetCollateralRate = rocketDAOProtocolSettingsNetwork.getTargetRethCollateralRate();
// Check if we are in excess
if (collateralRate > targetCollateralRate) {
// Calculate our target collateral in ETH
uint256 targetCollateral = address(this).balance.mul(targetCollateralRate).div(collateralRate);
// If we have excess
if (address(this).balance > targetCollateral) {
// Send that excess to deposit pool
uint256 excessCollateral = address(this).balance.sub(targetCollateral);
rocketDepositPool.recycleExcessCollateral{value: excessCollateral}();
}
}
}
// This is called by the base ERC20 contract before all transfer, mint, and burns
function _beforeTokenTransfer(address from, address, uint256) internal override {
// Don't run check if this is a mint transaction
if (from != address(0)) {
// Check which block the user's last deposit was
bytes32 key = keccak256(abi.encodePacked("user.deposit.block", from));
uint256 lastDepositBlock = getUint(key);
if (lastDepositBlock > 0) {
// Ensure enough blocks have passed
uint256 depositDelay = getUint(keccak256(abi.encodePacked(keccak256("dao.protocol.setting.network"), "network.reth.deposit.delay")));
uint256 blocksPassed = block.number.sub(lastDepositBlock);
require(blocksPassed > depositDelay, "Not enough time has passed since deposit");
// Clear the state as it's no longer necessary to check this until another deposit is made
deleteUint(key);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../../utils/Context.sol";
import "./IERC20.sol";
import "../../math/SafeMath.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal virtual {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |`.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, and trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
*
*/
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only
import "../interface/RocketStorageInterface.sol";
/// @title Base settings / modifiers for each contract in Rocket Pool
/// @author David Rugendyke
abstract contract RocketBase {
// Calculate using this as the base
uint256 constant calcBase = 1 ether;
// Version of the contract
uint8 public version;
// The main storage contract where primary persistant storage is maintained
RocketStorageInterface rocketStorage = RocketStorageInterface(0);
/*** Modifiers **********************************************************/
/**
* @dev Throws if called by any sender that doesn't match a Rocket Pool network contract
*/
modifier onlyLatestNetworkContract() {
require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract");
_;
}
/**
* @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract
*/
modifier onlyLatestContract(string memory _contractName, address _contractAddress) {
require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered node
*/
modifier onlyRegisteredNode(address _nodeAddress) {
require(getBool(keccak256(abi.encodePacked("node.exists", _nodeAddress))), "Invalid node");
_;
}
/**
* @dev Throws if called by any sender that isn't a trusted node DAO member
*/
modifier onlyTrustedNode(address _nodeAddress) {
require(getBool(keccak256(abi.encodePacked("dao.trustednodes.", "member", _nodeAddress))), "Invalid trusted node");
_;
}
/**
* @dev Throws if called by any sender that isn't a registered minipool
*/
modifier onlyRegisteredMinipool(address _minipoolAddress) {
require(getBool(keccak256(abi.encodePacked("minipool.exists", _minipoolAddress))), "Invalid minipool");
_;
}
/**
* @dev Throws if called by any account other than a guardian account (temporary account allowed access to settings before DAO is fully enabled)
*/
modifier onlyGuardian() {
require(msg.sender == rocketStorage.getGuardian(), "Account is not a temporary guardian");
_;
}
/*** Methods **********************************************************/
/// @dev Set the main Rocket Storage address
constructor(RocketStorageInterface _rocketStorageAddress) {
// Update the contract address
rocketStorage = RocketStorageInterface(_rocketStorageAddress);
}
/// @dev Get the address of a network contract by name
function getContractAddress(string memory _contractName) internal view returns (address) {
// Get the current contract address
address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
// Check it
require(contractAddress != address(0x0), "Contract not found");
// Return
return contractAddress;
}
/// @dev Get the address of a network contract by name (returns address(0x0) instead of reverting if contract does not exist)
function getContractAddressUnsafe(string memory _contractName) internal view returns (address) {
// Get the current contract address
address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
// Return
return contractAddress;
}
/// @dev Get the name of a network contract by address
function getContractName(address _contractAddress) internal view returns (string memory) {
// Get the contract name
string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress)));
// Check it
require(bytes(contractName).length > 0, "Contract not found");
// Return
return contractName;
}
/// @dev Get revert error message from a .call method
function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
// If the _res length is less than 68, then the transaction failed silently (without a revert message)
if (_returnData.length < 68) return "Transaction reverted silently";
assembly {
// Slice the sighash.
_returnData := add(_returnData, 0x04)
}
return abi.decode(_returnData, (string)); // All that remains is the revert string
}
/*** Rocket Storage Methods ****************************************/
// Note: Unused helpers have been removed to keep contract sizes down
/// @dev Storage get methods
function getAddress(bytes32 _key) internal view returns (address) { return rocketStorage.getAddress(_key); }
function getUint(bytes32 _key) internal view returns (uint) { return rocketStorage.getUint(_key); }
function getString(bytes32 _key) internal view returns (string memory) { return rocketStorage.getString(_key); }
function getBytes(bytes32 _key) internal view returns (bytes memory) { return rocketStorage.getBytes(_key); }
function getBool(bytes32 _key) internal view returns (bool) { return rocketStorage.getBool(_key); }
function getInt(bytes32 _key) internal view returns (int) { return rocketStorage.getInt(_key); }
function getBytes32(bytes32 _key) internal view returns (bytes32) { return rocketStorage.getBytes32(_key); }
/// @dev Storage set methods
function setAddress(bytes32 _key, address _value) internal { rocketStorage.setAddress(_key, _value); }
function setUint(bytes32 _key, uint _value) internal { rocketStorage.setUint(_key, _value); }
function setString(bytes32 _key, string memory _value) internal { rocketStorage.setString(_key, _value); }
function setBytes(bytes32 _key, bytes memory _value) internal { rocketStorage.setBytes(_key, _value); }
function setBool(bytes32 _key, bool _value) internal { rocketStorage.setBool(_key, _value); }
function setInt(bytes32 _key, int _value) internal { rocketStorage.setInt(_key, _value); }
function setBytes32(bytes32 _key, bytes32 _value) internal { rocketStorage.setBytes32(_key, _value); }
/// @dev Storage delete methods
function deleteAddress(bytes32 _key) internal { rocketStorage.deleteAddress(_key); }
function deleteUint(bytes32 _key) internal { rocketStorage.deleteUint(_key); }
function deleteString(bytes32 _key) internal { rocketStorage.deleteString(_key); }
function deleteBytes(bytes32 _key) internal { rocketStorage.deleteBytes(_key); }
function deleteBool(bytes32 _key) internal { rocketStorage.deleteBool(_key); }
function deleteInt(bytes32 _key) internal { rocketStorage.deleteInt(_key); }
function deleteBytes32(bytes32 _key) internal { rocketStorage.deleteBytes32(_key); }
/// @dev Storage arithmetic methods
function addUint(bytes32 _key, uint256 _amount) internal { rocketStorage.addUint(_key, _amount); }
function subUint(bytes32 _key, uint256 _amount) internal { rocketStorage.subUint(_key, _amount); }
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |`.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, and trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
*
*/
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only
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, and trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
*
*/
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketDAOProtocolSettingsNetworkInterface {
function getNodeConsensusThreshold() 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);
}/**
* .
* / \
* |.'.|
* |'.'|
* ,'| |`.
* |,-'-|-'-.|
* __|_| | _ _ _____ _
* | ___ \| | | | | | ___ \ | |
* | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | |
* | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| |
* | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | |
* \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_|
* +---------------------------------------------------+
* | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM |
* +---------------------------------------------------+
*
* Rocket Pool is a first-of-its-kind Ethereum staking pool protocol, designed to
* be community-owned, decentralised, and trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
*
*/
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketDepositPoolInterface {
function getBalance() external view returns (uint256);
function getExcessBalance() external view returns (uint256);
function deposit() external payable;
function recycleDissolvedDeposit() external payable;
function recycleExcessCollateral() external payable;
function recycleLiquidatedStake() external payable;
function assignDeposits() external;
function withdrawExcessBalance(uint256 _amount) external;
function getUserLastDepositBlock(address _address) 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, and trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
*
*/
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only
interface RocketNetworkBalancesInterface {
function getBalancesBlock() external view returns (uint256);
function getLatestReportableBlock() 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 _total, uint256 _staking, uint256 _rethSupply) external;
function executeUpdateBalances(uint256 _block, 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, and trustless.
*
* For more information about Rocket Pool, visit https://rocketpool.net
*
* Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty
*
*/
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface RocketTokenRETHInterface is IERC20 {
function getEthValue(uint256 _rethAmount) external view returns (uint256);
function getRethValue(uint256 _ethAmount) external view returns (uint256);
function getExchangeRate() external view returns (uint256);
function getTotalCollateral() external view returns (uint256);
function getCollateralRate() external view returns (uint256);
function depositExcess() external payable;
function depositExcessCollateral() external;
function mint(uint256 _ethAmount, address _to) external;
function burn(uint256 _rethAmount) external;
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 15000
},
"evmVersion": "istanbul",
"libraries": {},
"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":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"EtherDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rethAmount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositExcess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositExcessCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rethAmount","type":"uint256"}],"name":"getEthValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"getRethValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405260008054610100600160a81b03191690553480156200002257600080fd5b506040516200241838038062002418833981810160405260208110156200004857600080fd5b5051604080518082018252600f81526e0a4dec6d6cae840a0deded8408aa89608b1b602080830191825283518085019094526004808552630e48aa8960e31b9185019190915260008054610100600160a81b0319166101006001600160a01b038816021790558251929392620000bf9290620000fc565b508051620000d5906005906020840190620000fc565b50506006805460ff1990811660121790915560008054909116600117905550620001a89050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200013457600085556200017f565b82601f106200014f57805160ff19168380011785556200017f565b828001600101855582156200017f579182015b828111156200017f57825182559160200191906001019062000162565b506200018d92915062000191565b5090565b5b808211156200018d576000815560010162000192565b61226080620001b86000396000f3fe60806040526004361061016e5760003560e01c80636c985a88116100cb57806395d89b411161007f578063d6eb591011610059578063d6eb59101461056d578063dd62ed3e14610582578063e6aa216c146105ca576101ae565b806395d89b41146104cc578063a457c2d7146104e1578063a9059cbb14610527576101ae565b8063852185fc116100b0578063852185fc146104475780638b32fa231461045c57806394bf804d14610486576101ae565b80636c985a88146103ff57806370a0823114610407576101ae565b8063313ce5671161012257806342966c681161010757806342966c68146103965780634346f03e146103c057806354fd4d50146103ea576101ae565b8063313ce567146103255780633950935114610350576101ae565b806318160ddd1161015357806318160ddd14610297578063188e0dc6146102be57806323b872dd146102d5576101ae565b806306fdde03146101b3578063095ea7b31461023d576101ae565b366101ae5760408051348152426020820152815133927fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f928290030190a2005b600080fd5b3480156101bf57600080fd5b506101c86105df565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102025781810151838201526020016101ea565b50505050905090810190601f16801561022f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561024957600080fd5b506102836004803603604081101561026057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610694565b604080519115158252519081900360200190f35b3480156102a357600080fd5b506102ac6106b2565b60408051918252519081900360200190f35b3480156102ca57600080fd5b506102d36106b8565b005b3480156102e157600080fd5b50610283600480360360608110156102f857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561085f565b34801561033157600080fd5b5061033a610900565b6040805160ff9092168252519081900360200190f35b34801561035c57600080fd5b506102836004803603604081101561037357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610909565b3480156103a257600080fd5b506102d3600480360360208110156103b957600080fd5b5035610964565b3480156103cc57600080fd5b506102ac600480360360208110156103e357600080fd5b5035610af6565b3480156103f657600080fd5b5061033a610caf565b6102d3610cb8565b34801561041357600080fd5b506102ac6004803603602081101561042a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e67565b34801561045357600080fd5b506102ac610e8f565b34801561046857600080fd5b506102ac6004803603602081101561047f57600080fd5b5035610ed6565b34801561049257600080fd5b506102d3600480360360408110156104a957600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611045565b3480156104d857600080fd5b506101c8611241565b3480156104ed57600080fd5b506102836004803603604081101561050457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356112c0565b34801561053357600080fd5b506102836004803603604081101561054a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611335565b34801561057957600080fd5b506102ac611349565b34801561058e57600080fd5b506102ac600480360360408110156105a557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611408565b3480156105d657600080fd5b506102ac611440565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106895780601f1061065e57610100808354040283529160200191610689565b820191906000526020600020905b81548152906001019060200180831161066c57829003601f168201915b505050505090505b90565b60006106a86106a1611458565b848461145c565b5060015b92915050565b60035490565b60006106f86040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b81525061156f565b9050600061073a6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525061156f565b90506000610746610e8f565b905060008373ffffffffffffffffffffffffffffffffffffffff1663e28767136040518163ffffffff1660e01b815260040160206040518083038186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d60208110156107ba57600080fd5b50519050808211156108595760006107dc836107d64785611657565b906116b7565b9050804711156108575760006107f2478361171e565b90508473ffffffffffffffffffffffffffffffffffffffff1663db82047b826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561083c57600080fd5b505af1158015610850573d6000803e3d6000fd5b5050505050505b505b50505050565b600061086c84848461177b565b6108f684610878611458565b6108f18560405180606001604052806028815260200161212e6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600260205260408120906108c3611458565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611919565b61145c565b5060019392505050565b60065460ff1690565b60006106a8610916611458565b846108f18560026000610927611458565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c1681529252902054906119b0565b600081116109b9576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420746f6b656e206275726e20616d6f756e7400000000000000604482015290519081900360640190fd5b806109c333610e67565b1015610a16576040805162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420724554482062616c616e636500000000000000604482015290519081900360640190fd5b6000610a2182610ed6565b90506000610a2d611349565b905081811015610a6e5760405162461bcd60e51b81526004018080602001828103825260258152602001806120566025913960400191505060405180910390fd5b610a783384611a0a565b610a8182611b3a565b604051339083156108fc029084906000818181858888f19350505050158015610aae573d6000803e3d6000fd5b5060408051848152602081018490524281830152905133917f19783b34589160c168487dc7f9c51ae0bcefe67a47d6708fba90f6ce0366d3d1919081900360600190a2505050565b600080610b376040518060400160405280601581526020017f726f636b65744e6574776f726b42616c616e636573000000000000000000000081525061156f565b905060008173ffffffffffffffffffffffffffffffffffffffff1663964d042c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b8157600080fd5b505afa158015610b95573d6000803e3d6000fd5b505050506040513d6020811015610bab57600080fd5b5051604080517fc4c8d0ad000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff85169163c4c8d0ad916004808301926020929190829003018186803b158015610c1957600080fd5b505afa158015610c2d573d6000803e3d6000fd5b505050506040513d6020811015610c4357600080fd5b5051905080610c5757849350505050610caa565b60008211610c965760405162461bcd60e51b81526004018080602001828103825260468152602001806121c06046913960600191505060405180910390fd5b610ca4826107d68784611657565b93505050505b919050565b60005460ff1681565b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525033610dab8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610d6b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d2e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120611c04565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e2a576040805162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60408051348152426020820152815133927fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f928290030190a25050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b600080610ea2610e9d6106b2565b610ed6565b905080610eba57670de0b6b3a7640000915050610691565b610ed0816107d6670de0b6b3a764000047611657565b91505090565b600080610f176040518060400160405280601581526020017f726f636b65744e6574776f726b42616c616e636573000000000000000000000081525061156f565b905060008173ffffffffffffffffffffffffffffffffffffffff1663964d042c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f6157600080fd5b505afa158015610f75573d6000803e3d6000fd5b505050506040513d6020811015610f8b57600080fd5b5051604080517fc4c8d0ad000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff85169163c4c8d0ad916004808301926020929190829003018186803b158015610ff957600080fd5b505afa15801561100d573d6000803e3d6000fd5b505050506040513d602081101561102357600080fd5b505190508061103757849350505050610caa565b610ca4816107d68785611657565b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336110f78260405160200180807f636f6e74726163742e6164647265737300000000000000000000000000000000815250601001828051906020019080838360208310610d6b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d2e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611176576040805162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b600061118185610af6565b9050600081116111d8576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420746f6b656e206d696e7420616d6f756e7400000000000000604482015290519081900360640190fd5b6111e28482611caa565b60408051828152602081018790524281830152905173ffffffffffffffffffffffffffffffffffffffff8616917f6155cfd0fd028b0ca77e8495a60cbe563e8bce8611f0aad6fedbdaafc05d44a2919081900360600190a25050505050565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106895780601f1061065e57610100808354040283529160200191610689565b60006106a86112cd611458565b846108f18560405180606001604052806025815260200161220660259139600260006112f7611458565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190611919565b60006106a8611342611458565b848461177b565b60008061138a6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525061156f565b9050610ed0478273ffffffffffffffffffffffffffffffffffffffff1663888b042f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d657600080fd5b505afa1580156113ea573d6000803e3d6000fd5b505050506040513d602081101561140057600080fd5b5051906119b0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b6000611453670de0b6b3a7640000610ed6565b905090565b3390565b73ffffffffffffffffffffffffffffffffffffffff83166114ae5760405162461bcd60e51b815260040180806020018281038252602481526020018061219c6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166115005760405162461bcd60e51b815260040180806020018281038252602281526020018061209d6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000806115ed8360405160200180807f636f6e74726163742e6164647265737300000000000000000000000000000000815250601001828051906020019080838360208310610d6b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d2e565b905073ffffffffffffffffffffffffffffffffffffffff81166106ac576040805162461bcd60e51b815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e640000000000000000000000000000604482015290519081900360640190fd5b600082611666575060006106ac565b8282028284828161167357fe5b04146116b05760405162461bcd60e51b815260040180806020018281038252602181526020018061210d6021913960400191505060405180910390fd5b9392505050565b600080821161170d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161171657fe5b049392505050565b600082821115611775576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b73ffffffffffffffffffffffffffffffffffffffff83166117cd5760405162461bcd60e51b81526004018080602001828103825260258152602001806121776025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661181f5760405162461bcd60e51b81526004018080602001828103825260238152602001806120336023913960400191505060405180910390fd5b61182a838383611dc3565b611874816040518060600160405280602681526020016120bf6026913973ffffffffffffffffffffffffffffffffffffffff86166000908152600160205260409020549190611919565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546118b090826119b0565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156119a85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561196d578181015183820152602001611955565b50505050905090810190601f16801561199a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156116b0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216611a5c5760405162461bcd60e51b81526004018080602001828103825260218152602001806121566021913960400191505060405180910390fd5b611a6882600083611dc3565b611ab28160405180606001604052806022815260200161207b6022913973ffffffffffffffffffffffffffffffffffffffff85166000908152600160205260409020549190611919565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902055600354611ae5908261171e565b60035560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b47818110611b485750611c01565b6000611b886040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525061156f565b905073ffffffffffffffffffffffffffffffffffffffff81166363a5db9e611bb0858561171e565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b5050505050505b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c7857600080fd5b505afa158015611c8c573d6000803e3d6000fd5b505050506040513d6020811015611ca257600080fd5b505192915050565b73ffffffffffffffffffffffffffffffffffffffff8216611d12576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611d1e60008383611dc3565b600354611d2b90826119b0565b60035573ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902054611d5e90826119b0565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff831615611f3357604080517f757365722e6465706f7369742e626c6f636b00000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b16603283015282516026818403018152604690920190925280519101206000611e5b82611f38565b90508015610857576000611edc7f7cb36cfba78818e097a3d983f102f9107317663854a5d185ea320a1e1a7da21560405160200180828152602001807f6e6574776f726b2e726574682e6465706f7369742e64656c6179000000000000815250601a0191505060405160208183030381529060405280519060200120611f38565b90506000611eea438461171e565b9050818111611f2a5760405162461bcd60e51b81526004018080602001828103825260288152602001806120e56028913960400191505060405180910390fd5b611bfa84611fac565b505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c7857600080fd5b60008054604080517fe2b202bf00000000000000000000000000000000000000000000000000000000815260048101859052905161010090920473ffffffffffffffffffffffffffffffffffffffff169263e2b202bf9260248084019382900301818387803b15801561201e57600080fd5b505af1158015610857573d6000803e3d6000fdfe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373496e73756666696369656e74204554482062616c616e636520666f722065786368616e676545524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654e6f7420656e6f7567682074696d6520686173207061737365642073696e6365206465706f736974536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e6e6f742063616c63756c617465207245544820746f6b656e20616d6f756e74207768696c6520746f74616c206e6574776f726b2062616c616e6365206973207a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205a28be4fcc53ccd2efba1606480b70dfaf30afcd114e556e4547176880794b3664736f6c634300070600330000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46
Deployed Bytecode
0x60806040526004361061016e5760003560e01c80636c985a88116100cb57806395d89b411161007f578063d6eb591011610059578063d6eb59101461056d578063dd62ed3e14610582578063e6aa216c146105ca576101ae565b806395d89b41146104cc578063a457c2d7146104e1578063a9059cbb14610527576101ae565b8063852185fc116100b0578063852185fc146104475780638b32fa231461045c57806394bf804d14610486576101ae565b80636c985a88146103ff57806370a0823114610407576101ae565b8063313ce5671161012257806342966c681161010757806342966c68146103965780634346f03e146103c057806354fd4d50146103ea576101ae565b8063313ce567146103255780633950935114610350576101ae565b806318160ddd1161015357806318160ddd14610297578063188e0dc6146102be57806323b872dd146102d5576101ae565b806306fdde03146101b3578063095ea7b31461023d576101ae565b366101ae5760408051348152426020820152815133927fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f928290030190a2005b600080fd5b3480156101bf57600080fd5b506101c86105df565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102025781810151838201526020016101ea565b50505050905090810190601f16801561022f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561024957600080fd5b506102836004803603604081101561026057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610694565b604080519115158252519081900360200190f35b3480156102a357600080fd5b506102ac6106b2565b60408051918252519081900360200190f35b3480156102ca57600080fd5b506102d36106b8565b005b3480156102e157600080fd5b50610283600480360360608110156102f857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561085f565b34801561033157600080fd5b5061033a610900565b6040805160ff9092168252519081900360200190f35b34801561035c57600080fd5b506102836004803603604081101561037357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610909565b3480156103a257600080fd5b506102d3600480360360208110156103b957600080fd5b5035610964565b3480156103cc57600080fd5b506102ac600480360360208110156103e357600080fd5b5035610af6565b3480156103f657600080fd5b5061033a610caf565b6102d3610cb8565b34801561041357600080fd5b506102ac6004803603602081101561042a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e67565b34801561045357600080fd5b506102ac610e8f565b34801561046857600080fd5b506102ac6004803603602081101561047f57600080fd5b5035610ed6565b34801561049257600080fd5b506102d3600480360360408110156104a957600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611045565b3480156104d857600080fd5b506101c8611241565b3480156104ed57600080fd5b506102836004803603604081101561050457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356112c0565b34801561053357600080fd5b506102836004803603604081101561054a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611335565b34801561057957600080fd5b506102ac611349565b34801561058e57600080fd5b506102ac600480360360408110156105a557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611408565b3480156105d657600080fd5b506102ac611440565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106895780601f1061065e57610100808354040283529160200191610689565b820191906000526020600020905b81548152906001019060200180831161066c57829003601f168201915b505050505090505b90565b60006106a86106a1611458565b848461145c565b5060015b92915050565b60035490565b60006106f86040518060400160405280602081526020017f726f636b657444414f50726f746f636f6c53657474696e67734e6574776f726b81525061156f565b9050600061073a6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525061156f565b90506000610746610e8f565b905060008373ffffffffffffffffffffffffffffffffffffffff1663e28767136040518163ffffffff1660e01b815260040160206040518083038186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d60208110156107ba57600080fd5b50519050808211156108595760006107dc836107d64785611657565b906116b7565b9050804711156108575760006107f2478361171e565b90508473ffffffffffffffffffffffffffffffffffffffff1663db82047b826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561083c57600080fd5b505af1158015610850573d6000803e3d6000fd5b5050505050505b505b50505050565b600061086c84848461177b565b6108f684610878611458565b6108f18560405180606001604052806028815260200161212e6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600260205260408120906108c3611458565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611919565b61145c565b5060019392505050565b60065460ff1690565b60006106a8610916611458565b846108f18560026000610927611458565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c1681529252902054906119b0565b600081116109b9576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420746f6b656e206275726e20616d6f756e7400000000000000604482015290519081900360640190fd5b806109c333610e67565b1015610a16576040805162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420724554482062616c616e636500000000000000604482015290519081900360640190fd5b6000610a2182610ed6565b90506000610a2d611349565b905081811015610a6e5760405162461bcd60e51b81526004018080602001828103825260258152602001806120566025913960400191505060405180910390fd5b610a783384611a0a565b610a8182611b3a565b604051339083156108fc029084906000818181858888f19350505050158015610aae573d6000803e3d6000fd5b5060408051848152602081018490524281830152905133917f19783b34589160c168487dc7f9c51ae0bcefe67a47d6708fba90f6ce0366d3d1919081900360600190a2505050565b600080610b376040518060400160405280601581526020017f726f636b65744e6574776f726b42616c616e636573000000000000000000000081525061156f565b905060008173ffffffffffffffffffffffffffffffffffffffff1663964d042c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b8157600080fd5b505afa158015610b95573d6000803e3d6000fd5b505050506040513d6020811015610bab57600080fd5b5051604080517fc4c8d0ad000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff85169163c4c8d0ad916004808301926020929190829003018186803b158015610c1957600080fd5b505afa158015610c2d573d6000803e3d6000fd5b505050506040513d6020811015610c4357600080fd5b5051905080610c5757849350505050610caa565b60008211610c965760405162461bcd60e51b81526004018080602001828103825260468152602001806121c06046913960600191505060405180910390fd5b610ca4826107d68784611657565b93505050505b919050565b60005460ff1681565b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525033610dab8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610d6b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d2e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120611c04565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e2a576040805162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60408051348152426020820152815133927fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f928290030190a25050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b600080610ea2610e9d6106b2565b610ed6565b905080610eba57670de0b6b3a7640000915050610691565b610ed0816107d6670de0b6b3a764000047611657565b91505090565b600080610f176040518060400160405280601581526020017f726f636b65744e6574776f726b42616c616e636573000000000000000000000081525061156f565b905060008173ffffffffffffffffffffffffffffffffffffffff1663964d042c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f6157600080fd5b505afa158015610f75573d6000803e3d6000fd5b505050506040513d6020811015610f8b57600080fd5b5051604080517fc4c8d0ad000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff85169163c4c8d0ad916004808301926020929190829003018186803b158015610ff957600080fd5b505afa15801561100d573d6000803e3d6000fd5b505050506040513d602081101561102357600080fd5b505190508061103757849350505050610caa565b610ca4816107d68785611657565b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336110f78260405160200180807f636f6e74726163742e6164647265737300000000000000000000000000000000815250601001828051906020019080838360208310610d6b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d2e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611176576040805162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b600061118185610af6565b9050600081116111d8576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420746f6b656e206d696e7420616d6f756e7400000000000000604482015290519081900360640190fd5b6111e28482611caa565b60408051828152602081018790524281830152905173ffffffffffffffffffffffffffffffffffffffff8616917f6155cfd0fd028b0ca77e8495a60cbe563e8bce8611f0aad6fedbdaafc05d44a2919081900360600190a25050505050565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106895780601f1061065e57610100808354040283529160200191610689565b60006106a86112cd611458565b846108f18560405180606001604052806025815260200161220660259139600260006112f7611458565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190611919565b60006106a8611342611458565b848461177b565b60008061138a6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525061156f565b9050610ed0478273ffffffffffffffffffffffffffffffffffffffff1663888b042f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d657600080fd5b505afa1580156113ea573d6000803e3d6000fd5b505050506040513d602081101561140057600080fd5b5051906119b0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b6000611453670de0b6b3a7640000610ed6565b905090565b3390565b73ffffffffffffffffffffffffffffffffffffffff83166114ae5760405162461bcd60e51b815260040180806020018281038252602481526020018061219c6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166115005760405162461bcd60e51b815260040180806020018281038252602281526020018061209d6022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000806115ed8360405160200180807f636f6e74726163742e6164647265737300000000000000000000000000000000815250601001828051906020019080838360208310610d6b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d2e565b905073ffffffffffffffffffffffffffffffffffffffff81166106ac576040805162461bcd60e51b815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e640000000000000000000000000000604482015290519081900360640190fd5b600082611666575060006106ac565b8282028284828161167357fe5b04146116b05760405162461bcd60e51b815260040180806020018281038252602181526020018061210d6021913960400191505060405180910390fd5b9392505050565b600080821161170d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161171657fe5b049392505050565b600082821115611775576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b73ffffffffffffffffffffffffffffffffffffffff83166117cd5760405162461bcd60e51b81526004018080602001828103825260258152602001806121776025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661181f5760405162461bcd60e51b81526004018080602001828103825260238152602001806120336023913960400191505060405180910390fd5b61182a838383611dc3565b611874816040518060600160405280602681526020016120bf6026913973ffffffffffffffffffffffffffffffffffffffff86166000908152600160205260409020549190611919565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602052604080822093909355908416815220546118b090826119b0565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156119a85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561196d578181015183820152602001611955565b50505050905090810190601f16801561199a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156116b0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216611a5c5760405162461bcd60e51b81526004018080602001828103825260218152602001806121566021913960400191505060405180910390fd5b611a6882600083611dc3565b611ab28160405180606001604052806022815260200161207b6022913973ffffffffffffffffffffffffffffffffffffffff85166000908152600160205260409020549190611919565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902055600354611ae5908261171e565b60035560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b47818110611b485750611c01565b6000611b886040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c00000000000000000000000000000081525061156f565b905073ffffffffffffffffffffffffffffffffffffffff81166363a5db9e611bb0858561171e565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b5050505050505b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c7857600080fd5b505afa158015611c8c573d6000803e3d6000fd5b505050506040513d6020811015611ca257600080fd5b505192915050565b73ffffffffffffffffffffffffffffffffffffffff8216611d12576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611d1e60008383611dc3565b600354611d2b90826119b0565b60035573ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902054611d5e90826119b0565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff831615611f3357604080517f757365722e6465706f7369742e626c6f636b00000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b16603283015282516026818403018152604690920190925280519101206000611e5b82611f38565b90508015610857576000611edc7f7cb36cfba78818e097a3d983f102f9107317663854a5d185ea320a1e1a7da21560405160200180828152602001807f6e6574776f726b2e726574682e6465706f7369742e64656c6179000000000000815250601a0191505060405160208183030381529060405280519060200120611f38565b90506000611eea438461171e565b9050818111611f2a5760405162461bcd60e51b81526004018080602001828103825260288152602001806120e56028913960400191505060405180910390fd5b611bfa84611fac565b505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c7857600080fd5b60008054604080517fe2b202bf00000000000000000000000000000000000000000000000000000000815260048101859052905161010090920473ffffffffffffffffffffffffffffffffffffffff169263e2b202bf9260248084019382900301818387803b15801561201e57600080fd5b505af1158015610857573d6000803e3d6000fdfe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373496e73756666696369656e74204554482062616c616e636520666f722065786368616e676545524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654e6f7420656e6f7567682074696d6520686173207061737365642073696e6365206465706f736974536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e6e6f742063616c63756c617465207245544820746f6b656e20616d6f756e74207768696c6520746f74616c206e6574776f726b2062616c616e6365206973207a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205a28be4fcc53ccd2efba1606480b70dfaf30afcd114e556e4547176880794b3664736f6c63430007060033
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
$6,868,076.96
Net Worth in ETH
2,222.979883
Token Allocations
ETH
99.88%
RETH
0.12%
RPL
0.00%
Others
0.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 99.88% | $3,089.58 | 2,220.3539 | $6,859,963.88 | |
| ETH | 0.12% | $3,565.36 | 2.2634 | $8,069.82 | |
| ETH | <0.01% | $2.09 | 6.4594 | $13.5 | |
| ETH | <0.01% | $3,086.86 | 0.00214261 | $6.61 | |
| ETH | <0.01% | $0.009935 | 512.3226 | $5.09 | |
| ARB | <0.01% | $3,089.05 | 0.00322 | $9.95 | |
| BASE | <0.01% | $3,563.08 | 0.00061728 | $2.2 | |
| BASE | <0.01% | $0.000001 | 740,000 | $0.9324 | |
| LINEA | <0.01% | $3,089.58 | 0.001 | $3.09 | |
| BSC | <0.01% | $3,086.77 | 0.00061042 | $1.88 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.