mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			194 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { TestEnv, makeSuite } from './helpers/make-suite';
 | |
| import { deployDefaultReserveInterestRateStrategy } from '../../helpers/contracts-deployments';
 | |
| 
 | |
| import { APPROVAL_AMOUNT_LENDING_POOL, PERCENTAGE_FACTOR, RAY } from '../../helpers/constants';
 | |
| 
 | |
| import { rateStrategyStableOne } from '../../markets/aave/rateStrategies';
 | |
| 
 | |
| import { strategyDAI } from '../../markets/aave/reservesConfigs';
 | |
| import { AToken, DefaultReserveInterestRateStrategy, MintableERC20 } from '../../types';
 | |
| import BigNumber from 'bignumber.js';
 | |
| import './helpers/utils/math';
 | |
| 
 | |
| const { expect } = require('chai');
 | |
| 
 | |
| makeSuite('Interest rate strategy tests', (testEnv: TestEnv) => {
 | |
|   let strategyInstance: DefaultReserveInterestRateStrategy;
 | |
|   let dai: MintableERC20;
 | |
|   let aDai: AToken;
 | |
| 
 | |
|   before(async () => {
 | |
|     dai = testEnv.dai;
 | |
|     aDai = testEnv.aDai;
 | |
| 
 | |
|     const { addressesProvider } = testEnv;
 | |
| 
 | |
|     strategyInstance = await deployDefaultReserveInterestRateStrategy(
 | |
|       [
 | |
|         addressesProvider.address,
 | |
|         rateStrategyStableOne.optimalUtilizationRate,
 | |
|         rateStrategyStableOne.baseVariableBorrowRate,
 | |
|         rateStrategyStableOne.variableRateSlope1,
 | |
|         rateStrategyStableOne.variableRateSlope2,
 | |
|         rateStrategyStableOne.stableRateSlope1,
 | |
|         rateStrategyStableOne.stableRateSlope2,
 | |
|       ],
 | |
|       false
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('Checks rates at 0% utilization rate, empty reserve', async () => {
 | |
|     const {
 | |
|       0: currentLiquidityRate,
 | |
|       1: currentStableBorrowRate,
 | |
|       2: currentVariableBorrowRate,
 | |
|     } = await strategyInstance['calculateInterestRates(address,address,uint256,uint256,uint256,uint256,uint256,uint256)'](
 | |
|       dai.address,
 | |
|       aDai.address,
 | |
|       0,
 | |
|       0,
 | |
|       0,
 | |
|       0,
 | |
|       0,
 | |
|       strategyDAI.reserveFactor
 | |
|     );
 | |
| 
 | |
|     expect(currentLiquidityRate.toString()).to.be.equal('0', 'Invalid liquidity rate');
 | |
|     expect(currentStableBorrowRate.toString()).to.be.equal(
 | |
|       new BigNumber(0.039).times(RAY).toFixed(0),
 | |
|       'Invalid stable rate'
 | |
|     );
 | |
|     expect(currentVariableBorrowRate.toString()).to.be.equal(
 | |
|       rateStrategyStableOne.baseVariableBorrowRate,
 | |
|       'Invalid variable rate'
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('Checks rates at 80% utilization rate', async () => {
 | |
|     const {
 | |
|       0: currentLiquidityRate,
 | |
|       1: currentStableBorrowRate,
 | |
|       2: currentVariableBorrowRate,
 | |
|     } = await strategyInstance['calculateInterestRates(address,address,uint256,uint256,uint256,uint256,uint256,uint256)'](
 | |
|       dai.address,
 | |
|       aDai.address,
 | |
|       '200000000000000000',
 | |
|       '0',
 | |
|       '0',
 | |
|       '800000000000000000',
 | |
|       '0',
 | |
|       strategyDAI.reserveFactor
 | |
|     );
 | |
| 
 | |
|     const expectedVariableRate = new BigNumber(rateStrategyStableOne.baseVariableBorrowRate).plus(
 | |
|       rateStrategyStableOne.variableRateSlope1
 | |
|     );
 | |
| 
 | |
|     expect(currentLiquidityRate.toString()).to.be.equal(
 | |
|       expectedVariableRate
 | |
|         .times(0.8)
 | |
|         .percentMul(new BigNumber(PERCENTAGE_FACTOR).minus(strategyDAI.reserveFactor))
 | |
|         .toFixed(0),
 | |
|       'Invalid liquidity rate'
 | |
|     );
 | |
| 
 | |
|     expect(currentVariableBorrowRate.toString()).to.be.equal(
 | |
|       expectedVariableRate.toFixed(0),
 | |
|       'Invalid variable rate'
 | |
|     );
 | |
| 
 | |
|     expect(currentStableBorrowRate.toString()).to.be.equal(
 | |
|       new BigNumber(0.039).times(RAY).plus(rateStrategyStableOne.stableRateSlope1).toFixed(0),
 | |
|       'Invalid stable rate'
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('Checks rates at 100% utilization rate', async () => {
 | |
|     const {
 | |
|       0: currentLiquidityRate,
 | |
|       1: currentStableBorrowRate,
 | |
|       2: currentVariableBorrowRate,
 | |
|     } = await strategyInstance['calculateInterestRates(address,address,uint256,uint256,uint256,uint256,uint256,uint256)'](
 | |
|       dai.address,
 | |
|       aDai.address,
 | |
|       '0',
 | |
|       '0',
 | |
|       '0',
 | |
|       '800000000000000000',
 | |
|       '0',
 | |
|       strategyDAI.reserveFactor
 | |
|     );
 | |
| 
 | |
|     const expectedVariableRate = new BigNumber(rateStrategyStableOne.baseVariableBorrowRate)
 | |
|       .plus(rateStrategyStableOne.variableRateSlope1)
 | |
|       .plus(rateStrategyStableOne.variableRateSlope2);
 | |
| 
 | |
|     expect(currentLiquidityRate.toString()).to.be.equal(
 | |
|       expectedVariableRate
 | |
|         .percentMul(new BigNumber(PERCENTAGE_FACTOR).minus(strategyDAI.reserveFactor))
 | |
|         .toFixed(0),
 | |
|       'Invalid liquidity rate'
 | |
|     );
 | |
| 
 | |
|     expect(currentVariableBorrowRate.toString()).to.be.equal(
 | |
|       expectedVariableRate.toFixed(0),
 | |
|       'Invalid variable rate'
 | |
|     );
 | |
| 
 | |
|     expect(currentStableBorrowRate.toString()).to.be.equal(
 | |
|       new BigNumber(0.039)
 | |
|         .times(RAY)
 | |
|         .plus(rateStrategyStableOne.stableRateSlope1)
 | |
|         .plus(rateStrategyStableOne.stableRateSlope2)
 | |
|         .toFixed(0),
 | |
|       'Invalid stable rate'
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('Checks rates at 100% utilization rate, 50% stable debt and 50% variable debt, with a 10% avg stable rate', async () => {
 | |
|     const {
 | |
|       0: currentLiquidityRate,
 | |
|       1: currentStableBorrowRate,
 | |
|       2: currentVariableBorrowRate,
 | |
|     } = await strategyInstance['calculateInterestRates(address,address,uint256,uint256,uint256,uint256,uint256,uint256)'](
 | |
|       dai.address,
 | |
|       aDai.address,
 | |
|       '0',
 | |
|       '0',
 | |
|       '400000000000000000',
 | |
|       '400000000000000000',
 | |
|       '100000000000000000000000000',
 | |
|       strategyDAI.reserveFactor
 | |
|     );
 | |
| 
 | |
|     const expectedVariableRate = new BigNumber(rateStrategyStableOne.baseVariableBorrowRate)
 | |
|       .plus(rateStrategyStableOne.variableRateSlope1)
 | |
|       .plus(rateStrategyStableOne.variableRateSlope2);
 | |
| 
 | |
|     const expectedLiquidityRate = new BigNumber(
 | |
|       currentVariableBorrowRate.add('100000000000000000000000000').div(2).toString()
 | |
|     )
 | |
|       .percentMul(new BigNumber(PERCENTAGE_FACTOR).minus(strategyDAI.reserveFactor))
 | |
|       .toFixed(0);
 | |
| 
 | |
|     expect(currentLiquidityRate.toString()).to.be.equal(
 | |
|       expectedLiquidityRate,
 | |
|       'Invalid liquidity rate'
 | |
|     );
 | |
| 
 | |
|     expect(currentVariableBorrowRate.toString()).to.be.equal(
 | |
|       expectedVariableRate.toFixed(0),
 | |
|       'Invalid variable rate'
 | |
|     );
 | |
| 
 | |
|     expect(currentStableBorrowRate.toString()).to.be.equal(
 | |
|       new BigNumber(0.039)
 | |
|         .times(RAY)
 | |
|         .plus(rateStrategyStableOne.stableRateSlope1)
 | |
|         .plus(rateStrategyStableOne.stableRateSlope2)
 | |
|         .toFixed(0),
 | |
|       'Invalid stable rate'
 | |
|     );
 | |
|   });
 | |
| });
 | 
