mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
Created _executeRepay, _executeWithdraw
This commit is contained in:
parent
0f90cda256
commit
44528c7733
|
@ -144,43 +144,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
||||||
uint256 amount,
|
uint256 amount,
|
||||||
address to
|
address to
|
||||||
) external override whenNotPaused returns (uint256) {
|
) external override whenNotPaused returns (uint256) {
|
||||||
DataTypes.ReserveData storage reserve = _reserves[asset];
|
return _executeWithdraw(asset, amount, to);
|
||||||
|
|
||||||
address aToken = reserve.aTokenAddress;
|
|
||||||
|
|
||||||
uint256 userBalance = IAToken(aToken).balanceOf(msg.sender);
|
|
||||||
|
|
||||||
uint256 amountToWithdraw = amount;
|
|
||||||
|
|
||||||
if (amount == type(uint256).max) {
|
|
||||||
amountToWithdraw = userBalance;
|
|
||||||
}
|
|
||||||
|
|
||||||
ValidationLogic.validateWithdraw(
|
|
||||||
asset,
|
|
||||||
amountToWithdraw,
|
|
||||||
userBalance,
|
|
||||||
_reserves,
|
|
||||||
_usersConfig[msg.sender],
|
|
||||||
_reservesList,
|
|
||||||
_reservesCount,
|
|
||||||
_addressesProvider.getPriceOracle()
|
|
||||||
);
|
|
||||||
|
|
||||||
reserve.updateState();
|
|
||||||
|
|
||||||
reserve.updateInterestRates(asset, aToken, 0, amountToWithdraw);
|
|
||||||
|
|
||||||
if (amountToWithdraw == userBalance) {
|
|
||||||
_usersConfig[msg.sender].setUsingAsCollateral(reserve.id, false);
|
|
||||||
emit ReserveUsedAsCollateralDisabled(asset, msg.sender);
|
|
||||||
}
|
|
||||||
|
|
||||||
IAToken(aToken).burn(msg.sender, to, amountToWithdraw, reserve.liquidityIndex);
|
|
||||||
|
|
||||||
emit Withdraw(asset, msg.sender, to, amountToWithdraw);
|
|
||||||
|
|
||||||
return amountToWithdraw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -206,7 +170,6 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
||||||
address onBehalfOf
|
address onBehalfOf
|
||||||
) external override whenNotPaused {
|
) external override whenNotPaused {
|
||||||
DataTypes.ReserveData storage reserve = _reserves[asset];
|
DataTypes.ReserveData storage reserve = _reserves[asset];
|
||||||
|
|
||||||
_executeBorrow(
|
_executeBorrow(
|
||||||
ExecuteBorrowParams(
|
ExecuteBorrowParams(
|
||||||
asset,
|
asset,
|
||||||
|
@ -239,54 +202,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
||||||
uint256 rateMode,
|
uint256 rateMode,
|
||||||
address onBehalfOf
|
address onBehalfOf
|
||||||
) external override whenNotPaused returns (uint256) {
|
) external override whenNotPaused returns (uint256) {
|
||||||
DataTypes.ReserveData storage reserve = _reserves[asset];
|
return _executeRepay(asset, amount, rateMode, onBehalfOf);
|
||||||
|
|
||||||
(uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt(onBehalfOf, reserve);
|
|
||||||
|
|
||||||
DataTypes.InterestRateMode interestRateMode = DataTypes.InterestRateMode(rateMode);
|
|
||||||
|
|
||||||
ValidationLogic.validateRepay(
|
|
||||||
reserve,
|
|
||||||
amount,
|
|
||||||
interestRateMode,
|
|
||||||
onBehalfOf,
|
|
||||||
stableDebt,
|
|
||||||
variableDebt
|
|
||||||
);
|
|
||||||
|
|
||||||
uint256 paybackAmount =
|
|
||||||
interestRateMode == DataTypes.InterestRateMode.STABLE ? stableDebt : variableDebt;
|
|
||||||
|
|
||||||
if (amount < paybackAmount) {
|
|
||||||
paybackAmount = amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
reserve.updateState();
|
|
||||||
|
|
||||||
if (interestRateMode == DataTypes.InterestRateMode.STABLE) {
|
|
||||||
IStableDebtToken(reserve.stableDebtTokenAddress).burn(onBehalfOf, paybackAmount);
|
|
||||||
} else {
|
|
||||||
IVariableDebtToken(reserve.variableDebtTokenAddress).burn(
|
|
||||||
onBehalfOf,
|
|
||||||
paybackAmount,
|
|
||||||
reserve.variableBorrowIndex
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
address aToken = reserve.aTokenAddress;
|
|
||||||
reserve.updateInterestRates(asset, aToken, paybackAmount, 0);
|
|
||||||
|
|
||||||
if (stableDebt.add(variableDebt).sub(paybackAmount) == 0) {
|
|
||||||
_usersConfig[onBehalfOf].setBorrowing(reserve.id, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
IERC20(asset).safeTransferFrom(msg.sender, aToken, paybackAmount);
|
|
||||||
|
|
||||||
IAToken(aToken).handleRepayment(msg.sender, paybackAmount);
|
|
||||||
|
|
||||||
emit Repay(asset, onBehalfOf, msg.sender, paybackAmount);
|
|
||||||
|
|
||||||
return paybackAmount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -929,6 +845,106 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _executeWithdraw(
|
||||||
|
address asset,
|
||||||
|
uint256 amount,
|
||||||
|
address to
|
||||||
|
) internal returns (uint256) {
|
||||||
|
DataTypes.ReserveData storage reserve = _reserves[asset];
|
||||||
|
|
||||||
|
address aToken = reserve.aTokenAddress;
|
||||||
|
|
||||||
|
uint256 userBalance = IAToken(aToken).balanceOf(msg.sender);
|
||||||
|
|
||||||
|
uint256 amountToWithdraw = amount;
|
||||||
|
|
||||||
|
if (amount == type(uint256).max) {
|
||||||
|
amountToWithdraw = userBalance;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValidationLogic.validateWithdraw(
|
||||||
|
asset,
|
||||||
|
amountToWithdraw,
|
||||||
|
userBalance,
|
||||||
|
_reserves,
|
||||||
|
_usersConfig[msg.sender],
|
||||||
|
_reservesList,
|
||||||
|
_reservesCount,
|
||||||
|
_addressesProvider.getPriceOracle()
|
||||||
|
);
|
||||||
|
|
||||||
|
reserve.updateState();
|
||||||
|
|
||||||
|
reserve.updateInterestRates(asset, aToken, 0, amountToWithdraw);
|
||||||
|
|
||||||
|
if (amountToWithdraw == userBalance) {
|
||||||
|
_usersConfig[msg.sender].setUsingAsCollateral(reserve.id, false);
|
||||||
|
emit ReserveUsedAsCollateralDisabled(asset, msg.sender);
|
||||||
|
}
|
||||||
|
|
||||||
|
IAToken(aToken).burn(msg.sender, to, amountToWithdraw, reserve.liquidityIndex);
|
||||||
|
|
||||||
|
emit Withdraw(asset, msg.sender, to, amountToWithdraw);
|
||||||
|
|
||||||
|
return amountToWithdraw;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _executeRepay(
|
||||||
|
address asset,
|
||||||
|
uint256 amount,
|
||||||
|
uint256 rateMode,
|
||||||
|
address onBehalfOf
|
||||||
|
) internal returns (uint256) {
|
||||||
|
DataTypes.ReserveData storage reserve = _reserves[asset];
|
||||||
|
|
||||||
|
(uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt(onBehalfOf, reserve);
|
||||||
|
|
||||||
|
DataTypes.InterestRateMode interestRateMode = DataTypes.InterestRateMode(rateMode);
|
||||||
|
|
||||||
|
ValidationLogic.validateRepay(
|
||||||
|
reserve,
|
||||||
|
amount,
|
||||||
|
interestRateMode,
|
||||||
|
onBehalfOf,
|
||||||
|
stableDebt,
|
||||||
|
variableDebt
|
||||||
|
);
|
||||||
|
|
||||||
|
uint256 paybackAmount =
|
||||||
|
interestRateMode == DataTypes.InterestRateMode.STABLE ? stableDebt : variableDebt;
|
||||||
|
|
||||||
|
if (amount < paybackAmount) {
|
||||||
|
paybackAmount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
reserve.updateState();
|
||||||
|
|
||||||
|
if (interestRateMode == DataTypes.InterestRateMode.STABLE) {
|
||||||
|
IStableDebtToken(reserve.stableDebtTokenAddress).burn(onBehalfOf, paybackAmount);
|
||||||
|
} else {
|
||||||
|
IVariableDebtToken(reserve.variableDebtTokenAddress).burn(
|
||||||
|
onBehalfOf,
|
||||||
|
paybackAmount,
|
||||||
|
reserve.variableBorrowIndex
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
address aToken = reserve.aTokenAddress;
|
||||||
|
reserve.updateInterestRates(asset, aToken, paybackAmount, 0);
|
||||||
|
|
||||||
|
if (stableDebt.add(variableDebt).sub(paybackAmount) == 0) {
|
||||||
|
_usersConfig[onBehalfOf].setBorrowing(reserve.id, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
IERC20(asset).safeTransferFrom(msg.sender, aToken, paybackAmount);
|
||||||
|
|
||||||
|
IAToken(aToken).handleRepayment(msg.sender, paybackAmount);
|
||||||
|
|
||||||
|
emit Repay(asset, onBehalfOf, msg.sender, paybackAmount);
|
||||||
|
|
||||||
|
return paybackAmount;
|
||||||
|
}
|
||||||
|
|
||||||
function _addReserveToList(address asset) internal {
|
function _addReserveToList(address asset) internal {
|
||||||
uint256 reservesCount = _reservesCount;
|
uint256 reservesCount = _reservesCount;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user