Updated on 2026-08-14

This commit is contained in:
Tangem 2025-07-30 15:27:24 +07:00
parent 75a96e0d30
commit bccf17effe
8 changed files with 61 additions and 15 deletions

View file

@ -225,8 +225,12 @@ internal object WalletConnectDataModule {
@Provides
@Singleton
fun wcRequestUseCaseFactory(diHelperBox: DiHelperBox): WcRequestUseCaseFactory {
return DefaultWcRequestUseCaseFactory(diHelperBox.handlers)
fun wcRequestUseCaseFactory(
diHelperBox: DiHelperBox,
namespaceConverters: Set<@JvmSuppressWildcards WcNamespaceConverter>,
analytics: AnalyticsEventHandler,
): WcRequestUseCaseFactory {
return DefaultWcRequestUseCaseFactory(diHelperBox.handlers, namespaceConverters, analytics)
}
@Provides

View file

@ -3,10 +3,14 @@ package com.tangem.data.walletconnect.request
import arrow.core.Either
import arrow.core.left
import arrow.core.right
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.data.walletconnect.utils.WC_TAG
import com.tangem.data.walletconnect.utils.WcNamespaceConverter
import com.tangem.domain.walletconnect.WcAnalyticEvents
import com.tangem.domain.walletconnect.WcRequestUseCaseFactory
import com.tangem.domain.walletconnect.model.HandleMethodError
import com.tangem.domain.walletconnect.model.WcMethod
import com.tangem.domain.walletconnect.model.WcRequestError.Companion.code
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
import timber.log.Timber
@ -14,6 +18,8 @@ import javax.inject.Inject
internal class DefaultWcRequestUseCaseFactory @Inject constructor(
private val requestConverters: Set<WcRequestToUseCaseConverter>,
private val namespaceConverters: Set<WcNamespaceConverter>,
private val analytics: AnalyticsEventHandler,
) : WcRequestUseCaseFactory {
@Suppress("UNCHECKED_CAST")
@ -25,12 +31,26 @@ internal class DefaultWcRequestUseCaseFactory @Inject constructor(
?.toUseCase(request)
?: HandleMethodError.UnknownError("Failed to create WcUseCase").left()
return useCase.fold(
val result = useCase.fold(
ifLeft = {
Timber.tag(WC_TAG).e("$it")
it.left()
},
ifRight = { (it as? T)?.right() ?: HandleMethodError.Unsupported(WcMethod.Unsupported(request)).left() },
)
result.onLeft { logError(it, request) }
return result
}
private fun logError(error: HandleMethodError, request: WcSdkSessionRequest) {
val blockchainName = namespaceConverters
.firstNotNullOfOrNull { it.toBlockchain(request.chainId.orEmpty()) }
?.getCoinName().orEmpty()
val event = WcAnalyticEvents.SignatureRequestReceivedFailed(
rawRequest = request,
errorCode = error.code().orEmpty(),
blockchain = blockchainName,
)
analytics.send(event)
}
}

View file

@ -43,7 +43,6 @@ internal class WcSignUseCaseDelegate<MiddleAction, SignModel>(
val state = MutableStateFlow(WcSignState(initModel, WcSignStep.PreSign))
analytics.send(
WcAnalyticEvents.SignatureRequestReceived(
session = context.session,
rawRequest = context.rawSdkRequest,
network = context.network,
),
@ -73,7 +72,6 @@ internal class WcSignUseCaseDelegate<MiddleAction, SignModel>(
val event = step.result.fold(
ifLeft = { error ->
WcAnalyticEvents.SignatureRequestFailed(
session = context.session,
rawRequest = context.rawSdkRequest,
network = context.network,
errorCode = error.code() ?: error::class.simpleName.orEmpty(),
@ -81,7 +79,6 @@ internal class WcSignUseCaseDelegate<MiddleAction, SignModel>(
},
ifRight = {
WcAnalyticEvents.SignatureRequestHandled(
session = context.session,
rawRequest = context.rawSdkRequest,
network = context.network,
)

View file

@ -10,6 +10,8 @@ internal object WcSdkSessionRequestConverter : Converter<Wallet.Model.SessionReq
return WcSdkSessionRequest(
topic = value.topic,
chainId = value.chainId,
dAppMetaData = value.peerMetaData?.let { WcAppMetaDataConverter.convert(it) }
?: WcAppMetaDataConverter.empty,
request = JSONRPCRequestConverter.convert(value.request),
)
}

View file

@ -37,6 +37,13 @@ internal class WcSignUseCaseDelegateTest {
private val rawRequestMock = WcSdkSessionRequest(
topic = "",
chainId = "",
dAppMetaData = WcAppMetaData(
name = "",
description = "",
url = "",
icons = listOf(),
redirect = "",
),
request = WcSdkSessionRequest.JSONRPCRequest(
id = 0L,
method = "",