-
Notifications
You must be signed in to change notification settings - Fork 15
/
MagicValueLib.sol
69 lines (64 loc) · 2.82 KB
/
MagicValueLib.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.13;
import "@equilibria/root/accumulator/types/Accumulator6.sol";
import "../interfaces/IMarket.sol";
import "../types/OracleVersion.sol";
import "../types/RiskParameter.sol";
import "../types/Global.sol";
import "../types/Local.sol";
import "../types/Order.sol";
import "../types/Version.sol";
import "../types/Checkpoint.sol";
/// @title MagicValueLib
/// @dev (external-safe): this library is safe to externalize
/// @notice Manages the logic for the update parameter magic values
library MagicValueLib {
Fixed6 private constant MAGIC_VALUE_WITHDRAW_ALL_COLLATERAL = Fixed6.wrap(type(int256).min);
UFixed6 private constant MAGIC_VALUE_UNCHANGED_POSITION = UFixed6.wrap(type(uint256).max);
UFixed6 private constant MAGIC_VALUE_FULLY_CLOSED_POSITION = UFixed6.wrap(type(uint256).max - 1);
function process(
IMarket.Context memory context,
IMarket.UpdateContext memory updateContext,
Fixed6 collateral,
UFixed6 newMaker,
UFixed6 newLong,
UFixed6 newShort
) external pure returns (Fixed6, UFixed6, UFixed6, UFixed6) {
return (
_processCollateralMagicValue(context, collateral),
_processPositionMagicValue(context, updateContext.currentPositionLocal.maker, newMaker),
_processPositionMagicValue(context, updateContext.currentPositionLocal.long, newLong),
_processPositionMagicValue(context, updateContext.currentPositionLocal.short, newShort)
);
}
/// @notice Modifies the collateral input per magic values
/// @param context The context to use
/// @param collateral The collateral to process
/// @return The resulting collateral value
function _processCollateralMagicValue(
IMarket.Context memory context,
Fixed6 collateral
) private pure returns (Fixed6) {
return collateral.eq(MAGIC_VALUE_WITHDRAW_ALL_COLLATERAL) ?
context.local.collateral.mul(Fixed6Lib.NEG_ONE) :
collateral;
}
/// @notice Modifies the position input per magic values
/// @param context The context to use
/// @param currentPosition The current position prior to update
/// @param newPosition The position to process
/// @return The resulting position value
function _processPositionMagicValue(
IMarket.Context memory context,
UFixed6 currentPosition,
UFixed6 newPosition
) private pure returns (UFixed6) {
if (newPosition.eq(MAGIC_VALUE_UNCHANGED_POSITION))
return currentPosition;
if (newPosition.eq(MAGIC_VALUE_FULLY_CLOSED_POSITION)) {
if (currentPosition.isZero()) return currentPosition;
return currentPosition.sub(context.latestPositionLocal.magnitude().sub(context.pendingLocal.neg()));
}
return newPosition;
}
}