From bede92a2dcb141e1d6752a0e79921a2667d36d78 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 10 Sep 2025 14:43:44 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../sign/WcSignUseCaseDelegate.kt | 29 +++++++------------ .../domain/walletconnect/WcAnalyticEvents.kt | 4 +-- .../transaction/model/WcAddNetworkModel.kt | 3 +- .../model/WcSendTransactionModel.kt | 24 ++++++++++++++- .../model/WcSignTransactionModel.kt | 9 +++++- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/WcSignUseCaseDelegate.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/WcSignUseCaseDelegate.kt index e42a93cba3..b2ea1d5c4a 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/WcSignUseCaseDelegate.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/WcSignUseCaseDelegate.kt @@ -64,25 +64,16 @@ internal class WcSignUseCaseDelegate( } .onEach { state -> val step = state.domainStep as? WcSignStep.Result ?: return@onEach - val event = step.result.fold( - ifLeft = { error -> - val errorMessage = error.message() ?: "" - WcAnalyticEvents.SignatureRequestFailed( - rawRequest = context.rawSdkRequest, - network = context.network, - errorCode = error.code() ?: error::class.simpleName.orEmpty(), - errorMessage = errorMessage, - ) - }, - ifRight = { - WcAnalyticEvents.SignatureRequestHandled( - rawRequest = context.rawSdkRequest, - network = context.network, - securityStatus = context.session.securityStatus, - ) - }, - ) - analytics.send(event) + step.result.leftOrNull()?.let { error -> + val errorMessage = error.message() ?: "" + val event = WcAnalyticEvents.SignatureRequestFailed( + rawRequest = context.rawSdkRequest, + network = context.network, + errorCode = error.code() ?: error::class.simpleName.orEmpty(), + errorMessage = errorMessage, + ) + analytics.send(event) + } } var signJob: Job? = null diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcAnalyticEvents.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcAnalyticEvents.kt index 0801b74dc6..b7228f2980 100644 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcAnalyticEvents.kt +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcAnalyticEvents.kt @@ -112,7 +112,7 @@ sealed class WcAnalyticEvents( rawRequest: WcSdkSessionRequest, network: Network, emulationStatus: EmulationStatus?, - securityStatus: CheckDAppResult?, + securityStatus: CheckDAppResult, ) : WcAnalyticEvents( event = "Signature Request Received", params = mapOf( @@ -121,7 +121,7 @@ sealed class WcAnalyticEvents( AnalyticsParam.Key.METHOD_NAME to rawRequest.request.method, AnalyticsParam.Key.BLOCKCHAIN to network.name, AnalyticsParam.Key.EMULATION_STATUS to emulationStatus?.status, - AnalyticsParam.Key.TYPE to securityStatus?.toAnalyticVerificationStatus(), + AnalyticsParam.Key.TYPE to securityStatus.toAnalyticVerificationStatus(), ).mapNotNullValues { it.value }, ) { enum class EmulationStatus(val status: String) { diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt index e15ce42f95..af17a13db3 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt @@ -3,6 +3,7 @@ package com.tangem.features.walletconnect.transaction.model import androidx.compose.runtime.Stable import com.arkivanov.decompose.router.stack.StackNavigation import com.arkivanov.decompose.router.stack.pushNew +import com.domain.blockaid.models.dapp.CheckDAppResult import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model @@ -132,7 +133,7 @@ internal class WcAddNetworkModel @Inject constructor( rawRequest = useCase.rawSdkRequest, network = useCase.network, emulationStatus = null, - securityStatus = null, + securityStatus = CheckDAppResult.FAILED_TO_VERIFY, ), ) diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt index ebda2cb59a..8b5afff900 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt @@ -5,6 +5,7 @@ import arrow.core.Either import com.arkivanov.decompose.router.stack.StackNavigation import com.arkivanov.decompose.router.stack.pop import com.arkivanov.decompose.router.stack.pushNew +import com.domain.blockaid.models.dapp.CheckDAppResult import com.domain.blockaid.models.transaction.SimulationResult import com.domain.blockaid.models.transaction.ValidationResult import com.tangem.blockchain.common.TransactionData @@ -94,6 +95,8 @@ internal class WcSendTransactionModel @Inject constructor( private var sign: () -> Unit = {} private val feeReloadState = MutableStateFlow(false) private val signatureReceivedAnalyticsSendState = MutableStateFlow(false) + private val securityStatusState = + MutableStateFlow>(Lce.Loading(partialContent = null)) init { @Suppress("UnusedPrivateMember") @@ -130,6 +133,7 @@ internal class WcSendTransactionModel @Inject constructor( .collectLatest { (signState, securityCheck) -> if (signingIsDone(signState, useCase)) return@collectLatest + securityStatusState.value = securityCheck sendSignatureReceivedAnalytics(useCase, securityCheck) this@WcSendTransactionModel.signState = signState @@ -372,6 +376,12 @@ internal class WcSendTransactionModel @Inject constructor( false } is Either.Right -> { + val event = WcAnalyticEvents.SignatureRequestHandled( + rawRequest = useCase.rawSdkRequest, + network = useCase.network, + securityStatus = securityStatusState.value.toCheckDAppResult(), + ) + analytics.send(event) showSuccessSignMessage() router.pop() true @@ -408,10 +418,22 @@ internal class WcSendTransactionModel @Inject constructor( rawRequest = useCase.rawSdkRequest, network = useCase.network, emulationStatus = emulationStatus, - securityStatus = useCase.session.securityStatus, + securityStatus = securityCheck.toCheckDAppResult(), ), ) signatureReceivedAnalyticsSendState.value = true } + + private fun Lce.toCheckDAppResult(): CheckDAppResult { + return when (this) { + is Lce.Content -> when (this.content.result.validation) { + ValidationResult.SAFE -> CheckDAppResult.SAFE + ValidationResult.UNSAFE, ValidationResult.WARNING -> CheckDAppResult.UNSAFE + ValidationResult.FAILED_TO_VALIDATE -> CheckDAppResult.FAILED_TO_VERIFY + } + is Lce.Error -> CheckDAppResult.FAILED_TO_VERIFY + is Lce.Loading -> CheckDAppResult.FAILED_TO_VERIFY + } + } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt index 28b294640d..3d41876dbb 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Stable import com.arkivanov.decompose.router.stack.StackNavigation import com.arkivanov.decompose.router.stack.pop import com.arkivanov.decompose.router.stack.pushNew +import com.domain.blockaid.models.dapp.CheckDAppResult import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model @@ -133,6 +134,12 @@ internal class WcSignTransactionModel @Inject constructor( private fun signingIsDone(signState: WcSignState<*>): Boolean { (signState.domainStep as? WcSignStep.Result)?.result?.let { result -> if (result.isRight()) { + val event = WcAnalyticEvents.SignatureRequestHandled( + rawRequest = useCase.rawSdkRequest, + network = useCase.network, + securityStatus = CheckDAppResult.FAILED_TO_VERIFY, + ) + analytics.send(event) showSuccessSignMessage() } router.pop() @@ -158,7 +165,7 @@ internal class WcSignTransactionModel @Inject constructor( rawRequest = useCase.rawSdkRequest, network = useCase.network, emulationStatus = null, - securityStatus = null, + securityStatus = CheckDAppResult.FAILED_TO_VERIFY, ), )