1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- // SPDX-License-Identifier: MIT
- pragma solidity >=0.4.24 <0.7.0;
- /**
- * @title Initializable
- *
- * @dev Helper contract to support initializer functions. To use it, replace
- * the constructor with a function that has the `initializer` modifier.
- * WARNING: Unlike constructors, initializer functions must be manually
- * invoked. This applies both to deploying an Initializable contract, as well
- * as extending an Initializable contract via inheritance.
- * WARNING: When used with inheritance, manual care must be taken to not invoke
- * a parent initializer twice, or ensure that all initializers are idempotent,
- * because this is not dealt with automatically as with constructors.
- */
- contract Initializable {
- /**
- * @dev Indicates that the contract has been initialized.
- */
- bool private _initialized;
- /**
- * @dev Indicates that the contract is in the process of being initialized.
- */
- bool private _initializing;
- /**
- * @dev Modifier to use in the initializer function of a contract.
- */
- modifier initializer() {
- require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");
- bool isTopLevelCall = !_initializing;
- if (isTopLevelCall) {
- _initializing = true;
- _initialized = true;
- }
- _;
- if (isTopLevelCall) {
- _initializing = false;
- }
- }
- /// @dev Returns true if and only if the function is running in the constructor
- function _isConstructor() private view returns (bool) {
- // extcodesize checks the size of the code stored in an address, and
- // address returns the current address. Since the code is still not
- // deployed when running a constructor, any checks on its code size will
- // yield zero, making it an effective way to detect if a contract is
- // under construction or not.
- address self = address(this);
- uint256 cs;
- // solhint-disable-next-line no-inline-assembly
- assembly { cs := extcodesize(self) }
- return cs == 0;
- }
- }
|