Skip to content

Commit

Permalink
Merge pull request #82 from morpho-org/doc/readme
Browse files Browse the repository at this point in the history
doc: readme parameter restriction
  • Loading branch information
peyha authored Oct 7, 2024
2 parents 3ce8ed3 + 4402a29 commit 7ee05f3
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 1 deletion.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@ The two main use-cases are:
1. Using normal fixed parameters when `preLIF1 = preLIF2` and `preLCF1 = preLCF2`.
2. Using health dependent liquidation when either `preLIF1 < preLIF2` or `preLCF1 < preLCF2`, similar to a Quasi Dutch Auction (as in [Euler liquidations](https://docs-v1.euler.finance/getting-started/white-paper#liquidations)).


### Pre-liquidation parameters restrictions

The PreLiquidation smart-contract enforces the following properties:
- preLltv < LLTV;
- preLCF1 <= preLCF2;
- preLFC1 <= 1;
- 1 <= preLIF1 <= preLIF2 <= 1 / LLTV.
Note: Using `preLCF2 > 1`, you can select at which LTV between preLltv and LLTV the entire position will be pre-liquidated.
A pre-liquidation close factor higher than 100% means that the whole position is pre-liquidatable.

### `onPreLiquidate` callback

By calling `preLiquidate` with a smart contract that implements the `IPreLiquidationCallback` interface, the liquidator can be called back.
Expand Down
2 changes: 2 additions & 0 deletions src/PreLiquidation.sol
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,14 @@ contract PreLiquidation is IPreLiquidation, IMorphoRepayCallback {
/// @dev The following requirements should be met:
/// - preLltv < LLTV;
/// - preLCF1 <= preLCF2;
/// - preLCF1 <= 1
/// - 1 <= preLIF1 <= preLIF2 <= 1 / LLTV.
constructor(address morpho, Id id, PreLiquidationParams memory _preLiquidationParams) {
require(IMorpho(morpho).market(id).lastUpdate != 0, ErrorsLib.NonexistentMarket());
MarketParams memory _marketParams = IMorpho(morpho).idToMarketParams(id);
require(_preLiquidationParams.preLltv < _marketParams.lltv, ErrorsLib.PreLltvTooHigh());
require(_preLiquidationParams.preLCF1 <= _preLiquidationParams.preLCF2, ErrorsLib.PreLCFDecreasing());
require(_preLiquidationParams.preLCF1 <= WAD, ErrorsLib.PreLCFTooHigh());
require(WAD <= _preLiquidationParams.preLIF1, ErrorsLib.PreLIFTooLow());
require(_preLiquidationParams.preLIF1 <= _preLiquidationParams.preLIF2, ErrorsLib.PreLIFDecreasing());
require(_preLiquidationParams.preLIF2 <= WAD.wDivDown(_marketParams.lltv), ErrorsLib.PreLIFTooHigh());
Expand Down
2 changes: 2 additions & 0 deletions src/libraries/ErrorsLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ library ErrorsLib {

error PreLCFDecreasing();

error PreLCFTooHigh();

error PreLIFTooLow();

error PreLIFDecreasing();
Expand Down
18 changes: 17 additions & 1 deletion test/PreLiquidationErrorTest.sol
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ contract PreLiquidationErrorTest is BaseTest {
factory.createPreLiquidation(id, preLiquidationParams);
}

function testCloseFactorDecreasing(PreLiquidationParams memory preLiquidationParams) public virtual {
function testLCFDecreasing(PreLiquidationParams memory preLiquidationParams) public virtual {
preLiquidationParams = boundPreLiquidationParameters({
preLiquidationParams: preLiquidationParams,
minPreLltv: WAD / 100,
Expand All @@ -57,6 +57,22 @@ contract PreLiquidationErrorTest is BaseTest {
factory.createPreLiquidation(id, preLiquidationParams);
}

function testLCFHigh(PreLiquidationParams memory preLiquidationParams) public virtual {
preLiquidationParams = boundPreLiquidationParameters({
preLiquidationParams: preLiquidationParams,
minPreLltv: WAD / 100,
maxPreLltv: marketParams.lltv - 1,
minPreLCF: WAD + 1,
maxPreLCF: type(uint256).max,
minPreLIF: WAD + 1,
maxPreLIF: WAD.wDivDown(lltv),
preLiqOracle: marketParams.oracle
});

vm.expectRevert(ErrorsLib.PreLCFTooHigh.selector);
factory.createPreLiquidation(id, preLiquidationParams);
}

function testLowPreLIF(PreLiquidationParams memory preLiquidationParams) public virtual {
preLiquidationParams = boundPreLiquidationParameters({
preLiquidationParams: preLiquidationParams,
Expand Down

0 comments on commit 7ee05f3

Please sign in to comment.