Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-25 10:34:48 +05:00
commit 810a267dc6
4 changed files with 66 additions and 45 deletions

View file

@ -19,25 +19,23 @@ enum class StakingActionType {
UNKNOWN,
;
companion object {
val StakingActionType.asAnalyticName
get() = when (this) {
STAKE -> "Stake"
UNSTAKE -> "Unstake"
CLAIM_REWARDS -> "Claim Rewards"
RESTAKE_REWARDS -> "Restake Rewards"
WITHDRAW -> "Withdraw"
RESTAKE -> "Restake"
CLAIM_UNSTAKED -> "Claim Unstaked"
UNLOCK_LOCKED -> "Unlock Locked"
STAKE_LOCKED -> "Stake Locked"
VOTE -> "Vote"
REVOKE -> "Revoke"
VOTE_LOCKED -> "Vote Locked"
REVOTE -> "Revote"
REBOND -> "Rebond"
MIGRATE -> "Migrate"
UNKNOWN -> "Unknown"
}
}
val asAnalyticName
get() = when (this) {
STAKE -> "Stake"
UNSTAKE -> "Unstake"
CLAIM_REWARDS -> "Claim Rewards"
RESTAKE_REWARDS -> "Restake Rewards"
WITHDRAW -> "Withdraw"
RESTAKE -> "Restake"
CLAIM_UNSTAKED -> "Claim Unstaked"
UNLOCK_LOCKED -> "Unlock Locked"
STAKE_LOCKED -> "Stake Locked"
VOTE -> "Vote"
REVOKE -> "Revoke"
VOTE_LOCKED -> "Vote Locked"
REVOTE -> "Revote"
REBOND -> "Rebond"
MIGRATE -> "Migrate"
UNKNOWN -> "Unknown"
}
}

View file

