From ed80b29c78f3674bc9bf891395ba1f98dfac62cc Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Apr 2026 14:47:25 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../SwapNotificationsComponent.kt | 2 ++ .../model/SwapNotificationsModel.kt | 32 +++++++++++++++++ .../analytics/SendWithSwapAnalyticEvents.kt | 35 +++++++++++++++++++ .../confirm/model/SendWithSwapConfirmModel.kt | 1 + .../tangem/feature/swap/model/SwapModel.kt | 8 ++--- 5 files changed, 74 insertions(+), 4 deletions(-) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/SwapNotificationsComponent.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/SwapNotificationsComponent.kt index ecd9813de0..580b1c629a 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/SwapNotificationsComponent.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/SwapNotificationsComponent.kt @@ -6,6 +6,7 @@ import com.tangem.common.ui.notifications.NotificationUM import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.domain.express.models.ExpressError +import com.tangem.domain.express.models.ExpressProvider import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.wallet.UserWalletId @@ -51,6 +52,7 @@ internal class SwapNotificationsComponent( val enteredFromAmount: BigDecimal? = null, val fromCryptoCurrencyStatus: CryptoCurrencyStatus? = null, val priceImpact: PriceImpact? = null, + val provider: ExpressProvider? = null, ) } } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/model/SwapNotificationsModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/model/SwapNotificationsModel.kt index 7a265478bb..0857fa9cca 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/model/SwapNotificationsModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/notifications/model/SwapNotificationsModel.kt @@ -2,6 +2,7 @@ package com.tangem.features.swap.v2.impl.notifications.model import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.common.ui.notifications.NotificationUM +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -17,6 +18,7 @@ import com.tangem.features.swap.v2.impl.notifications.SwapNotificationsComponent import com.tangem.features.swap.v2.impl.notifications.SwapNotificationsComponent.Params.SwapNotificationData import com.tangem.features.swap.v2.impl.notifications.SwapNotificationsUpdateListener import com.tangem.features.swap.v2.impl.notifications.entity.SwapNotificationUM +import com.tangem.features.swap.v2.impl.sendviaswap.analytics.SendWithSwapAnalyticEvents import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -29,6 +31,7 @@ import kotlinx.coroutines.launch import java.math.BigDecimal import javax.inject.Inject +@Suppress("LongParameterList") @ModelScoped internal class SwapNotificationsModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, @@ -36,6 +39,7 @@ internal class SwapNotificationsModel @Inject constructor( private val swapNotificationsUpdateTrigger: DefaultSwapNotificationsUpdateTrigger, private val swapAmountUpdateTrigger: SwapAmountUpdateTrigger, private val validateTransactionUseCase: ValidateTransactionUseCase, + private val analyticsEventHandler: AnalyticsEventHandler, paramsContainer: ParamsContainer, ) : Model() { @@ -80,6 +84,34 @@ internal class SwapNotificationsModel @Inject constructor( .isNotEmpty() swapNotificationsUpdateTrigger.callbackHasError(hasErrorNotification) uiState.value = notifications.toImmutableList() + + val fromCurrency = notificationData.fromCryptoCurrency + val toCurrency = notificationData.toCryptoCurrencyStatus?.currency + val provider = notificationData.provider + if (fromCurrency != null && toCurrency != null && provider != null) { + if (notifications.any { it is SwapNotificationUM.Warning.HighPriceImpact }) { + analyticsEventHandler.send( + SendWithSwapAnalyticEvents.HighPriceImpact( + sendToken = fromCurrency.symbol, + receiveToken = toCurrency.symbol, + sendBlockchain = fromCurrency.network.name, + receiveBlockchain = toCurrency.network.name, + providerName = provider.name, + ), + ) + } + if (notifications.any { it is SwapNotificationUM.Warning.TradeTooHigh }) { + analyticsEventHandler.send( + SendWithSwapAnalyticEvents.TradeTooLarge( + sendToken = fromCurrency.symbol, + receiveToken = toCurrency.symbol, + sendBlockchain = fromCurrency.network.name, + receiveBlockchain = toCurrency.network.name, + providerName = provider.name, + ), + ) + } + } } private suspend fun MutableList.addDestinationTagRequiredNotification() { diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt index fb20d25a67..f753ef6f26 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/analytics/SendWithSwapAnalyticEvents.kt @@ -133,6 +133,41 @@ internal sealed class SendWithSwapAnalyticEvents( ), ) + class HighPriceImpact( + val sendToken: String, + val receiveToken: String, + val sendBlockchain: String, + val receiveBlockchain: String, + val providerName: String, + ) : SendWithSwapAnalyticEvents( + event = "Notice - High price impact", + params = mapOf( + SEND_TOKEN to sendToken, + RECEIVE_TOKEN to receiveToken, + "Send Blockchain" to sendBlockchain, + "Receive Blockchain" to receiveBlockchain, + PROVIDER to providerName, + ), + ) + + class TradeTooLarge( + val sendToken: String, + val receiveToken: String, + val sendBlockchain: String, + val receiveBlockchain: String, + val providerName: String, + + ) : SendWithSwapAnalyticEvents( + event = "Notice - Trade too large", + params = mapOf( + SEND_TOKEN to sendToken, + RECEIVE_TOKEN to receiveToken, + "Send Blockchain" to sendBlockchain, + "Receive Blockchain" to receiveBlockchain, + PROVIDER to providerName, + ), + ) + enum class ErrorScreen { Amount, Confirm, diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt index 2359164b49..a82e827dc2 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt @@ -460,6 +460,7 @@ internal class SendWithSwapConfirmModel @Inject constructor( enteredFromAmount = confirmData.enteredFromAmount, fromCryptoCurrencyStatus = confirmData.fromCryptoCurrencyStatus, priceImpact = confirmData.priceImpact, + provider = confirmData.quote?.provider, ), ) uiState.transformerUpdate( diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt index dcdc0a63a5..94bcb7958f 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt @@ -798,8 +798,8 @@ internal class SwapModel @Inject constructor( analyticsEventHandler.send( SwapEvents.HighPriceImpact( sendToken = fromToken.currency.symbol, - receiveToken = toToken.currency.network.name, - sendBlockchain = fromToken.currency.symbol, + receiveToken = toToken.currency.symbol, + sendBlockchain = fromToken.currency.network.name, receiveBlockchain = toToken.currency.network.name, providerName = provider.name, ), @@ -809,8 +809,8 @@ internal class SwapModel @Inject constructor( analyticsEventHandler.send( SwapEvents.TradeTooLarge( sendToken = fromToken.currency.symbol, - receiveToken = toToken.currency.network.name, - sendBlockchain = fromToken.currency.symbol, + receiveToken = toToken.currency.symbol, + sendBlockchain = fromToken.currency.network.name, receiveBlockchain = toToken.currency.network.name, providerName = provider.name, ),