diff --git a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json index 5325106cfb..9da23d2779 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -9,7 +9,7 @@ }, { "name": "REDESIGNED_WALLET_SCREEN_ENABLED", - "version": "1.0.0" + "version": "undefined" }, { "name": "1INCH_LEARN_2_EARN_ENABLED", @@ -21,10 +21,10 @@ }, { "name": "REDESIGNED_APP_CURRENCY_SELECTOR_ENABLED", - "version": "1.0.0" + "version": "undefined" }, { "name": "DARK_THEME_ENABLED", - "version": "1.0.0" + "version": "undefined" } ] diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index 3f623010d5..3cbec2c309 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -41,6 +41,7 @@ internal class DefaultCurrenciesRepository( private val responseCurrenciesFactory = ResponseCryptoCurrenciesFactory(demoConfig) private val cardCurrenciesFactory = CardCryptoCurrenciesFactory(demoConfig) private val userTokensResponseFactory = UserTokensResponseFactory() + private val userTokensBackwardCompatibility = UserTokensBackwardCompatibility() override suspend fun saveTokens( userWalletId: UserWalletId, @@ -323,12 +324,14 @@ internal class DefaultCurrenciesRepository( onError = { handleFetchTokensError(userWallet, it) }, ) - userTokensStore.store(userWallet.walletId, response) - fetchExchangeableUserMarketCoinsByIds(userWalletId, response) + val compatibleUserTokensResponse = userTokensBackwardCompatibility.applyCompatibilityAndGetUpdated(response) + userTokensStore.store(userWallet.walletId, compatibleUserTokensResponse) + fetchExchangeableUserMarketCoinsByIds(userWalletId, compatibleUserTokensResponse) } private suspend fun storeAndPushTokens(userWalletId: UserWalletId, response: UserTokensResponse) { - userTokensStore.store(userWalletId, response) + val compatibleUserTokensResponse = userTokensBackwardCompatibility.applyCompatibilityAndGetUpdated(response) + userTokensStore.store(userWalletId, compatibleUserTokensResponse) try { tangemTechApi.saveUserTokens(userWalletId.stringValue, response) } catch (e: Throwable) { diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/QuotesUnsupportedCurrenciesIdAdapter.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/QuotesUnsupportedCurrenciesIdAdapter.kt index 1fc3ac2b30..a038b0be78 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/QuotesUnsupportedCurrenciesIdAdapter.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/QuotesUnsupportedCurrenciesIdAdapter.kt @@ -5,7 +5,7 @@ import com.tangem.datasource.api.tangemTech.models.QuotesResponse /** * Adapter to replace unsupported currencies for quotes request if it necessary */ -class QuotesUnsupportedCurrenciesIdAdapter { +internal class QuotesUnsupportedCurrenciesIdAdapter { /** * Replaces unsupported currencies id to it replacements for request @@ -14,10 +14,13 @@ class QuotesUnsupportedCurrenciesIdAdapter { val idsForRequest = mutableSetOf() val idsFiltered = mutableSetOf() currenciesIds.forEach { currencyId -> - unsupportedMapWithReplacement[currencyId]?.let { + val replacementId = UNSUPPORTED_IDS_WITH_REPLACEMENTS[currencyId] + if (replacementId != null) { idsFiltered.add(currencyId) - idsForRequest.add(it) - } ?: idsForRequest.add(currencyId) + idsForRequest.add(replacementId) + } else { + idsForRequest.add(currencyId) + } } return ReplacementResult(idsForRequest = idsForRequest, idsFiltered = idsFiltered) } @@ -28,9 +31,11 @@ class QuotesUnsupportedCurrenciesIdAdapter { fun getResponseWithUnsupportedCurrencies(response: QuotesResponse, filteredIds: Set): QuotesResponse { val updatedQuotes = mutableMapOf() filteredIds.forEach { filteredId -> - unsupportedMapWithReplacement[filteredId]?.let { baseId -> - response.quotes[baseId]?.let { quote -> - updatedQuotes[filteredId] = quote + val replacementId = UNSUPPORTED_IDS_WITH_REPLACEMENTS[filteredId] + if (replacementId != null) { + val quoteReplacement = response.quotes[replacementId] + if (quoteReplacement != null) { + updatedQuotes[filteredId] = quoteReplacement } } } @@ -43,7 +48,7 @@ class QuotesUnsupportedCurrenciesIdAdapter { /** * Map that contains unsupported currencies and their replacement for request */ - private val unsupportedMapWithReplacement = mapOf( + private val UNSUPPORTED_IDS_WITH_REPLACEMENTS = mapOf( "optimistic-ethereum" to "ethereum", "arbitrum-one" to "ethereum", ) diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/UserTokensBackwardCompatibility.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/UserTokensBackwardCompatibility.kt new file mode 100644 index 0000000000..db1650880f --- /dev/null +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/UserTokensBackwardCompatibility.kt @@ -0,0 +1,37 @@ +package com.tangem.data.tokens.utils + +import com.tangem.blockchain.common.Blockchain +import com.tangem.datasource.api.tangemTech.models.UserTokensResponse +import com.tangem.domain.common.extensions.fromNetworkId +import com.tangem.domain.common.extensions.toCoinId + +/** + * Helper to apply compatibility changes for [UserTokensResponse] to support old saved tokens + * in new application with new IDs + */ +internal class UserTokensBackwardCompatibility { + + fun applyCompatibilityAndGetUpdated(userTokensResponse: UserTokensResponse): UserTokensResponse { + return userTokensResponse.copy( + tokens = userTokensResponse.tokens.map { token -> + val oldSavedId = NETWORKS_TO_OLD_SAVED_IDS[token.networkId] + if (oldSavedId != null && token.id == oldSavedId) { + Blockchain.fromNetworkId(token.networkId)?.let { blockchain -> + token.copy( + id = blockchain.toCoinId(), + ) + } ?: token + } else { + token + } + }, + ) + } + + companion object { + private val NETWORKS_TO_OLD_SAVED_IDS = mapOf( + "optimistic-ethereum" to "ethereum", + "arbitrum-one" to "ethereum", + ) + } +} \ No newline at end of file