Skip to content

Commit

Permalink
feat(network_wallet_services): AND-6800 Create Cache for Coin Network…
Browse files Browse the repository at this point in the history
…s (#4142)
  • Loading branch information
dtverdota-bc committed Nov 23, 2022
1 parent 50a0a0b commit ab796b3
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 13 deletions.
10 changes: 9 additions & 1 deletion coincore/src/main/java/com/blockchain/coincore/koin.kt
Expand Up @@ -11,6 +11,7 @@ import com.blockchain.coincore.impl.TxProcessorFactory
import com.blockchain.coincore.impl.txEngine.TransferQuotesEngine
import com.blockchain.coincore.loader.AssetCatalogueImpl
import com.blockchain.coincore.loader.AssetLoader
import com.blockchain.coincore.loader.CoinNetworksStore
import com.blockchain.coincore.loader.DynamicAssetLoader
import com.blockchain.coincore.loader.DynamicAssetsService
import com.blockchain.coincore.loader.NonCustodialL2sDynamicAssetRepository
Expand Down Expand Up @@ -246,7 +247,14 @@ val coincoreModule = module {
l2Store = get(),
layerTwoFeatureFlag = lazy { get(ethLayerTwoFeatureFlag) },
coinNetworksFeatureFlag = lazy { get(coinNetworksFeatureFlag) },
evmNetworksService = lazy { payloadScope.get() }
evmNetworksService = lazy { payloadScope.get() },
coinNetworksStore = get()
)
}

single {
CoinNetworksStore(
discoveryService = get()
)
}

Expand Down
@@ -0,0 +1,35 @@
package com.blockchain.coincore.loader

import com.blockchain.api.coinnetworks.data.CoinNetworkDto
import com.blockchain.api.services.AssetDiscoveryApiService
import com.blockchain.store.Fetcher
import com.blockchain.store.Store
import com.blockchain.store.impl.Freshness
import com.blockchain.store.impl.FreshnessMediator
import com.blockchain.store_caches_persistedjsonsqldelight.PersistedJsonSqlDelightStoreBuilder
import com.blockchain.storedatasource.FlushableDataSource
import kotlinx.serialization.builtins.ListSerializer

