Skip to content

Commit

Permalink
chore(lint): format LiquidatorLib
Browse files Browse the repository at this point in the history
  • Loading branch information
PierrickGT committed May 16, 2022
1 parent 8e41034 commit a72792f
Showing 1 changed file with 152 additions and 108 deletions.
260 changes: 152 additions & 108 deletions contracts/libraries/LiquidatorLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,115 +11,159 @@ import "@prb/math/contracts/PRBMathSD59x18Typed.sol";
import "./VirtualCpmmLib.sol";

library LiquidatorLib {
using SafeMath for uint256;
using SafeCast for uint256;
using PRBMathSD59x18Typed for PRBMath.SD59x18;

struct State {
PRBMath.SD59x18 exchangeRate;
uint256 lastSaleTime;
// positive price range change per second.
PRBMath.SD59x18 deltaRatePerSecond;
// Price impact for purchase of accrued funds
// low slippage => higher frequency arbs, but it tracks the market rate slower (slower to change)
PRBMath.SD59x18 maxSlippage;
}

function _increaseExchangeRateByDeltaTime(
PRBMath.SD59x18 memory exchangeRate,
PRBMath.SD59x18 memory deltaRatePerSecond,
uint256 lastSaleTime,
uint256 currentTime
) internal pure returns (PRBMath.SD59x18 memory) {
// over time, buying power of POOL goes up.
PRBMath.SD59x18 memory dt = PRBMathSD59x18Typed.fromInt((currentTime - lastSaleTime).toInt256());
return exchangeRate.add(
exchangeRate.mul(dt.mul(deltaRatePerSecond))
);
}

function computeExchangeRate(State storage _liquidationState, uint256 _currentTime) internal view returns (PRBMath.SD59x18 memory) {
return _increaseExchangeRateByDeltaTime(
_liquidationState.exchangeRate,
_liquidationState.deltaRatePerSecond,
_liquidationState.lastSaleTime,
_currentTime
);
}

function computeExactAmountInAtTime(State storage _liquidationState, uint256 availableBalance, uint256 amountOut, uint256 currentTime) internal view returns (uint256) {
if (availableBalance == 0) {
return 0;
using SafeMath for uint256;
using SafeCast for uint256;
using PRBMathSD59x18Typed for PRBMath.SD59x18;

struct State {
PRBMath.SD59x18 exchangeRate;
uint256 lastSaleTime;
// positive price range change per second.
PRBMath.SD59x18 deltaRatePerSecond;
// Price impact for purchase of accrued funds
// low slippage => higher frequency arbs, but it tracks the market rate slower (slower to change)
PRBMath.SD59x18 maxSlippage;
}
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(_liquidationState, availableBalance, currentTime);
return VirtualCpmmLib.getAmountIn(amountOut, cpmm.want, cpmm.have);
}

function computeExactAmountOutAtTime(State storage _liquidationState, uint256 availableBalance, uint256 amountIn, uint256 currentTime) internal view returns (uint256) {
if (availableBalance == 0) {
return 0;
function _increaseExchangeRateByDeltaTime(
PRBMath.SD59x18 memory exchangeRate,
PRBMath.SD59x18 memory deltaRatePerSecond,
uint256 lastSaleTime,
uint256 currentTime
) internal pure returns (PRBMath.SD59x18 memory) {
// over time, buying power of POOL goes up.
PRBMath.SD59x18 memory dt = PRBMathSD59x18Typed.fromInt(
(currentTime - lastSaleTime).toInt256()
);
return exchangeRate.add(exchangeRate.mul(dt.mul(deltaRatePerSecond)));
}

function computeExchangeRate(State storage _liquidationState, uint256 _currentTime)
internal
view
returns (PRBMath.SD59x18 memory)
{
return
_increaseExchangeRateByDeltaTime(
_liquidationState.exchangeRate,
_liquidationState.deltaRatePerSecond,
_liquidationState.lastSaleTime,
_currentTime
);
}

function computeExactAmountInAtTime(
State storage _liquidationState,
uint256 availableBalance,
uint256 amountOut,
uint256 currentTime
) internal pure returns (uint256) {
if (availableBalance == 0) {
return 0;
}
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(
_liquidationState,
availableBalance,
currentTime
);
return VirtualCpmmLib.getAmountIn(amountOut, cpmm.want, cpmm.have);
}

function computeExactAmountOutAtTime(
State storage _liquidationState,
uint256 availableBalance,
uint256 amountIn,
uint256 currentTime
) internal pure returns (uint256) {
if (availableBalance == 0) {
return 0;
}
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(
_liquidationState,
availableBalance,
currentTime
);
return VirtualCpmmLib.getAmountOut(amountIn, cpmm.want, cpmm.have);
}

function _computeCpmm(
State storage _liquidationState,
uint256 availableBalance,
uint256 currentTime
) internal pure returns (VirtualCpmmLib.Cpmm memory) {
State memory liquidationState = _liquidationState;
PRBMath.SD59x18 memory newExchangeRate = _increaseExchangeRateByDeltaTime(
liquidationState.exchangeRate,
liquidationState.deltaRatePerSecond,
liquidationState.lastSaleTime,
currentTime
);
return
VirtualCpmmLib.newCpmm(
liquidationState.maxSlippage,
newExchangeRate,
PRBMathSD59x18Typed.fromInt(availableBalance.toInt256())
);
}

function swapExactAmountInAtTime(
State storage liquidationState,
uint256 availableBalance,
uint256 amountIn,
uint256 currentTime
) internal returns (uint256) {
require(availableBalance > 0, "Whoops! no funds available");
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(
liquidationState,
availableBalance,
currentTime
);

uint256 amountOut = VirtualCpmmLib.getAmountOut(amountIn, cpmm.want, cpmm.have);
cpmm.want += amountIn;
cpmm.have -= amountOut;

require(amountOut <= availableBalance, "Whoops! have exceeds available");

liquidationState.lastSaleTime = currentTime;
liquidationState.exchangeRate = _cpmmToExchangeRate(cpmm);

return amountOut;
}

function swapExactAmountOutAtTime(
State storage liquidationState,
uint256 availableBalance,
uint256 amountOut,
uint256 currentTime
) internal returns (uint256) {
require(availableBalance > 0, "Whoops! no funds available");
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(
liquidationState,
availableBalance,
currentTime
);

uint256 amountIn = VirtualCpmmLib.getAmountIn(amountOut, cpmm.want, cpmm.have);
cpmm.want += amountIn;
cpmm.have -= amountOut;

require(amountOut <= availableBalance, "Whoops! have exceeds available");

liquidationState.lastSaleTime = currentTime;
liquidationState.exchangeRate = _cpmmToExchangeRate(cpmm);

return amountIn;
}

function _cpmmToExchangeRate(VirtualCpmmLib.Cpmm memory cpmm)
internal
pure
returns (PRBMath.SD59x18 memory)
{
return
PRBMathSD59x18Typed.fromInt(int256(cpmm.have)).div(
PRBMathSD59x18Typed.fromInt(int256(cpmm.want))
);
}
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(_liquidationState, availableBalance, currentTime);
return VirtualCpmmLib.getAmountOut(amountIn, cpmm.want, cpmm.have);
}

function _computeCpmm(State storage _liquidationState, uint256 availableBalance, uint256 currentTime) internal pure returns (VirtualCpmmLib.Cpmm memory) {
State memory liquidationState = _liquidationState;
PRBMath.SD59x18 memory newExchangeRate = _increaseExchangeRateByDeltaTime(
liquidationState.exchangeRate,
liquidationState.deltaRatePerSecond,
liquidationState.lastSaleTime,
currentTime
);
return VirtualCpmmLib.newCpmm(
liquidationState.maxSlippage, newExchangeRate, PRBMathSD59x18Typed.fromInt(availableBalance.toInt256())
);
}

function swapExactAmountInAtTime(
State storage liquidationState,
uint256 availableBalance,
uint256 amountIn,
uint256 currentTime
) internal returns (uint256) {
require(availableBalance > 0, "Whoops! no funds available");
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(liquidationState, availableBalance, currentTime);

uint256 amountOut = VirtualCpmmLib.getAmountOut(amountIn, cpmm.want, cpmm.have);
cpmm.want += amountIn;
cpmm.have -= amountOut;

require(amountOut <= availableBalance, "Whoops! have exceeds available");

liquidationState.lastSaleTime = currentTime;
liquidationState.exchangeRate = _cpmmToExchangeRate(cpmm);

return amountOut;
}

function swapExactAmountOutAtTime(
State storage liquidationState,
uint256 availableBalance,
uint256 amountOut,
uint256 currentTime
) internal returns (uint256) {

require(availableBalance > 0, "Whoops! no funds available");
VirtualCpmmLib.Cpmm memory cpmm = _computeCpmm(liquidationState, availableBalance, currentTime);

uint256 amountIn = VirtualCpmmLib.getAmountIn(amountOut, cpmm.want, cpmm.have);
cpmm.want += amountIn;
cpmm.have -= amountOut;

require(amountOut <= availableBalance, "Whoops! have exceeds available");

liquidationState.lastSaleTime = currentTime;
liquidationState.exchangeRate = _cpmmToExchangeRate(cpmm);

return amountIn;
}

function _cpmmToExchangeRate(VirtualCpmmLib.Cpmm memory cpmm) internal pure returns (PRBMath.SD59x18 memory) {
return PRBMathSD59x18Typed.fromInt(int256(cpmm.have)).div(PRBMathSD59x18Typed.fromInt(int256(cpmm.want)));
}
}

0 comments on commit a72792f

Please sign in to comment.