mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { LendingPool } from '../../../../types/LendingPool';
 | 
						|
import { ReserveData, UserReserveData } from './interfaces';
 | 
						|
import {
 | 
						|
  getLendingRateOracle,
 | 
						|
  getIErc20Detailed,
 | 
						|
  getMintableERC20,
 | 
						|
  getAToken,
 | 
						|
  getStableDebtToken,
 | 
						|
  getVariableDebtToken,
 | 
						|
} from '../../../../helpers/contracts-getters';
 | 
						|
import { tEthereumAddress } from '../../../../helpers/types';
 | 
						|
import BigNumber from 'bignumber.js';
 | 
						|
import { getDb, DRE } from '../../../../helpers/misc-utils';
 | 
						|
import { AaveProtocolDataProvider } from '../../../../types/AaveProtocolDataProvider';
 | 
						|
 | 
						|
export const getReserveData = async (
 | 
						|
  helper: AaveProtocolDataProvider,
 | 
						|
  reserve: tEthereumAddress
 | 
						|
): Promise<ReserveData> => {
 | 
						|
  const [reserveData, tokenAddresses, rateOracle, token] = await Promise.all([
 | 
						|
    helper.getReserveData(reserve),
 | 
						|
    helper.getReserveTokensAddresses(reserve),
 | 
						|
    getLendingRateOracle(),
 | 
						|
    getIErc20Detailed(reserve),
 | 
						|
  ]);
 | 
						|
 | 
						|
  const stableDebtToken = await getStableDebtToken(tokenAddresses.stableDebtTokenAddress);
 | 
						|
  const variableDebtToken = await getVariableDebtToken(tokenAddresses.variableDebtTokenAddress);
 | 
						|
 | 
						|
  const { 0: principalStableDebt } = await stableDebtToken.getSupplyData();
 | 
						|
  const totalStableDebtLastUpdated = await stableDebtToken.getTotalSupplyLastUpdated();
 | 
						|
 | 
						|
  const scaledVariableDebt = await variableDebtToken.scaledTotalSupply();
 | 
						|
 | 
						|
  const rate = (await rateOracle.getMarketBorrowRate(reserve)).toString();
 | 
						|
  const symbol = await token.symbol();
 | 
						|
  const decimals = new BigNumber(await token.decimals());
 | 
						|
 | 
						|
  const totalLiquidity = new BigNumber(reserveData.availableLiquidity.toString())
 | 
						|
    .plus(reserveData.totalStableDebt.toString())
 | 
						|
    .plus(reserveData.totalVariableDebt.toString());
 | 
						|
 | 
						|
  const utilizationRate = new BigNumber(
 | 
						|
    totalLiquidity.eq(0)
 | 
						|
      ? 0
 | 
						|
      : new BigNumber(reserveData.totalStableDebt.toString())
 | 
						|
          .plus(reserveData.totalVariableDebt.toString())
 | 
						|
          .rayDiv(totalLiquidity)
 | 
						|
  );
 | 
						|
 | 
						|
  return {
 | 
						|
    totalLiquidity,
 | 
						|
    utilizationRate,
 | 
						|
    availableLiquidity: new BigNumber(reserveData.availableLiquidity.toString()),
 | 
						|
    totalStableDebt: new BigNumber(reserveData.totalStableDebt.toString()),
 | 
						|
    totalVariableDebt: new BigNumber(reserveData.totalVariableDebt.toString()),
 | 
						|
    liquidityRate: new BigNumber(reserveData.liquidityRate.toString()),
 | 
						|
    variableBorrowRate: new BigNumber(reserveData.variableBorrowRate.toString()),
 | 
						|
    stableBorrowRate: new BigNumber(reserveData.stableBorrowRate.toString()),
 | 
						|
    averageStableBorrowRate: new BigNumber(reserveData.averageStableBorrowRate.toString()),
 | 
						|
    liquidityIndex: new BigNumber(reserveData.liquidityIndex.toString()),
 | 
						|
    variableBorrowIndex: new BigNumber(reserveData.variableBorrowIndex.toString()),
 | 
						|
    lastUpdateTimestamp: new BigNumber(reserveData.lastUpdateTimestamp),
 | 
						|
    totalStableDebtLastUpdated: new BigNumber(totalStableDebtLastUpdated),
 | 
						|
    principalStableDebt: new BigNumber(principalStableDebt.toString()),
 | 
						|
    scaledVariableDebt: new BigNumber(scaledVariableDebt.toString()),
 | 
						|
    address: reserve,
 | 
						|
    aTokenAddress: tokenAddresses.aTokenAddress,
 | 
						|
    symbol,
 | 
						|
    decimals,
 | 
						|
    marketStableRate: new BigNumber(rate),
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
export const getUserData = async (
 | 
						|
  pool: LendingPool,
 | 
						|
  helper: AaveProtocolDataProvider,
 | 
						|
  reserve: string,
 | 
						|
  user: tEthereumAddress,
 | 
						|
  sender?: tEthereumAddress
 | 
						|
): Promise<UserReserveData> => {
 | 
						|
  const [userData, scaledATokenBalance] = await Promise.all([
 | 
						|
    helper.getUserReserveData(reserve, user),
 | 
						|
    getATokenUserData(reserve, user, helper),
 | 
						|
  ]);
 | 
						|
 | 
						|
  const token = await getMintableERC20(reserve);
 | 
						|
  const walletBalance = new BigNumber((await token.balanceOf(sender || user)).toString());
 | 
						|
 | 
						|
  return {
 | 
						|
    scaledATokenBalance: new BigNumber(scaledATokenBalance),
 | 
						|
    currentATokenBalance: new BigNumber(userData.currentATokenBalance.toString()),
 | 
						|
    currentStableDebt: new BigNumber(userData.currentStableDebt.toString()),
 | 
						|
    currentVariableDebt: new BigNumber(userData.currentVariableDebt.toString()),
 | 
						|
    principalStableDebt: new BigNumber(userData.principalStableDebt.toString()),
 | 
						|
    scaledVariableDebt: new BigNumber(userData.scaledVariableDebt.toString()),
 | 
						|
    stableBorrowRate: new BigNumber(userData.stableBorrowRate.toString()),
 | 
						|
    liquidityRate: new BigNumber(userData.liquidityRate.toString()),
 | 
						|
    usageAsCollateralEnabled: userData.usageAsCollateralEnabled,
 | 
						|
    stableRateLastUpdated: new BigNumber(userData.stableRateLastUpdated.toString()),
 | 
						|
    walletBalance,
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
export const getReserveAddressFromSymbol = async (symbol: string) => {
 | 
						|
  const token = await getMintableERC20(
 | 
						|
    (await getDb().get(`${symbol}.${DRE.network.name}`).value()).address
 | 
						|
  );
 | 
						|
 | 
						|
  if (!token) {
 | 
						|
    throw `Could not find instance for contract ${symbol}`;
 | 
						|
  }
 | 
						|
  return token.address;
 | 
						|
};
 | 
						|
 | 
						|
const getATokenUserData = async (
 | 
						|
  reserve: string,
 | 
						|
  user: string,
 | 
						|
  helpersContract: AaveProtocolDataProvider
 | 
						|
) => {
 | 
						|
  const aTokenAddress: string = (await helpersContract.getReserveTokensAddresses(reserve))
 | 
						|
    .aTokenAddress;
 | 
						|
 | 
						|
  const aToken = await getAToken(aTokenAddress);
 | 
						|
 | 
						|
  const scaledBalance = await aToken.scaledBalanceOf(user);
 | 
						|
  return scaledBalance.toString();
 | 
						|
};
 |