forked from sherlock-audit/2023-06-symmetrical
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LibAccount.sol
155 lines (145 loc) · 6.19 KB
/
LibAccount.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// SPDX-License-Identifier: SYMM-Core-Business-Source-License-1.1
// This contract is licensed under the SYMM Core Business Source License 1.1
// Copyright (c) 2023 Symmetry Labs AG
// For more information, see https://docs.symm.io/legal-disclaimer/license
pragma solidity >=0.8.18;
import "./LibLockedValues.sol";
import "../storages/AccountStorage.sol";
library LibAccount {
using LockedValuesOps for LockedValues;
function partyATotalLockedBalances(address partyA) internal view returns (uint256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
return
accountLayout.pendingLockedBalances[partyA].total() +
accountLayout.lockedBalances[partyA].total();
}
function partyBTotalLockedBalances(
address partyB,
address partyA
) internal view returns (uint256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
return
accountLayout.partyBPendingLockedBalances[partyB][partyA].total() +
accountLayout.partyBLockedBalances[partyB][partyA].total();
}
function partyAAvailableForQuote(int256 upnl, address partyA) internal view returns (int256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
int256 available;
if (upnl >= 0) {
available =
int256(accountLayout.allocatedBalances[partyA]) +
upnl -
int256(
(accountLayout.lockedBalances[partyA].total() +
accountLayout.pendingLockedBalances[partyA].total())
);
} else {
int256 mm = int256(accountLayout.lockedBalances[partyA].mm);
int256 considering_mm = -upnl > mm ? -upnl : mm;
available =
int256(accountLayout.allocatedBalances[partyA]) -
int256(
(accountLayout.lockedBalances[partyA].cva +
accountLayout.lockedBalances[partyA].lf +
accountLayout.pendingLockedBalances[partyA].total())
) -
considering_mm;
}
return available;
}
function partyAAvailableBalance(int256 upnl, address partyA) internal view returns (int256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
int256 available;
if (upnl >= 0) {
available =
int256(accountLayout.allocatedBalances[partyA]) +
upnl -
int256(accountLayout.lockedBalances[partyA].total());
} else {
int256 mm = int256(accountLayout.lockedBalances[partyA].mm);
int256 considering_mm = -upnl > mm ? -upnl : mm;
available =
int256(accountLayout.allocatedBalances[partyA]) -
int256(
accountLayout.lockedBalances[partyA].cva +
accountLayout.lockedBalances[partyA].lf
) -
considering_mm;
}
return available;
}
function partyAAvailableBalanceForLiquidation(
int256 upnl,
address partyA
) internal view returns (int256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
int256 freeBalance = int256(accountLayout.allocatedBalances[partyA]) -
int256(accountLayout.lockedBalances[partyA].cva + accountLayout.lockedBalances[partyA].lf);
return freeBalance + upnl;
}
function partyBAvailableForQuote(
int256 upnl,
address partyB,
address partyA
) internal view returns (int256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
int256 available;
if (upnl >= 0) {
available =
int256(accountLayout.partyBAllocatedBalances[partyB][partyA]) +
upnl -
int256(
(accountLayout.partyBLockedBalances[partyB][partyA].total() +
accountLayout.partyBPendingLockedBalances[partyB][partyA].total())
);
} else {
int256 mm = int256(accountLayout.partyBLockedBalances[partyB][partyA].mm);
int256 considering_mm = -upnl > mm ? -upnl : mm;
available =
int256(accountLayout.partyBAllocatedBalances[partyB][partyA]) -
int256(
(accountLayout.partyBLockedBalances[partyB][partyA].cva +
accountLayout.partyBLockedBalances[partyB][partyA].lf +
accountLayout.partyBPendingLockedBalances[partyB][partyA].total())
) -
considering_mm;
}
return available;
}
function partyBAvailableBalance(
int256 upnl,
address partyB,
address partyA
) internal view returns (int256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
int256 available;
if (upnl >= 0) {
available =
int256(accountLayout.partyBAllocatedBalances[partyB][partyA]) +
upnl -
int256(accountLayout.partyBLockedBalances[partyB][partyA].total());
} else {
int256 mm = int256(accountLayout.partyBLockedBalances[partyB][partyA].mm);
int256 considering_mm = -upnl > mm ? -upnl : mm;
available =
int256(accountLayout.partyBAllocatedBalances[partyB][partyA]) -
int256(
accountLayout.partyBLockedBalances[partyB][partyA].cva +
accountLayout.partyBLockedBalances[partyB][partyA].lf
) -
considering_mm;
}
return available;
}
function partyBAvailableBalanceForLiquidation(
int256 upnl,
address partyB,
address partyA
) internal view returns (int256) {
AccountStorage.Layout storage accountLayout = AccountStorage.layout();
int256 a = int256(accountLayout.partyBAllocatedBalances[partyB][partyA]) -
int256(accountLayout.partyBLockedBalances[partyB][partyA].cva +
accountLayout.partyBLockedBalances[partyB][partyA].lf);
return a + upnl;
}
}