From 73344b92dcc143ce60c7dd55e3cbe6a48f64a635 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 7 May 2025 07:23:04 +0700 Subject: [PATCH] Updated on 2026-08-14 --- .../di/WalletConnectDataModule.kt | 48 +++++++++++---- .../network/ethereum/WcEthNetwork.kt | 47 ++++++++------- .../network/solana/WcSolanaNetwork.kt | 59 ++++++++++--------- .../pair/AssociateNetworksDelegate.kt | 20 ++++++- .../pair/DefaultWcPairUseCase.kt | 13 +--- .../sessions/DefaultWcSessionsManager.kt | 14 ++++- .../walletconnect/DefaultWcPairUseCaseTest.kt | 1 + .../domain/walletconnect/model/WcSession.kt | 2 + .../model/WcConnectedAppInfoModel.kt | 14 ++++- 9 files changed, 140 insertions(+), 78 deletions(-) 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 8d43fc1ebe..84a40f03e0 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 @@ -42,6 +42,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) +@Suppress("TooManyFunctions") internal object WalletConnectDataModule { @Provides @@ -86,6 +87,7 @@ internal object WalletConnectDataModule { dispatchers: CoroutineDispatcherProvider, legacyStore: WalletConnectSessionsRepository, getWallets: GetWalletsUseCase, + associateNetworks: AssociateNetworksDelegate, ): DefaultWcSessionsManager { val scope = CoroutineScope(SupervisorJob() + dispatchers.io) return DefaultWcSessionsManager( @@ -93,6 +95,7 @@ internal object WalletConnectDataModule { dispatchers = dispatchers, legacyStore = legacyStore, getWallets = getWallets, + associateNetworks = associateNetworks, scope = scope, ) } @@ -121,12 +124,12 @@ internal object WalletConnectDataModule { @Singleton fun wcEthNetwork( @SdkMoshi moshi: Moshi, - excludedBlockchains: ExcludedBlockchains, sessionsManager: WcSessionsManager, factories: WcEthNetwork.Factories, + namespaceConverter: WcEthNetwork.NamespaceConverter, ): WcEthNetwork = WcEthNetwork( moshi = moshi, - excludedBlockchains = excludedBlockchains, + namespaceConverter = namespaceConverter, sessionsManager = sessionsManager, factories = factories, ) @@ -135,7 +138,7 @@ internal object WalletConnectDataModule { @Singleton fun wcSolanaNetwork( @SdkMoshi moshi: Moshi, - excludedBlockchains: ExcludedBlockchains, + namespaceConverter: WcSolanaNetwork.NamespaceConverter, sessionsManager: WcSessionsManager, factories: WcSolanaNetwork.Factories, walletManager: UserWalletManager, @@ -143,28 +146,28 @@ internal object WalletConnectDataModule { moshi = moshi, sessionsManager = sessionsManager, factories = factories, - excludedBlockchains = excludedBlockchains, + namespaceConverter = namespaceConverter, walletManager = walletManager, ) @Provides @Singleton fun caipNamespaceDelegate( - diHelperBox: DiHelperBox, + namespaceConverters: Set<@JvmSuppressWildcards WcNamespaceConverter>, walletManagersFacade: WalletManagersFacade, ): CaipNamespaceDelegate = CaipNamespaceDelegate( - namespaceConverters = diHelperBox.converters, + namespaceConverters = namespaceConverters, walletManagersFacade = walletManagersFacade, ) @Provides @Singleton fun associateNetworksDelegate( - diHelperBox: DiHelperBox, + namespaceConverters: Set<@JvmSuppressWildcards WcNamespaceConverter>, getWallets: GetWalletsUseCase, currenciesRepository: CurrenciesRepository, ): AssociateNetworksDelegate = AssociateNetworksDelegate( - namespaceConverters = diHelperBox.converters, + namespaceConverters = namespaceConverters, getWallets = getWallets, currenciesRepository = currenciesRepository, ) @@ -176,10 +179,16 @@ internal object WalletConnectDataModule { ethNetwork, solanaNetwork, ), - converters = setOf( - ethNetwork, - solanaNetwork, - ), + ) + + @Provides + @Singleton + fun namespaceConverters( + ethNamespaceConverter: WcEthNetwork.NamespaceConverter, + solanaNamespaceConverter: WcSolanaNetwork.NamespaceConverter, + ): Set<@JvmSuppressWildcards WcNamespaceConverter> = setOf( + ethNamespaceConverter, + solanaNamespaceConverter, ) @Provides @@ -188,6 +197,20 @@ internal object WalletConnectDataModule { return DefaultWcRequestUseCaseFactory(diHelperBox.handlers) } + @Provides + @Singleton + fun wcEthNetworkNamespaceConverter(excludedBlockchains: ExcludedBlockchains): WcEthNetwork.NamespaceConverter { + return WcEthNetwork.NamespaceConverter(excludedBlockchains) + } + + @Provides + @Singleton + fun wcSolanaNetworkNamespaceConverter( + excludedBlockchains: ExcludedBlockchains, + ): WcSolanaNetwork.NamespaceConverter { + return WcSolanaNetwork.NamespaceConverter(excludedBlockchains) + } + @Provides @Singleton fun providesWcDisconnectUseCase(sessionsManager: WcSessionsManager): WcDisconnectUseCase { @@ -195,7 +218,6 @@ internal object WalletConnectDataModule { } internal class DiHelperBox( - val converters: Set, val handlers: Set, ) } \ No newline at end of file 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 175f715409..5dda26b898 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 @@ -22,12 +22,10 @@ import jakarta.inject.Inject internal class WcEthNetwork( private val moshi: Moshi, - private val excludedBlockchains: ExcludedBlockchains, private val sessionsManager: WcSessionsManager, private val factories: Factories, -) : WcRequestToUseCaseConverter, WcNamespaceConverter { - - override val namespaceKey: NamespaceKey = NamespaceKey("eip155") + private val namespaceConverter: NamespaceConverter, +) : WcRequestToUseCaseConverter { override fun toWcMethodName(request: WcSdkSessionRequest): WcEthMethodName? { val methodKey = request.request.method @@ -39,7 +37,7 @@ internal class WcEthNetwork( val name = toWcMethodName(request) ?: return null 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 network = namespaceConverter.toNetwork(request.chainId.orEmpty(), session.wallet) ?: return null val accountAddress = when (method) { is WcEthMethod.MessageSign -> method.account is WcEthMethod.SendTransaction -> method.transaction.from @@ -100,24 +98,31 @@ internal class WcEthNetwork( return WcEthMethod.SignTypedData(params = params, account = account, dataForSign = data) } - override fun toNetwork(chainId: String, wallet: UserWallet): Network? { - return toNetwork(chainId, wallet, excludedBlockchains) - } + internal class NamespaceConverter constructor( + private val excludedBlockchains: ExcludedBlockchains, + ) : WcNamespaceConverter { - override fun toBlockchain(chainId: CAIP2): Blockchain? { - if (chainId.namespace != namespaceKey.key) return null - val ethChainId = chainId.reference.toIntOrNull() ?: return null - return Blockchain.fromChainId(ethChainId) - } + override val namespaceKey: NamespaceKey = NamespaceKey("eip155") - override fun toCAIP2(network: Network): CAIP2? { - val blockchain = Blockchain.fromId(network.id.value) - if (!blockchain.isEvm()) return null - val chainId = blockchain.getChainId() ?: return null - return CAIP2( - namespace = namespaceKey.key, - reference = chainId.toString(), - ) + override fun toNetwork(chainId: String, wallet: UserWallet): Network? { + return toNetwork(chainId, wallet, excludedBlockchains) + } + + override fun toBlockchain(chainId: CAIP2): Blockchain? { + if (chainId.namespace != namespaceKey.key) return null + val ethChainId = chainId.reference.toIntOrNull() ?: return null + return Blockchain.fromChainId(ethChainId) + } + + override fun toCAIP2(network: Network): CAIP2? { + val blockchain = Blockchain.fromId(network.id.value) + if (!blockchain.isEvm()) return null + val chainId = blockchain.getChainId() ?: return null + return CAIP2( + namespace = namespaceKey.key, + reference = chainId.toString(), + ) + } } internal class Factories @Inject constructor( 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 275c995ecf..21cc7cb152 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 @@ -26,11 +26,9 @@ internal class WcSolanaNetwork( private val moshi: Moshi, private val sessionsManager: WcSessionsManager, private val factories: Factories, - private val excludedBlockchains: ExcludedBlockchains, + private val namespaceConverter: NamespaceConverter, private val walletManager: UserWalletManager, -) : WcNamespaceConverter, WcRequestToUseCaseConverter { - - override val namespaceKey: NamespaceKey = NamespaceKey("solana") +) : WcRequestToUseCaseConverter { override fun toWcMethodName(request: WcSdkSessionRequest): WcSolanaMethodName? { val methodKey = request.request.method @@ -42,7 +40,7 @@ internal class WcSolanaNetwork( val name = toWcMethodName(request) ?: return null 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 network = namespaceConverter.toNetwork(request.chainId.orEmpty(), session.wallet) ?: return null val accountAddress = getAccountAddress(network) val context = WcMethodUseCaseContext( session = session, @@ -66,31 +64,38 @@ internal class WcSolanaNetwork( } } - override fun toBlockchain(chainId: CAIP2): Blockchain? { - if (chainId.namespace != namespaceKey.key) return null - return when (chainId.reference) { - MAINNET_CHAIN_ID -> Blockchain.Solana - TESTNET_CHAIN_ID -> Blockchain.SolanaTestnet - else -> null - } - } + internal class NamespaceConverter @Inject constructor( + private val excludedBlockchains: ExcludedBlockchains, + ) : WcNamespaceConverter { - override fun toNetwork(chainId: String, wallet: UserWallet): Network? { - return toNetwork(chainId, wallet, excludedBlockchains) - } + override val namespaceKey: NamespaceKey = NamespaceKey("solana") - override fun toCAIP2(network: Network): CAIP2? { - val blockchain = Blockchain.fromId(network.id.value) - val chainId = when (blockchain) { - Blockchain.Solana -> MAINNET_CHAIN_ID - Blockchain.SolanaTestnet -> TESTNET_CHAIN_ID - else -> null + override fun toBlockchain(chainId: CAIP2): Blockchain? { + if (chainId.namespace != namespaceKey.key) return null + return when (chainId.reference) { + MAINNET_CHAIN_ID -> Blockchain.Solana + TESTNET_CHAIN_ID -> Blockchain.SolanaTestnet + else -> null + } + } + + override fun toNetwork(chainId: String, wallet: UserWallet): Network? { + return toNetwork(chainId, wallet, excludedBlockchains) + } + + override fun toCAIP2(network: Network): CAIP2? { + val blockchain = Blockchain.fromId(network.id.value) + val chainId = when (blockchain) { + Blockchain.Solana -> MAINNET_CHAIN_ID + Blockchain.SolanaTestnet -> TESTNET_CHAIN_ID + else -> null + } + chainId ?: return null + return CAIP2( + namespace = namespaceKey.key, + reference = chainId, + ) } - chainId ?: return null - return CAIP2( - namespace = namespaceKey.key, - reference = chainId, - ) } private fun WcSolanaMethodName.toMethod(request: WcSdkSessionRequest): WcSolanaMethod? { diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt index 15ffca4caf..04906abf44 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/AssociateNetworksDelegate.kt @@ -1,6 +1,7 @@ package com.tangem.data.walletconnect.pair import com.reown.walletkit.client.Wallet +import com.reown.walletkit.client.Wallet.Model.Namespace import com.tangem.data.walletconnect.utils.WcNamespaceConverter import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network @@ -16,6 +17,16 @@ internal class AssociateNetworksDelegate constructor( private val currenciesRepository: CurrenciesRepository, ) { + suspend fun associate(wallet: UserWallet, namespaces: Map): Set { + val walletNetworks = getWalletNetworks(wallet) + val namespacesSet = namespaces.values.flatMap { proposal -> proposal.chains ?: listOf() }.toSet() + return namespacesSet.mapNotNullTo(mutableSetOf()) { chainId -> + val wcNetwork = namespaceConverters + .firstNotNullOfOrNull { it.toNetwork(chainId, wallet) } ?: return@mapNotNullTo null + walletNetworks.find { network -> wcNetwork.id == network.id } + } + } + @Throws(WcPairError.UnsupportedNetworks::class) suspend fun associate(sessionProposal: Wallet.Model.SessionProposal): Map { val userWallets = getWallets.invokeSync().filter { it.isMultiCurrency } @@ -31,9 +42,7 @@ internal class AssociateNetworksDelegate constructor( requiredNamespaces: Set, optionalNamespaces: Set, ): ProposalNetwork { - val walletNetworks = currenciesRepository.getMultiCurrencyWalletCurrenciesSync(wallet.walletId) - .filterIsInstance() - .map { it.network } + val walletNetworks = getWalletNetworks(wallet) val unknownRequired = mutableSetOf() val missingRequired = mutableSetOf() @@ -74,6 +83,11 @@ internal class AssociateNetworksDelegate constructor( ) } + private suspend fun getWalletNetworks(wallet: UserWallet): List = + currenciesRepository.getMultiCurrencyWalletCurrenciesSync(wallet.walletId) + .filterIsInstance() + .map { it.network } + private fun Map.setOfChainId(): Set = this.values.flatMap { proposal -> proposal.chains ?: listOf() }.toSet() diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt index fc91e5eefe..5bcbce241a 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/pair/DefaultWcPairUseCase.kt @@ -14,7 +14,6 @@ import com.tangem.domain.walletconnect.model.sdkcopy.WcAppMetaData import com.tangem.domain.walletconnect.repository.WcSessionsManager import com.tangem.domain.walletconnect.usecase.pair.WcPairState import com.tangem.domain.walletconnect.usecase.pair.WcPairUseCase -import com.tangem.domain.wallets.models.UserWallet import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -78,9 +77,11 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( sessionForApprove = sessionForApprove, sdkSessionProposal = sdkSessionProposal, ).map { settledSession -> - val newSession = settledSession.session.toDomain( + val newSession = WcSession( wallet = sessionForApprove.wallet, + sdkModel = WcSdkSessionConverter.convert(settledSession.session), securityStatus = proposalState.dAppSession.securityStatus, + networks = sessionForApprove.network.toSet(), ) sessionsManager.saveSession(newSession) newSession @@ -141,14 +142,6 @@ internal class DefaultWcPairUseCase @AssistedInject constructor( } },) - private fun Wallet.Model.Session.toDomain(wallet: UserWallet, securityStatus: CheckDAppResult): WcSession { - return WcSession( - wallet = wallet, - sdkModel = WcSdkSessionConverter.convert(this), - securityStatus = securityStatus, - ) - } - private sealed interface TerminalAction { data class Approve(val sessionForApprove: WcSessionApprove) : TerminalAction data object Reject : TerminalAction diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt index 98e554f3fe..1c537ef70d 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt @@ -6,6 +6,7 @@ import arrow.core.right import com.domain.blockaid.models.dapp.CheckDAppResult import com.reown.walletkit.client.Wallet import com.reown.walletkit.client.WalletKit +import com.tangem.data.walletconnect.pair.AssociateNetworksDelegate import com.tangem.data.walletconnect.utils.WcSdkObserver import com.tangem.data.walletconnect.utils.WcSdkSessionConverter import com.tangem.datasource.local.walletconnect.WalletConnectStore @@ -29,6 +30,7 @@ internal class DefaultWcSessionsManager( private val legacyStore: WalletConnectSessionsRepository, private val getWallets: GetWalletsUseCase, private val dispatchers: CoroutineDispatcherProvider, + private val associateNetworks: AssociateNetworksDelegate, private val scope: CoroutineScope, ) : WcSessionsManager, WcSdkObserver { @@ -76,10 +78,12 @@ internal class DefaultWcSessionsManager( ?: return@withContext null val sdkSession = WalletKit.getActiveSessionByTopic(topic) ?: return@withContext null val wallet = storedSession.wallet + val networks = associateNetworks.associate(wallet, sdkSession.namespaces) WcSession( wallet = wallet, sdkModel = WcSdkSessionConverter.convert(sdkSession), securityStatus = storedSession.securityStatus, + networks = networks, ) } @@ -114,7 +118,7 @@ internal class DefaultWcSessionsManager( return mustSaveInNewStore.isNotEmpty() } - private fun associate( + private suspend fun associate( inSdk: List, inStore: Set, wallets: List, @@ -122,7 +126,13 @@ internal class DefaultWcSessionsManager( val wcSessions = inStore.mapNotNull { session -> val wallet = wallets.find { it.walletId == session.walletId } ?: return@mapNotNull null val sdkSession = inSdk.find { it.topic == session.topic } ?: return@mapNotNull null - WcSession(wallet = wallet, sdkModel = WcSdkSessionConverter.convert(sdkSession), session.securityStatus) + val networks = associateNetworks.associate(wallet, sdkSession.namespaces) + WcSession( + wallet = wallet, + sdkModel = WcSdkSessionConverter.convert(sdkSession), + securityStatus = session.securityStatus, + networks = networks, + ) } return wcSessions } diff --git a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt index 9b0b650724..6a86ee96f2 100644 --- a/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt +++ b/data/wallet-connect/src/test/kotlin/com/tangem/domain/walletconnect/DefaultWcPairUseCaseTest.kt @@ -92,6 +92,7 @@ internal class DefaultWcPairUseCaseTest { wallet = sessionForApprove.wallet, sdkModel = WcSdkSessionConverter.convert(this), securityStatus = CheckDAppResult.SAFE, + networks = setOf(), ) private fun useCaseFactory() = DefaultWcPairUseCase( diff --git a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt index d3707d52f6..a2b1449d45 100644 --- a/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt +++ b/domain/wallet-connect/models/src/main/java/com/tangem/domain/walletconnect/model/WcSession.kt @@ -1,11 +1,13 @@ package com.tangem.domain.walletconnect.model import com.domain.blockaid.models.dapp.CheckDAppResult +import com.tangem.domain.tokens.model.Network import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSession import com.tangem.domain.wallets.models.UserWallet data class WcSession( val wallet: UserWallet, + val networks: Set, val sdkModel: WcSdkSession, val securityStatus: CheckDAppResult, ) \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt index 6126b5f404..a751963826 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcConnectedAppInfoModel.kt @@ -6,6 +6,7 @@ import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.ui.extensions.iconResId import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.message.SnackbarMessage import com.tangem.domain.walletconnect.model.WcSession @@ -13,9 +14,10 @@ import com.tangem.domain.walletconnect.usecase.WcSessionsUseCase import com.tangem.domain.walletconnect.usecase.disconnect.WcDisconnectUseCase import com.tangem.features.walletconnect.connections.components.WcConnectedAppInfoComponent import com.tangem.features.walletconnect.connections.entity.WcConnectedAppInfoUM +import com.tangem.features.walletconnect.connections.entity.WcNetworkInfoItem import com.tangem.features.walletconnect.connections.entity.WcPrimaryButtonConfig import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -56,7 +58,15 @@ internal class WcConnectedAppInfoModel @Inject constructor( isVerified = session.securityStatus == CheckDAppResult.SAFE, appSubtitle = session.sdkModel.appMetaData.description, walletName = session.wallet.name, - networks = persistentListOf(), // TODO(wc): Nikolai & Doston: Where to find networks??? + networks = session.networks + .map { + WcNetworkInfoItem( + id = it.id.value, + icon = it.iconResId, + name = it.name, + symbol = it.currencySymbol, + ) + }.toImmutableList(), disconnectButtonConfig = WcPrimaryButtonConfig( showProgress = false, enabled = true,