mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
Merge branch 'fix/21' into 'master'
Resolve "Align the usage of _ to our internal guidelines" Closes #21 See merge request aave-tech/protocol-v2!24
This commit is contained in:
commit
cdc7e4effc
|
@ -35,34 +35,34 @@ contract DefaultReserveInterestRateStrategy is IReserveInterestRateStrategy {
|
|||
LendingPoolAddressesProvider public immutable addressesProvider;
|
||||
|
||||
//base variable borrow rate when Utilization rate = 0. Expressed in ray
|
||||
uint256 internal immutable baseVariableBorrowRate;
|
||||
uint256 internal immutable _baseVariableBorrowRate;
|
||||
|
||||
//slope of the variable interest curve when utilization rate > 0 and <= OPTIMAL_UTILIZATION_RATE. Expressed in ray
|
||||
uint256 internal immutable variableRateSlope1;
|
||||
uint256 internal immutable _variableRateSlope1;
|
||||
|
||||
//slope of the variable interest curve when utilization rate > OPTIMAL_UTILIZATION_RATE. Expressed in ray
|
||||
uint256 internal immutable variableRateSlope2;
|
||||
uint256 internal immutable _variableRateSlope2;
|
||||
|
||||
//slope of the stable interest curve when utilization rate > 0 and <= OPTIMAL_UTILIZATION_RATE. Expressed in ray
|
||||
uint256 internal immutable stableRateSlope1;
|
||||
uint256 internal immutable _stableRateSlope1;
|
||||
|
||||
//slope of the stable interest curve when utilization rate > OPTIMAL_UTILIZATION_RATE. Expressed in ray
|
||||
uint256 internal immutable stableRateSlope2;
|
||||
uint256 internal immutable _stableRateSlope2;
|
||||
|
||||
constructor(
|
||||
LendingPoolAddressesProvider _provider,
|
||||
uint256 _baseVariableBorrowRate,
|
||||
uint256 _variableRateSlope1,
|
||||
uint256 _variableRateSlope2,
|
||||
uint256 _stableRateSlope1,
|
||||
uint256 _stableRateSlope2
|
||||
LendingPoolAddressesProvider provider,
|
||||
uint256 baseVariableBorrowRate,
|
||||
uint256 variableRateSlope1,
|
||||
uint256 variableRateSlope2,
|
||||
uint256 stableRateSlope1,
|
||||
uint256 stableRateSlope2
|
||||
) public {
|
||||
addressesProvider = _provider;
|
||||
baseVariableBorrowRate = _baseVariableBorrowRate;
|
||||
variableRateSlope1 = _variableRateSlope1;
|
||||
variableRateSlope2 = _variableRateSlope2;
|
||||
stableRateSlope1 = _stableRateSlope1;
|
||||
stableRateSlope2 = _stableRateSlope2;
|
||||
addressesProvider = provider;
|
||||
_baseVariableBorrowRate = baseVariableBorrowRate;
|
||||
_variableRateSlope1 = variableRateSlope1;
|
||||
_variableRateSlope2 = variableRateSlope2;
|
||||
_stableRateSlope1 = stableRateSlope1;
|
||||
_stableRateSlope2 = stableRateSlope2;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -70,115 +70,122 @@ contract DefaultReserveInterestRateStrategy is IReserveInterestRateStrategy {
|
|||
*/
|
||||
|
||||
function getVariableRateSlope1() external view returns (uint256) {
|
||||
return variableRateSlope1;
|
||||
return _variableRateSlope1;
|
||||
}
|
||||
|
||||
function getVariableRateSlope2() external view returns (uint256) {
|
||||
return variableRateSlope2;
|
||||
return _variableRateSlope2;
|
||||
}
|
||||
|
||||
function getStableRateSlope1() external view returns (uint256) {
|
||||
return stableRateSlope1;
|
||||
return _stableRateSlope1;
|
||||
}
|
||||
|
||||
function getStableRateSlope2() external view returns (uint256) {
|
||||
return stableRateSlope2;
|
||||
return _stableRateSlope2;
|
||||
}
|
||||
|
||||
function getBaseVariableBorrowRate() external override view returns (uint256) {
|
||||
return baseVariableBorrowRate;
|
||||
return _baseVariableBorrowRate;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev calculates the interest rates depending on the available liquidity and the total borrowed.
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _availableLiquidity the liquidity available in the reserve
|
||||
* @param _totalBorrowsStable the total borrowed from the reserve a stable rate
|
||||
* @param _totalBorrowsVariable the total borrowed from the reserve at a variable rate
|
||||
* @param _averageStableBorrowRate the weighted average of all the stable rate borrows
|
||||
* @param reserve the address of the reserve
|
||||
* @param availableLiquidity the liquidity available in the reserve
|
||||
* @param totalBorrowsStable the total borrowed from the reserve a stable rate
|
||||
* @param totalBorrowsVariable the total borrowed from the reserve at a variable rate
|
||||
* @param averageStableBorrowRate the weighted average of all the stable rate borrows
|
||||
* @return currentLiquidityRate the liquidity rate
|
||||
* @return currentStableBorrowRate stable borrow rate
|
||||
* @return currentVariableBorrowRate variable borrow rate
|
||||
**/
|
||||
function calculateInterestRates(
|
||||
address _reserve,
|
||||
uint256 _availableLiquidity,
|
||||
uint256 _totalBorrowsStable,
|
||||
uint256 _totalBorrowsVariable,
|
||||
uint256 _averageStableBorrowRate
|
||||
address reserve,
|
||||
uint256 availableLiquidity,
|
||||
uint256 totalBorrowsStable,
|
||||
uint256 totalBorrowsVariable,
|
||||
uint256 averageStableBorrowRate
|
||||
)
|
||||
external
|
||||
override
|
||||
view
|
||||
returns (
|
||||
uint256 currentLiquidityRate,
|
||||
uint256 currentStableBorrowRate,
|
||||
uint256 currentVariableBorrowRate
|
||||
uint256,
|
||||
uint256,
|
||||
uint256
|
||||
)
|
||||
{
|
||||
uint256 totalBorrows = _totalBorrowsStable.add(_totalBorrowsVariable);
|
||||
uint256 totalBorrows = totalBorrowsStable.add(totalBorrowsVariable);
|
||||
uint256 currentVariableBorrowRate = 0;
|
||||
uint256 currentStableBorrowRate = 0;
|
||||
uint256 currentLiquidityRate = 0;
|
||||
|
||||
uint256 utilizationRate = (totalBorrows == 0 && _availableLiquidity == 0)
|
||||
uint256 utilizationRate = (totalBorrows == 0 && availableLiquidity == 0)
|
||||
? 0
|
||||
: totalBorrows.rayDiv(_availableLiquidity.add(totalBorrows));
|
||||
: totalBorrows.rayDiv(availableLiquidity.add(totalBorrows));
|
||||
|
||||
currentStableBorrowRate = ILendingRateOracle(addressesProvider.getLendingRateOracle())
|
||||
.getMarketBorrowRate(_reserve);
|
||||
.getMarketBorrowRate(reserve);
|
||||
|
||||
if (utilizationRate > OPTIMAL_UTILIZATION_RATE) {
|
||||
uint256 excessUtilizationRateRatio = utilizationRate.sub(OPTIMAL_UTILIZATION_RATE).rayDiv(
|
||||
EXCESS_UTILIZATION_RATE
|
||||
);
|
||||
|
||||
currentStableBorrowRate = currentStableBorrowRate.add(stableRateSlope1).add(
|
||||
stableRateSlope2.rayMul(excessUtilizationRateRatio)
|
||||
currentStableBorrowRate = currentStableBorrowRate.add(_stableRateSlope1).add(
|
||||
_stableRateSlope2.rayMul(excessUtilizationRateRatio)
|
||||
);
|
||||
|
||||
currentVariableBorrowRate = baseVariableBorrowRate.add(variableRateSlope1).add(
|
||||
variableRateSlope2.rayMul(excessUtilizationRateRatio)
|
||||
currentVariableBorrowRate = _baseVariableBorrowRate.add(_variableRateSlope1).add(
|
||||
_variableRateSlope2.rayMul(excessUtilizationRateRatio)
|
||||
);
|
||||
} else {
|
||||
currentStableBorrowRate = currentStableBorrowRate.add(
|
||||
stableRateSlope1.rayMul(utilizationRate.rayDiv(OPTIMAL_UTILIZATION_RATE))
|
||||
_stableRateSlope1.rayMul(utilizationRate.rayDiv(OPTIMAL_UTILIZATION_RATE))
|
||||
);
|
||||
currentVariableBorrowRate = baseVariableBorrowRate.add(
|
||||
utilizationRate.rayDiv(OPTIMAL_UTILIZATION_RATE).rayMul(variableRateSlope1)
|
||||
currentVariableBorrowRate = _baseVariableBorrowRate.add(
|
||||
utilizationRate.rayDiv(OPTIMAL_UTILIZATION_RATE).rayMul(_variableRateSlope1)
|
||||
);
|
||||
}
|
||||
|
||||
currentLiquidityRate = getOverallBorrowRateInternal(
|
||||
_totalBorrowsStable,
|
||||
_totalBorrowsVariable,
|
||||
totalBorrowsStable,
|
||||
totalBorrowsVariable,
|
||||
currentVariableBorrowRate,
|
||||
_averageStableBorrowRate
|
||||
averageStableBorrowRate
|
||||
)
|
||||
.rayMul(utilizationRate);
|
||||
|
||||
return (currentLiquidityRate,
|
||||
currentStableBorrowRate,
|
||||
currentVariableBorrowRate);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev calculates the overall borrow rate as the weighted average between the total variable borrows and total stable borrows.
|
||||
* @param _totalBorrowsStable the total borrowed from the reserve a stable rate
|
||||
* @param _totalBorrowsVariable the total borrowed from the reserve at a variable rate
|
||||
* @param _currentVariableBorrowRate the current variable borrow rate
|
||||
* @param _currentAverageStableBorrowRate the weighted average of all the stable rate borrows
|
||||
* @param totalBorrowsStable the total borrowed from the reserve a stable rate
|
||||
* @param totalBorrowsVariable the total borrowed from the reserve at a variable rate
|
||||
* @param currentVariableBorrowRate the current variable borrow rate
|
||||
* @param currentAverageStableBorrowRate the weighted average of all the stable rate borrows
|
||||
* @return the weighted averaged borrow rate
|
||||
**/
|
||||
function getOverallBorrowRateInternal(
|
||||
uint256 _totalBorrowsStable,
|
||||
uint256 _totalBorrowsVariable,
|
||||
uint256 _currentVariableBorrowRate,
|
||||
uint256 _currentAverageStableBorrowRate
|
||||
uint256 totalBorrowsStable,
|
||||
uint256 totalBorrowsVariable,
|
||||
uint256 currentVariableBorrowRate,
|
||||
uint256 currentAverageStableBorrowRate
|
||||
) internal pure returns (uint256) {
|
||||
uint256 totalBorrows = _totalBorrowsStable.add(_totalBorrowsVariable);
|
||||
uint256 totalBorrows = totalBorrowsStable.add(totalBorrowsVariable);
|
||||
|
||||
if (totalBorrows == 0) return 0;
|
||||
|
||||
uint256 weightedVariableRate = _totalBorrowsVariable.wadToRay().rayMul(
|
||||
_currentVariableBorrowRate
|
||||
uint256 weightedVariableRate = totalBorrowsVariable.wadToRay().rayMul(
|
||||
currentVariableBorrowRate
|
||||
);
|
||||
|
||||
uint256 weightedStableRate = _totalBorrowsStable.wadToRay().rayMul(
|
||||
_currentAverageStableBorrowRate
|
||||
uint256 weightedStableRate = totalBorrowsStable.wadToRay().rayMul(
|
||||
currentAverageStableBorrowRate
|
||||
);
|
||||
|
||||
uint256 overallBorrowRate = weightedVariableRate.add(weightedStableRate).rayDiv(
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -10,7 +10,7 @@ import {
|
|||
InitializableAdminUpgradeabilityProxy
|
||||
} from '../libraries/openzeppelin-upgradeability/InitializableAdminUpgradeabilityProxy.sol';
|
||||
import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol';
|
||||
import {LendingPoolAddressesProvider} from '../configuration/LendingPoolAddressesProvider.sol';
|
||||
import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddressesProvider.sol';
|
||||
import {ILendingPool} from '../interfaces/ILendingPool.sol';
|
||||
import {IERC20Detailed} from '../interfaces/IERC20Detailed.sol';
|
||||
|
||||
|
@ -27,155 +27,157 @@ contract LendingPoolConfigurator is VersionedInitializable {
|
|||
|
||||
/**
|
||||
* @dev emitted when a reserve is initialized.
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _aToken the address of the overlying aToken contract
|
||||
* @param _interestRateStrategyAddress the address of the interest rate strategy for the reserve
|
||||
* @param asset the address of the reserve
|
||||
* @param aToken the address of the overlying aToken contract
|
||||
* @param stableDebtToken the address of the associated stable rate debt token
|
||||
* @param variableDebtToken the address of the associated variable rate debt token
|
||||
* @param interestRateStrategyAddress the address of the interest rate strategy for the reserve
|
||||
**/
|
||||
event ReserveInitialized(
|
||||
address indexed _reserve,
|
||||
address indexed _aToken,
|
||||
address _stableDebtToken,
|
||||
address _variableDebtToken,
|
||||
address _interestRateStrategyAddress
|
||||
address indexed asset,
|
||||
address indexed aToken,
|
||||
address stableDebtToken,
|
||||
address variableDebtToken,
|
||||
address interestRateStrategyAddress
|
||||
);
|
||||
|
||||
/**
|
||||
* @dev emitted when borrowing is enabled on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _stableRateEnabled true if stable rate borrowing is enabled, false otherwise
|
||||
* @param asset the address of the reserve
|
||||
* @param stableRateEnabled true if stable rate borrowing is enabled, false otherwise
|
||||
**/
|
||||
event BorrowingEnabledOnReserve(address _reserve, bool _stableRateEnabled);
|
||||
event BorrowingEnabledOnReserve(address asset, bool stableRateEnabled);
|
||||
|
||||
/**
|
||||
* @dev emitted when borrowing is disabled on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event BorrowingDisabledOnReserve(address indexed _reserve);
|
||||
event BorrowingDisabledOnReserve(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve is enabled as collateral.
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _ltv the loan to value of the asset when used as collateral
|
||||
* @param _liquidationThreshold the threshold at which loans using this asset as collateral will be considered undercollateralized
|
||||
* @param _liquidationBonus the bonus liquidators receive to liquidate this asset
|
||||
* @param asset the address of the reserve
|
||||
* @param ltv the loan to value of the asset when used as collateral
|
||||
* @param liquidationThreshold the threshold at which loans using this asset as collateral will be considered undercollateralized
|
||||
* @param liquidationBonus the bonus liquidators receive to liquidate this asset
|
||||
**/
|
||||
event ReserveEnabledAsCollateral(
|
||||
address indexed _reserve,
|
||||
uint256 _ltv,
|
||||
uint256 _liquidationThreshold,
|
||||
uint256 _liquidationBonus
|
||||
address indexed asset,
|
||||
uint256 ltv,
|
||||
uint256 liquidationThreshold,
|
||||
uint256 liquidationBonus
|
||||
);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve is disabled as collateral
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event ReserveDisabledAsCollateral(address indexed _reserve);
|
||||
event ReserveDisabledAsCollateral(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when stable rate borrowing is enabled on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event StableRateEnabledOnReserve(address indexed _reserve);
|
||||
event StableRateEnabledOnReserve(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when stable rate borrowing is disabled on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event StableRateDisabledOnReserve(address indexed _reserve);
|
||||
event StableRateDisabledOnReserve(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve is activated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event ReserveActivated(address indexed _reserve);
|
||||
event ReserveActivated(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve is deactivated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event ReserveDeactivated(address indexed _reserve);
|
||||
event ReserveDeactivated(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve is freezed
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event ReserveFreezed(address indexed _reserve);
|
||||
event ReserveFreezed(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve is unfreezed
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
event ReserveUnfreezed(address indexed _reserve);
|
||||
event ReserveUnfreezed(address indexed asset);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve loan to value is updated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _ltv the new value for the loan to value
|
||||
* @param asset the address of the reserve
|
||||
* @param ltv the new value for the loan to value
|
||||
**/
|
||||
event ReserveBaseLtvChanged(address _reserve, uint256 _ltv);
|
||||
event ReserveBaseLtvChanged(address asset, uint256 ltv);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve liquidation threshold is updated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _threshold the new value for the liquidation threshold
|
||||
* @param asset the address of the reserve
|
||||
* @param threshold the new value for the liquidation threshold
|
||||
**/
|
||||
event ReserveLiquidationThresholdChanged(address _reserve, uint256 _threshold);
|
||||
event ReserveLiquidationThresholdChanged(address asset, uint256 threshold);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve liquidation bonus is updated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _bonus the new value for the liquidation bonus
|
||||
* @param asset the address of the reserve
|
||||
* @param bonus the new value for the liquidation bonus
|
||||
**/
|
||||
event ReserveLiquidationBonusChanged(address _reserve, uint256 _bonus);
|
||||
event ReserveLiquidationBonusChanged(address asset, uint256 bonus);
|
||||
|
||||
/**
|
||||
* @dev emitted when the reserve decimals are updated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _decimals the new decimals
|
||||
* @param asset the address of the reserve
|
||||
* @param decimals the new decimals
|
||||
**/
|
||||
event ReserveDecimalsChanged(address _reserve, uint256 _decimals);
|
||||
event ReserveDecimalsChanged(address asset, uint256 decimals);
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve interest strategy contract is updated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _strategy the new address of the interest strategy contract
|
||||
* @param asset the address of the reserve
|
||||
* @param strategy the new address of the interest strategy contract
|
||||
**/
|
||||
event ReserveInterestRateStrategyChanged(address _reserve, address _strategy);
|
||||
event ReserveInterestRateStrategyChanged(address asset, address strategy);
|
||||
|
||||
/**
|
||||
* @dev emitted when an aToken implementation is upgraded
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _proxy the aToken proxy address
|
||||
* @param _implementation the new aToken implementation
|
||||
* @param asset the address of the reserve
|
||||
* @param proxy the aToken proxy address
|
||||
* @param implementation the new aToken implementation
|
||||
**/
|
||||
event ATokenUpgraded(address _reserve, address _proxy, address _implementation);
|
||||
event ATokenUpgraded(address asset, address proxy, address implementation);
|
||||
|
||||
/**
|
||||
* @dev emitted when the implementation of a stable debt token is upgraded
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _proxy the stable debt token proxy address
|
||||
* @param _implementation the new aToken implementation
|
||||
* @param asset the address of the reserve
|
||||
* @param proxy the stable debt token proxy address
|
||||
* @param implementation the new aToken implementation
|
||||
**/
|
||||
event StableDebtTokenUpgraded(address _reserve, address _proxy, address _implementation);
|
||||
event StableDebtTokenUpgraded(address asset, address proxy, address implementation);
|
||||
|
||||
/**
|
||||
* @dev emitted when the implementation of a variable debt token is upgraded
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
* @param _proxy the variable debt token proxy address
|
||||
* @param _implementation the new aToken implementation
|
||||
**/
|
||||
event VariableDebtTokenUpgraded(address _reserve, address _proxy, address _implementation);
|
||||
event VariableDebtTokenUpgraded(address asset, address _proxy, address _implementation);
|
||||
|
||||
LendingPoolAddressesProvider public poolAddressesProvider;
|
||||
ILendingPool public pool;
|
||||
ILendingPoolAddressesProvider internal addressesProvider;
|
||||
ILendingPool internal pool;
|
||||
|
||||
/**
|
||||
* @dev only the lending pool manager can call functions affected by this modifier
|
||||
**/
|
||||
modifier onlyLendingPoolManager {
|
||||
require(
|
||||
poolAddressesProvider.getLendingPoolManager() == msg.sender,
|
||||
addressesProvider.getLendingPoolManager() == msg.sender,
|
||||
'The caller must be a lending pool manager'
|
||||
);
|
||||
_;
|
||||
|
@ -187,242 +189,235 @@ contract LendingPoolConfigurator is VersionedInitializable {
|
|||
return CONFIGURATOR_REVISION;
|
||||
}
|
||||
|
||||
function initialize(LendingPoolAddressesProvider _poolAddressesProvider) public initializer {
|
||||
poolAddressesProvider = _poolAddressesProvider;
|
||||
pool = ILendingPool(poolAddressesProvider.getLendingPool());
|
||||
function initialize(ILendingPoolAddressesProvider provider) public initializer {
|
||||
addressesProvider = provider;
|
||||
pool = ILendingPool(addressesProvider.getLendingPool());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev initializes a reserve
|
||||
* @param _reserve the address of the reserve to be initialized
|
||||
* @param _aTokenImpl the address of the aToken contract implementation
|
||||
* @param _stableDebtTokenImpl the address of the stable debt token contract
|
||||
* @param _variableDebtTokenImpl the address of the variable debt token contract
|
||||
* @param _underlyingAssetDecimals the decimals of the reserve underlying asset
|
||||
* @param _interestRateStrategyAddress the address of the interest rate strategy contract for this reserve
|
||||
* @param asset the address of the reserve to be initialized
|
||||
* @param aTokenImpl the address of the aToken contract implementation
|
||||
* @param stableDebtTokenImpl the address of the stable debt token contract
|
||||
* @param variableDebtTokenImpl the address of the variable debt token contract
|
||||
* @param underlyingAssetDecimals the decimals of the reserve underlying asset
|
||||
* @param interestRateStrategyAddress the address of the interest rate strategy contract for this reserve
|
||||
**/
|
||||
function initReserve(
|
||||
address _reserve,
|
||||
address _aTokenImpl,
|
||||
address _stableDebtTokenImpl,
|
||||
address _variableDebtTokenImpl,
|
||||
uint8 _underlyingAssetDecimals,
|
||||
address _interestRateStrategyAddress
|
||||
address asset,
|
||||
address aTokenImpl,
|
||||
address stableDebtTokenImpl,
|
||||
address variableDebtTokenImpl,
|
||||
uint8 underlyingAssetDecimals,
|
||||
address interestRateStrategyAddress
|
||||
) public onlyLendingPoolManager {
|
||||
address aTokenProxyAddress = _initTokenWithProxy(
|
||||
_aTokenImpl,
|
||||
_underlyingAssetDecimals,
|
||||
IERC20Detailed(_aTokenImpl).name(),
|
||||
IERC20Detailed(_aTokenImpl).symbol()
|
||||
aTokenImpl,
|
||||
underlyingAssetDecimals
|
||||
);
|
||||
|
||||
address stableDebtTokenProxyAddress = _initTokenWithProxy(
|
||||
_stableDebtTokenImpl,
|
||||
_underlyingAssetDecimals,
|
||||
IERC20Detailed(_stableDebtTokenImpl).name(),
|
||||
IERC20Detailed(_stableDebtTokenImpl).symbol()
|
||||
stableDebtTokenImpl,
|
||||
underlyingAssetDecimals
|
||||
);
|
||||
|
||||
address variableDebtTokenProxyAddress = _initTokenWithProxy(
|
||||
_variableDebtTokenImpl,
|
||||
_underlyingAssetDecimals,
|
||||
IERC20Detailed(_variableDebtTokenImpl).name(),
|
||||
IERC20Detailed(_variableDebtTokenImpl).symbol()
|
||||
variableDebtTokenImpl,
|
||||
underlyingAssetDecimals
|
||||
);
|
||||
|
||||
pool.initReserve(
|
||||
_reserve,
|
||||
asset,
|
||||
aTokenProxyAddress,
|
||||
stableDebtTokenProxyAddress,
|
||||
variableDebtTokenProxyAddress,
|
||||
_interestRateStrategyAddress
|
||||
interestRateStrategyAddress
|
||||
);
|
||||
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setDecimals(_underlyingAssetDecimals);
|
||||
currentConfig.setDecimals(underlyingAssetDecimals);
|
||||
|
||||
currentConfig.setActive(true);
|
||||
currentConfig.setFrozen(false);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveInitialized(
|
||||
_reserve,
|
||||
asset,
|
||||
aTokenProxyAddress,
|
||||
stableDebtTokenProxyAddress,
|
||||
variableDebtTokenProxyAddress,
|
||||
_interestRateStrategyAddress
|
||||
interestRateStrategyAddress
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev updates the aToken implementation for the _reserve
|
||||
* @param _reserve the address of the reserve to be updated
|
||||
* @param _implementation the address of the new aToken implementation
|
||||
* @dev updates the aToken implementation for the asset
|
||||
* @param asset the address of the reserve to be updated
|
||||
* @param implementation the address of the new aToken implementation
|
||||
**/
|
||||
function updateAToken(address _reserve, address _implementation) external onlyLendingPoolManager {
|
||||
(address aTokenAddress, , ) = pool.getReserveTokensAddresses(_reserve);
|
||||
function updateAToken(address asset, address implementation) external onlyLendingPoolManager {
|
||||
(address aTokenAddress, , ) = pool.getReserveTokensAddresses(asset);
|
||||
|
||||
_upgradeTokenImplementation(_reserve, aTokenAddress, _implementation);
|
||||
_upgradeTokenImplementation(asset, aTokenAddress, implementation);
|
||||
|
||||
emit ATokenUpgraded(_reserve, aTokenAddress, _implementation);
|
||||
emit ATokenUpgraded(asset, aTokenAddress, implementation);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev updates the stable debt token implementation for the _reserve
|
||||
* @param _reserve the address of the reserve to be updated
|
||||
* @param _implementation the address of the new aToken implementation
|
||||
* @dev updates the stable debt token implementation for the asset
|
||||
* @param asset the address of the reserve to be updated
|
||||
* @param implementation the address of the new aToken implementation
|
||||
**/
|
||||
function updateStableDebtToken(address _reserve, address _implementation)
|
||||
function updateStableDebtToken(address asset, address implementation)
|
||||
external
|
||||
onlyLendingPoolManager
|
||||
{
|
||||
(, address stableDebtToken, ) = pool.getReserveTokensAddresses(_reserve);
|
||||
(, address stableDebtToken, ) = pool.getReserveTokensAddresses(asset);
|
||||
|
||||
_upgradeTokenImplementation(_reserve, stableDebtToken, _implementation);
|
||||
_upgradeTokenImplementation(asset, stableDebtToken, implementation);
|
||||
|
||||
emit StableDebtTokenUpgraded(_reserve, stableDebtToken, _implementation);
|
||||
emit StableDebtTokenUpgraded(asset, stableDebtToken, implementation);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev updates the variable debt token implementation for the _reserve
|
||||
* @param _reserve the address of the reserve to be updated
|
||||
* @param _implementation the address of the new aToken implementation
|
||||
* @dev updates the variable debt token implementation for the asset
|
||||
* @param asset the address of the reserve to be updated
|
||||
* @param implementation the address of the new aToken implementation
|
||||
**/
|
||||
function updateVariableDebtToken(address _reserve, address _implementation)
|
||||
function updateVariableDebtToken(address asset, address implementation)
|
||||
external
|
||||
onlyLendingPoolManager
|
||||
{
|
||||
(, , address variableDebtToken) = pool.getReserveTokensAddresses(_reserve);
|
||||
(, , address variableDebtToken) = pool.getReserveTokensAddresses(asset);
|
||||
|
||||
_upgradeTokenImplementation(_reserve, variableDebtToken, _implementation);
|
||||
_upgradeTokenImplementation(asset, variableDebtToken, implementation);
|
||||
|
||||
emit VariableDebtTokenUpgraded(_reserve, variableDebtToken, _implementation);
|
||||
emit VariableDebtTokenUpgraded(asset, variableDebtToken, implementation);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev enables borrowing on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _stableBorrowRateEnabled true if stable borrow rate needs to be enabled by default on this reserve
|
||||
* @param asset the address of the reserve
|
||||
* @param stableBorrowRateEnabled true if stable borrow rate needs to be enabled by default on this reserve
|
||||
**/
|
||||
function enableBorrowingOnReserve(address _reserve, bool _stableBorrowRateEnabled)
|
||||
function enableBorrowingOnReserve(address asset, bool stableBorrowRateEnabled)
|
||||
external
|
||||
onlyLendingPoolManager
|
||||
{
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setBorrowingEnabled(true);
|
||||
currentConfig.setStableRateBorrowingEnabled(_stableBorrowRateEnabled);
|
||||
currentConfig.setStableRateBorrowingEnabled(stableBorrowRateEnabled);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit BorrowingEnabledOnReserve(_reserve, _stableBorrowRateEnabled);
|
||||
emit BorrowingEnabledOnReserve(asset, stableBorrowRateEnabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev disables borrowing on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function disableBorrowingOnReserve(address _reserve) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function disableBorrowingOnReserve(address asset) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setBorrowingEnabled(false);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
emit BorrowingDisabledOnReserve(_reserve);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
emit BorrowingDisabledOnReserve(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev enables a reserve to be used as collateral
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _baseLTVasCollateral the loan to value of the asset when used as collateral
|
||||
* @param _liquidationThreshold the threshold at which loans using this asset as collateral will be considered undercollateralized
|
||||
* @param _liquidationBonus the bonus liquidators receive to liquidate this asset
|
||||
* @param asset the address of the reserve
|
||||
* @param ltv the loan to value of the asset when used as collateral
|
||||
* @param liquidationThreshold the threshold at which loans using this asset as collateral will be considered undercollateralized
|
||||
* @param liquidationBonus the bonus liquidators receive to liquidate this asset
|
||||
**/
|
||||
function enableReserveAsCollateral(
|
||||
address _reserve,
|
||||
uint256 _baseLTVasCollateral,
|
||||
uint256 _liquidationThreshold,
|
||||
uint256 _liquidationBonus
|
||||
address asset,
|
||||
uint256 ltv,
|
||||
uint256 liquidationThreshold,
|
||||
uint256 liquidationBonus
|
||||
) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setLtv(_baseLTVasCollateral);
|
||||
currentConfig.setLiquidationThreshold(_liquidationThreshold);
|
||||
currentConfig.setLiquidationBonus(_liquidationBonus);
|
||||
currentConfig.setLtv(ltv);
|
||||
currentConfig.setLiquidationThreshold(liquidationThreshold);
|
||||
currentConfig.setLiquidationBonus(liquidationBonus);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveEnabledAsCollateral(
|
||||
_reserve,
|
||||
_baseLTVasCollateral,
|
||||
_liquidationThreshold,
|
||||
_liquidationBonus
|
||||
asset,
|
||||
ltv,
|
||||
liquidationThreshold,
|
||||
liquidationBonus
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev disables a reserve as collateral
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function disableReserveAsCollateral(address _reserve) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function disableReserveAsCollateral(address asset) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setLtv(0);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveDisabledAsCollateral(_reserve);
|
||||
emit ReserveDisabledAsCollateral(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev enable stable rate borrowing on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function enableReserveStableRate(address _reserve) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function enableReserveStableRate(address asset) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setStableRateBorrowingEnabled(true);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit StableRateEnabledOnReserve(_reserve);
|
||||
emit StableRateEnabledOnReserve(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev disable stable rate borrowing on a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function disableReserveStableRate(address _reserve) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function disableReserveStableRate(address asset) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setStableRateBorrowingEnabled(false);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit StableRateDisabledOnReserve(_reserve);
|
||||
emit StableRateDisabledOnReserve(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev activates a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function activateReserve(address _reserve) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function activateReserve(address asset) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setActive(true);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveActivated(_reserve);
|
||||
emit ReserveActivated(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev deactivates a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function deactivateReserve(address _reserve) external onlyLendingPoolManager {
|
||||
function deactivateReserve(address asset) external onlyLendingPoolManager {
|
||||
(
|
||||
uint256 availableLiquidity,
|
||||
uint256 totalBorrowsStable,
|
||||
|
@ -434,170 +429,166 @@ contract LendingPoolConfigurator is VersionedInitializable {
|
|||
,
|
||||
,
|
||||
|
||||
) = pool.getReserveData(_reserve);
|
||||
) = pool.getReserveData(asset);
|
||||
require(
|
||||
availableLiquidity == 0 && totalBorrowsStable == 0 && totalBorrowsVariable == 0,
|
||||
'The liquidity of the reserve needs to be 0'
|
||||
);
|
||||
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setActive(false);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveDeactivated(_reserve);
|
||||
emit ReserveDeactivated(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev freezes a reserve. A freezed reserve doesn't accept any new deposit, borrow or rate swap, but can accept repayments, liquidations, rate rebalances and redeems
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function freezeReserve(address _reserve) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function freezeReserve(address asset) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setFrozen(true);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveFreezed(_reserve);
|
||||
emit ReserveFreezed(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev unfreezes a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param asset the address of the reserve
|
||||
**/
|
||||
function unfreezeReserve(address _reserve) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function unfreezeReserve(address asset) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setFrozen(false);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveUnfreezed(_reserve);
|
||||
emit ReserveUnfreezed(asset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev emitted when a reserve loan to value is updated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _ltv the new value for the loan to value
|
||||
* @param asset the address of the reserve
|
||||
* @param ltv the new value for the loan to value
|
||||
**/
|
||||
function setLtv(address _reserve, uint256 _ltv) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function setLtv(address asset, uint256 ltv) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setLtv(_ltv);
|
||||
currentConfig.setLtv(ltv);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveBaseLtvChanged(_reserve, _ltv);
|
||||
emit ReserveBaseLtvChanged(asset, ltv);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev updates the liquidation threshold of a reserve.
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _threshold the new value for the liquidation threshold
|
||||
* @param asset the address of the reserve
|
||||
* @param threshold the new value for the liquidation threshold
|
||||
**/
|
||||
function setLiquidationThreshold(address _reserve, uint256 _threshold)
|
||||
function setLiquidationThreshold(address asset, uint256 threshold)
|
||||
external
|
||||
onlyLendingPoolManager
|
||||
{
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setLiquidationThreshold(_threshold);
|
||||
currentConfig.setLiquidationThreshold(threshold);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveLiquidationThresholdChanged(_reserve, _threshold);
|
||||
emit ReserveLiquidationThresholdChanged(asset, threshold);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev updates the liquidation bonus of a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _bonus the new value for the liquidation bonus
|
||||
* @param asset the address of the reserve
|
||||
* @param bonus the new value for the liquidation bonus
|
||||
**/
|
||||
function setLiquidationBonus(address _reserve, uint256 _bonus) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function setLiquidationBonus(address asset, uint256 bonus) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setLiquidationBonus(_bonus);
|
||||
currentConfig.setLiquidationBonus(bonus);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveLiquidationBonusChanged(_reserve, _bonus);
|
||||
emit ReserveLiquidationBonusChanged(asset, bonus);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev updates the reserve decimals
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _decimals the new number of decimals
|
||||
* @param asset the address of the reserve
|
||||
* @param decimals the new number of decimals
|
||||
**/
|
||||
function setReserveDecimals(address _reserve, uint256 _decimals) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(_reserve);
|
||||
function setReserveDecimals(address asset, uint256 decimals) external onlyLendingPoolManager {
|
||||
ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset);
|
||||
|
||||
currentConfig.setDecimals(_decimals);
|
||||
currentConfig.setDecimals(decimals);
|
||||
|
||||
pool.setConfiguration(_reserve, currentConfig.data);
|
||||
pool.setConfiguration(asset, currentConfig.data);
|
||||
|
||||
emit ReserveDecimalsChanged(_reserve, _decimals);
|
||||
emit ReserveDecimalsChanged(asset, decimals);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev sets the interest rate strategy of a reserve
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _rateStrategyAddress the new address of the interest strategy contract
|
||||
* @param asset the address of the reserve
|
||||
* @param rateStrategyAddress the new address of the interest strategy contract
|
||||
**/
|
||||
function setReserveInterestRateStrategyAddress(address _reserve, address _rateStrategyAddress)
|
||||
function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress)
|
||||
external
|
||||
onlyLendingPoolManager
|
||||
{
|
||||
pool.setReserveInterestRateStrategyAddress(_reserve, _rateStrategyAddress);
|
||||
emit ReserveInterestRateStrategyChanged(_reserve, _rateStrategyAddress);
|
||||
pool.setReserveInterestRateStrategyAddress(asset, rateStrategyAddress);
|
||||
emit ReserveInterestRateStrategyChanged(asset, rateStrategyAddress);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev initializes a token with a proxy and a specific implementation
|
||||
* @param _implementation the address of the implementation
|
||||
* @param _decimals the decimals of the token
|
||||
* @param _name the name of the token
|
||||
* @param _symbol the symbol of the token
|
||||
* @param implementation the address of the implementation
|
||||
* @param decimals the decimals of the token
|
||||
**/
|
||||
function _initTokenWithProxy(
|
||||
address _implementation,
|
||||
uint8 _decimals,
|
||||
string memory _name,
|
||||
string memory _symbol
|
||||
address implementation,
|
||||
uint8 decimals
|
||||
) internal returns (address) {
|
||||
InitializableAdminUpgradeabilityProxy proxy = new InitializableAdminUpgradeabilityProxy();
|
||||
|
||||
bytes memory params = abi.encodeWithSignature(
|
||||
'initialize(uint8,string,string)',
|
||||
_decimals,
|
||||
_name,
|
||||
_symbol
|
||||
decimals,
|
||||
IERC20Detailed(implementation).name(),
|
||||
IERC20Detailed(implementation).symbol()
|
||||
);
|
||||
|
||||
proxy.initialize(_implementation, address(this), params);
|
||||
proxy.initialize(implementation, address(this), params);
|
||||
|
||||
return address(proxy);
|
||||
}
|
||||
|
||||
function _upgradeTokenImplementation(
|
||||
address _reserve,
|
||||
address _proxy,
|
||||
address _implementation
|
||||
address asset,
|
||||
address proxyAddress,
|
||||
address implementation
|
||||
) internal {
|
||||
InitializableAdminUpgradeabilityProxy proxy = InitializableAdminUpgradeabilityProxy(
|
||||
payable(_proxy)
|
||||
payable(proxyAddress)
|
||||
);
|
||||
|
||||
(uint256 decimals, , , , , , , , , ) = pool.getReserveConfigurationData(_reserve);
|
||||
(uint256 decimals, , , , , , , , , ) = pool.getReserveConfigurationData(asset);
|
||||
|
||||
bytes memory params = abi.encodeWithSignature(
|
||||
'initialize(uint8,string,string)',
|
||||
uint8(decimals),
|
||||
IERC20Detailed(_implementation).name(),
|
||||
IERC20Detailed(_implementation).symbol()
|
||||
IERC20Detailed(implementation).name(),
|
||||
IERC20Detailed(implementation).symbol()
|
||||
);
|
||||
|
||||
proxy.upgradeToAndCall(_implementation, params);
|
||||
proxy.upgradeToAndCall(implementation, params);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,35 +36,33 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
using ReserveConfiguration for ReserveConfiguration.Map;
|
||||
using UserConfiguration for UserConfiguration.Map;
|
||||
|
||||
LendingPoolAddressesProvider public addressesProvider;
|
||||
LendingPoolAddressesProvider internal addressesProvider;
|
||||
|
||||
mapping(address => ReserveLogic.ReserveData) internal reserves;
|
||||
mapping(address => UserConfiguration.Map) internal usersConfig;
|
||||
|
||||
address[] public reservesList;
|
||||
address[] internal reservesList;
|
||||
|
||||
uint256 constant LIQUIDATION_CLOSE_FACTOR_PERCENT = 5000;
|
||||
uint256 internal constant LIQUIDATION_CLOSE_FACTOR_PERCENT = 5000;
|
||||
|
||||
/**
|
||||
* @dev emitted when a borrower is liquidated
|
||||
* @param _collateral the address of the collateral being liquidated
|
||||
* @param _reserve the address of the reserve
|
||||
* @param _user the address of the user being liquidated
|
||||
* @param _purchaseAmount the total amount liquidated
|
||||
* @param _liquidatedCollateralAmount the amount of collateral being liquidated
|
||||
* @param _liquidator the address of the liquidator
|
||||
* @param _receiveAToken true if the liquidator wants to receive aTokens, false otherwise
|
||||
* @param _timestamp the timestamp of the action
|
||||
* @param collateral the address of the collateral being liquidated
|
||||
* @param principal the address of the reserve
|
||||
* @param user the address of the user being liquidated
|
||||
* @param purchaseAmount the total amount liquidated
|
||||
* @param liquidatedCollateralAmount the amount of collateral being liquidated
|
||||
* @param liquidator the address of the liquidator
|
||||
* @param receiveAToken true if the liquidator wants to receive aTokens, false otherwise
|
||||
**/
|
||||
event LiquidationCall(
|
||||
address indexed _collateral,
|
||||
address indexed _reserve,
|
||||
address indexed _user,
|
||||
uint256 _purchaseAmount,
|
||||
uint256 _liquidatedCollateralAmount,
|
||||
address _liquidator,
|
||||
bool _receiveAToken,
|
||||
uint256 _timestamp
|
||||
address indexed collateral,
|
||||
address indexed principal,
|
||||
address indexed user,
|
||||
uint256 purchaseAmount,
|
||||
uint256 liquidatedCollateralAmount,
|
||||
address liquidator,
|
||||
bool receiveAToken
|
||||
);
|
||||
|
||||
enum LiquidationErrors {
|
||||
|
@ -103,30 +101,30 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
|
||||
/**
|
||||
* @dev users can invoke this function to liquidate an undercollateralized position.
|
||||
* @param _reserve the address of the collateral to liquidated
|
||||
* @param _reserve the address of the principal reserve
|
||||
* @param _user the address of the borrower
|
||||
* @param _purchaseAmount the amount of principal that the liquidator wants to repay
|
||||
* @param _receiveAToken true if the liquidators wants to receive the aTokens, false if
|
||||
* @param collateral the address of the collateral to liquidated
|
||||
* @param principal the address of the principal reserve
|
||||
* @param user the address of the borrower
|
||||
* @param purchaseAmount the amount of principal that the liquidator wants to repay
|
||||
* @param receiveAToken true if the liquidators wants to receive the aTokens, false if
|
||||
* he wants to receive the underlying asset directly
|
||||
**/
|
||||
function liquidationCall(
|
||||
address _collateral,
|
||||
address _reserve,
|
||||
address _user,
|
||||
uint256 _purchaseAmount,
|
||||
bool _receiveAToken
|
||||
address collateral,
|
||||
address principal,
|
||||
address user,
|
||||
uint256 purchaseAmount,
|
||||
bool receiveAToken
|
||||
) external returns (uint256, string memory) {
|
||||
ReserveLogic.ReserveData storage principalReserve = reserves[_reserve];
|
||||
ReserveLogic.ReserveData storage collateralReserve = reserves[_collateral];
|
||||
UserConfiguration.Map storage userConfig = usersConfig[_user];
|
||||
ReserveLogic.ReserveData storage principalReserve = reserves[principal];
|
||||
ReserveLogic.ReserveData storage collateralReserve = reserves[collateral];
|
||||
UserConfiguration.Map storage userConfig = usersConfig[user];
|
||||
|
||||
LiquidationCallLocalVars memory vars;
|
||||
|
||||
(, , , , vars.healthFactor) = GenericLogic.calculateUserAccountData(
|
||||
_user,
|
||||
user,
|
||||
reserves,
|
||||
usersConfig[_user],
|
||||
usersConfig[user],
|
||||
reservesList,
|
||||
addressesProvider.getPriceOracle()
|
||||
);
|
||||
|
@ -138,13 +136,13 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
);
|
||||
}
|
||||
|
||||
vars.userCollateralBalance = IERC20(collateralReserve.aTokenAddress).balanceOf(_user);
|
||||
vars.userCollateralBalance = IERC20(collateralReserve.aTokenAddress).balanceOf(user);
|
||||
|
||||
vars.isCollateralEnabled =
|
||||
collateralReserve.configuration.getLiquidationThreshold() > 0 &&
|
||||
userConfig.isUsingAsCollateral(collateralReserve.index);
|
||||
|
||||
//if _collateral isn't enabled as collateral by _user, it cannot be liquidated
|
||||
//if collateral isn't enabled as collateral by user, it cannot be liquidated
|
||||
if (!vars.isCollateralEnabled) {
|
||||
return (
|
||||
uint256(LiquidationErrors.COLLATERAL_CANNOT_BE_LIQUIDATED),
|
||||
|
@ -152,9 +150,9 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
);
|
||||
}
|
||||
|
||||
//if the user hasn't borrowed the specific currency defined by _reserve, it cannot be liquidated
|
||||
//if the user hasn't borrowed the specific currency defined by asset, it cannot be liquidated
|
||||
(vars.userStableDebt, vars.userVariableDebt) = Helpers.getUserCurrentDebt(
|
||||
_user,
|
||||
user,
|
||||
principalReserve
|
||||
);
|
||||
|
||||
|
@ -170,9 +168,9 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
LIQUIDATION_CLOSE_FACTOR_PERCENT
|
||||
);
|
||||
|
||||
vars.actualAmountToLiquidate = _purchaseAmount > vars.maxPrincipalAmountToLiquidate
|
||||
vars.actualAmountToLiquidate = purchaseAmount > vars.maxPrincipalAmountToLiquidate
|
||||
? vars.maxPrincipalAmountToLiquidate
|
||||
: _purchaseAmount;
|
||||
: purchaseAmount;
|
||||
|
||||
(
|
||||
vars.maxCollateralToLiquidate,
|
||||
|
@ -180,14 +178,14 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
) = calculateAvailableCollateralToLiquidate(
|
||||
collateralReserve,
|
||||
principalReserve,
|
||||
_collateral,
|
||||
_reserve,
|
||||
collateral,
|
||||
principal,
|
||||
vars.actualAmountToLiquidate,
|
||||
vars.userCollateralBalance
|
||||
);
|
||||
|
||||
//if principalAmountNeeded < vars.ActualAmountToLiquidate, there isn't enough
|
||||
//of _collateral to cover the actual amount that is being liquidated, hence we liquidate
|
||||
//of collateral to cover the actual amount that is being liquidated, hence we liquidate
|
||||
//a smaller amount
|
||||
|
||||
if (vars.principalAmountNeeded < vars.actualAmountToLiquidate) {
|
||||
|
@ -197,8 +195,8 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
vars.collateralAtoken = IAToken(collateralReserve.aTokenAddress);
|
||||
|
||||
//if liquidator reclaims the underlying asset, we make sure there is enough available collateral in the reserve
|
||||
if (!_receiveAToken) {
|
||||
uint256 currentAvailableCollateral = IERC20(_collateral).balanceOf(
|
||||
if (!receiveAToken) {
|
||||
uint256 currentAvailableCollateral = IERC20(collateral).balanceOf(
|
||||
address(vars.collateralAtoken)
|
||||
);
|
||||
if (currentAvailableCollateral < vars.maxCollateralToLiquidate) {
|
||||
|
@ -211,55 +209,53 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
|
||||
//update the principal reserve
|
||||
principalReserve.updateCumulativeIndexesAndTimestamp();
|
||||
principalReserve.updateInterestRates(_reserve, vars.actualAmountToLiquidate, 0);
|
||||
principalReserve.updateInterestRates(principal, vars.actualAmountToLiquidate, 0);
|
||||
|
||||
if (vars.userVariableDebt >= vars.actualAmountToLiquidate) {
|
||||
IVariableDebtToken(principalReserve.variableDebtTokenAddress).burn(
|
||||
_user,
|
||||
user,
|
||||
vars.actualAmountToLiquidate
|
||||
);
|
||||
} else {
|
||||
IVariableDebtToken(principalReserve.variableDebtTokenAddress).burn(
|
||||
_user,
|
||||
user,
|
||||
vars.userVariableDebt
|
||||
);
|
||||
IStableDebtToken(principalReserve.stableDebtTokenAddress).burn(
|
||||
_user,
|
||||
user,
|
||||
vars.actualAmountToLiquidate.sub(vars.userVariableDebt)
|
||||
);
|
||||
}
|
||||
|
||||
//if liquidator reclaims the aToken, he receives the equivalent atoken amount
|
||||
if (_receiveAToken) {
|
||||
vars.collateralAtoken.transferOnLiquidation(_user, msg.sender, vars.maxCollateralToLiquidate);
|
||||
if (receiveAToken) {
|
||||
vars.collateralAtoken.transferOnLiquidation(user, msg.sender, vars.maxCollateralToLiquidate);
|
||||
} else {
|
||||
//otherwise receives the underlying asset
|
||||
|
||||
//updating collateral reserve
|
||||
collateralReserve.updateCumulativeIndexesAndTimestamp();
|
||||
collateralReserve.updateInterestRates(_collateral, 0, vars.maxCollateralToLiquidate);
|
||||
collateralReserve.updateInterestRates(collateral, 0, vars.maxCollateralToLiquidate);
|
||||
|
||||
//burn the equivalent amount of atoken
|
||||
vars.collateralAtoken.burn(_user, msg.sender, vars.maxCollateralToLiquidate);
|
||||
vars.collateralAtoken.burn(user, msg.sender, vars.maxCollateralToLiquidate);
|
||||
}
|
||||
|
||||
//transfers the principal currency to the aToken
|
||||
IERC20(_reserve).safeTransferFrom(
|
||||
IERC20(principal).safeTransferFrom(
|
||||
msg.sender,
|
||||
principalReserve.aTokenAddress,
|
||||
vars.actualAmountToLiquidate
|
||||
);
|
||||
|
||||
emit LiquidationCall(
|
||||
_collateral,
|
||||
_reserve,
|
||||
_user,
|
||||
collateral,
|
||||
principal,
|
||||
user,
|
||||
vars.actualAmountToLiquidate,
|
||||
vars.maxCollateralToLiquidate,
|
||||
msg.sender,
|
||||
_receiveAToken,
|
||||
//solium-disable-next-line
|
||||
block.timestamp
|
||||
receiveAToken
|
||||
);
|
||||
|
||||
return (uint256(LiquidationErrors.NO_ERROR), 'No errors');
|
||||
|
@ -279,20 +275,20 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
* @dev calculates how much of a specific collateral can be liquidated, given
|
||||
* a certain amount of principal currency. This function needs to be called after
|
||||
* all the checks to validate the liquidation have been performed, otherwise it might fail.
|
||||
* @param _collateralAddress the collateral to be liquidated
|
||||
* @param _principalAddress the principal currency to be liquidated
|
||||
* @param _purchaseAmount the amount of principal being liquidated
|
||||
* @param _userCollateralBalance the collatera balance for the specific _collateral asset of the user being liquidated
|
||||
* @param collateralAddress the collateral to be liquidated
|
||||
* @param principalAddress the principal currency to be liquidated
|
||||
* @param purchaseAmount the amount of principal being liquidated
|
||||
* @param userCollateralBalance the collatera balance for the specific collateral asset of the user being liquidated
|
||||
* @return collateralAmount the maximum amount that is possible to liquidated given all the liquidation constraints (user balance, close factor)
|
||||
* @return principalAmountNeeded the purchase amount
|
||||
**/
|
||||
function calculateAvailableCollateralToLiquidate(
|
||||
ReserveLogic.ReserveData storage _collateralReserve,
|
||||
ReserveLogic.ReserveData storage _principalReserve,
|
||||
address _collateralAddress,
|
||||
address _principalAddress,
|
||||
uint256 _purchaseAmount,
|
||||
uint256 _userCollateralBalance
|
||||
address collateralAddress,
|
||||
address principalAddress,
|
||||
uint256 purchaseAmount,
|
||||
uint256 userCollateralBalance
|
||||
) internal view returns (uint256, uint256) {
|
||||
uint256 collateralAmount = 0;
|
||||
uint256 principalAmountNeeded = 0;
|
||||
|
@ -301,8 +297,8 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
// Usage of a memory struct of vars to avoid "Stack too deep" errors due to local variables
|
||||
AvailableCollateralToLiquidateLocalVars memory vars;
|
||||
|
||||
vars.collateralPrice = oracle.getAssetPrice(_collateralAddress);
|
||||
vars.principalCurrencyPrice = oracle.getAssetPrice(_principalAddress);
|
||||
vars.collateralPrice = oracle.getAssetPrice(collateralAddress);
|
||||
vars.principalCurrencyPrice = oracle.getAssetPrice(principalAddress);
|
||||
|
||||
(, , vars.liquidationBonus, vars.collateralDecimals) = _collateralReserve
|
||||
.configuration
|
||||
|
@ -313,13 +309,13 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
//max amount of principal currency that is available for liquidation.
|
||||
vars.maxAmountCollateralToLiquidate = vars
|
||||
.principalCurrencyPrice
|
||||
.mul(_purchaseAmount)
|
||||
.mul(purchaseAmount)
|
||||
.mul(10**vars.collateralDecimals)
|
||||
.div(vars.collateralPrice.mul(10**vars.principalDecimals))
|
||||
.percentMul(vars.liquidationBonus);
|
||||
|
||||
if (vars.maxAmountCollateralToLiquidate > _userCollateralBalance) {
|
||||
collateralAmount = _userCollateralBalance;
|
||||
if (vars.maxAmountCollateralToLiquidate > userCollateralBalance) {
|
||||
collateralAmount = userCollateralBalance;
|
||||
principalAmountNeeded = vars
|
||||
.collateralPrice
|
||||
.mul(collateralAmount)
|
||||
|
@ -328,7 +324,7 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
|
|||
.percentDiv(vars.liquidationBonus);
|
||||
} else {
|
||||
collateralAmount = vars.maxAmountCollateralToLiquidate;
|
||||
principalAmountNeeded = _purchaseAmount;
|
||||
principalAmountNeeded = purchaseAmount;
|
||||
}
|
||||
return (collateralAmount, principalAmountNeeded);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user