Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Static Typing: Updating existing tests and bug fixes (1/n) #603

Merged
merged 106 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
6b4c391
WIP
ruixhuang Aug 1, 2024
2d988f6
Merge branch 'main' into feature/markets_1
ruixhuang Aug 2, 2024
2522191
MarketProcessor
ruixhuang Aug 2, 2024
73868c0
Bump version
mobile-build-bot Aug 2, 2024
5b30eef
Sparklines
ruixhuang Aug 3, 2024
0cea168
Bump version
mobile-build-bot Aug 3, 2024
3d6fbb6
Lint
ruixhuang Aug 3, 2024
31c3acd
Merge branch 'feature/markets_1' into feature/markets_2
ruixhuang Aug 3, 2024
e4c712c
WIP
ruixhuang Aug 5, 2024
26f1630
Merge branch 'main' into feature/markets_2
ruixhuang Aug 5, 2024
cd79d5a
Merge branch 'feature/markets_2' into feature/markets_3
ruixhuang Aug 5, 2024
f03b424
Orderbook
ruixhuang Aug 6, 2024
e8e5602
Updated codegen for candles
ruixhuang Aug 6, 2024
4a6a15f
Market Candles
ruixhuang Aug 6, 2024
462a8ff
Bump version
mobile-build-bot Aug 6, 2024
d52adce
Add market trades to the output state.
ruixhuang Aug 7, 2024
60d8eb6
Merge branch 'feature/markets_4' of github.com:dydxprotocol/v4-abacus…
ruixhuang Aug 7, 2024
5ce9fdb
Revert "Merge branch 'feature/markets_4' of github.com:dydxprotocol/v…
ruixhuang Aug 7, 2024
c4c3730
Revert "Add market trades to the output state."
ruixhuang Aug 7, 2024
7a9ce0a
Bump version
mobile-build-bot Aug 7, 2024
a688b82
Add market trades to the output state.
ruixhuang Aug 7, 2024
0d1d2e6
Merge branch 'feature/markets_4' into feature/markets_6
ruixhuang Aug 7, 2024
10cf01e
Bump version
mobile-build-bot Aug 7, 2024
ab3fd0d
WIP
ruixhuang Aug 8, 2024
ea1c620
WIP
ruixhuang Aug 8, 2024
d46757a
WIP
ruixhuang Aug 9, 2024
0c76dfa
Fix tests
ruixhuang Aug 9, 2024
d954e21
Bump version
mobile-build-bot Aug 9, 2024
19dcd33
Merge fills and transfers
ruixhuang Aug 9, 2024
dc2e60a
Merge branch 'feature/calc_1' of github.com:dydxprotocol/v4-abacus in…
ruixhuang Aug 9, 2024
98a2df6
Merge branch 'feature/calc_1' into feature/trade_1
ruixhuang Aug 9, 2024
5fc6c60
WIP
ruixhuang Aug 10, 2024
a3916b5
WIP
ruixhuang Aug 12, 2024
222d283
WIP
ruixhuang Aug 12, 2024
aea8014
Merge branch 'main' into feature/calc_1
ruixhuang Aug 12, 2024
3eb966a
WIP
ruixhuang Aug 13, 2024
e829519
Merge branch 'feature/calc_1' into feature/trade_1
ruixhuang Aug 13, 2024
3c81c65
Working more or less
ruixhuang Aug 13, 2024
1fd42df
Updating tests
ruixhuang Aug 13, 2024
ab7858f
Bump version
mobile-build-bot Aug 13, 2024
88e1aa6
Merge branch 'main' into feature/calc_1
ruixhuang Aug 13, 2024
75007fc
Lint
ruixhuang Aug 13, 2024
1975e72
Lint
ruixhuang Aug 13, 2024
952c97f
Move sides and order types options to a single source
ruixhuang Aug 13, 2024
f5f4dfa
Add isOpen
ruixhuang Aug 13, 2024
545fe6b
Cleanup
ruixhuang Aug 13, 2024
15c0678
Merge branch 'feature/calc_1' into feature/trade_1
ruixhuang Aug 13, 2024
048a2dd
Bump version
mobile-build-bot Aug 13, 2024
5cb9afb
Clean up
ruixhuang Aug 13, 2024
b86eadc
Lint
ruixhuang Aug 13, 2024
3df5e4f
WIP
ruixhuang Aug 14, 2024
07cb4ea
Merge branch 'main' into feature/trade_1
ruixhuang Aug 15, 2024
d4ca43b
Merge branch 'feature/trade_1' into feature/trade_2
ruixhuang Aug 15, 2024
c27e381
AccountTransformer
ruixhuang Aug 15, 2024
af9b520
Trade receipts
ruixhuang Aug 15, 2024
7034e0a
Fix position list
ruixhuang Aug 15, 2024
033b44e
Fix a position bug
ruixhuang Aug 16, 2024
e25d771
Fix issue with null position
ruixhuang Aug 16, 2024
3b21a90
Deep-copy to groupedSubaccount
ruixhuang Aug 16, 2024
7b8791e
WIP
ruixhuang Aug 18, 2024
d50b093
TradeInputDataValidator
ruixhuang Aug 18, 2024
b847b40
TradeInputValidator
ruixhuang Aug 20, 2024
07b3cfb
Clean up
ruixhuang Aug 20, 2024
6227a52
Clean up
ruixhuang Aug 20, 2024
d412fa2
Merge branch 'main' into feature/trade_3
ruixhuang Aug 20, 2024
fbaf697
Bump version
mobile-build-bot Aug 20, 2024
8c1def9
TradeFieldsValidator
ruixhuang Aug 20, 2024
0a2bd04
AccountInputValidator
ruixhuang Aug 21, 2024
270b53b
Update integration tests
ruixhuang Aug 22, 2024
b24e08b
Merge branch 'main' into feature/trade_3
ruixhuang Aug 22, 2024
7f65928
Bump version
mobile-build-bot Aug 22, 2024
5d89f08
Merge branch 'feature/trade_3' into feature/trade_4
ruixhuang Aug 22, 2024
1469a14
Merge branch 'main' into feature/trade_4
ruixhuang Aug 22, 2024
6071494
Merge branch 'feature/trade_4' of github.com:dydxprotocol/v4-abacus i…
ruixhuang Aug 22, 2024
38f2b33
Bump version
mobile-build-bot Aug 22, 2024
1b425a2
ClosePositionInput
ruixhuang Aug 22, 2024
36b34f2
Validation
ruixhuang Aug 22, 2024
c3c49cd
Merge branch 'main' into feature/trade_4
ruixhuang Aug 22, 2024
4e0627d
Bump version
mobile-build-bot Aug 22, 2024
2698c1b
Merge branch 'feature/trade_4' into feature/trade_5
ruixhuang Aug 22, 2024
89fd283
Lint
ruixhuang Aug 22, 2024
ddbe267
Lint
ruixhuang Aug 22, 2024
c8ee7d8
Lint
ruixhuang Aug 22, 2024
6cd6cca
WIP
ruixhuang Aug 23, 2024
cb4580b
SL/TP
ruixhuang Aug 23, 2024
50185be
Bump version
mobile-build-bot Aug 23, 2024
9a36027
WIP
ruixhuang Aug 23, 2024
7b13ba6
AdjustIsolatedMarginInput
ruixhuang Aug 25, 2024
fd3b934
TradeInput tests
ruixhuang Aug 25, 2024
e02f979
WIP
ruixhuang Aug 26, 2024
4ddcf9b
Merge branch 'main' into feature/trade_6
ruixhuang Aug 26, 2024
4428e8c
Bump version
mobile-build-bot Aug 26, 2024
0546a5c
Merge branch 'feature/trade_6' into feature/trade_7
ruixhuang Aug 26, 2024
667c948
Lint
ruixhuang Aug 26, 2024
cdfbfc7
Lint
ruixhuang Aug 26, 2024
ea3ac98
Merge branch 'feature/trade_6' into feature/trade_7
ruixhuang Aug 26, 2024
5eb96d4
Merge branch 'feature/trade_7' into feature/trade_8
ruixhuang Aug 26, 2024
c48fc46
TradeBracketsTests, TradeRequiredInputTests
ruixhuang Aug 26, 2024
4d5ca8f
V4ClosePositionTests
ruixhuang Aug 27, 2024
625ea12
V4TradeInputTests
ruixhuang Aug 27, 2024
1ab301a
V4AccountTests
ruixhuang Aug 27, 2024
a20f9a6
Merge branch 'main' into feature/trade_7
ruixhuang Aug 27, 2024
e851ed4
Merge branch 'feature/trade_7' into feature/trade_8
ruixhuang Aug 27, 2024
d9fba3d
Clean up
ruixhuang Aug 27, 2024
820034a
Merge branch 'main' into feature/trade_8
ruixhuang Aug 27, 2024
c73af36
Bump version
mobile-build-bot Aug 27, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ allprojects {
}

