mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| // SPDX-License-Identifier: agpl-3.0
 | |
| pragma solidity ^0.6.8;
 | |
| 
 | |
| import './Proxy.sol';
 | |
| import '@openzeppelin/contracts/utils/Address.sol';
 | |
| 
 | |
| /**
 | |
|  * @title BaseUpgradeabilityProxy
 | |
|  * @dev This contract implements a proxy that allows to change the
 | |
|  * implementation address to which it will delegate.
 | |
|  * Such a change is called an implementation upgrade.
 | |
|  */
 | |
| contract BaseUpgradeabilityProxy is Proxy {
 | |
|   /**
 | |
|    * @dev Emitted when the implementation is upgraded.
 | |
|    * @param implementation Address of the new implementation.
 | |
|    */
 | |
|   event Upgraded(address indexed implementation);
 | |
| 
 | |
|   /**
 | |
|    * @dev Storage slot with the address of the current implementation.
 | |
|    * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
 | |
|    * validated in the constructor.
 | |
|    */
 | |
|   bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 | |
| 
 | |
|   /**
 | |
|    * @dev Returns the current implementation.
 | |
|    * @return impl Address of the current implementation
 | |
|    */
 | |
|   function _implementation() internal override view returns (address impl) {
 | |
|     bytes32 slot = IMPLEMENTATION_SLOT;
 | |
|     //solium-disable-next-line
 | |
|     assembly {
 | |
|       impl := sload(slot)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @dev Upgrades the proxy to a new implementation.
 | |
|    * @param newImplementation Address of the new implementation.
 | |
|    */
 | |
|   function _upgradeTo(address newImplementation) internal {
 | |
|     _setImplementation(newImplementation);
 | |
|     emit Upgraded(newImplementation);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @dev Sets the implementation address of the proxy.
 | |
|    * @param newImplementation Address of the new implementation.
 | |
|    */
 | |
|   function _setImplementation(address newImplementation) internal {
 | |
|     require(
 | |
|       Address.isContract(newImplementation),
 | |
|       'Cannot set a proxy implementation to a non-contract address'
 | |
|     );
 | |
| 
 | |
|     bytes32 slot = IMPLEMENTATION_SLOT;
 | |
| 
 | |
|     //solium-disable-next-line
 | |
|     assembly {
 | |
|       sstore(slot, newImplementation)
 | |
|     }
 | |
|   }
 | |
| }
 | 
