Updated on 2026-08-14

This commit is contained in:
Tangem 2025-07-23 16:53:37 +07:00
parent 15e7df8d41
commit 4882daf1a2
14 changed files with 79 additions and 33 deletions

View file

@ -39,13 +39,11 @@ internal class WcEthNetwork(
}
@Suppress("CyclomaticComplexMethod")
override suspend fun toUseCase(
request: WcSdkSessionRequest,
): Either<WcRequestError.HandleMethodError, WcMethodUseCase> {
fun error(message: String) = WcRequestError.HandleMethodError(message).left()
override suspend fun toUseCase(request: WcSdkSessionRequest): Either<HandleMethodError, WcMethodUseCase> {
fun error(message: String) = HandleMethodError.UnknownError(message).left()
val name = toWcMethodName(request) ?: return error("Unknown method name")
val session = sessionsManager.findSessionByTopic(request.topic)
?: return error("Failed to find session for topic ${request.topic}")
?: return HandleMethodError.UnknownSession.left()
val wallet = session.wallet
val chainId = request.chainId.orEmpty()
val method: WcEthMethod = name.toMethod(request, wallet)

View file

@ -18,7 +18,7 @@ import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext
import com.tangem.data.walletconnect.utils.WcNamespaceConverter
import com.tangem.data.walletconnect.utils.WcNetworksConverter
import com.tangem.domain.models.network.Network
import com.tangem.domain.walletconnect.model.WcRequestError
import com.tangem.domain.walletconnect.model.HandleMethodError
import com.tangem.domain.walletconnect.model.WcSolanaMethod
import com.tangem.domain.walletconnect.model.WcSolanaMethodName
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
@ -42,16 +42,14 @@ internal class WcSolanaNetwork(
}
@Suppress("CyclomaticComplexMethod")
override suspend fun toUseCase(
request: WcSdkSessionRequest,
): Either<WcRequestError.HandleMethodError, WcMethodUseCase> {
fun error(message: String) = WcRequestError.HandleMethodError(message).left()
override suspend fun toUseCase(request: WcSdkSessionRequest): Either<HandleMethodError, WcMethodUseCase> {
fun error(message: String) = HandleMethodError.UnknownError(message).left()
val name = toWcMethodName(request) ?: return error("Unknown method name")
val method: WcSolanaMethod = name.toMethod(request)
.getOrElse { return error(it.message.orEmpty()) }
?: return error("Failed to parse $name")
val session = sessionsManager.findSessionByTopic(request.topic)
?: return error("Failed to find session for topic ${request.topic}")
?: return HandleMethodError.UnknownSession.left()
val wallet = session.wallet
val chainId = request.chainId.orEmpty()
suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest(chainId, wallet)

View file

@ -5,8 +5,8 @@ import arrow.core.left
import arrow.core.right
import com.tangem.data.walletconnect.utils.WC_TAG
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
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
import timber.log.Timber
@ -19,18 +19,18 @@ internal class DefaultWcRequestUseCaseFactory @Inject constructor(
@Suppress("UNCHECKED_CAST")
override suspend fun <T : WcMethodUseCase> createUseCase(
request: WcSdkSessionRequest,
): Either<WcMethod.Unsupported, T> {
): Either<HandleMethodError, T> {
val useCase = requestConverters
.find { it.toWcMethodName(request) != null }
?.toUseCase(request)
?: WcRequestError.HandleMethodError("Failed to create WcUseCase").left()
?: HandleMethodError.UnknownError("Failed to create WcUseCase").left()
return useCase.fold(
ifLeft = {
Timber.tag(WC_TAG).e("$it")
WcMethod.Unsupported(request).left()
it.left()
},
ifRight = { (it as? T)?.right() ?: WcMethod.Unsupported(request).left() },
ifRight = { (it as? T)?.right() ?: HandleMethodError.Unsupported(WcMethod.Unsupported(request)).left() },
)
}
}

View file

@ -5,14 +5,14 @@ import arrow.core.left
import arrow.core.right
import com.squareup.moshi.Moshi
import com.squareup.moshi.adapter
import com.tangem.domain.walletconnect.model.HandleMethodError
import com.tangem.domain.walletconnect.model.WcMethodName
import com.tangem.domain.walletconnect.model.WcRequestError
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
interface WcRequestToUseCaseConverter {
fun toWcMethodName(request: WcSdkSessionRequest): WcMethodName?
suspend fun toUseCase(request: WcSdkSessionRequest): Either<WcRequestError.HandleMethodError, WcMethodUseCase>
suspend fun toUseCase(request: WcSdkSessionRequest): Either<HandleMethodError, WcMethodUseCase>
companion object {
@OptIn(ExperimentalStdlibApi::class)

View file

@ -151,7 +151,22 @@ internal class DefaultWcSessionsManager(
Timber.tag(WC_TAG).i("removeUnknownSessions $unknownStoredSessions")
store.removeSessions(unknownStoredSessions.toSet())
}
return haveSomeUnknown
val emptyNetworkSessions = wcSessions.filter { it.networks.isEmpty() }
val emptyNetworksDto = storeSessions
.filter { dto -> emptyNetworkSessions.find { it.sdkModel.topic == dto.topic } != null }
.toSet()
val haveEmptySessions = emptyNetworkSessions.isNotEmpty()
val haveEmptyDto = emptyNetworksDto.isNotEmpty()
if (haveEmptyDto) {
Timber.tag(WC_TAG).i("remove sessions without networks $emptyNetworksDto")
store.removeSessions(emptyNetworksDto)
}
if (haveEmptySessions) {
emptyNetworkSessions.map { scope.launch { sdkDisconnectSession(it.sdkModel.topic) } }
}
return haveSomeUnknown || haveEmptyDto
}
private fun extendSessions() {