group = "exchange.dydx.abacus"
version = "1.9.6"
version = "1.9.7"

repositories {
google()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ internal class SubaccountCalculatorV2(
market: InternalMarketState?,
period: CalculationPeriod,
): Double {
val maintenanceMarginFraction = position?.calculated?.get(period)?.adjustedImf
val maintenanceMarginFraction = position?.calculated?.get(period)?.adjustedMmf
val oraclePrice = market?.perpetualMarket?.oraclePrice
val size = position?.calculated?.get(period)?.size

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -423,15 +423,15 @@ internal class TradeInputMarketOrderCalculator() {
worstPrice: Double?,
filled: Boolean,
): TradeInputMarketOrder? {
return if (size != null && usdcSize != null && size != Numeric.double.ZERO) {
return if (size != null && usdcSize != null) {
TradeInputMarketOrder(
orderbook = orderbook.map {
OrderbookUsage(
price = it.price,
size = it.size,
)
}.toIList(),
price = (usdcSize / size),
price = if (size != Numeric.double.ZERO) usdcSize / size else null,
size = size,
usdcSize = usdcSize,
worstPrice = worstPrice,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ internal class TradeInputSummaryCalculator {
}

private fun getMultiplier(trade: InternalTradeInputState): Double {
return if (trade.side == OrderSide.Buy) Numeric.double.POSITIVE else Numeric.double.NEGATIVE
return if (trade.side == OrderSide.Sell) Numeric.double.POSITIVE else Numeric.double.NEGATIVE
}

private fun calculateTakerReward(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ data class TradeInputSummary(
companion object {
internal fun create(
state: InternalTradeInputSummary?,
): TradeInputSummary? {
): TradeInputSummary {
return TradeInputSummary(
price = state?.price,
payloadPrice = state?.payloadPrice,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import exchange.dydx.abacus.calculator.v2.tradeinput.TradeInputCalculatorV2
import exchange.dydx.abacus.output.input.InputType
import exchange.dydx.abacus.output.input.OrderSide
import exchange.dydx.abacus.output.input.OrderType
import exchange.dydx.abacus.output.input.TradeInputPrice
import exchange.dydx.abacus.output.input.TradeInputSize
import exchange.dydx.abacus.protocols.ParserProtocol
import exchange.dydx.abacus.responses.ParsingError
Expand All @@ -21,6 +22,7 @@ import exchange.dydx.abacus.state.internalstate.InternalPerpetualPosition
import exchange.dydx.abacus.state.internalstate.InternalRewardsParamsState
import exchange.dydx.abacus.state.internalstate.InternalTradeInputState
import exchange.dydx.abacus.state.internalstate.InternalWalletState
import exchange.dydx.abacus.state.internalstate.safeCreate
import exchange.dydx.abacus.state.manager.StatsigConfig
import exchange.dydx.abacus.state.model.ClosePositionInputField
import exchange.dydx.abacus.utils.Numeric
Expand Down Expand Up @@ -152,7 +154,7 @@ internal class ClosePositionInputProcessor(

trade.marketId?.let { marketId ->
val limitPrice = getMidMarketPrice(marketSummaryState, marketId)
trade.price = trade.price?.copy(limitPrice = limitPrice)
trade.price = TradeInputPrice.safeCreate(trade.price).copy(limitPrice = limitPrice)
}
} else {
trade.type = OrderType.Market
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ internal class AssetPositionsProcessor(
payload: List<IndexerAssetPositionResponseObject>?
): Map<String, InternalAssetPositionState>? {
return if (payload != null) {
var modified = existing?.mutable() ?: mutableMapOf()
val modified = existing?.mutable() ?: mutableMapOf()
for (item in payload) {
val assetPosition = itemProcessor.process(item)
if (assetPosition?.symbol != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,9 +301,12 @@ internal class OrderProcessor(
existing: SubaccountOrder?,
payload: IndexerCompositeOrderObject,
): Boolean {
val updatedAt = existing?.updatedAtMilliseconds?.let {
if (existing == null) {
return true
}
val updatedAt = existing.updatedAtMilliseconds?.let {
Instant.fromEpochMilliseconds(it.toLong())
} ?: existing?.createdAtMilliseconds?.let {
} ?: existing.createdAtMilliseconds?.let {
Instant.fromEpochMilliseconds(it.toLong())
}
val incomingUpdatedAt = parser.asDatetime(payload.updatedAt)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import exchange.dydx.abacus.utils.NUM_PARENT_SUBACCOUNTS
import exchange.dydx.abacus.utils.Numeric
import exchange.dydx.abacus.utils.safeSet
import indexer.codegen.IndexerPerpetualPositionResponseObject
import indexer.codegen.IndexerPositionSide

/*
"ETH-USD": {
Expand Down Expand Up @@ -136,11 +137,19 @@ internal class PerpetualPositionProcessor(
} else {
sideStringKey
}
val size = parser.asDouble(payload.size)
val signedSize =
if (size != null) {
if (payload.side == IndexerPositionSide.SHORT) (size.abs() * -1.0) else size
} else {
null
}

InternalPerpetualPosition(
market = payload.market,
status = payload.status,
side = payload.side,
size = parser.asDouble(payload.size),
size = signedSize,
maxSize = parser.asDouble(payload.maxSize),
entryPrice = parser.asDouble(payload.entryPrice),
realizedPnl = parser.asDouble(payload.realizedPnl),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ internal open class SubaccountProcessor(
height = height,
)

val perpetualPositions = content["perpetualPositions"] ?: content["openPerpetualPositions"]
val perpetualPositions = content["perpetualPositions"] ?: content["openPerpetualPositions"] ?: content["positions"]
val positions = parser.asTypedList<IndexerPerpetualPositionResponseObject>(perpetualPositions)
state = processPerpetualPositions(
existing = state,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ internal fun TradingStateMachine.receivedSubaccountSubscribed(
payload: Map<String, Any>,
height: BlockAndTime?,
): StateChanges {
this.wallet = walletProcessor.subscribedDeprecated(wallet, payload, height)
if (staticTyping) {
walletProcessor.processSubscribed(internalState.wallet, payload, height)
} else {
this.wallet = walletProcessor.subscribedDeprecated(wallet, payload, height)
}

val changes = iMutableListOf<Changes>()
Expand All @@ -43,17 +44,26 @@ internal fun TradingStateMachine.receivedSubaccountSubscribed(
changes.add(Changes.historicalPnl)
changes.add(Changes.tradingRewards)
val subaccountNumber = parser.asInt(payload["subaccountNumber"]) ?: 0
val subaccountNumbers = MarginCalculator.getChangedSubaccountNumbersDeprecated(
parser,
account,
subaccountNumber ?: 0,
parser.asMap(input?.get("trade")),
)
val subaccountNumbers = if (staticTyping) {
MarginCalculator.getChangedSubaccountNumbers(
parser = parser,
subaccounts = internalState.wallet.account.subaccounts,
subaccountNumber = subaccountNumber,
tradeInput = internalState.input.trade,
)
} else {
MarginCalculator.getChangedSubaccountNumbersDeprecated(
parser = parser,
account = account,
subaccountNumber = subaccountNumber ?: 0,
tradeInput = parser.asMap(input?.get("trade")),
)
}

return StateChanges(
changes,
null,
subaccountNumbers,
changes = changes,
markets = null,
subaccountNumbers = subaccountNumbers,
)
}

Expand All @@ -62,9 +72,10 @@ internal fun TradingStateMachine.receivedSubaccountsChanges(
info: SocketInfo,
height: BlockAndTime?,
): StateChanges {
this.wallet = walletProcessor.channel_dataDeprecated(wallet, payload, info, height)
if (staticTyping) {
walletProcessor.processChannelData(internalState.wallet, payload, info, height)
} else {
this.wallet = walletProcessor.channel_dataDeprecated(wallet, payload, info, height)
}

val changes = iMutableListOf<Changes>()
Expand Down Expand Up @@ -190,10 +201,11 @@ internal fun TradingStateMachine.receivedFills(
val fills = parser.asList(payload["fills"])
val size = fills?.size ?: 0
return if (size > 0) {
wallet = walletProcessor.receivedFillsDeprecated(wallet, payload, subaccountNumber)
if (staticTyping) {
val payload = parser.asTypedObject<IndexerFillResponse>(payload)
walletProcessor.processFills(internalState.wallet, payload?.fills?.toList(), subaccountNumber)
} else {
wallet = walletProcessor.receivedFillsDeprecated(wallet, payload, subaccountNumber)
}
StateChanges(iListOf(Changes.fills), null, iListOf(subaccountNumber))
} else {
Expand All @@ -216,10 +228,11 @@ internal fun TradingStateMachine.receivedTransfers(
): StateChanges {
val size = parser.asList(payload["transfers"])?.size ?: 0
return if (size > 0) {
wallet = walletProcessor.receivedTransfersDeprecated(wallet, payload, subaccountNumber)
if (staticTyping) {
val payload = parser.asTypedObject<IndexerTransferResponse>(payload)
walletProcessor.processTransfers(internalState.wallet, payload?.transfers?.toList(), subaccountNumber)
} else {
wallet = walletProcessor.receivedTransfersDeprecated(wallet, payload, subaccountNumber)
}
StateChanges(iListOf(Changes.transfers), null, iListOf(subaccountNumber))
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ internal class TradeBracketOrdersValidator(
tickSize: String,
): ValidationError? {
when (trade.side) {
OrderSide.Buy -> {
OrderSide.Sell -> {
if (triggerPrice >= price) {
return triggerPriceError(
errorCode = "BRACKET_ORDER_TAKE_PROFIT_BELOW_EXPECTED_PRICE",
Expand All @@ -202,7 +202,7 @@ internal class TradeBracketOrdersValidator(
return null
}
}
OrderSide.Sell -> {
OrderSide.Buy -> {
if (triggerPrice <= price) {
return triggerPriceError(
errorCode = "BRACKET_ORDER_TAKE_PROFIT_ABOVE_EXPECTED_PRICE",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,27 +46,27 @@ internal class TradeFieldsValidator(
}
}

if (trade.options.needsTriggerPrice) {
val triggerPrice = trade.price?.triggerPrice ?: 0.0
if (triggerPrice == 0.0) {
if (trade.options.needsLimitPrice) {
val limitPrice = trade.price?.limitPrice ?: 0.0
if (limitPrice == 0.0) {
errors.add(
required(
errorCode = "REQUIRED_TRIGGER_PRICE",
field = TradeInputField.triggerPrice.rawValue,
actionStringKey = "APP.TRADE.ENTER_TRIGGER_PRICE",
errorCode = "REQUIRED_LIMIT_PRICE",
field = TradeInputField.limitPrice.rawValue,
actionStringKey = "APP.TRADE.ENTER_LIMIT_PRICE",
),
)
}
}

if (trade.options.needsLimitPrice) {
val limitPrice = trade.price?.limitPrice ?: 0.0
if (limitPrice == 0.0) {
if (trade.options.needsTriggerPrice) {
val triggerPrice = trade.price?.triggerPrice ?: 0.0
if (triggerPrice == 0.0) {
errors.add(
required(
errorCode = "REQUIRED_LIMIT_PRICE",
field = TradeInputField.limitPrice.rawValue,
actionStringKey = "APP.TRADE.ENTER_LIMIT_PRICE",
errorCode = "REQUIRED_TRIGGER_PRICE",
field = TradeInputField.triggerPrice.rawValue,
actionStringKey = "APP.TRADE.ENTER_TRIGGER_PRICE",
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ internal class WithdrawalCapacityValidator(
restricted: Boolean,
environment: V4Environment?
): List<ValidationError>? {
val configs = internalState.configs
val withdrawalCapacity = configs.withdrawalCapacity
val maxWithdrawalCapacity = withdrawalCapacity?.maxWithdrawalCapacity ?: BigDecimal.fromLong(Long.MAX_VALUE)
return null
}

Expand Down
Loading
Loading