diff --git a/build.gradle.kts b/build.gradle.kts index ac6bb894c..7c5b417fd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -49,7 +49,7 @@ allprojects { } group = "exchange.dydx.abacus" -version = "1.7.6" +version = "1.7.7" repositories { google() diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt index 25c55ce71..03cfce228 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/StateManagerAdaptor.kt @@ -2366,7 +2366,7 @@ open class StateManagerAdaptor( ) } - internal fun tracking(eventName: String, params: IMap?) { + internal open fun tracking(eventName: String, params: IMap? = null) { val paramsAsString = jsonEncoder.encode(params) ioImplementations.threading?.async(ThreadingType.main) { ioImplementations.tracking?.log(eventName, paramsAsString) diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt index 37bb99198..d2d094cd4 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/manager/V4StateManagerAdaptor.kt @@ -39,6 +39,7 @@ import exchange.dydx.abacus.utils.Logger import exchange.dydx.abacus.utils.Numeric import exchange.dydx.abacus.utils.ParsingHelper import exchange.dydx.abacus.utils.UIImplementations +import exchange.dydx.abacus.utils.filterNotNull import exchange.dydx.abacus.utils.iMapOf import exchange.dydx.abacus.utils.isAddressValid import exchange.dydx.abacus.utils.mutableMapOf @@ -1532,17 +1533,9 @@ class V4StateManagerAdaptor( } override fun trackingParams(interval: Double): IMap { - val validatorUrl = this.validatorUrl - return if (validatorUrl != null) { - iMapOf( - "roundtripMs" to interval, - "validatorUrl" to validatorUrl, - ) - } else { - iMapOf( - "roundtripMs" to interval, - ) - } + return iMapOf( + "roundtripMs" to interval, + ) } private fun didSetApiState(apiState: ApiState?, oldValue: ApiState?) { @@ -1570,27 +1563,32 @@ class V4StateManagerAdaptor( trackApiStateIfNeeded(apiState, null) } + private fun apiStateParams(): IMap? { + val indexerTime = lastIndexerCallTime?.toEpochMilliseconds() + val validatorTime = lastValidatorCallTime?.toEpochMilliseconds() + val interval = indexerTime?.let { Clock.System.now().toEpochMilliseconds() - it } + return iMapOf( + "lastSuccessfulIndexerRPC" to indexerTime?.toDouble(), + "lastSuccessfulFullNodeRPC" to validatorTime?.toDouble(), + "elapsedTime" to interval?.toDouble(), + "blockHeight" to indexerState.blockAndTime?.block, + "nodeHeight" to validatorState.blockAndTime?.block, + "validatorUrl" to this.validatorUrl, + ) as IMap? + } + private fun trackApiStateIfNeeded(apiState: ApiState?, oldValue: ApiState?) { if (apiState?.abnormalState() == true || oldValue?.abnormalState() == true) { - val indexerTime = lastIndexerCallTime?.toEpochMilliseconds()?.toDouble() - val validatorTime = lastValidatorCallTime?.toEpochMilliseconds()?.toDouble() - val interval = if (indexerTime != null) { - ( - Clock.System.now().toEpochMilliseconds() - .toDouble() - indexerTime - ) - } else { - null - } - val params = mapOf( - "lastSuccessfulIndexerRPC" to indexerTime, - "lastSuccessfulFullNodeRPC" to validatorTime, - "elapsedTime" to interval, - "blockHeight" to indexerState.blockAndTime?.block, - "nodeHeight" to validatorState.blockAndTime?.block, - ).filterValues { it != null } as Map - - tracking(AnalyticsEvent.NetworkStatus.rawValue, params.toIMap()) + tracking(AnalyticsEvent.NetworkStatus.rawValue) + } + } + + override fun tracking(eventName: String, params: IMap?) { + val requiredParams = apiStateParams() + val mergedParams = params?.let { ParsingHelper.merge(params.filterNotNull(), requiredParams) } ?: requiredParams + val paramsAsString = this.jsonEncoder.encode(mergedParams) + this.ioImplementations.threading?.async(ThreadingType.main) { + this.ioImplementations.tracking?.log(eventName, paramsAsString) } } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionStats.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionStats.kt index 3e67452f5..1669ac271 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionStats.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionStats.kt @@ -12,7 +12,8 @@ import exchange.dydx.abacus.state.manager.NetworkStatus import exchange.dydx.abacus.state.model.TradingStateMachine import exchange.dydx.abacus.state.model.updateHeight import exchange.dydx.abacus.utils.IMap -import kollections.toIMap +import exchange.dydx.abacus.utils.ParsingHelper +import exchange.dydx.abacus.utils.iMapOf import kotlinx.datetime.Clock import kotlinx.datetime.Instant import kotlin.math.max @@ -245,32 +246,29 @@ internal class ConnectionStats( updateApiState() } + private fun apiStateParams(): IMap? { + val indexerTime = lastIndexerCallTime?.toEpochMilliseconds() + val validatorTime = lastValidatorCallTime?.toEpochMilliseconds() + val interval = indexerTime?.let { Clock.System.now().toEpochMilliseconds() - it } + return iMapOf( + "lastSuccessfulIndexerRPC" to indexerTime?.toDouble(), + "lastSuccessfulFullNodeRPC" to validatorTime?.toDouble(), + "elapsedTime" to interval?.toDouble(), + "blockHeight" to indexerState.blockAndTime?.block, + "nodeHeight" to validatorState.blockAndTime?.block, + "validatorUrl" to helper.validatorUrl, + ) as IMap? + } + private fun trackApiStateIfNeeded(apiState: ApiState?, oldValue: ApiState?) { if (apiState?.abnormalState() == true || oldValue?.abnormalState() == true) { - val indexerTime = lastIndexerCallTime?.toEpochMilliseconds()?.toDouble() - val validatorTime = lastValidatorCallTime?.toEpochMilliseconds()?.toDouble() - val interval = if (indexerTime != null) { - ( - Clock.System.now().toEpochMilliseconds() - .toDouble() - indexerTime - ) - } else { - null - } - val params = mapOf( - "lastSuccessfulIndexerRPC" to indexerTime, - "lastSuccessfulFullNodeRPC" to validatorTime, - "elapsedTime" to interval, - "blockHeight" to indexerState.blockAndTime?.block, - "nodeHeight" to validatorState.blockAndTime?.block, - ).filterValues { it != null } as Map - - tracking(AnalyticsEvent.NetworkStatus.rawValue, params.toIMap()) + tracking(AnalyticsEvent.NetworkStatus.rawValue) } } - private fun tracking(eventName: String, params: IMap?) { - val paramsAsString = helper.jsonEncoder.encode(params) + private fun tracking(eventName: String, params: IMap? = null) { + val additionalParams = apiStateParams() + val paramsAsString = helper.jsonEncoder.encode(params?.let { ParsingHelper.merge(it, additionalParams) } ?: additionalParams) helper.ioImplementations.threading?.async(ThreadingType.main) { helper.ioImplementations.tracking?.log(eventName, paramsAsString) } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionsSupervisor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionsSupervisor.kt index 52348560f..8a08c139b 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionsSupervisor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/ConnectionsSupervisor.kt @@ -28,9 +28,11 @@ internal class ConnectionsSupervisor( private val delegate: ConnectionDelegate, ) : NetworkSupervisor(stateMachine, helper, analyticsUtils), ConnectionStatsDelegate { private val connectionStats = ConnectionStats(stateMachine, helper, this) - override var validatorUrl: String? = null + + override var validatorUrl: String? + get() = helper.validatorUrl set(value) { - field = value + helper.validatorUrl = value didSetValidatorUrl(value) } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkHelper.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkHelper.kt index b4bf42c93..e6825f267 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkHelper.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkHelper.kt @@ -51,6 +51,7 @@ class NetworkHelper( internal var lastValidatorCallTime: Instant? = null internal var lastIndexerCallTime: Instant? = null internal val jsonEncoder = JsonEncoder() + internal var validatorUrl: String? = null private var indexerRestriction: UsageRestriction? = null set(value) { @@ -530,11 +531,4 @@ class NetworkHelper( } } } - - private fun tracking(eventName: String, params: IMap?) { - val paramsAsString = jsonEncoder.encode(params) - ioImplementations.threading?.async(ThreadingType.main) { - ioImplementations.tracking?.log(eventName, paramsAsString) - } - } } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkSupervisor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkSupervisor.kt index 475a8a847..19ff87cbf 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkSupervisor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/NetworkSupervisor.kt @@ -7,6 +7,9 @@ import exchange.dydx.abacus.state.changes.StateChanges import exchange.dydx.abacus.state.model.TradingStateMachine import exchange.dydx.abacus.utils.AnalyticsUtils import exchange.dydx.abacus.utils.IMap +import exchange.dydx.abacus.utils.ParsingHelper +import exchange.dydx.abacus.utils.filterNotNull +import exchange.dydx.abacus.utils.iMapOf import kollections.iListOf internal open class NetworkSupervisor( @@ -82,7 +85,9 @@ internal open class NetworkSupervisor( } internal fun tracking(eventName: String, params: IMap?) { - val paramsAsString = helper.jsonEncoder.encode(params) + val requiredParams = helper.validatorUrl?.let { iMapOf("validatorUrl" to it) } ?: iMapOf() + val mergedParams = params?.let { ParsingHelper.merge(params.filterNotNull(), requiredParams) } ?: requiredParams + val paramsAsString = helper.jsonEncoder.encode(mergedParams) helper.ioImplementations.threading?.async(ThreadingType.main) { helper.ioImplementations.tracking?.log(eventName, paramsAsString) } diff --git a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/SubaccountSupervisor.kt b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/SubaccountSupervisor.kt index 27d997cba..a69b1c514 100644 --- a/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/SubaccountSupervisor.kt +++ b/src/commonMain/kotlin/exchange.dydx.abacus/state/v2/supervisor/SubaccountSupervisor.kt @@ -81,7 +81,7 @@ internal class SubaccountSupervisor( analyticsUtils: AnalyticsUtils, private val configs: SubaccountConfigs, private val accountAddress: String, - internal val subaccountNumber: Int + internal val subaccountNumber: Int, ) : DynamicNetworkSupervisor(stateMachine, helper, analyticsUtils) { /* Because faucet is done at subaccount level, we need SubaccountSupervisor even diff --git a/v4_abacus.podspec b/v4_abacus.podspec index 7baf0e652..dcfc5a3e6 100644 --- a/v4_abacus.podspec +++ b/v4_abacus.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'v4_abacus' - spec.version = '1.7.6' + spec.version = '1.7.7' spec.homepage = 'https://github.com/dydxprotocol/v4-abacus' spec.source = { :http=> ''} spec.authors = ''