From da066d2ba41bfbd880d741f6e833d279a8575c3a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 20 May 2025 23:37:58 +0700 Subject: [PATCH] Updated on 2026-08-14 --- .../ethereum/EthTransactionParamsConverter.kt | 25 ---------- .../ethereum/WcEthSendTransactionUseCase.kt | 43 ++++++++++++----- .../ethereum/WcEthSignTransactionUseCase.kt | 42 +++++++++++------ .../network/solana/WcSolanaNetwork.kt | 4 +- ...t => WcSolanaSignAllTransactionUseCase.kt} | 16 +++---- ...e.kt => WcSolanaSignTransactionUseCase.kt} | 14 +++--- .../walletconnect/sign/BaseWcSignUseCase.kt | 2 +- .../usecase/method/EthereumUseCase.kt | 22 --------- .../usecase/method/WcMessageSignUseCase.kt | 3 +- .../usecase/method/WcMethodBase.kt | 21 ++------- .../usecase/method/WcTransactionUseCase.kt | 47 +++++++++++++++++++ .../solana/WcSolanaSignTransactionUseCase.kt | 38 --------------- .../model/WcSignTransactionModel.kt | 6 +-- .../utils/WcSignTransactionUtils.kt | 2 +- 14 files changed, 130 insertions(+), 155 deletions(-) delete mode 100644 data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/EthTransactionParamsConverter.kt rename data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/{DefaultWcSolanaSignAllTransactionUseCase.kt => WcSolanaSignAllTransactionUseCase.kt} (86%) rename data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/{DefaultWcSolanaSignTransactionUseCase.kt => WcSolanaSignTransactionUseCase.kt} (83%) delete 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/WcTransactionUseCase.kt delete mode 100644 domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/solana/WcSolanaSignTransactionUseCase.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 deleted file mode 100644 index 793e33c829..0000000000 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/EthTransactionParamsConverter.kt +++ /dev/null @@ -1,25 +0,0 @@ -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.method.WcEthTransaction -import com.tangem.utils.converter.Converter - -internal class EthTransactionParamsConverter( - private val context: WcMethodUseCaseContext, -) : Converter { - - override fun convert(value: WcEthTransactionParams): WcEthTransaction? { - val dAppFee = WcEthTxHelper.getDAppFee(context.network, value) - val transactionData = WcEthTxHelper.createTransactionData( - dAppFee = dAppFee, - network = context.network, - txParams = value, - ) - transactionData ?: return null - return WcEthTransaction( - dAppFee = dAppFee, - transactionData = transactionData, - ) - } -} \ No newline at end of file diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSendTransactionUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSendTransactionUseCase.kt index 3a560bc130..64c0fb108e 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSendTransactionUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSendTransactionUseCase.kt @@ -1,24 +1,26 @@ package com.tangem.data.walletconnect.network.ethereum import arrow.core.left +import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.common.transaction.Fee import com.tangem.blockchain.extensions.formatHex import com.tangem.core.analytics.api.AnalyticsEventHandler -import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate 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.data.walletconnect.utils.BlockAidVerificationDelegate import com.tangem.domain.transaction.usecase.SendTransactionUseCase import com.tangem.domain.walletconnect.model.WcEthMethod -import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction -import com.tangem.domain.walletconnect.usecase.method.WcEthTransactionUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMutableFee import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow @@ -29,8 +31,9 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor( override val analytics: AnalyticsEventHandler, private val sendTransaction: SendTransactionUseCase, blockAidDelegate: BlockAidVerificationDelegate, -) : BaseWcSignUseCase(), - WcEthTransactionUseCase { +) : BaseWcSignUseCase(), + WcTransactionUseCase, + WcMutableFee { override val securityStatus = blockAidDelegate.getSecurityStatus( network = network, @@ -40,10 +43,8 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor( accountAddress = context.accountAddress, ) - private val converter = EthTransactionParamsConverter(context) - - override suspend fun SignCollector.onSign(state: WcSignState) { - val hash = sendTransaction(state.signModel.transactionData, wallet, network) + override suspend fun SignCollector.onSign(state: WcSignState) { + val hash = sendTransaction(state.signModel, wallet, network) .onLeft { error -> val sendError = IllegalArgumentException(error.toString()) // todo(wc) use domain error emit(state.toResult(sendError.left())) @@ -53,13 +54,31 @@ internal class WcEthSendTransactionUseCase @AssistedInject constructor( emit(state.toResult(respondResult)) } + override suspend fun FlowCollector.onMiddleAction(signModel: TransactionData, fee: Fee) { + val uncompiled = signModel.requireUncompiled() + val newState = uncompiled.copy(fee = fee) + emit(newState) + } + + override suspend fun dAppFee(): Fee.Ethereum.Legacy? { + val dAppFee = WcEthTxHelper.getDAppFee( + network = context.network, + txParams = method.transaction, + ) + return dAppFee + } + override fun updateFee(fee: Fee) { middleAction(fee) } - override fun invoke(): Flow> = flow { - val ethTransaction = converter.convert(method.transaction) ?: return@flow - emitAll(delegate.invoke(ethTransaction)) + override fun invoke(): Flow> = flow { + val transactionData = WcEthTxHelper.createTransactionData( + dAppFee = dAppFee(), + network = context.network, + txParams = method.transaction, + ) ?: return@flow + emitAll(delegate.invoke(transactionData)) } @AssistedFactory diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSignTransactionUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSignTransactionUseCase.kt index 36b54ba3e7..52f4ef6167 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSignTransactionUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthSignTransactionUseCase.kt @@ -1,21 +1,22 @@ package com.tangem.data.walletconnect.network.ethereum import arrow.core.left +import com.tangem.blockchain.common.TransactionData import com.tangem.blockchain.common.transaction.Fee import com.tangem.blockchain.extensions.formatHex import com.tangem.common.extensions.toHexString import com.tangem.core.analytics.api.AnalyticsEventHandler -import com.tangem.data.walletconnect.utils.BlockAidVerificationDelegate 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.data.walletconnect.utils.BlockAidVerificationDelegate import com.tangem.domain.transaction.usecase.PrepareForSendUseCase import com.tangem.domain.walletconnect.model.WcEthMethod -import com.tangem.domain.walletconnect.usecase.method.WcEthTransaction -import com.tangem.domain.walletconnect.usecase.method.WcEthTransactionUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMutableFee import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -31,8 +32,9 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor( @Assisted override val context: WcMethodUseCaseContext, @Assisted override val method: WcEthMethod.SignTransaction, blockAidDelegate: BlockAidVerificationDelegate, -) : BaseWcSignUseCase(), - WcEthTransactionUseCase { +) : BaseWcSignUseCase(), + WcTransactionUseCase, + WcMutableFee { override val securityStatus = blockAidDelegate.getSecurityStatus( network = network, @@ -42,10 +44,8 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor( accountAddress = context.accountAddress, ) - private val converter = EthTransactionParamsConverter(context) - - override suspend fun SignCollector.onSign(state: WcSignState) { - val hash = prepareForSend(state.signModel.transactionData, wallet, network) + override suspend fun SignCollector.onSign(state: WcSignState) { + val hash = prepareForSend(state.signModel, wallet, network) .map { it.toHexString().formatHex() } .onLeft { error -> emit(state.toResult(error.left())) @@ -56,9 +56,9 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor( emit(state.toResult(respondResult)) } - override suspend fun FlowCollector.onMiddleAction(signModel: WcEthTransaction, fee: Fee) { - val newState = signModel - .copy(transactionData = signModel.transactionData.copy(fee = fee)) + override suspend fun FlowCollector.onMiddleAction(signModel: TransactionData, fee: Fee) { + val uncompiled = signModel.requireUncompiled() + val newState = uncompiled.copy(fee = fee) emit(newState) } @@ -66,9 +66,21 @@ internal class WcEthSignTransactionUseCase @AssistedInject constructor( middleAction(fee) } - override fun invoke(): Flow> = flow { - val ethTransaction = converter.convert(method.transaction) ?: return@flow - emitAll(delegate.invoke(ethTransaction)) + override fun invoke(): Flow> = flow { + val transactionData = WcEthTxHelper.createTransactionData( + dAppFee = dAppFee(), + network = context.network, + txParams = method.transaction, + ) ?: return@flow + emitAll(delegate.invoke(transactionData)) + } + + override suspend fun dAppFee(): Fee.Ethereum.Legacy? { + val dAppFee = WcEthTxHelper.getDAppFee( + network = context.network, + txParams = method.transaction, + ) + return dAppFee } @AssistedFactory 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 3830948b54..b5fe4a8eea 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 @@ -119,8 +119,8 @@ internal class WcSolanaNetwork( internal class Factories @Inject constructor( val messageSign: WcSolanaMessageSignUseCase.Factory, - val signTransaction: DefaultWcSolanaSignTransactionUseCase.Factory, - val signAllTransaction: DefaultWcSolanaSignAllTransactionUseCase.Factory, + val signTransaction: WcSolanaSignTransactionUseCase.Factory, + val signAllTransaction: WcSolanaSignAllTransactionUseCase.Factory, ) companion object { 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/WcSolanaSignAllTransactionUseCase.kt similarity index 86% rename from data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignAllTransactionUseCase.kt rename to data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaSignAllTransactionUseCase.kt index c2fb4099c9..94f65e43b8 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/WcSolanaSignAllTransactionUseCase.kt @@ -12,8 +12,8 @@ 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.method.WcListTransactionUseCase import com.tangem.domain.walletconnect.usecase.method.WcSignState -import com.tangem.domain.walletconnect.usecase.solana.WcSolanaSignAllTransactionUseCase import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -22,15 +22,15 @@ import okio.ByteString.Companion.decodeBase64 import org.json.JSONArray import org.json.JSONObject -internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject constructor( +internal class WcSolanaSignAllTransactionUseCase @AssistedInject constructor( override val respondService: WcRespondService, override val analytics: AnalyticsEventHandler, private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, @Assisted override val method: WcSolanaMethod.SignAllTransaction, blockAidDelegate: BlockAidVerificationDelegate, -) : BaseWcSignUseCase>(), - WcSolanaSignAllTransactionUseCase { +) : BaseWcSignUseCase>(), + WcListTransactionUseCase { override val securityStatus = blockAidDelegate.getSecurityStatus( network = network, @@ -40,9 +40,7 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc accountAddress = context.accountAddress, ) - override suspend fun SignCollector>.onSign( - state: WcSignState>, - ) { + override suspend fun SignCollector>.onSign(state: WcSignState>) { val hash = prepareForSend.invoke(transactionData = state.signModel, userWallet = wallet, network = network) .onLeft { error -> emit(state.toResult(error.left())) @@ -54,7 +52,7 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc emit(state.toResult(respondResult)) } - override fun invoke(): Flow>> { + override fun invoke(): Flow>> { val transactionData = method.transaction .map { it.decodeBase64()?.toByteArray() ?: ByteArray(0) } .map { TransactionData.Compiled(value = TransactionData.Compiled.Data.Bytes(it)) } @@ -85,6 +83,6 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc fun create( context: WcMethodUseCaseContext, method: WcSolanaMethod.SignAllTransaction, - ): DefaultWcSolanaSignAllTransactionUseCase + ): WcSolanaSignAllTransactionUseCase } } \ No newline at end of file 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/WcSolanaSignTransactionUseCase.kt similarity index 83% rename from data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/DefaultWcSolanaSignTransactionUseCase.kt rename to data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/solana/WcSolanaSignTransactionUseCase.kt index ee268c3122..1f518d0cdb 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/WcSolanaSignTransactionUseCase.kt @@ -13,22 +13,22 @@ 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.method.WcSignState -import com.tangem.domain.walletconnect.usecase.solana.WcSolanaSignTransactionUseCase +import com.tangem.domain.walletconnect.usecase.method.WcTransactionUseCase import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.flow.Flow import okio.ByteString.Companion.decodeBase64 -internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor( +internal class WcSolanaSignTransactionUseCase @AssistedInject constructor( override val respondService: WcRespondService, override val analytics: AnalyticsEventHandler, private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, @Assisted override val method: WcSolanaMethod.SignTransaction, blockAidDelegate: BlockAidVerificationDelegate, -) : BaseWcSignUseCase(), - WcSolanaSignTransactionUseCase { +) : BaseWcSignUseCase(), + WcTransactionUseCase { override val securityStatus = blockAidDelegate.getSecurityStatus( network = network, @@ -38,7 +38,7 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor accountAddress = context.accountAddress, ) - override suspend fun SignCollector.onSign(state: WcSignState) { + override suspend fun SignCollector.onSign(state: WcSignState) { val hash = prepareForSend.invoke(transactionData = state.signModel, userWallet = wallet, network = network) .onLeft { error -> emit(state.toResult(error.left())) @@ -50,7 +50,7 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor emit(state.toResult(respondResult)) } - override fun invoke(): Flow> { + override fun invoke(): Flow> { val data = method.transaction.decodeBase64()?.toByteArray() ?: ByteArray(0) val transactionData = TransactionData.Compiled( @@ -64,6 +64,6 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor fun create( context: WcMethodUseCaseContext, method: WcSolanaMethod.SignTransaction, - ): DefaultWcSolanaSignTransactionUseCase + ): WcSolanaSignTransactionUseCase } } \ No newline at end of file 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 cae206cf91..a2dfa97c70 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 @@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.FlowCollector internal abstract class BaseWcSignUseCase : WcMethodUseCase, - WcSignUseCase, + WcSignUseCase, FinalActionCollector, MiddleActionCollector { 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 deleted file mode 100644 index 1186983549..0000000000 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/EthereumUseCase.kt +++ /dev/null @@ -1,22 +0,0 @@ -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 index 07b48dff2d..f207231e88 100644 --- 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 @@ -14,8 +14,7 @@ import com.tangem.domain.walletconnect.usecase.blockaid.WcBlockAidEligibleTransa * solana_signMessage https://docs.reown.com/advanced/multichain/rpc-reference/solana-rpc#solana-signmessage */ interface WcMessageSignUseCase : - WcSignUseCase, - WcSignUseCase.SimpleRun, + WcSignUseCase, WcBlockAidEligibleTransactionUseCase { data class SignModel( 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 index 050dea7526..542ce50166 100644 --- 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 @@ -1,7 +1,6 @@ package com.tangem.domain.walletconnect.usecase.method import arrow.core.Either -import com.tangem.blockchain.common.transaction.Fee import com.tangem.domain.models.network.Network import com.tangem.domain.walletconnect.model.WcMethod import com.tangem.domain.walletconnect.model.WcSession @@ -9,7 +8,7 @@ import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.wallets.models.UserWallet import kotlinx.coroutines.flow.Flow -interface WcMethodUseCase : WcMethodContext +interface WcMethodUseCase interface WcMethodContext { val session: WcSession @@ -20,29 +19,15 @@ interface WcMethodContext { 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 { +interface WcSignUseCase : WcMethodContext { + operator fun invoke(): Flow> fun cancel() fun sign() - - interface SimpleRun { - operator fun invoke(): Flow> - } - - interface ArgsRun { - operator fun invoke(args: Args): Flow> - } } data class WcSignState( diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcTransactionUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcTransactionUseCase.kt new file mode 100644 index 0000000000..94696251c0 --- /dev/null +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/method/WcTransactionUseCase.kt @@ -0,0 +1,47 @@ +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 + +/** + * Base UseCase for wc methods with single TransactionData + * + * ## 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 + * + * ## Solana + * solana_signTransaction https://docs.reown.com/advanced/multichain/rpc-reference/solana-rpc#solana-signtransaction + */ +interface WcTransactionUseCase : + WcSignUseCase, + WcBlockAidEligibleTransactionUseCase + +/** + * Base UseCase for wc methods with list of TransactionData + * + * ## Solana + * solana_signAllTransactions https://docs.reown.com/advanced/multichain/rpc-reference/solana-rpc#solana-signalltransactions + */ +interface WcListTransactionUseCase : + WcSignUseCase>, + WcBlockAidEligibleTransactionUseCase + +/** + * Wc Methods that support an updatable fee + * [dAppFee] call to gee fee from dApp + * [updateFee] call when user update the fee + */ +interface WcMutableFee { + suspend fun dAppFee(): Fee? + fun updateFee(fee: Fee) +} + +/** + * Wc Methods that support an updatable allowance + * [updateFee] call when user update the fee + */ +interface WcMutableAllowance { + fun updateAllowance(allowance: Any) // todo wc +} \ 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 deleted file mode 100644 index 4aa10721a4..0000000000 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/solana/WcSolanaSignTransactionUseCase.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.tangem.domain.walletconnect.usecase.solana - -import com.tangem.blockchain.common.TransactionData -import com.tangem.domain.models.network.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.method.WcSignState -import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase -import kotlinx.coroutines.flow.Flow - -interface WcSolanaSignTransactionUseCase : - WcSignUseCase, - WcSignUseCase.SimpleRun, - WcBlockAidEligibleTransactionUseCase { - - override val network: Network - override val rawSdkRequest: WcSdkSessionRequest - override val session: WcSession - - override fun sign() - override fun cancel() - override fun invoke(): Flow> -} - -interface WcSolanaSignAllTransactionUseCase : - WcSignUseCase, - WcSignUseCase.SimpleRun>, - WcBlockAidEligibleTransactionUseCase { - - override val network: Network - override val rawSdkRequest: WcSdkSessionRequest - override val session: WcSession - - override fun sign() - override fun cancel() - override fun invoke(): Flow>> -} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt index f906dbd0de..fbba3635eb 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt @@ -39,11 +39,11 @@ internal class WcSignTransactionModel @Inject constructor( init { modelScope.launch { - val useCase: WcSignUseCase.SimpleRun<*> = useCaseFactory.createUseCase(params.rawRequest) + val useCase: WcSignUseCase<*> = useCaseFactory.createUseCase(params.rawRequest) useCase.invoke() .onEach { signState -> if (signingIsDone(signState)) return@onEach - val signTransactionUM = (useCase as? WcSignUseCase)?.toUM( + val signTransactionUM = useCase.toUM( signState = signState, actions = WcTransactionActionsUM( onDismiss = { cancel(useCase) }, @@ -69,7 +69,7 @@ internal class WcSignTransactionModel @Inject constructor( return false } - private fun cancel(useCase: WcSignUseCase) { + private fun cancel(useCase: WcSignUseCase<*>) { useCase.cancel() router.pop() } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcSignTransactionUtils.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcSignTransactionUtils.kt index 5d463a28de..c1ee1d5ee7 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcSignTransactionUtils.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcSignTransactionUtils.kt @@ -17,7 +17,7 @@ import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransacti import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -internal fun WcSignUseCase.toUM(signState: WcSignState<*>, actions: WcTransactionActionsUM): WcSignTransactionUM? { +internal fun WcSignUseCase<*>.toUM(signState: WcSignState<*>, actions: WcTransactionActionsUM): WcSignTransactionUM? { return when (this) { is WcMessageSignUseCase -> { when (method) {