diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/NetworksStatusesStoreModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/NetworksStatusesStoreModule.kt deleted file mode 100644 index f0cabaf025..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/di/NetworksStatusesStoreModule.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.tangem.datasource.di - -import android.content.Context -import androidx.datastore.core.DataStore -import androidx.datastore.core.DataStoreFactory -import androidx.datastore.dataStoreFile -import com.squareup.moshi.Moshi -import com.tangem.datasource.local.datastore.RuntimeDataStore -import com.tangem.datasource.local.network.DefaultNetworksStatusesStore -import com.tangem.datasource.local.network.NetworksStatusesStore -import com.tangem.datasource.local.network.entity.NetworkStatusDM -import com.tangem.datasource.utils.MoshiDataStoreSerializer -import com.tangem.datasource.utils.mapWithStringKeyTypes -import com.tangem.datasource.utils.setTypes -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.SupervisorJob -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -internal object NetworksStatusesStoreModule { - - @Singleton - @Provides - fun providePersistenceNetworksStatusesStore( - @NetworkMoshi moshi: Moshi, - @ApplicationContext context: Context, - dispatchers: CoroutineDispatcherProvider, - ): DataStore>> { - return DataStoreFactory.create( - serializer = MoshiDataStoreSerializer( - moshi = moshi, - types = mapWithStringKeyTypes(valueTypes = setTypes()), - defaultValue = emptyMap(), - ), - produceFile = { context.dataStoreFile(fileName = "networks_statuses") }, - scope = CoroutineScope(context = dispatchers.io + SupervisorJob()), - ) - } - - @Singleton - @Provides - fun provideNetworksStatusesStore( - persistenceNetworksStatusesStore: DataStore>>, - ): NetworksStatusesStore { - return DefaultNetworksStatusesStore( - runtimeDataStore = RuntimeDataStore(), - persistenceDataStore = persistenceNetworksStatusesStore, - ) - } -} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/DefaultNetworksStatusesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/network/DefaultNetworksStatusesStore.kt deleted file mode 100644 index b31620f4a4..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/DefaultNetworksStatusesStore.kt +++ /dev/null @@ -1,201 +0,0 @@ -package com.tangem.datasource.local.network - -import androidx.datastore.core.DataStore -import com.tangem.datasource.local.datastore.RuntimeDataStore -import com.tangem.datasource.local.network.converter.NetworkDerivationPathConverter -import com.tangem.datasource.local.network.converter.NetworkStatusConverter -import com.tangem.datasource.local.network.converter.NetworkStatusDataModelConverter -import com.tangem.datasource.local.network.entity.NetworkStatusDM -import com.tangem.domain.models.StatusSource -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.tokens.model.NetworkStatus -import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.utils.extensions.addOrReplace -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.flow.* -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock - -private typealias NetworkStatusesByWalletId = Map> - -internal class DefaultNetworksStatusesStore( - private val runtimeDataStore: RuntimeDataStore>, - private val persistenceDataStore: DataStore, -) : NetworksStatusesStore { - - private val mutex = Mutex() - - override fun get(key: UserWalletId): Flow> { - return runtimeDataStore.get(provideStringKey(key)) - } - - override fun get(key: UserWalletId, networks: Set): Flow> = channelFlow { - val cachedStatuses = persistenceDataStore.data.firstOrNull() - ?.get(key.stringValue) - ?.mapNotNullTo(mutableSetOf()) { cached -> - val network = networks.firstOrNull { - it.id == cached.networkId && - it.derivationPath == NetworkDerivationPathConverter.convert(cached.derivationPath) - } - ?: return@mapNotNullTo null - - NetworkStatusConverter(network = network, isCached = true).convert(value = cached) - } - .orEmpty() - - if (cachedStatuses.isNotEmpty()) { - send(cachedStatuses) - } - - runtimeDataStore.get(provideStringKey(key)) - .onEach { runtimeStatuses -> - val mergedStatuses = mergeStatuses( - networks = networks, - cachedStatuses = cachedStatuses, - runtimeStatuses = runtimeStatuses, - ) - - send(mergedStatuses) - } - .launchIn(scope = this) - } - - override suspend fun getSyncOrNull(key: UserWalletId): Set? { - val runtimeStatuses = runtimeDataStore.getSyncOrNull(key = provideStringKey(key)) ?: return null - - val networks = runtimeStatuses.map(NetworkStatus::network).toSet() - - val cachedStatuses = persistenceDataStore.data.firstOrNull() - ?.get(key.stringValue) - ?.mapNotNullTo(mutableSetOf()) { cached -> - val network = networks.firstOrNull { - it.id == cached.networkId && - it.derivationPath == NetworkDerivationPathConverter.convert(cached.derivationPath) - } - ?: return@mapNotNullTo null - - NetworkStatusConverter(network = network, isCached = true).convert(value = cached) - } - .orEmpty() - - return mergeStatuses( - networks = networks, - cachedStatuses = cachedStatuses, - runtimeStatuses = runtimeStatuses, - ) - } - - override suspend fun store(key: UserWalletId, value: NetworkStatus) { - storeAll(key = key, values = setOf(value)) - } - - override suspend fun storeAll(key: UserWalletId, values: Set) { - mutex.withLock { - coroutineScope { - launch { storeInRuntimeStore(key = key, statuses = values) } - launch { storeInPersistenceStore(userWalletId = key, statuses = values) } - } - } - } - - override suspend fun refresh(key: UserWalletId, networks: Set) { - mutex.withLock { - val currentStatuses = getSyncOrNull(key).orEmpty() - - storeInRuntimeStore( - key = key, - statuses = networks.mapNotNullTo(hashSetOf()) { network -> - val status = currentStatuses.firstOrNull { - it.network.id == network.id && it.network.derivationPath == network.derivationPath - } ?: return@mapNotNullTo null - - status.copy( - value = status.value.copySealed(source = StatusSource.CACHE), - ) - }, - ) - } - } - - /** - * Merge [cachedStatuses] with [runtimeStatuses] - * The resulting set contains statuses from both sets. - * If a status with the same network is in both sets, the status from [runtimeStatuses] is used. - */ - private fun mergeStatuses( - networks: Set, - cachedStatuses: Set, - runtimeStatuses: Set, - ): Set { - return networks.mapNotNullTo(hashSetOf()) { network -> - val runtimeStatus = runtimeStatuses.firstOrNull { it.network == network } - - if (runtimeStatus == null) { - getCachedStatusIfPossible( - cachedStatuses = cachedStatuses, - network = network, - source = StatusSource.CACHE, - ) - } else if (runtimeStatus.value is NetworkStatus.Unreachable) { - getCachedStatusIfPossible( - cachedStatuses = cachedStatuses, - network = network, - source = StatusSource.ONLY_CACHE, - ) - ?: runtimeStatus - } else { - runtimeStatus - } - } - } - - private fun getCachedStatusIfPossible( - cachedStatuses: Set, - network: Network, - source: StatusSource, - ): NetworkStatus? { - val cached = cachedStatuses.firstOrNull { it.network == network } ?: return null - - val updatedCachedStatus = when (val status = cached.value) { - is NetworkStatus.NoAccount -> status.copy(source = source) - is NetworkStatus.Verified -> status.copy(source = source) - is NetworkStatus.Unreachable, - is NetworkStatus.MissedDerivation, - -> null - } - - return if (updatedCachedStatus != null) { - cached.copy(value = updatedCachedStatus) - } else { - null - } - } - - private suspend fun storeInRuntimeStore(key: UserWalletId, statuses: Set) { - val updatedValues = getSyncOrNull(key).orEmpty() - .addOrReplace(items = statuses) { prev, new -> prev.network == new.network } - - runtimeDataStore.store(key = provideStringKey(key), value = updatedValues) - } - - private suspend fun storeInPersistenceStore(userWalletId: UserWalletId, statuses: Set) { - // Converter will return null if the network status is not supported - val newStatuses = NetworkStatusDataModelConverter.convertSet(input = statuses).filterNotNull().toSet() - - persistenceDataStore.updateData { storedStatuses -> - storedStatuses.toMutableMap().apply { - val updatedValues = this[userWalletId.stringValue].orEmpty() - .addOrReplace(newStatuses) { prev, new -> - prev.networkId == new.networkId && prev.derivationPath == new.derivationPath - } - - this[userWalletId.stringValue] = updatedValues - } - } - } - - private fun provideStringKey(key: UserWalletId): String { - return "network_statuses_${key.stringValue}" - } -} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/NetworksStatusesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/network/NetworksStatusesStore.kt deleted file mode 100644 index a1d92c60cc..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/NetworksStatusesStore.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.tangem.datasource.local.network - -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.tokens.model.NetworkStatus -import com.tangem.domain.wallets.models.UserWalletId -import kotlinx.coroutines.flow.Flow - -interface NetworksStatusesStore { - - fun get(key: UserWalletId): Flow> - - fun get(key: UserWalletId, networks: Set): Flow> - - suspend fun getSyncOrNull(key: UserWalletId): Set? - - suspend fun store(key: UserWalletId, value: NetworkStatus) - - suspend fun storeAll(key: UserWalletId, values: Set) - - suspend fun refresh(key: UserWalletId, networks: Set) -} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkStatusConverter.kt b/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkStatusConverter.kt deleted file mode 100644 index f0a01555bf..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkStatusConverter.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.tangem.datasource.local.network.converter - -import com.tangem.datasource.local.network.entity.NetworkStatusDM -import com.tangem.domain.models.StatusSource -import com.tangem.domain.tokens.model.Network -import com.tangem.domain.tokens.model.NetworkStatus -import com.tangem.utils.converter.Converter - -/** - * Converter from [NetworkStatusDM] to [NetworkStatus] - * - * @property network network - * @property isCached flag that determines whether the status is a cache - * -[REDACTED_AUTHOR] - */ -internal class NetworkStatusConverter( - private val network: Network, - private val isCached: Boolean, -) : Converter { - - override fun convert(value: NetworkStatusDM): NetworkStatus { - val address = NetworkAddressConverter(selectedAddress = value.selectedAddress) - .convert(value = value.availableAddresses) - - val status = when (value) { - is NetworkStatusDM.Verified -> { - NetworkStatus.Verified( - address = address, - amounts = NetworkAmountsConverter.convert(value = value.amounts), - pendingTransactions = mapOf(), - source = if (isCached) StatusSource.CACHE else StatusSource.ACTUAL, - ) - } - is NetworkStatusDM.NoAccount -> { - NetworkStatus.NoAccount( - address = address, - amountToCreateAccount = value.amountToCreateAccount, - errorMessage = value.errorMessage, - source = if (isCached) StatusSource.CACHE else StatusSource.ACTUAL, - ) - } - } - - return NetworkStatus(network = network, value = status) - } -} \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/extensions/Map.kt b/core/utils/src/main/java/com/tangem/utils/extensions/Map.kt new file mode 100644 index 0000000000..99cf375010 --- /dev/null +++ b/core/utils/src/main/java/com/tangem/utils/extensions/Map.kt @@ -0,0 +1,11 @@ +package com.tangem.utils.extensions + +fun Map.mapNotNullValues(transform: (Map.Entry) -> R?): Map { + return this + .mapNotNull { entry -> + val newValue = transform(entry) ?: return@mapNotNull null + + entry.key to newValue + } + .toMap() +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkAddressConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAddressConverter.kt similarity index 96% rename from core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkAddressConverter.kt rename to data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAddressConverter.kt index 5d3ba03610..f3e2e962e2 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkAddressConverter.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAddressConverter.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.local.network.converter +package com.tangem.data.networks.converters import com.tangem.datasource.local.network.entity.NetworkStatusDM import com.tangem.domain.tokens.model.NetworkAddress @@ -10,7 +10,7 @@ import timber.log.Timber * [REDACTED_AUTHOR] */ -class NetworkAddressConverter( +internal class NetworkAddressConverter( private val selectedAddress: String, ) : TwoWayConverter, NetworkAddress> { diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkAmountsConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAmountsConverter.kt similarity index 85% rename from core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkAmountsConverter.kt rename to data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAmountsConverter.kt index e3bac6232a..f55ec596d5 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkAmountsConverter.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkAmountsConverter.kt @@ -1,9 +1,9 @@ -package com.tangem.datasource.local.network.converter +package com.tangem.data.networks.converters -import com.tangem.common.extensions.mapNotNullValues import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrencyAmountStatus import com.tangem.utils.converter.TwoWayConverter +import com.tangem.utils.extensions.mapNotNullValues import java.math.BigDecimal private typealias AmountsDataModel = Map @@ -14,7 +14,7 @@ private typealias AmountsDomainModel = Map { +internal object NetworkAmountsConverter : TwoWayConverter { override fun convert(value: AmountsDataModel): AmountsDomainModel { return value diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkDerivationPathConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkDerivationPathConverter.kt similarity index 53% rename from core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkDerivationPathConverter.kt rename to data/networks/src/main/java/com/tangem/data/networks/converters/NetworkDerivationPathConverter.kt index 1cffbc73f9..c03450ee25 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkDerivationPathConverter.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkDerivationPathConverter.kt @@ -1,7 +1,6 @@ -package com.tangem.datasource.local.network.converter +package com.tangem.data.networks.converters import com.tangem.datasource.local.network.entity.NetworkStatusDM -import com.tangem.datasource.local.network.entity.NetworkStatusDM.DerivationPath.Type import com.tangem.domain.tokens.model.Network import com.tangem.utils.converter.TwoWayConverter @@ -10,14 +9,14 @@ import com.tangem.utils.converter.TwoWayConverter * [REDACTED_AUTHOR] */ -object NetworkDerivationPathConverter : +internal object NetworkDerivationPathConverter : TwoWayConverter { override fun convert(value: NetworkStatusDM.DerivationPath): Network.DerivationPath { return when (value.type) { - Type.CARD -> Network.DerivationPath.Card(value.value) - Type.CUSTOM -> Network.DerivationPath.Custom(value.value) - Type.NONE -> Network.DerivationPath.None + NetworkStatusDM.DerivationPath.Type.CARD -> Network.DerivationPath.Card(value.value) + NetworkStatusDM.DerivationPath.Type.CUSTOM -> Network.DerivationPath.Custom(value.value) + NetworkStatusDM.DerivationPath.Type.NONE -> Network.DerivationPath.None } } @@ -25,9 +24,9 @@ object NetworkDerivationPathConverter : return NetworkStatusDM.DerivationPath( value = value.value.orEmpty(), type = when (value) { - is Network.DerivationPath.Card -> Type.CARD - is Network.DerivationPath.Custom -> Type.CUSTOM - Network.DerivationPath.None -> Type.NONE + is Network.DerivationPath.Card -> NetworkStatusDM.DerivationPath.Type.CARD + is Network.DerivationPath.Custom -> NetworkStatusDM.DerivationPath.Type.CUSTOM + Network.DerivationPath.None -> NetworkStatusDM.DerivationPath.Type.NONE }, ) } diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkStatusDataModelConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverter.kt similarity index 92% rename from core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkStatusDataModelConverter.kt rename to data/networks/src/main/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverter.kt index 55ab2be060..f0c3cfb572 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/converter/NetworkStatusDataModelConverter.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/converters/NetworkStatusDataModelConverter.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.local.network.converter +package com.tangem.data.networks.converters import com.tangem.datasource.local.network.entity.NetworkStatusDM import com.tangem.domain.tokens.model.NetworkStatus @@ -9,7 +9,7 @@ import com.tangem.utils.converter.Converter * [REDACTED_AUTHOR] */ -object NetworkStatusDataModelConverter : Converter { +internal object NetworkStatusDataModelConverter : Converter { override fun convert(value: NetworkStatus): NetworkStatusDM? { return when (val status = value.value) { diff --git a/data/networks/src/main/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverter.kt b/data/networks/src/main/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverter.kt index 5bfe00747d..314a02853a 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverter.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/converters/SimpleNetworkStatusConverter.kt @@ -1,9 +1,6 @@ package com.tangem.data.networks.converters import com.tangem.data.networks.models.SimpleNetworkStatus -import com.tangem.datasource.local.network.converter.NetworkAddressConverter -import com.tangem.datasource.local.network.converter.NetworkAmountsConverter -import com.tangem.datasource.local.network.converter.NetworkDerivationPathConverter import com.tangem.datasource.local.network.entity.NetworkStatusDM import com.tangem.domain.models.StatusSource import com.tangem.domain.tokens.model.NetworkStatus diff --git a/data/networks/src/main/java/com/tangem/data/networks/di/NetworkDataModule.kt b/data/networks/src/main/java/com/tangem/data/networks/di/NetworkDataModule.kt index 368dad5d0e..b0f097e74c 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/di/NetworkDataModule.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/di/NetworkDataModule.kt @@ -1,25 +1,54 @@ package com.tangem.data.networks.di +import android.content.Context import androidx.datastore.core.DataStore +import androidx.datastore.core.DataStoreFactory +import androidx.datastore.dataStoreFile +import com.squareup.moshi.Moshi import com.tangem.data.common.currency.CardCryptoCurrencyFactory import com.tangem.data.networks.repository.DefaultNetworksRepository import com.tangem.data.networks.store.DefaultNetworksStatusesStoreV2 import com.tangem.data.networks.store.NetworksStatusesStoreV2 +import com.tangem.datasource.di.NetworkMoshi import com.tangem.datasource.local.datastore.RuntimeSharedStore import com.tangem.datasource.local.network.entity.NetworkStatusDM +import com.tangem.datasource.utils.MoshiDataStoreSerializer +import com.tangem.datasource.utils.mapWithStringKeyTypes +import com.tangem.datasource.utils.setTypes import com.tangem.domain.networks.repository.NetworksRepository import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) internal object NetworkDataModule { + @Singleton + @Provides + fun providePersistenceNetworksStatusesStore( + @NetworkMoshi moshi: Moshi, + @ApplicationContext context: Context, + dispatchers: CoroutineDispatcherProvider, + ): DataStore>> { + return DataStoreFactory.create( + serializer = MoshiDataStoreSerializer( + moshi = moshi, + types = mapWithStringKeyTypes(valueTypes = setTypes()), + defaultValue = emptyMap(), + ), + produceFile = { context.dataStoreFile(fileName = "networks_statuses") }, + scope = CoroutineScope(context = dispatchers.io + SupervisorJob()), + ) + } + @Provides @Singleton fun provideNetworksStatusesStoreV2( diff --git a/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt b/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt index 7bc6845b13..8f438408cc 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt @@ -1,10 +1,10 @@ package com.tangem.data.networks.store import androidx.datastore.core.DataStore +import com.tangem.data.networks.converters.NetworkStatusDataModelConverter import com.tangem.data.networks.converters.SimpleNetworkStatusConverter import com.tangem.data.networks.models.SimpleNetworkStatus import com.tangem.datasource.local.datastore.RuntimeSharedStore -import com.tangem.datasource.local.network.converter.NetworkStatusDataModelConverter import com.tangem.datasource.local.network.entity.NetworkStatusDM import com.tangem.domain.models.StatusSource import com.tangem.domain.tokens.model.Network diff --git a/data/networks/src/test/java/com/tangem/data/networks/NetworkStatusExt.kt b/data/networks/src/test/java/com/tangem/data/networks/NetworkStatusExt.kt index 1b19c1bc0f..f82fcb835c 100644 --- a/data/networks/src/test/java/com/tangem/data/networks/NetworkStatusExt.kt +++ b/data/networks/src/test/java/com/tangem/data/networks/NetworkStatusExt.kt @@ -1,7 +1,7 @@ package com.tangem.data.networks +import com.tangem.data.networks.converters.NetworkStatusDataModelConverter import com.tangem.data.networks.models.SimpleNetworkStatus -import com.tangem.datasource.local.network.converter.NetworkStatusDataModelConverter import com.tangem.datasource.local.network.entity.NetworkStatusDM import com.tangem.domain.tokens.model.NetworkStatus