mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| // SPDX-License-Identifier: agpl-3.0
 | |
| pragma solidity 0.6.12;
 | |
| 
 | |
| /**
 | |
|  * @title VersionedInitializable
 | |
|  *
 | |
|  * @dev Helper contract to implement 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 pure virtual 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;
 | |
| }
 | 
