aave-protocol-v2/test-suites/test-aave/rate-strategy.spec.ts

194 lines
5.8 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(
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(
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(
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(
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'
);
});
});