fix: improved block on borrow/repay in the same tx

This commit is contained in:
The3D 2021-07-12 03:07:47 +02:00
parent 76a141cd36
commit d62ef92d30
3 changed files with 11 additions and 11 deletions

View File

@ -781,8 +781,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
vars.releaseUnderlying ? vars.amount : 0 vars.releaseUnderlying ? vars.amount : 0
); );
_lastBorrower = vars.user; _usersLastBorrowTimestamp[vars.asset][vars.user] = block.timestamp;
_lastBorrowTimestamp = uint40(block.timestamp);
if (vars.releaseUnderlying) { if (vars.releaseUnderlying) {
IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(vars.user, vars.amount); IAToken(reserveCache.aTokenAddress).transferUnderlyingTo(vars.user, vars.amount);
@ -901,14 +900,14 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
DataTypes.InterestRateMode interestRateMode = DataTypes.InterestRateMode(rateMode); DataTypes.InterestRateMode interestRateMode = DataTypes.InterestRateMode(rateMode);
ValidationLogic.validateRepay( ValidationLogic.validateRepay(
_lastBorrower,
_lastBorrowTimestamp,
reserveCache, reserveCache,
asset,
amount, amount,
interestRateMode, interestRateMode,
onBehalfOf, onBehalfOf,
stableDebt, stableDebt,
variableDebt variableDebt,
_usersLastBorrowTimestamp
); );
uint256 paybackAmount = uint256 paybackAmount =

View File

@ -36,7 +36,6 @@ contract LendingPoolStorage {
uint256 internal _flashLoanPremiumToProtocol; uint256 internal _flashLoanPremiumToProtocol;
address internal _lastBorrower; mapping(address => mapping(address => uint256)) _usersLastBorrowTimestamp;
uint40 internal _lastBorrowTimestamp;
} }

View File

@ -249,21 +249,23 @@ library ValidationLogic {
/** /**
* @dev Validates a repay action * @dev Validates a repay action
* @param reserveCache The cached data of the reserve * @param reserveCache The cached data of the reserve
* @param asset The asset address
* @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1) * @param amountSent The amount sent for the repayment. Can be an actual value or uint(-1)
* @param rateMode the interest rate mode of the debt being repaid * @param rateMode the interest rate mode of the debt being repaid
* @param onBehalfOf The address of the user msg.sender is repaying for * @param onBehalfOf The address of the user msg.sender is repaying for
* @param stableDebt The borrow balance of the user * @param stableDebt The borrow balance of the user
* @param variableDebt The borrow balance of the user * @param variableDebt The borrow balance of the user
* @param lastUsersBorrowTimestamp The data structure that keeps track of all the latest borrowings from the users
*/ */
function validateRepay( function validateRepay(
address lastBorrower,
uint40 lastBorrowTimestamp,
DataTypes.ReserveCache memory reserveCache, DataTypes.ReserveCache memory reserveCache,
address asset,
uint256 amountSent, uint256 amountSent,
DataTypes.InterestRateMode rateMode, DataTypes.InterestRateMode rateMode,
address onBehalfOf, address onBehalfOf,
uint256 stableDebt, uint256 stableDebt,
uint256 variableDebt uint256 variableDebt,
mapping(address => mapping(address => uint256)) storage lastUsersBorrowTimestamp
) external view { ) external view {
(bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlagsMemory(); (bool isActive, , , , bool isPaused) = reserveCache.reserveConfiguration.getFlagsMemory();
require(isActive, Errors.VL_NO_ACTIVE_RESERVE); require(isActive, Errors.VL_NO_ACTIVE_RESERVE);
@ -272,7 +274,7 @@ library ValidationLogic {
require(amountSent > 0, Errors.VL_INVALID_AMOUNT); require(amountSent > 0, Errors.VL_INVALID_AMOUNT);
require( require(
lastBorrower != onBehalfOf || lastBorrowTimestamp != uint40(block.timestamp), lastUsersBorrowTimestamp[asset][onBehalfOf] != uint40(block.timestamp),
Errors.VL_SAME_BLOCK_BORROW_REPAY Errors.VL_SAME_BLOCK_BORROW_REPAY
); );