From cdb3ff99e05060b3bacb97e1aa24bb6b084eb06c Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 16 Aug 2023 16:40:30 +0300 Subject: [PATCH 1/6] Updated on 2026-08-14 --- gradle/dependencies.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 0025b49241..a3cdb77372 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,9 +80,9 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-318" +tangemBlockchainSdk = "release-app_4.10-320" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "develop-289" +tangemCardSdk = "release-app_4.10-290" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem From fa2a4c4866ade8d84e3cbdd5a9687f230df35161 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 17 Aug 2023 17:37:26 +0500 Subject: [PATCH 2/6] Updated on 2026-08-14 --- .../java/com/tangem/domain/tokens/models/CryptoCurrency.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/models/CryptoCurrency.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/models/CryptoCurrency.kt index 83d1d65eb0..6c46276300 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/models/CryptoCurrency.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/models/CryptoCurrency.kt @@ -14,6 +14,7 @@ import java.io.Serializable * @property derivationPath Optional path used for key derivation. `null` if the wallet does not support the * [HD Wallet](https://coinsutra.com/hd-wallets-deterministic-wallet/) feature. */ +// TODO: [REDACTED_JIRA] delete serializable sealed class CryptoCurrency : Serializable { abstract val id: ID @@ -82,7 +83,7 @@ sealed class CryptoCurrency : Serializable { private val prefix: Prefix, private val networkId: Network.ID, private val suffix: Suffix, - ) { + ) : Serializable { val value: String = buildString { append(prefix.value) @@ -113,7 +114,7 @@ sealed class CryptoCurrency : Serializable { * * The suffix can either be a raw ID or a contract address. */ - sealed class Suffix { + sealed class Suffix : Serializable { /** The value of the suffix, which could be either a raw ID or a contract address. */ abstract val value: String From ff33484b288a7d52f3c1d329b55f8c173fb07f36 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 17 Aug 2023 18:17:52 +0300 Subject: [PATCH 3/6] Updated on 2026-08-14 --- .../tangem/tap/common/redux/StateDialog.kt | 1 + .../router/DefaultTokensListRouter.kt | 20 +++++++++--- .../presentation/router/TokensListRouter.kt | 9 ++++-- .../viewmodels/TokensListViewModel.kt | 32 +++++++++++-------- .../wallet/ui/dialogs/SimpleOkDialog.kt | 7 +++- core/res/src/main/res/values-ru/strings.xml | 1 + core/res/src/main/res/values/strings.xml | 1 + .../domain/common/extensions/CardSdk.kt | 9 ++++-- 8 files changed, 55 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/redux/StateDialog.kt b/app/src/main/java/com/tangem/tap/common/redux/StateDialog.kt index 5127aae02f..5d8ad6ed1e 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/StateDialog.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/StateDialog.kt @@ -17,6 +17,7 @@ sealed class AppDialog : StateDialog { data class SimpleOkDialogRes( val headerId: Int, val messageId: Int, + val args: List = emptyList(), val onOk: VoidCallback? = null, ) : AppDialog() diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt index 4c390f27d6..a674196d0d 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.tokens.impl.presentation.router +import com.tangem.blockchain.common.Blockchain import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction import com.tangem.tap.common.extensions.dispatchDialogShow @@ -49,12 +50,21 @@ internal class DefaultTokensListRouter( ) } - override fun openUnsupportedSoltanaNetworkAlert() { - store.dispatchDialogShow( - AppDialog.SimpleOkDialogRes( + override fun openUnsupportedNetworkAlert(blockchain: Blockchain) { + val alert = when (blockchain) { + Blockchain.Solana -> AppDialog.SimpleOkDialogRes( headerId = R.string.common_warning, messageId = R.string.alert_manage_tokens_unsupported_message, - ), - ) + ) + Blockchain.Chia, Blockchain.ChiaTestnet -> AppDialog.SimpleOkDialogRes( + headerId = R.string.common_warning, + messageId = R.string.alert_manage_tokens_unsupported_curve_message, + args = listOf(blockchain.fullName), + ) + else -> null // there's no alerts for other blockchains yer + } + if (alert != null) { + store.dispatchDialogShow(alert) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt index cc4f49409c..b80e835962 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt @@ -1,5 +1,7 @@ package com.tangem.tap.features.tokens.impl.presentation.router +import com.tangem.blockchain.common.Blockchain + /** Tokens list feature router */ internal interface TokensListRouter { @@ -28,6 +30,9 @@ internal interface TokensListRouter { */ fun openRemoveWalletAlert(tokenName: String, onOkClick: () -> Unit) - /** Open alert if solana network is unsupported */ - fun openUnsupportedSoltanaNetworkAlert() + /** Open alert if solana network is unsupported + * + * @param blockchain blockchain to show alert + */ + fun openUnsupportedNetworkAlert(blockchain: Blockchain) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt index acc0ef2830..1e74d442a8 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt @@ -309,9 +309,13 @@ internal class TokensListViewModel @Inject constructor( toggledNetwork.changeToggleState() } } else { - analyticsSender.sendWhenBlockchainAdded(blockchain) - changedBlockchainList.add(blockchain) - toggledNetwork.changeToggleState() + if (isUnsupportedToken(blockchain)) { + router.openUnsupportedNetworkAlert(blockchain) + } else { + analyticsSender.sendWhenBlockchainAdded(blockchain) + changedBlockchainList.add(blockchain) + toggledNetwork.changeToggleState() + } } } @@ -350,17 +354,8 @@ internal class TokensListViewModel @Inject constructor( toggledNetwork.changeToggleState() } } else { - val scanResponse = reduxStateHolder.scanResponse - val isUnsupportedToken = - !( - scanResponse?.card?.canHandleToken( - blockchain = token.blockchain, - cardTypesResolver = scanResponse.cardTypesResolver, - ) ?: false - ) - - if (isUnsupportedToken) { - router.openUnsupportedSoltanaNetworkAlert() + if (isUnsupportedToken(token.blockchain)) { + router.openUnsupportedNetworkAlert(token.blockchain) } else { analyticsSender.sendWhenTokenAdded(token.token) changedTokensList.add(token) @@ -370,6 +365,15 @@ internal class TokensListViewModel @Inject constructor( } } + private fun isUnsupportedToken(blockchain: Blockchain): Boolean { + val scanResponse = reduxStateHolder.scanResponse + val canHandleToken = scanResponse?.card?.canHandleToken( + blockchain = blockchain, + cardTypesResolver = scanResponse.cardTypesResolver, + ) ?: false + return !canHandleToken + } + private companion object { const val MAIN_NETWORK_LABEL = "MAIN" } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt index 6c12a9f65c..8f3a42060f 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/SimpleOkDialog.kt @@ -25,9 +25,14 @@ object SimpleOkDialog { } fun create(dialog: AppDialog.SimpleOkDialogRes, context: Context): AlertDialog { + val message = if (dialog.args.isEmpty()) { + context.getString(dialog.messageId) + } else { + context.getString(dialog.messageId, *dialog.args.toTypedArray()) + } return AlertDialog.Builder(context).apply { setTitle(context.getString(dialog.headerId)) - setMessage(dialog.messageId) + setMessage(message) setPositiveButton(R.string.common_ok) { _, _ -> } setOnDismissListener { store.dispatchDialogHide() diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index ab73d49ede..843b3f4be1 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -15,6 +15,7 @@ Причина: %s Не могу отправить транзакцию Внимание! Валюты на разных сетях имеют разные адреса. Убедитесь, что адрес соответствует сети, в которой вы отправляете средства. + Для активации криптографии сети %1$s необходимо сбросить кошелек до заводских настроек. Пожалуйста, выведите свои средства, чтобы не потерять их, после сброса доступ к текущему кошельку будет невозможен. Токены в сети Solana не поддерживаются этой картой из-за ограничений прошивки. Эта карта не является платежным средством. В настоящее время мы не можем сопоставить количество подписей на карте с информацией в блокчейне. Это нормально, но в редких случаях может означать, что предыдущий владелец удерживает подписанную транзакцию от публикации, что является поводом для беспокойства.\nНе принимайте эту карту в качестве физического платежа от кого-то, кому вы не доверяете.\nВо всех остальных отношениях эта карта совершенно безопасна.\nTangem — единственный аппаратный кошелек, предлагающий защиту методом подсчета подписей. У вас возникли трудности со сканированием карты? diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index f1471f6745..9d7e67dfea 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ Reason: %s Can\'t send a transaction Note that tokens on different networks have different addresses. Double check that your address matches the network when you transfer funds. + To activate the %1$s blockchain\'s cryptographic encryption, you\'ll need to reset the wallet to factory settings. Please withdraw your funds before doing so to ensure that you don\'t lose them, and then complete the reset process. Access to the current wallet will not be possible after the reset. Tokens in Solana network are not supported by this card due to firmware limitation. This card is not a bearer note. We can\'t currently match the signature count on the card with the information on the blockchain. This is normal but in rare cases can mean a previous holder is holding back an offline signature, which is a security concern.\nDo not accept this card as physical payment from someone you don\'t trust.\nIt\'s perfectly safe in all other respects.\nTangem is the only hardware wallet to offer signature count protection. Are you having difficulty scanning your card? diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt index 1efeec3cf8..f8e958583f 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt @@ -15,10 +15,13 @@ val FirmwareVersion.Companion.SolanaTokensAvailable fun CardDTO.supportedBlockchains(cardTypesResolver: CardTypesResolver): List { val supportedBlockchains = if (firmwareVersion < FirmwareVersion.MultiWalletAvailable) { - Blockchain.fromCurve(EllipticCurve.Secp256k1) + Blockchain.fromCurve(EllipticCurve.Secp256k1).toMutableList() + } else if (!cardTypesResolver.isWallet2() && !cardTypesResolver.isTangemWallet()) { + // need for old multiwallet that supports only secp256k1 + wallets.flatMap { Blockchain.fromCurve(it.curve) }.distinct().toMutableList() } else { - wallets.flatMap { Blockchain.fromCurve(it.curve) }.distinct() - }.toMutableList() + Blockchain.values().toMutableList() + } // disabled Cardano for wallet 2 for now, should be enabled after key processed // ([REDACTED_JIRA]) if (cardTypesResolver.isWallet2()) { From 1daef3df4778dd35726dbbcfaf206e7bd3afa2a2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 18 Aug 2023 01:52:55 +0300 Subject: [PATCH 4/6] Updated on 2026-08-14 --- .../middlewares/AppCurrencyMiddleware.kt | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt index 402f1aaef9..857d649336 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt @@ -3,6 +3,7 @@ package com.tangem.tap.features.wallet.redux.middlewares import com.tangem.common.extensions.guard import com.tangem.core.analytics.Analytics import com.tangem.data.source.preferences.model.DataSourceCurrency +import com.tangem.data.source.preferences.model.DataSourceFiatCurrency import com.tangem.data.source.preferences.storage.FiatCurrenciesPrefStorage import com.tangem.domain.appcurrency.repository.AppCurrencyRepository import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles @@ -52,21 +53,10 @@ class AppCurrencyMiddleware( } private fun selectCurrency(action: WalletAction.AppCurrencyAction.SelectAppCurrency) { - Analytics.send(MainScreen.MainCurrencyChanged(AnalyticsParam.CurrencyType.FiatCurrency(action.fiatCurrency))) - - scope.launch { - appCurrencyRepository.changeAppCurrency(action.fiatCurrency.code) - - store.dispatchWithMain(GlobalAction.ChangeAppCurrency(action.fiatCurrency)) - store.dispatchWithMain(DetailsAction.ChangeAppCurrency(action.fiatCurrency)) - store.dispatchWithMain(WalletSelectorAction.ChangeAppCurrency(action.fiatCurrency)) - - val selectedUserWallet = userWalletsListManager.selectedUserWalletSync.guard { - Timber.e("Unable to select currency, no user wallet selected") - return@launch - } - - tapWalletManager.loadData(selectedUserWallet, refresh = true) + if (featureToggles.isRedesignedScreenEnabled) { + selectCurrencyNew(action.fiatCurrency) + } else { + selectCurrencyLegacy(action.fiatCurrency) } } @@ -119,6 +109,42 @@ class AppCurrencyMiddleware( } } + private fun selectCurrencyNew(fiatCurrency: FiatCurrency) { + Analytics.send(MainScreen.MainCurrencyChanged(AnalyticsParam.CurrencyType.FiatCurrency(fiatCurrency))) + + scope.launch { + appCurrencyRepository.changeAppCurrency(fiatCurrency.code) + + store.dispatchWithMain(GlobalAction.ChangeAppCurrency(fiatCurrency)) + store.dispatchWithMain(DetailsAction.ChangeAppCurrency(fiatCurrency)) + store.dispatchWithMain(WalletSelectorAction.ChangeAppCurrency(fiatCurrency)) + + val selectedUserWallet = userWalletsListManager.selectedUserWalletSync.guard { + Timber.e("Unable to select currency, no user wallet selected") + return@launch + } + + tapWalletManager.loadData(selectedUserWallet, refresh = true) + } + } + + private fun selectCurrencyLegacy(fiatCurrency: FiatCurrency) { + Analytics.send(MainScreen.MainCurrencyChanged(AnalyticsParam.CurrencyType.FiatCurrency(fiatCurrency))) + fiatCurrenciesPrefStorage.saveAppCurrency( + with(fiatCurrency) { DataSourceFiatCurrency(code, name, symbol) }, + ) + store.dispatch(GlobalAction.ChangeAppCurrency(fiatCurrency)) + store.dispatch(DetailsAction.ChangeAppCurrency(fiatCurrency)) + store.dispatch(WalletSelectorAction.ChangeAppCurrency(fiatCurrency)) + val selectedUserWallet = userWalletsListManager.selectedUserWalletSync.guard { + Timber.e("Unable to select currency, no user wallet selected") + return + } + scope.launch { + tapWalletManager.loadData(selectedUserWallet, refresh = true) + } + } + private fun List.mapToUiModel(): List { return this.map { FiatCurrency( From ca7f699664d2c047fee351f1a5120e674676cccd Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 18 Aug 2023 10:00:25 +0300 Subject: [PATCH 5/6] Updated on 2026-08-14 --- .../com/tangem/domain/common/configs/Wallet2CardConfig.kt | 7 ++++--- gradle/dependencies.toml | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/Wallet2CardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/Wallet2CardConfig.kt index 58ecaef77c..12f3f24dd3 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/configs/Wallet2CardConfig.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/Wallet2CardConfig.kt @@ -18,13 +18,14 @@ object Wallet2CardConfig : CardConfig { * Logic to determine primary curve for blockchain in TangemWallet 2.0 */ override fun primaryCurve(blockchain: Blockchain): EllipticCurve? { + // order is important, new curve is preferred for wallet 2 return when { - blockchain.getSupportedCurves().contains(EllipticCurve.Secp256k1) -> { - EllipticCurve.Secp256k1 - } blockchain.getSupportedCurves().contains(EllipticCurve.Ed25519Slip0010) -> { EllipticCurve.Ed25519Slip0010 } + blockchain.getSupportedCurves().contains(EllipticCurve.Secp256k1) -> { + EllipticCurve.Secp256k1 + } blockchain.getSupportedCurves().contains(EllipticCurve.Bls12381G2Aug) -> { EllipticCurve.Bls12381G2Aug } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index a3cdb77372..3d58165539 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,7 +80,7 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.10-320" +tangemBlockchainSdk = "release-app_4.10-321" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.10-290" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From eec880ca815b65235d5eafb923bab53fdd263bcf Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 18 Aug 2023 15:32:17 +0400 Subject: [PATCH 6/6] Updated on 2026-08-14 --- .../data/WalletConnectSessionsRepositoryImpl.kt | 2 +- .../handlers/WalletConnectLinkIntentHandler.kt | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectSessionsRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectSessionsRepositoryImpl.kt index fe3aab634c..99f4351a93 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectSessionsRepositoryImpl.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectSessionsRepositoryImpl.kt @@ -25,7 +25,7 @@ class WalletConnectSessionsRepositoryImpl @Inject constructor( val fileContent = fileReader.readFile(getFileNameForUserWallet(userWallet)) sessionsAdapter.fromJson(fileContent) ?: emptyList() } catch (exception: Exception) { - Timber.e(exception) + Timber.d(exception) emptyList() } } diff --git a/app/src/main/java/com/tangem/tap/features/intentHandler/handlers/WalletConnectLinkIntentHandler.kt b/app/src/main/java/com/tangem/tap/features/intentHandler/handlers/WalletConnectLinkIntentHandler.kt index 79e4774682..95d2e3abe7 100644 --- a/app/src/main/java/com/tangem/tap/features/intentHandler/handlers/WalletConnectLinkIntentHandler.kt +++ b/app/src/main/java/com/tangem/tap/features/intentHandler/handlers/WalletConnectLinkIntentHandler.kt @@ -7,6 +7,8 @@ import com.tangem.tap.domain.walletconnect.WalletConnectManager import com.tangem.tap.features.details.redux.walletconnect.WalletConnectAction import com.tangem.tap.features.intentHandler.IntentHandler import com.tangem.tap.store +import timber.log.Timber +import java.net.URLDecoder /** [REDACTED_AUTHOR] @@ -23,10 +25,16 @@ class WalletConnectLinkIntentHandler : IntentHandler { else -> null } - return if (wcUri == null) { + return if (wcUri.isNullOrBlank()) { false } else { - store.dispatchWithMain(WalletConnectAction.HandleDeepLink(wcUri)) + val decodedWcUri = try { + URLDecoder.decode(wcUri, DEFAULT_CHARSET_NAME) + } catch (e: Exception) { + Timber.e(e) + return false + } + store.dispatchWithMain(WalletConnectAction.HandleDeepLink(decodedWcUri)) true } } @@ -34,5 +42,6 @@ class WalletConnectLinkIntentHandler : IntentHandler { private companion object { private const val TANGEM_SCHEME = "tangem" private const val TANGEM_WC_PREFIX = "tangem://wc?uri=" + private const val DEFAULT_CHARSET_NAME = "UTF-8" } } \ No newline at end of file