ETH Price: $2,981.85 (+3.25%)
Gas: 14 Gwei

Token

Rocket Pool ETH (rETH)
 

Overview

Max Total Supply

514,036.608171091900728689 rETH

Holders

17,747 ( -1.307%)

Total Transfers

-

Market

Price

$3,301.39 @ 1.107162 ETH (+3.49%)

Onchain Market Cap

$1,697,035,317.85

Circulating Supply Market Cap

$1,697,303,547.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Rocket Pool is a decentralised Ethereum Proof of Stake pool.

Market

Volume (24H):$16,964,161.00
Market Capitalization:$1,697,303,547.00
Circulating Supply:513,951.00 rETH
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Uniswap V3 (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$3,303.45
1.1061740 Eth
$8,539,675.00
2,583.491 0XAE78736CD615F374D3085123A210448E74FC6393
7.5407%
2
Balancer V2
0XAE78736CD615F374D3085123A210448E74FC6393-0XCD5FE23C85820F7B72D0926FC9B05B43E359B7EE$3,297.05
1.1054410 Eth
$4,803,676.00
1,457.244 0XAE78736CD615F374D3085123A210448E74FC6393
4.2534%
3
Balancer V2
0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0-0XAE78736CD615F374D3085123A210448E74FC6393$3,297.05
1.1054410 Eth
$1,432,550.00
412.526 0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0
1.2041%
4
Balancer V2
0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0-0XAE78736CD615F374D3085123A210448E74FC6393$3,295.11
1.1044310 Eth
$507,927.00
146.253 0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0
0.4269%
5
Balancer V2
0XAC3E018457B222D93114458476F3E3416ABBE38F-0XAE78736CD615F374D3085123A210448E74FC6393$3,297.05
1.1054410 Eth
$324,900.00
100.700 0XAC3E018457B222D93114458476F3E3416ABBE38F
0.2939%
6
Balancer V2
0XAC3E018457B222D93114458476F3E3416ABBE38F-0XAE78736CD615F374D3085123A210448E74FC6393$3,297.61
1.1056260 Eth
$264,709.00
82.035 0XAC3E018457B222D93114458476F3E3416ABBE38F
0.2394%
7
Ramses V2
0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8-0X82AF49447D8A07E3BD95BD0D56F35241523FBAB1$3,292.64
1.1036040 Eth
$204,286.00
62.052 0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8
0.1811%
8
Balancer V2 (Base)
0XB6FE221FE9EEF5ABA221C348BA20A1BF5E73624C-0X4200000000000000000000000000000000000006$3,295.84
1.1040350 Eth
$167,077.00
50.660 0XB6FE221FE9EEF5ABA221C348BA20A1BF5E73624C
0.1479%
9
Curve (Ethereum)
0XF1C9ACDC66974DFB6DECB12AA385B9CD01190E38-0XAE78736CD615F374D3085123A210448E74FC6393$3,296.97
1.1050960 Eth
$153,174.00
50.513 0XF1C9ACDC66974DFB6DECB12AA385B9CD01190E38
0.1474%
10
Balancer V2
0XAE78736CD615F374D3085123A210448E74FC6393-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$3,301.41
1.1069020 Eth
$134,978.00
40.865 0XAE78736CD615F374D3085123A210448E74FC6393
0.1193%
11
Balancer V2
0XAE78736CD615F374D3085123A210448E74FC6393-0XD33526068D116CE69F19A9EE46F0BD304F21A51F$3,418.02
1.1445370 Eth
$132,933.00
38.289 0XAE78736CD615F374D3085123A210448E74FC6393
0.1118%
12
Uniswap V3 (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$3,297.70
1.1042480 Eth
$104,023.00
31.526 0XAE78736CD615F374D3085123A210448E74FC6393
0.0920%
13
Curve (Ethereum)
0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0-0XAE78736CD615F374D3085123A210448E74FC6393$3,296.88
1.1050240 Eth
$97,114.00
27.968 0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0
0.0816%
14
Pancakeswap V3 (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$3,297.47
1.1052220 Eth
$75,441.00
22.878 0XAE78736CD615F374D3085123A210448E74FC6393
0.0668%
15
Beethoven X (Optimism)
0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D-0X4200000000000000000000000000000000000006$3,280.06
1.0994050 Eth
$37,915.00
11.555 0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D
0.0337%
16
Curve (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0XAC3E018457B222D93114458476F3E3416ABBE38F$3,300.56
1.1062580 Eth
$36,953.00
11.196 0XAE78736CD615F374D3085123A210448E74FC6393
0.0327%
17
Curve (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$3,303.06
1.1070940 Eth
$19,500.94
5.905 0XAE78736CD615F374D3085123A210448E74FC6393
0.0172%
18
Aerodrome (Base)
0XB6FE221FE9EEF5ABA221C348BA20A1BF5E73624C-0X4200000000000000000000000000000000000006$3,299.79
1.1046160 Eth
$18,223.52
5.456 0XB6FE221FE9EEF5ABA221C348BA20A1BF5E73624C
0.0159%
19
Uniswap V3 (Arbitrum One)
0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8-0X82AF49447D8A07E3BD95BD0D56F35241523FBAB1$3,290.92
1.1030250 Eth
$12,079.56
3.669 0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8
0.0107%
20
Curve (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$3,302.20
1.1068060 Eth
$8,528.95
2.583 0XAE78736CD615F374D3085123A210448E74FC6393
0.0075%
21
Uniswap V3 (Optimism)
0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D-0X4200000000000000000000000000000000000006$3,293.35
1.1041980 Eth
$7,915.19
2.391 0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D
0.0070%
22
Uniswap V3 (Optimism)
0X1F32B1C2345538C0C6F582FCB022739C4A194EBB-0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D$3,291.33
1.1032080 Eth
$6,356.54
1.834 0X1F32B1C2345538C0C6F582FCB022739C4A194EBB
0.0054%
23
Beethoven X (Optimism)
0X1F32B1C2345538C0C6F582FCB022739C4A194EBB-0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D$3,291.90
1.1033730 Eth
$4,572.42
1.318 0X1F32B1C2345538C0C6F582FCB022739C4A194EBB
0.0038%
24
Curve (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0$3,299.64
1.1059500 Eth
$3,442.58
1.043 0XAE78736CD615F374D3085123A210448E74FC6393
0.0030%
25
Uniswap V3 (Optimism)
0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D-0X4200000000000000000000000000000000000006$3,293.15
1.1031320 Eth
$1,175.07
0.355 0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D
0.0010%
26
Velodrome Finance
0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D-0X4200000000000000000000000000000000000006$3,300.38
1.1063440 Eth
$1,119.32
0.339 0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D
0.0010%
27
Beethoven X (Optimism)
0XB4BC46BC6CB217B59EA8F4530BAE26BF69F677F0-0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D$3,291.90
1.1033730 Eth
$987.17
29,119.717 0XB4BC46BC6CB217B59EA8F4530BAE26BF69F677F0
84.9944%
28
Velodrome Finance v2
0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D-0X4200000000000000000000000000000000000006$3,305.27
1.1071940 Eth
$716.89
0.215 0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D
0.0006%
29
Uniswap V3 (Arbitrum One)
0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8-0X82AF49447D8A07E3BD95BD0D56F35241523FBAB1$3,274.40
1.0974910 Eth
$656.39
0.200 0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8
0.0006%
30
Uniswap V3 (Arbitrum One)
0X5979D7B546E38E414F7E9822514BE443A4800529-0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8$3,293.63
1.1039360 Eth
$349.10
0.101 0X5979D7B546E38E414F7E9822514BE443A4800529
0.0003%
31
Beethoven X (Optimism)
0X484C2D6E3CDD945A8B2DF735E079178C1036578C-0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D$3,291.90
1.1033730 Eth
$304.11
0.094 0X484C2D6E3CDD945A8B2DF735E079178C1036578C
0.0003%
32
Uniswap V2 (Ethereum)
0XAE78736CD615F374D3085123A210448E74FC6393-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$3,296.37
1.1042110 Eth
$107.11
0.032 0XAE78736CD615F374D3085123A210448E74FC6393
0.0001%
33
Velodrome Finance v2
0X3A18DCC9745EDCD1EF33ECB93B0B6EBA5671E7CA-0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D$3,296.95
1.1044050 Eth
$42.97
24.225 0X3A18DCC9745EDCD1EF33ECB93B0B6EBA5671E7CA
0.0707%
34
Uniswap V3 (Arbitrum One)
0X5979D7B546E38E414F7E9822514BE443A4800529-0XEC70DCB4A1EFA46B8F2D97C310C9C4790BA5FFA8$3,177.71
1.1040190 Eth
$36.74
0.011 0X5979D7B546E38E414F7E9822514BE443A4800529
0.0000%
35
Carbon
0XEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE-0XAE78736CD615F374D3085123A210448E74FC6393$3,211.61
1.0980140 Eth
$27.25
0.009 0XEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
0.0000%
36
Uniswap V3 (Polygon)
0X0266F4F08D82372CF0FCBCCC0FF74309089C74D1-0X7CEB23FD6BC0ADD59E62AC25578270CFF1B9F619$3,314.86
1.1110940 Eth
$22.79
0.007 0X0266F4F08D82372CF0FCBCCC0FF74309089C74D1
0.0000%
37
Uniswap V3 (Polygon)
0X0266F4F08D82372CF0FCBCCC0FF74309089C74D1-0X03B54A6E9A984069379FAE1A4FC4DBAE93B3BCCD$3,318.97
1.1124710 Eth
$20.34
0.006 0X0266F4F08D82372CF0FCBCCC0FF74309089C74D1
0.0000%
38
Balancer V2
0X3472A5A71965499ACD81997A54BBA8D852C6E53D-0XAE78736CD615F374D3085123A210448E74FC6393$3,547.78
1.1049430 Eth
$13.08
3.023 0X3472A5A71965499ACD81997A54BBA8D852C6E53D
0.0088%
39
Balancer V2
0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0-0XAE78736CD615F374D3085123A210448E74FC6393$3,589.18
1.1046940 Eth
$11.14
0.003 0X7F39C581F595B53C5CB19BD0B3F8DA6C935E2CA0
0.0000%
40
Uniswap V3 (Optimism)
0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D-0X68F180FCCE6836688E9084F035309E29BF0A2095$3,275.51
1.0979060 Eth
$7.46
0.002 0X9BCEF72BE871E61ED4FBBC7630889BEE758EB81D
0.0000%

Contract Source Code Verified (Exact Match)

Contract Name:
RocketTokenRETH

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 15000 runs

Other Settings:
default evmVersion, GNU GPLv3 license
File 1 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 11 : ERC20.sol
// 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 { }
}

File 3 of 11 : IERC20.sol
// 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);
}

File 4 of 11 : Context.sol
// 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;
    }
}

File 5 of 11 : RocketBase.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |    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); }
}

File 6 of 11 : RocketTokenRETH.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |    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);
            }
        }
    }
}

File 7 of 11 : RocketStorageInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |    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;
}

File 8 of 11 : RocketDAOProtocolSettingsNetworkInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |    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);
}

File 9 of 11 : RocketDepositPoolInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |    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);
}

File 10 of 11 : RocketNetworkBalancesInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |    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;
}

File 11 of 11 : RocketTokenRETHInterface.sol
/**
  *       .
  *      / \
  *     |.'.|
  *     |'.'|
  *   ,'|   |`.
  *  |,-'-|-'-.|
  *   __|_| |         _        _      _____           _
  *  | ___ \|        | |      | |    | ___ \         | |
  *  | |_/ /|__   ___| | _____| |_   | |_/ /__   ___ | |
  *  |    // _ \ / __| |/ / _ \ __|  |  __/ _ \ / _ \| |
  *  | |\ \ (_) | (__|   <  __/ |_   | | | (_) | (_) | |
  *  \_| \_\___/ \___|_|\_\___|\__|  \_|  \___/ \___/|_|
  * +---------------------------------------------------+
  * |    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;
}

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

Contract Security Audit

Contract ABI

[{"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"}]

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
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.