mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
174 lines
6.0 KiB
Solidity
174 lines
6.0 KiB
Solidity
// SPDX-License-Identifier: agpl-3.0
|
|
pragma solidity ^0.6.8;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddressesProvider.sol';
|
|
import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol';
|
|
import {ILendingPool} from '../interfaces/ILendingPool.sol';
|
|
import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol';
|
|
import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol';
|
|
import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol';
|
|
import {IStableDebtToken} from '../tokenization/interfaces/IStableDebtToken.sol';
|
|
import {IVariableDebtToken} from '../tokenization/interfaces/IVariableDebtToken.sol';
|
|
|
|
contract AaveProtocolDataProvider {
|
|
using ReserveConfiguration for ReserveConfiguration.Map;
|
|
using UserConfiguration for UserConfiguration.Map;
|
|
|
|
struct TokenData {
|
|
string symbol;
|
|
address tokenAddress;
|
|
}
|
|
|
|
ILendingPoolAddressesProvider public immutable ADDRESSES_PROVIDER;
|
|
|
|
constructor(ILendingPoolAddressesProvider addressesProvider) public {
|
|
ADDRESSES_PROVIDER = addressesProvider;
|
|
}
|
|
|
|
function getAllReservesTokens() external view returns (TokenData[] memory) {
|
|
ILendingPool pool = ILendingPool(ADDRESSES_PROVIDER.getLendingPool());
|
|
address[] memory reserves = pool.getReservesList();
|
|
TokenData[] memory reservesTokens = new TokenData[](reserves.length);
|
|
for (uint256 i = 0; i < reserves.length; i++) {
|
|
reservesTokens[i] = TokenData({
|
|
symbol: (reserves[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
|
|
? 'ETH'
|
|
: IERC20Detailed(reserves[i]).symbol(),
|
|
tokenAddress: reserves[i]
|
|
});
|
|
}
|
|
return reservesTokens;
|
|
}
|
|
|
|
function getAllATokens() external view returns (TokenData[] memory) {
|
|
ILendingPool pool = ILendingPool(ADDRESSES_PROVIDER.getLendingPool());
|
|
address[] memory reserves = pool.getReservesList();
|
|
TokenData[] memory aTokens = new TokenData[](reserves.length);
|
|
for (uint256 i = 0; i < reserves.length; i++) {
|
|
ReserveLogic.ReserveData memory reserveData = pool.getReserveData(reserves[i]);
|
|
aTokens[i] = TokenData({
|
|
symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(),
|
|
tokenAddress: reserveData.aTokenAddress
|
|
});
|
|
}
|
|
return aTokens;
|
|
}
|
|
|
|
function getReserveConfigurationData(address asset)
|
|
external
|
|
view
|
|
returns (
|
|
uint256 decimals,
|
|
uint256 ltv,
|
|
uint256 liquidationThreshold,
|
|
uint256 liquidationBonus,
|
|
uint256 reserveFactor,
|
|
bool usageAsCollateralEnabled,
|
|
bool borrowingEnabled,
|
|
bool stableBorrowRateEnabled,
|
|
bool isActive,
|
|
bool isFrozen
|
|
)
|
|
{
|
|
ReserveConfiguration.Map memory configuration = ILendingPool(
|
|
ADDRESSES_PROVIDER.getLendingPool()
|
|
)
|
|
.getConfiguration(asset);
|
|
|
|
(ltv, liquidationThreshold, liquidationBonus, decimals, reserveFactor) = configuration
|
|
.getParamsMemory();
|
|
|
|
(isActive, isFrozen, borrowingEnabled, stableBorrowRateEnabled) = configuration
|
|
.getFlagsMemory();
|
|
|
|
usageAsCollateralEnabled = liquidationThreshold > 0;
|
|
}
|
|
|
|
function getReserveData(address asset)
|
|
external
|
|
view
|
|
returns (
|
|
uint256 availableLiquidity,
|
|
uint256 totalStableDebt,
|
|
uint256 totalVariableDebt,
|
|
uint256 liquidityRate,
|
|
uint256 variableBorrowRate,
|
|
uint256 stableBorrowRate,
|
|
uint256 averageStableBorrowRate,
|
|
uint256 liquidityIndex,
|
|
uint256 variableBorrowIndex,
|
|
uint40 lastUpdateTimestamp
|
|
)
|
|
{
|
|
ReserveLogic.ReserveData memory reserve = ILendingPool(ADDRESSES_PROVIDER.getLendingPool())
|
|
.getReserveData(asset);
|
|
|
|
return (
|
|
IERC20Detailed(asset).balanceOf(reserve.aTokenAddress),
|
|
IERC20Detailed(reserve.stableDebtTokenAddress).totalSupply(),
|
|
IERC20Detailed(reserve.variableDebtTokenAddress).totalSupply(),
|
|
reserve.currentLiquidityRate,
|
|
reserve.currentVariableBorrowRate,
|
|
reserve.currentStableBorrowRate,
|
|
IStableDebtToken(reserve.stableDebtTokenAddress).getAverageStableRate(),
|
|
reserve.liquidityIndex,
|
|
reserve.variableBorrowIndex,
|
|
reserve.lastUpdateTimestamp
|
|
);
|
|
}
|
|
|
|
function getUserReserveData(address asset, address user)
|
|
external
|
|
view
|
|
returns (
|
|
uint256 currentATokenBalance,
|
|
uint256 currentStableDebt,
|
|
uint256 currentVariableDebt,
|
|
uint256 principalStableDebt,
|
|
uint256 scaledVariableDebt,
|
|
uint256 stableBorrowRate,
|
|
uint256 liquidityRate,
|
|
uint40 stableRateLastUpdated,
|
|
bool usageAsCollateralEnabled
|
|
)
|
|
{
|
|
ReserveLogic.ReserveData memory reserve = ILendingPool(ADDRESSES_PROVIDER.getLendingPool())
|
|
.getReserveData(asset);
|
|
|
|
UserConfiguration.Map memory userConfig = ILendingPool(ADDRESSES_PROVIDER.getLendingPool())
|
|
.getUserConfiguration(user);
|
|
|
|
currentATokenBalance = IERC20Detailed(reserve.aTokenAddress).balanceOf(user);
|
|
currentVariableDebt = IERC20Detailed(reserve.variableDebtTokenAddress).balanceOf(user);
|
|
currentStableDebt = IERC20Detailed(reserve.stableDebtTokenAddress).balanceOf(user);
|
|
principalStableDebt = IStableDebtToken(reserve.stableDebtTokenAddress).principalBalanceOf(user);
|
|
scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledBalanceOf(user);
|
|
liquidityRate = reserve.currentLiquidityRate;
|
|
stableBorrowRate = IStableDebtToken(reserve.stableDebtTokenAddress).getUserStableRate(user);
|
|
stableRateLastUpdated = IStableDebtToken(reserve.stableDebtTokenAddress).getUserLastUpdated(
|
|
user
|
|
);
|
|
usageAsCollateralEnabled = userConfig.isUsingAsCollateral(reserve.id);
|
|
}
|
|
|
|
function getReserveTokensAddresses(address asset)
|
|
external
|
|
view
|
|
returns (
|
|
address aTokenAddress,
|
|
address stableDebtTokenAddress,
|
|
address variableDebtTokenAddress
|
|
)
|
|
{
|
|
ReserveLogic.ReserveData memory reserve = ILendingPool(ADDRESSES_PROVIDER.getLendingPool())
|
|
.getReserveData(asset);
|
|
|
|
return (
|
|
reserve.aTokenAddress,
|
|
reserve.stableDebtTokenAddress,
|
|
reserve.variableDebtTokenAddress
|
|
);
|
|
}
|
|
}
|