From 9ad060cc85a636e2e01e4a4ef2afd85164cd2714 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 16 Jun 2023 15:31:21 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/common/DialogManager.kt | 11 +++++-- .../data/WalletConnectRepositoryImpl.kt | 27 ++++++++++------ .../domain/WalletConnectInteractor.kt | 32 +++++++++++-------- .../domain/models/WalletConnectError.kt | 2 +- .../walletconnect/WalletConnectMiddleware.kt | 15 +++++---- .../redux/walletconnect/WalletConnectState.kt | 2 +- core/res/src/main/res/values-ru/strings.xml | 1 + .../src/main/res/values-zh-rTW/strings.xml | 1 + core/res/src/main/res/values/strings.xml | 1 + 9 files changed, 59 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index e4520b39d6..2089abefa6 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -100,12 +100,19 @@ class DialogManager : StoreSubscriber { preparedData = state.dialog.data, context = context, ) - is WalletConnectDialog.UnsupportedNetwork -> + is WalletConnectDialog.UnsupportedNetwork -> { + val warning = if (state.dialog.networks.isNullOrEmpty()) { + context.getString(R.string.wallet_connect_scanner_error_unsupported_network) + } else { + context.getString(R.string.wallet_connect_error_unsupported_blockchains) + + state.dialog.networks + } SimpleAlertDialog.create( titleRes = R.string.wallet_connect_title, - messageRes = R.string.wallet_connect_scanner_error_unsupported_network, + message = warning, context = context, ) + } is WalletConnectDialog.SessionProposalDialog -> { SessionProposalDialog.create( sessionProposal = state.dialog.sessionProposal, diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt index 80d7ed0b09..01e3803798 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt @@ -1,15 +1,22 @@ package com.tangem.tap.domain.walletconnect2.data -import android.app.* -import com.tangem.tap.domain.walletconnect2.domain.* +import android.app.Application +import com.tangem.tap.domain.walletconnect2.domain.WalletConnectRepository +import com.tangem.tap.domain.walletconnect2.domain.WcJrpcRequestsDeserializer import com.tangem.tap.domain.walletconnect2.domain.models.* -import com.walletconnect.android.* -import com.walletconnect.android.relay.* -import com.walletconnect.web3.wallet.client.* -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* -import timber.log.* -import javax.inject.* +import com.walletconnect.android.Core +import com.walletconnect.android.CoreClient +import com.walletconnect.android.relay.ConnectionType +import com.walletconnect.web3.wallet.client.Wallet +import com.walletconnect.web3.wallet.client.Web3Wallet +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject class WalletConnectRepositoryImpl @Inject constructor( private val application: Application, @@ -181,7 +188,7 @@ class WalletConnectRepositoryImpl @Inject constructor( userNamespaces = userNamespaces, ) if (missingNetworks.isNotEmpty()) { - Timber.e("Unsupported blockchains: $missingNetworks") + Timber.e("Not added blockchains: $missingNetworks") scope.launch { _events.emit( WalletConnectEvents.SessionApprovalError( diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt index 03bd4e548e..21e5a73147 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt @@ -1,13 +1,16 @@ package com.tangem.tap.domain.walletconnect2.domain -import com.tangem.tap.common.extensions.* -import com.tangem.tap.domain.walletconnect.* +import com.tangem.tap.common.extensions.filterNotNull +import com.tangem.tap.domain.walletconnect.WalletConnectSdkHelper import com.tangem.tap.domain.walletconnect2.domain.models.* -import com.tangem.tap.features.details.ui.walletconnect.* -import com.tangem.utils.coroutines.* -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* -import timber.log.* +import com.tangem.tap.features.details.ui.walletconnect.WcSessionForScreen +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import timber.log.Timber class WalletConnectInteractor( private val handler: WalletConnectEventsHandler, @@ -47,6 +50,14 @@ class WalletConnectInteractor( when (wcEvent) { is WalletConnectEvents.SessionProposal -> { Timber.d("WC session proposal event received") + val unsupportedNetworks = wcEvent.chainIds + .filter { blockchainHelper.chainIdToNetworkIdOrNull(it) == null } + if (unsupportedNetworks.isNotEmpty()) { + val error = WalletConnectError.ApprovalErrorUnsupportedNetwork(unsupportedNetworks) + handler.onSessionRejected(error) + return@onEach + } + val networksFormatted = wcEvent.chainIds .mapNotNull { blockchainHelper.chainIdToFullNameOrNull(it) } .toString() @@ -57,12 +68,7 @@ class WalletConnectInteractor( is WalletConnectError.ApprovalErrorMissingNetworks -> { val missingNetworks = wcEvent.error.missingChains .map { blockchainHelper.chainIdToNetworkIdOrNull(it) } - val containsUnsupportedNetworks = missingNetworks.any { it == null } - if (containsUnsupportedNetworks) { - WalletConnectError.ApprovalErrorUnsupportedNetwork - } else { - WalletConnectError.ApprovalErrorAddNetwork(missingNetworks.filterNotNull()) - } + WalletConnectError.ApprovalErrorAddNetwork(missingNetworks.filterNotNull()) } else -> wcEvent.error } diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectError.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectError.kt index 1f9b7f6771..35da4b88f8 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectError.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectError.kt @@ -3,7 +3,7 @@ package com.tangem.tap.domain.walletconnect2.domain.models sealed class WalletConnectError : Exception() { data class ApprovalErrorMissingNetworks(val missingChains: List) : WalletConnectError() data class ApprovalErrorAddNetwork(val networks: List) : WalletConnectError() - object ApprovalErrorUnsupportedNetwork : WalletConnectError() + data class ApprovalErrorUnsupportedNetwork(val unsupportedNetworks: List) : WalletConnectError() data class ExternalApprovalError(override val message: String?) : WalletConnectError() object WrongUserWallet : WalletConnectError() object UnsupportedMethod : WalletConnectError() diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index b83b2ad75a..9632a15368 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -238,7 +238,7 @@ class WalletConnectMiddleware { return } val blockchain = action.blockchain.guard { - store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork)) + store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork())) return } val walletManager = getWalletManager( @@ -298,9 +298,12 @@ class WalletConnectMiddleware { ), ) } - - WalletConnectError.ApprovalErrorUnsupportedNetwork -> { - store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork)) + is WalletConnectError.ApprovalErrorUnsupportedNetwork -> { + store.dispatchOnMain( + GlobalAction.ShowDialog( + WalletConnectDialog.UnsupportedNetwork(action.error.unsupportedNetworks), + ), + ) } is WalletConnectError.ExternalApprovalError -> { store.dispatchOnMain( @@ -327,7 +330,7 @@ class WalletConnectMiddleware { scope.launch { walletConnectInteractor.continueWithRequest(action.sessionRequest) } } is WalletConnectAction.RejectUnsupportedRequest -> { - store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork)) + store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork())) } } } @@ -337,7 +340,7 @@ class WalletConnectMiddleware { chainId = chainId, peer = session.peerMeta, ).guard { - store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork)) + store.dispatchOnMain(GlobalAction.ShowDialog(WalletConnectDialog.UnsupportedNetwork())) return } diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt index 71f4a14ca6..135f597dc1 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectState.kt @@ -91,7 +91,7 @@ data class WalletForSession( sealed class WalletConnectDialog : StateDialog { data class ClipboardOrScanQr(val clipboardUri: String) : WalletConnectDialog() object UnsupportedCard : WalletConnectDialog() - object UnsupportedNetwork : WalletConnectDialog() + data class UnsupportedNetwork(val networks: List? = null) : WalletConnectDialog() data class AddNetwork(val network: String) : WalletConnectDialog() object OpeningSessionRejected : WalletConnectDialog() object SessionTimeout : WalletConnectDialog() diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index e994de868f..4d71fe324b 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -457,6 +457,7 @@ Невозможно отправить транзакцию. Недостаточно средств. Не удалось установить сессию WalletConnect. Пожалуйста, повторите попытку позже. Не удалось установить сессию WalletConnect за отведённое время. Пожалуйста, повторите попытку позже. + Запрос на подключение через WalletConnect содержит неподдерживаемые блокчеины. Неподдерживаемые блокчеины:\n Cоединение с этим Dapp сервисом не может быть установлено из-за его технической реализации. Сеть %s не найдена. Пожалуйста, добавьте её и попробуйте заново. Вставить из буфера обмена diff --git a/core/res/src/main/res/values-zh-rTW/strings.xml b/core/res/src/main/res/values-zh-rTW/strings.xml index 08f4e9e68b..461c90bc77 100644 --- a/core/res/src/main/res/values-zh-rTW/strings.xml +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -436,6 +436,7 @@ 無法交易,無足夠資金 未能建立 WalletConnect 連接。請稍後再試 無法建立 WalletConnect 連接:超時錯誤。請稍後再試 + 會話請求包含不支持 WalletConnect 連接的區塊鏈。不支持的區塊鏈: 由於技術問題,無法與此 Dapp 建立連接 沒有 %s 網路,請先加入後再試一次 從剪貼板貼上 diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 11ef0d6d75..695c74084b 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -449,6 +449,7 @@ Can\'t send transaction. Not enough funds. Failed to establish WalletConnect session. Please, try again later. Failed to establish WalletConnect session: timeout error. Please, try again later. + Session request contains unsupported blockchains for WalletConnect connection. Unsupported blockchains:\n Connection with this Dapp cannot be established due to its technical implementation. %s network not found. Please, add it first and try again. Paste from clipboard