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