@ -3,7 +3,6 @@ package com.tangem.features.staking.impl.analytics
import com.tangem.core.analytics.models.AnalyticsEvent
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.domain.staking.model.stakekit.action.StakingActionType
import com.tangem.domain.staking.model.stakekit.action.StakingActionType.Companion.asAnalyticName
internal sealed class StakingAnalyticsEvents(
event: String,
@ -101,6 +100,17 @@ internal sealed class StakingAnalyticsEvents(
),
)
data class ValidatorChosen(
val token: String,
val validator: String,
) : StakingAnalyticsEvents(
event = "Validator Chosen",
params = mapOf(
AnalyticsParam.TOKEN_PARAM to token,
"Validator" to validator,
),
)
data class ButtonValidator(
val source: StakeScreenSource,
val token: String,
@ -122,11 +132,11 @@ internal sealed class StakingAnalyticsEvents(
)
data class ButtonAction(
val action: String,
val action: StakingActionType,
val token: String,
val validator: String,
) : StakingAnalyticsEvents(
event = "Button - $action",
event = "Button - ${action.asAnalyticName}",
params = mapOf(
AnalyticsParam.TOKEN_PARAM to token,
"Validator" to validator,

View file

@ -82,14 +82,6 @@ internal class StakingAnalyticSender(
val validatorState = confirmationState?.validatorState as? ValidatorState.Content
val validatorName = validatorState?.chosenValidator?.name ?: return
analyticsEventHandler.send(
StakingAnalyticsEvents.ButtonAction(
action = getStakingActionType(value).name,
token = value.cryptoCurrencyName,
validator = validatorName,
),
)
analyticsEventHandler.send(
Basic.TransactionSent(
sentFrom = AnalyticsParam.TxSentFrom.Staking(
@ -109,6 +101,20 @@ internal class StakingAnalyticSender(
)
}
fun sendTransactionStakingClickedAnalytics(value: StakingUiState) {
val confirmationState = value.confirmationState as? StakingStates.ConfirmationState.Data
val validatorState = confirmationState?.validatorState as? ValidatorState.Content
val validatorName = validatorState?.chosenValidator?.name ?: return
analyticsEventHandler.send(
StakingAnalyticsEvents.ButtonAction(
action = getStakingActionType(value),
token = value.cryptoCurrencySymbol,
validator = validatorName,
),
)
}
private fun getStakingActionType(value: StakingUiState): StakingActionType {
val confirmationState = value.confirmationState as? StakingStates.ConfirmationState.Data

View file

@ -262,7 +262,7 @@ internal class StakingViewModel @Inject constructor(
onStakingFeeError = { error ->
analyticsEventHandler.send(
StakingAnalyticsEvents.StakingError(
value.cryptoCurrencyName,
value.cryptoCurrencySymbol,
error.javaClass.simpleName,
),
)
@ -270,7 +270,7 @@ internal class StakingViewModel @Inject constructor(
updateNotifications(GetFeeError.UnknownError)
},
onFeeError = { error ->
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName))
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol))
stateController.update(AddStakingErrorTransformer())
updateNotifications(error)
},
@ -291,6 +291,7 @@ internal class StakingViewModel @Inject constructor(
private fun handleOnNextConfirmationClick() {
if (isAssentState()) {
viewModelScope.launch {
stakingAnalyticSender.sendTransactionStakingClickedAnalytics(value)
stateController.update(SetConfirmationStateInProgressTransformer())
transactionSender.constructAndSendTransactions(
onConstructSuccess = { constructedTransactions ->
@ -300,7 +301,7 @@ internal class StakingViewModel @Inject constructor(
Timber.e(error.toString())
analyticsEventHandler.send(
StakingAnalyticsEvents.StakingError(
token = value.cryptoCurrencyName,
token = value.cryptoCurrencySymbol,
errorType = error.javaClass.simpleName,
),
)
@ -314,7 +315,7 @@ internal class StakingViewModel @Inject constructor(
},
onSendError = { error ->
Timber.e(error.toString())
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName))
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol))
stakingEventFactory.createSendTransactionErrorAlert(error)
stateController.update(SetConfirmationStateResetAssentTransformer)
},
@ -353,7 +354,7 @@ internal class StakingViewModel @Inject constructor(
}
override fun onInitialInfoBannerClick() {
analyticsEventHandler.send(StakingAnalyticsEvents.WhatIsStaking(cryptoCurrencyStatus.currency.symbol))
analyticsEventHandler.send(StakingAnalyticsEvents.WhatIsStaking(value.cryptoCurrencySymbol))
innerRouter.openUrl(WHAT_IS_STAKING_ARTICLE_URL)
}
@ -374,13 +375,13 @@ internal class StakingViewModel @Inject constructor(
}
override fun onMaxValueClick() {
analyticsEventHandler.send(StakingAnalyticsEvents.ButtonMax(cryptoCurrencyStatus.currency.symbol))
analyticsEventHandler.send(StakingAnalyticsEvents.ButtonMax(value.cryptoCurrencySymbol))
stateController.update(AmountMaxValueStateTransformer(cryptoCurrencyStatus, yield))
}
override fun onCurrencyChangeClick(isFiat: Boolean) {
analyticsEventHandler.send(
StakingAnalyticsEvents.AmountSelectCurrency(cryptoCurrencyStatus.currency.symbol, isFiat),
StakingAnalyticsEvents.AmountSelectCurrency(value.cryptoCurrencySymbol, isFiat),
)
stateController.update(AmountCurrencyChangeStateTransformer(cryptoCurrencyStatus, isFiat))
}
@ -389,19 +390,25 @@ internal class StakingViewModel @Inject constructor(
analyticsEventHandler.send(
StakingAnalyticsEvents.ButtonValidator(
source = StakeScreenSource.Confirmation,
token = cryptoCurrencyStatus.currency.symbol,
token = value.cryptoCurrencySymbol,
),
)
stakingStateRouter.showValidators()
}
override fun onValidatorSelect(validator: Yield.Validator) {
analyticsEventHandler.send(
StakingAnalyticsEvents.ValidatorChosen(
value.cryptoCurrencySymbol,
validator.name,
),
)
stateController.update(ValidatorSelectChangeTransformer(validator))
}
override fun openRewardsValidators() {
analyticsEventHandler.send(
StakingAnalyticsEvents.ButtonRewards(value.cryptoCurrencyName),
StakingAnalyticsEvents.ButtonRewards(value.cryptoCurrencySymbol),
)
val rewardsValidators =
stateController.value.rewardsValidatorsState as? StakingStates.RewardsValidatorsState.Data
@ -412,7 +419,7 @@ internal class StakingViewModel @Inject constructor(
analyticsEventHandler.send(
StakingAnalyticsEvents.ButtonValidator(
source = StakeScreenSource.Info,
token = cryptoCurrencyStatus.currency.symbol,
token = value.cryptoCurrencySymbol,
),
)
onNextClick(actionTypeToOverwrite = StakingActionCommonType.PENDING_REWARDS)
@ -466,7 +473,7 @@ internal class StakingViewModel @Inject constructor(
analyticsEventHandler.send(
StakingAnalyticsEvents.ButtonValidator(
source = StakeScreenSource.Info,
token = cryptoCurrencyStatus.currency.symbol,
token = value.cryptoCurrencySymbol,
),
)
}
@ -511,7 +518,7 @@ internal class StakingViewModel @Inject constructor(
).fold(
ifLeft = { error ->
Timber.e(error.toString())
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName))
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol))
stateController.update(
SetConfirmationStateAssentApprovalTransformer(
appCurrencyProvider = Provider { appCurrency },
@ -533,7 +540,7 @@ internal class StakingViewModel @Inject constructor(
).fold(
ifLeft = { error ->
Timber.e(error.toString())
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName))
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol))
stateController.update(
SetConfirmationStateAssentApprovalTransformer(
appCurrencyProvider = Provider { appCurrency },