mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
Added index to mint and burn of variableDebtToken
This commit is contained in:
parent
dbf1a0b9e7
commit
162c7924a9
|
@ -26,6 +26,7 @@ import {LendingPoolLiquidationManager} from './LendingPoolLiquidationManager.sol
|
|||
import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol';
|
||||
import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/SafeERC20.sol';
|
||||
import {ILendingPool} from '../interfaces/ILendingPool.sol';
|
||||
|
||||
/**
|
||||
* @title LendingPool contract
|
||||
* @notice Implements the actions of the LendingPool, and exposes accessory methods to fetch the users and reserve data
|
||||
|
@ -238,14 +239,17 @@ contract LendingPool is VersionedInitializable, ILendingPool {
|
|||
|
||||
reserve.updateCumulativeIndexesAndTimestamp();
|
||||
|
||||
address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE ? reserve.stableDebtTokenAddress : reserve.variableDebtTokenAddress;
|
||||
address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE
|
||||
? reserve.stableDebtTokenAddress
|
||||
: reserve.variableDebtTokenAddress;
|
||||
|
||||
_mintToReserveTreasury(reserve, onBehalfOf, debtTokenAddress);
|
||||
|
||||
//burns an equivalent amount of debt tokens
|
||||
if (interestRateMode == ReserveLogic.InterestRateMode.STABLE) {
|
||||
IStableDebtToken(reserve.stableDebtTokenAddress).burn(onBehalfOf, paybackAmount);
|
||||
} else {
|
||||
IVariableDebtToken(reserve.variableDebtTokenAddress).burn(onBehalfOf, paybackAmount);
|
||||
IVariableDebtToken(reserve.variableDebtTokenAddress).burn(onBehalfOf, paybackAmount, reserve.variableBorrowIndex);
|
||||
}
|
||||
|
||||
address aToken = reserve.aTokenAddress;
|
||||
|
@ -282,10 +286,12 @@ contract LendingPool is VersionedInitializable, ILendingPool {
|
|||
|
||||
reserve.updateCumulativeIndexesAndTimestamp();
|
||||
|
||||
address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE ? reserve.stableDebtTokenAddress : reserve.variableDebtTokenAddress;
|
||||
address debtTokenAddress = interestRateMode == ReserveLogic.InterestRateMode.STABLE
|
||||
? reserve.stableDebtTokenAddress
|
||||
: reserve.variableDebtTokenAddress;
|
||||
|
||||
_mintToReserveTreasury(reserve, msg.sender, debtTokenAddress);
|
||||
|
||||
|
||||
if (interestRateMode == ReserveLogic.InterestRateMode.STABLE) {
|
||||
//burn stable rate tokens, mint variable rate tokens
|
||||
IStableDebtToken(reserve.stableDebtTokenAddress).burn(msg.sender, stableDebt);
|
||||
|
@ -344,7 +350,6 @@ contract LendingPool is VersionedInitializable, ILendingPool {
|
|||
|
||||
_mintToReserveTreasury(reserve, user, address(stableDebtToken));
|
||||
|
||||
|
||||
stableDebtToken.burn(user, stableBorrowBalance);
|
||||
stableDebtToken.mint(user, stableBorrowBalance, reserve.currentStableBorrowRate);
|
||||
|
||||
|
@ -779,7 +784,6 @@ contract LendingPool is VersionedInitializable, ILendingPool {
|
|||
* @param vars Input struct for the borrowing action, in order to avoid STD errors
|
||||
**/
|
||||
function _executeBorrow(ExecuteBorrowParams memory vars) internal {
|
||||
|
||||
ReserveLogic.ReserveData storage reserve = _reserves[vars.asset];
|
||||
UserConfiguration.Map storage userConfig = _usersConfig[msg.sender];
|
||||
|
||||
|
@ -807,16 +811,15 @@ contract LendingPool is VersionedInitializable, ILendingPool {
|
|||
userConfig.setBorrowing(reserveId, true);
|
||||
}
|
||||
|
||||
address debtTokenAddress = ReserveLogic.InterestRateMode(vars.interestRateMode) == ReserveLogic.InterestRateMode.STABLE ?
|
||||
reserve.stableDebtTokenAddress
|
||||
:
|
||||
reserve.variableDebtTokenAddress;
|
||||
|
||||
|
||||
reserve.updateCumulativeIndexesAndTimestamp();
|
||||
address debtTokenAddress = ReserveLogic.InterestRateMode(vars.interestRateMode) ==
|
||||
ReserveLogic.InterestRateMode.STABLE
|
||||
? reserve.stableDebtTokenAddress
|
||||
: reserve.variableDebtTokenAddress;
|
||||
|
||||
_mintToReserveTreasury(reserve, vars.user, debtTokenAddress);
|
||||
|
||||
reserve.updateCumulativeIndexesAndTimestamp();
|
||||
|
||||
//caching the current stable borrow rate
|
||||
uint256 currentStableRate = 0;
|
||||
|
||||
|
@ -825,13 +828,9 @@ contract LendingPool is VersionedInitializable, ILendingPool {
|
|||
) {
|
||||
currentStableRate = reserve.currentStableBorrowRate;
|
||||
|
||||
IStableDebtToken(debtTokenAddress).mint(
|
||||
vars.user,
|
||||
vars.amount,
|
||||
currentStableRate
|
||||
);
|
||||
IStableDebtToken(debtTokenAddress).mint(vars.user, vars.amount, currentStableRate);
|
||||
} else {
|
||||
IVariableDebtToken(debtTokenAddress).mint(vars.user, vars.amount);
|
||||
IVariableDebtToken(debtTokenAddress).mint(vars.user, vars.amount, reserve.variableBorrowIndex);
|
||||
}
|
||||
|
||||
reserve.updateInterestRates(
|
||||
|
@ -933,23 +932,26 @@ contract LendingPool is VersionedInitializable, ILendingPool {
|
|||
return _addressesProvider;
|
||||
}
|
||||
|
||||
function _mintToReserveTreasury(ReserveLogic.ReserveData storage reserve, address user, address debtTokenAddress) internal {
|
||||
|
||||
function _mintToReserveTreasury(
|
||||
ReserveLogic.ReserveData storage reserve,
|
||||
address user,
|
||||
address debtTokenAddress
|
||||
) internal {
|
||||
uint256 reserveFactor = reserve.configuration.getReserveFactor();
|
||||
if(reserveFactor == 0) {
|
||||
if (reserveFactor == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint256 currentPrincipalBalance = DebtTokenBase(debtTokenAddress).principalBalanceOf(user);
|
||||
//calculating the interest accrued since the last borrow and minting the equivalent amount to the reserve factor
|
||||
if(currentPrincipalBalance > 0){
|
||||
|
||||
uint256 balanceIncrease = IERC20(debtTokenAddress).balanceOf(user).sub(currentPrincipalBalance);
|
||||
if (currentPrincipalBalance > 0) {
|
||||
uint256 balanceIncrease = IERC20(debtTokenAddress).balanceOf(user).sub(
|
||||
currentPrincipalBalance
|
||||
);
|
||||
|
||||
uint256 amountForReserveFactor = balanceIncrease.percentMul(reserveFactor);
|
||||
|
||||
IAToken(reserve.aTokenAddress).mintToReserve(amountForReserveFactor);
|
||||
}
|
||||
|
||||
IAToken(reserve.aTokenAddress).mintToReserve(amountForReserveFactor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,23 +54,21 @@ contract VariableDebtToken is DebtTokenBase, IVariableDebtToken {
|
|||
* @dev mints new variable debt
|
||||
* @param user the user receiving the debt
|
||||
* @param amount the amount of debt being minted
|
||||
* @param index the variable debt index of the reserve
|
||||
**/
|
||||
function mint(address user, uint256 amount) external override onlyLendingPool {
|
||||
|
||||
uint256 index = POOL.getReserveNormalizedVariableDebt(UNDERLYING_ASSET);
|
||||
function mint(address user, uint256 amount, uint256 index) external override onlyLendingPool {
|
||||
|
||||
_mint(user, amount.rayDiv(index));
|
||||
|
||||
emit MintDebt(user, amount, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev burns user variable debt
|
||||
* @param user the user which debt is burnt
|
||||
* @param amount the amount of debt being burned
|
||||
* @param index the variable debt index of the reserve
|
||||
**/
|
||||
function burn(address user, uint256 amount) external override onlyLendingPool {
|
||||
|
||||
uint256 index = POOL.getReserveNormalizedVariableDebt(UNDERLYING_ASSET);
|
||||
function burn(address user, uint256 amount, uint256 index) external override onlyLendingPool {
|
||||
_burn(user, amount.rayDiv(index));
|
||||
_userIndexes[user] = index;
|
||||
emit BurnDebt(user, amount, index);
|
||||
|
|
|
@ -36,15 +36,17 @@ interface IVariableDebtToken {
|
|||
* @dev mints new variable debt
|
||||
* @param user the user receiving the debt
|
||||
* @param amount the amount of debt being minted
|
||||
* @param index the variable debt index of the reserve
|
||||
**/
|
||||
function mint(address user, uint256 amount) external;
|
||||
function mint(address user, uint256 amount, uint256 index) external;
|
||||
|
||||
/**
|
||||
* @dev burns user variable debt
|
||||
* @param user the user which debt is burnt
|
||||
* @param amount the amount of debt being burned
|
||||
* @param index the variable debt index of the reserve
|
||||
**/
|
||||
function burn(address user, uint256 amount) external;
|
||||
function burn(address user, uint256 amount, uint256 index) external;
|
||||
|
||||
/**
|
||||
* @dev returns the scaled balance of the variable debt token
|
||||
|
|
Loading…
Reference in New Issue
Block a user