Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-12 19:07:37 +07:00
parent 0d3a9692e2
commit afa13d836e
7 changed files with 26 additions and 20 deletions

View file

@ -148,14 +148,12 @@ internal object WalletConnectDataModule {
@SdkMoshi moshi: Moshi, @SdkMoshi moshi: Moshi,
sessionsManager: WcSessionsManager, sessionsManager: WcSessionsManager,
factories: WcEthNetwork.Factories, factories: WcEthNetwork.Factories,
walletManagersFacade: WalletManagersFacade,
wcNetworksConverter: WcNetworksConverter, wcNetworksConverter: WcNetworksConverter,
): WcEthNetwork = WcEthNetwork( ): WcEthNetwork = WcEthNetwork(
moshi = moshi, moshi = moshi,
networksConverter = wcNetworksConverter, networksConverter = wcNetworksConverter,
sessionsManager = sessionsManager, sessionsManager = sessionsManager,
factories = factories, factories = factories,
walletManagersFacade = walletManagersFacade,
) )
@Provides @Provides
@ -165,24 +163,20 @@ internal object WalletConnectDataModule {
wcNetworksConverter: WcNetworksConverter, wcNetworksConverter: WcNetworksConverter,
sessionsManager: WcSessionsManager, sessionsManager: WcSessionsManager,
factories: WcSolanaNetwork.Factories, factories: WcSolanaNetwork.Factories,
walletManagersFacade: WalletManagersFacade,
): WcSolanaNetwork = WcSolanaNetwork( ): WcSolanaNetwork = WcSolanaNetwork(
moshi = moshi, moshi = moshi,
sessionsManager = sessionsManager, sessionsManager = sessionsManager,
factories = factories, factories = factories,
networksConverter = wcNetworksConverter, networksConverter = wcNetworksConverter,
walletManagersFacade = walletManagersFacade,
) )
@Provides @Provides
@Singleton @Singleton
fun caipNamespaceDelegate( fun caipNamespaceDelegate(
namespaceConverters: Set<@JvmSuppressWildcards WcNamespaceConverter>, namespaceConverters: Set<@JvmSuppressWildcards WcNamespaceConverter>,
walletManagersFacade: WalletManagersFacade,
wcNetworksConverter: WcNetworksConverter, wcNetworksConverter: WcNetworksConverter,
): CaipNamespaceDelegate = CaipNamespaceDelegate( ): CaipNamespaceDelegate = CaipNamespaceDelegate(
namespaceConverters = namespaceConverters, namespaceConverters = namespaceConverters,
walletManagersFacade = walletManagersFacade,
wcNetworksConverter = wcNetworksConverter, wcNetworksConverter = wcNetworksConverter,
) )

View file

