@@ -3,16 +3,13 @@ pragma solidity ^0.8.0;
3
3
4
4
import "../InvariantTest.sol " ;
5
5
6
- contract MorphoInvariantTest is InvariantTest {
6
+ contract BaseInvariantTest is InvariantTest {
7
7
using MathLib for uint256 ;
8
8
using SharesMathLib for uint256 ;
9
9
using MorphoLib for IMorpho;
10
10
using MorphoBalancesLib for IMorpho;
11
11
using MarketParamsLib for MarketParams;
12
12
13
- uint256 internal immutable MIN_PRICE = ORACLE_PRICE_SCALE / 10 ;
14
- uint256 internal immutable MAX_PRICE = ORACLE_PRICE_SCALE * 10 ;
15
-
16
13
address internal immutable USER;
17
14
18
15
MarketParams[] internal allMarketParams;
@@ -22,18 +19,14 @@ contract MorphoInvariantTest is InvariantTest {
22
19
}
23
20
24
21
function setUp () public virtual override {
25
- _weightSelector (this .setPrice.selector , 10 );
26
- _weightSelector (this .setFeeNoRevert.selector , 5 );
27
- _weightSelector (this .supplyAssetsOnBehalfNoRevert.selector , 100 );
28
- _weightSelector (this .supplySharesOnBehalfNoRevert.selector , 100 );
29
- _weightSelector (this .withdrawAssetsOnBehalfNoRevert.selector , 50 );
30
- _weightSelector (this .borrowAssetsOnBehalfNoRevert.selector , 75 );
31
- _weightSelector (this .repayAssetsOnBehalfNoRevert.selector , 35 );
32
- _weightSelector (this .repaySharesOnBehalfNoRevert.selector , 35 );
33
- _weightSelector (this .supplyCollateralOnBehalfNoRevert.selector , 100 );
34
- _weightSelector (this .withdrawCollateralOnBehalfNoRevert.selector , 50 );
35
- _weightSelector (this .liquidateSeizedAssetsNoRevert.selector , 5 );
36
- _weightSelector (this .liquidateRepaidSharesNoRevert.selector , 5 );
22
+ selectors.push (this .supplyAssetsOnBehalfNoRevert.selector );
23
+ selectors.push (this .supplySharesOnBehalfNoRevert.selector );
24
+ selectors.push (this .withdrawAssetsOnBehalfNoRevert.selector );
25
+ selectors.push (this .borrowAssetsOnBehalfNoRevert.selector );
26
+ selectors.push (this .repayAssetsOnBehalfNoRevert.selector );
27
+ selectors.push (this .repaySharesOnBehalfNoRevert.selector );
28
+ selectors.push (this .supplyCollateralOnBehalfNoRevert.selector );
29
+ selectors.push (this .withdrawCollateralOnBehalfNoRevert.selector );
37
30
38
31
super .setUp ();
39
32
@@ -196,12 +189,6 @@ contract MorphoInvariantTest is InvariantTest {
196
189
197
190
/* HANDLERS */
198
191
199
- function setPrice (uint256 price ) external {
200
- price = bound (price, MIN_PRICE, MAX_PRICE);
201
-
202
- oracle.setPrice (price);
203
- }
204
-
205
192
function setFeeNoRevert (uint256 marketSeed , uint256 newFee ) external {
206
193
MarketParams memory _marketParams = _randomMarket (marketSeed);
207
194
Id _id = _marketParams.id ();
@@ -321,10 +308,10 @@ contract MorphoInvariantTest is InvariantTest {
321
308
_withdrawCollateral (_marketParams, assets, onBehalf, receiver);
322
309
}
323
310
324
- function liquidateSeizedAssetsNoRevert (uint256 marketSeed , uint256 seizedAssets , uint256 onBehalfSeed ) external {
311
+ function liquidateSeizedAssetsNoRevert (uint256 marketSeed , uint256 seizedAssets , uint256 borrowerSeed ) external {
325
312
MarketParams memory _marketParams = _randomMarket (marketSeed);
326
313
327
- address borrower = _randomUnhealthyBorrower (targetSenders (), _marketParams, onBehalfSeed );
314
+ address borrower = _randomUnhealthyBorrower (targetSenders (), _marketParams, borrowerSeed );
328
315
if (borrower == address (0 )) return ;
329
316
330
317
seizedAssets = _boundLiquidateSeizedAssets (_marketParams, borrower, seizedAssets);
@@ -333,90 +320,15 @@ contract MorphoInvariantTest is InvariantTest {
333
320
_liquidateSeizedAssets (_marketParams, borrower, seizedAssets);
334
321
}
335
322
336
- function liquidateRepaidSharesNoRevert (uint256 marketSeed , uint256 repaidShares , uint256 onBehalfSeed ) external {
323
+ function liquidateRepaidSharesNoRevert (uint256 marketSeed , uint256 repaidShares , uint256 borrowerSeed ) external {
337
324
MarketParams memory _marketParams = _randomMarket (marketSeed);
338
325
339
- address borrower = _randomUnhealthyBorrower (targetSenders (), _marketParams, onBehalfSeed );
326
+ address borrower = _randomUnhealthyBorrower (targetSenders (), _marketParams, borrowerSeed );
340
327
if (borrower == address (0 )) return ;
341
328
342
329
repaidShares = _boundLiquidateRepaidShares (_marketParams, borrower, repaidShares);
343
330
if (repaidShares == 0 ) return ;
344
331
345
332
_liquidateRepaidShares (_marketParams, borrower, repaidShares);
346
333
}
347
-
348
- /* INVARIANTS */
349
-
350
- function invariantSupplyShares () public {
351
- address [] memory users = targetSenders ();
352
-
353
- for (uint256 i; i < allMarketParams.length ; ++ i) {
354
- MarketParams memory _marketParams = allMarketParams[i];
355
- Id _id = _marketParams.id ();
356
-
357
- uint256 sumSupplyShares = morpho.supplyShares (_id, FEE_RECIPIENT);
358
- for (uint256 j; j < users.length ; ++ j) {
359
- sumSupplyShares += morpho.supplyShares (_id, users[j]);
360
- }
361
-
362
- assertEq (sumSupplyShares, morpho.totalSupplyShares (_id), vm.toString (_marketParams.lltv));
363
- }
364
- }
365
-
366
- function invariantBorrowShares () public {
367
- address [] memory users = targetSenders ();
368
-
369
- for (uint256 i; i < allMarketParams.length ; ++ i) {
370
- MarketParams memory _marketParams = allMarketParams[i];
371
- Id _id = _marketParams.id ();
372
-
373
- uint256 sumBorrowShares;
374
- for (uint256 j; j < users.length ; ++ j) {
375
- sumBorrowShares += morpho.borrowShares (_id, users[j]);
376
- }
377
-
378
- assertEq (sumBorrowShares, morpho.totalBorrowShares (_id), vm.toString (_marketParams.lltv));
379
- }
380
- }
381
-
382
- function invariantTotalSupplyGeTotalBorrow () public {
383
- for (uint256 i; i < allMarketParams.length ; ++ i) {
384
- MarketParams memory _marketParams = allMarketParams[i];
385
- Id _id = _marketParams.id ();
386
-
387
- assertGe (morpho.totalSupplyAssets (_id), morpho.totalBorrowAssets (_id));
388
- }
389
- }
390
-
391
- function invariantMorphoBalance () public {
392
- for (uint256 i; i < allMarketParams.length ; ++ i) {
393
- MarketParams memory _marketParams = allMarketParams[i];
394
- Id _id = _marketParams.id ();
395
-
396
- assertGe (
397
- loanToken.balanceOf (address (morpho)) + morpho.totalBorrowAssets (_id), morpho.totalSupplyAssets (_id)
398
- );
399
- }
400
- }
401
-
402
- function invariantBadDebt () public {
403
- address [] memory users = targetSenders ();
404
-
405
- for (uint256 i; i < allMarketParams.length ; ++ i) {
406
- MarketParams memory _marketParams = allMarketParams[i];
407
- Id _id = _marketParams.id ();
408
-
409
- for (uint256 j; j < users.length ; ++ j) {
410
- address user = users[j];
411
-
412
- if (morpho.collateral (_id, user) == 0 ) {
413
- assertEq (
414
- morpho.borrowShares (_id, user),
415
- 0 ,
416
- string .concat (vm.toString (_marketParams.lltv), ": " , vm.toString (user))
417
- );
418
- }
419
- }
420
- }
421
- }
422
334
}
0 commit comments