From c237a4e50c78d56d7e9dba0939aa8a770ca812ac Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 18 Aug 2023 17:21:54 +0300 Subject: [PATCH 01/32] Updated on 2026-08-14 --- .../products/wallet/ui/dialogs/ResetBackupCardDialog.kt | 9 +++++---- core/res/src/main/res/values-ru/strings.xml | 2 +- core/res/src/main/res/values-zh-rTW/strings.xml | 2 +- core/res/src/main/res/values/strings.xml | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ResetBackupCardDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ResetBackupCardDialog.kt index 0632c6a120..0da9a7063a 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ResetBackupCardDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/dialogs/ResetBackupCardDialog.kt @@ -10,12 +10,13 @@ import com.tangem.wallet.R object ResetBackupCardDialog { fun create(context: Context, cardId: String): AlertDialog { return AlertDialog.Builder(context).apply { - setTitle(R.string.common_warning) + setTitle(R.string.common_attention) setMessage(R.string.onboarding_linking_error_card_with_wallets) - setPositiveButton(R.string.common_continue) { _, _ -> - store.dispatch(BackupAction.ResetBackupCard(cardId)) + setPositiveButton(R.string.common_cancel) { _, _ -> + /* no-op */ } - setNegativeButton(R.string.common_cancel) { _, _ -> + setNegativeButton(R.string.common_reset) { _, _ -> + store.dispatch(BackupAction.ResetBackupCard(cardId)) } setOnDismissListener { store.dispatch(GlobalAction.HideDialog) diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 843b3f4be1..97aae433d7 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -43,7 +43,6 @@ Использовать эту карту для сброса кода доступа на других картах в этом кошельке Отключить возможность сброса кода доступа на этой карте или других картах этого кошелька Восстановление кода доступа - Сбросить Вы уверены, что хотите это сделать? Смена кода доступа Код доступа будет изменен только на данной карте @@ -96,6 +95,7 @@ Получить Отклонить Перезагрузить + Сбросить Сохранить изменения Искать Поиск токенов diff --git a/core/res/src/main/res/values-zh-rTW/strings.xml b/core/res/src/main/res/values-zh-rTW/strings.xml index 748251aefa..20f0e81a58 100644 --- a/core/res/src/main/res/values-zh-rTW/strings.xml +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -38,7 +38,6 @@ 允許您使用此卡重置此錢包中其他卡上的訪問密碼 禁用重置此卡或此錢包中其他卡上的訪問密碼的功能 恢復訪問密碼 - 重置 您確定要這麼做嗎? 更改訪問密碼 訪問密碼將僅在此卡上更改 @@ -80,6 +79,7 @@ OK 主卡片 拒絕 + 重置 保存設置 搜索 搜尋代幣 diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 9d7e67dfea..8275351d0b 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -41,7 +41,6 @@ Allows you to use this card to reset access code on other cards in this wallet Disable the ability to reset the access code on this card or other cards in this wallet Access code recovery - Reset Are you sure you want to do this? Change Access Code Access code will be changed on this card only @@ -95,6 +94,7 @@ Receive Reject Reload + Reset Save changes Search Search tokens From 3e6691a1061858926335012e87878cd840ee9928 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 18 Aug 2023 17:28:15 +0300 Subject: [PATCH 02/32] Updated on 2026-08-14 --- .../presentation/viewmodels/TokensListViewModel.kt | 12 +++++++++++- .../com/tangem/domain/common/extensions/CardSdk.kt | 4 ++++ .../domain/common/extensions/WalletManagerFactory.kt | 1 + gradle/dependencies.toml | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) 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 1e74d442a8..ffb1de2c52 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 @@ -14,6 +14,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.ui.extensions.getActiveIconRes import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation +import com.tangem.domain.common.extensions.canHandleBlockchain import com.tangem.domain.common.extensions.canHandleToken import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.util.cardTypesResolver @@ -309,7 +310,7 @@ internal class TokensListViewModel @Inject constructor( toggledNetwork.changeToggleState() } } else { - if (isUnsupportedToken(blockchain)) { + if (isUnsupportedBlockchain(blockchain)) { router.openUnsupportedNetworkAlert(blockchain) } else { analyticsSender.sendWhenBlockchainAdded(blockchain) @@ -374,6 +375,15 @@ internal class TokensListViewModel @Inject constructor( return !canHandleToken } + private fun isUnsupportedBlockchain(blockchain: Blockchain): Boolean { + val scanResponse = reduxStateHolder.scanResponse + val canHandleToken = scanResponse?.card?.canHandleBlockchain( + blockchain = blockchain, + cardTypesResolver = scanResponse.cardTypesResolver, + ) ?: false + return !canHandleToken + } + private companion object { const val MAIN_NETWORK_LABEL = "MAIN" } 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 f8e958583f..0f0c628689 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 @@ -53,4 +53,8 @@ fun CardDTO.supportedTokens(cardTypesResolver: CardTypesResolver): List { diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 3d58165539..fadee9849b 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-321" +tangemBlockchainSdk = "release-app_4.10-324" #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 d3cf5c43165280a7a3788cb6157b3233c503d8d2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 18 Aug 2023 17:30:28 +0300 Subject: [PATCH 03/32] Updated on 2026-08-14 --- .../products/wallet/ui/OnboardingSeedPhraseStateHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingSeedPhraseStateHandler.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingSeedPhraseStateHandler.kt index 05eaf95d55..11f7664aa8 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingSeedPhraseStateHandler.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingSeedPhraseStateHandler.kt @@ -59,7 +59,7 @@ internal class OnboardingSeedPhraseStateHandler( private fun setMainScreenToolbarTitle(walletFragment: OnboardingWalletFragment, subScreen: SeedPhraseScreen) { val titleResId = when (subScreen) { - SeedPhraseScreen.Intro, + SeedPhraseScreen.Intro -> R.string.wallet_title SeedPhraseScreen.AboutSeedPhrase, SeedPhraseScreen.YourSeedPhrase, SeedPhraseScreen.CheckSeedPhrase, From 70346609507c77859fdfe80a282ba059e8bcd30b Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 21 Aug 2023 10:32:04 +0300 Subject: [PATCH 04/32] Updated on 2026-08-14 --- .../com/tangem/domain/common/extensions/CardSdk.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 0f0c628689..2509479732 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 @@ -20,6 +20,7 @@ fun CardDTO.supportedBlockchains(cardTypesResolver: CardTypesResolver): List Date: Mon, 21 Aug 2023 11:01:18 +0300 Subject: [PATCH 05/32] Updated on 2026-08-14 --- .../com/tangem/domain/common/extensions/CardSdk.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 0f0c628689..2509479732 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 @@ -20,6 +20,7 @@ fun CardDTO.supportedBlockchains(cardTypesResolver: CardTypesResolver): List Date: Mon, 21 Aug 2023 19:22:57 +0300 Subject: [PATCH 06/32] Updated on 2026-08-14 --- .../com/tangem/tap/features/BaseFragment.kt | 18 ++++++++---------- .../wallet/ui/OnboardingWalletFragment.kt | 3 +-- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/BaseFragment.kt b/app/src/main/java/com/tangem/tap/features/BaseFragment.kt index cddf55cc07..cd6161868b 100644 --- a/app/src/main/java/com/tangem/tap/features/BaseFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/BaseFragment.kt @@ -5,7 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.activity.OnBackPressedCallback +import androidx.activity.addCallback import androidx.appcompat.widget.Toolbar import androidx.core.view.MenuHost import androidx.core.view.MenuProvider @@ -71,13 +71,11 @@ interface FragmentOnBackPressedHandler { @SuppressLint("FragmentBackPressedCallback") fun Fragment.addBackPressHandler(handler: FragmentOnBackPressedHandler) { - activity?.onBackPressedDispatcher?.addCallback( - this, - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - handler.handleOnBackPressed() - } - }, - ) - view?.findViewById(R.id.toolbar)?.setNavigationOnClickListener { activity?.onBackPressed() } + requireActivity().onBackPressedDispatcher.addCallback { + handler.handleOnBackPressed() + } + + view?.findViewById(R.id.toolbar)?.setNavigationOnClickListener { + handler.handleOnBackPressed() + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index 5b6afc478f..49f78995bc 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -97,8 +97,7 @@ class OnboardingWalletFragment : (activity as? AppCompatActivity)?.setSupportActionBar(binding.toolbar) - binding.toolbar.setNavigationOnClickListener { activity?.onBackPressed() } - addBackPressHandler(this) + addBackPressHandler(handler = this) store.dispatch(OnboardingWallet2Action.Init(seedPhraseViewModel.maxProgress)) store.dispatch(OnboardingWalletAction.Init) From ea0bfce184802eada8675106b0c14d8049519376 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 21 Aug 2023 13:30:10 +0300 Subject: [PATCH 07/32] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index fadee9849b..4f569f032c 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -82,7 +82,7 @@ okHttp-prettyLogging = "3.1.0" # region Tangem tangemBlockchainSdk = "release-app_4.10-324" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "release-app_4.10-290" +tangemCardSdk = "release-app_4.10-292" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem From 01ab7397676e2d824eddfc0d549f21069e527382 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 21 Aug 2023 14:21:32 +0300 Subject: [PATCH 08/32] Updated on 2026-08-14 --- core/res/src/main/res/values-ru/strings.xml | 22 +++++++++---------- .../src/main/res/values-zh-rTW/strings.xml | 6 ----- core/res/src/main/res/values/strings.xml | 16 +++++++------- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 97aae433d7..fb0916e031 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -99,7 +99,7 @@ Сохранить изменения Искать Поиск токенов - Секретная фраза + Seed-фраза Выберите действие Продать Отправить @@ -249,18 +249,18 @@ Код доступа Подключиться Резервная копия - Прочитать о секретной фразе + Прочитать о seed-фразе Запишите эти 12 слов в порядке, указанном ниже, и сохраните их в надежном месте. - Ваша секретная фраза - Чтобы импортировать кошелек, введите секретную фразу в поле ниже - Cоздать секретную фразу + Ваша seed-фраза + Чтобы импортировать кошелек, введите seed-фразу в поле ниже + Создать seed-фразу Импорт кошелька - Секретная фраза — это набор слов, который дает возможность восстановить кошелек. В отличие от ключей, сгенерированных картой, seed-фраза не защищена и может быть скопирована и украдена. Используйте этот вариант на свой страх и риск. - Использовать секретную фразу - Неверная секретная фраза. Пожалуйста, проверьте порядок слов. - Неверная секретная фраза. Пожалуйста, проверьте орфографию. + Seed-фраза — это набор слов, который дает возможность восстановить кошелек. В отличие от ключей, сгенерированных картой, seed-фраза не защищена и может быть скопирована и украдена. Используйте этот вариант на свой страх и риск. + Использовать seed-фразу + Неверная seed-фраза. Пожалуйста, проверьте порядок слов. + Неверная seed-фраза. Пожалуйста, проверьте орфографию. Устаревший - Чтобы проверить, правильно ли вы записали секретную фразу, введите 2-е, 7-е и 11-е слова + Чтобы проверить, правильно ли вы записали seed-фразу, введите 2-е, 7-е и 11-е слова Итак, проверим Для начала работы просто запросите начисление wxDAI на свой кошелек Это займет несколько секунд @@ -567,6 +567,6 @@ Это необратимое действие Войти с %s Сканировать карту - Используйте %s или код доступа для входа в приложение + Используйте %s или отсканируйте карту для входа в приложение C возвращением! diff --git a/core/res/src/main/res/values-zh-rTW/strings.xml b/core/res/src/main/res/values-zh-rTW/strings.xml index 20f0e81a58..ad55e197d1 100644 --- a/core/res/src/main/res/values-zh-rTW/strings.xml +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -215,16 +215,10 @@ 創建備份 閱讀更多關於助記詞的訊息 按照下面給出的順序寫下這 12 個單詞,並將它們存放在安全秘密的地方。 - 您的助記詞 - 要導入您的錢包,請在下面的字段中輸入您的助記詞 生成助記詞 導入錢包 - 註記詞是一系列能夠恢復錢包的單詞。與卡片生成的密鑰不同,助記詞不受保護,可以被複製和竊取。使用此選項需要您自擔風險。 使用助記詞 - 無效的助記詞。請檢查單詞順序。 - 助記詞無效。請檢查您的拼寫。 Legacy - 為了檢查您是否正確輸入了助記詞,請輸入第 2、7 和 11 個單詞 那麼,讓我們檢查一下 要開始,只需將 wxDAI 獲取到您的錢包 這會花上幾秒 diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 8275351d0b..a4bc3c019a 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -231,7 +231,7 @@ Skip for later How does it work? Let\'s generate all the keys on your card and create a secure wallet - Create wallet + Create a wallet Create a wallet Other options Your keys will be securely generated inside the card. There is no seed phrase, which means nobody can export or steal it. @@ -245,18 +245,18 @@ Pin code Connect Creating a backup - Read more about seed phrases + Read more about seed phrase Write these 12 words down in the order given below and store them in a safe and secret place. - Your secret phrase - To import your wallet, enter your secret phrase in the field below + Your seed phrase + To import your wallet, enter your seed phrase in the field below Generate seed phrase Import wallet - A secret phrase is a series of words that allows you to recover your wallet. Unlike the keys generated by the card, secret phrases are unprotected and can be copied and stolen. Use this option at your own risk. + A seed phrase is a series of words that allows you to recover your wallet. Unlike the keys generated by the card, seed phrases are unprotected and can be copied and stolen. Use this option at your own risk. Use seed phrase - Invalid secret phrase. Please check the word order. - Invalid secret phrase. Please check your spelling. + Invalid seed phrase. Please check the word order. + Invalid seed phrase. Please check your spelling. Legacy - To check whether you’ve written down your secret phrase correctly, please enter the 2nd, 7th and 11th words + To check whether you’ve written down your seed phrase correctly, please enter the 2nd, 7th and 11th words So, let’s check To get started, simply claim wxDAI to your wallet It will take a few seconds From a4be09ae1e7e608361c20fd82cbfbf740ce572c7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 22 Aug 2023 19:07:01 +0300 Subject: [PATCH 09/32] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 4f569f032c..f115058405 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-324" +tangemBlockchainSdk = "release-app_4.10-328" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.10-292" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From f5d7d2af45e7a18c2a600e3713335aa77ae0ce71 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 22 Aug 2023 19:07:12 +0300 Subject: [PATCH 10/32] Updated on 2026-08-14 --- .../stateSubscribers/SendStateSubscriber.kt | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt index 7c12e82496..6de86eba68 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt @@ -261,19 +261,34 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber } @Suppress("MagicNumber") - private fun handleFeeState(fg: SendFragment, state: FeeState) = with(fg.binding.clNetworkFee) { - fg.view?.findViewById(R.id.clNetworkFee)?.show(state.mainLayoutIsVisible) - flExpandCollapse.imvExpandCollapse.rotation = if (state.controlsLayoutIsVisible) 0f else 180f - llFeeControlsContainer.show(state.controlsLayoutIsVisible) - chipGroup.show(state.feeChipGroupIsVisible) + private fun handleFeeState(fg: SendFragment, state: FeeState) { + with(fg.binding.clNetworkFee) { + fg.view?.findViewById(R.id.clNetworkFee)?.show(state.mainLayoutIsVisible) + flExpandCollapse.imvExpandCollapse.rotation = if (state.controlsLayoutIsVisible) 0f else 180f + llFeeControlsContainer.show(state.controlsLayoutIsVisible) + chipGroup.show(state.feeChipGroupIsVisible) - swIncludeFee.isEnabled = state.includeFeeSwitcherIsEnabled - if (swIncludeFee.isChecked != state.feeIsIncluded) { - swIncludeFee.isChecked = state.feeIsIncluded + swIncludeFee.isEnabled = state.includeFeeSwitcherIsEnabled + if (swIncludeFee.isChecked != state.feeIsIncluded) { + swIncludeFee.isChecked = state.feeIsIncluded + } + + val chipId = FeeUiHelper.toId(state.selectedFeeType) + if (chipGroup.checkedChipId != chipId && chipId != View.NO_ID) chipGroup.check(chipId) + } + with(fg.binding.clReceiptContainer) { + when (state.progressState) { + ProgressState.Loading -> { + tvReceiptFeeValue.hide() + pbReceiptFee.show() + } + ProgressState.Done -> { + pbReceiptFee.hide() + tvReceiptFeeValue.show() + } + else -> {} + } } - - val chipId = FeeUiHelper.toId(state.selectedFeeType) - if (chipGroup.checkedChipId != chipId && chipId != View.NO_ID) chipGroup.check(chipId) } @Suppress("LongMethod", "ComplexMethod") From c1afd030f309a360f77170a22778f7a5b3d46c10 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Aug 2023 13:25:24 +0300 Subject: [PATCH 11/32] Updated on 2026-08-14 --- .../viewmodels/AddCustomTokenViewModel.kt | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) 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 3b5e96c9e9..0a5151fd23 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 @@ -145,6 +145,7 @@ internal class AddCustomTokenViewModel @Inject constructor( fun createDerivationPathSelectorAdditionalItem( blockchain: Blockchain, type: DerivationPathSelectorType = DerivationPathSelectorType.BLOCKCHAIN, + derivationStyle: DerivationStyle?, ): SelectorItem.TitleWithSubtitle { return when (type) { DerivationPathSelectorType.DEFAULT -> SelectorItem.TitleWithSubtitle( @@ -160,7 +161,9 @@ internal class AddCustomTokenViewModel @Inject constructor( type = DerivationPathSelectorType.CUSTOM, ) DerivationPathSelectorType.BLOCKCHAIN -> SelectorItem.TitleWithSubtitle( - title = blockchain.derivationPath(DerivationStyle.LEGACY)?.rawPath?.let(TextReference::Str) + title = blockchain.derivationPath( + style = derivationStyle, + )?.rawPath?.let(TextReference::Str) ?: TextReference.Res(R.string.custom_token_derivation_path_default), subtitle = TextReference.Str(blockchain.fullName), blockchain = blockchain, @@ -251,9 +254,11 @@ internal class AddCustomTokenViewModel @Inject constructor( } private fun createDerivationPathsSelectorField(): AddCustomTokenSelectorField.DerivationPath? { - if (reduxStateHolder.scanResponse?.card?.settings?.isHDWalletAllowed == false) return null + val scanResponse = reduxStateHolder.scanResponse + if (scanResponse?.card?.settings?.isHDWalletAllowed == false) return null - val selectorItems = getDerivationPathsSelectorItems() + val selectorItems = + getDerivationPathsSelectorItems(scanResponse?.derivationStyleProvider?.getDerivationStyle()) return AddCustomTokenSelectorField.DerivationPath( label = TextReference.Res(R.string.custom_token_derivation_path_input_title), selectedItem = requireNotNull(selectorItems.firstOrNull()), @@ -263,22 +268,31 @@ internal class AddCustomTokenViewModel @Inject constructor( ) } - private fun getDerivationPathsSelectorItems(): List { + private fun getDerivationPathsSelectorItems( + derivationStyle: DerivationStyle?, + ): List { return listOf( createDerivationPathSelectorAdditionalItem( blockchain = Blockchain.Unknown, type = DerivationPathSelectorType.DEFAULT, + derivationStyle = derivationStyle, ), createDerivationPathSelectorAdditionalItem( blockchain = Blockchain.Unknown, type = DerivationPathSelectorType.CUSTOM, + derivationStyle = derivationStyle, ), ) + Blockchain.values() .filter { blockchain -> blockchain.isSupportedInApp() && !blockchain.isTestnet() } .sortedBy(Blockchain::fullName) - .map(::createDerivationPathSelectorAdditionalItem) + .map { + createDerivationPathSelectorAdditionalItem( + blockchain = it, + derivationStyle = derivationStyle, + ) + } } private fun createDerivationPathInputField(): AddCustomTokenInputField.DerivationPath? { @@ -782,6 +796,7 @@ internal class AddCustomTokenViewModel @Inject constructor( } fun onResetButtonClick() { + val scanResponse = reduxStateHolder.scanResponse with(uiState.form) { uiState = uiState.copySealed( form = uiState.form.copy( @@ -799,11 +814,11 @@ internal class AddCustomTokenViewModel @Inject constructor( decimalsInputField = decimalsInputField.copy(value = "", isEnabled = false), derivationPathSelectorField = derivationPathSelectorField?.copy( isEnabled = true, - selectedItem = formStateBuilder - .createDerivationPathSelectorAdditionalItem( - blockchain = Blockchain.Unknown, - type = DerivationPathSelectorType.DEFAULT, - ), + selectedItem = formStateBuilder.createDerivationPathSelectorAdditionalItem( + blockchain = Blockchain.Unknown, + type = DerivationPathSelectorType.DEFAULT, + derivationStyle = scanResponse?.derivationStyleProvider?.getDerivationStyle(), + ), ), ), ) From 233a85632f14aaea8dc0242bd362d795f8a7a4a8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 22 Aug 2023 18:43:38 +0300 Subject: [PATCH 12/32] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/tokens/models/CryptoCurrency.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6c46276300..970edc26f5 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 @@ -135,7 +135,7 @@ sealed class CryptoCurrency : Serializable { } } - sealed class StandardType { + sealed class StandardType : Serializable { abstract val name: String object ERC20 : StandardType() { From 03b11300e3dbf6f4ae6ac201a19ce0f78c05a84b Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 22 Aug 2023 19:06:17 +0300 Subject: [PATCH 13/32] Updated on 2026-08-14 --- .../tap/domain/tasks/product/ScanProductTask.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index d04cb9a62e..2717354cc4 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -3,6 +3,7 @@ package com.tangem.tap.domain.tasks.product import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.common.card.Card +import com.tangem.common.card.FirmwareVersion import com.tangem.common.core.CardSession import com.tangem.common.core.CardSessionRunnable import com.tangem.common.core.TangemError @@ -53,7 +54,7 @@ class ScanProductTask( } val cardDto = CardDTO(card) - val error = getErrorIfExcludedCard(cardDto) + val error = getErrorIfExcludedCard(cardDto, card) if (error != null) { callback(CompletionResult.Failure(error)) return @@ -83,9 +84,15 @@ class ScanProductTask( } } - private fun getErrorIfExcludedCard(cardDto: CardDTO): TangemError? { + private fun getErrorIfExcludedCard(cardDto: CardDTO, card: Card): TangemError? { if (cardDto.isExcluded) return TapSdkError.CardForDifferentApp if (cardDto.isNotSupportedInThatRelease) return TapSdkError.CardNotSupportedByRelease + // according ios decline card lower Ed25519Slip0010Available version and contains imported wallets + if (card.firmwareVersion < FirmwareVersion.Ed25519Slip0010Available && + card.wallets.any { it.isImported } + ) { + return TapSdkError.CardNotSupportedByRelease + } return null } } From e996fe1228be62b792d0327efa394b267bcdfb43 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Aug 2023 16:17:16 +0300 Subject: [PATCH 14/32] Updated on 2026-08-14 --- .../com/tangem/domain/common/TwinsHelper.kt | 22 ++++---- .../tangem/domain/common/TwinsHelperTest.kt | 50 +++++++++++++++++++ 2 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 domain/legacy/src/test/java/com/tangem/domain/common/TwinsHelperTest.kt diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt b/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt index 73c31f5a28..c30c02b77c 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/TwinsHelper.kt @@ -51,17 +51,19 @@ object TwinsHelper { * cb64 <-> cb65 */ fun isTwinsCompatible(firstCardId: String, secondCardId: String): Boolean { - if (firstCardId.startsWith(FIRST_CARD_FIRST_SERIES) && - secondCardId.startsWith(SECOND_CARD_FIRST_SERIES) - ) { - return true + return secondCardId.startsWith(getCompatibleTwinCardId(firstCardId)) + } + + private fun getCompatibleTwinCardId(cardId: String): String { + return when { + cardId.startsWith(FIRST_CARD_FIRST_SERIES) -> SECOND_CARD_FIRST_SERIES + cardId.startsWith(FIRST_CARD_SECOND_SERIES) -> SECOND_CARD_SECOND_SERIES + cardId.startsWith(SECOND_CARD_FIRST_SERIES) -> FIRST_CARD_FIRST_SERIES + cardId.startsWith(SECOND_CARD_SECOND_SERIES) -> FIRST_CARD_SECOND_SERIES + else -> { + "unknown" + } } - if (firstCardId.startsWith(FIRST_CARD_SECOND_SERIES) && - secondCardId.startsWith(SECOND_CARD_SECOND_SERIES) - ) { - return true - } - return false } } diff --git a/domain/legacy/src/test/java/com/tangem/domain/common/TwinsHelperTest.kt b/domain/legacy/src/test/java/com/tangem/domain/common/TwinsHelperTest.kt new file mode 100644 index 0000000000..2fc624d9b8 --- /dev/null +++ b/domain/legacy/src/test/java/com/tangem/domain/common/TwinsHelperTest.kt @@ -0,0 +1,50 @@ +package com.tangem.domain.common + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class TwinsHelperTest { + + private val pack1Twins = listOf( + "CB610000021", + "CB620000031", + ) + + private val pack2Twins = listOf( + "CB640000012", + "CB650000011", + ) + + @Test + fun `twins compatibility pack 1 success`() { + assertTrue(TwinsHelper.isTwinsCompatible(pack1Twins[0], pack1Twins[1])) + assertTrue(TwinsHelper.isTwinsCompatible(pack1Twins[1], pack1Twins[0])) + } + + @Test + fun `twins compatibility pack 1 same cards`() { + assertFalse(TwinsHelper.isTwinsCompatible(pack1Twins[0], pack1Twins[0])) + assertFalse(TwinsHelper.isTwinsCompatible(pack1Twins[1], pack1Twins[1])) + } + + @Test + fun `twins compatibility pack 2 success`() { + assertTrue(TwinsHelper.isTwinsCompatible(pack2Twins[0], pack2Twins[1])) + assertTrue(TwinsHelper.isTwinsCompatible(pack2Twins[1], pack2Twins[0])) + } + + @Test + fun `twins compatibility pack 2 same cards`() { + assertFalse(TwinsHelper.isTwinsCompatible(pack2Twins[0], pack2Twins[0])) + assertFalse(TwinsHelper.isTwinsCompatible(pack2Twins[1], pack2Twins[1])) + } + + @Test + fun `twins compatibility false for different packs`() { + assertFalse(TwinsHelper.isTwinsCompatible(pack2Twins[0], pack1Twins[1])) + assertFalse(TwinsHelper.isTwinsCompatible(pack1Twins[1], pack2Twins[0])) + assertFalse(TwinsHelper.isTwinsCompatible(pack1Twins[0], pack2Twins[1])) + assertFalse(TwinsHelper.isTwinsCompatible(pack2Twins[1], pack1Twins[0])) + } +} \ No newline at end of file From b7840df04124550eb216f2c8aa3168b0ab8817ad Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Aug 2023 21:17:25 +0800 Subject: [PATCH 15/32] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/MainActivity.kt | 7 +++++++ .../com/tangem/data/card/sdk/DefaultCardSdkProvider.kt | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 0d64c958e4..429cbe3e57 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -215,6 +215,13 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) + + /* + * FIXME: Test functionality. TangemSdk is null on some devices when HomeAction.Read is called + * inside IntentHandler. + */ + cardSdkLifecycleObserver.onCreate(context = this) + scope.launch { intentProcessor.handleIntent(intent) } diff --git a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt index 522b4d2b9b..993a613c73 100644 --- a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt +++ b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt @@ -24,7 +24,9 @@ internal class DefaultCardSdkProvider @Inject constructor() : CardSdkProvider, C private var _sdk: TangemSdk? = null override fun onCreate(context: Context) { - _sdk = TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config) + if (_sdk == null) { + _sdk = TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config) + } } override fun onDestroy() { From 2c3d5585dec7c049d7fddb12c5ad9a9408f1625c Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Aug 2023 11:28:36 +0300 Subject: [PATCH 16/32] Updated on 2026-08-14 --- .../java/com/tangem/domain/common/configs/GenericCardConfig.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt index 3a48e2d8ab..8a57584f27 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt @@ -9,7 +9,6 @@ object GenericCardConfig : CardConfig { get() = listOf( EllipticCurve.Secp256k1, EllipticCurve.Ed25519, - EllipticCurve.Bip0340, EllipticCurve.Bls12381G2Aug, ) From c58f2ab1579471cabe843054c82fc997151eee26 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Aug 2023 12:30:34 +0300 Subject: [PATCH 17/32] Updated on 2026-08-14 --- .../com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt index f515410168..64105fe887 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/WalletDetailsFragment.kt @@ -423,6 +423,7 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), SafeSt is WalletDataModel.SameCurrencyTransactionInProgress, -> { lBalance.tvStatus.setVerifiedBalanceStatus(R.string.wallet_balance_verified) + showPendingTransactionsIfPresent(status.pendingTransactions) } is WalletDataModel.TransactionInProgress -> { From 159c364b3c63261a88f428f38e86e60eb59d5666 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 24 Aug 2023 19:03:48 +0400 Subject: [PATCH 18/32] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index f115058405..820adff3c0 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-328" +tangemBlockchainSdk = "release-app_4.10-329" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.10-292" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From 819c610c6fa6270f9728e452d9b1942751e6f806 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Aug 2023 14:52:08 +0300 Subject: [PATCH 19/32] Updated on 2026-08-14 --- .../router/DefaultTokensListRouter.kt | 7 ++--- .../domain/common/extensions/Blockchain.kt | 2 -- .../domain/common/extensions/CardSdk.kt | 26 ++++++++++++------- 3 files changed, 19 insertions(+), 16 deletions(-) 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 a674196d0d..54cca1b8dc 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 @@ -56,15 +56,12 @@ internal class DefaultTokensListRouter( headerId = R.string.common_warning, messageId = R.string.alert_manage_tokens_unsupported_message, ) - Blockchain.Chia, Blockchain.ChiaTestnet -> AppDialog.SimpleOkDialogRes( + else -> 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) } + store.dispatchDialogShow(alert) } } \ No newline at end of file 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 9085357e7e..0970e85d77 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 @@ -214,6 +214,4 @@ private val excludedBlockchains = listOf( Blockchain.Ducatus, Blockchain.Telos, // disable in 4.9 Blockchain.TelosTestnet, // disable in 4.9 - Blockchain.OctaSpace, - Blockchain.OctaSpaceTestnet, ) \ No newline at end of file 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 2509479732..8420054345 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 @@ -53,18 +53,26 @@ fun CardDTO.supportedTokens(cardTypesResolver: CardTypesResolver): List Date: Fri, 25 Aug 2023 14:55:14 +0300 Subject: [PATCH 20/32] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 820adff3c0..67565e3f35 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-329" +tangemBlockchainSdk = "release-app_4.10-332" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.10-292" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From 5c68d8dc20b6b540e67b1351030746e10c104829 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Aug 2023 14:59:55 +0300 Subject: [PATCH 21/32] Updated on 2026-08-14 --- core/res/src/main/res/values-ru/strings.xml | 2 +- core/res/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index fb0916e031..91773de93c 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -342,7 +342,7 @@ Я понимаю, что после выполнения этого действия у меня больше не будет доступа к текущему кошельку Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты. Вы не сможете восстановить текущий кошелек или использовать данную карту для восстановления кода доступа. Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты. Вы не сможете восстановить текущий кошелек. - У вас есть карта банка другой страны или платежной системы UnionPay? + У вас есть карта банка другой страны, а также вид на жительство или регистрация вне РФ? Карты банков РФ в данный момент не принимаются Войдите в приложение и следите за своим балансом без сканирования карты Доступ в приложение diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index a4bc3c019a..0542ac7dc4 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -335,8 +335,8 @@ I understand that after performing this action, I will no longer have access to the current wallet Factory Reset will completely delete the wallet from the selected card. You will not be able to restore the current wallet or use the card to recover the access code. Factory Reset will completely delete the wallet from the selected card and remove it from the app. You will not be able to restore the current wallet. - Do you have a bank card of another country or a UnionPay card? - Russian bank cards are not accepted at the moment + Do you have a bank card from another country and a residence permit or registration outside the Russian Federation? + Russian bank cards are not currently accepted Log into the app and check your balance without scanning the card Access the app Allow to use biometrics From b49ac04141543af8f2b28135ccf07705ab105e2d Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Aug 2023 15:33:03 +0300 Subject: [PATCH 22/32] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 2 ++ 1 file changed, 2 insertions(+) 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 0970e85d77..4b373c9e7a 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 @@ -214,4 +214,6 @@ private val excludedBlockchains = listOf( Blockchain.Ducatus, Blockchain.Telos, // disable in 4.9 Blockchain.TelosTestnet, // disable in 4.9 + Blockchain.Chia, + Blockchain.ChiaTestnet, ) \ No newline at end of file From d718d24aa458dba3bd9da2343966805d43faac65 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Aug 2023 15:45:02 +0300 Subject: [PATCH 23/32] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 2 ++ 1 file changed, 2 insertions(+) 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 0970e85d77..4b373c9e7a 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 @@ -214,4 +214,6 @@ private val excludedBlockchains = listOf( Blockchain.Ducatus, Blockchain.Telos, // disable in 4.9 Blockchain.TelosTestnet, // disable in 4.9 + Blockchain.Chia, + Blockchain.ChiaTestnet, ) \ No newline at end of file From e421ca8d32d91670b85686debd32ec186e3b8025 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 28 Aug 2023 10:51:17 +0300 Subject: [PATCH 24/32] Updated on 2026-08-14 --- .../presentation/routers/CustomTokenRouter.kt | 8 ++++ .../routers/DefaultCustomTokenRouter.kt | 13 +++++++ .../viewmodels/AddCustomTokenViewModel.kt | 18 ++++++++- .../presentation/models/SupportTokensState.kt | 11 ++++++ .../router/DefaultTokensListRouter.kt | 25 ++++++------ .../presentation/router/TokensListRouter.kt | 5 +++ .../viewmodels/TokensListViewModel.kt | 39 +++++++++++++------ .../domain/common/configs/CardConfig.kt | 2 +- .../common/configs/GenericCardConfig.kt | 3 +- .../common/configs/MultiWalletCardConfig.kt | 35 +++++++++++++++++ .../domain/common/extensions/CardSdk.kt | 32 +++++++++++++-- 11 files changed, 160 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/models/SupportTokensState.kt create mode 100644 domain/legacy/src/main/java/com/tangem/domain/common/configs/MultiWalletCardConfig.kt diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt index bcd32893fe..4444aeea64 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt @@ -1,5 +1,7 @@ package com.tangem.tap.features.customtoken.impl.presentation.routers +import com.tangem.blockchain.common.Blockchain + /** * Custom token feature router * @@ -12,4 +14,10 @@ internal interface CustomTokenRouter { /** Open wallet (main) screen */ fun openWalletScreen() + + /** 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/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt index 7afec7d5a5..af1ebb8795 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt @@ -1,8 +1,12 @@ package com.tangem.tap.features.customtoken.impl.presentation.routers +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 +import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.store +import com.tangem.wallet.R /** Default implementation of custom token feature router */ internal class DefaultCustomTokenRouter : CustomTokenRouter { @@ -14,4 +18,13 @@ internal class DefaultCustomTokenRouter : CustomTokenRouter { override fun openWalletScreen() { store.dispatch(NavigationAction.PopBackTo(screen = AppScreen.Wallet)) } + + override fun openUnsupportedNetworkAlert(blockchain: Blockchain) { + val alert = AppDialog.SimpleOkDialogRes( + headerId = R.string.common_warning, + messageId = R.string.alert_manage_tokens_unsupported_curve_message, + args = listOf(blockchain.fullName), + ) + store.dispatchDialogShow(alert) + } } \ 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 0a5151fd23..e99d45b564 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 @@ -635,6 +635,15 @@ internal class AddCustomTokenViewModel @Inject constructor( return derivationNetwork.derivationPath(derivationStyle) } + private fun isUnsupportedBlockchain(blockchain: Blockchain): Boolean { + val scanResponse = reduxStateHolder.scanResponse + val canHandleToken = scanResponse?.card?.canHandleBlockchain( + blockchain = blockchain, + cardTypesResolver = scanResponse.cardTypesResolver, + ) ?: false + return !canHandleToken + } + private inner class ActionsHandler(private val featureRouter: CustomTokenRouter) { fun onBackButtonClick() { @@ -747,6 +756,11 @@ internal class AddCustomTokenViewModel @Inject constructor( fun onAddCustomTokenClick() { if (!isNetworkSelected()) return + val blockchain = uiState.form.networkSelectorField.selectedItem.blockchain + if (isUnsupportedBlockchain(blockchain)) { + featureRouter.openUnsupportedNetworkAlert(blockchain) + return + } val currency = when (getCustomTokenType()) { CustomTokenType.TOKEN -> { @@ -758,13 +772,13 @@ internal class AddCustomTokenViewModel @Inject constructor( decimals = requireNotNull(uiState.form.decimalsInputField.value.toIntOrNull()), id = foundToken?.id, ), - network = uiState.form.networkSelectorField.selectedItem.blockchain, + network = blockchain, derivationPath = getDerivationPath(), ) } CustomTokenType.BLOCKCHAIN -> { CustomCurrency.CustomBlockchain( - network = uiState.form.networkSelectorField.selectedItem.blockchain, + network = blockchain, derivationPath = getDerivationPath(), ) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/models/SupportTokensState.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/models/SupportTokensState.kt new file mode 100644 index 0000000000..e815d5d1e7 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/models/SupportTokensState.kt @@ -0,0 +1,11 @@ +package com.tangem.tap.features.tokens.impl.presentation.models + +/** + * State that shows is token support by given card + */ +sealed class SupportTokensState { + + object SolanaNetworkUnsupported : SupportTokensState() + object UnsupportedCurve : SupportTokensState() + object SupportedToken : SupportTokensState() +} \ No newline at end of file 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 54cca1b8dc..93ae4e1b17 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 @@ -51,17 +51,20 @@ internal class DefaultTokensListRouter( } 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, - ) - else -> AppDialog.SimpleOkDialogRes( - headerId = R.string.common_warning, - messageId = R.string.alert_manage_tokens_unsupported_curve_message, - args = listOf(blockchain.fullName), - ) - } + val alert = AppDialog.SimpleOkDialogRes( + headerId = R.string.common_warning, + messageId = R.string.alert_manage_tokens_unsupported_curve_message, + args = listOf(blockchain.fullName), + ) store.dispatchDialogShow(alert) } + + override fun openSolanaTokensNotSupportAlert() { + store.dispatchDialogShow( + AppDialog.SimpleOkDialogRes( + headerId = R.string.common_warning, + messageId = R.string.alert_manage_tokens_unsupported_message, + ), + ) + } } \ 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 b80e835962..ee87445d1d 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 @@ -35,4 +35,9 @@ internal interface TokensListRouter { * @param blockchain blockchain to show alert */ fun openUnsupportedNetworkAlert(blockchain: Blockchain) + + /** + * Open alert with Solana tokens error + */ + fun openSolanaTokensNotSupportAlert() } \ 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 ffb1de2c52..1cac67b7b2 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 @@ -17,6 +17,7 @@ import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation import com.tangem.domain.common.extensions.canHandleBlockchain import com.tangem.domain.common.extensions.canHandleToken import com.tangem.domain.common.extensions.fromNetworkId +import com.tangem.domain.common.extensions.supportedTokens import com.tangem.domain.common.util.cardTypesResolver import com.tangem.tap.common.extensions.fullNameWithoutTestnet import com.tangem.tap.common.extensions.getGreyedOutIconRes @@ -24,6 +25,7 @@ import com.tangem.tap.common.extensions.getNetworkName import com.tangem.tap.features.tokens.impl.domain.TokensListInteractor import com.tangem.tap.features.tokens.impl.domain.models.Token import com.tangem.tap.features.tokens.impl.domain.models.Token.Network +import com.tangem.tap.features.tokens.impl.presentation.models.SupportTokensState import com.tangem.tap.features.tokens.impl.presentation.models.TokensListArgs import com.tangem.tap.features.tokens.impl.presentation.router.TokensListRouter import com.tangem.tap.features.tokens.impl.presentation.states.NetworkItemState @@ -42,6 +44,7 @@ import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.plus +import timber.log.Timber import javax.inject.Inject import com.tangem.blockchain.common.Token as BlockchainToken @@ -355,24 +358,38 @@ internal class TokensListViewModel @Inject constructor( toggledNetwork.changeToggleState() } } else { - if (isUnsupportedToken(token.blockchain)) { - router.openUnsupportedNetworkAlert(token.blockchain) - } else { - analyticsSender.sendWhenTokenAdded(token.token) - changedTokensList.add(token) - toggledNetwork.changeToggleState() + when (isUnsupportedToken(token.blockchain)) { + SupportTokensState.SolanaNetworkUnsupported -> router.openSolanaTokensNotSupportAlert() + SupportTokensState.SupportedToken -> { + analyticsSender.sendWhenTokenAdded(token.token) + changedTokensList.add(token) + toggledNetwork.changeToggleState() + } + SupportTokensState.UnsupportedCurve -> router.openUnsupportedNetworkAlert(token.blockchain) + null -> Timber.e("Something went wrong in isUnsupportedToken (no scanResponse found)") } } } } - private fun isUnsupportedToken(blockchain: Blockchain): Boolean { + private fun isUnsupportedToken(blockchain: Blockchain): SupportTokensState? { val scanResponse = reduxStateHolder.scanResponse - val canHandleToken = scanResponse?.card?.canHandleToken( + val cardTypesResolver = scanResponse?.cardTypesResolver ?: return null + val supportedTokens = scanResponse.card.supportedTokens(cardTypesResolver) + + // refactor this later by moving all this logic in card config + if (!supportedTokens.contains(Blockchain.Solana)) { + return SupportTokensState.SolanaNetworkUnsupported + } + val canHandleToken = scanResponse.card.canHandleToken( + supportedTokens = supportedTokens, blockchain = blockchain, - cardTypesResolver = scanResponse.cardTypesResolver, - ) ?: false - return !canHandleToken + cardTypesResolver = cardTypesResolver, + ) + if (!canHandleToken) { + return SupportTokensState.UnsupportedCurve + } + return SupportTokensState.SupportedToken } private fun isUnsupportedBlockchain(blockchain: Blockchain): Boolean { diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/CardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/CardConfig.kt index cb34af8d75..51ff7de9b3 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/configs/CardConfig.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/CardConfig.kt @@ -20,7 +20,7 @@ sealed interface CardConfig { if (cardDTO.settings.isBackupAllowed && cardDTO.settings.isHDWalletAllowed && cardDTO.firmwareVersion >= FirmwareVersion.MultiWalletAvailable ) { - return GenericCardConfig + return MultiWalletCardConfig } return GenericCardConfig } diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt index 8a57584f27..4955dbdb11 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/GenericCardConfig.kt @@ -9,11 +9,10 @@ object GenericCardConfig : CardConfig { get() = listOf( EllipticCurve.Secp256k1, EllipticCurve.Ed25519, - EllipticCurve.Bls12381G2Aug, ) /** - * Old logic to determine primary curve for blockchain in TangemWallet + * Old logic to determine primary curve for blockchain */ override fun primaryCurve(blockchain: Blockchain): EllipticCurve? { return when { diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/configs/MultiWalletCardConfig.kt b/domain/legacy/src/main/java/com/tangem/domain/common/configs/MultiWalletCardConfig.kt new file mode 100644 index 0000000000..414d7a528a --- /dev/null +++ b/domain/legacy/src/main/java/com/tangem/domain/common/configs/MultiWalletCardConfig.kt @@ -0,0 +1,35 @@ +package com.tangem.domain.common.configs + +import com.tangem.blockchain.common.Blockchain +import com.tangem.common.card.EllipticCurve +import timber.log.Timber + +object MultiWalletCardConfig : CardConfig { + override val mandatoryCurves: List + get() = listOf( + EllipticCurve.Secp256k1, + EllipticCurve.Ed25519, + EllipticCurve.Bls12381G2Aug, + ) + + /** + * Old logic to determine primary curve for blockchain in TangemWallet + */ + override fun primaryCurve(blockchain: Blockchain): EllipticCurve? { + return when { + blockchain.getSupportedCurves().contains(EllipticCurve.Secp256k1) -> { + EllipticCurve.Secp256k1 + } + blockchain.getSupportedCurves().contains(EllipticCurve.Ed25519) -> { + EllipticCurve.Ed25519 + } + blockchain.getSupportedCurves().contains(EllipticCurve.Bls12381G2Aug) -> { + EllipticCurve.Bls12381G2Aug + } + else -> { + Timber.e("Unsupported blockchain, curve not found") + null + } + } + } +} \ No newline at end of file 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 8420054345..66d0a0f12d 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 @@ -5,6 +5,7 @@ import com.tangem.common.card.EllipticCurve import com.tangem.common.card.FirmwareVersion import com.tangem.domain.common.CardTypesResolver import com.tangem.domain.common.TapWorkarounds.isTestCard +import com.tangem.domain.common.configs.CardConfig import com.tangem.domain.models.scan.CardDTO /** @@ -52,10 +53,32 @@ fun CardDTO.supportedTokens(cardTypesResolver: CardTypesResolver): List, + blockchain: Blockchain, + cardTypesResolver: CardTypesResolver, +): Boolean { + val cardConfig = CardConfig.createConfig(this) + val primaryCurveForBlockchain = cardConfig.primaryCurve(blockchain) + val isContainsBlockchain = supportedTokens.contains(blockchain) + val isWalletForCurveExists = wallets.any { it.curve == primaryCurveForBlockchain } + // fixme: check for first wallets with 1 curve and remove condition + return if (cardTypesResolver.isTangemWallet() || cardTypesResolver.isWallet2()) { + // if there's no wallet on card for blockchain with given curve + isContainsBlockchain && isWalletForCurveExists + } else { + isContainsBlockchain + } +} + fun CardDTO.canHandleToken(blockchain: Blockchain, cardTypesResolver: CardTypesResolver): Boolean { + val cardConfig = CardConfig.createConfig(this) + val primaryCurveForBlockchain = cardConfig.primaryCurve(blockchain) val isContainsBlockchain = this.supportedTokens(cardTypesResolver).contains(blockchain) - val isWalletForCurveExists = - wallets.map { it.curve }.intersect(blockchain.getSupportedCurves().toSet()).isNotEmpty() + val isWalletForCurveExists = wallets.any { it.curve == primaryCurveForBlockchain } // fixme: check for first wallets with 1 curve and remove condition return if (cardTypesResolver.isTangemWallet() || cardTypesResolver.isWallet2()) { // if there's no wallet on card for blockchain with given curve @@ -66,9 +89,10 @@ fun CardDTO.canHandleToken(blockchain: Blockchain, cardTypesResolver: CardTypesR } fun CardDTO.canHandleBlockchain(blockchain: Blockchain, cardTypesResolver: CardTypesResolver): Boolean { + val cardConfig = CardConfig.createConfig(this) + val primaryCurveForBlockchain = cardConfig.primaryCurve(blockchain) val isContainsBlockchain = this.supportedBlockchains(cardTypesResolver).contains(blockchain) - val isWalletForCurveExists = - wallets.map { it.curve }.intersect(blockchain.getSupportedCurves().toSet()).isNotEmpty() + val isWalletForCurveExists = wallets.any { it.curve == primaryCurveForBlockchain } // fixme: check for first wallets with 1 curve and remove condition return if (cardTypesResolver.isTangemWallet() || cardTypesResolver.isWallet2()) { // if there's no wallet on card for blockchain with given curve From f95d17d7114859297ca04d58e9a029ff6a92af3a Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 28 Aug 2023 12:34:17 +0300 Subject: [PATCH 25/32] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../main/java/com/tangem/datasource/config/ConfigManagerImpl.kt | 1 + .../main/java/com/tangem/datasource/config/models/JsonModels.kt | 1 + gradle/dependencies.toml | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 8c1c53b739..b84b1e1ab1 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 8c1c53b73950698d4acfa4d925b8c14bf6f0da63 +Subproject commit b84b1e1ab11b0eb0f6ca6e28f551f9e2ca6809fe diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt index 75b37e271f..493d6b2e9e 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt @@ -97,6 +97,7 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager { testnetApiKey = configValues.tonCenterKeys.testnet, ), chiaFireAcademyApiKey = configValues.chiaFireAcademyApiKey, + chiaTangemApiKey = configValues.chiaTangemApiKey, ), appsFlyerDevKey = configValues.appsFlyer.appsFlyerDevKey, amplitudeApiKey = configValues.amplitudeApiKey, diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt index bcad6003db..83ffe5d09a 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt @@ -39,6 +39,7 @@ class ConfigValueModel( val walletConnectProjectId: String, val tangemComAuthorization: String?, val chiaFireAcademyApiKey: String?, + val chiaTangemApiKey: String?, ) data class AppsFlyer( diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 67565e3f35..6673958448 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-332" +tangemBlockchainSdk = "release-app_4.10-333" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.10-292" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From 5c5dd3487c9fc324ef3072b8e34ed077595756dc Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 28 Aug 2023 13:10:03 +0300 Subject: [PATCH 26/32] Updated on 2026-08-14 --- .../presentation/viewmodels/AddCustomTokenViewModel.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 e99d45b564..c284196ac6 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 @@ -622,11 +622,8 @@ internal class AddCustomTokenViewModel @Inject constructor( private fun getDerivationPathForBlockchain(blockchain: Blockchain?): DerivationPath? { if (blockchain == null) return null - val derivationStyle = if (!isDerivationPathSelected()) { - reduxStateHolder.scanResponse?.derivationStyleProvider?.getDerivationStyle() - } else { - DerivationStyle.LEGACY - } + val derivationStyle = reduxStateHolder.scanResponse?.derivationStyleProvider?.getDerivationStyle() + val derivationNetwork = if (blockchain == Blockchain.Unknown) { uiState.form.networkSelectorField.selectedItem.blockchain } else { From 2be288c810928560a61904238c53228fe414fbb3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 28 Aug 2023 13:20:59 +0300 Subject: [PATCH 27/32] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 6673958448..87b28e394c 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-333" +tangemBlockchainSdk = "release-app_4.10-335" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.10-292" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From 8cb54b4902f4cc004e590e62b842ee4f02dcdcca Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 28 Aug 2023 14:10:29 +0300 Subject: [PATCH 28/32] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 2 -- 1 file changed, 2 deletions(-) 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 4b373c9e7a..0970e85d77 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 @@ -214,6 +214,4 @@ private val excludedBlockchains = listOf( Blockchain.Ducatus, Blockchain.Telos, // disable in 4.9 Blockchain.TelosTestnet, // disable in 4.9 - Blockchain.Chia, - Blockchain.ChiaTestnet, ) \ No newline at end of file From bceed16f64d3e0a13cd8e86d685bae05c1745716 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 28 Aug 2023 14:19:15 +0300 Subject: [PATCH 29/32] Updated on 2026-08-14 --- .../main/java/com/tangem/domain/common/extensions/Blockchain.kt | 2 -- 1 file changed, 2 deletions(-) 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 4b373c9e7a..0970e85d77 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 @@ -214,6 +214,4 @@ private val excludedBlockchains = listOf( Blockchain.Ducatus, Blockchain.Telos, // disable in 4.9 Blockchain.TelosTestnet, // disable in 4.9 - Blockchain.Chia, - Blockchain.ChiaTestnet, ) \ No newline at end of file From 9803f02bb646ed7598d00167ed420462ce79a9b9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 29 Aug 2023 09:29:33 +0300 Subject: [PATCH 30/32] Updated on 2026-08-14 --- .../viewmodels/AddCustomTokenViewModel.kt | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) 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 c284196ac6..831823009f 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 @@ -12,11 +12,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token -import com.tangem.blockchain.common.derivation.DerivationStyle import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.crypto.hdWallet.HDWalletError import com.tangem.domain.AddCustomTokenError +import com.tangem.domain.common.DerivationStyleProvider import com.tangem.domain.common.extensions.* import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.derivationStyleProvider @@ -145,7 +145,7 @@ internal class AddCustomTokenViewModel @Inject constructor( fun createDerivationPathSelectorAdditionalItem( blockchain: Blockchain, type: DerivationPathSelectorType = DerivationPathSelectorType.BLOCKCHAIN, - derivationStyle: DerivationStyle?, + derivationPath: String, ): SelectorItem.TitleWithSubtitle { return when (type) { DerivationPathSelectorType.DEFAULT -> SelectorItem.TitleWithSubtitle( @@ -161,10 +161,7 @@ internal class AddCustomTokenViewModel @Inject constructor( type = DerivationPathSelectorType.CUSTOM, ) DerivationPathSelectorType.BLOCKCHAIN -> SelectorItem.TitleWithSubtitle( - title = blockchain.derivationPath( - style = derivationStyle, - )?.rawPath?.let(TextReference::Str) - ?: TextReference.Res(R.string.custom_token_derivation_path_default), + title = TextReference.Str(derivationPath), subtitle = TextReference.Str(blockchain.fullName), blockchain = blockchain, ) @@ -211,10 +208,12 @@ internal class AddCustomTokenViewModel @Inject constructor( private fun getNetworkSelectorItems(): List { val defaultNetwork = createNetworkSelectorItem(blockchain = Blockchain.Unknown) val scanResponse = reduxStateHolder.scanResponse + val derivationStyle = scanResponse?.derivationStyleProvider?.getDerivationStyle() return listOf(defaultNetwork) + Blockchain.values() .filter { blockchain -> scanResponse?.card?.supportedBlockchains(scanResponse.cardTypesResolver) - ?.contains(blockchain) == true + ?.contains(blockchain) == true && + blockchain.derivationPath(derivationStyle)?.rawPath?.isNotEmpty() == true } .sortedBy(Blockchain::fullName) .map(::createNetworkSelectorItem) @@ -258,7 +257,7 @@ internal class AddCustomTokenViewModel @Inject constructor( if (scanResponse?.card?.settings?.isHDWalletAllowed == false) return null val selectorItems = - getDerivationPathsSelectorItems(scanResponse?.derivationStyleProvider?.getDerivationStyle()) + getDerivationPathsSelectorItems(scanResponse?.derivationStyleProvider) return AddCustomTokenSelectorField.DerivationPath( label = TextReference.Res(R.string.custom_token_derivation_path_input_title), selectedItem = requireNotNull(selectorItems.firstOrNull()), @@ -269,29 +268,35 @@ internal class AddCustomTokenViewModel @Inject constructor( } private fun getDerivationPathsSelectorItems( - derivationStyle: DerivationStyle?, + derivationStyleProvider: DerivationStyleProvider?, ): List { + val derivationStyle = derivationStyleProvider?.getDerivationStyle() return listOf( createDerivationPathSelectorAdditionalItem( blockchain = Blockchain.Unknown, type = DerivationPathSelectorType.DEFAULT, - derivationStyle = derivationStyle, + derivationPath = "", ), createDerivationPathSelectorAdditionalItem( blockchain = Blockchain.Unknown, type = DerivationPathSelectorType.CUSTOM, - derivationStyle = derivationStyle, + derivationPath = "", ), ) + Blockchain.values() .filter { blockchain -> blockchain.isSupportedInApp() && !blockchain.isTestnet() } .sortedBy(Blockchain::fullName) - .map { - createDerivationPathSelectorAdditionalItem( - blockchain = it, - derivationStyle = derivationStyle, - ) + .mapNotNull { + val derivationPath = it.derivationPath(derivationStyle)?.rawPath + if (derivationPath?.isNotEmpty() == true) { + createDerivationPathSelectorAdditionalItem( + blockchain = it, + derivationPath = derivationPath, + ) + } else { + null + } } } @@ -828,7 +833,7 @@ internal class AddCustomTokenViewModel @Inject constructor( selectedItem = formStateBuilder.createDerivationPathSelectorAdditionalItem( blockchain = Blockchain.Unknown, type = DerivationPathSelectorType.DEFAULT, - derivationStyle = scanResponse?.derivationStyleProvider?.getDerivationStyle(), + derivationPath = "", ), ), ), From 13e60dce103d2a80d7f22c5cf967c53553d8259a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 29 Aug 2023 09:34:07 +0300 Subject: [PATCH 31/32] Updated on 2026-08-14 --- gradle/dependencies.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 87b28e394c..b8af65e72b 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-335" +tangemBlockchainSdk = "release-app_4.10-336" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.10-292" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From a2475a9b79fab7f59ef0c2e6fc085178b019c90f Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 29 Aug 2023 12:15:24 +0300 Subject: [PATCH 32/32] Updated on 2026-08-14 --- .../tangem/domain/common/extensions/WalletManagerFactory.kt | 1 + gradle/dependencies.toml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt index b46153ff06..7ed90d9d54 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/WalletManagerFactory.kt @@ -61,6 +61,7 @@ fun WalletManagerFactory.makeWalletManagerForApp( createWalletManager( blockchain = environmentBlockchain, publicKey = publicKey, + curve = wallet.curve, ) } else -> { diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 3f0777a4c4..178bbe880a 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -80,9 +80,9 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.10-336" +tangemBlockchainSdk = "develop-337" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "release-app_4.10-292" +tangemCardSdk = "develop-293" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds # endregion Tangem