From b9bb4c233a7a6fac5d763d7503f01cba50ea0e58 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 28 Jan 2024 15:02:24 +0300 Subject: [PATCH 1/7] 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/7] 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/7] 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/7] 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/7] 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() }} From d8e756e7b71541b82860b3d3b24622a3d80b6e32 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 30 Jan 2024 17:40:33 +0500 Subject: [PATCH 6/7] Updated on 2026-08-14 --- app/src/main/assets/testnet_tokens.json | 4 ++-- .../com/tangem/domain/common/extensions/Blockchain.kt | 10 +++++----- .../tangem/feature/swap/domain/SwapInteractorImpl.kt | 6 +++--- gradle/dependencies.toml | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/assets/testnet_tokens.json b/app/src/main/assets/testnet_tokens.json index cbc9238746..6be450bd32 100644 --- a/app/src/main/assets/testnet_tokens.json +++ b/app/src/main/assets/testnet_tokens.json @@ -405,7 +405,7 @@ { "id" : "vechain", "symbol" : "VET", - "name" : "Vechain", + "name" : "VeChain", "networks" : [ { "networkId" : "vechain/test" @@ -419,7 +419,7 @@ "networks": [ { "networkId": "vechain/test", - "contractAddress": "0x0000000000000000000000000000456E65726779", + "contractAddress": "0x0000000000000000000000000000456e65726779", "decimalCount": 18 } ] 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 7d235349dc..b6f3d8aba6 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 @@ -76,8 +76,8 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "decimal/test" -> Blockchain.DecimalTestnet "xdc-network" -> Blockchain.XDC "xdc-network/test" -> Blockchain.XDCTestnet - "vechain" -> Blockchain.Vechain - "vechain/test" -> Blockchain.VechainTestnet + "vechain" -> Blockchain.VeChain + "vechain/test" -> Blockchain.VeChainTestnet "aptos" -> Blockchain.Aptos "aptos/test" -> Blockchain.AptosTestnet else -> null @@ -157,8 +157,8 @@ fun Blockchain.toNetworkId(): String { Blockchain.DecimalTestnet -> "decimal/test" Blockchain.XDC -> "xdc-network" Blockchain.XDCTestnet -> "xdc-network/test" - Blockchain.Vechain -> "vechain" - Blockchain.VechainTestnet -> "vechain/test" + Blockchain.VeChain -> "vechain" + Blockchain.VeChainTestnet -> "vechain/test" Blockchain.Aptos -> "aptos" Blockchain.AptosTestnet -> "aptos/test" } @@ -209,7 +209,7 @@ fun Blockchain.toCoinId(): String { Blockchain.NearTestnet -> "near/test" Blockchain.Decimal, Blockchain.DecimalTestnet -> "decimal" Blockchain.XDC, Blockchain.XDCTestnet -> "xdce-crowd-sale" - Blockchain.Vechain, Blockchain.VechainTestnet -> "vechain" + Blockchain.VeChain, Blockchain.VeChainTestnet -> "vechain" Blockchain.Aptos -> "aptos" Blockchain.AptosTestnet -> "aptos/test" Blockchain.Unknown -> "unknown" diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 7078bd5b1a..0928f9385a 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -655,9 +655,9 @@ internal class SwapInteractorImpl @Inject constructor( gasPrice = (feeAmountWithDecimals / fee.gasLimit.toBigDecimal()).toBigInteger(), ) } - blockchain == Blockchain.Vechain -> Fee.Vechain( + blockchain == Blockchain.VeChain -> Fee.VeChain( amount = feeAmount, - gasPriceCoef = Fee.Vechain.getGasPriceCoef(fee.gasLimit.toLong(), fee.feeValue), + gasPriceCoef = Fee.VeChain.getGasPriceCoef(fee.gasLimit.toLong(), fee.feeValue), gasLimit = fee.gasLimit.toLong(), ) blockchain == Blockchain.Aptos -> { @@ -1354,7 +1354,7 @@ internal class SwapInteractorImpl @Inject constructor( return when (this) { is Fee.Common -> 0 is Fee.Ethereum -> gasLimit.toInt() - is Fee.Vechain -> gasLimit.toInt() + is Fee.VeChain -> gasLimit.toInt() is Fee.Aptos -> amount.longValue?.div(gasUnitPrice)?.toInt() ?: 0 } } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index b839fda708..11552dabef 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-466" +tangemBlockchainSdk = "release-app_5.5-469" #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 35b58e96c4a1c0648488aa995b07ed8f2f5cb9a7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 30 Jan 2024 20:06:48 +0500 Subject: [PATCH 7/7] Updated on 2026-08-14 --- .../com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt index 9599d1a964..3545e10ba9 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt @@ -200,7 +200,8 @@ class GetCurrencyWarningsUseCase( } feePaidCurrency is FeePaidCurrency.Token -> { val feePaidTokenBalance = feePaidCurrency.balance - if (!tokenStatus.value.amount.isZero() && feePaidTokenBalance.isZero()) { + val amount = tokenStatus.value.amount ?: return null + if (!amount.isZero() && feePaidTokenBalance.isZero()) { constructTokenBalanceNotEnoughWarning( userWalletId = userWalletId, tokenStatus = tokenStatus, @@ -222,7 +223,9 @@ class GetCurrencyWarningsUseCase( val token = currenciesRepository .getMultiCurrencyWalletCurrenciesSync(userWalletId) .find { - it is CryptoCurrency.Token && it.contractAddress.equals(feePaidToken.contractAddress, ignoreCase = true) + it is CryptoCurrency.Token && + it.contractAddress.equals(feePaidToken.contractAddress, ignoreCase = true) && + it.network.derivationPath == tokenStatus.currency.network.derivationPath } return if (token != null) { CryptoCurrencyWarning.CustomTokenNotEnoughForFee(