@@ -180,7 +180,7 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
180180 (
181181 Percentage.Percent memory enp ,
182182 Percentage.Percent memory ell
183- ) = _getEnpAndEll (_pool);
183+ ) = getEnpAndEll (_pool);
184184 bool isSafe = enp.value > liquidityPoolENPMarginThreshold &&
185185 ell.value > liquidityPoolELLMarginThreshold;
186186
@@ -197,7 +197,7 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
197197 address _trader
198198 ) external nonReentrant poolIsVerified (_pool) {
199199 require (! marginProtocol.traderIsMarginCalled (_pool, _trader), "TM1 " );
200- require (! _isTraderSafe (_pool, _trader), "TM2 " );
200+ require (! isTraderSafe (_pool, _trader), "TM2 " );
201201
202202 marginProtocol.setTraderIsMarginCalled (_pool, _trader, true );
203203 marginProtocol.moneyMarket ().baseToken ().safeTransfer (
@@ -219,7 +219,7 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
219219 poolIsVerified (_pool)
220220 {
221221 require (marginProtocol.traderIsMarginCalled (_pool, _trader), "TS1 " );
222- require (_isTraderSafe (_pool, _trader), "TS2 " );
222+ require (isTraderSafe (_pool, _trader), "TS2 " );
223223
224224 marginProtocol.setTraderIsMarginCalled (_pool, _trader, false );
225225 marginProtocol.moneyMarket ().baseToken ().safeTransferFrom (
@@ -285,7 +285,7 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
285285 MarginLiquidityPoolInterface _pool ,
286286 address _trader
287287 ) external nonReentrant poolIsVerified (_pool) {
288- Percentage.SignedPercent memory marginLevel = _getMarginLevel (
288+ Percentage.SignedPercent memory marginLevel = getMarginLevel (
289289 _pool,
290290 _trader
291291 );
@@ -330,7 +330,7 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
330330 (
331331 Percentage.Percent memory enp ,
332332 Percentage.Percent memory ell
333- ) = _getEnpAndEll (_pool);
333+ ) = getEnpAndEll (_pool);
334334 require (
335335 enp.value <= liquidityPoolENPLiquidateThreshold ||
336336 ell.value <= liquidityPoolELLLiquidateThreshold,
@@ -379,11 +379,8 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
379379 // Ensure a trader is safe, based on equity delta, opened positions or plus a new one to open.
380380 //
381381 // Return true if ensured safe or false if not.
382- function _isTraderSafe (MarginLiquidityPoolInterface _pool , address _trader )
383- internal
384- returns (bool )
385- {
386- Percentage.SignedPercent memory marginLevel = _getMarginLevel (
382+ function isTraderSafe (MarginLiquidityPoolInterface _pool , address _trader ) public returns (bool ) {
383+ Percentage.SignedPercent memory marginLevel = getMarginLevel (
387384 _pool,
388385 _trader
389386 );
@@ -394,12 +391,9 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
394391 }
395392
396393 // Margin level of a given user.
397- function _getMarginLevel (
398- MarginLiquidityPoolInterface _pool ,
399- address _trader
400- ) internal returns (Percentage.SignedPercent memory ) {
394+ function getMarginLevel (MarginLiquidityPoolInterface _pool , address _trader ) public returns (Percentage.SignedPercent memory ) {
401395 int256 equity = marginProtocol.getEquityOfTrader (_pool, _trader);
402- uint256 leveragedDebitsInUsd = _getLeveragedDebitsOfTrader (
396+ uint256 leveragedDebitsInUsd = getLeveragedDebitsOfTrader (
403397 _pool,
404398 _trader
405399 );
@@ -419,11 +413,8 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
419413 //
420414 // ENP - Equity to Net Position ratio of a liquidity pool.
421415 // ELL - Equity to Longest Leg ratio of a liquidity pool.
422- function _getEnpAndEll (MarginLiquidityPoolInterface _pool )
423- internal
424- returns (Percentage.Percent memory , Percentage.Percent memory )
425- {
426- int256 equity = _getEquityOfPool (_pool);
416+ function getEnpAndEll (MarginLiquidityPoolInterface _pool ) public returns (Percentage.Percent memory , Percentage.Percent memory ) {
417+ int256 equity = getEquityOfPool (_pool);
427418
428419 if (equity < 0 ) {
429420 return (Percentage.Percent (0 ), Percentage.Percent (0 ));
@@ -465,53 +456,7 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
465456 return (enp, ell);
466457 }
467458
468- // Force closure position to liquidate liquidity pool based on opened positions.
469- function _liquidityPoolClosePosition (
470- MarginLiquidityPoolInterface _pool ,
471- uint256 _id ,
472- MarginFlowProtocol.TradingPair memory _pair ,
473- int256 _leverage ,
474- int256 _leveragedHeld
475- ) internal returns (uint256 ) {
476- Percentage.Percent memory price = marginProtocol.getPrice (
477- _pair.base,
478- _pair.quote
479- );
480- uint256 spread = _leverage > 0
481- ? marginProtocol.getBidSpread (
482- _pool,
483- address (_pair.base),
484- address (_pair.quote)
485- )
486- : marginProtocol.getAskSpread (
487- _pool,
488- address (_pair.base),
489- address (_pair.quote)
490- );
491-
492- uint256 leveragedHeldAbs = _leveragedHeld >= 0
493- ? uint256 (_leveragedHeld)
494- : uint256 (- _leveragedHeld);
495- uint256 spreadProfit = leveragedHeldAbs.mul (spread.mulPercent (price));
496- uint256 spreadProfitInUsd = uint256 (
497- marginProtocol.getUsdValue (_pair.base, int256 (spreadProfit))
498- );
499-
500- uint256 penalty = spreadProfitInUsd;
501- uint256 subAmount = spreadProfitInUsd.add (penalty);
502-
503- marginProtocol.closePosition (_id, 0 );
504-
505- uint256 realized = Math.min (_pool.getLiquidity (), subAmount);
506- _pool.withdrawLiquidity (realized);
507-
508- return realized;
509- }
510-
511- function _getLeveragedDebitsOfTrader (
512- MarginLiquidityPoolInterface _pool ,
513- address _trader
514- ) internal view returns (uint256 ) {
459+ function getLeveragedDebitsOfTrader (MarginLiquidityPoolInterface _pool , address _trader ) public view returns (uint256 ) {
515460 uint256 accumulatedLeveragedDebits = uint256 (0 );
516461 uint256 positionsLength = marginProtocol
517462 .getPositionsByPoolAndTraderLength (_pool, _trader);
@@ -531,10 +476,7 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
531476 }
532477
533478 // equityOfPool = liquidity - (allUnrealizedPl + allAccumulatedSwapRate)
534- function _getEquityOfPool (MarginLiquidityPoolInterface _pool )
535- internal
536- returns (int256 )
537- {
479+ function getEquityOfPool (MarginLiquidityPoolInterface _pool ) public returns (int256 ) {
538480 uint256 liquidity = marginProtocol.moneyMarket ().convertAmountToBase (
539481 marginProtocol.moneyMarket ().iToken ().balanceOf (address (_pool))
540482 );
@@ -563,4 +505,47 @@ contract MarginFlowProtocolSafety is Initializable, UpgradeOwnable, UpgradeReent
563505
564506 return int256 (liquidity).sub (unrealizedPlAndRate);
565507 }
508+
509+ // Force closure position to liquidate liquidity pool based on opened positions.
510+ function _liquidityPoolClosePosition (
511+ MarginLiquidityPoolInterface _pool ,
512+ uint256 _id ,
513+ MarginFlowProtocol.TradingPair memory _pair ,
514+ int256 _leverage ,
515+ int256 _leveragedHeld
516+ ) internal returns (uint256 ) {
517+ Percentage.Percent memory price = marginProtocol.getPrice (
518+ _pair.base,
519+ _pair.quote
520+ );
521+ uint256 spread = _leverage > 0
522+ ? marginProtocol.getBidSpread (
523+ _pool,
524+ address (_pair.base),
525+ address (_pair.quote)
526+ )
527+ : marginProtocol.getAskSpread (
528+ _pool,
529+ address (_pair.base),
530+ address (_pair.quote)
531+ );
532+
533+ uint256 leveragedHeldAbs = _leveragedHeld >= 0
534+ ? uint256 (_leveragedHeld)
535+ : uint256 (- _leveragedHeld);
536+ uint256 spreadProfit = leveragedHeldAbs.mul (spread.mulPercent (price));
537+ uint256 spreadProfitInUsd = uint256 (
538+ marginProtocol.getUsdValue (_pair.base, int256 (spreadProfit))
539+ );
540+
541+ uint256 penalty = spreadProfitInUsd;
542+ uint256 subAmount = spreadProfitInUsd.add (penalty);
543+
544+ marginProtocol.closePosition (_id, 0 );
545+
546+ uint256 realized = Math.min (_pool.getLiquidity (), subAmount);
547+ _pool.withdrawLiquidity (realized);
548+
549+ return realized;
550+ }
566551}
0 commit comments