@@ -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}
0 commit comments