Updated on 2026-08-14
This commit is contained in:
parent
15e7df8d41
commit
4882daf1a2
14 changed files with 79 additions and 33 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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() },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue