@@ -11,10 +11,12 @@ contract MaglevLens {
11
11
// Packed: underlying asset (address), decimals (uint8), symbol (variable)
12
12
13
13
function vaultsStatic (address [] calldata vaults ) external view returns (bytes [] memory output ) {
14
- output = new bytes [](vaults.length );
15
- for (uint256 i; i < vaults.length ; ++ i) {
16
- IEVault v = IEVault (vaults[i]);
17
- output[i] = abi.encodePacked (v.asset (), v.decimals (), v.symbol ());
14
+ unchecked {
15
+ output = new bytes [](vaults.length );
16
+ for (uint256 i; i < vaults.length ; ++ i) {
17
+ IEVault v = IEVault (vaults[i]);
18
+ output[i] = abi.encodePacked (v.asset (), v.decimals (), v.symbol ());
19
+ }
18
20
}
19
21
}
20
22
@@ -24,19 +26,21 @@ contract MaglevLens {
24
26
}
25
27
26
28
function vaultsGlobal (address [] calldata vaults ) external view returns (VaultGlobal[] memory output ) {
27
- output = new VaultGlobal [](vaults.length );
29
+ unchecked {
30
+ output = new VaultGlobal [](vaults.length );
28
31
29
- for (uint256 i; i < vaults.length ; ++ i) {
30
- IEVault v = IEVault (vaults[i]);
32
+ for (uint256 i; i < vaults.length ; ++ i) {
33
+ IEVault v = IEVault (vaults[i]);
31
34
32
- uint256 cash = v.cash ();
33
- uint256 borrows = v.totalBorrows ();
35
+ uint256 cash = v.cash ();
36
+ uint256 borrows = v.totalBorrows ();
34
37
35
- (uint256 borrowAPY , uint256 supplyAPY ) = _computeAPYs (v.interestRate (), cash, borrows, v.interestFee ());
36
- (uint16 supplyCap , uint16 borrowCap ) = v.caps ();
38
+ (uint256 borrowAPY , uint256 supplyAPY ) = _computeAPYs (v.interestRate (), cash, borrows, v.interestFee ());
39
+ (uint16 supplyCap , uint16 borrowCap ) = v.caps ();
37
40
38
- output[i].packed1 = (cash << (112 + 16 + 16 )) | (borrows << (16 + 16 )) | (supplyCap << 16 ) | borrowCap;
39
- output[i].packed2 = (v.totalSupply () << (48 + 48 )) | (supplyAPY << 48 ) | borrowAPY;
41
+ output[i].packed1 = (cash << (112 + 16 + 16 )) | (borrows << (16 + 16 )) | (supplyCap << 16 ) | borrowCap;
42
+ output[i].packed2 = (v.totalSupply () << (48 + 48 )) | (supplyAPY << 48 ) | borrowAPY;
43
+ }
40
44
}
41
45
}
42
46
@@ -63,29 +67,31 @@ contract MaglevLens {
63
67
}
64
68
65
69
function vaultsDetailed (address [] calldata vaults ) external view returns (VaultDetailed[] memory output ) {
66
- output = new VaultDetailed [](vaults.length );
67
-
68
- for (uint256 i; i < vaults.length ; ++ i) {
69
- IEVault v = IEVault (vaults[i]);
70
- VaultDetailed memory o = output[i];
71
-
72
- o.governorAdmin = v.governorAdmin ();
73
- o.feeReceiver = v.feeReceiver ();
74
- o.interestFee = v.interestFee ();
75
- o.interestRateModel = v.interestRateModel ();
76
- o.protocolFeeShare = v.protocolFeeShare ();
77
- o.protocolFeeReceiver = v.protocolFeeReceiver ();
78
- o.maxLiquidationDiscount = v.maxLiquidationDiscount ();
79
- o.liquidationCoolOffTime = v.liquidationCoolOffTime ();
80
- (o.hookTarget, o.hookedOps) = v.hookConfig ();
81
- o.configFlags = v.configFlags ();
82
- o.unitOfAccount = v.unitOfAccount ();
83
- o.oracle = v.oracle ();
84
-
85
- o.dToken = v.dToken ();
86
-
87
- o.accumulatedFees = v.accumulatedFees ();
88
- o.creator = v.creator ();
70
+ unchecked {
71
+ output = new VaultDetailed [](vaults.length );
72
+
73
+ for (uint256 i; i < vaults.length ; ++ i) {
74
+ IEVault v = IEVault (vaults[i]);
75
+ VaultDetailed memory o = output[i];
76
+
77
+ o.governorAdmin = v.governorAdmin ();
78
+ o.feeReceiver = v.feeReceiver ();
79
+ o.interestFee = v.interestFee ();
80
+ o.interestRateModel = v.interestRateModel ();
81
+ o.protocolFeeShare = v.protocolFeeShare ();
82
+ o.protocolFeeReceiver = v.protocolFeeReceiver ();
83
+ o.maxLiquidationDiscount = v.maxLiquidationDiscount ();
84
+ o.liquidationCoolOffTime = v.liquidationCoolOffTime ();
85
+ (o.hookTarget, o.hookedOps) = v.hookConfig ();
86
+ o.configFlags = v.configFlags ();
87
+ o.unitOfAccount = v.unitOfAccount ();
88
+ o.oracle = v.oracle ();
89
+
90
+ o.dToken = v.dToken ();
91
+
92
+ o.accumulatedFees = v.accumulatedFees ();
93
+ o.creator = v.creator ();
94
+ }
89
95
}
90
96
}
91
97
@@ -98,29 +104,31 @@ contract MaglevLens {
98
104
view
99
105
returns (VaultPersonalState[] memory output )
100
106
{
101
- uint256 numAccounts;
102
- for (uint256 b = subAccountBitmask; b != 0 ; b >>= 1 ) {
103
- if (b & 1 != 0 ) numAccounts++ ;
104
- }
107
+ unchecked {
108
+ uint256 numAccounts;
109
+ for (uint256 b = subAccountBitmask; b != 0 ; b >>= 1 ) {
110
+ if (b & 1 != 0 ) numAccounts++ ;
111
+ }
105
112
106
- output = new VaultPersonalState [](numAccounts * vaults.length );
113
+ output = new VaultPersonalState [](numAccounts * vaults.length );
107
114
108
- uint256 currAccount;
109
- for (uint256 i;; ++ i) {
110
- if (subAccountBitmask & (1 << i) == 0 ) continue ;
115
+ uint256 currAccount;
116
+ for (uint256 i;; ++ i) {
117
+ if (subAccountBitmask & (1 << i) == 0 ) continue ;
111
118
112
- address a = address (uint160 (uint256 (uint160 (me)) ^ i));
119
+ address a = address (uint160 (uint256 (uint160 (me)) ^ i));
113
120
114
- for (uint256 j; j < vaults.length ; ++ j) {
115
- IEVault v = IEVault (vaults[j]);
121
+ for (uint256 j; j < vaults.length ; ++ j) {
122
+ IEVault v = IEVault (vaults[j]);
116
123
117
- uint256 index = (currAccount * vaults.length ) + j;
118
- uint256 flags = (IEVC (evc).isCollateralEnabled (a, address (v)) ? 1 : 0 )
119
- | (IEVC (evc).isControllerEnabled (a, address (v)) ? 2 : 0 );
120
- output[index].packed = (flags << 224 ) | (v.balanceOf (a) << 112 ) | v.debtOf (a);
121
- }
124
+ uint256 index = (currAccount * vaults.length ) + j;
125
+ uint256 flags = (IEVC (evc).isCollateralEnabled (a, address (v)) ? 1 : 0 )
126
+ | (IEVC (evc).isControllerEnabled (a, address (v)) ? 2 : 0 );
127
+ output[index].packed = (flags << 224 ) | (v.balanceOf (a) << 112 ) | v.debtOf (a);
128
+ }
122
129
123
- if (++ currAccount >= numAccounts) break ;
130
+ if (++ currAccount >= numAccounts) break ;
131
+ }
124
132
}
125
133
}
126
134
@@ -140,36 +148,40 @@ contract MaglevLens {
140
148
pure
141
149
returns (uint256 borrowAPY , uint256 supplyAPY )
142
150
{
143
- uint256 totalAssets = cash + borrows;
144
- bool overflow;
151
+ unchecked {
152
+ uint256 totalAssets = cash + borrows;
153
+ bool overflow;
145
154
146
- (borrowAPY, overflow) = RPow.rpow (borrowSPY + 1e27 , SECONDS_PER_YEAR, 1e27 );
155
+ (borrowAPY, overflow) = RPow.rpow (borrowSPY + 1e27 , SECONDS_PER_YEAR, 1e27 );
147
156
148
- if (overflow) return (0 , 0 );
157
+ if (overflow) return (0 , 0 );
149
158
150
- borrowAPY -= 1e27 ;
151
- supplyAPY = totalAssets == 0 ? 0 : borrowAPY * borrows * (1e4 - interestFee) / totalAssets / 1e4 ;
159
+ borrowAPY -= 1e27 ;
160
+ supplyAPY = totalAssets == 0 ? 0 : borrowAPY * borrows * (1e4 - interestFee) / totalAssets / 1e4 ;
152
161
153
- borrowAPY /= 1e18 ;
154
- supplyAPY /= 1e18 ;
162
+ borrowAPY /= 1e18 ;
163
+ supplyAPY /= 1e18 ;
164
+ }
155
165
}
156
166
157
167
function getLTVMatrix (address [] calldata vaults , bool liquidationLtv )
158
168
external
159
169
view
160
170
returns (uint16 [] memory ltvs )
161
171
{
162
- uint256 num = vaults.length ;
163
- ltvs = new uint16 [](num * num);
164
-
165
- for (uint256 i = 0 ; i < num; ++ i) {
166
- address collateralVault = vaults[i];
167
-
168
- for (uint256 j = 0 ; j < num; ++ j) {
169
- if (i == j) continue ;
170
- IEVault debtVault = IEVault (vaults[j]);
171
- ltvs[(i * num) + j] =
172
- liquidationLtv ? debtVault.LTVLiquidation (collateralVault) : debtVault.LTVBorrow (collateralVault);
172
+ unchecked {
173
+ uint256 num = vaults.length ;
174
+ ltvs = new uint16 [](num * num);
175
+
176
+ for (uint256 i = 0 ; i < num; ++ i) {
177
+ address collateralVault = vaults[i];
178
+
179
+ for (uint256 j = 0 ; j < num; ++ j) {
180
+ if (i == j) continue ;
181
+ IEVault debtVault = IEVault (vaults[j]);
182
+ ltvs[(i * num) + j] =
183
+ liquidationLtv ? debtVault.LTVLiquidation (collateralVault) : debtVault.LTVBorrow (collateralVault);
184
+ }
173
185
}
174
186
}
175
187
}
0 commit comments