Skip to content

Commit ee3aa46

Browse files
authored
Clean up calculators (#805)
1 parent 5de0790 commit ee3aa46

37 files changed

+1823
-7782
lines changed

src/commonMain/kotlin/exchange.dydx.abacus/calculator/AccountCalculator.kt

Lines changed: 180 additions & 255 deletions
Large diffs are not rendered by default.
Lines changed: 74 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,102 @@
11
package exchange.dydx.abacus.calculator
22

3+
import exchange.dydx.abacus.output.input.MarginMode
34
import exchange.dydx.abacus.protocols.ParserProtocol
4-
import exchange.dydx.abacus.utils.mutable
5-
import exchange.dydx.abacus.utils.safeSet
5+
import exchange.dydx.abacus.state.internalstate.InternalAccountState
6+
import exchange.dydx.abacus.state.internalstate.InternalMarketState
7+
import exchange.dydx.abacus.state.internalstate.InternalSubaccountState
8+
import exchange.dydx.abacus.state.internalstate.InternalTradeInputState
69

7-
class AccountTransformer() {
8-
private val subaccountTransformer = SubaccountTransformer()
9-
internal fun applyTradeToAccount(
10-
account: Map<String, Any>?,
10+
internal class AccountTransformer(
11+
val parser: ParserProtocol,
12+
private val subaccountTransformer: SubaccountTransformer = SubaccountTransformer(parser)
13+
) {
14+
fun applyTradeToAccount(
15+
account: InternalAccountState,
1116
subaccountNumber: Int,
12-
trade: Map<String, Any>,
13-
market: Map<String, Any>?,
14-
parser: ParserProtocol,
15-
period: String,
16-
): Map<String, Any>? {
17-
val modified = account?.mutable() ?: return null
18-
val childSubaccountNumber =
19-
MarginCalculator.getChildSubaccountNumberForIsolatedMarginTradeDeprecated(
20-
parser,
21-
account,
22-
subaccountNumber ?: 0,
23-
trade,
24-
)
25-
val subaccount = parser.asNativeMap(
26-
parser.value(
27-
account,
28-
"subaccounts.$subaccountNumber",
29-
),
30-
) ?: mapOf()
17+
trade: InternalTradeInputState,
18+
market: InternalMarketState?,
19+
period: CalculationPeriod,
20+
) {
21+
val childSubaccountNumber = if (trade.marginMode == MarginMode.Isolated) {
22+
val marketId = trade.marketId
23+
if (marketId != null) {
24+
MarginCalculator.getChildSubaccountNumberForIsolatedMarginTrade(
25+
parser = parser,
26+
subaccounts = account.subaccounts,
27+
subaccountNumber = subaccountNumber,
28+
marketId = marketId,
29+
)
30+
} else {
31+
null
32+
}
33+
} else {
34+
subaccountNumber
35+
}
36+
37+
val subaccount = account.subaccounts[subaccountNumber] ?: InternalSubaccountState(
38+
subaccountNumber = subaccountNumber,
39+
)
40+
account.subaccounts[subaccountNumber] = subaccount
41+
3142
if (subaccountNumber == childSubaccountNumber) {
3243
// CROSS
33-
val modifiedSubaccount =
34-
subaccountTransformer.applyTradeToSubaccount(
35-
subaccount,
36-
trade,
37-
market,
38-
parser,
39-
period,
40-
)
41-
modified.safeSet("subaccounts.$subaccountNumber", modifiedSubaccount)
42-
return modified
44+
subaccountTransformer.applyTradeToSubaccount(
45+
subaccount = subaccount,
46+
trade = trade,
47+
market = market,
48+
period = period,
49+
)
4350
} else if (childSubaccountNumber != null) {
44-
val childSubaccount = parser.asNativeMap(
45-
parser.value(
46-
account,
47-
"subaccounts.$childSubaccountNumber",
48-
),
49-
) ?: mapOf()
51+
val childSubaccount = account.subaccounts[childSubaccountNumber] ?: InternalSubaccountState(
52+
subaccountNumber = childSubaccountNumber,
53+
)
54+
account.subaccounts[childSubaccountNumber] = childSubaccount
5055

5156
var transferAmountAppliedToParent = 0.0
5257
var transferAmountAppliedToChild = 0.0
5358

54-
val shouldTransferCollateralToChild = MarginCalculator.getShouldTransferInCollateralDeprecated(parser, subaccount = childSubaccount, trade)
55-
val shouldTransferOutRemainingCollateralFromChild = MarginCalculator.getShouldTransferOutRemainingCollateralDeprecated(parser, subaccount = childSubaccount, trade)
59+
val shouldTransferCollateralToChild = MarginCalculator.getShouldTransferInCollateral(
60+
subaccount = childSubaccount,
61+
tradeInput = trade,
62+
)
63+
val shouldTransferOutRemainingCollateralFromChild =
64+
MarginCalculator.getShouldTransferOutRemainingCollateral(
65+
subaccount = childSubaccount,
66+
tradeInput = trade,
67+
)
5668

5769
if (shouldTransferCollateralToChild) {
58-
val transferAmount = MarginCalculator.calculateIsolatedMarginTransferAmountDeprecated(parser, trade, market, subaccount = childSubaccount) ?: 0.0
70+
val transferAmount = MarginCalculator.calculateIsolatedMarginTransferAmount(
71+
trade = trade,
72+
market = market,
73+
subaccount = childSubaccount,
74+
) ?: 0.0
5975
transferAmountAppliedToParent = transferAmount * -1
6076
transferAmountAppliedToChild = transferAmount
6177
} else if (shouldTransferOutRemainingCollateralFromChild) {
62-
val remainingCollateral = MarginCalculator.getEstimateRemainingCollateralAfterClosePositionDeprecated(parser, subaccount = childSubaccount, trade) ?: 0.0
78+
val remainingCollateral =
79+
MarginCalculator.getEstimateRemainingCollateralAfterClosePosition(
80+
subaccount = childSubaccount,
81+
tradeInput = trade,
82+
) ?: 0.0
6383
transferAmountAppliedToParent = remainingCollateral
6484
}
65-
66-
val modifiedParentSubaccount = subaccountTransformer.applyTransferToSubaccount(
67-
subaccount,
85+
subaccountTransformer.applyTransferToSubaccount(
86+
subaccount = subaccount,
6887
transfer = transferAmountAppliedToParent,
69-
parser,
70-
period,
88+
period = period,
7189
)
72-
modified.safeSet("subaccounts.$subaccountNumber", modifiedParentSubaccount)
7390

7491
// when transfer out is true, post order position margin should be null
75-
val modifiedChildSubaccount = subaccountTransformer.applyTradeToSubaccount(
76-
childSubaccount,
77-
trade,
78-
market,
79-
parser,
80-
period,
81-
transferAmountAppliedToChild,
92+
subaccountTransformer.applyTradeToSubaccount(
93+
subaccount = childSubaccount,
94+
trade = trade,
95+
market = market,
96+
period = period,
97+
transfer = transferAmountAppliedToChild,
8298
isTransferOut = shouldTransferOutRemainingCollateralFromChild,
8399
)
84-
modified.safeSet("subaccounts.$childSubaccountNumber", modifiedChildSubaccount)
85-
86-
return modified
87100
}
88-
89-
return modified
90101
}
91102
}

0 commit comments

Comments
 (0)