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,
sessionsManager: WcSessionsManager,
factories: WcEthNetwork.Factories,
walletManagersFacade: WalletManagersFacade,
wcNetworksConverter: WcNetworksConverter,
): WcEthNetwork = WcEthNetwork(
moshi = moshi,
networksConverter = wcNetworksConverter,
sessionsManager = sessionsManager,
factories = factories,
walletManagersFacade = walletManagersFacade,
)
@Provides
@ -165,24 +163,20 @@ internal object WalletConnectDataModule {
wcNetworksConverter: WcNetworksConverter,
sessionsManager: WcSessionsManager,
factories: WcSolanaNetwork.Factories,
walletManagersFacade: WalletManagersFacade,
): WcSolanaNetwork = WcSolanaNetwork(
moshi = moshi,
sessionsManager = sessionsManager,
factories = factories,
networksConverter = wcNetworksConverter,
walletManagersFacade = walletManagersFacade,
)
@Provides
@Singleton
fun caipNamespaceDelegate(
namespaceConverters: Set<@JvmSuppressWildcards WcNamespaceConverter>,
walletManagersFacade: WalletManagersFacade,
wcNetworksConverter: WcNetworksConverter,
): CaipNamespaceDelegate = CaipNamespaceDelegate(
namespaceConverters = namespaceConverters,
walletManagersFacade = walletManagersFacade,
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.repository.WcSessionsManager
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
import com.tangem.domain.walletmanager.WalletManagersFacade
import jakarta.inject.Inject
internal class WcEthNetwork(
@ -26,7 +25,6 @@ internal class WcEthNetwork(
private val sessionsManager: WcSessionsManager,
private val factories: Factories,
private val networksConverter: WcNetworksConverter,
private val walletManagersFacade: WalletManagersFacade,
) : WcRequestToUseCaseConverter {
override fun toWcMethodName(request: WcSdkSessionRequest): WcEthMethodName? {
@ -57,7 +55,7 @@ internal class WcEthNetwork(
is WcEthMethod.SwitchEthereumChain,
->
anyExistNetwork()
?.let { network -> walletManagersFacade.getDefaultAddress(wallet.walletId, network).orEmpty() }
?.let { network -> networksConverter.getAddressForWC(wallet.walletId, network).orEmpty() }
.orEmpty()
}
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.repository.WcSessionsManager
import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase
import com.tangem.domain.walletmanager.WalletManagersFacade
import jakarta.inject.Inject
internal class WcSolanaNetwork(
@ -30,7 +29,6 @@ internal class WcSolanaNetwork(
private val sessionsManager: WcSessionsManager,
private val factories: Factories,
private val networksConverter: WcNetworksConverter,
private val walletManagersFacade: WalletManagersFacade,
) : WcRequestToUseCaseConverter {
override fun toWcMethodName(request: WcSdkSessionRequest): WcSolanaMethodName? {
@ -52,7 +50,7 @@ internal class WcSolanaNetwork(
val chainId = request.chainId.orEmpty()
suspend fun anyExistNetwork() = networksConverter.mainOrAnyWalletNetworkForRequest(chainId, wallet)
suspend fun anyAddress() = anyExistNetwork()
?.let { network -> walletManagersFacade.getDefaultAddress(wallet.walletId, network).orEmpty() }
?.let { network -> networksConverter.getAddressForWC(wallet.walletId, network).orEmpty() }
.orEmpty()
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.wallet.UserWalletId
import com.tangem.domain.walletconnect.model.WcSessionApprove
import com.tangem.domain.walletmanager.WalletManagersFacade
internal class CaipNamespaceDelegate(
private val namespaceConverters: Set<WcNamespaceConverter>,
private val walletManagersFacade: WalletManagersFacade,
private val wcNetworksConverter: WcNetworksConverter,
) {
@ -36,7 +34,7 @@ internal class CaipNamespaceDelegate(
}
suspend fun createCAIP10(userWalletId: UserWalletId, network: Network): CAIP10? {
val address = walletManagersFacade.getDefaultAddress(userWalletId, network)
val address = wcNetworksConverter.getAddressForWC(userWalletId, network)
val chainId = allWcNetworks
.find { (wcNetwork, _) -> network.rawId == wcNetwork.rawId }
?.second

View file

@ -1,6 +1,9 @@
package com.tangem.data.walletconnect.utils
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.walletconnect.model.CAIP10
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 requestNetwork = allCoinNetwork.find { network ->
val address = walletManagersFacade.getDefaultAddress(wallet.walletId, network)
val address = getAddressForWC(wallet.walletId, network)
requestAddress.lowercase() == address?.lowercase()
}
return requestNetwork
@ -60,7 +63,18 @@ internal class WcNetworksConverter @Inject constructor(
suspend fun allAddressForChain(rawChainId: String, wallet: UserWallet): List<String> {
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
.filter { it.rawId == blockchain.id }
// find equal address
.firstOrNull {
val walletAddress = walletManagersFacade.getDefaultAddress(wallet.walletId, it)
.firstOrNull { network ->
val walletAddress = getAddressForWC(wallet.walletId, network)
walletAddress?.lowercase() == caip10.accountAddress.lowercase()
}
}

View file

@ -20,4 +20,8 @@ internal interface WcCommonTransactionModel {
fun showSuccessSignMessage(message: TextReference = resourceReference(R.string.wc_successfully_signed)) {
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 {
_uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = true)) }
useCase.approve().getOrNull()?.let {
showSuccessSignMessage()
showSuccessAddedMessage()
router.pop()
} ?: run {
_uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = false)) }