@ -18,7 +18,6 @@ import com.tangem.domain.walletconnect.model.*
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.domain.walletconnect.repository.WcSessionsManager import com.tangem.domain.walletconnect.repository.WcSessionsManager
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
import com.tangem.domain.walletmanager.WalletManagersFacade
import jakarta.inject.Inject import jakarta.inject.Inject
internal class WcEthNetwork( internal class WcEthNetwork(
@ -26,7 +25,6 @@ internal class WcEthNetwork(
private val sessionsManager: WcSessionsManager, private val sessionsManager: WcSessionsManager,
private val factories: Factories, private val factories: Factories,
private val networksConverter: WcNetworksConverter, private val networksConverter: WcNetworksConverter,
private val walletManagersFacade: WalletManagersFacade,
) : WcRequestToUseCaseConverter { ) : WcRequestToUseCaseConverter {
override fun toWcMethodName(request: WcSdkSessionRequest): WcEthMethodName? { override fun toWcMethodName(request: WcSdkSessionRequest): WcEthMethodName? {
@ -57,7 +55,7 @@ internal class WcEthNetwork(
is WcEthMethod.SwitchEthereumChain, is WcEthMethod.SwitchEthereumChain,
-> ->
anyExistNetwork() anyExistNetwork()
?.let { network -> walletManagersFacade.getDefaultAddress(wallet.walletId, network).orEmpty() } ?.let { network -> networksConverter.getAddressForWC(wallet.walletId, network).orEmpty() }
.orEmpty() .orEmpty()
} }
val walletNetwork = when (method) { val walletNetwork = when (method) {

View file

@ -22,7 +22,6 @@ import com.tangem.domain.walletconnect.model.WcSolanaMethodName
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.domain.walletconnect.repository.WcSessionsManager import com.tangem.domain.walletconnect.repository.WcSessionsManager
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
import com.tangem.domain.walletmanager.WalletManagersFacade
import jakarta.inject.Inject import jakarta.inject.Inject
internal class WcSolanaNetwork( internal class WcSolanaNetwork(
@ -30,7 +29,6 @@ internal class WcSolanaNetwork(
private val sessionsManager: WcSessionsManager, private val sessionsManager: WcSessionsManager,
private val factories: Factories, private val factories: Factories,
private val networksConverter: WcNetworksConverter, private val networksConverter: WcNetworksConverter,
private val walletManagersFacade: WalletManagersFacade,
) : WcRequestToUseCaseConverter { ) : WcRequestToUseCaseConverter {
override fun toWcMethodName(request: WcSdkSessionRequest): WcSolanaMethodName? { override fun toWcMethodName(request: WcSdkSessionRequest): WcSolanaMethodName? {
@ -52,7 +50,7 @@ internal class WcSolanaNetwork(
val chainId = request.chainId.orEmpty() val chainId = request.chainId.orEmpty()
suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest(chainId, wallet) suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest(chainId, wallet)
suspend fun anyAddress() = anyExistNetwork() suspend fun anyAddress() = anyExistNetwork()
?.let { network -> walletManagersFacade.getDefaultAddress(wallet.walletId, network).orEmpty() } ?.let { network -> networksConverter.getAddressForWC(wallet.walletId, network).orEmpty() }
.orEmpty() .orEmpty()
val accountAddress = when (method) { val accountAddress = when (method) {

View file

@ -9,11 +9,9 @@ import com.tangem.data.walletconnect.utils.WcNetworksConverter
import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.walletconnect.model.WcSessionApprove import com.tangem.domain.walletconnect.model.WcSessionApprove
import com.tangem.domain.walletmanager.WalletManagersFacade
internal class CaipNamespaceDelegate( internal class CaipNamespaceDelegate(
private val namespaceConverters: Set<WcNamespaceConverter>, private val namespaceConverters: Set<WcNamespaceConverter>,
private val walletManagersFacade: WalletManagersFacade,
private val wcNetworksConverter: WcNetworksConverter, private val wcNetworksConverter: WcNetworksConverter,
) { ) {
@ -36,7 +34,7 @@ internal class CaipNamespaceDelegate(
} }
suspend fun createCAIP10(userWalletId: UserWalletId, network: Network): CAIP10? { suspend fun createCAIP10(userWalletId: UserWalletId, network: Network): CAIP10? {
val address = walletManagersFacade.getDefaultAddress(userWalletId, network) val address = wcNetworksConverter.getAddressForWC(userWalletId, network)
val chainId = allWcNetworks val chainId = allWcNetworks
.find { (wcNetwork, _) -> network.rawId == wcNetwork.rawId } .find { (wcNetwork, _) -> network.rawId == wcNetwork.rawId }
?.second ?.second

View file

@ -1,6 +1,9 @@
package com.tangem.data.walletconnect.utils package com.tangem.data.walletconnect.utils
import com.reown.walletkit.client.Wallet import com.reown.walletkit.client.Wallet
import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchain.common.address.AddressType
import com.tangem.blockchainsdk.utils.toBlockchain
import com.tangem.data.common.currency.isCustomCoin import com.tangem.data.common.currency.isCustomCoin
import com.tangem.data.walletconnect.model.CAIP10 import com.tangem.data.walletconnect.model.CAIP10
import com.tangem.domain.account.producer.SingleAccountProducer import com.tangem.domain.account.producer.SingleAccountProducer
@ -44,7 +47,7 @@ internal class WcNetworksConverter @Inject constructor(
val allCoinNetwork = filterWalletNetworkForRequest(request.chainId.orEmpty(), session.wallet) val allCoinNetwork = filterWalletNetworkForRequest(request.chainId.orEmpty(), session.wallet)
val requestNetwork = allCoinNetwork.find { network -> val requestNetwork = allCoinNetwork.find { network ->
val address = walletManagersFacade.getDefaultAddress(wallet.walletId, network) val address = getAddressForWC(wallet.walletId, network)
requestAddress.lowercase() == address?.lowercase() requestAddress.lowercase() == address?.lowercase()
} }
return requestNetwork return requestNetwork
@ -60,7 +63,18 @@ internal class WcNetworksConverter @Inject constructor(
suspend fun allAddressForChain(rawChainId: String, wallet: UserWallet): List<String> { suspend fun allAddressForChain(rawChainId: String, wallet: UserWallet): List<String> {
return filterWalletNetworkForRequest(rawChainId, wallet) return filterWalletNetworkForRequest(rawChainId, wallet)
.mapNotNull { walletManagersFacade.getDefaultAddress(wallet.walletId, it)?.lowercase() } .mapNotNull { getAddressForWC(wallet.walletId, it)?.lowercase() }
}
suspend fun getAddressForWC(userWalletId: UserWalletId, network: Network): String? {
return when (network.toBlockchain()) {
Blockchain.XDC,
Blockchain.XDCTestnet,
-> walletManagersFacade.getAddresses(userWalletId, network)
.find { address -> address.type == AddressType.Legacy }
?.value
else -> walletManagersFacade.getDefaultAddress(userWalletId, network)
}
} }
/** /**
@ -94,8 +108,8 @@ internal class WcNetworksConverter @Inject constructor(
// find all derivation // find all derivation
.filter { it.rawId == blockchain.id } .filter { it.rawId == blockchain.id }
// find equal address // find equal address
.firstOrNull { .firstOrNull { network ->
val walletAddress = walletManagersFacade.getDefaultAddress(wallet.walletId, it) val walletAddress = getAddressForWC(wallet.walletId, network)
walletAddress?.lowercase() == caip10.accountAddress.lowercase() walletAddress?.lowercase() == caip10.accountAddress.lowercase()
} }
} }

View file

@ -20,4 +20,8 @@ internal interface WcCommonTransactionModel {
fun showSuccessSignMessage(message: TextReference = resourceReference(R.string.wc_successfully_signed)) { fun showSuccessSignMessage(message: TextReference = resourceReference(R.string.wc_successfully_signed)) {
messageSender.send(ToastMessage(message = message)) messageSender.send(ToastMessage(message = message))
} }
fun showSuccessAddedMessage(message: TextReference = resourceReference(R.string.common_added)) {
messageSender.send(ToastMessage(message = message))
}
} }

View file

@ -111,7 +111,7 @@ internal class WcAddNetworkModel @Inject constructor(
modelScope.launch { modelScope.launch {
_uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = true)) } _uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = true)) }
useCase.approve().getOrNull()?.let { useCase.approve().getOrNull()?.let {
showSuccessSignMessage() showSuccessAddedMessage()
router.pop() router.pop()
} ?: run { } ?: run {
_uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = false)) } _uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = false)) }