mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
Added immutable proxies
This commit is contained in:
parent
fc9b096f23
commit
d681a21272
|
@ -0,0 +1,80 @@
|
|||
// SPDX-License-Identifier: agpl-3.0
|
||||
pragma solidity ^0.6.8;
|
||||
|
||||
import '../openzeppelin-upgradeability/BaseUpgradeabilityProxy.sol';
|
||||
|
||||
/**
|
||||
* @title BaseAdminUpgradeabilityProxy
|
||||
* @dev This contract combines an upgradeability proxy with an authorization
|
||||
* mechanism for administrative tasks.
|
||||
* All external functions in this contract must be guarded by the
|
||||
* `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity
|
||||
* feature proposal that would enable this to be done automatically.
|
||||
*/
|
||||
contract BaseImmutableAdminUpgradeabilityProxy is BaseUpgradeabilityProxy {
|
||||
|
||||
address immutable ADMIN;
|
||||
|
||||
constructor(address admin) public {
|
||||
ADMIN = admin;
|
||||
}
|
||||
|
||||
modifier ifAdmin() {
|
||||
if (msg.sender == ADMIN) {
|
||||
_;
|
||||
} else {
|
||||
_fallback();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The address of the proxy admin.
|
||||
*/
|
||||
function admin() external ifAdmin returns (address) {
|
||||
return ADMIN;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The address of the implementation.
|
||||
*/
|
||||
function implementation() external ifAdmin returns (address) {
|
||||
return _implementation();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Upgrade the backing implementation of the proxy.
|
||||
* Only the admin can call this function.
|
||||
* @param newImplementation Address of the new implementation.
|
||||
*/
|
||||
function upgradeTo(address newImplementation) external ifAdmin {
|
||||
_upgradeTo(newImplementation);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Upgrade the backing implementation of the proxy and call a function
|
||||
* on the new implementation.
|
||||
* This is useful to initialize the proxied contract.
|
||||
* @param newImplementation Address of the new implementation.
|
||||
* @param data Data to send as msg.data in the low level call.
|
||||
* It should include the signature and the parameters of the function to be called, as described in
|
||||
* https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
|
||||
*/
|
||||
function upgradeToAndCall(address newImplementation, bytes calldata data)
|
||||
external
|
||||
payable
|
||||
ifAdmin
|
||||
{
|
||||
_upgradeTo(newImplementation);
|
||||
(bool success, ) = newImplementation.delegatecall(data);
|
||||
require(success);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @dev Only fall back when the sender is not the admin.
|
||||
*/
|
||||
function _willFallback() internal virtual override {
|
||||
require(msg.sender != ADMIN, 'Cannot call fallback function from the proxy admin');
|
||||
super._willFallback();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
// SPDX-License-Identifier: agpl-3.0
|
||||
pragma solidity ^0.6.8;
|
||||
|
||||
import './BaseImmutableAdminUpgradeabilityProxy.sol';
|
||||
import '../openzeppelin-upgradeability/UpgradeabilityProxy.sol';
|
||||
|
||||
/**
|
||||
* @title AdminUpgradeabilityProxy
|
||||
* @dev Extends from BaseAdminUpgradeabilityProxy with a constructor for
|
||||
* initializing the implementation, admin, and init data.
|
||||
*/
|
||||
contract ImmutableAdminUpgradeabilityProxy is BaseImmutableAdminUpgradeabilityProxy, UpgradeabilityProxy {
|
||||
/**
|
||||
* Contract constructor.
|
||||
* @param _logic address of the initial implementation.
|
||||
* @param _admin Address of the proxy administrator.
|
||||
* @param _data Data to send as msg.data to the implementation to initialize the proxied contract.
|
||||
* It should include the signature and the parameters of the function to be called, as described in
|
||||
* https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
|
||||
* This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.
|
||||
*/
|
||||
constructor(
|
||||
address _logic,
|
||||
address _admin,
|
||||
bytes memory _data
|
||||
) public payable UpgradeabilityProxy(_logic, _data) BaseImmutableAdminUpgradeabilityProxy(_admin) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Only fall back when the sender is not the admin.
|
||||
*/
|
||||
function _willFallback() internal override(BaseImmutableAdminUpgradeabilityProxy, Proxy) {
|
||||
BaseImmutableAdminUpgradeabilityProxy._willFallback();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user