Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-23 14:58:45 +05:00
parent 4c525f0cad
commit 3645815d0a
6 changed files with 67 additions and 33 deletions

View file

@ -1,20 +1,20 @@
package com.tangem.domain.staking.model.stakekit.action
enum class StakingActionType {
STAKE,
UNSTAKE,
CLAIM_REWARDS,
RESTAKE_REWARDS,
WITHDRAW,
RESTAKE,
CLAIM_UNSTAKED,
UNLOCK_LOCKED,
STAKE_LOCKED,
VOTE,
REVOKE,
VOTE_LOCKED,
REVOTE,
REBOND,
MIGRATE,
UNKNOWN,
enum class StakingActionType(val type: String) {
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

@ -47,18 +47,20 @@ internal sealed class StakingAnalyticsEvents(
params = mapOf(
AnalyticsParam.TOKEN_PARAM to token,
"Validator" to validator,
"Action" to action.name,
"Action" to action.type,
),
)
data class StakeInProgressScreenOpened(
val validator: String,
val token: String,
val action: StakingActionType,
) : StakingAnalyticsEvents(
event = "Stake In Progress Screen Opened",
params = mapOf(
AnalyticsParam.TOKEN_PARAM to token,
"Validator" to validator,
"Action" to action.type,
),
)
@ -136,9 +138,13 @@ internal sealed class StakingAnalyticsEvents(
data class StakingError(
val token: String,
val errorType: String,
) : StakingAnalyticsEvents(
event = "Errors",
params = mapOf(AnalyticsParam.TOKEN_PARAM to token),
params = mapOf(
AnalyticsParam.TOKEN_PARAM to token,
"ErrorType" to errorType,
),
)
data class TransactionError(

View file

@ -104,6 +104,7 @@ internal class StakingAnalyticSender(
StakingAnalyticsEvents.StakeInProgressScreenOpened(
validator = validatorName,
token = value.cryptoCurrencySymbol,
action = getStakingActionType(value),
),
)
}

View file

@ -49,9 +49,10 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
suspend fun getFee(
pendingAction: PendingAction?,
pendingActions: ImmutableList<PendingAction>?,
onFeeError: (GetFeeError) -> Unit,
onStakingFee: (Fee) -> Unit,
onStakingFeeError: (StakingError) -> Unit,
onApprovalFee: (TransactionFee) -> Unit,
onFeeError: (GetFeeError) -> Unit,
) {
val state = stateController.value
val confirmationState = state.confirmationState as? StakingStates.ConfirmationState.Data
@ -85,7 +86,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
pendingActions = pendingActions,
amount = amount,
validatorAddress = validatorAddress,
onFeeError = onFeeError,
onStakingFeeError = onStakingFeeError,
onStakingFee = onStakingFee,
)
}
@ -95,7 +96,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
pendingActions = pendingActions,
amount = amount,
validatorAddress = validatorAddress,
onFeeError = onFeeError,
onStakingFeeError = onStakingFeeError,
onStakingFee = onStakingFee,
)
}
@ -106,7 +107,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
pendingActions: ImmutableList<PendingAction>?,
amount: BigDecimal,
validatorAddress: String,
onFeeError: (GetFeeError) -> Unit,
onStakingFeeError: (StakingError) -> Unit,
onStakingFee: (Fee) -> Unit,
) {
val sourceAddress = cryptoCurrencyStatus.value.networkAddress?.defaultAddress?.value
@ -125,7 +126,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
action = action,
)
}.getOrElse {
onFeeError(GetFeeError.DataError(Throwable(it.toString())))
onStakingFeeError(it)
null
}
}
@ -133,7 +134,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
}
if (result.isNullOrEmpty()) {
onFeeError(GetFeeError.UnknownError)
onStakingFeeError(StakingError.UnknownError)
return
}
@ -151,7 +152,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor(
validatorAddress = validatorAddress,
action = pendingAction,
).getOrElse {
onFeeError(GetFeeError.DataError(Throwable(it.toString())))
onStakingFeeError(it)
return
}
}

View file

@ -185,7 +185,12 @@ internal class StakingTransactionSender @AssistedInject constructor(
type = action?.type,
),
).getOrElse {
analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(state.cryptoCurrencyName))
analyticsEventHandler.send(
StakingAnalyticsEvents.StakingError(
token = state.cryptoCurrencyName,
errorType = it.javaClass.simpleName,
),
)
onConstructError(it)
return emptyList()
}
@ -248,9 +253,12 @@ internal class StakingTransactionSender @AssistedInject constructor(
rawCurrencyId = rawCurrencyId,
),
)
.onLeft {
.onLeft { error ->
analyticsEventHandler.send(
StakingAnalyticsEvents.StakingError(stateController.value.cryptoCurrencyName),
StakingAnalyticsEvents.StakingError(
token = stateController.value.cryptoCurrencyName,
errorType = error.javaClass.simpleName,
),
)
saveUnsubmittedHashUseCase.invoke(
transactionId = transactionId,

View file

@ -1,7 +1,10 @@
package com.tangem.features.staking.impl.presentation.viewmodel
import android.os.Bundle
import androidx.lifecycle.*
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import arrow.core.getOrElse
import com.tangem.blockchain.common.transaction.TransactionFee
import com.tangem.common.routing.AppRoute
@ -256,8 +259,18 @@ internal class StakingViewModel @Inject constructor(
)
updateNotifications()
},
onStakingFeeError = { error ->
analyticsEventHandler.send(
StakingAnalyticsEvents.StakingError(
value.cryptoCurrencyName,
error.javaClass.simpleName,
),
)
stateController.update(AddStakingErrorTransformer())
updateNotifications(GetFeeError.UnknownError)
},
onFeeError = { error ->
analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(value.cryptoCurrencyName))
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName))
stateController.update(AddStakingErrorTransformer())
updateNotifications(error)
},
@ -285,7 +298,12 @@ internal class StakingViewModel @Inject constructor(
},
onConstructError = { error ->
Timber.e(error.toString())
analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(value.cryptoCurrencyName))
analyticsEventHandler.send(
StakingAnalyticsEvents.StakingError(
token = value.cryptoCurrencyName,
errorType = error.javaClass.simpleName,
),
)
stakingEventFactory.createStakingErrorAlert(error)
stateController.update(SetConfirmationStateResetAssentTransformer)
},
@ -296,7 +314,7 @@ internal class StakingViewModel @Inject constructor(
},
onSendError = { error ->
Timber.e(error.toString())
analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(value.cryptoCurrencyName))
analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName))
stakingEventFactory.createSendTransactionErrorAlert(error)
stateController.update(SetConfirmationStateResetAssentTransformer)
},