pragma solidity ^0.6.8; pragma experimental ABIEncoderV2; import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddressesProvider.sol'; import {IERC20Detailed} from '../interfaces/IERC20Detailed.sol'; import {LendingPool} from '../lendingpool/LendingPool.sol'; import {AToken} from '../tokenization/AToken.sol'; contract AaveProtocolTestHelpers { 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) { LendingPool pool = LendingPool(payable(ADDRESSES_PROVIDER.getLendingPool())); address[] memory reserves = pool.getReserves(); 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) { LendingPool pool = LendingPool(payable(ADDRESSES_PROVIDER.getLendingPool())); address[] memory reserves = pool.getReserves(); TokenData[] memory aTokens = new TokenData[](reserves.length); for (uint256 i = 0; i < reserves.length; i++) { (address aTokenAddress, , ) = pool.getReserveTokensAddresses(reserves[i]); aTokens[i] = TokenData({ symbol: AToken(payable(aTokenAddress)).symbol(), tokenAddress: aTokenAddress }); } return aTokens; } }