From ba12a65fc839ef2b84017a8fdc23ebd9affe3c6a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 29 Apr 2025 16:40:19 +0700 Subject: [PATCH] Updated on 2026-08-14 --- .../ethereum/EthTransactionParamsConverter.kt | 2 +- ...nUseCase.kt => WcEthMessageSignUseCase.kt} | 28 ++++----- .../network/ethereum/WcEthNetwork.kt | 11 ++-- ...Case.kt => WcEthSendTransactionUseCase.kt} | 17 +++--- ...Case.kt => WcEthSignTransactionUseCase.kt} | 17 +++--- ...efaultWcSolanaSignAllTransactionUseCase.kt | 4 +- .../DefaultWcSolanaSignTransactionUseCase.kt | 4 +- .../solana/WcSolanaMessageSignUseCase.kt | 58 +++++++++++++++++++ .../network/solana/WcSolanaNetwork.kt | 16 +++-- .../pair/AssociateNetworksDelegate.kt | 6 +- .../request/DefaultWcRequestUseCaseFactory.kt | 2 +- .../request/WcRequestToUseCaseConverter.kt | 2 +- .../sessions/DefaultWcSessionsManager.kt | 17 +----- .../walletconnect/sign/BaseWcSignUseCase.kt | 11 ++-- .../walletconnect/sign/SignStateConverter.kt | 4 +- .../sign/WcSignUseCaseDelegate.kt | 4 +- .../WcSignUseCaseDelegateTest.kt | 4 +- .../domain/walletconnect/model/WcEthMethod.kt | 3 +- .../walletconnect/model/WcSolanaMethod.kt | 3 +- .../walletconnect/WcRequestUseCaseFactory.kt | 2 +- .../domain/walletconnect/usecase/WcUseCase.kt | 18 ------ .../usecase/WcUseCasesFlowProvider.kt | 7 --- .../ethereum/WcEthMessageSignUseCase.kt | 16 ----- .../ethereum/WcEthTransactionUseCase.kt | 45 -------------- .../usecase/method/EthereumUseCase.kt | 22 +++++++ .../usecase/method/WcMessageSignUseCase.kt | 24 ++++++++ .../usecase/method/WcMethodBase.kt | 57 ++++++++++++++++++ .../usecase/sign/WcSignUseCase.kt | 30 ---------- .../solana/WcSolanaSignTransactionUseCase.kt | 4 +- 29 files changed, 235 insertions(+), 203 deletions(-) rename data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/{DefaultWcEthMessageSignUseCase.kt => WcEthMessageSignUseCase.kt} (79%) rename data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/{DefaultWcEthSendTransactionUseCase.kt => WcEthSendTransactionUseCase.kt} (81%) rename data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/{DefaultWcEthSignTransactionUseCase.kt => WcEthSignTransactionUseCase.kt} (82%) create mode 100644 data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaMessageSignUseCase.kt delete mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCase.kt delete mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCasesFlowProvider.kt delete mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthMessageSignUseCase.kt delete mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthTransactionUseCase.kt create mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/EthereumUseCase.kt create mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMessageSignUseCase.kt create mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMethodBase.kt delete mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/sign/WcSignUseCase.kt diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/EthTransactionParamsConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/EthTransactionParamsConverter.kt index ac63abc8f8..793e33c829 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/EthTransactionParamsConverter.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/EthTransactionParamsConverter.kt @@ -2,7 +2,7 @@ package com.tangem.data.walletconnect.network.ethereum import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext import com.tangem.domain.walletconnect.model.WcEthTransactionParams -import com.tangem.domain.walletconnect.usecase.ethereum.WcEthTransaction +import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction import com.tangem.utils.converter.Converter internal class EthTransactionParamsConverter( diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthMessageSignUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthMessageSignUseCase.kt similarity index 79% rename from data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthMessageSignUseCase.kt rename to data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthMessageSignUseCase.kt index 6f6a6565a8..d9a24d2d24 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthMessageSignUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthMessageSignUseCase.kt @@ -16,8 +16,8 @@ import com.tangem.data.walletconnect.sign.SignStateConverter.toResult import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext import com.tangem.domain.transaction.usecase.SignUseCase import com.tangem.domain.walletconnect.model.WcEthMethod -import com.tangem.domain.walletconnect.usecase.ethereum.WcEthMessageSignUseCase -import com.tangem.domain.walletconnect.usecase.sign.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState import com.tangem.domain.walletmanager.WalletManagersFacade import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -26,15 +26,15 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow -internal class DefaultWcEthMessageSignUseCase @AssistedInject constructor( +internal class WcEthMessageSignUseCase @AssistedInject constructor( override val respondService: WcRespondService, @Assisted override val context: WcMethodUseCaseContext, - @Assisted private val method: WcEthMethod.MessageSign, + @Assisted override val method: WcEthMethod.MessageSign, private val walletManagersFacade: WalletManagersFacade, private val signUseCase: SignUseCase, blockAidDelegate: BlockAidVerificationDelegate, -) : BaseWcSignUseCase(), - WcEthMessageSignUseCase { +) : BaseWcSignUseCase(), + WcMessageSignUseCase { override val securityStatus = blockAidDelegate.getSecurityStatus( network = network, @@ -44,10 +44,10 @@ internal class DefaultWcEthMessageSignUseCase @AssistedInject constructor( accountAddress = context.accountAddress, ) - override suspend fun SignCollector.onSign( - state: WcSignState, + override suspend fun SignCollector.onSign( + state: WcSignState, ) { - val hashToSign = LegacySdkHelper.createMessageData(state.signModel.rawMsg) + val hashToSign = LegacySdkHelper.createMessageData(method.rawMessage) val userWallet = session.wallet val walletManager = walletManagersFacade.getOrCreateWalletManager(userWallet.walletId, network) ?: return @@ -66,18 +66,14 @@ internal class DefaultWcEthMessageSignUseCase @AssistedInject constructor( emit(state.toResult(wcRespondResult)) } - override fun invoke(): Flow> = flow { - val model = WcEthMessageSignUseCase.SignModel( - rawMsg = method.message, - account = method.account, - humanMsg = LegacySdkHelper.hexToAscii(method.message).orEmpty(), - ) + override fun invoke(): Flow> = flow { + val model = WcMessageSignUseCase.SignModel(humanMsg = method.humanMsg) emitAll(delegate(model)) } @AssistedFactory interface Factory { - fun create(context: WcMethodUseCaseContext, method: WcEthMethod.MessageSign): DefaultWcEthMessageSignUseCase + fun create(context: WcMethodUseCaseContext, method: WcEthMethod.MessageSign): WcEthMessageSignUseCase } } 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 e0bb31b917..6921504472 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 @@ -15,7 +15,7 @@ import com.tangem.domain.walletconnect.model.WcEthMethodName import com.tangem.domain.walletconnect.model.WcEthTransactionParams import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.walletconnect.repository.WcSessionsManager -import com.tangem.domain.walletconnect.usecase.WcMethodUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase import com.tangem.domain.wallets.models.UserWallet import jakarta.inject.Inject @@ -67,7 +67,8 @@ internal class WcEthNetwork( val messageIndex = if (this == WcEthMethodName.EthSign) 1 else 0 val account = list.getOrNull(accountIndex) ?: return@let null val message = list.getOrNull(messageIndex) ?: return@let null - WcEthMethod.MessageSign(account = account, message = message) + val humanMsg = LegacySdkHelper.hexToAscii(message).orEmpty() + WcEthMethod.MessageSign(account = account, rawMessage = message, humanMsg = humanMsg) } WcEthMethodName.SignTypeData -> TODO() WcEthMethodName.SignTypeDataV4 -> TODO() @@ -106,8 +107,8 @@ internal class WcEthNetwork( } internal class Factories @Inject constructor( - val messageSign: DefaultWcEthMessageSignUseCase.Factory, - val sendTransaction: DefaultWcEthSendTransactionUseCase.Factory, - val signTransaction: DefaultWcEthSignTransactionUseCase.Factory, + val messageSign: WcEthMessageSignUseCase.Factory, + val sendTransaction: WcEthSendTransactionUseCase.Factory, + val signTransaction: WcEthSignTransactionUseCase.Factory, ) } \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthSendTransactionUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSendTransactionUseCase.kt similarity index 81% rename from data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthSendTransactionUseCase.kt rename to data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSendTransactionUseCase.kt index e4bd53eb97..214c12f74a 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthSendTransactionUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSendTransactionUseCase.kt @@ -11,9 +11,9 @@ import com.tangem.data.walletconnect.sign.SignStateConverter.toResult import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext import com.tangem.domain.transaction.usecase.SendTransactionUseCase import com.tangem.domain.walletconnect.model.WcEthMethod -import com.tangem.domain.walletconnect.usecase.ethereum.WcEthSendTransactionUseCase -import com.tangem.domain.walletconnect.usecase.ethereum.WcEthTransaction -import com.tangem.domain.walletconnect.usecase.sign.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction +import com.tangem.domain.walletconnect.usecase.method.WcEthTransactionUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -21,14 +21,14 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow -internal class DefaultWcEthSendTransactionUseCase @AssistedInject constructor( +internal class WcEthSendTransactionUseCase @AssistedInject constructor( @Assisted override val context: WcMethodUseCaseContext, - @Assisted private val method: WcEthMethod.SendTransaction, + @Assisted override val method: WcEthMethod.SendTransaction, override val respondService: WcRespondService, private val sendTransaction: SendTransactionUseCase, blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase(), - WcEthSendTransactionUseCase { + WcEthTransactionUseCase { override val securityStatus = blockAidDelegate.getSecurityStatus( network = network, @@ -62,9 +62,6 @@ internal class DefaultWcEthSendTransactionUseCase @AssistedInject constructor( @AssistedFactory interface Factory { - fun create( - context: WcMethodUseCaseContext, - method: WcEthMethod.SendTransaction, - ): DefaultWcEthSendTransactionUseCase + fun create(context: WcMethodUseCaseContext, method: WcEthMethod.SendTransaction): WcEthSendTransactionUseCase } } \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthSignTransactionUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSignTransactionUseCase.kt similarity index 82% rename from data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthSignTransactionUseCase.kt rename to data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSignTransactionUseCase.kt index e3b1fab7dc..5033ddac8d 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/DefaultWcEthSignTransactionUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSignTransactionUseCase.kt @@ -12,9 +12,9 @@ import com.tangem.data.walletconnect.sign.SignStateConverter.toResult import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext import com.tangem.domain.transaction.usecase.PrepareForSendUseCase import com.tangem.domain.walletconnect.model.WcEthMethod -import com.tangem.domain.walletconnect.usecase.ethereum.WcEthSignTransactionUseCase -import com.tangem.domain.walletconnect.usecase.ethereum.WcEthTransaction -import com.tangem.domain.walletconnect.usecase.sign.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction +import com.tangem.domain.walletconnect.usecase.method.WcEthTransactionUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -23,14 +23,14 @@ import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow -internal class DefaultWcEthSignTransactionUseCase @AssistedInject constructor( +internal class WcEthSignTransactionUseCase @AssistedInject constructor( override val respondService: WcRespondService, private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, - @Assisted private val method: WcEthMethod.SignTransaction, + @Assisted override val method: WcEthMethod.SignTransaction, blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase(), - WcEthSignTransactionUseCase { + WcEthTransactionUseCase { override val securityStatus = blockAidDelegate.getSecurityStatus( network = network, @@ -71,9 +71,6 @@ internal class DefaultWcEthSignTransactionUseCase @AssistedInject constructor( @AssistedFactory interface Factory { - fun create( - context: WcMethodUseCaseContext, - method: WcEthMethod.SignTransaction, - ): DefaultWcEthSignTransactionUseCase + fun create(context: WcMethodUseCaseContext, method: WcEthMethod.SignTransaction): WcEthSignTransactionUseCase } } \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignAllTransactionUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignAllTransactionUseCase.kt index ed8685df0b..0db6558250 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignAllTransactionUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignAllTransactionUseCase.kt @@ -11,7 +11,7 @@ import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate import com.tangem.domain.transaction.usecase.PrepareForSendUseCase import com.tangem.domain.walletconnect.model.WcSolanaMethod -import com.tangem.domain.walletconnect.usecase.sign.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignState import com.tangem.domain.walletconnect.usecase.solana.WcSolanaSignAllTransactionUseCase import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -25,7 +25,7 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc override val respondService: WcRespondService, private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, - @Assisted private val method: WcSolanaMethod.SignAllTransaction, + @Assisted override val method: WcSolanaMethod.SignAllTransaction, blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase>(), WcSolanaSignAllTransactionUseCase { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignTransactionUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignTransactionUseCase.kt index e923e85969..946dd9d620 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignTransactionUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignTransactionUseCase.kt @@ -11,7 +11,7 @@ import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate import com.tangem.domain.transaction.usecase.PrepareForSendUseCase import com.tangem.domain.walletconnect.model.WcSolanaMethod -import com.tangem.domain.walletconnect.usecase.sign.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignState import com.tangem.domain.walletconnect.usecase.solana.WcSolanaSignTransactionUseCase import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -23,7 +23,7 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor override val respondService: WcRespondService, private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, - @Assisted private val method: WcSolanaMethod.SignTransaction, + @Assisted override val method: WcSolanaMethod.SignTransaction, blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase(), WcSolanaSignTransactionUseCase { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaMessageSignUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaMessageSignUseCase.kt new file mode 100644 index 0000000000..20a23c46e0 --- /dev/null +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaMessageSignUseCase.kt @@ -0,0 +1,58 @@ +package com.tangem.data.walletconnect.network.solana + +import arrow.core.left +import com.domain.blockaid.models.transaction.CheckTransactionResult +import com.tangem.blockchain.extensions.decodeBase58 +import com.tangem.blockchain.extensions.encodeBase58 +import com.tangem.data.walletconnect.respond.WcRespondService +import com.tangem.data.walletconnect.sign.BaseWcSignUseCase +import com.tangem.data.walletconnect.sign.SignCollector +import com.tangem.data.walletconnect.sign.SignStateConverter.toResult +import com.tangem.data.walletconnect.sign.WcMethodUseCaseContext +import com.tangem.domain.core.lce.LceFlow +import com.tangem.domain.transaction.usecase.SignUseCase +import com.tangem.domain.walletconnect.model.WcSolanaMethod +import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow + +internal class WcSolanaMessageSignUseCase @AssistedInject constructor( + @Assisted override val context: WcMethodUseCaseContext, + @Assisted override val method: WcSolanaMethod.SignMessage, + private val signUseCase: SignUseCase, + override val respondService: WcRespondService, +) : BaseWcSignUseCase(), + WcMessageSignUseCase { + + override val securityStatus: LceFlow = + emptyFlow() // BlockAid doesn't support solana_signMessage + + override suspend fun SignCollector.onSign( + state: WcSignState, + ) { + val hashToSign = method.rawMessage.decodeBase58() ?: byteArrayOf() + val userWallet = session.wallet + + val signedHash = signUseCase(hashToSign, userWallet, network) + .onLeft { emit(state.toResult(it.left())) } + .getOrNull() ?: return + + val respond = "{ signature: \"${signedHash.encodeBase58()}\" }" + + val wcRespondResult = respondService.respond(rawSdkRequest, respond) + emit(state.toResult(wcRespondResult)) + } + + override fun invoke(): Flow> { + return delegate.invoke(initModel = WcMessageSignUseCase.SignModel(method.humanMsg)) + } + + @AssistedFactory + interface Factory { + fun create(context: WcMethodUseCaseContext, method: WcSolanaMethod.SignMessage): WcSolanaMessageSignUseCase + } +} \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaNetwork.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaNetwork.kt index 30221cd33b..275c995ecf 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaNetwork.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaNetwork.kt @@ -2,7 +2,9 @@ package com.tangem.data.walletconnect.network.solana import com.squareup.moshi.Moshi import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchain.extensions.decodeBase58 import com.tangem.blockchainsdk.utils.ExcludedBlockchains +import com.tangem.common.extensions.toHexString import com.tangem.data.walletconnect.model.CAIP2 import com.tangem.data.walletconnect.model.NamespaceKey import com.tangem.data.walletconnect.request.WcRequestToUseCaseConverter @@ -14,7 +16,7 @@ import com.tangem.domain.walletconnect.model.WcSolanaMethod import com.tangem.domain.walletconnect.model.WcSolanaMethodName import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.walletconnect.repository.WcSessionsManager -import com.tangem.domain.walletconnect.usecase.WcMethodUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase import com.tangem.domain.wallets.models.UserWallet import com.tangem.lib.crypto.UserWalletManager import jakarta.inject.Inject @@ -46,10 +48,10 @@ internal class WcSolanaNetwork( session = session, rawSdkRequest = request, network = network, - accountAddress = accountAddress, + accountAddress = accountAddress.orEmpty(), ) return when (method) { - is WcSolanaMethod.SignMessage -> TODO() + is WcSolanaMethod.SignMessage -> factories.messageSign.create(context, method) is WcSolanaMethod.SignTransaction -> factories.signTransaction.create(context, method) is WcSolanaMethod.SignAllTransaction -> factories.signAllTransaction.create(context, method) } @@ -95,7 +97,12 @@ internal class WcSolanaNetwork( val rawParams = request.request.params return when (this) { WcSolanaMethodName.SignMessage -> moshi.fromJson(rawParams)?.let { request -> - WcSolanaMethod.SignMessage(pubKey = request.publicKey, message = request.message) + val humanMsg = request.message.decodeBase58()?.toHexString().orEmpty() + WcSolanaMethod.SignMessage( + pubKey = request.publicKey, + rawMessage = request.message, + humanMsg = humanMsg, + ) } WcSolanaMethodName.SignTransaction -> moshi.fromJson(rawParams) ?.let { request -> WcSolanaMethod.SignTransaction(request.transaction) } @@ -106,6 +113,7 @@ internal class WcSolanaNetwork( } internal class Factories @Inject constructor( + val messageSign: WcSolanaMessageSignUseCase.Factory, val signTransaction: DefaultWcSolanaSignTransactionUseCase.Factory, val signAllTransaction: DefaultWcSolanaSignAllTransactionUseCase.Factory, ) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt index 316902dfea..15ffca4caf 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt @@ -58,10 +58,10 @@ internal class AssociateNetworksDelegate constructor( val wcNetwork = namespaceConverters.firstNotNullOfOrNull { it.toNetwork(chainId, wallet) } ?: return@forEach val walletNetwork = walletNetworks.find { network -> wcNetwork.id == network.id } - if (walletNetwork == null) { - available.add(wcNetwork) + if (walletNetwork != null) { + available.add(walletNetwork) } else { - notAdded.add(walletNetwork) + notAdded.add(wcNetwork) } } if (unknownRequired.isNotEmpty()) throw WcPairError.UnsupportedNetworks(unknownRequired) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt index c0bb10ffcc..408bf79414 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/DefaultWcRequestUseCaseFactory.kt @@ -2,7 +2,7 @@ package com.tangem.data.walletconnect.request import com.tangem.domain.walletconnect.WcRequestUseCaseFactory import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import com.tangem.domain.walletconnect.usecase.WcMethodUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase import javax.inject.Inject internal class DefaultWcRequestUseCaseFactory @Inject constructor( diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/WcRequestToUseCaseConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/WcRequestToUseCaseConverter.kt index d4503c8f73..e0a679f05e 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/WcRequestToUseCaseConverter.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/request/WcRequestToUseCaseConverter.kt @@ -4,7 +4,7 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.adapter import com.tangem.domain.walletconnect.model.WcMethodName import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import com.tangem.domain.walletconnect.usecase.WcMethodUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase interface WcRequestToUseCaseConverter { fun toWcMethodName(request: WcSdkSessionRequest): WcMethodName? 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 d23e135111..98e554f3fe 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 @@ -21,10 +21,8 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext -import kotlinx.coroutines.withTimeout import timber.log.Timber import kotlin.coroutines.resume -import kotlin.time.Duration.Companion.seconds internal class DefaultWcSessionsManager( private val store: WalletConnectStore, @@ -67,19 +65,8 @@ internal class DefaultWcSessionsManager( override suspend fun removeSession(session: WcSession): Either { val topic = session.sdkModel.topic val sdkCall = sdkDisconnectSession(topic) - sdkCall.onLeft { return it.left() } - suspend fun waitSdkCallback() = onSessionDelete.receiveAsFlow().first { - val isSomeError = it is Wallet.Model.SessionDelete.Error - val isDeleted = it is Wallet.Model.SessionDelete.Success && it.topic == topic - isSomeError || isDeleted - } - - val waitSdkCallback = runCatching { withTimeout(10.seconds) { waitSdkCallback() } } - val sdkCallback = waitSdkCallback.getOrElse { return it.left() } - return when (sdkCallback) { - is Wallet.Model.SessionDelete.Error -> sdkCallback.error.left() - is Wallet.Model.SessionDelete.Success -> Unit.right() - } + .onRight { onSessionDelete.trySend(Wallet.Model.SessionDelete.Success(topic = topic, reason = "")) } + return sdkCall } override suspend fun findSessionByTopic(topic: String): WcSession? = withContext(dispatchers.io) { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/BaseWcSignUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/BaseWcSignUseCase.kt index a395e1bf2f..ded283fe3e 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/BaseWcSignUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/BaseWcSignUseCase.kt @@ -4,10 +4,9 @@ import com.tangem.data.walletconnect.respond.WcRespondService import com.tangem.domain.tokens.model.Network import com.tangem.domain.walletconnect.model.WcSession import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import com.tangem.domain.walletconnect.usecase.WcMethodUseCase -import com.tangem.domain.walletconnect.usecase.sign.WcSignState -import com.tangem.domain.walletconnect.usecase.sign.WcSignUseCase -import com.tangem.domain.wallets.models.UserWallet +import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase import kotlinx.coroutines.flow.FlowCollector internal abstract class BaseWcSignUseCase : @@ -21,8 +20,8 @@ internal abstract class BaseWcSignUseCase : abstract val context: WcMethodUseCaseContext override val network: Network get() = context.network override val session: WcSession get() = context.session + override val walletAddress: String get() = context.accountAddress override val rawSdkRequest: WcSdkSessionRequest get() = context.rawSdkRequest - val wallet: UserWallet get() = session.wallet protected val delegate by lazy { WcSignUseCaseDelegate( @@ -60,7 +59,7 @@ internal class WcMethodUseCaseContext( val session: WcSession, val rawSdkRequest: WcSdkSessionRequest, val network: Network, - val accountAddress: String?, + val accountAddress: String, ) internal typealias SignCollector = FlowCollector> \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/SignStateConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/SignStateConverter.kt index f77af76789..138f17d2c0 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/SignStateConverter.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sign/SignStateConverter.kt @@ -1,8 +1,8 @@ package com.tangem.data.walletconnect.sign import arrow.core.Either -import com.tangem.domain.walletconnect.usecase.sign.WcSignState -import com.tangem.domain.walletconnect.usecase.sign.WcSignStep +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignStep object SignStateConverter { 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 89d8bc1097..3428b16217 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 @@ -4,8 +4,8 @@ import arrow.core.left import com.tangem.data.walletconnect.sign.SignStateConverter.toPreSign import com.tangem.data.walletconnect.sign.SignStateConverter.toResult import com.tangem.data.walletconnect.sign.SignStateConverter.toSigning -import com.tangem.domain.walletconnect.usecase.sign.WcSignState -import com.tangem.domain.walletconnect.usecase.sign.WcSignStep +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignStep import kotlinx.coroutines.Job import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.awaitClose diff --git a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt index 39aaa7b68c..b993555c51 100644 --- a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt +++ b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/WcSignUseCaseDelegateTest.kt @@ -9,8 +9,8 @@ import com.tangem.data.walletconnect.sign.SignCollector import com.tangem.data.walletconnect.sign.SignStateConverter.toResult import com.tangem.data.walletconnect.sign.SignStateConverter.toSigning import com.tangem.data.walletconnect.sign.WcSignUseCaseDelegate -import com.tangem.domain.walletconnect.usecase.sign.WcSignState -import com.tangem.domain.walletconnect.usecase.sign.WcSignStep +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignStep import junit.framework.TestCase.assertEquals import kotlinx.coroutines.delay import kotlinx.coroutines.flow.FlowCollector diff --git a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthMethod.kt b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthMethod.kt index 15d22104ba..8c13ca04f2 100644 --- a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthMethod.kt +++ b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcEthMethod.kt @@ -3,8 +3,9 @@ package com.tangem.domain.walletconnect.model sealed interface WcEthMethod : WcMethod { data class MessageSign( - val message: String, + val rawMessage: String, val account: String, + val humanMsg: String, ) : WcEthMethod data class SendTransaction( diff --git a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSolanaMethod.kt b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSolanaMethod.kt index 3bc1f2dfbc..d599bea8d7 100644 --- a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSolanaMethod.kt +++ b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSolanaMethod.kt @@ -4,7 +4,8 @@ sealed interface WcSolanaMethod : WcMethod { data class SignMessage( val pubKey: String, - val message: String, + val rawMessage: String, + val humanMsg: String, ) : WcSolanaMethod data class SignTransaction( diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcRequestUseCaseFactory.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcRequestUseCaseFactory.kt index 4b6858edd6..2aaab06181 100644 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcRequestUseCaseFactory.kt +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/WcRequestUseCaseFactory.kt @@ -1,7 +1,7 @@ package com.tangem.domain.walletconnect import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import com.tangem.domain.walletconnect.usecase.WcMethodUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase interface WcRequestUseCaseFactory { diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCase.kt deleted file mode 100644 index fbe655766a..0000000000 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCase.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.tangem.domain.walletconnect.usecase - -import com.tangem.blockchain.common.transaction.Fee -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.walletconnect.model.WcSession -import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest - -interface WcUseCase - -interface WcMethodUseCase : WcUseCase { - val session: WcSession - val rawSdkRequest: WcSdkSessionRequest - val network: Network -} - -interface WcMutableFee { - fun updateFee(fee: Fee) -} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCasesFlowProvider.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCasesFlowProvider.kt deleted file mode 100644 index d82ecfdb41..0000000000 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/WcUseCasesFlowProvider.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.tangem.domain.walletconnect.usecase - -import kotlinx.coroutines.flow.Flow - -interface WcUseCasesFlowProvider { - val useCases: Flow -} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthMessageSignUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthMessageSignUseCase.kt deleted file mode 100644 index c2ab17f065..0000000000 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthMessageSignUseCase.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tangem.domain.walletconnect.usecase.ethereum - -import com.tangem.domain.walletconnect.usecase.blockaid.WcBlockAidEligibleTransactionUseCase -import com.tangem.domain.walletconnect.usecase.sign.WcSignUseCase - -interface WcEthMessageSignUseCase : - WcSignUseCase, - WcSignUseCase.SimpleRun, - WcBlockAidEligibleTransactionUseCase { - - data class SignModel( - val humanMsg: String, - val account: String, - val rawMsg: String, - ) -} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthTransactionUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthTransactionUseCase.kt deleted file mode 100644 index 406abcdaba..0000000000 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/ethereum/WcEthTransactionUseCase.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.tangem.domain.walletconnect.usecase.ethereum - -import com.tangem.blockchain.common.TransactionData -import com.tangem.blockchain.common.transaction.Fee -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.walletconnect.model.WcSession -import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import com.tangem.domain.walletconnect.usecase.WcMutableFee -import com.tangem.domain.walletconnect.usecase.blockaid.WcBlockAidEligibleTransactionUseCase -import com.tangem.domain.walletconnect.usecase.sign.WcSignUseCase - -interface WcEthSendTransactionUseCase : - WcSignUseCase, - WcSignUseCase.SimpleRun, - WcBlockAidEligibleTransactionUseCase, - WcMutableFee { - - override val session: WcSession - override val rawSdkRequest: WcSdkSessionRequest - override val network: Network - - override fun sign() - override fun cancel() - override fun updateFee(fee: Fee) -} - -interface WcEthSignTransactionUseCase : - WcSignUseCase, - WcSignUseCase.SimpleRun, - WcBlockAidEligibleTransactionUseCase, - WcMutableFee { - - override val session: WcSession - override val rawSdkRequest: WcSdkSessionRequest - override val network: Network - - override fun sign() - override fun cancel() - override fun updateFee(fee: Fee) -} - -data class WcEthTransaction( - val dAppFee: Fee.Ethereum.Legacy?, - val transactionData: TransactionData.Uncompiled, -) \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/EthereumUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/EthereumUseCase.kt new file mode 100644 index 0000000000..1186983549 --- /dev/null +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/EthereumUseCase.kt @@ -0,0 +1,22 @@ +package com.tangem.domain.walletconnect.usecase.method + +import com.tangem.blockchain.common.TransactionData +import com.tangem.blockchain.common.transaction.Fee +import com.tangem.domain.walletconnect.usecase.blockaid.WcBlockAidEligibleTransactionUseCase + +/** + * UseCase for + * ## Ethereum + * eth_sendTransaction https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc#eth-sendtransaction + * eth_signTransaction https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc#eth-signtransaction + */ +interface WcEthTransactionUseCase : + WcSignUseCase, + WcSignUseCase.SimpleRun, + WcBlockAidEligibleTransactionUseCase, + WcMutableFee + +data class WcEthTransaction( + val dAppFee: Fee.Ethereum.Legacy?, + val transactionData: TransactionData.Uncompiled, +) \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMessageSignUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMessageSignUseCase.kt new file mode 100644 index 0000000000..594ffa0213 --- /dev/null +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMessageSignUseCase.kt @@ -0,0 +1,24 @@ +package com.tangem.domain.walletconnect.usecase.method + +import com.tangem.domain.walletconnect.usecase.blockaid.WcBlockAidEligibleTransactionUseCase + +/** + * UseCase for + * + * ## Ethereum + * personal_sign https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc#personal-sign + * eth_sign https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc#eth-sign + * todo() eth_signTypedData https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc#eth-signtypeddata + * + * ## Solana + * solana_signMessage https://docs.reown.com/advanced/multichain/rpc-reference/solana-rpc#solana-signmessage + */ +interface WcMessageSignUseCase : + WcSignUseCase, + WcSignUseCase.SimpleRun, + WcBlockAidEligibleTransactionUseCase { + + data class SignModel( + val humanMsg: String, + ) +} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMethodBase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMethodBase.kt new file mode 100644 index 0000000000..604103f540 --- /dev/null +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcMethodBase.kt @@ -0,0 +1,57 @@ +package com.tangem.domain.walletconnect.usecase.method + +import arrow.core.Either +import com.tangem.blockchain.common.transaction.Fee +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.walletconnect.model.WcMethod +import com.tangem.domain.walletconnect.model.WcSession +import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import com.tangem.domain.wallets.models.UserWallet +import kotlinx.coroutines.flow.Flow + +interface WcMethodUseCase : WcMethodContext + +interface WcMethodContext { + val session: WcSession + val rawSdkRequest: WcSdkSessionRequest + val network: Network + val method: WcMethod + val walletAddress: String + val wallet: UserWallet get() = session.wallet +} + +/** + * Wc Methods that support an updatable fee + */ +interface WcMutableFee { + fun updateFee(fee: Fee) +} + +/** + * Wc Methods that must be signed by Tangem card + * [WcSignState] represents signing state + */ +interface WcSignUseCase : WcMethodContext { + + fun cancel() + fun sign() + + interface SimpleRun { + operator fun invoke(): Flow> + } + + interface ArgsRun { + operator fun invoke(args: Args): Flow> + } +} + +data class WcSignState( + val signModel: SignModel, + val domainStep: WcSignStep, +) + +sealed interface WcSignStep { + data object PreSign : WcSignStep + data object Signing : WcSignStep + data class Result(val result: Either) : WcSignStep +} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/sign/WcSignUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/sign/WcSignUseCase.kt deleted file mode 100644 index f011b82087..0000000000 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/sign/WcSignUseCase.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.tangem.domain.walletconnect.usecase.sign - -import arrow.core.Either -import com.tangem.domain.walletconnect.usecase.WcMethodUseCase -import kotlinx.coroutines.flow.Flow - -interface WcSignUseCase : WcMethodUseCase { - - fun cancel() - fun sign() - - interface SimpleRun { - operator fun invoke(): Flow> - } - - interface ArgsRun { - operator fun invoke(args: Args): Flow> - } -} - -data class WcSignState( - val signModel: SignModel, - val domainStep: WcSignStep, -) - -sealed interface WcSignStep { - data object PreSign : WcSignStep - data object Signing : WcSignStep - data class Result(val result: Either) : WcSignStep -} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/solana/WcSolanaSignTransactionUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/solana/WcSolanaSignTransactionUseCase.kt index a99cd1d71a..fb0e293aaa 100644 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/solana/WcSolanaSignTransactionUseCase.kt +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/solana/WcSolanaSignTransactionUseCase.kt @@ -5,8 +5,8 @@ import com.tangem.domain.tokens.model.Network import com.tangem.domain.walletconnect.model.WcSession import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.walletconnect.usecase.blockaid.WcBlockAidEligibleTransactionUseCase -import com.tangem.domain.walletconnect.usecase.sign.WcSignState -import com.tangem.domain.walletconnect.usecase.sign.WcSignUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase import kotlinx.coroutines.flow.Flow interface WcSolanaSignTransactionUseCase :