Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
||||
---|---|---|---|---|---|---|---|---|
Get Length | 22244104 | 1 hr ago | 0 ETH | |||||
Get Address | 22244104 | 1 hr ago | 0 ETH | |||||
Get Full Deposit... | 22244104 | 1 hr ago | 0 ETH | |||||
Get Length | 22244104 | 1 hr ago | 0 ETH | |||||
Get Address | 22244104 | 1 hr ago | 0 ETH | |||||
Get Half Deposit... | 22244104 | 1 hr ago | 0 ETH | |||||
Get Length | 22244104 | 1 hr ago | 0 ETH | |||||
Get Address | 22244104 | 1 hr ago | 0 ETH | |||||
Get Variable Dep... | 22244104 | 1 hr ago | 0 ETH | |||||
Get Address | 22244104 | 1 hr ago | 0 ETH | |||||
Get Address | 22244104 | 1 hr ago | 0 ETH | |||||
Get Effective Ca... | 22244104 | 1 hr ago | 0 ETH | |||||
Get Length | 22244056 | 1 hr ago | 0 ETH | |||||
Get Address | 22244056 | 1 hr ago | 0 ETH | |||||
Get Full Deposit... | 22244056 | 1 hr ago | 0 ETH | |||||
Get Length | 22244056 | 1 hr ago | 0 ETH | |||||
Get Address | 22244056 | 1 hr ago | 0 ETH | |||||
Get Half Deposit... | 22244056 | 1 hr ago | 0 ETH | |||||
Get Length | 22244056 | 1 hr ago | 0 ETH | |||||
Get Address | 22244056 | 1 hr ago | 0 ETH | |||||
Get Variable Dep... | 22244056 | 1 hr ago | 0 ETH | |||||
Get Address | 22244056 | 1 hr ago | 0 ETH | |||||
Get Address | 22244056 | 1 hr ago | 0 ETH | |||||
Get Effective Ca... | 22244056 | 1 hr ago | 0 ETH | |||||
Get Length | 22243194 | 4 hrs ago | 0 ETH |
Loading...
Loading
Contract Name:
RocketMinipoolQueue
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Standard Json-Input format)
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * For more information about Rocket Pool, visit https://rocketpool.net * * Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty * */ // SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.7.6; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/math/SignedSafeMath.sol"; import "@openzeppelin/contracts/utils/SafeCast.sol"; import "../RocketBase.sol"; import "../../interface/minipool/RocketMinipoolInterface.sol"; import "../../interface/minipool/RocketMinipoolQueueInterface.sol"; import "../../interface/dao/protocol/settings/RocketDAOProtocolSettingsMinipoolInterface.sol"; import "../../interface/util/AddressQueueStorageInterface.sol"; import "../../types/MinipoolDeposit.sol"; /// @notice Minipool queueing for deposit assignment contract RocketMinipoolQueue is RocketBase, RocketMinipoolQueueInterface { // Libs using SafeMath for uint; using SignedSafeMath for int; // Constants bytes32 private constant queueKeyFull = keccak256("minipools.available.full"); bytes32 private constant queueKeyHalf = keccak256("minipools.available.half"); bytes32 private constant queueKeyVariable = keccak256("minipools.available.variable"); // Events event MinipoolEnqueued(address indexed minipool, bytes32 indexed queueId, uint256 time); event MinipoolDequeued(address indexed minipool, bytes32 indexed queueId, uint256 time); event MinipoolRemoved(address indexed minipool, bytes32 indexed queueId, uint256 time); constructor(RocketStorageInterface _rocketStorageAddress) RocketBase(_rocketStorageAddress) { version = 2; } /// @notice Get the total combined length of the queues function getTotalLength() override external view returns (uint256) { return ( getLengthLegacy(queueKeyFull) ).add( getLengthLegacy(queueKeyHalf) ).add( getLength() ); } /// @notice Returns true if there are any legacy minipools in the queue function getContainsLegacy() override external view returns (bool) { return getLengthLegacy(queueKeyFull).add(getLengthLegacy(queueKeyHalf)) > 0; } /// @notice Get the length of a given queue. Returns 0 for invalid queues /// @param _depositType Which queue to query the length of function getLengthLegacy(MinipoolDeposit _depositType) override external view returns (uint256) { if (_depositType == MinipoolDeposit.Full) { return getLengthLegacy(queueKeyFull); } if (_depositType == MinipoolDeposit.Half) { return getLengthLegacy(queueKeyHalf); } return 0; } /// @dev Returns a queue length by internal key representation /// @param _key The internal key representation of the queue to query the length of function getLengthLegacy(bytes32 _key) private view returns (uint256) { AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage")); return addressQueueStorage.getLength(_key); } /// @notice Gets the length of the variable (global) queue function getLength() override public view returns (uint256) { AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage")); return addressQueueStorage.getLength(queueKeyVariable); } /// @notice Get the total combined capacity of the queues function getTotalCapacity() override external view returns (uint256) { RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool")); return ( getLengthLegacy(queueKeyFull).mul(rocketDAOProtocolSettingsMinipool.getFullDepositUserAmount()) ).add( getLengthLegacy(queueKeyHalf).mul(rocketDAOProtocolSettingsMinipool.getHalfDepositUserAmount()) ).add( getVariableCapacity() ); } /// @notice Get the total effective capacity of the queues (used in node demand calculation) function getEffectiveCapacity() override external view returns (uint256) { RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool")); return ( getLengthLegacy(queueKeyFull).mul(rocketDAOProtocolSettingsMinipool.getFullDepositUserAmount()) ).add( getLengthLegacy(queueKeyHalf).mul(rocketDAOProtocolSettingsMinipool.getHalfDepositUserAmount()) ).add( getVariableCapacity() ); } /// @dev Get the ETH capacity of the variable queue function getVariableCapacity() internal view returns (uint256) { RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool")); return getLength().mul(rocketDAOProtocolSettingsMinipool.getVariableDepositAmount()); } /// @notice Get the capacity of the next available minipool. Returns 0 if no minipools are available function getNextCapacityLegacy() override external view returns (uint256) { RocketDAOProtocolSettingsMinipoolInterface rocketDAOProtocolSettingsMinipool = RocketDAOProtocolSettingsMinipoolInterface(getContractAddress("rocketDAOProtocolSettingsMinipool")); if (getLengthLegacy(queueKeyHalf) > 0) { return rocketDAOProtocolSettingsMinipool.getHalfDepositUserAmount(); } if (getLengthLegacy(queueKeyFull) > 0) { return rocketDAOProtocolSettingsMinipool.getFullDepositUserAmount(); } return 0; } /// @notice Get the deposit type of the next available minipool and the number of deposits in that queue. /// Returns None if no minipools are available function getNextDepositLegacy() override external view returns (MinipoolDeposit, uint256) { uint256 length = getLengthLegacy(queueKeyHalf); if (length > 0) { return (MinipoolDeposit.Half, length); } length = getLengthLegacy(queueKeyFull); if (length > 0) { return (MinipoolDeposit.Full, length); } return (MinipoolDeposit.None, 0); } /// @dev Add a minipool to the end of the appropriate queue. Only accepts calls from the RocketMinipoolManager contract /// @param _minipool Address of the minipool to add to the queue function enqueueMinipool(address _minipool) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyLatestContract("rocketNodeDeposit", msg.sender) { // Enqueue AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage")); addressQueueStorage.enqueueItem(queueKeyVariable, _minipool); // Emit enqueued event emit MinipoolEnqueued(_minipool, queueKeyVariable, block.timestamp); } /// @dev Dequeues a minipool from a legacy queue /// @param _depositType The queue to dequeue a minipool from function dequeueMinipoolByDepositLegacy(MinipoolDeposit _depositType) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyLatestContract("rocketDepositPool", msg.sender) returns (address minipoolAddress) { if (_depositType == MinipoolDeposit.Half) { return dequeueMinipool(queueKeyHalf); } if (_depositType == MinipoolDeposit.Full) { return dequeueMinipool(queueKeyFull); } require(false, "No minipools are available"); } /// @dev Dequeues multiple minipools from the variable queue and returns them all /// @param _maxToDequeue The maximum number of items to dequeue function dequeueMinipools(uint256 _maxToDequeue) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyLatestContract("rocketDepositPool", msg.sender) returns (address[] memory minipoolAddress) { uint256 queueLength = getLength(); uint256 count = _maxToDequeue; if (count > queueLength) { count = queueLength; } address[] memory minipoolAddresses = new address[](count); for (uint256 i = 0; i < count; i++) { RocketMinipoolInterface minipool = RocketMinipoolInterface(dequeueMinipool(queueKeyVariable)); minipoolAddresses[i] = address(minipool); } return minipoolAddresses; } /// @dev Dequeues a minipool from a queue given an internal key /// @param _key The internal key representation of the queue from which to dequeue a minipool from function dequeueMinipool(bytes32 _key) private returns (address) { // Dequeue AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage")); address minipool = addressQueueStorage.dequeueItem(_key); // Emit dequeued event emit MinipoolDequeued(minipool, _key, block.timestamp); // Return return minipool; } /// @dev Remove a minipool from a queue. Only accepts calls from registered minipools function removeMinipool(MinipoolDeposit _depositType) override external onlyLatestContract("rocketMinipoolQueue", address(this)) onlyRegisteredMinipool(msg.sender) { // Remove minipool from queue if (_depositType == MinipoolDeposit.Half) { return removeMinipool(queueKeyHalf, msg.sender); } if (_depositType == MinipoolDeposit.Full) { return removeMinipool(queueKeyFull, msg.sender); } if (_depositType == MinipoolDeposit.Variable) { return removeMinipool(queueKeyVariable, msg.sender); } require(false, "Invalid minipool deposit type"); } /// @dev Removes a minipool from a queue given an internal key /// @param _key The internal key representation of the queue from which to remove a minipool from /// @param _minipool The address of a minipool to remove from the specified queue function removeMinipool(bytes32 _key, address _minipool) private { // Remove AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage")); addressQueueStorage.removeItem(_key, _minipool); // Emit removed event emit MinipoolRemoved(_minipool, _key, block.timestamp); } /// @notice Returns the minipool address of the minipool in the global queue at a given index /// @param _index The index into the queue to retrieve function getMinipoolAt(uint256 _index) override external view returns(address) { AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage")); // Check if index is in the half queue uint256 halfLength = addressQueueStorage.getLength(queueKeyHalf); if (_index < halfLength) { return addressQueueStorage.getItem(queueKeyHalf, _index); } _index = _index.sub(halfLength); // Check if index is in the full queue uint256 fullLength = addressQueueStorage.getLength(queueKeyFull); if (_index < fullLength) { return addressQueueStorage.getItem(queueKeyFull, _index); } _index = _index.sub(fullLength); // Check if index is in the full queue uint256 variableLength = addressQueueStorage.getLength(queueKeyVariable); if (_index < variableLength) { return addressQueueStorage.getItem(queueKeyVariable, _index); } // Index is out of bounds return address(0); } /// @notice Returns the position a given minipool is in the queue /// @param _minipool The minipool to query the position of function getMinipoolPosition(address _minipool) override external view returns (int256) { AddressQueueStorageInterface addressQueueStorage = AddressQueueStorageInterface(getContractAddress("addressQueueStorage")); int256 position; // Check in half queue position = addressQueueStorage.getIndexOf(queueKeyHalf, _minipool); if (position != -1) { return position; } int256 offset = SafeCast.toInt256(addressQueueStorage.getLength(queueKeyHalf)); // Check in full queue position = addressQueueStorage.getIndexOf(queueKeyFull, _minipool); if (position != -1) { return offset.add(position); } offset = offset.add(SafeCast.toInt256(addressQueueStorage.getLength(queueKeyFull))); // Check in variable queue position = addressQueueStorage.getIndexOf(queueKeyVariable, _minipool); if (position != -1) { return offset.add(position); } // Isn't in the queue return -1; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @title SignedSafeMath * @dev Signed math operations with safety checks that revert on error. */ library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // 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 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed integers. Reverts 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(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such 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. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= -2**127 && value < 2**127, "SafeCast: value doesn\'t fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= -2**63 && value < 2**63, "SafeCast: value doesn\'t fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= -2**31 && value < 2**31, "SafeCast: value doesn\'t fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= -2**15 && value < 2**15, "SafeCast: value doesn\'t fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= -2**7 && value < 2**7, "SafeCast: value doesn\'t fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { require(value < 2**255, "SafeCast: value doesn't fit in an int256"); return int256(value); } }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * 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.5.0 <0.9.0; // SPDX-License-Identifier: GPL-3.0-only interface RocketStorageInterface { // Deploy status function getDeployedStatus() external view returns (bool); // Guardian function getGuardian() external view returns(address); function setGuardian(address _newAddress) external; function confirmGuardian() external; // Getters function getAddress(bytes32 _key) external view returns (address); function getUint(bytes32 _key) external view returns (uint); function getString(bytes32 _key) external view returns (string memory); function getBytes(bytes32 _key) external view returns (bytes memory); function getBool(bytes32 _key) external view returns (bool); function getInt(bytes32 _key) external view returns (int); function getBytes32(bytes32 _key) external view returns (bytes32); // Setters function setAddress(bytes32 _key, address _value) external; function setUint(bytes32 _key, uint _value) external; function setString(bytes32 _key, string calldata _value) external; function setBytes(bytes32 _key, bytes calldata _value) external; function setBool(bytes32 _key, bool _value) external; function setInt(bytes32 _key, int _value) external; function setBytes32(bytes32 _key, bytes32 _value) external; // Deleters function deleteAddress(bytes32 _key) external; function deleteUint(bytes32 _key) external; function deleteString(bytes32 _key) external; function deleteBytes(bytes32 _key) external; function deleteBool(bytes32 _key) external; function deleteInt(bytes32 _key) external; function deleteBytes32(bytes32 _key) external; // Arithmetic function addUint(bytes32 _key, uint256 _amount) external; function subUint(bytes32 _key, uint256 _amount) external; // Protected storage function getNodeWithdrawalAddress(address _nodeAddress) external view returns (address); function getNodePendingWithdrawalAddress(address _nodeAddress) external view returns (address); function setWithdrawalAddress(address _nodeAddress, address _newWithdrawalAddress, bool _confirm) external; function confirmWithdrawalAddress(address _nodeAddress) external; }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * For more information about Rocket Pool, visit https://rocketpool.net * * Authors: David Rugendyke, Jake Pospischil, Kane Wallmann, Darren Langley, Joe Clapis, Nick Doherty * */ pragma solidity 0.7.6; // SPDX-License-Identifier: GPL-3.0-only import "../interface/RocketStorageInterface.sol"; /// @title Base settings / modifiers for each contract in Rocket Pool /// @author David Rugendyke abstract contract RocketBase { // Calculate using this as the base uint256 constant calcBase = 1 ether; // Version of the contract uint8 public version; // The main storage contract where primary persistant storage is maintained RocketStorageInterface rocketStorage = RocketStorageInterface(0); /*** Modifiers **********************************************************/ /** * @dev Throws if called by any sender that doesn't match a Rocket Pool network contract */ modifier onlyLatestNetworkContract() { require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract"); _; } /** * @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract */ modifier onlyLatestContract(string memory _contractName, address _contractAddress) { require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract"); _; } /** * @dev Throws if called by any sender that isn't a registered node */ modifier onlyRegisteredNode(address _nodeAddress) { require(getBool(keccak256(abi.encodePacked("node.exists", _nodeAddress))), "Invalid node"); _; } /** * @dev Throws if called by any sender that isn't a trusted node DAO member */ modifier onlyTrustedNode(address _nodeAddress) { require(getBool(keccak256(abi.encodePacked("dao.trustednodes.", "member", _nodeAddress))), "Invalid trusted node"); _; } /** * @dev Throws if called by any sender that isn't a registered minipool */ modifier onlyRegisteredMinipool(address _minipoolAddress) { require(getBool(keccak256(abi.encodePacked("minipool.exists", _minipoolAddress))), "Invalid minipool"); _; } /** * @dev Throws if called by any account other than a guardian account (temporary account allowed access to settings before DAO is fully enabled) */ modifier onlyGuardian() { require(msg.sender == rocketStorage.getGuardian(), "Account is not a temporary guardian"); _; } /*** Methods **********************************************************/ /// @dev Set the main Rocket Storage address constructor(RocketStorageInterface _rocketStorageAddress) { // Update the contract address rocketStorage = RocketStorageInterface(_rocketStorageAddress); } /// @dev Get the address of a network contract by name function getContractAddress(string memory _contractName) internal view returns (address) { // Get the current contract address address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName))); // Check it require(contractAddress != address(0x0), "Contract not found"); // Return return contractAddress; } /// @dev Get the address of a network contract by name (returns address(0x0) instead of reverting if contract does not exist) function getContractAddressUnsafe(string memory _contractName) internal view returns (address) { // Get the current contract address address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName))); // Return return contractAddress; } /// @dev Get the name of a network contract by address function getContractName(address _contractAddress) internal view returns (string memory) { // Get the contract name string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress))); // Check it require(bytes(contractName).length > 0, "Contract not found"); // Return return contractName; } /// @dev Get revert error message from a .call method function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } /*** Rocket Storage Methods ****************************************/ // Note: Unused helpers have been removed to keep contract sizes down /// @dev Storage get methods function getAddress(bytes32 _key) internal view returns (address) { return rocketStorage.getAddress(_key); } function getUint(bytes32 _key) internal view returns (uint) { return rocketStorage.getUint(_key); } function getString(bytes32 _key) internal view returns (string memory) { return rocketStorage.getString(_key); } function getBytes(bytes32 _key) internal view returns (bytes memory) { return rocketStorage.getBytes(_key); } function getBool(bytes32 _key) internal view returns (bool) { return rocketStorage.getBool(_key); } function getInt(bytes32 _key) internal view returns (int) { return rocketStorage.getInt(_key); } function getBytes32(bytes32 _key) internal view returns (bytes32) { return rocketStorage.getBytes32(_key); } /// @dev Storage set methods function setAddress(bytes32 _key, address _value) internal { rocketStorage.setAddress(_key, _value); } function setUint(bytes32 _key, uint _value) internal { rocketStorage.setUint(_key, _value); } function setString(bytes32 _key, string memory _value) internal { rocketStorage.setString(_key, _value); } function setBytes(bytes32 _key, bytes memory _value) internal { rocketStorage.setBytes(_key, _value); } function setBool(bytes32 _key, bool _value) internal { rocketStorage.setBool(_key, _value); } function setInt(bytes32 _key, int _value) internal { rocketStorage.setInt(_key, _value); } function setBytes32(bytes32 _key, bytes32 _value) internal { rocketStorage.setBytes32(_key, _value); } /// @dev Storage delete methods function deleteAddress(bytes32 _key) internal { rocketStorage.deleteAddress(_key); } function deleteUint(bytes32 _key) internal { rocketStorage.deleteUint(_key); } function deleteString(bytes32 _key) internal { rocketStorage.deleteString(_key); } function deleteBytes(bytes32 _key) internal { rocketStorage.deleteBytes(_key); } function deleteBool(bytes32 _key) internal { rocketStorage.deleteBool(_key); } function deleteInt(bytes32 _key) internal { rocketStorage.deleteInt(_key); } function deleteBytes32(bytes32 _key) internal { rocketStorage.deleteBytes32(_key); } /// @dev Storage arithmetic methods function addUint(bytes32 _key, uint256 _amount) internal { rocketStorage.addUint(_key, _amount); } function subUint(bytes32 _key, uint256 _amount) internal { rocketStorage.subUint(_key, _amount); } }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * 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 // Represents the type of deposits required by a minipool enum MinipoolDeposit { None, // Marks an invalid deposit type Full, // The minipool requires 32 ETH from the node operator, 16 ETH of which will be refinanced from user deposits Half, // The minipool required 16 ETH from the node operator to be matched with 16 ETH from user deposits Empty, // The minipool requires 0 ETH from the node operator to be matched with 32 ETH from user deposits (trusted nodes only) Variable // Indicates this minipool is of the new generation that supports a variable deposit amount }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * 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 // Represents a minipool's status within the network enum MinipoolStatus { Initialised, // The minipool has been initialised and is awaiting a deposit of user ETH Prelaunch, // The minipool has enough ETH to begin staking and is awaiting launch by the node operator Staking, // The minipool is currently staking Withdrawable, // NO LONGER USED Dissolved // The minipool has been dissolved and its user deposited ETH has been returned to the deposit pool }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * 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.5.0 <0.9.0; // SPDX-License-Identifier: GPL-3.0-only import "../../types/MinipoolDeposit.sol"; import "../../types/MinipoolStatus.sol"; import "../RocketStorageInterface.sol"; interface RocketMinipoolInterface { function version() external view returns (uint8); function initialise(address _nodeAddress) external; function getStatus() external view returns (MinipoolStatus); function getFinalised() external view returns (bool); function getStatusBlock() external view returns (uint256); function getStatusTime() external view returns (uint256); function getScrubVoted(address _member) external view returns (bool); function getDepositType() external view returns (MinipoolDeposit); function getNodeAddress() external view returns (address); function getNodeFee() external view returns (uint256); function getNodeDepositBalance() external view returns (uint256); function getNodeRefundBalance() external view returns (uint256); function getNodeDepositAssigned() external view returns (bool); function getPreLaunchValue() external view returns (uint256); function getNodeTopUpValue() external view returns (uint256); function getVacant() external view returns (bool); function getPreMigrationBalance() external view returns (uint256); function getUserDistributed() external view returns (bool); function getUserDepositBalance() external view returns (uint256); function getUserDepositAssigned() external view returns (bool); function getUserDepositAssignedTime() external view returns (uint256); function getTotalScrubVotes() external view returns (uint256); function calculateNodeShare(uint256 _balance) external view returns (uint256); function calculateUserShare(uint256 _balance) external view returns (uint256); function preDeposit(uint256 _bondingValue, bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) external payable; function deposit() external payable; function userDeposit() external payable; function distributeBalance(bool _rewardsOnly) external; function beginUserDistribute() external; function userDistributeAllowed() external view returns (bool); function refund() external; function slash() external; function finalise() external; function canStake() external view returns (bool); function canPromote() external view returns (bool); function stake(bytes calldata _validatorSignature, bytes32 _depositDataRoot) external; function prepareVacancy(uint256 _bondAmount, uint256 _currentBalance) external; function promote() external; function dissolve() external; function close() external; function voteScrub() external; function reduceBondAmount() external; }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * 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.5.0 <0.9.0; // SPDX-License-Identifier: GPL-3.0-only import "../../types/MinipoolDeposit.sol"; interface RocketMinipoolQueueInterface { function getTotalLength() external view returns (uint256); function getContainsLegacy() external view returns (bool); function getLengthLegacy(MinipoolDeposit _depositType) external view returns (uint256); function getLength() external view returns (uint256); function getTotalCapacity() external view returns (uint256); function getEffectiveCapacity() external view returns (uint256); function getNextCapacityLegacy() external view returns (uint256); function getNextDepositLegacy() external view returns (MinipoolDeposit, uint256); function enqueueMinipool(address _minipool) external; function dequeueMinipoolByDepositLegacy(MinipoolDeposit _depositType) external returns (address minipoolAddress); function dequeueMinipools(uint256 _maxToDequeue) external returns (address[] memory minipoolAddress); function removeMinipool(MinipoolDeposit _depositType) external; function getMinipoolAt(uint256 _index) external view returns(address); function getMinipoolPosition(address _minipool) external view returns (int256); }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * 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.5.0 <0.9.0; // SPDX-License-Identifier: GPL-3.0-only import "../../../../types/MinipoolDeposit.sol"; interface RocketDAOProtocolSettingsMinipoolInterface { function getLaunchBalance() external view returns (uint256); function getPreLaunchValue() external pure returns (uint256); function getDepositUserAmount(MinipoolDeposit _depositType) external view returns (uint256); function getFullDepositUserAmount() external view returns (uint256); function getHalfDepositUserAmount() external view returns (uint256); function getVariableDepositAmount() external view returns (uint256); function getSubmitWithdrawableEnabled() external view returns (bool); function getBondReductionEnabled() external view returns (bool); function getLaunchTimeout() external view returns (uint256); function getMaximumCount() external view returns (uint256); function isWithinUserDistributeWindow(uint256 _time) external view returns (bool); function hasUserDistributeWindowPassed(uint256 _time) external view returns (bool); function getUserDistributeWindowStart() external view returns (uint256); function getUserDistributeWindowLength() external view returns (uint256); }
/** * . * / \ * |.'.| * |'.'| * ,'| |`. * |,-'-|-'-.| * __|_| | _ _ _____ _ * | ___ \| | | | | | ___ \ | | * | |_/ /|__ ___| | _____| |_ | |_/ /__ ___ | | * | // _ \ / __| |/ / _ \ __| | __/ _ \ / _ \| | * | |\ \ (_) | (__| < __/ |_ | | | (_) | (_) | | * \_| \_\___/ \___|_|\_\___|\__| \_| \___/ \___/|_| * +---------------------------------------------------+ * | DECENTRALISED STAKING PROTOCOL FOR ETHEREUM 2.0 | * +---------------------------------------------------+ * * Rocket Pool is a first-of-its-kind ETH2 Proof of Stake protocol, designed to be community owned, * decentralised, trustless and compatible with staking in Ethereum 2.0. * * 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.5.0 <0.9.0; // SPDX-License-Identifier: GPL-3.0-only interface AddressQueueStorageInterface { function getLength(bytes32 _key) external view returns (uint); function getItem(bytes32 _key, uint _index) external view returns (address); function getIndexOf(bytes32 _key, address _value) external view returns (int); function enqueueItem(bytes32 _key, address _value) external; function dequeueItem(bytes32 _key) external returns (address); function removeItem(bytes32 _key, address _value) external; }
{ "optimizer": { "enabled": true, "runs": 15000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract RocketStorageInterface","name":"_rocketStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minipool","type":"address"},{"indexed":true,"internalType":"bytes32","name":"queueId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"MinipoolDequeued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minipool","type":"address"},{"indexed":true,"internalType":"bytes32","name":"queueId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"MinipoolEnqueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minipool","type":"address"},{"indexed":true,"internalType":"bytes32","name":"queueId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"MinipoolRemoved","type":"event"},{"inputs":[{"internalType":"enum MinipoolDeposit","name":"_depositType","type":"uint8"}],"name":"dequeueMinipoolByDepositLegacy","outputs":[{"internalType":"address","name":"minipoolAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxToDequeue","type":"uint256"}],"name":"dequeueMinipools","outputs":[{"internalType":"address[]","name":"minipoolAddress","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minipool","type":"address"}],"name":"enqueueMinipool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContainsLegacy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEffectiveCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum MinipoolDeposit","name":"_depositType","type":"uint8"}],"name":"getLengthLegacy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getMinipoolAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minipool","type":"address"}],"name":"getMinipoolPosition","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextCapacityLegacy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextDepositLegacy","outputs":[{"internalType":"enum MinipoolDeposit","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum MinipoolDeposit","name":"_depositType","type":"uint8"}],"name":"removeMinipool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260008054610100600160a81b031916905534801561002157600080fd5b506040516128483803806128488339818101604052602081101561004457600080fd5b50516000805460ff196001600160a01b0390931661010002610100600160a81b0319909116179190911660021790556127c6806100826000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80637e0e497b11610097578063de1bdc8f11610066578063de1bdc8f1461028b578063e60b40bf146101ac578063e99f75c8146102ab578063eff7319f146102f4576100f5565b80637e0e497b146101f257806380d8ad9c1461025f5780638ed8045314610267578063be1c766b14610283576100f5565b80632f3eb409116100d35780632f3eb40914610177578063442c18f3146101ac57806354fd4d50146101b45780635e83d2d7146101d2576100f5565b8063043887b4146100fa57806304b5466b1461013f57806323b9eec01461016f575b600080fd5b61012d6004803603602081101561011057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610311565b60408051918252519081900360200190f35b61014761077e565b6040518083600481111561015757fe5b81526020018281526020019250505060405180910390f35b61012d610808565b6101aa6004803603602081101561018d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610876565b005b61012d610c71565b6101bc610ded565b6040805160ff9092168252519081900360200190f35b61012d600480360360208110156101e857600080fd5b503560ff16610df6565b61020f6004803603602081101561020857600080fd5b5035610e81565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561024b578181015183820152602001610233565b505050509050019250505060405180910390f35b61012d6111bd565b61026f61130e565b604080519115158252519081900360200190f35b61012d611343565b6101aa600480360360208110156102a157600080fd5b503560ff16611429565b6102cb600480360360208110156102c157600080fd5b503560ff16611746565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102cb6004803603602081101561030a57600080fd5b5035611a8a565b6000806103526040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff166368ee92c97f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d602081101561040f57600080fd5b505190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146104435791506107799050565b60006104ea8373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b505afa1580156104cd573d6000803e3d6000fd5b505050506040513d60208110156104e357600080fd5b5051611fe6565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561057b57600080fd5b505afa15801561058f573d6000803e3d6000fd5b505050506040513d60208110156105a557600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146105e4576105da8183612064565b9350505050610779565b61066261065b8473ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b8290612064565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d602081101561071d57600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214610752576105da8183612064565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93505050505b919050565b60008060006107ac7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b905080156107bf57600292509050610804565b6107e87f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b905080156107fb57600192509050610804565b60008092509250505b9091565b6000610870610815611343565b61086a6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b61086a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b906121b1565b90505b90565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c5175657565000000000000000000000000008152503061094b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090b5780518252601f1990920191602091820191016108ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612225565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744e6f64654465706f73697400000000000000000000000000000081525033610a788260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6000610b516040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff166380323a467fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610be457600080fd5b505af1158015610bf8573d6000803e3d6000fd5b50506040805142815290517fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca935073ffffffffffffffffffffffffffffffffffffffff8a1692507fbb0085efc3718b7af2204fd1f1fda8ef9d3fbaa40f8fc7f4b04ae90d692e4fca9181900360200190a3505050505050565b600080610c9560405180606001604052806021815260200161272760219139611efc565b9050610de7610ca26122cb565b61086a610d498473ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b5051610d437f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b9061236e565b61086a8573ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9257600080fd5b505afa158015610da6573d6000803e3d6000fd5b505050506040513d6020811015610dbc57600080fd5b5051610d437f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b91505090565b60005460ff1681565b60006001826004811115610e0657fe5b1415610e3c57610e357f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b9050610779565b6002826004811115610e4a57fe5b1415610e7957610e357f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b506000919050565b60606040518060400160405280601381526020017f726f636b65744d696e69706f6f6c51756575650000000000000000000000000081525030610f178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336110448260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60006110e7611343565b905086818111156110f55750805b60008167ffffffffffffffff8111801561110e57600080fd5b50604051908082528060200260200182016040528015611138578160200160208202803683370190505b50905060005b828110156111ae5760006111717fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6123e1565b90508083838151811061118057fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525060010161113e565b50965050505b50505050919050565b6000806111e160405180606001604052806021815260200161272760219139611efc565b9050600061120e7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b111561128f578073ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b505afa15801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b505191506108739050565b60006112ba7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b1115611306578073ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b600091505090565b60008061133d6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b11905090565b6000806113846040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b505191505090565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306114bd8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461155657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b604080517f6d696e69706f6f6c2e657869737473000000000000000000000000000000000060208083019190915233606081901b602f84015283516023818503018152604390930190935281519101206115af906124fd565b61161a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964206d696e69706f6f6c00000000000000000000000000000000604482015290519081900360640190fd5b600284600481111561162857fe5b141561165d576116587f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb896621818833612571565b611740565b600184600481111561166b57fe5b141561169b576116587f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff7833612571565b60048460048111156116a957fe5b14156116d9576116587fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca33612571565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c6964206d696e69706f6f6c206465706f7369742074797065000000604482015290519081900360640190fd5b50505050565b60006040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306117dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461187557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336119098260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60028660048111156119b057fe5b14156119e6576119df7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886123e1565b94506111b4565b60018660048111156119f457fe5b1415611a23576119df7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786123e1565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f206d696e69706f6f6c732061726520617661696c61626c65000000000000604482015290519081900360640190fd5b600080611acb6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611b4057600080fd5b505afa158015611b54573d6000803e3d6000fd5b505050506040513d6020811015611b6a57600080fd5b5051905080841015611c25578173ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d6020811015611c1957600080fd5b50519250610779915050565b611c2f848261268e565b935060008273ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d6020811015611cce57600080fd5b5051905080851015611d8a578273ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051935061077992505050565b611d94858261268e565b945060008373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e0957600080fd5b505afa158015611e1d573d6000803e3d6000fd5b505050506040513d6020811015611e3357600080fd5b5051905080861015611ef0578373ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611eb857600080fd5b505afa158015611ecc573d6000803e3d6000fd5b505050506040513d6020811015611ee257600080fd5b505194506107799350505050565b50600095945050505050565b600080611f5c8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b905073ffffffffffffffffffffffffffffffffffffffff8116611fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e640000000000000000000000000000604482015290519081900360640190fd5b92915050565b60007f80000000000000000000000000000000000000000000000000000000000000008210612060576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806127696028913960400191505060405180910390fd5b5090565b60008282018183128015906120795750838112155b8061208e575060008312801561208e57508381125b6120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127066021913960400191505060405180910390fd5b9392505050565b60008061212b6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561217e57600080fd5b505afa158015612192573d6000803e3d6000fd5b505050506040513d60208110156121a857600080fd5b50519392505050565b6000828201838110156120e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b505afa1580156122ad573d6000803e3d6000fd5b505050506040513d60208110156122c357600080fd5b505192915050565b6000806122ef60405180606001604052806021815260200161272760219139611efc565b9050610de78173ffffffffffffffffffffffffffffffffffffffff16633469f7b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051610d43611343565b60008261237d57506000611fe0565b8282028284828161238a57fe5b04146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127486021913960400191505060405180910390fd5b6000806124226040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663dc5be997856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b505050506040513d60208110156124a357600080fd5b5051604080514281529051919250859173ffffffffffffffffffffffffffffffffffffffff8416917fc7d9de0aecd8d5829d96dfdb22c26b4625da22c5098c557e8b034a58015f189a919081900360200190a39392505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b60006125b16040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663f79b36ad84846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505060408051428152905186935073ffffffffffffffffffffffffffffffffffffffff861692507fb6d64f28f41bc6e066bffb445f6bc0fd239b21ec1f771ce451fad263637be4b49181900360200190a3505050565b6000828211156126ff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77726f636b657444414f50726f746f636f6c53657474696e67734d696e69706f6f6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e74323536a26469706673582212205d26846ed29ad9feac2251891ab57b112c12d1879ca7d668aaea01eb2e24bae164736f6c634300070600330000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80637e0e497b11610097578063de1bdc8f11610066578063de1bdc8f1461028b578063e60b40bf146101ac578063e99f75c8146102ab578063eff7319f146102f4576100f5565b80637e0e497b146101f257806380d8ad9c1461025f5780638ed8045314610267578063be1c766b14610283576100f5565b80632f3eb409116100d35780632f3eb40914610177578063442c18f3146101ac57806354fd4d50146101b45780635e83d2d7146101d2576100f5565b8063043887b4146100fa57806304b5466b1461013f57806323b9eec01461016f575b600080fd5b61012d6004803603602081101561011057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610311565b60408051918252519081900360200190f35b61014761077e565b6040518083600481111561015757fe5b81526020018281526020019250505060405180910390f35b61012d610808565b6101aa6004803603602081101561018d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610876565b005b61012d610c71565b6101bc610ded565b6040805160ff9092168252519081900360200190f35b61012d600480360360208110156101e857600080fd5b503560ff16610df6565b61020f6004803603602081101561020857600080fd5b5035610e81565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561024b578181015183820152602001610233565b505050509050019250505060405180910390f35b61012d6111bd565b61026f61130e565b604080519115158252519081900360200190f35b61012d611343565b6101aa600480360360208110156102a157600080fd5b503560ff16611429565b6102cb600480360360208110156102c157600080fd5b503560ff16611746565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102cb6004803603602081101561030a57600080fd5b5035611a8a565b6000806103526040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff166368ee92c97f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d602081101561040f57600080fd5b505190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146104435791506107799050565b60006104ea8373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b505afa1580156104cd573d6000803e3d6000fd5b505050506040513d60208110156104e357600080fd5b5051611fe6565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561057b57600080fd5b505afa15801561058f573d6000803e3d6000fd5b505050506040513d60208110156105a557600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82146105e4576105da8183612064565b9350505050610779565b61066261065b8473ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104b957600080fd5b8290612064565b90508273ffffffffffffffffffffffffffffffffffffffff166368ee92c97fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d602081101561071d57600080fd5b505191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214610752576105da8183612064565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff93505050505b919050565b60008060006107ac7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b905080156107bf57600292509050610804565b6107e87f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b905080156107fb57600192509050610804565b60008092509250505b9091565b6000610870610815611343565b61086a6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b61086a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b906121b1565b90505b90565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c5175657565000000000000000000000000008152503061094b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090b5780518252601f1990920191602091820191016108ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612225565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744e6f64654465706f73697400000000000000000000000000000081525033610a788260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6000610b516040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff166380323a467fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610be457600080fd5b505af1158015610bf8573d6000803e3d6000fd5b50506040805142815290517fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca935073ffffffffffffffffffffffffffffffffffffffff8a1692507fbb0085efc3718b7af2204fd1f1fda8ef9d3fbaa40f8fc7f4b04ae90d692e4fca9181900360200190a3505050505050565b600080610c9560405180606001604052806021815260200161272760219139611efc565b9050610de7610ca26122cb565b61086a610d498473ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b5051610d437f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b9061236e565b61086a8573ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9257600080fd5b505afa158015610da6573d6000803e3d6000fd5b505050506040513d6020811015610dbc57600080fd5b5051610d437f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b91505090565b60005460ff1681565b60006001826004811115610e0657fe5b1415610e3c57610e357f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b9050610779565b6002826004811115610e4a57fe5b1415610e7957610e357f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b506000919050565b60606040518060400160405280601381526020017f726f636b65744d696e69706f6f6c51756575650000000000000000000000000081525030610f178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336110448260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60006110e7611343565b905086818111156110f55750805b60008167ffffffffffffffff8111801561110e57600080fd5b50604051908082528060200260200182016040528015611138578160200160208202803683370190505b50905060005b828110156111ae5760006111717fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6123e1565b90508083838151811061118057fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525060010161113e565b50965050505b50505050919050565b6000806111e160405180606001604052806021815260200161272760219139611efc565b9050600061120e7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b111561128f578073ffffffffffffffffffffffffffffffffffffffff1663162adbfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b505afa15801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b505191506108739050565b60006112ba7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786120ea565b1115611306578073ffffffffffffffffffffffffffffffffffffffff1663cb316c3d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125a57600080fd5b600091505090565b60008061133d6108417f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886120ea565b11905090565b6000806113846040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b505191505090565b6040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306114bd8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461155657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b604080517f6d696e69706f6f6c2e657869737473000000000000000000000000000000000060208083019190915233606081901b602f84015283516023818503018152604390930190935281519101206115af906124fd565b61161a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964206d696e69706f6f6c00000000000000000000000000000000604482015290519081900360640190fd5b600284600481111561162857fe5b141561165d576116587f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb896621818833612571565b611740565b600184600481111561166b57fe5b141561169b576116587f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff7833612571565b60048460048111156116a957fe5b14156116d9576116587fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca33612571565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c6964206d696e69706f6f6c206465706f7369742074797065000000604482015290519081900360640190fd5b50505050565b60006040518060400160405280601381526020017f726f636b65744d696e69706f6f6c517565756500000000000000000000000000815250306117dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461187557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b6040518060400160405280601181526020017f726f636b65744465706f736974506f6f6c000000000000000000000000000000815250336119098260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964206f72206f7574646174656420636f6e747261637400000000604482015290519081900360640190fd5b60028660048111156119b057fe5b14156119e6576119df7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886123e1565b94506111b4565b60018660048111156119f457fe5b1415611a23576119df7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786123e1565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f206d696e69706f6f6c732061726520617661696c61626c65000000000000604482015290519081900360640190fd5b600080611acb6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb89662181886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611b4057600080fd5b505afa158015611b54573d6000803e3d6000fd5b505050506040513d6020811015611b6a57600080fd5b5051905080841015611c25578173ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f6eea9e53dc9c4fb5c4b0ba0e9db7370a823b1513965347e82945eb8966218188866040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d6020811015611c1957600080fd5b50519250610779915050565b611c2f848261268e565b935060008273ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff786040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d6020811015611cce57600080fd5b5051905080851015611d8a578273ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7f885adb3a1c7cf88a1f3627e1265f3090cd728e0fc96765288e91e8777267ff78876040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051935061077992505050565b611d94858261268e565b945060008373ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e0957600080fd5b505afa158015611e1d573d6000803e3d6000fd5b505050506040513d6020811015611e3357600080fd5b5051905080861015611ef0578373ffffffffffffffffffffffffffffffffffffffff1663f3358a3a7fa7c30d79bac38383b63cf527b2a68c8a7efff3ba22dfd5b81d98030643ef0fca886040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015611eb857600080fd5b505afa158015611ecc573d6000803e3d6000fd5b505050506040513d6020811015611ee257600080fd5b505194506107799350505050565b50600095945050505050565b600080611f5c8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083836020831061090b5780518252601f1990920191602091820191016108ec565b905073ffffffffffffffffffffffffffffffffffffffff8116611fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e640000000000000000000000000000604482015290519081900360640190fd5b92915050565b60007f80000000000000000000000000000000000000000000000000000000000000008210612060576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806127696028913960400191505060405180910390fd5b5090565b60008282018183128015906120795750838112155b8061208e575060008312801561208e57508381125b6120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127066021913960400191505060405180910390fd5b9392505050565b60008061212b6040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663fd82e9dd846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561217e57600080fd5b505afa158015612192573d6000803e3d6000fd5b505050506040513d60208110156121a857600080fd5b50519392505050565b6000828201838110156120e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b505afa1580156122ad573d6000803e3d6000fd5b505050506040513d60208110156122c357600080fd5b505192915050565b6000806122ef60405180606001604052806021815260200161272760219139611efc565b9050610de78173ffffffffffffffffffffffffffffffffffffffff16633469f7b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051610d43611343565b60008261237d57506000611fe0565b8282028284828161238a57fe5b04146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127486021913960400191505060405180910390fd5b6000806124226040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b905060008173ffffffffffffffffffffffffffffffffffffffff1663dc5be997856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b505050506040513d60208110156124a357600080fd5b5051604080514281529051919250859173ffffffffffffffffffffffffffffffffffffffff8416917fc7d9de0aecd8d5829d96dfdb22c26b4625da22c5098c557e8b034a58015f189a919081900360200190a39392505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561229957600080fd5b60006125b16040518060400160405280601381526020017f61646472657373517565756553746f7261676500000000000000000000000000815250611efc565b90508073ffffffffffffffffffffffffffffffffffffffff1663f79b36ad84846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505060408051428152905186935073ffffffffffffffffffffffffffffffffffffffff861692507fb6d64f28f41bc6e066bffb445f6bc0fd239b21ec1f771ce451fad263637be4b49181900360200190a3505050565b6000828211156126ff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77726f636b657444414f50726f746f636f6c53657474696e67734d696e69706f6f6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e74323536a26469706673582212205d26846ed29ad9feac2251891ab57b112c12d1879ca7d668aaea01eb2e24bae164736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46
-----Decoded View---------------
Arg [0] : _rocketStorageAddress (address): 0x1d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d8f8f00cfa6758d7be78336684788fb0ee0fa46
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.