Updated on 2026-08-14

This commit is contained in:
Tangem 2026-02-03 15:31:18 +04:00
parent df39e1703c
commit 343cf1ed20
10 changed files with 38 additions and 7 deletions

View file

@ -1,5 +1,8 @@
package com.tangem.core.analytics.models
import com.tangem.core.analytics.models.AnalyticsParam.Key.REFERRAL
import com.tangem.core.analytics.models.AnalyticsParam.Key.REFERRAL_ID
sealed class AnalyticsParam {
sealed class CardBalanceState(val value: String) {
@ -268,5 +271,12 @@ sealed class AnalyticsParam {
const val ENS = "ENS"
const val ENS_ADDRESS = "ENS Address"
const val ACCOUNT_DERIVATION_FROM = "Account Derivation (from)"
const val REFERRAL = "Referral"
const val REFERRAL_ID = "Referral_ID"
}
}
}
fun getReferralParams(referralId: String?): List<Pair<String, String>> = listOf(
REFERRAL to (!referralId.isNullOrBlank()).toString().replaceFirstChar(Char::titlecase),
REFERRAL_ID to (referralId ?: "None"),
)

View file

@ -16,6 +16,7 @@ dependencies {
implementation(projects.core.analytics)
implementation(projects.core.analytics.models)
implementation(projects.core.configToggles)
implementation(projects.core.datasource)
implementation(projects.core.navigation)
implementation(projects.core.utils)
implementation(projects.core.ui)

View file

@ -8,6 +8,7 @@ import com.tangem.core.analytics.models.AnalyticsParam.Key.PROVIDER
import com.tangem.core.analytics.models.AnalyticsParam.Key.RECEIVE_TOKEN
import com.tangem.core.analytics.models.AnalyticsParam.Key.SEND_TOKEN
import com.tangem.core.analytics.models.AppsFlyerIncludedEvent
import com.tangem.core.analytics.models.getReferralParams
import com.tangem.feature.swap.domain.models.domain.SwapProvider
import com.tangem.feature.swap.domain.models.ui.FeeType
@ -86,6 +87,7 @@ sealed class SwapEvents(
val receiveToken: String,
val fromDerivationIndex: Int?,
val toDerivationIndex: Int?,
val referralId: String?,
) : SwapEvents(
event = "Swap in Progress Screen Opened",
params = mapOf(
@ -96,6 +98,7 @@ sealed class SwapEvents(
"Send Blockchain" to sendBlockchain,
"Receive Blockchain" to receiveBlockchain,
"Account Derivation From or To (optional)" to "$fromDerivationIndex, $toDerivationIndex",
*getReferralParams(referralId).toTypedArray(),
),
), AppsFlyerIncludedEvent

View file

@ -20,6 +20,7 @@ import com.tangem.core.navigation.url.UrlOpener
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.utils.InputNumberFormatter
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.account.status.model.AccountCryptoCurrencyStatus
import com.tangem.domain.account.status.usecase.GetAccountCurrencyStatusUseCase
@ -118,6 +119,7 @@ internal class SwapModel @Inject constructor(
private val accountsFeatureToggles: AccountsFeatureToggles,
private val getTangemPayCurrencyStatusUseCase: GetTangemPayCurrencyStatusUseCase,
private val tangemPayWithdrawUseCase: TangemPayWithdrawUseCase,
private val appsFlyerStore: AppsFlyerStore,
) : Model() {
private val params = paramsContainer.require<SwapComponent.Params>()
@ -888,7 +890,7 @@ internal class SwapModel @Inject constructor(
}
}
private fun sendSuccessEvent() {
private suspend fun sendSuccessEvent() {
val provider = dataState.selectedProvider ?: return
val fee = dataState.selectedFee?.feeType ?: return
val fromCurrency = dataState.fromCryptoCurrency?.currency ?: return
@ -906,6 +908,7 @@ internal class SwapModel @Inject constructor(
receiveToken = toCurrency.symbol,
fromDerivationIndex = fromDerivationIndex,
toDerivationIndex = toDerivationIndex,
referralId = appsFlyerStore.get()?.refcode,
),
)
}

View file

@ -10,6 +10,7 @@ import com.tangem.core.analytics.models.event.MainScreenAnalyticsEvent
import com.tangem.core.analytics.utils.TrackingContextProxy
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.account.supplier.SingleAccountListSupplier
import com.tangem.domain.account.usecase.IsAccountsModeEnabledUseCase
@ -105,6 +106,7 @@ internal class WalletModel @Inject constructor(
private val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase,
private val feedFeatureToggle: FeedFeatureToggle,
private val bindRefcodeWithWalletUseCase: BindRefcodeWithWalletUseCase,
private val appsFlyerStore: AppsFlyerStore,
val screenLifecycleProvider: ScreenLifecycleProvider,
val innerWalletRouter: InnerWalletRouter,
) : Model() {
@ -235,6 +237,7 @@ internal class WalletModel @Inject constructor(
accountsCount = accountsCount,
theme = theme.value,
isImported = selectedWallet.isImported(),
referralId = appsFlyerStore.get()?.refcode,
),
)
}

View file

@ -1,9 +1,6 @@
package com.tangem.feature.wallet.presentation.wallet.analytics
import com.tangem.core.analytics.models.AnalyticsEvent
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.analytics.models.AppsFlyerIncludedEvent
import com.tangem.core.analytics.models.OneTimeAnalyticsEvent
import com.tangem.core.analytics.models.*
import com.tangem.domain.models.wallet.UserWalletId
sealed class WalletScreenAnalyticsEvent {
@ -59,6 +56,7 @@ sealed class WalletScreenAnalyticsEvent {
private val accountsCount: Int?,
val theme: String,
val isImported: Boolean,
val referralId: String?,
) : MainScreen(
event = "Screen opened",
params = buildMap {
@ -71,6 +69,7 @@ sealed class WalletScreenAnalyticsEvent {
"Seedless"
}
put("Wallet Type", seedPhrase)
putAll(getReferralParams(referralId))
},
), AppsFlyerIncludedEvent

View file

@ -6,6 +6,7 @@ import com.tangem.core.analytics.models.AnalyticsParam.Key.BLOCKCHAIN
import com.tangem.core.analytics.models.AnalyticsParam.Key.ERROR_DESCRIPTION
import com.tangem.core.analytics.models.AnalyticsParam.Key.TOKEN_PARAM
import com.tangem.core.analytics.models.AppsFlyerIncludedEvent
import com.tangem.core.analytics.models.getReferralParams
sealed class YieldSupplyAnalytics(
event: String,
@ -103,22 +104,26 @@ sealed class YieldSupplyAnalytics(
data class FundsEarned(
val token: String,
val blockchain: String,
val referralId: String?,
) : YieldSupplyAnalytics(
event = "Funds Earned",
params = mapOf(
TOKEN_PARAM to token,
BLOCKCHAIN to blockchain,
*getReferralParams(referralId).toTypedArray(),
),
), AppsFlyerIncludedEvent
data class FundsWithdrawn(
val token: String,
val blockchain: String,
val referralId: String?,
) : YieldSupplyAnalytics(
event = "Funds Withdrawn",
params = mapOf(
TOKEN_PARAM to token,
BLOCKCHAIN to blockchain,
*getReferralParams(referralId).toTypedArray(),
),
), AppsFlyerIncludedEvent

View file

@ -18,6 +18,7 @@ dependencies {
/** Core */
implementation(projects.core.configToggles)
implementation(projects.core.datasource)
implementation(projects.core.decompose)
implementation(projects.core.ui)
implementation(projects.core.navigation)

View file

@ -11,6 +11,7 @@ import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus
@ -65,6 +66,7 @@ internal class YieldSupplyStartEarningModel @Inject constructor(
private val yieldSupplyGetMaxFeeUseCase: YieldSupplyGetMaxFeeUseCase,
private val yieldSupplyGetCurrentFeeUseCase: YieldSupplyGetCurrentFeeUseCase,
private val yieldSupplyRepository: YieldSupplyRepository,
private val appsFlyerStore: AppsFlyerStore,
) : Model(), YieldSupplyNotificationsComponent.ModelCallback {
private val params: YieldSupplyStartEarningComponent.Params = paramsContainer.require()
@ -267,6 +269,7 @@ internal class YieldSupplyStartEarningModel @Inject constructor(
YieldSupplyAnalytics.FundsEarned(
blockchain = cryptoCurrency.network.name,
token = cryptoCurrency.symbol,
referralId = appsFlyerStore.get()?.refcode,
),
)
yieldSupplyFeeUM.transactionDataList.forEach {

View file

@ -11,6 +11,7 @@ import com.tangem.core.navigation.url.UrlOpener
import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.models.currency.CryptoCurrency
@ -61,6 +62,7 @@ internal class YieldSupplyStopEarningModel @Inject constructor(
private val yieldSupplyAlertFactory: YieldSupplyAlertFactory,
private val yieldSupplyDeactivateUseCase: YieldSupplyDeactivateUseCase,
private val yieldSupplyRepository: YieldSupplyRepository,
private val appsFlyerStore: AppsFlyerStore,
) : Model(), YieldSupplyNotificationsComponent.ModelCallback {
private val params: YieldSupplyStopEarningComponent.Params = paramsContainer.require()
@ -160,7 +162,7 @@ internal class YieldSupplyStopEarningModel @Inject constructor(
yieldSupplyAlertFactory.onFailedTxEmailClick(
userWallet = params.userWallet,
cryptoCurrency = cryptoCurrency,
errorMessage = error.toString(),
errorMessage = errorMessage,
)
}
},
@ -184,6 +186,7 @@ internal class YieldSupplyStopEarningModel @Inject constructor(
YieldSupplyAnalytics.FundsWithdrawn(
token = cryptoCurrency.symbol,
blockchain = cryptoCurrency.network.name,
referralId = appsFlyerStore.get()?.refcode,
),
)
val event = AnalyticsParam.TxSentFrom.Earning(