diff --git a/data/wallet-connect/build.gradle.kts b/data/wallet-connect/build.gradle.kts index d03ae4e940..2b9321f602 100644 --- a/data/wallet-connect/build.gradle.kts +++ b/data/wallet-connect/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { implementation(deps.arrow.core) implementation(projects.domain.blockaid) implementation(projects.domain.blockaid.models) + implementation(projects.libs.crypto) /* Tests */ testImplementation(projects.common.test) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/di/WalletConnectDataModule.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/di/WalletConnectDataModule.kt index 0afaeb4dd7..77752b86b6 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/di/WalletConnectDataModule.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/di/WalletConnectDataModule.kt @@ -35,6 +35,7 @@ import com.tangem.domain.walletconnect.usecase.initialize.WcInitializeUseCase import com.tangem.domain.walletconnect.usecase.pair.WcPairUseCase import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.usecase.GetWalletsUseCase +import com.tangem.lib.crypto.UserWalletManager import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides @@ -146,11 +147,13 @@ internal object WalletConnectDataModule { excludedBlockchains: ExcludedBlockchains, sessionsManager: WcSessionsManager, factories: WcSolanaNetwork.Factories, + walletManager: UserWalletManager, ): WcSolanaNetwork = WcSolanaNetwork( moshi = moshi, sessionsManager = sessionsManager, factories = factories, excludedBlockchains = excludedBlockchains, + walletManager = walletManager, ) @Provides diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/BlockAidEthereumVerificationDelegate.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/BlockAidEthereumVerificationDelegate.kt deleted file mode 100644 index ba45ffbdcd..0000000000 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/BlockAidEthereumVerificationDelegate.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.tangem.data.walletconnect.network.ethereum - -import com.domain.blockaid.models.transaction.CheckTransactionResult -import com.domain.blockaid.models.transaction.TransactionData -import com.domain.blockaid.models.transaction.TransactionParams -import com.tangem.domain.blockaid.BlockAidVerifier -import com.tangem.domain.core.lce.Lce -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.walletconnect.model.WcEthMethod -import com.tangem.domain.walletconnect.model.WcSession -import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow -import timber.log.Timber -import javax.inject.Inject - -internal class BlockAidEthereumVerificationDelegate @Inject constructor( - private val blockAidVerifier: BlockAidVerifier, -) { - - fun getSecurityStatus( - network: Network, - method: WcEthMethod, - rawSdkRequest: WcSdkSessionRequest, - session: WcSession, - ): Flow> = flow { - emit(Lce.Loading(partialContent = null)) - blockAidVerifier.verifyTransaction( - TransactionData( - chain = network.name, - accountAddress = when (method) { - is WcEthMethod.MessageSign -> method.account - is WcEthMethod.SendTransaction -> method.transaction.from - is WcEthMethod.SignTransaction -> method.transaction.from - }, - method = rawSdkRequest.request.method, - domainUrl = session.sdkModel.appMetaData.url, - params = TransactionParams.Evm(rawSdkRequest.request.params), - ), - ).fold( - ifLeft = { - Timber.e("Failed to verify transaction: ${it.localizedMessage}") - emit(Lce.Error(it)) - }, - ifRight = { - emit(Lce.Content(it)) - }, - ) - } -} \ No newline at end of file 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/DefaultWcEthMessageSignUseCase.kt index ed0c48b91b..4472b581fa 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/DefaultWcEthMessageSignUseCase.kt @@ -7,6 +7,7 @@ import com.tangem.blockchain.common.HEX_PREFIX import com.tangem.blockchain.extensions.isAscii import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toDecompressedPublicKey +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 @@ -30,11 +31,17 @@ internal class DefaultWcEthMessageSignUseCase @AssistedInject constructor( @Assisted private val method: WcEthMethod.MessageSign, private val walletManagersFacade: WalletManagersFacade, private val signUseCase: SignUseCase, - blockAidDelegate: BlockAidEthereumVerificationDelegate, + blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase(), WcEthMessageSignUseCase { - override val securityStatus = blockAidDelegate.getSecurityStatus(network, method, rawSdkRequest, session) + override val securityStatus = blockAidDelegate.getSecurityStatus( + network = network, + method = method, + rawSdkRequest = rawSdkRequest, + session = session, + accountAddress = context.accountAddress, + ) override suspend fun SignCollector.onSign( state: WcSignState, 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/DefaultWcEthSendTransactionUseCase.kt index 00f485605d..e4bd53eb97 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/DefaultWcEthSendTransactionUseCase.kt @@ -3,6 +3,7 @@ package com.tangem.data.walletconnect.network.ethereum import arrow.core.left import com.tangem.blockchain.common.transaction.Fee import com.tangem.blockchain.extensions.formatHex +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 @@ -25,11 +26,17 @@ internal class DefaultWcEthSendTransactionUseCase @AssistedInject constructor( @Assisted private val method: WcEthMethod.SendTransaction, override val respondService: WcRespondService, private val sendTransaction: SendTransactionUseCase, - blockAidDelegate: BlockAidEthereumVerificationDelegate, + blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase(), WcEthSendTransactionUseCase { - override val securityStatus = blockAidDelegate.getSecurityStatus(network, method, rawSdkRequest, session) + override val securityStatus = blockAidDelegate.getSecurityStatus( + network = network, + method = method, + rawSdkRequest = rawSdkRequest, + session = session, + accountAddress = context.accountAddress, + ) private val converter = EthTransactionParamsConverter(context) 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/DefaultWcEthSignTransactionUseCase.kt index a4ad2df2a1..e3b1fab7dc 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/DefaultWcEthSignTransactionUseCase.kt @@ -4,6 +4,7 @@ import arrow.core.left import com.tangem.blockchain.common.transaction.Fee import com.tangem.blockchain.extensions.formatHex import com.tangem.common.extensions.toHexString +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 @@ -27,11 +28,17 @@ internal class DefaultWcEthSignTransactionUseCase @AssistedInject constructor( private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, @Assisted private val method: WcEthMethod.SignTransaction, - blockAidDelegate: BlockAidEthereumVerificationDelegate, + blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase(), WcEthSignTransactionUseCase { - override val securityStatus = blockAidDelegate.getSecurityStatus(network, method, rawSdkRequest, session) + override val securityStatus = blockAidDelegate.getSecurityStatus( + network = network, + method = method, + rawSdkRequest = rawSdkRequest, + session = session, + accountAddress = context.accountAddress, + ) private val converter = EthTransactionParamsConverter(context) 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 0611504329..e0bb31b917 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 @@ -39,7 +39,17 @@ internal class WcEthNetwork( val method: WcEthMethod = name.toMethod(request) ?: return null val session = sessionsManager.findSessionByTopic(request.topic) ?: return null val network = toNetwork(request.chainId.orEmpty(), session.wallet) ?: return null - val context = WcMethodUseCaseContext(session = session, rawSdkRequest = request, network = network) + val accountAddress = when (method) { + is WcEthMethod.MessageSign -> method.account + is WcEthMethod.SendTransaction -> method.transaction.from + is WcEthMethod.SignTransaction -> method.transaction.from + } + val context = WcMethodUseCaseContext( + session = session, + rawSdkRequest = request, + network = network, + accountAddress = accountAddress, + ) return when (method) { is WcEthMethod.MessageSign -> factories.messageSign.create(context, method) is WcEthMethod.SendTransaction -> factories.sendTransaction.create(context, method) 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 4724192a80..ed8685df0b 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 @@ -8,6 +8,7 @@ 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.WcSolanaMethod import com.tangem.domain.walletconnect.usecase.sign.WcSignState @@ -25,9 +26,18 @@ internal class DefaultWcSolanaSignAllTransactionUseCase @AssistedInject construc private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, @Assisted private val method: WcSolanaMethod.SignAllTransaction, + blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase>(), WcSolanaSignAllTransactionUseCase { + override val securityStatus = blockAidDelegate.getSecurityStatus( + network = network, + method = method, + rawSdkRequest = rawSdkRequest, + session = session, + accountAddress = context.accountAddress, + ) + override suspend fun SignCollector>.onSign( state: WcSignState>, ) { 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 4a497421ff..e923e85969 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 @@ -8,6 +8,7 @@ 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.WcSolanaMethod import com.tangem.domain.walletconnect.usecase.sign.WcSignState @@ -23,9 +24,18 @@ internal class DefaultWcSolanaSignTransactionUseCase @AssistedInject constructor private val prepareForSend: PrepareForSendUseCase, @Assisted override val context: WcMethodUseCaseContext, @Assisted private val method: WcSolanaMethod.SignTransaction, + blockAidDelegate: BlockAidVerificationDelegate, ) : BaseWcSignUseCase(), WcSolanaSignTransactionUseCase { + override val securityStatus = blockAidDelegate.getSecurityStatus( + network = network, + method = method, + rawSdkRequest = rawSdkRequest, + session = session, + accountAddress = context.accountAddress, + ) + override suspend fun SignCollector.onSign(state: WcSignState) { val hash = prepareForSend.invoke(transactionData = state.signModel, userWallet = wallet, network = network) .onLeft { error -> 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 fd4e3b5832..30221cd33b 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 @@ -16,13 +16,16 @@ 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.wallets.models.UserWallet +import com.tangem.lib.crypto.UserWalletManager import jakarta.inject.Inject +import timber.log.Timber -internal class WcSolanaNetwork constructor( +internal class WcSolanaNetwork( private val moshi: Moshi, private val sessionsManager: WcSessionsManager, private val factories: Factories, private val excludedBlockchains: ExcludedBlockchains, + private val walletManager: UserWalletManager, ) : WcNamespaceConverter, WcRequestToUseCaseConverter { override val namespaceKey: NamespaceKey = NamespaceKey("solana") @@ -38,7 +41,13 @@ internal class WcSolanaNetwork constructor( val method: WcSolanaMethod = name.toMethod(request) ?: return null val session = sessionsManager.findSessionByTopic(request.topic) ?: return null val network = toNetwork(request.chainId.orEmpty(), session.wallet) ?: return null - val context = WcMethodUseCaseContext(session = session, rawSdkRequest = request, network = network) + val accountAddress = getAccountAddress(network) + val context = WcMethodUseCaseContext( + session = session, + rawSdkRequest = request, + network = network, + accountAddress = accountAddress, + ) return when (method) { is WcSolanaMethod.SignMessage -> TODO() is WcSolanaMethod.SignTransaction -> factories.signTransaction.create(context, method) @@ -46,6 +55,15 @@ internal class WcSolanaNetwork constructor( } } + private suspend fun getAccountAddress(network: Network): String? { + return try { + walletManager.getWalletAddress(network.id.value, network.derivationPath.value) + } catch (exception: Exception) { + Timber.e(exception) + null + } + } + override fun toBlockchain(chainId: CAIP2): Blockchain? { if (chainId.namespace != namespaceKey.key) return null return when (chainId.reference) { 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 8967ae0706..a395e1bf2f 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 @@ -60,6 +60,7 @@ internal class WcMethodUseCaseContext( val session: WcSession, val rawSdkRequest: WcSdkSessionRequest, val network: Network, + 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/utils/BlockAidVerificationDelegate.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/BlockAidVerificationDelegate.kt new file mode 100644 index 0000000000..eb865b17fd --- /dev/null +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/BlockAidVerificationDelegate.kt @@ -0,0 +1,67 @@ +package com.tangem.data.walletconnect.utils + +import com.domain.blockaid.models.transaction.* +import com.tangem.domain.blockaid.BlockAidVerifier +import com.tangem.domain.core.lce.Lce +import com.tangem.domain.core.lce.LceFlow +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.walletconnect.model.WcEthMethod +import com.tangem.domain.walletconnect.model.WcMethod +import com.tangem.domain.walletconnect.model.WcSession +import com.tangem.domain.walletconnect.model.WcSolanaMethod +import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import kotlinx.coroutines.flow.flow +import timber.log.Timber +import javax.inject.Inject + +internal class BlockAidVerificationDelegate @Inject constructor( + private val blockAidVerifier: BlockAidVerifier, +) { + + fun getSecurityStatus( + network: Network, + method: WcMethod, + rawSdkRequest: WcSdkSessionRequest, + session: WcSession, + accountAddress: String?, + ): LceFlow = flow { + emit(Lce.Loading(partialContent = null)) + val failedResult = CheckTransactionResult( + validation = ValidationResult.FAILED_TO_VALIDATE, + simulation = SimulationResult.FailedToSimulate, + ) + if (accountAddress.isNullOrEmpty()) { + emit(Lce.Content(failedResult)) + return@flow + } + when (method) { + is WcEthMethod -> TransactionParams.Evm(rawSdkRequest.request.params) + is WcSolanaMethod.SignAllTransaction -> TransactionParams.Solana(method.transaction) + is WcSolanaMethod.SignTransaction -> TransactionParams.Solana(listOf(method.transaction)) + is WcSolanaMethod.SignMessage -> { + // BlockAid doesn't support solana_signMessage + emit(Lce.Content(failedResult)) + return@flow + } + else -> null + }?.let { params -> + blockAidVerifier.verifyTransaction( + TransactionData( + chain = network.name, + accountAddress = accountAddress, + method = rawSdkRequest.request.method, + domainUrl = session.sdkModel.appMetaData.url, + params = params, + ), + ).fold( + ifLeft = { + Timber.e("Failed to verify transaction: ${it.localizedMessage}") + emit(Lce.Error(it)) + }, + ifRight = { + emit(Lce.Content(it)) + }, + ) + } ?: emit(Lce.Content(failedResult)) + } +} \ No newline at end of file diff --git a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/blockaid/WcBlockAidEligibleTransactionUseCase.kt b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/blockaid/WcBlockAidEligibleTransactionUseCase.kt index 8cf1497baf..31733942f8 100644 --- a/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/blockaid/WcBlockAidEligibleTransactionUseCase.kt +++ b/domain/wallet-connect/src/main/kotlin/com/tangem/domain/walletconnect/usecase/blockaid/WcBlockAidEligibleTransactionUseCase.kt @@ -1,10 +1,9 @@ package com.tangem.domain.walletconnect.usecase.blockaid import com.domain.blockaid.models.transaction.CheckTransactionResult -import com.tangem.domain.core.lce.Lce -import kotlinx.coroutines.flow.Flow +import com.tangem.domain.core.lce.LceFlow interface WcBlockAidEligibleTransactionUseCase { - val securityStatus: Flow> + val securityStatus: LceFlow } \ 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 92eb17320f..a99cd1d71a 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 @@ -4,13 +4,15 @@ import com.tangem.blockchain.common.TransactionData 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 kotlinx.coroutines.flow.Flow interface WcSolanaSignTransactionUseCase : WcSignUseCase, - WcSignUseCase.SimpleRun { + WcSignUseCase.SimpleRun, + WcBlockAidEligibleTransactionUseCase { override val network: Network override val rawSdkRequest: WcSdkSessionRequest @@ -23,7 +25,8 @@ interface WcSolanaSignTransactionUseCase : interface WcSolanaSignAllTransactionUseCase : WcSignUseCase, - WcSignUseCase.SimpleRun> { + WcSignUseCase.SimpleRun>, + WcBlockAidEligibleTransactionUseCase { override val network: Network override val rawSdkRequest: WcSdkSessionRequest