mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
// SPDX-License-Identifier: agpl-3.0
 | 
						|
pragma solidity 0.6.8;
 | 
						|
 | 
						|
/**
 | 
						|
 * @title VersionedInitializable
 | 
						|
 *
 | 
						|
 * @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.
 | 
						|
 *
 | 
						|
 * @author Aave, inspired by the OpenZeppelin Initializable contract
 | 
						|
 */
 | 
						|
abstract contract VersionedInitializable {
 | 
						|
  /**
 | 
						|
   * @dev Indicates that the contract has been initialized.
 | 
						|
   */
 | 
						|
  uint256 private lastInitializedRevision = 0;
 | 
						|
 | 
						|
  /**
 | 
						|
   * @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() {
 | 
						|
    uint256 revision = getRevision();
 | 
						|
    require(
 | 
						|
      initializing || isConstructor() || revision > lastInitializedRevision,
 | 
						|
      'Contract instance has already been initialized'
 | 
						|
    );
 | 
						|
 | 
						|
    bool isTopLevelCall = !initializing;
 | 
						|
    if (isTopLevelCall) {
 | 
						|
      initializing = true;
 | 
						|
      lastInitializedRevision = revision;
 | 
						|
    }
 | 
						|
 | 
						|
    _;
 | 
						|
 | 
						|
    if (isTopLevelCall) {
 | 
						|
      initializing = false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /// @dev returns the revision number of the contract.
 | 
						|
  /// Needs to be defined in the inherited class as a constant.
 | 
						|
  function getRevision() internal virtual pure returns (uint256);
 | 
						|
 | 
						|
  /// @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.
 | 
						|
    uint256 cs;
 | 
						|
    //solium-disable-next-line
 | 
						|
    assembly {
 | 
						|
      cs := extcodesize(address())
 | 
						|
    }
 | 
						|
    return cs == 0;
 | 
						|
  }
 | 
						|
 | 
						|
  // Reserved storage space to allow for layout changes in the future.
 | 
						|
  uint256[50] private ______gap;
 | 
						|
}
 |