Skip to content

Commit f7ac78a

Browse files
committed
refactor: simplify with wDivDown
1 parent 701d11d commit f7ac78a

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

certora/specs/LiquidateBuffer.spec

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ using Util as Util;
55
methods {
66
function extSloads(bytes32[]) external returns (bytes32[]) => NONDET DELETE;
77

8+
function market_(MorphoLiquidateHarness.Id) external returns (MorphoLiquidateHarness.Market) envfree;
89
function virtualTotalBorrowAssets(MorphoLiquidateHarness.Id) external returns uint256 envfree;
910
function virtualTotalBorrowShares(MorphoLiquidateHarness.Id) external returns uint256 envfree;
1011
function liquidateView(MorphoLiquidateHarness.MarketParams, uint256, uint256, uint256) external returns (uint256, uint256, uint256, uint256) envfree;
@@ -18,20 +19,25 @@ methods {
1819
}
1920

2021
function summaryMulDivUp(uint256 x, uint256 y, uint256 d) returns uint256 {
21-
// Safe require because the reference implementation would revert.
22+
// Todo: why is this require ok ?
2223
return require_uint256((x * y + (d - 1)) / d);
2324
}
2425

2526
function summaryMulDivDown(uint256 x, uint256 y, uint256 d) returns uint256 {
26-
// Safe require because the reference implementation would revert.
27+
// Todo: why is this require ok ?
2728
return require_uint256((x * y) / d);
2829
}
2930

31+
function wDivDown(uint256 x, uint256 y) returns uint256 {
32+
return summaryMulDivDown(x, Util.wad(), y);
33+
}
34+
3035
rule liquidateImprovePosition(MorphoLiquidateHarness.MarketParams marketParams, uint256 seizedAssetsInput, uint256 repaidSharesInput) {
3136
MorphoLiquidateHarness.Id id = Util.libId(marketParams);
3237

3338
// TODO: use a fixed price oracle instead of passing it to liquidateView.
3439
uint256 collateralPrice;
40+
require collateralPrice > 0;
3541

3642
// TODO: take those directly from the borrower, and manage accrue interest.
3743
uint256 borrowerShares;
@@ -41,20 +47,22 @@ rule liquidateImprovePosition(MorphoLiquidateHarness.MarketParams marketParams,
4147
uint256 borrowerAssets = summaryMulDivUp(borrowerShares, virtualTotalBorrowAssets(id), virtualTotalBorrowShares(id));
4248
require borrowerAssets > 0;
4349

44-
require seizedAssetsInput > 0 && repaidSharesInput == 0;
50+
require (seizedAssetsInput > 0 && repaidSharesInput == 0) || (seizedAssetsInput == 0 && repaidSharesInput > 0);
4551

4652
uint256 seizedAssets;
4753
uint256 repaidShares;
4854
uint256 repaidAssets;
49-
require repaidAssets > 0;
5055
uint256 lif;
5156
(seizedAssets, repaidShares, repaidAssets, lif) = liquidateView(marketParams, seizedAssetsInput, repaidSharesInput, collateralPrice);
57+
require repaidAssets > 0;
5258

53-
require summaryMulDivUp(borrowerCollateral, collateralPrice, Util.oraclePriceScale()) >= summaryMulDivUp(lif, borrowerAssets, Util.wad());
54-
assert summaryMulDivDown(summaryMulDivUp(borrowerCollateral, collateralPrice, Util.oraclePriceScale()), Util.wad(), borrowerAssets) >= lif;
59+
uint256 borrowerCollateralQuoted = summaryMulDivUp(borrowerCollateral, collateralPrice, Util.oraclePriceScale());
60+
require borrowerCollateralQuoted >= summaryMulDivUp(lif, borrowerAssets, Util.wad());
61+
assert wDivDown(borrowerCollateralQuoted, borrowerAssets) >= lif;
5562

56-
assert summaryMulDivDown(lif, repaidAssets, Util.wad()) >= summaryMulDivUp(seizedAssets, collateralPrice, Util.oraclePriceScale());
57-
assert lif >= summaryMulDivDown(summaryMulDivUp(seizedAssets, collateralPrice, Util.oraclePriceScale()), Util.wad(), repaidAssets);
63+
uint256 seizedCollateralQuoted = summaryMulDivUp(seizedAssets, collateralPrice, Util.oraclePriceScale());
64+
assert summaryMulDivDown(lif, repaidAssets, Util.wad()) >= seizedCollateralQuoted;
65+
assert lif >= wDivDown(seizedCollateralQuoted, repaidAssets);
5866

5967
// assert repaidShares * borrowerCollateral > seizedAssets * borrowerShares;
6068
}

0 commit comments

Comments
 (0)