Added index to mint and burn of variableDebtToken

This commit is contained in:
The3D 2020-09-14 09:33:53 +02:00
parent dbf1a0b9e7
commit 162c7924a9
3 changed files with 39 additions and 37 deletions

View File

@ -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);
} }
} }
} }

View File

@ -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);

View File

@ -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