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 AaveProtocolTestHelpers {
 | |
|   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
 | |
|     );
 | |
|   }
 | |
| }
 | 
