Skip to content

Commit 2b883e4

Browse files
committed
fix: Adapt code to support >128 reserves
1 parent c1ada1c commit 2b883e4

File tree

3 files changed

+40
-17
lines changed

3 files changed

+40
-17
lines changed

contracts/protocol/lendingpool/LendingPool.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
8787
_addressesProvider = provider;
8888
_maxStableRateBorrowSizePercent = 2500;
8989
_flashLoanPremiumTotal = 9;
90-
_maxNumberOfReserves = 128;
90+
_maxNumberOfReserves = UserConfiguration._maxReserves;
9191
}
9292

9393
/**
@@ -713,7 +713,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
713713
}
714714

715715
/**
716-
* @dev Returns the fee on flash loans
716+
* @dev Returns the fee on flash loans
717717
*/
718718
function FLASHLOAN_PREMIUM_TOTAL() public view returns (uint256) {
719719
return _flashLoanPremiumTotal;

contracts/protocol/libraries/configuration/UserConfiguration.sol

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ library UserConfiguration {
1313
uint256 internal constant BORROWING_MASK =
1414
0x5555555555555555555555555555555555555555555555555555555555555555;
1515

16+
uint256 internal constant _maxReserves = 256;
17+
uint256 internal constant _indexCount = _maxReserves / 128 + ((_maxReserves % 128 > 0) ? 1 : 0);
18+
1619
/**
1720
* @dev Sets if the user is borrowing the reserve identified by reserveIndex
1821
* @param self The configuration object
@@ -24,9 +27,11 @@ library UserConfiguration {
2427
uint256 reserveIndex,
2528
bool borrowing
2629
) internal {
27-
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
28-
self.data =
29-
(self.data & ~(1 << (reserveIndex * 2))) |
30+
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
31+
uint256 index = reserveIndex / 128;
32+
reserveIndex = reserveIndex % 128;
33+
self.data[index] =
34+
(self.data[index] & ~(1 << (reserveIndex * 2))) |
3035
(uint256(borrowing ? 1 : 0) << (reserveIndex * 2));
3136
}
3237

@@ -41,9 +46,11 @@ library UserConfiguration {
4146
uint256 reserveIndex,
4247
bool usingAsCollateral
4348
) internal {
44-
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
45-
self.data =
46-
(self.data & ~(1 << (reserveIndex * 2 + 1))) |
49+
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
50+
uint256 index = reserveIndex / 128;
51+
reserveIndex = reserveIndex % 128;
52+
self.data[index] =
53+
(self.data[index] & ~(1 << (reserveIndex * 2 + 1))) |
4754
(uint256(usingAsCollateral ? 1 : 0) << (reserveIndex * 2 + 1));
4855
}
4956

@@ -57,8 +64,10 @@ library UserConfiguration {
5764
DataTypes.UserConfigurationMap memory self,
5865
uint256 reserveIndex
5966
) internal pure returns (bool) {
60-
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
61-
return (self.data >> (reserveIndex * 2)) & 3 != 0;
67+
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
68+
uint256 index = reserveIndex / 128;
69+
reserveIndex = reserveIndex % 128;
70+
return (self.data[index] >> (reserveIndex * 2)) & 3 != 0;
6271
}
6372

6473
/**
@@ -72,8 +81,10 @@ library UserConfiguration {
7281
pure
7382
returns (bool)
7483
{
75-
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
76-
return (self.data >> (reserveIndex * 2)) & 1 != 0;
84+
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
85+
uint256 index = reserveIndex / 128;
86+
reserveIndex = reserveIndex % 128;
87+
return (self.data[index] >> (reserveIndex * 2)) & 1 != 0;
7788
}
7889

7990
/**
@@ -87,8 +98,10 @@ library UserConfiguration {
8798
pure
8899
returns (bool)
89100
{
90-
require(reserveIndex < 128, Errors.UL_INVALID_INDEX);
91-
return (self.data >> (reserveIndex * 2 + 1)) & 1 != 0;
101+
require(reserveIndex < _maxReserves, Errors.UL_INVALID_INDEX);
102+
uint256 index = reserveIndex / 128;
103+
reserveIndex = reserveIndex % 128;
104+
return (self.data[index] >> (reserveIndex * 2 + 1)) & 1 != 0;
92105
}
93106

94107
/**
@@ -97,7 +110,12 @@ library UserConfiguration {
97110
* @return True if the user has been borrowing any reserve, false otherwise
98111
**/
99112
function isBorrowingAny(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) {
100-
return self.data & BORROWING_MASK != 0;
113+
for (uint8 i = 0; i < _indexCount; i++) {
114+
if (self.data[i] & BORROWING_MASK != 0) {
115+
return true;
116+
}
117+
}
118+
return false;
101119
}
102120

103121
/**
@@ -106,6 +124,11 @@ library UserConfiguration {
106124
* @return True if the user has been borrowing any reserve, false otherwise
107125
**/
108126
function isEmpty(DataTypes.UserConfigurationMap memory self) internal pure returns (bool) {
109-
return self.data == 0;
127+
for (uint8 i = 0; i < _indexCount; i++) {
128+
if (self.data[i] != 0) {
129+
return false;
130+
}
131+
}
132+
return true;
110133
}
111134
}

contracts/protocol/libraries/types/DataTypes.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ library DataTypes {
4242
}
4343

4444
struct UserConfigurationMap {
45-
uint256 data;
45+
uint256[2] data; // size is _maxReserves / 128 + ((_maxReserves % 128 > 0) ? 1 : 0), but need to be literal
4646
}
4747

4848
enum InterestRateMode {NONE, STABLE, VARIABLE}

0 commit comments

Comments
 (0)