From 95855960f0bc84a29794125c11ffb14631d632d9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 22 Feb 2024 15:14:21 +0300 Subject: [PATCH 1/6] Updated on 2026-08-14 --- .../repository/DelegatedKeystoreManager.kt | 12 +++-- .../BiometricUserWalletsKeysRepository.kt | 45 +++++++++---------- gradle/dependencies.toml | 4 +- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DelegatedKeystoreManager.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DelegatedKeystoreManager.kt index 6073f2de68..3c548bd255 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DelegatedKeystoreManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DelegatedKeystoreManager.kt @@ -8,11 +8,15 @@ internal class DelegatedKeystoreManager( private val keystoreManagerProvider: Provider, ) : KeystoreManager { - override suspend fun authenticateAndGetKey(keyAlias: String): SecretKey? { - return keystoreManagerProvider().authenticateAndGetKey(keyAlias) + override suspend fun get(keyAlias: String): SecretKey? { + return keystoreManagerProvider().get(keyAlias) } - override suspend fun storeKey(keyAlias: String, key: SecretKey) { - keystoreManagerProvider().storeKey(keyAlias, key) + override suspend fun get(keyAliases: Collection): Map { + return keystoreManagerProvider().get(keyAliases) + } + + override suspend fun store(keyAlias: String, key: SecretKey) { + return keystoreManagerProvider().store(keyAlias, key) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt index 17c733dd35..0b06c9565f 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/implementation/BiometricUserWalletsKeysRepository.kt @@ -81,41 +81,38 @@ internal class BiometricUserWalletsKeysRepository( } private suspend fun getAllInternal(): CompletionResult> { - return getUserWalletsIds() - .map { userWalletId -> - getEncryptionKey(userWalletId) - .doOnFailure { error -> - when (error) { - is TangemSdkError.UserCanceledAuthentication -> { - // If the user cancels biometric authentication, then cancel operation with error - return CompletionResult.Failure(error) - } - is TangemSdkError.KeystoreInvalidated -> { - // If the biometric cryptography key was invalidated, - // then delete all user wallets encryption keys and cancel operation with error - getUserWalletsIds().forEach { userWalletId -> - deleteEncryptionKey(userWalletId) - } + return catching { + val userWalletIds = getUserWalletsIds() - return CompletionResult.Failure(error) - } + getEncryptionKeys(userWalletIds) + } + .doOnFailure { error -> + when (error) { + is TangemSdkError.KeystoreInvalidated -> { + // If the biometric cryptography key was invalidated, then delete all encryption keys + getUserWalletsIds().forEach { userWalletId -> + deleteEncryptionKey(userWalletId) } } - } - .fold(listOf()) { acc, data -> - if (data != null) acc + data else acc + else -> Unit + } } } - private suspend fun getEncryptionKey(userWalletId: UserWalletId): CompletionResult { - return catching { authenticatedStorage.get(StorageKey.UserWalletEncryptionKey(userWalletId).name) } - .map { it.decodeToKey() } + private suspend fun getEncryptionKeys(userWalletsIds: List): List { + val keys = userWalletsIds.map { userWalletId -> + StorageKey.UserWalletEncryptionKey(userWalletId).name + } + + return authenticatedStorage.get(keys).mapNotNull { (_, encodedData) -> + encodedData.decodeToKey() + } } private suspend fun storeEncryptionKey(encryptionKey: UserWalletEncryptionKey): CompletionResult { return catching { authenticatedStorage.store( - key = StorageKey.UserWalletEncryptionKey(encryptionKey.walletId).name, + keyAlias = StorageKey.UserWalletEncryptionKey(encryptionKey.walletId).name, data = encryptionKey.encode(), ) } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index e8e2ee6152..9404d9c15c 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,9 +85,9 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.7-504" +tangemBlockchainSdk = "release-app_5.7-506" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "release-app_5.7-329" +tangemCardSdk = "release-app_5.7-330" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ # endregion Tangem From 8fbcf01a4c4a284eb7694013fba7394a3992a301 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 1 Mar 2024 12:43:24 +0000 Subject: [PATCH 2/6] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index ec450b5f39..2335c5caeb 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -3,10 +3,12 @@ package com.tangem.tap.proxy import androidx.core.text.isDigitsOnly import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.Message +import com.tangem.blockchain.blockchains.algorand.AlgorandTransactionExtras import com.tangem.blockchain.blockchains.binance.BinanceTransactionExtras import com.tangem.blockchain.blockchains.cosmos.CosmosTransactionExtras import com.tangem.blockchain.blockchains.ethereum.EthereumTransactionExtras import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager +import com.tangem.blockchain.blockchains.hedera.HederaTransactionBuilder import com.tangem.blockchain.blockchains.optimism.OptimismWalletManager import com.tangem.blockchain.blockchains.stellar.StellarMemo import com.tangem.blockchain.blockchains.stellar.StellarTransactionExtras @@ -136,6 +138,8 @@ class TransactionManagerImpl( Blockchain.XRP -> memo.toLongOrNull()?.let { XrpTransactionBuilder.XrpTransactionExtras(it) } Blockchain.Cosmos -> CosmosTransactionExtras(memo) Blockchain.TON -> TonTransactionExtras(memo) + Blockchain.Hedera -> HederaTransactionBuilder.HederaTransactionExtras(memo) + Blockchain.Algorand -> AlgorandTransactionExtras(memo) else -> null } } From 91863768854a8ea43f957ce003da12674cb2821a Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 2 Mar 2024 13:09:13 +0000 Subject: [PATCH 3/6] Updated on 2026-08-14 --- .../com/tangem/feature/swap/ui/StateBuilder.kt | 4 ++-- .../feature/swap/viewmodels/SwapViewModel.kt | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 53e3148278..5e8c386764 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -888,10 +888,10 @@ internal class StateBuilder( ) } - fun addAlert(uiState: SwapStateHolder, onClick: () -> Unit): SwapStateHolder { + fun addAlert(uiState: SwapStateHolder, message: TextReference? = null, onClick: () -> Unit): SwapStateHolder { return uiState.copy( alert = SwapWarning.GenericWarning( - message = null, + message = message, onClick = onClick, ), ) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index d194494046..39ca0d7991 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -8,6 +8,7 @@ import arrow.core.getOrElse import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.Basic +import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.utils.InputNumberFormatter import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency @@ -113,7 +114,7 @@ internal class SwapViewModel @Inject constructor( val cryptoCurrencyStatus = getCryptoCurrencyStatusUseCase(it.walletId, initialCryptoCurrency.id).getOrNull() if (cryptoCurrencyStatus == null) { - uiState = stateBuilder.addAlert(uiState, swapRouter::back) + uiState = stateBuilder.addAlert(uiState = uiState, onClick = swapRouter::back) } else { initialCryptoCurrencyStatus = cryptoCurrencyStatus initTokens() @@ -459,7 +460,12 @@ internal class SwapViewModel @Inject constructor( return } val fromCurrency = requireNotNull(dataState.fromCryptoCurrency) - val fee = requireNotNull(dataState.selectedFee) + val fee = dataState.selectedFee + // TODO: unexpected crash for some users, this workaround to prevent app crash and follow to support + if (fee == null) { + makeDefaultAlert(TextReference.Str("Fee estimation error. Please send feedback to support.")) + return + } viewModelScope.launch(dispatchers.main) { runCatching(dispatchers.io) { swapInteractor.onSwap( @@ -749,6 +755,12 @@ internal class SwapViewModel @Inject constructor( } } + private fun makeDefaultAlert(message: TextReference) { + uiState = stateBuilder.addAlert(uiState, message) { + uiState = stateBuilder.clearAlert(uiState) + } + } + @Suppress("LongMethod", "CyclomaticComplexMethod") private fun createUiActions(): UiActions { return UiActions( From ec2f42a9dce0d27569b9d35d8ab39dc7bb9a7d0f Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 2 Mar 2024 13:11:22 +0000 Subject: [PATCH 4/6] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 1 + gradle/dependencies.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) 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 aca3f01cc2..db20fc08a4 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 @@ -261,4 +261,5 @@ private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 private val excludedBlockchains = listOf( Blockchain.Unknown, Blockchain.Playa3ull, + Blockchain.Hedera, ) \ No newline at end of file diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 9404d9c15c..08469f5c44 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ web3j = "4.10.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.7-506" +tangemBlockchainSdk = "release-app_5.7-509" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.7-330" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From baa1edbf0c617516c81686b12c3d505e5cf5ff97 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 4 Mar 2024 08:25:18 +0000 Subject: [PATCH 5/6] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 1 - 1 file changed, 1 deletion(-) 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 db20fc08a4..aca3f01cc2 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 @@ -261,5 +261,4 @@ private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 private val excludedBlockchains = listOf( Blockchain.Unknown, Blockchain.Playa3ull, - Blockchain.Hedera, ) \ No newline at end of file From ebe9f2ec91588102a88aeeb60869644c29210d61 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 4 Mar 2024 09:19:12 +0000 Subject: [PATCH 6/6] Updated on 2026-08-14 --- .../main/java/com/tangem/datasource/di/AccountCreatorModule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/AccountCreatorModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/AccountCreatorModule.kt index 7abd08cf54..3b97ba24d9 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/AccountCreatorModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/AccountCreatorModule.kt @@ -16,7 +16,7 @@ internal object AccountCreatorModule { @Provides @Singleton - fun provideAccountCreator(authProvider: AuthProvider, @DevTangemApi tangemTechApi: TangemTechApi): AccountCreator { + fun provideAccountCreator(authProvider: AuthProvider, tangemTechApi: TangemTechApi): AccountCreator { return DefaultAccountCreator(authProvider, tangemTechApi) } } \ No newline at end of file