aave-protocol-v2/contracts/configuration/LendingPoolAddressesProvider.sol

171 lines
6.2 KiB
Solidity
Raw Normal View History

// SPDX-License-Identifier: agpl-3.0
pragma solidity ^0.6.8;
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {
InitializableImmutableAdminUpgradeabilityProxy
} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol';
import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddressesProvider.sol';
/**
2020-07-13 08:54:08 +00:00
* @title LendingPoolAddressesProvider contract
* @notice Is the main registry of the protocol. All the different components of the protocol are accessible
* through the addresses provider.
* @author Aave
**/
contract LendingPoolAddressesProvider is Ownable, ILendingPoolAddressesProvider {
mapping(bytes32 => address) private _addresses;
2020-07-13 08:54:08 +00:00
bytes32 private constant LENDING_POOL = 'LENDING_POOL';
bytes32 private constant LENDING_POOL_CORE = 'LENDING_POOL_CORE';
bytes32 private constant LENDING_POOL_CONFIGURATOR = 'LENDING_POOL_CONFIGURATOR';
2020-09-16 12:09:42 +00:00
bytes32 private constant AAVE_ADMIN = 'AAVE_ADMIN';
bytes32 private constant LENDING_POOL_COLLATERAL_MANAGER = 'COLLATERAL_MANAGER';
2020-07-13 08:54:08 +00:00
bytes32 private constant LENDING_POOL_FLASHLOAN_PROVIDER = 'FLASHLOAN_PROVIDER';
bytes32 private constant DATA_PROVIDER = 'DATA_PROVIDER';
bytes32 private constant ETHEREUM_ADDRESS = 'ETHEREUM_ADDRESS';
bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE';
bytes32 private constant LENDING_RATE_ORACLE = 'LENDING_RATE_ORACLE';
bytes32 private constant WALLET_BALANCE_PROVIDER = 'WALLET_BALANCE_PROVIDER';
/**
* @dev Sets an address for an id, allowing to cover it or not with a proxy
* @param id The id
* @param newAddress The address to set, pass address(0) if a proxy is needed
* @param implementationAddress The address of the implementation if we want it covered by a proxy
* address(0) if we don't want a proxy covering
*/
function setAddress(
bytes32 id,
address newAddress,
address implementationAddress
) external override onlyOwner {
if (implementationAddress != address(0)) {
_updateImpl(id, implementationAddress);
emit AddressSet(id, implementationAddress, true);
} else {
_addresses[id] = newAddress;
emit AddressSet(id, newAddress, false);
}
}
/**
* @dev Returns an address by id
* @return The address
*/
function getAddress(bytes32 id) public override view returns (address) {
return _addresses[id];
}
2020-07-13 08:54:08 +00:00
/**
* @dev returns the address of the LendingPool proxy
* @return the lending pool proxy address
**/
function getLendingPool() external override view returns (address) {
return getAddress(LENDING_POOL);
2020-07-13 08:54:08 +00:00
}
/**
* @dev updates the implementation of the lending pool
* @param pool the new lending pool implementation
2020-07-13 08:54:08 +00:00
**/
function setLendingPoolImpl(address pool) external override onlyOwner {
_updateImpl(LENDING_POOL, pool);
emit LendingPoolUpdated(pool);
2020-07-13 08:54:08 +00:00
}
/**
* @dev returns the address of the LendingPoolConfigurator proxy
* @return the lending pool configurator proxy address
**/
function getLendingPoolConfigurator() external override view returns (address) {
return getAddress(LENDING_POOL_CONFIGURATOR);
2020-07-13 08:54:08 +00:00
}
/**
* @dev updates the implementation of the lending pool configurator
* @param configurator the new lending pool configurator implementation
2020-07-13 08:54:08 +00:00
**/
function setLendingPoolConfiguratorImpl(address configurator) external override onlyOwner {
_updateImpl(LENDING_POOL_CONFIGURATOR, configurator);
emit LendingPoolConfiguratorUpdated(configurator);
2020-07-13 08:54:08 +00:00
}
/**
* @dev returns the address of the LendingPoolCollateralManager. Since the manager is used
2020-07-13 08:54:08 +00:00
* through delegateCall within the LendingPool contract, the proxy contract pattern does not work properly hence
* the addresses are changed directly.
2020-09-16 12:09:42 +00:00
* @return the address of the Lending pool collateral manager
2020-07-13 08:54:08 +00:00
**/
function getLendingPoolCollateralManager() external override view returns (address) {
return getAddress(LENDING_POOL_COLLATERAL_MANAGER);
2020-07-13 08:54:08 +00:00
}
/**
2020-09-16 12:09:42 +00:00
* @dev updates the address of the Lending pool collateral manager
* @param manager the new lending pool collateral manager address
2020-07-13 08:54:08 +00:00
**/
function setLendingPoolCollateralManager(address manager) external override onlyOwner {
2020-09-16 12:09:42 +00:00
_addresses[LENDING_POOL_COLLATERAL_MANAGER] = manager;
emit LendingPoolCollateralManagerUpdated(manager);
2020-07-13 08:54:08 +00:00
}
/**
* @dev the functions below are storing specific addresses that are outside the context of the protocol
* hence the upgradable proxy pattern is not used
**/
2020-09-16 12:09:42 +00:00
function getAaveAdmin() external override view returns (address) {
return getAddress(AAVE_ADMIN);
2020-07-13 08:54:08 +00:00
}
2020-09-16 12:09:42 +00:00
function setAaveAdmin(address aaveAdmin) external override onlyOwner {
_addresses[AAVE_ADMIN] = aaveAdmin;
emit AaveAdminUpdated(aaveAdmin);
2020-07-13 08:54:08 +00:00
}
function getPriceOracle() external override view returns (address) {
return getAddress(PRICE_ORACLE);
2020-07-13 08:54:08 +00:00
}
function setPriceOracle(address priceOracle) external override onlyOwner {
_addresses[PRICE_ORACLE] = priceOracle;
emit PriceOracleUpdated(priceOracle);
2020-07-13 08:54:08 +00:00
}
function getLendingRateOracle() external override view returns (address) {
return getAddress(LENDING_RATE_ORACLE);
2020-07-13 08:54:08 +00:00
}
function setLendingRateOracle(address lendingRateOracle) external override onlyOwner {
_addresses[LENDING_RATE_ORACLE] = lendingRateOracle;
emit LendingRateOracleUpdated(lendingRateOracle);
2020-07-13 08:54:08 +00:00
}
/**
* @dev internal function to update the implementation of a specific component of the protocol
* @param id the id of the contract to be updated
* @param newAddress the address of the new implementation
2020-07-13 08:54:08 +00:00
**/
function _updateImpl(bytes32 id, address newAddress) internal {
address payable proxyAddress = payable(_addresses[id]);
2020-07-13 08:54:08 +00:00
InitializableImmutableAdminUpgradeabilityProxy proxy = InitializableImmutableAdminUpgradeabilityProxy(
2020-07-13 08:54:08 +00:00
proxyAddress
);
bytes memory params = abi.encodeWithSignature('initialize(address)', address(this));
if (proxyAddress == address(0)) {
proxy = new InitializableImmutableAdminUpgradeabilityProxy(address(this));
proxy.initialize(newAddress, params);
_addresses[id] = address(proxy);
emit ProxyCreated(id, address(proxy));
2020-07-13 08:54:08 +00:00
} else {
proxy.upgradeToAndCall(newAddress, params);
2020-07-13 08:54:08 +00:00
}
}
}