From de6683b57ac873fac53677a2b7e34286718827d4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 3 Apr 2025 15:51:03 +0700 Subject: [PATCH] Updated on 2026-08-14 --- .../DefaultWalletConnectStore.kt | 2 +- .../network/ethereum/WcEthNetwork.kt | 1 - .../pair/DefaultWcPairUseCase.kt | 14 ++++---- .../request/DefaultWcRequestService.kt | 6 ++-- .../sessions/DefaultWcSessionsManager.kt | 6 ++-- .../utils/JSONRPCRequestConverter.kt | 15 ++++++++ .../data/walletconnect/utils/ToOurModel.kt | 36 ------------------- .../utils/WcAppMetaDataConverter.kt | 33 +++++++++++++++++ .../utils/WcSdkSessionConverter.kt | 15 ++++++++ .../utils/WcSdkSessionRequestConverter.kt | 16 +++++++++ .../usecase/pair/WcPairUseCase.kt | 5 ++- 11 files changed, 94 insertions(+), 55 deletions(-) create mode 100644 data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/JSONRPCRequestConverter.kt delete mode 100644 data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/ToOurModel.kt create mode 100644 data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcAppMetaDataConverter.kt create mode 100644 data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionConverter.kt create mode 100644 data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionRequestConverter.kt diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/walletconnect/DefaultWalletConnectStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/walletconnect/DefaultWalletConnectStore.kt index 57e97f18d7..79da8620de 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/walletconnect/DefaultWalletConnectStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/walletconnect/DefaultWalletConnectStore.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.flow.Flow internal typealias WcSessionCollection = Set -class DefaultWalletConnectStore( +internal class DefaultWalletConnectStore( private val persistenceStore: DataStore, ) : WalletConnectStore { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthNetwork.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthNetwork.kt index 0ce30801eb..69407681e0 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthNetwork.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthNetwork.kt @@ -17,7 +17,6 @@ import com.tangem.domain.walletconnect.usecase.ethereum.WcEthMethod.SignMessage import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.receiveAsFlow -@Suppress("UnusedPrivateClass") // todo(wc) remove later internal class WcEthNetwork( private val moshi: Moshi, private val respondService: WcRespondService, diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt index 590b9acbf6..65f7b110ee 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt @@ -6,7 +6,7 @@ import arrow.core.right import com.reown.walletkit.client.Wallet import com.reown.walletkit.client.WalletKit import com.tangem.data.walletconnect.utils.WcSdkObserver -import com.tangem.data.walletconnect.utils.toOurModel +import com.tangem.data.walletconnect.utils.WcSdkSessionConverter import com.tangem.domain.walletconnect.model.WcPairError import com.tangem.domain.walletconnect.model.WcSession import com.tangem.domain.walletconnect.model.WcSessionApprove @@ -15,7 +15,6 @@ import com.tangem.domain.walletconnect.model.sdkcopy.WcAppMetaData import com.tangem.domain.walletconnect.repository.WcSessionsManager import com.tangem.domain.walletconnect.usecase.pair.WcPairState import com.tangem.domain.walletconnect.usecase.pair.WcPairUseCase -import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow @@ -28,7 +27,6 @@ import kotlin.coroutines.resume val unsupportedDApps = listOf("dYdX", "dYdX v4", "Apex Pro", "The Sandbox") -@Suppress("UnusedPrivateMember") // todo(wc) remove after add mapping internal class DefaultWcPairUseCase( private val sessionsManager: WcSessionsManager, private val associateNetworksDelegate: AssociateNetworksDelegate, @@ -40,8 +38,8 @@ internal class DefaultWcPairUseCase( Channel>(Channel.BUFFERED) private val onSessionSettleResponse = Channel(Channel.BUFFERED) - override fun pairFlow(uri: String, source: WcPairUseCase.Source, selectedWallet: UserWallet): Flow = - flow { + override fun pairFlow(uri: String, source: WcPairUseCase.Source): Flow { + return flow { emit(WcPairState.Loading) // call sdk.pair and wait result, finish flow on error @@ -63,7 +61,7 @@ internal class DefaultWcPairUseCase( return@flow } - val proposalState = buildProposalState(sdkSessionProposal, verifyContext) + val proposalState = buildProposalState(sdkSessionProposal) .fold(ifLeft = { WcPairState.Error(it) }, ifRight = { it }) emit(proposalState) @@ -104,6 +102,7 @@ internal class DefaultWcPairUseCase( ) emit(WcPairState.Approving.Result(sessionForApprove, either)) } + } override fun approve(sessionForApprove: WcSessionApprove) { onCallTerminalAction.trySend(TerminalAction.Approve(sessionForApprove)) @@ -188,7 +187,6 @@ internal class DefaultWcPairUseCase( private suspend fun buildProposalState( sessionProposal: Wallet.Model.SessionProposal, - verifyContext: Wallet.Model.VerifyContext, ): Either = runCatching { val proposalNetwork = associateNetworksDelegate.associate(sessionProposal) val appMetaData = WcAppMetaData( @@ -213,7 +211,7 @@ internal class DefaultWcPairUseCase( private fun Wallet.Model.Session.toDomain(walletId: UserWalletId): WcSession = WcSession( userWalletId = walletId, - sdkModel = this.toOurModel(), + sdkModel = WcSdkSessionConverter.convert(this), ) private sealed interface TerminalAction { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt index f69f2f4563..99f06b1f7a 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestService.kt @@ -2,7 +2,7 @@ package com.tangem.data.walletconnect.request import com.reown.walletkit.client.Wallet import com.tangem.data.walletconnect.utils.WcSdkObserver -import com.tangem.data.walletconnect.utils.toOurModel +import com.tangem.data.walletconnect.utils.WcSdkSessionRequestConverter import com.tangem.domain.walletconnect.model.WcMethod import com.tangem.domain.walletconnect.model.WcRequest import com.tangem.domain.walletconnect.repository.WcSessionsManager @@ -16,7 +16,7 @@ internal class DefaultWcRequestService( private val sessionsManager: WcSessionsManager, private val respondService: WcRespondService, private val requestAdapters: Set>, - private val scope: CoroutineScope, // todo(wc) is ok inject scope? featureScope like Decompose Model scope + private val scope: CoroutineScope, ) : WcRequestService, WcSdkObserver { override val requests: MutableSharedFlow> = MutableSharedFlow() @@ -26,7 +26,7 @@ internal class DefaultWcRequestService( verifyContext: Wallet.Model.VerifyContext, ) { // Triggered when a Dapp sends SessionRequest to sign a transaction or a message - val sr = sessionRequest.toOurModel() + val sr = WcSdkSessionRequestConverter.convert(sessionRequest) val method = sr.request.method val params = sr.request.params scope.launch { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt index 32df16baba..2807f9d74c 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt @@ -3,7 +3,7 @@ package com.tangem.data.walletconnect.sessions import com.reown.walletkit.client.Wallet import com.reown.walletkit.client.WalletKit import com.tangem.data.walletconnect.utils.WcSdkObserver -import com.tangem.data.walletconnect.utils.toOurModel +import com.tangem.data.walletconnect.utils.WcSdkSessionConverter import com.tangem.datasource.local.walletconnect.WalletConnectStore import com.tangem.domain.walletconnect.model.WcSession import com.tangem.domain.walletconnect.model.WcSessionDTO @@ -44,7 +44,7 @@ internal class DefaultWcSessionsManager constructor( override suspend fun findSessionByTopic(topic: String): WcSession? = withContext(dispatchers.io) { val storedSessions = store.findSessionByTopic(topic) ?: return@withContext null val sdkSession = WalletKit.getActiveSessionByTopic(topic) ?: return@withContext null - WcSession(userWalletId = storedSessions.walletId, sdkModel = sdkSession.toOurModel()) + WcSession(userWalletId = storedSessions.walletId, sdkModel = WcSdkSessionConverter.convert(sdkSession)) } override fun onSessionDelete(sessionDelete: Wallet.Model.SessionDelete) { @@ -74,7 +74,7 @@ internal class DefaultWcSessionsManager constructor( val wcSessions = sdkSessions.mapNotNull { sdkSession -> val storedSessions = storeSessions.find { it.topic == sdkSession.topic } ?: return@mapNotNull null - WcSession(userWalletId = storedSessions.walletId, sdkModel = sdkSession.toOurModel()) + WcSession(userWalletId = storedSessions.walletId, sdkModel = WcSdkSessionConverter.convert(sdkSession)) } val unknownStoredSessions = storeSessions diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/JSONRPCRequestConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/JSONRPCRequestConverter.kt new file mode 100644 index 0000000000..f882b3c3a5 --- /dev/null +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/JSONRPCRequestConverter.kt @@ -0,0 +1,15 @@ +package com.tangem.data.walletconnect.utils + +import com.reown.walletkit.client.Wallet +import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest.JSONRPCRequest +import com.tangem.utils.converter.Converter + +internal object JSONRPCRequestConverter : Converter { + override fun convert(value: Wallet.Model.SessionRequest.JSONRPCRequest): JSONRPCRequest { + return JSONRPCRequest( + id = value.id, + method = value.method, + params = value.params, + ) + } +} \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/ToOurModel.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/ToOurModel.kt deleted file mode 100644 index de7c1ff78d..0000000000 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/ToOurModel.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.tangem.data.walletconnect.utils - -import com.reown.android.Core -import com.reown.walletkit.client.Wallet -import com.tangem.domain.walletconnect.model.sdkcopy.WcAppMetaData -import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSession -import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest.JSONRPCRequest - -internal fun Wallet.Model.Session.toOurModel(): WcSdkSession = WcSdkSession( - topic = topic, - appMetaData = metaData.toOurModel(), -) - -internal fun Wallet.Model.SessionRequest.toOurModel(): WcSdkSessionRequest = WcSdkSessionRequest( - topic = this.topic, - chainId = this.chainId, - request = this.request.toOurModel(), -) - -internal fun Wallet.Model.SessionRequest.JSONRPCRequest.toOurModel(): JSONRPCRequest = JSONRPCRequest( - id = this.id, - method = this.method, - params = this.params, -) - -internal fun Core.Model.AppMetaData?.toOurModel(): WcAppMetaData = WcAppMetaData( - name = this?.name.orEmpty(), - description = this?.description.orEmpty(), - url = this?.url.orEmpty(), - icons = this?.icons.orEmpty(), - redirect = this?.redirect, - appLink = this?.appLink, - linkMode = this?.linkMode ?: false, - verifyUrl = this?.verifyUrl, -) \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcAppMetaDataConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcAppMetaDataConverter.kt new file mode 100644 index 0000000000..df4fdcaade --- /dev/null +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcAppMetaDataConverter.kt @@ -0,0 +1,33 @@ +package com.tangem.data.walletconnect.utils + +import com.reown.android.Core +import com.tangem.domain.walletconnect.model.sdkcopy.WcAppMetaData +import com.tangem.utils.converter.Converter + +internal object WcAppMetaDataConverter : Converter { + + val empty + get() = WcAppMetaData( + name = "", + description = "", + url = "", + icons = listOf(), + redirect = null, + appLink = null, + linkMode = false, + verifyUrl = null, + ) + + override fun convert(value: Core.Model.AppMetaData): WcAppMetaData { + return WcAppMetaData( + name = value.name, + description = value.description, + url = value.url, + icons = value.icons, + redirect = value.redirect, + appLink = value.appLink, + linkMode = value.linkMode, + verifyUrl = value.verifyUrl, + ) + } +} \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionConverter.kt new file mode 100644 index 0000000000..0f2e570acd --- /dev/null +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionConverter.kt @@ -0,0 +1,15 @@ +package com.tangem.data.walletconnect.utils + +import com.reown.walletkit.client.Wallet +import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSession +import com.tangem.utils.converter.Converter + +internal object WcSdkSessionConverter : Converter { + + override fun convert(value: Wallet.Model.Session): WcSdkSession { + return WcSdkSession( + topic = value.topic, + appMetaData = value.metaData?.let { WcAppMetaDataConverter.convert(it) } ?: WcAppMetaDataConverter.empty, + ) + } +} \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionRequestConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionRequestConverter.kt new file mode 100644 index 0000000000..603699848e --- /dev/null +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcSdkSessionRequestConverter.kt @@ -0,0 +1,16 @@ +package com.tangem.data.walletconnect.utils + +import com.reown.walletkit.client.Wallet +import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import com.tangem.utils.converter.Converter + +internal object WcSdkSessionRequestConverter : Converter { + + override fun convert(value: Wallet.Model.SessionRequest): WcSdkSessionRequest { + return WcSdkSessionRequest( + topic = value.topic, + chainId = value.chainId, + request = JSONRPCRequestConverter.convert(value.request), + ) + } +} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/pair/WcPairUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/pair/WcPairUseCase.kt index 2600c0d889..2de6663dbd 100644 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/pair/WcPairUseCase.kt +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/pair/WcPairUseCase.kt @@ -1,15 +1,14 @@ package com.tangem.domain.walletconnect.usecase.pair import com.tangem.domain.walletconnect.model.WcSessionApprove -import com.tangem.domain.wallets.models.UserWallet import kotlinx.coroutines.flow.Flow interface WcPairUseCase { - fun pairFlow(uri: String, source: Source, selectedWallet: UserWallet): Flow + fun pairFlow(uri: String, source: Source): Flow fun approve(sessionForApprove: WcSessionApprove) fun reject() - enum class Source { QR, DEEPLINK, ETC } + enum class Source { QR, DEEPLINK, CLIPBOARD, ETC } } \ No newline at end of file