From b9bb4c233a7a6fac5d763d7503f01cba50ea0e58 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 28 Jan 2024 15:02:24 +0300 Subject: [PATCH 1/5] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index 1d03f1f1b3..7d235349dc 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -239,4 +239,5 @@ private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 private val excludedBlockchains = listOf( Blockchain.Unknown, Blockchain.Ducatus, + Blockchain.Aptos, ) \ No newline at end of file From 149e225550d96ea0ed9140d0e371d879cba600d8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 29 Jan 2024 12:06:06 +0300 Subject: [PATCH 2/5] Updated on 2026-08-14 --- .../tokens/impl/data/converters/CoinsResponseConverter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt index 0902f40ec4..e2824e1022 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/data/converters/CoinsResponseConverter.kt @@ -3,7 +3,6 @@ package com.tangem.tap.features.tokens.impl.data.converters import com.tangem.blockchain.common.Blockchain import com.tangem.datasource.api.tangemTech.models.CoinsResponse import com.tangem.domain.common.extensions.fromNetworkId -import com.tangem.domain.common.extensions.toNetworkId import com.tangem.tap.features.tokens.impl.domain.models.Token import com.tangem.utils.converter.Converter @@ -26,7 +25,8 @@ internal object CoinsResponseConverter : Converter> { networks = token.networks.mapNotNull { network -> val blockchain = Blockchain.fromNetworkId(network.networkId) ?: return@mapNotNull null - if (network.networkId != blockchain.toNetworkId() && + // filter tokens, if contractAddress != null, assume that it is a token + if (network.contractAddress != null && !blockchain.canHandleTokens() ) { return@mapNotNull null From 4e99bbbf886649b1607a67503fd50db5c64c8fde Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 29 Jan 2024 21:40:07 +0500 Subject: [PATCH 3/5] Updated on 2026-08-14 --- .../impl/data/converters/FoundTokenConverter.kt | 2 +- .../features/customtoken/impl/domain/models/FoundToken.kt | 8 ++++---- .../presentation/viewmodels/AddCustomTokenViewModel.kt | 4 +++- gradle/dependencies.toml | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/data/converters/FoundTokenConverter.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/data/converters/FoundTokenConverter.kt index 977869feb2..33271e9fb6 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/data/converters/FoundTokenConverter.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/data/converters/FoundTokenConverter.kt @@ -20,7 +20,7 @@ object FoundTokenConverter : Converter { network = value.networks.firstOrNull()?.let { network -> FoundToken.Network( id = network.networkId, - address = requireNotNull(network.contractAddress), + contractAddress = requireNotNull(network.contractAddress), decimalCount = requireNotNull(network.decimalCount).toString(), ) } ?: error("Found token networks is empty"), diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/models/FoundToken.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/models/FoundToken.kt index 6ca52f5eb5..5b39f2dd52 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/models/FoundToken.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/domain/models/FoundToken.kt @@ -22,9 +22,9 @@ data class FoundToken( /** * Found token network * - * @property id id - * @property address address - * @property decimalCount decimal count + * @property id id + * @property contractAddress address + * @property decimalCount decimal count */ - data class Network(val id: String, val address: String, val decimalCount: String) + data class Network(val id: String, val contractAddress: String, val decimalCount: String) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt index 1e8a78eb4f..aedff94b31 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt @@ -827,11 +827,13 @@ internal class AddCustomTokenViewModel @Inject constructor( val currency = when (getCustomTokenType()) { CustomTokenType.TOKEN -> { + val contractAddress = foundToken?.network?.contractAddress + ?: uiState.form.contractAddressInputField.value CustomCurrency.CustomToken( token = Token( name = uiState.form.tokenNameInputField.value, symbol = uiState.form.tokenSymbolInputField.value, - contractAddress = uiState.form.contractAddressInputField.value, + contractAddress = contractAddress, decimals = requireNotNull(uiState.form.decimalsInputField.value.toIntOrNull()), id = foundToken?.id, ), diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index b38c9a9342..b839fda708 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ spr-client = "3.6.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.5-465" +tangemBlockchainSdk = "release-app_5.5-466" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.5-323" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From 4a0c4b0cb152022b03c7e0095a6211a31a43241d Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 29 Jan 2024 21:52:29 +0500 Subject: [PATCH 4/5] Updated on 2026-08-14 --- .../domain/tokens/AddCryptoCurrenciesUseCase.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt index 0f2c594510..21613763a1 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/AddCryptoCurrenciesUseCase.kt @@ -81,7 +81,18 @@ class AddCryptoCurrenciesUseCase( .filter { hasCoinForToken(existingCurrencies, it) } .mapTo(hashSetOf(), CryptoCurrency.Token::network) - catch({ networksRepository.getNetworkStatusesSync(userWalletId, networksToUpdate, refresh = true) }) { + val networkToUpdate = currenciesToAdd.map { it.network } + .subtract(existingCurrencies.map { it.network }.toSet()) + + catch( + { + networksRepository.getNetworkStatusesSync( + userWalletId = userWalletId, + networks = networksToUpdate + networkToUpdate, + refresh = true, + ) + }, + ) { raise(AddCurrencyError.DataError(it)) } } From 87242e0284bc514b647467b85aa50656e14b7c36 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 29 Jan 2024 17:38:43 +0300 Subject: [PATCH 5/5] Updated on 2026-08-14 --- .../features/details/redux/DetailsMiddleware.kt | 5 ++--- .../saveWallet/redux/SaveWalletMiddleware.kt | 16 +++++++++++++--- .../viewmodels/WalletsUpdateActionResolverV2.kt | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index dc57a6bb45..f039fbb8b1 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -7,6 +7,7 @@ import com.tangem.common.core.TangemSdkError import com.tangem.common.core.UserCodeRequestPolicy import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics +import com.tangem.core.analytics.models.Basic import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.core.ui.extensions.TextReference @@ -22,8 +23,6 @@ import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.legacy.isLockedSync import com.tangem.tap.* import com.tangem.tap.common.analytics.events.AnalyticsParam -import com.tangem.core.analytics.models.AnalyticsParam as CoreAnalyticsParam -import com.tangem.core.analytics.models.Basic import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchOnMain @@ -48,6 +47,7 @@ import kotlinx.coroutines.withContext import org.rekotlin.Action import org.rekotlin.Middleware import timber.log.Timber +import com.tangem.core.analytics.models.AnalyticsParam as CoreAnalyticsParam class DetailsMiddleware { private val eraseWalletMiddleware = EraseWalletMiddleware() @@ -522,7 +522,6 @@ class DetailsMiddleware { onWalletNotCreated = { // No need to rollback policy, continue with the policy set before the card scan store.dispatchWithMain(DetailsAction.ScanAndSaveUserWallet.Success) - store.dispatchWithMain(NavigationAction.PopBackTo(AppScreen.Wallet)) }, disclaimerWillShow = { store.dispatchOnMain(NavigationAction.PopBackTo()) diff --git a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt index 92d7685a73..7ab41ec265 100644 --- a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt @@ -101,7 +101,17 @@ internal class SaveWalletMiddleware { val isFirstSavedWallet = !userWalletsListManager.hasUserWallets saveAccessCodeIfNeeded(state.backupInfo?.accessCode, userWallet.cardsInWallet) - .flatMap { userWalletsListManager.save(userWallet, canOverride = true) } + .flatMap { + // Save wallet only at first time (SaveWalletBottomSheet). + // Otherwise (Example, add new wallet in Details) userWalletsListManager.wallets subscribers will + // receive useless updates. + // See: OnboardingHelper.trySaveWalletAndNavigateToWalletScreen() + if (isFirstSavedWallet) { + userWalletsListManager.save(userWallet, canOverride = true) + } else { + CompletionResult.Success(Unit) + } + } .doOnFailure { error -> store.dispatchWithMain(SaveWalletAction.Save.Error(error)) } @@ -118,8 +128,8 @@ internal class SaveWalletMiddleware { ) } - store.dispatchWithMain(SaveWalletAction.Save.Success) - store.dispatchWithMain(NavigationAction.PopBackTo(AppScreen.Wallet)) + store.dispatchOnMain(SaveWalletAction.Save.Success) + store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Wallet)) } } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolverV2.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolverV2.kt index e1f8088ebe..1c8a3f7b26 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolverV2.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolverV2.kt @@ -211,7 +211,7 @@ internal class WalletsUpdateActionResolverV2 @Inject constructor( override fun toString(): String { return """ - Initialize( + InitializeWallets( selectedWalletIndex = $selectedWalletIndex, selectedWallet = ${selectedWallet.walletId}, wallets = ${wallets.joinToString { it.walletId.toString() }}