From 4c891a06aa505077a34a81c989254b868fdd667c Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Jan 2025 02:58:04 +0500 Subject: [PATCH 1/8] Updated on 2026-08-14 --- .../data/DefaultLegacyWalletConnectRepository.kt | 4 +++- .../domain/walletconnect2/domain/WalletConnectInteractor.kt | 2 +- gradle/dependencies.toml | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/DefaultLegacyWalletConnectRepository.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/DefaultLegacyWalletConnectRepository.kt index b9b647d647..d49c3386d7 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/DefaultLegacyWalletConnectRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/DefaultLegacyWalletConnectRepository.kt @@ -338,7 +338,9 @@ internal class DefaultLegacyWalletConnectRepository( optionalNamespace.key to Wallet.Model.Namespace.Session( accounts = accountsOptional.distinct(), methods = methods, - chains = userChains.keys.toList(), + chains = userChains.keys + .filter { it.startsWith(optionalNamespace.key) } + .toList(), events = optionalNamespace.value.events, ) } diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt index e53938eaf6..7b646bb85f 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt @@ -155,8 +155,8 @@ class WalletConnectInteractor( return@onEach } val networksFormatted = (wcEvent.requiredChainIds + wcEvent.optionalChainIds) - .distinct() .mapNotNull { blockchainHelper.chainIdToFullNameOrNull(it) } + .distinct() .toString() handler.onProposalReceived(proposal = wcEvent, networksFormatted = networksFormatted) } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 38e2836680..3c33ca8494 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -70,8 +70,8 @@ zxingQrCode = "3.5.1" mviCore = "1.3.1" kotlinSerialization = "1.4.1" arrow = "1.2.3" -reownCore = "1.0.2" -reownWeb3 = "1.0.2" +reownCore = "1.1.2" +reownWeb3 = "1.1.2" prettyLogger = "2.2.0" okHttp-prettyLogging = "3.1.0" chucker = "4.0.0" From 2f5f75ffdbe012ca3017ef592de6aff909ad66a4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Jan 2025 16:33:21 +0500 Subject: [PATCH 2/8] Updated on 2026-08-14 --- .../com/tangem/datasource/di/NetworkModule.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt index ae75ab68d8..069f85942e 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt @@ -40,6 +40,7 @@ internal object NetworkModule { private const val PROD_V2_TANGEM_TECH_BASE_URL = "https://api.tangem-tech.com/v2/" private const val TANGEM_TECH_MARKETS_SERVICE_TIMEOUT_SECONDS = 60L + private const val STAKE_KIT_API_TIMEOUT_SECONDS = 60L @Provides @Singleton @@ -89,6 +90,12 @@ internal object NetworkModule { moshi = moshi, context = context, apiConfigsManager = apiConfigsManager, + timeouts = Timeouts( + callTimeoutSeconds = STAKE_KIT_API_TIMEOUT_SECONDS, + connectTimeoutSeconds = STAKE_KIT_API_TIMEOUT_SECONDS, + readTimeoutSeconds = STAKE_KIT_API_TIMEOUT_SECONDS, + writeTimeoutSeconds = STAKE_KIT_API_TIMEOUT_SECONDS, + ), clientBuilder = { addInterceptor( NetworkLogsSaveInterceptor(appLogsStore), @@ -262,6 +269,7 @@ internal object NetworkModule { moshi: Moshi, context: Context, apiConfigsManager: ApiConfigsManager, + timeouts: Timeouts = Timeouts(), clientBuilder: OkHttpClient.Builder.() -> OkHttpClient.Builder = { this }, ): T { val environmentConfig = apiConfigsManager.getEnvironmentConfig(id) @@ -273,6 +281,23 @@ internal object NetworkModule { .client( OkHttpClient.Builder() .applyApiConfig(id, apiConfigsManager) + .applyTimeoutAnnotations() + .let { builder -> + var b = builder + if (timeouts.callTimeoutSeconds != null) { + b = b.callTimeout(timeouts.callTimeoutSeconds, TimeUnit.SECONDS) + } + if (timeouts.connectTimeoutSeconds != null) { + b = b.connectTimeout(timeouts.connectTimeoutSeconds, TimeUnit.SECONDS) + } + if (timeouts.readTimeoutSeconds != null) { + b = b.readTimeout(timeouts.readTimeoutSeconds, TimeUnit.SECONDS) + } + if (timeouts.writeTimeoutSeconds != null) { + b = b.writeTimeout(timeouts.writeTimeoutSeconds, TimeUnit.SECONDS) + } + b + } .addLoggers(context) .clientBuilder() .build(), From 8453d19f33d2c8df62b3e95bbcfebac0375f3bd7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Jan 2025 18:33:13 +0500 Subject: [PATCH 3/8] Updated on 2026-08-14 --- app/src/main/java/com/tangem/tap/TangemApplication.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index d25917729c..d54f1c4c78 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -6,7 +6,6 @@ import coil.ImageLoaderFactory import com.chuckerteam.chucker.api.ChuckerInterceptor import com.tangem.Log import com.tangem.TangemSdkLogger -import com.tangem.blockchain.common.ExceptionHandler import com.tangem.blockchain.network.BlockchainSdkRetrofitBuilder import com.tangem.blockchainsdk.BlockchainSDKFactory import com.tangem.blockchainsdk.signer.TransactionSignerFactory @@ -54,7 +53,6 @@ import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder -import com.tangem.tap.common.analytics.handlers.BlockchainExceptionHandler import com.tangem.tap.common.analytics.handlers.amplitude.AmplitudeAnalyticsHandler import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandler import com.tangem.tap.common.images.createCoilImageLoader @@ -209,9 +207,6 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { private val settingsManager: SettingsManager get() = entryPoint.getSettingsManager() - private val blockchainExceptionHandler: BlockchainExceptionHandler - get() = entryPoint.getBlockchainExceptionHandler() - private val uiMessageSender: UiMessageSender get() = entryPoint.getUiMessageSender() @@ -257,7 +252,7 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { } loadNativeLibraries() - ExceptionHandler.append(blockchainExceptionHandler) + // ExceptionHandler.append(blockchainExceptionHandler) // TODO [REDACTED_TASK_KEY] Send only to Firebase if (LogConfig.network.blockchainSdkNetwork) { BlockchainSdkRetrofitBuilder.interceptors = listOf( createNetworkLoggingInterceptor(), From 0eaa783a13f0ed2a6535a0f9bdb4acbac372543e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Jan 2025 17:37:53 +0300 Subject: [PATCH 4/8] Updated on 2026-08-14 --- .../com/tangem/tap/common/DialogManager.kt | 4 - .../com/tangem/tap/common/redux/AppDialog.kt | 4 - ...sianCardholdersWarningBottomSheetDialog.kt | 54 --------- .../features/onboarding/OnboardingHelper.kt | 15 +-- .../middlewares/TradeCryptoMiddleware.kt | 20 +-- .../dialog_russians_cardholders_warning.xml | 114 ------------------ core/res/src/main/res/values-de/strings.xml | 2 - core/res/src/main/res/values-es/strings.xml | 2 - core/res/src/main/res/values-fr/strings.xml | 2 - core/res/src/main/res/values-ja/strings.xml | 2 - core/res/src/main/res/values-ru/strings.xml | 2 - .../src/main/res/values-uk-rUA/strings.xml | 2 - .../src/main/res/values-zh-rTW/strings.xml | 1 - core/res/src/main/res/values/strings.xml | 2 - 14 files changed, 5 insertions(+), 221 deletions(-) delete mode 100644 app/src/main/java/com/tangem/tap/common/ui/RussianCardholdersWarningBottomSheetDialog.kt delete mode 100644 app/src/main/res/layout/dialog_russians_cardholders_warning.xml diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index b4df44bdff..da4a494936 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -58,10 +58,6 @@ class DialogManager : StoreSubscriber { ) is AppDialog.AddressInfoDialog -> AddressInfoBottomSheetDialog(state.dialog, context) is AppDialog.TestActionsDialog -> TestActionsBottomSheetDialog(state.dialog, context) - is AppDialog.RussianCardholdersWarningDialog -> RussianCardholdersWarningBottomSheetDialog( - context, - state.dialog.data, - ) is OnboardingDialog.TwinningProcessNotCompleted -> TwinningProcessNotCompletedDialog.create(context) is OnboardingDialog.InterruptOnboarding -> InterruptOnboardingDialog.create(context, state.dialog) is OnboardingDialog.WalletActivationError -> WalletActivationErrorDialog.create(context, state.dialog) diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppDialog.kt b/app/src/main/java/com/tangem/tap/common/redux/AppDialog.kt index 4586881efc..1188cd7d03 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppDialog.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppDialog.kt @@ -27,10 +27,6 @@ sealed class AppDialog : StateDialog { val actionsList: List, ) : AppDialog() - data class RussianCardholdersWarningDialog(val data: Data?) : AppDialog() { - data class Data(val topUpUrl: String) - } - data class RemoveWalletDialog( val currencyTitle: String, val onOk: () -> Unit, diff --git a/app/src/main/java/com/tangem/tap/common/ui/RussianCardholdersWarningBottomSheetDialog.kt b/app/src/main/java/com/tangem/tap/common/ui/RussianCardholdersWarningBottomSheetDialog.kt deleted file mode 100644 index 5b0ac2e000..0000000000 --- a/app/src/main/java/com/tangem/tap/common/ui/RussianCardholdersWarningBottomSheetDialog.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.tangem.tap.common.ui - -import android.content.Context -import android.os.Bundle -import android.view.LayoutInflater -import com.google.android.material.bottomsheet.BottomSheetDialog -import com.tangem.core.analytics.Analytics -import com.tangem.tap.common.analytics.events.Token -import com.tangem.tap.common.extensions.dispatchDialogHide -import com.tangem.tap.common.extensions.dispatchOpenUrl -import com.tangem.tap.common.redux.AppDialog -import com.tangem.tap.store -import com.tangem.wallet.databinding.DialogRussiansCardholdersWarningBinding - -class RussianCardholdersWarningBottomSheetDialog( - context: Context, - private val dialogData: AppDialog.RussianCardholdersWarningDialog.Data?, -) : BottomSheetDialog(context) { - - private var binding: DialogRussiansCardholdersWarningBinding? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Analytics.send(Token.Topup.P2PScreenOpened()) - binding = DialogRussiansCardholdersWarningBinding - .inflate(LayoutInflater.from(context)) - .also { setContentView(it.root) } - } - - override fun show() { - super.show() - setOnDismissListener { - binding = null - store.dispatchDialogHide() - } - - binding?.btnYes?.setOnClickListener { - if (dialogData != null) { - store.dispatchOpenUrl(dialogData.topUpUrl) - Analytics.send(Token.Topup.ScreenOpened()) - } - - dismiss() - } - binding?.btnNo?.setOnClickListener { - store.dispatchOpenUrl(INSTRUCTION_URL) - dismiss() - } - } - - companion object { - private const val INSTRUCTION_URL = "https://tangem.com/howtobuy.html" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 796b99ce27..7c1adf4a81 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -13,7 +13,6 @@ import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse -import com.tangem.domain.settings.usercountry.models.UserCountry import com.tangem.domain.wallets.builder.UserWalletBuilder import com.tangem.domain.wallets.builder.UserWalletIdBuilder import com.tangem.domain.wallets.models.UserWallet @@ -21,7 +20,6 @@ import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.* -import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.onboarding.products.wallet.redux.BackupStartedSource import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletAction @@ -235,18 +233,7 @@ object OnboardingHelper { val currencyType = AnalyticsParam.CurrencyType.Blockchain(blockchain) Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType)) - scope.launch { - val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase) - val isRussia = getUserCountryCodeUseCase.invokeSync().isRight { it is UserCountry.Russia } - - val onrampFeatureToggles = store.inject(DaggerGraphState::onrampFeatureToggles) - if (isRussia && !onrampFeatureToggles.isFeatureEnabled) { - val dialogData = AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl) - store.dispatchDialogShow(AppDialog.RussianCardholdersWarningDialog(dialogData)) - } else { - store.dispatchOpenUrl(topUpUrl) - } - } + store.dispatchOpenUrl(topUpUrl) } private suspend fun proceedWithScanResponse( diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 6c9ed1d2e8..9bda54aa7d 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -6,15 +6,16 @@ import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.Analytics import com.tangem.domain.onramp.model.OnrampSource -import com.tangem.domain.settings.usercountry.models.UserCountry import com.tangem.domain.tokens.legacy.TradeCryptoAction import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.NetworkAddress import com.tangem.domain.wallets.models.UserWalletId import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.apptheme.MutableAppThemeModeHolder -import com.tangem.tap.common.extensions.* -import com.tangem.tap.common.redux.AppDialog +import com.tangem.tap.common.extensions.dispatchDebugErrorNotification +import com.tangem.tap.common.extensions.dispatchNavigationAction +import com.tangem.tap.common.extensions.dispatchOpenUrl +import com.tangem.tap.common.extensions.inject import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager @@ -89,19 +90,6 @@ object TradeCryptoMiddleware { ) scope.launch { - val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase) - val onrampFeatureToggles = store.inject(DaggerGraphState::onrampFeatureToggles) - - val isRussia = getUserCountryCodeUseCase.invokeSync().isRight { it is UserCountry.Russia } - - if (action.checkUserLocation && isRussia && !onrampFeatureToggles.isFeatureEnabled) { - val dialogData = topUrl?.let { - AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl = it) - } - store.dispatchDialogShow(AppDialog.RussianCardholdersWarningDialog(data = dialogData)) - return@launch - } - if (currency is CryptoCurrency.Token && currency.network.isTestnet) { val walletManager = store.inject(DaggerGraphState::walletManagersFacade) .getOrCreateWalletManager( diff --git a/app/src/main/res/layout/dialog_russians_cardholders_warning.xml b/app/src/main/res/layout/dialog_russians_cardholders_warning.xml deleted file mode 100644 index a666076b95..0000000000 --- a/app/src/main/res/layout/dialog_russians_cardholders_warning.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 6e3db49a06..2f5c61bad2 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -655,8 +655,6 @@ Beim Zurücksetzen auf die Werkseinstellungen wird die Wallet der ausgewählten Karte oder Ring vollständig gelöscht und aus der App entfernt. Es ist nicht möglich, die aktuelle Wallet wiederherzustellen. Ringbesitzer erhalten bis zum 15.11. 3 provisionsfreie Swaps auf Changelly! Jetzt mit 0 %% Gebühren tauschen! - Besitzt du eine Bankkarte aus einem anderen Land und eine Aufenthaltserlaubnis oder Registrierung außerhalb der Russischen Föderation? - Russische Bankkarten werden derzeit nicht akzeptiert Melde dich bei der App an und überprüfe dein Guthaben, ohne die Karte oder Ring zu scannen Zugriff auf die App Nutzung biometrischer Daten zulassen diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index ad2f784c78..17a3e7c35f 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -653,8 +653,6 @@ El restablecimiento de fábrica eliminará completamente la billetera de la tarjeta seleccionada y lo eliminará de la app. No podrá restaurar la billetera actual. Si tienes un Anillo Tangem, ¡3 swaps sin comisión en Changelly hasta el 15/11! ¡Intercambia con 0%% de comisión! - ¿Tiene una tarjeta bancaria de otro país y un permiso de residencia o registro fuera de la Federación Rusa? - Las tarjetas bancarias rusas no se aceptan actualmente Inicie sesión en la app y comprueba su saldo sin escanear la tarjeta Acceder a la app Permitir el uso de biometría diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 2f0c658d65..86ef15600b 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -655,8 +655,6 @@ La réinitialisation aux paramètres d\'usine supprimera complètement le portefeuille de la carte sélectionnée et le supprimera de l\'application. Vous ne pourrez pas restaurer le portefeuille actuel. Les propriétaires du Tangem Ring ont droit à 3 swap gratis sur Changelly jusqu\'au 15/11 ! Échangez avec 0 %% de frais ! - Avez-vous une carte bancaire d\'un autre pays et un permis de séjour ou une inscription en dehors de la Fédération de Russie ? - Les cartes bancaires russes ne sont actuellement pas acceptées Connectez-vous à l\'application et vérifiez votre solde sans scanner la carte Accéder à l\'application Autoriser l\'utilisation de la biométrie diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index 7d9a780c4d..a8301f66bd 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -645,8 +645,6 @@ 工場出荷時の状態にリセットすると、選択したカードやリングからウォレットが完全に削除され、アプリから削除されます。現在のウォレットを復元することはできません。 Tangem Ringユーザーは、11/15日までChangelly経由でスワップを3回手数料ゼロで行えます! 今すぐ手数料0%%でスワップしましょう! - 他の国の銀行カードと、ロシア連邦外での居住許可証または登録をお持ちですか? - ロシアの銀行カードは現在ご利用いただけません アプリにログインして、カードまたはリングをスキャンせずに残高を確認できます アプリにアクセスする 生体認証の使用を許可する diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 191593c0bb..7872200a96 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -673,8 +673,6 @@ Сброс к заводским настройкам приведет к полному удалению кошелька с выбранной карты или кольца. Вы не сможете восстановить текущий кошелек. Владельцам колец — 3 обмена без комиссии на Changelly до 15.11! Обмен с 0%% комиссией! - У вас есть карта банка другой страны, а также вид на жительство или регистрация вне РФ? - Карты банков РФ в данный момент не принимаются Войдите в приложение и следите за своим балансом без сканирования карты или кольца Доступ в приложение Использовать биометрию diff --git a/core/res/src/main/res/values-uk-rUA/strings.xml b/core/res/src/main/res/values-uk-rUA/strings.xml index 5203d19d26..32c50d1bcf 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -673,8 +673,6 @@ Скидання до заводських налаштувань призведе до повного видалення гаманця з обраної картки або кільця. Ви не зможете відновити поточний гаманець. Власникам кілець - 3 обміни без комісії на Changelly до 15.11! Обмін з 0%% комісією! - У вас є банківська картка іншої країни та посвідка на проживання або реєстрація за межами Російської Федерації? - Російські банківські картки наразі не приймаються Увійдіть у додаток та слідкуйте за своїм балансом без сканування картки чи кільця Доступ до додатку Використовувати біометрію 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 f144efa47f..1e2134aa6e 100644 --- a/core/res/src/main/res/values-zh-rTW/strings.xml +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -237,7 +237,6 @@ 我了解執行此操作後,我將無法再訪問當前錢包 恢復原廠設置將從所選卡中完全刪除錢包。您將無法恢復當前錢包或使用卡恢復訪問密碼 恢復原廠設置將從所選卡中完全刪除錢包並將其從應用程序中刪除。您將無法恢復當前錢包 - 目前不接受俄羅斯銀行卡 登錄應用程序並在不掃描卡片的情況下檢查您的資產 訪問應用程序 允許使用生物辨識 diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 7f19088018..1255b3a06e 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -655,8 +655,6 @@ Factory Reset will completely delete the wallet from the selected card or ring and remove it from the app. You will not be able to restore the current wallet. Ring owners get 3 commission-free swaps on Changelly until 15.11! Swap With 0%% Fees Now! - 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 or ring Access the app Allow to use biometrics From f4eeff0acf3a905cf6518c9d1655e84662822e52 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Jan 2025 22:49:19 +0700 Subject: [PATCH 5/8] Updated on 2026-08-14 --- .../src/main/assets/configs/excluded_blockchains_config.json | 4 ---- gradle/dependencies.toml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json b/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json index 75cedce0e4..08fa6ca49b 100644 --- a/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json +++ b/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json @@ -11,10 +11,6 @@ "name": "NEXA/test", "version": "undefined" }, - { - "name": "fact0rn", - "version": "undefined" - }, { "name": "vanar-chain", "version": "undefined" diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 3c33ca8494..dc1d8b9ca6 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -88,7 +88,7 @@ markdownComposeView = "0.5.4" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.20-909" +tangemBlockchainSdk = "release-app_5.20-915" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.20-423" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From a7c3c508076ad2181613312752662b37a865d3e9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Jan 2025 16:08:02 +0300 Subject: [PATCH 6/8] Updated on 2026-08-14 --- .../java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index ad0e992a73..754fc5a789 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -1321,13 +1321,13 @@ internal class SwapInteractorImpl @AssistedInject constructor( amount.value > reducedBalance -> { IncludeFeeInAmount.BalanceNotEnough } - amountWithFee < reducedBalance -> { + amountWithFee <= reducedBalance -> { IncludeFeeInAmount.Excluded } else -> { if (feeValue < amount.value) { IncludeFeeInAmount.Included( - SwapAmount( + amountSubtractFee = SwapAmount( reducedBalance - feeValue, getNativeToken(fromToken.network.backendId).decimals, ), From 3bc7e754dea9cbab99d29ce0e183d6154060cd8f Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 24 Jan 2025 09:59:07 +0300 Subject: [PATCH 7/8] Updated on 2026-08-14 --- .../main/assets/configs/excluded_blockchains_config.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json b/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json index 08fa6ca49b..aee72fb6e6 100644 --- a/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json +++ b/core/config-toggles/src/main/assets/configs/excluded_blockchains_config.json @@ -14,13 +14,5 @@ { "name": "vanar-chain", "version": "undefined" - }, - { - "name": "bitrock", - "version": "undefined" - }, - { - "name": "odyssey", - "version": "undefined" } ] \ No newline at end of file From b8a3a6899f49be85cf646fa539100d2eaeaf3ce9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 24 Jan 2025 10:48:32 +0300 Subject: [PATCH 8/8] Updated on 2026-08-14 --- .../data/tokens/repository/DefaultCurrenciesRepository.kt | 8 ++++---- .../tokens/GetBalanceNotEnoughForFeeWarningUseCase.kt | 2 +- .../tangem/domain/tokens/GetCurrencyWarningsUseCase.kt | 2 +- .../tokens/GetFeePaidCryptoCurrencyStatusSyncUseCase.kt | 5 +++-- .../domain/tokens/IsAmountSubtractAvailableUseCase.kt | 2 +- .../domain/tokens/repository/CurrenciesRepository.kt | 4 ++-- .../domain/tokens/repository/MockCurrenciesRepository.kt | 2 +- .../presentation/state/confirm/SendNotificationFactory.kt | 7 ++++++- .../com/tangem/feature/swap/domain/SwapInteractorImpl.kt | 2 +- 9 files changed, 20 insertions(+), 14 deletions(-) diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index 4fb9ef47d2..36fc695b7f 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -417,16 +417,16 @@ internal class DefaultCurrenciesRepository( } } - override suspend fun getFeePaidCurrency(userWalletId: UserWalletId, currency: CryptoCurrency): FeePaidCurrency { + override suspend fun getFeePaidCurrency(userWalletId: UserWalletId, network: Network): FeePaidCurrency { return withContext(dispatchers.io) { - val blockchain = Blockchain.fromId(currency.network.id.value) + val blockchain = Blockchain.fromId(network.id.value) when (val feePaidCurrency = blockchain.feePaidCurrency()) { FeePaidSdkCurrency.Coin -> FeePaidCurrency.Coin FeePaidSdkCurrency.SameCurrency -> FeePaidCurrency.SameCurrency is FeePaidSdkCurrency.Token -> { val balance = walletManagersFacade.tokenBalance( userWalletId = userWalletId, - network = currency.network, + network = network, name = feePaidCurrency.token.name, symbol = feePaidCurrency.token.symbol, contractAddress = feePaidCurrency.token.contractAddress, @@ -434,7 +434,7 @@ internal class DefaultCurrenciesRepository( id = feePaidCurrency.token.id, ) FeePaidCurrency.Token( - tokenId = getTokenId(network = currency.network, sdkToken = feePaidCurrency.token), + tokenId = getTokenId(network = network, sdkToken = feePaidCurrency.token), name = feePaidCurrency.token.name, symbol = feePaidCurrency.token.symbol, contractAddress = feePaidCurrency.token.contractAddress, diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetBalanceNotEnoughForFeeWarningUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetBalanceNotEnoughForFeeWarningUseCase.kt index b1f054e498..3f85d27819 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetBalanceNotEnoughForFeeWarningUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetBalanceNotEnoughForFeeWarningUseCase.kt @@ -34,7 +34,7 @@ class GetBalanceNotEnoughForFeeWarningUseCase( coinStatus: CryptoCurrencyStatus, ): Either = Either.catch { withContext(dispatchers.io) { - val feePaidCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, tokenStatus.currency) + val feePaidCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, tokenStatus.currency.network) val coinBalance = coinStatus.value.amount ?: BigDecimal.ZERO val isFeePaidByCoin = tokenStatus.currency is CryptoCurrency.Token diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt index 5be9720ad4..111f62b3ce 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt @@ -115,7 +115,7 @@ class GetCurrencyWarningsUseCase( coinStatus: CryptoCurrencyStatus, tokenStatus: CryptoCurrencyStatus, ): CryptoCurrencyWarning? { - val feePaidCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, tokenStatus.currency) + val feePaidCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, tokenStatus.currency.network) val isNetworkFeeZero = currenciesRepository.isNetworkFeeZero(userWalletId, tokenStatus.currency.network) return when { feePaidCurrency is FeePaidCurrency.Coin && diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetFeePaidCryptoCurrencyStatusSyncUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetFeePaidCryptoCurrencyStatusSyncUseCase.kt index 473b7c10b9..a66a4c3074 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetFeePaidCryptoCurrencyStatusSyncUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetFeePaidCryptoCurrencyStatusSyncUseCase.kt @@ -26,7 +26,8 @@ class GetFeePaidCryptoCurrencyStatusSyncUseCase( cryptoCurrencyStatus: CryptoCurrencyStatus, ): Either { val cryptoCurrency = cryptoCurrencyStatus.currency - val feePaidCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, cryptoCurrency) + val network = cryptoCurrency.network + val feePaidCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, network) val operations = CurrenciesStatusesOperations( userWalletId = userWalletId, currenciesRepository = currenciesRepository, @@ -39,7 +40,7 @@ class GetFeePaidCryptoCurrencyStatusSyncUseCase( when (feePaidCurrency) { FeePaidCurrency.Coin -> operations - .getNetworkCoinSync(cryptoCurrency.network.id, cryptoCurrency.network.derivationPath) + .getNetworkCoinSync(network.id, network.derivationPath) .getOrNull() FeePaidCurrency.SameCurrency, is FeePaidCurrency.FeeResource, diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/IsAmountSubtractAvailableUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/IsAmountSubtractAvailableUseCase.kt index 59510b29f3..080d6c0e79 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/IsAmountSubtractAvailableUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/IsAmountSubtractAvailableUseCase.kt @@ -19,7 +19,7 @@ class IsAmountSubtractAvailableUseCase( suspend operator fun invoke(userWalletId: UserWalletId, currency: CryptoCurrency): Either = Either.catch { withContext(dispatchers.io) { - when (val feeCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, currency)) { + when (val feeCurrency = currenciesRepository.getFeePaidCurrency(userWalletId, currency.network)) { is FeePaidCurrency.Coin -> currency is CryptoCurrency.Coin is FeePaidCurrency.SameCurrency -> true is FeePaidCurrency.Token -> currency.id == feeCurrency.tokenId diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt index b3a7846497..c99a692b70 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt @@ -231,9 +231,9 @@ interface CurrenciesRepository { ): Boolean /** - * Retrieves fee paid currency for specific [currency]. + * Retrieves fee paid currency for specific [network]. */ - suspend fun getFeePaidCurrency(userWalletId: UserWalletId, currency: CryptoCurrency): FeePaidCurrency + suspend fun getFeePaidCurrency(userWalletId: UserWalletId, network: Network): FeePaidCurrency /** * Creates token [cryptoCurrency] based on current token and [network] it`s will be added diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt index 6f9e9811af..ce99852888 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt @@ -137,7 +137,7 @@ internal class MockCurrenciesRepository( return false } - override suspend fun getFeePaidCurrency(userWalletId: UserWalletId, currency: CryptoCurrency): FeePaidCurrency { + override suspend fun getFeePaidCurrency(userWalletId: UserWalletId, network: Network): FeePaidCurrency { return FeePaidCurrency.Coin } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt index 3918f10bb4..4736397eb8 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt @@ -96,7 +96,12 @@ internal class SendNotificationFactory( val recipientAddress = state.recipientState?.addressTextField?.value val statusValue = cryptoCurrencyStatus.value as? CryptoCurrencyStatus.Loaded - val balanceAfterTransaction = statusValue?.let { it.amount - sendingAmount - feeValue } + val feeToSubtract = if (isSubtractAvailableProvider()) { + feeValue + } else { + BigDecimal.ZERO + } + val balanceAfterTransaction = statusValue?.let { it.amount - sendingAmount - feeToSubtract } val currencyCheck = getCurrencyCheckUseCase( userWalletId = userWalletId, currencyStatus = cryptoCurrencyStatus, diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 754fc5a789..84fefe7f12 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -1992,7 +1992,7 @@ internal class SwapInteractorImpl @AssistedInject constructor( private suspend fun getFeePaidCurrency(currency: CryptoCurrency): FeePaidCurrency { return currenciesRepository.getFeePaidCurrency( userWalletId = userWalletId, - currency = currency, + network = currency.network, ) }