mirror of
https://github.com/Instadapp/aave-protocol-v2.git
synced 2024-07-29 21:47:30 +00:00
fix: Adapt code to support >128 reserves
This commit is contained in:
parent
c1ada1cb68
commit
2b883e4f43
|
@ -87,7 +87,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
|||
_addressesProvider = provider;
|
||||
_maxStableRateBorrowSizePercent = 2500;
|
||||
_flashLoanPremiumTotal = 9;
|
||||
_maxNumberOfReserves = 128;
|
||||
_maxNumberOfReserves = UserConfiguration._maxReserves;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -713,7 +713,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
|
|||
}
|
||||
|
||||
/**
|
||||
* @dev Returns the fee on flash loans
|
||||
* @dev Returns the fee on flash loans
|
||||
*/
|
||||
function FLASHLOAN_PREMIUM_TOTAL() public view returns (uint256) {
|
||||
return _flashLoanPremiumTotal;
|
||||
|
|
|
@ -13,6 +13,9 @@ library UserConfiguration {
|
|||
uint256 internal constant BORROWING_MASK =
|
||||
0x5555555555555555555555555555555555555555555555555555555555555555;
|
||||
|
||||
uint256 internal constant _maxReserves = 256;
|
||||
uint256 internal constant _indexCount = _maxReserves / 128 + ((_maxReserves % 128 > 0) ? 1 : 0);
|
||||
|
||||
/**
|
||||
* @dev Sets if the user is borrowing the reserve identified by reserveIndex
|
||||
* @param self The configuration object
|
||||
|
@ -24,9 +27,11 @@ library UserConfiguration {
|
|||
uint256 reserveIndex,
|
||||
bool borrowing
|
||||
) internal {
|
||||
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
|
||||
self.data =
|
||||
(self.data & ~(1 << (reserveIndex * 2))) |
|
||||
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
|
||||
uint256 index = reserveIndex / 128;
|
||||
reserveIndex = reserveIndex % 128;
|
||||
self.data[index] =
|
||||
(self.data[index] & ~(1 << (reserveIndex * 2))) |
|
||||
(uint256(borrowing ? 1 : 0) << (reserveIndex * 2));
|
||||
}
|
||||
|
||||
|
@ -41,9 +46,11 @@ library UserConfiguration {
|
|||
uint256 reserveIndex,
|
||||
bool usingAsCollateral
|
||||
) internal {
|
||||
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
|
||||
self.data =
|
||||
(self.data & ~(1 << (reserveIndex * 2 + 1))) |
|
||||
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
|
||||
uint256 index = reserveIndex / 128;
|
||||
reserveIndex = reserveIndex % 128;
|
||||
self.data[index] =
|
||||
(self.data[index] & ~(1 << (reserveIndex * 2 + 1))) |
|
||||
(uint256(usingAsCollateral ? 1 : 0) << (reserveIndex * 2 + 1));
|
||||
}
|
||||
|
||||
|
@ -57,8 +64,10 @@ library UserConfiguration {
|
|||
DataTypes.UserConfigurationMap memory self,
|
||||
uint256 reserveIndex
|
||||
) internal pure returns (bool) {
|
||||
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
|
||||
return (self.data >> (reserveIndex * 2)) & 3 != 0;
|
||||
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
|
||||
uint256 index = reserveIndex / 128;
|
||||
reserveIndex = reserveIndex % 128;
|
||||
return (self.data[index] >> (reserveIndex * 2)) & 3 != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -72,8 +81,10 @@ library UserConfiguration {
|
|||
pure
|
||||
returns (bool)
|
||||
{
|
||||
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
|
||||
return (self.data >> (reserveIndex * 2)) & 1 != 0;
|
||||
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
|
||||
uint256 index = reserveIndex / 128;
|
||||
reserveIndex = reserveIndex % 128;
|
||||
return (self.data[index] >> (reserveIndex * 2)) & 1 != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -87,8 +98,10 @@ library UserConfiguration {
|
|||
pure
|
||||
returns (bool)
|
||||
{
|
||||
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
|
||||
return (self.data >> (reserveIndex * 2 + 1)) & 1 != 0;
|
||||
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
|
||||
uint256 index = reserveIndex / 128;
|
||||
reserveIndex = reserveIndex % 128;
|
||||
return (self.data[index] >> (reserveIndex * 2 + 1)) & 1 != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -97,7 +110,12 @@ library UserConfiguration {
|
|||
* @return True if the user has been borrowing any reserve, false otherwise
|
||||
**/
|
||||
function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) {
|
||||
return self.data & BORROWING_MASK != 0;
|
||||
for (uint8 i = 0; i < _indexCount; i++) {
|
||||
if (self.data[i] & BORROWING_MASK != 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -106,6 +124,11 @@ library UserConfiguration {
|
|||
* @return True if the user has been borrowing any reserve, false otherwise
|
||||
**/
|
||||
function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) {
|
||||
return self.data == 0;
|
||||
for (uint8 i = 0; i < _indexCount; i++) {
|
||||
if (self.data[i] != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ library DataTypes {
|
|||
}
|
||||
|
||||
struct UserConfigurationMap {
|
||||
uint256 data;
|
||||
uint256[2] data; // size is _maxReserves / 128 + ((_maxReserves % 128 > 0) ? 1 : 0), but need to be literal
|
||||
}
|
||||
|
||||
enum InterestRateMode {NONE, STABLE, VARIABLE}
|
||||
|
|
Loading…
Reference in New Issue
Block a user