From e4b1bf4e61705f351e928f72c1613303b491eb21 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 6 Feb 2026 10:58:30 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../ethereum/WcEthAddNetworkUseCase.kt | 8 ++++-- .../network/ethereum/WcEthNetwork.kt | 10 ++++++-- .../network/solana/WcSolanaNetwork.kt | 6 +++-- .../utils/WcNetworksConverter.kt | 25 +++++++++++++------ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthAddNetworkUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthAddNetworkUseCase.kt index bf9f6674f9..d835bc5139 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthAddNetworkUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/network/ethereum/WcEthAddNetworkUseCase.kt @@ -69,7 +69,7 @@ internal class WcEthAddNetworkUseCase @AssistedInject constructor( ?: return illegalState() // find and add all derivation val networkToAddCAIP10 = networksConverter - .allAddressForChain(networkToAddCAIP2.raw, wallet) + .allAddressForChain(networkToAddCAIP2.raw, wallet, session.account) .map { address -> CAIP10(networkToAddCAIP2, address).raw } val newNamespaces = namespaces.copy( chains = namespaces.chains.plus(networkToAddCAIP2.raw), @@ -134,7 +134,11 @@ internal class WcEthAddSwitchCommonDelegate @AssistedInject constructor( if (generalNetwork == null) { return HandleMethodError.TangemUnsupportedNetwork(caip2.raw).left() } - val addedNetwork = networksConverter.mainOrAnyWalletNetworkForRequest(caip2.raw, wallet) + val addedNetwork = networksConverter.mainOrAnyWalletNetworkForRequest( + rawChainId = caip2.raw, + wallet = wallet, + account = context.session.account, + ) if (addedNetwork == null) { return HandleMethodError.NotAddedNetwork(generalNetwork.name).left() } 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 b713e9f18b..c03d165fa0 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,12 +39,17 @@ internal class WcEthNetwork( val name = toWcMethodName(request) ?: return error("Unknown method name") val session = sessionsManager.findSessionByTopic(request.topic) ?: return HandleMethodError.UnknownSession.left() + val account = session.account val wallet = session.wallet val chainId = request.chainId.orEmpty() val method: WcEthMethod = name.toMethod(request) .getOrElse { return error(it.message.orEmpty()) } ?: return error("Failed to parse $name") - suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest(chainId, wallet) + suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest( + rawChainId = chainId, + wallet = wallet, + account = account, + ) val accountAddress = when (method) { is WcEthMethod.MessageSign -> method.account @@ -69,12 +74,13 @@ internal class WcEthNetwork( -> anyExistNetwork() } ?: return error("Failed to find walletNetwork for accountAddress $accountAddress") + val networkDerivationsCount = networksConverter.filterWalletNetworkForRequest(chainId, wallet, account).size val context = WcMethodUseCaseContext( session = session, rawSdkRequest = request, network = walletNetwork, accountAddress = accountAddress, - networkDerivationsCount = networksConverter.filterWalletNetworkForRequest(chainId, wallet).size, + networkDerivationsCount = networkDerivationsCount, ) return when (method) { is WcEthMethod.MessageSign -> factories.messageSign.create(context, method) 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 db6f83849d..bb68bd46d2 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 @@ -47,8 +47,9 @@ internal class WcSolanaNetwork( val session = sessionsManager.findSessionByTopic(request.topic) ?: return HandleMethodError.UnknownSession.left() val wallet = session.wallet + val account = session.account val chainId = request.chainId.orEmpty() - suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest(chainId, wallet) + suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest(chainId, wallet, account) suspend fun anyAddress() = anyExistNetwork() ?.let { network -> networksConverter.getAddressForWC(wallet.walletId, network).orEmpty() } .orEmpty() @@ -63,12 +64,13 @@ internal class WcSolanaNetwork( ?: anyExistNetwork() ?: return error("Failed to find walletNetwork for accountAddress $accountAddress") + val networkDerivationsCount = networksConverter.filterWalletNetworkForRequest(chainId, wallet, account).size val context = WcMethodUseCaseContext( session = session, rawSdkRequest = request, network = walletNetwork, accountAddress = accountAddress, - networkDerivationsCount = networksConverter.filterWalletNetworkForRequest(chainId, wallet).size, + networkDerivationsCount = networkDerivationsCount, ) return when (method) { is WcSolanaMethod.SignMessage -> factories.messageSign.create(context, method) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcNetworksConverter.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcNetworksConverter.kt index a494eb772e..82a5b0beb2 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcNetworksConverter.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/utils/WcNetworksConverter.kt @@ -44,7 +44,11 @@ internal class WcNetworksConverter @Inject constructor( requestAddress: String, ): Network? { val wallet = session.wallet - val allCoinNetwork = filterWalletNetworkForRequest(request.chainId.orEmpty(), session.wallet) + val allCoinNetwork = filterWalletNetworkForRequest( + rawChainId = request.chainId.orEmpty(), + wallet = session.wallet, + account = session.account, + ) val requestNetwork = allCoinNetwork.find { network -> val address = getAddressForWC(wallet.walletId, network) @@ -56,13 +60,13 @@ internal class WcNetworksConverter @Inject constructor( /** * return network with not custom derivationPath or first custom or any */ - suspend fun mainOrAnyWalletNetworkForRequest(rawChainId: String, wallet: UserWallet): Network? { - val networks = filterWalletNetworkForRequest(rawChainId, wallet) + suspend fun mainOrAnyWalletNetworkForRequest(rawChainId: String, wallet: UserWallet, account: Account?): Network? { + val networks = filterWalletNetworkForRequest(rawChainId, wallet, account) return networks.firstOrNull { !isCustomCoin(it) } ?: networks.firstOrNull() } - suspend fun allAddressForChain(rawChainId: String, wallet: UserWallet): List { - return filterWalletNetworkForRequest(rawChainId, wallet) + suspend fun allAddressForChain(rawChainId: String, wallet: UserWallet, account: Account?): List { + return filterWalletNetworkForRequest(rawChainId, wallet, account) .mapNotNull { getAddressForWC(wallet.walletId, it)?.lowercase() } } @@ -80,13 +84,18 @@ internal class WcNetworksConverter @Inject constructor( /** * return all exist derivation networks */ - suspend fun filterWalletNetworkForRequest(rawChainId: String, wallet: UserWallet): List { - val walletNetworks = getWalletNetworks(wallet.walletId) + suspend fun filterWalletNetworkForRequest( + rawChainId: String, + wallet: UserWallet, + account: Account?, + ): List { + val portfolioNetworks = account?.let { getAccountNetworks(it.accountId) } + ?: getWalletNetworks(wallet.walletId) val blockchain = namespaceConverters .firstNotNullOfOrNull { it.toBlockchain(rawChainId) } ?: return listOf() - val allCoinNetwork = walletNetworks.filter { it.rawId == blockchain.id } + val allCoinNetwork = portfolioNetworks.filter { it.rawId == blockchain.id } return allCoinNetwork }