class CoinNetworksStore(
private val discoveryService: AssetDiscoveryApiService
) : Store<List<CoinNetworkDto>> by PersistedJsonSqlDelightStoreBuilder()
.build(
storeId = STORE_ID,
fetcher = Fetcher.ofOutcome(
mapper = {
discoveryService.allNetworks()
}
),
dataSerializer = ListSerializer(CoinNetworkDto.serializer()),
mediator = FreshnessMediator(Freshness.DURATION_24_HOURS)
),
FlushableDataSource {

override fun invalidate() {
markAsStale()
}

companion object {
private const val STORE_ID = "CoinNetworksStore"
}
}
Expand Up @@ -13,8 +13,10 @@ import com.blockchain.domain.wallet.NetworkType
import com.blockchain.featureflag.FeatureFlag
import com.blockchain.outcome.getOrDefault
import com.blockchain.outcome.map
import com.blockchain.store.asSingle
import com.blockchain.store.firstOutcome
import com.blockchain.utils.rxSingleOutcome
import info.blockchain.balance.CryptoCurrency
import io.reactivex.rxjava3.core.Maybe
import io.reactivex.rxjava3.core.Single
import kotlinx.coroutines.rx3.rxSingle
Expand All @@ -24,7 +26,8 @@ class NonCustodialL2sDynamicAssetRepository(
private val l2Store: NonCustodialL2sDynamicAssetStore,
private val layerTwoFeatureFlag: Lazy<FeatureFlag>,
private val coinNetworksFeatureFlag: Lazy<FeatureFlag>,
private val evmNetworksService: Lazy<EvmNetworksService>
private val evmNetworksService: Lazy<EvmNetworksService>,
private val coinNetworksStore: CoinNetworksStore
) {
fun availableL2s(): Single<DynamicAssetList> {
return layerTwoFeatureFlag.value.enabled.flatMap {
Expand All @@ -39,9 +42,18 @@ class NonCustodialL2sDynamicAssetRepository(
fun otherEvmAssets(): Single<DynamicAssetList> {
return coinNetworksFeatureFlag.value.enabled.flatMap { isEnabled ->
if (isEnabled) {
discoveryService.otherEvmNetworks()
coinNetworksStore.stream(
FreshnessStrategy.Cached(false)
)
.asSingle()
.flatMap { evmNetworks ->
getL1AssetsForNetworks(evmNetworks.mapNotNull { it.toEvmNetwork() })
getL1AssetsForNetworks(
evmNetworks.filter { network ->
network.type == NetworkType.EVM &&
network.currency != CryptoCurrency.ETHER.networkTicker
}
.mapNotNull { it.toEvmNetwork() }
)
}
} else {
evmNetworksService.value.getSupportedNetworks()
Expand All @@ -55,9 +67,15 @@ class NonCustodialL2sDynamicAssetRepository(
fun allEvmAssets(): Single<DynamicAssetList> {
return coinNetworksFeatureFlag.value.enabled.flatMap { isEnabled ->
if (isEnabled) {
discoveryService.supportedEvmNetworks()
coinNetworksStore.stream(
FreshnessStrategy.Cached(false)
)
.asSingle()
.flatMap { evmNetworks ->
getL1AssetsForNetworks(evmNetworks.mapNotNull { it.toEvmNetwork() })
getL1AssetsForNetworks(
evmNetworks.filter { network -> network.type == NetworkType.EVM }
.mapNotNull { it.toEvmNetwork() }
)
}
} else {
evmNetworksService.value.getSupportedNetworks()
Expand Down Expand Up @@ -88,9 +106,14 @@ class NonCustodialL2sDynamicAssetRepository(
fun allEvmNetworks(): Single<List<EvmNetwork>> {
return coinNetworksFeatureFlag.value.enabled.flatMap { isEnabled ->
if (isEnabled) {
discoveryService.supportedEvmNetworks().map { coinNetworks ->
coinNetworks.mapNotNull { network -> network.toEvmNetwork() }
}
coinNetworksStore.stream(
FreshnessStrategy.Cached(false)
)
.asSingle()
.map { evmNetworks ->
evmNetworks.filter { network -> network.type == NetworkType.EVM }
.mapNotNull { it.toEvmNetwork() }
}
} else {
evmNetworksService.value.getSupportedNetworks().map {
it.plus(EthDataManager.ethChain)
Expand All @@ -102,7 +125,18 @@ class NonCustodialL2sDynamicAssetRepository(
fun getEvmNetworkForCurrency(currency: String): Maybe<EvmNetwork> {
return coinNetworksFeatureFlag.value.enabled.flatMapMaybe { isEnabled ->
if (isEnabled) {
discoveryService.getEvmNetworkForCurrency(currency).map { network -> network?.toEvmNetwork() }
coinNetworksStore.stream(
FreshnessStrategy.Cached(false)
)
.asSingle()
.flatMapMaybe { evmNetworks ->
evmNetworks.first { network ->
network.type == NetworkType.EVM && network.currency == currency
}
.toEvmNetwork()?.let { evmNetwork ->
Maybe.just(evmNetwork)
} ?: Maybe.empty()
}
} else {
evmNetworksService.value.getSupportedNetworkForCurrency(currency)
}
Expand All @@ -112,9 +146,16 @@ class NonCustodialL2sDynamicAssetRepository(
fun otherEvmNetworks(): Single<List<EvmNetwork>> {
return coinNetworksFeatureFlag.value.enabled.flatMap { isEnabled ->
if (isEnabled) {
discoveryService.otherEvmNetworks().map { coinNetworks ->
coinNetworks.mapNotNull { network -> network.toEvmNetwork() }
}
coinNetworksStore.stream(
FreshnessStrategy.Cached(false)
)
.asSingle()
.map { evmNetworks ->
evmNetworks.filter { network ->
network.type == NetworkType.EVM && network.currency != CryptoCurrency.ETHER.networkTicker
}
.mapNotNull { it.toEvmNetwork() }
}
} else {
evmNetworksService.value.getSupportedNetworks()
}
Expand Down

0 comments on commit ab796b3

Please sign in to comment.