From 0415eace328be6d565f7d720e2dc02a1225fb214 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 27 Aug 2024 12:07:27 +0300 Subject: [PATCH 01/16] Updated on 2026-08-14 --- .../src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt index 8d53ec6fb6..70bce8cb4a 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt @@ -328,7 +328,7 @@ fun Blockchain.toCoinId(): String { Blockchain.Bittensor -> "bittensor" Blockchain.Filecoin -> "filecoin" Blockchain.Blast, Blockchain.BlastTestnet -> "blast-ethereum" - Blockchain.Cyber, Blockchain.CyberTestnet -> "cyberconnect" + Blockchain.Cyber, Blockchain.CyberTestnet -> "cyber-ethereum" } } From 143d3997e849fee6d912a224a2c4ee4e0323c6dc Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 27 Aug 2024 15:12:30 +0300 Subject: [PATCH 02/16] 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 b259900751..74ab5dc3df 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -88,7 +88,7 @@ markdown = "0.7.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.14-747" +tangemBlockchainSdk = "release-app_5.14-749" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.14-379" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From 13cfa555b5d68267ca857e5c143ea94cde5fece0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 27 Aug 2024 16:53:35 +0300 Subject: [PATCH 03/16] Updated on 2026-08-14 --- core/res/src/main/res/values-de/strings.xml | 1 + core/res/src/main/res/values-fr/strings.xml | 1 + core/res/src/main/res/values-uk-rUA/strings.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index b1797d3a2a..d8d34a32ce 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -859,6 +859,7 @@ Um eine Transaktion durchzuführen, du etwas etwas einzahlen %1$s %2$s Die Gebühr %s kann nicht gedeckt werden Der zu erhaltende Betrag muss mindestens %s betragen + Ausgewähltes Paar vorübergehend nicht verfügbar Service vorübergehend nicht verfügbar Die Menge der zu tauschenden Token darf folgende Werte nicht überschreiten %s Der zu tauschende Betrag muss mindestens %s betragen diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 581c5d1af7..1247f856e0 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -762,6 +762,7 @@ Impossible de couvrir %s frais Le montant à recevoir doit être d\'au moins %s Cela peut se produire car le fournisseur n\'est actuellement pas en mesure d\'échanger la paire que vous avez sélectionnée. Veuillez patienter un instant et réessayer. (Code %@) + La paire sélectionnée est temporairement indisponible Service temporairement indisponible Le nombre de jetons à échanger ne doit pas dépasser %s Le montant à échanger doit être d\'au moins %s 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 4a4839b4e7..6c9104cfae 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -868,6 +868,7 @@ Щоб здійснити транзакцію, вам потрібно внести трохи %1$s %2$s Неможливо покрити комісію %s Сума отримання не може бути меншою за %s + Обрана пара тимчасово недоступна Сервіс тимчасово недоступний Сума до обміну не повинна перевищувати %s Сума для обміну має бути не менше %s From 36394c1130297e2c9d831a718ed62513f6a40369 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 12:14:45 +0300 Subject: [PATCH 04/16] 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 74ab5dc3df..89a7b25dc7 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -88,7 +88,7 @@ markdown = "0.7.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.14-749" +tangemBlockchainSdk = "release-app_5.14-751" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.14-379" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From bdc390ecd54774ee8c1fbe10f64fa7dabb0d219e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 16:06:16 +0400 Subject: [PATCH 05/16] Updated on 2026-08-14 --- .../presentation/wallet/state/WalletStateController.kt | 3 +++ .../presentation/wallet/viewmodels/WalletViewModel.kt | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt index 4f4e7c869f..a54ca605c0 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt @@ -30,6 +30,9 @@ internal class WalletStateController @Inject constructor() { val value: WalletScreenState get() = uiState.value + val isInitialized: Boolean + get() = value.selectedWalletIndex != NOT_INITIALIZED_WALLET_INDEX + private val mutableUiState: MutableStateFlow = MutableStateFlow(value = getInitialState()) fun update(function: (WalletScreenState) -> WalletScreenState) { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index b38bc57b61..e4fc8b0bff 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -7,7 +7,10 @@ import androidx.lifecycle.viewModelScope import arrow.core.getOrElse import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase -import com.tangem.domain.settings.* +import com.tangem.domain.settings.CanUseBiometryUseCase +import com.tangem.domain.settings.IsWalletsScrollPreviewEnabled +import com.tangem.domain.settings.ShouldAskPermissionUseCase +import com.tangem.domain.settings.ShouldShowSaveWalletScreenUseCase import com.tangem.domain.tokens.RefreshMultiCurrencyWalletQuotesUseCase import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase @@ -190,6 +193,8 @@ internal class WalletViewModel @Inject constructor( /** Change selected wallet state if selected wallet [selectedWalletId] was changed in the background */ private suspend fun changeSelectedWalletState(selectedWalletId: UserWalletId) { + if (!stateHolder.isInitialized) return + if (screenLifecycleProvider.isBackgroundState.value && selectedWalletId != stateHolder.getSelectedWalletId()) { stateHolder.value.wallets .indexOfFirstOrNull { prevState -> prevState.walletCardState.id == selectedWalletId } From b542ecf3aeae0dbb1c36e789c08652049308be56 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 15:08:54 +0300 Subject: [PATCH 06/16] Updated on 2026-08-14 --- core/res/src/main/res/values-de/strings.xml | 1 + 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 +- core/res/src/main/res/values-uk-rUA/strings.xml | 1 + core/res/src/main/res/values/strings.xml | 2 +- 6 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index d8d34a32ce..f142066bec 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -859,6 +859,7 @@ Um eine Transaktion durchzuführen, du etwas etwas einzahlen %1$s %2$s Die Gebühr %s kann nicht gedeckt werden Der zu erhaltende Betrag muss mindestens %s betragen + Dies kann passieren, weil der Anbieter derzeit nicht in der Lage ist, dein ausgewähltes Paar zu swappen. Bitte warte einen Moment und versuche es später erneut. (Code %s) Ausgewähltes Paar vorübergehend nicht verfügbar Service vorübergehend nicht verfügbar Die Menge der zu tauschenden Token darf folgende Werte nicht überschreiten %s diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 1247f856e0..32f1230b31 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -761,7 +761,7 @@ Pour effectuer une transaction, vous devez déposer %1$s %2$s Impossible de couvrir %s frais Le montant à recevoir doit être d\'au moins %s - Cela peut se produire car le fournisseur n\'est actuellement pas en mesure d\'échanger la paire que vous avez sélectionnée. Veuillez patienter un instant et réessayer. (Code %@) + Cela peut se produire car le fournisseur n\'est actuellement pas en mesure d\'échanger la paire que vous avez sélectionnée. Veuillez patienter un instant et réessayer. (Code %s) La paire sélectionnée est temporairement indisponible Service temporairement indisponible Le nombre de jetons à échanger ne doit pas dépasser %s diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index cbfddbaa7f..af264b0a88 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -847,7 +847,7 @@ 取引を行うには、 %1$s %2$sを入金する必要があります。 %s 手数料を支払えません 受け取る金額は、 %s 以上である必要があります。 - これは、選択したペアがプロバイダーでは現在交換できないために発生する可能性があります。しばらく待ってからもう一度お試しください。(コード%@ ) + これは、選択したペアがプロバイダーでは現在交換できないために発生する可能性があります。しばらく待ってからもう一度お試しください。(コード%s ) 選択されたペアは一時的に利用できません サービスは一時的に利用できません スワップするトークンの量は %s を超えないでください diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index ff9fce14ea..83717a3ab1 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -866,7 +866,7 @@ Чтобы совершить транзакцию, вам необходимо внести немного %1$s %2$s Невозможно покрыть комиссию %s Сумма получения не может быть менее %s - Это может произойти из-за того, что провайдер временно не предоставляет обмен выбранной вами пары. Пожалуйста, подождите некоторое время и попробуйте снова. (Код %@) + Это может произойти из-за того, что провайдер временно не предоставляет обмен выбранной вами пары. Пожалуйста, подождите некоторое время и попробуйте снова. (Код %s) Выбранная пара временно недоступна Cервис временно недоступен Сумма для обмена должна быть не более %s 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 6c9104cfae..bd027b279d 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -868,6 +868,7 @@ Щоб здійснити транзакцію, вам потрібно внести трохи %1$s %2$s Неможливо покрити комісію %s Сума отримання не може бути меншою за %s + Це може статися тому, що провайдер наразі не може обміняти обрану пару. Будь ласка, зачекайте трохи та спробуйте ще раз. (Код %s) Обрана пара тимчасово недоступна Сервіс тимчасово недоступний Сума до обміну не повинна перевищувати %s diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index dadb67073c..784a17bf0f 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -859,7 +859,7 @@ To make a transaction you need to deposit some %1$s %2$s Unable to cover %s fee The amount to receive must be at least %s - This may occur because the provider is currently unable to exchange your selected pair. Please wait a moment and try again. (Code %@) + This may occur because the provider is currently unable to exchange your selected pair. Please wait a moment and try again. (Code %s) Selected pair temporarily unavailable Service temporarily unavailable The amount of tokens to be swapped must not exceed %s From 2ae1084bc375ef3a20895452245cb04b47de49e0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 16:22:48 +0300 Subject: [PATCH 07/16] Updated on 2026-08-14 --- .../main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt index d95ec56762..c9e3891056 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt @@ -28,7 +28,7 @@ import com.tangem.feature.swap.presentation.R fun SwapSuccessScreen(state: SwapSuccessStateHolder, onBack: () -> Unit) { Scaffold( modifier = Modifier.systemBarsPadding(), - backgroundColor = TangemTheme.colors.background.tertiary, + backgroundColor = TangemTheme.colors.background.secondary, content = { padding -> SwapSuccessScreenContent(padding = padding, state = state) }, From 6d629f5c78270bc9422a2146bd3339c4eff68a39 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 16:28:35 +0300 Subject: [PATCH 08/16] Updated on 2026-08-14 --- .../tangem/tap/proxy/TransactionManagerImpl.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index 29b6c4b9d5..4e8c1bbf82 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -277,15 +277,15 @@ class TransactionManagerImpl( val feeMin = gasLimit.multiply(gasPrice).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), - ) + ).increaseForMantleIfNeeded(blockchain) val feeNormal = gasLimit.multiply(gasPriceNormal).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), - ) + ).increaseForMantleIfNeeded(blockchain) val feePriority = gasLimit.multiply(gasPricePriority).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), - ) + ).increaseForMantleIfNeeded(blockchain) val minFee = ProxyFee.Common( gasLimit = gasLimit, fee = ProxyAmount( @@ -339,8 +339,18 @@ class TransactionManagerImpl( } } + // TODO Workaround for Mantle. Remove after [REDACTED_JIRA] + private fun BigDecimal.increaseForMantleIfNeeded(blockchain: Blockchain): BigDecimal { + return if (blockchain == Blockchain.Mantle) { + this.multiply(MANTLE_FEE_ESTIMATE_MULTIPLIER) + } else { + this + } + } + companion object { private const val MULTIPLIER_GAS_PRICE_FOR_NORMAL_FEE = 150 // 50% private const val MULTIPLIER_GAS_PRICE_FOR_PRIORITY_FEE = 200 // 50% + private val MANTLE_FEE_ESTIMATE_MULTIPLIER = BigDecimal("1.6") } } \ No newline at end of file From b890e45ece4ae97457f648dfb36baca2e120f08d Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 19:47:42 +0500 Subject: [PATCH 09/16] Updated on 2026-08-14 --- core/res/src/main/res/values-ru/strings.xml | 2 ++ core/res/src/main/res/values/strings.xml | 2 ++ .../tokens/model/warnings/CryptoCurrencyWarning.kt | 2 ++ .../domain/tokens/GetCurrencyWarningsUseCase.kt | 13 +++++++++++++ .../TokenDetailsNotificationsAnalyticsSender.kt | 1 + .../state/components/TokenDetailsNotification.kt | 5 +++++ .../factory/TokenDetailsNotificationConverter.kt | 1 + .../java/com/tangem/lib/crypto/BlockchainUtils.kt | 6 ++++++ 8 files changed, 32 insertions(+) diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 83717a3ab1..324a1a41ba 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -882,6 +882,8 @@ На этой карте осталось всего %s подписей. Вам следует вывести все ваши средства. Малое количество подписей Токены на разных сетях могут иметь разные адреса. Пожалуйста, убедитесь при переводе средств, что ваш адрес соответствует сети. + Миграция MATIC в POL + Токен MATIC мигрирует на POL. Однако крайний срок не установлен, и MATIC пока не устарел. Вы можете спокойно продолжать использовать токен MATIC или воспользоваться биржами, чтобы обменять его на POL. Используйте вашу карту, чтобы получить адрес для %d сети Используйте вашу карту, чтобы получить адреса для %d сетей diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 784a17bf0f..957150188b 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -875,6 +875,8 @@ Only %s signatures are left on this card. You must withdraw all of your funds. Low signature count Tokens on different networks can have different addresses. Double-check that your address matches the network when you transfer funds. + MATIC to POL Migration + MATIC is being migrated to POL. However there is no deadline set and MATIC isn\'t being deprecated yet. You can safely continue using MATIC token or use exchanges to swap it for POL. Use your card to get an address for %d network Use your card to get an addresses for %d networks diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt index 2fa13a5018..4c4473250c 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt @@ -48,6 +48,8 @@ sealed class CryptoCurrencyWarning { data object BeaconChainShutdown : CryptoCurrencyWarning() + data object MigrationMaticToPol : CryptoCurrencyWarning() + /** * Shows a warning about an available fee resource for a transaction in several blockchains (ex. Koinos) */ 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 03c0debc06..fc77aa776b 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 @@ -76,6 +76,7 @@ class GetCurrencyWarningsUseCase( getNetworkNoAccountWarning(currencyStatus), getBeaconChainShutdownWarning(currency.network.id), getAssetRequirementsWarning(userWalletId = userWalletId, currency = currency), + getMigrationFromMaticToPolWarning(currency), ) }.flowOn(dispatchers.io) } @@ -304,7 +305,19 @@ class GetCurrencyWarningsUseCase( } } + private fun getMigrationFromMaticToPolWarning(currency: CryptoCurrency): CryptoCurrencyWarning? { + return if (currency.symbol == MATIC_SYMBOL && !BlockchainUtils.isPolygonChain(currency.network.id.value)) { + CryptoCurrencyWarning.MigrationMaticToPol + } else { + null + } + } + private fun BigDecimal?.isZero(): Boolean { return this?.signum() == 0 } + + companion object { + private const val MATIC_SYMBOL = "MATIC" + } } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt index 300083d876..e46cc3f47c 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt @@ -49,6 +49,7 @@ internal class TokenDetailsNotificationsAnalyticsSender( is TokenDetailsNotification.NetworkShutdown, is TokenDetailsNotification.HederaAssociateWarning, is TokenDetailsNotification.KoinosMana, + is TokenDetailsNotification.MigrationMaticToPol, -> null } } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt index a09065820b..69b5beb389 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt @@ -201,4 +201,9 @@ internal sealed class TokenDetailsNotification(val config: NotificationConfig) { formatArgs = wrappedList(manaBalanceAmount, maxManaBalanceAmount), ), ) + + data object MigrationMaticToPol : Warning( + title = resourceReference(id = R.string.warning_matic_migration_title), + subtitle = resourceReference(id = R.string.warning_matic_migration_message), + ) } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt index fd828b47d0..0722f5a792 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt @@ -122,6 +122,7 @@ internal class TokenDetailsNotificationConverter( "" }, ) + is CryptoCurrencyWarning.MigrationMaticToPol -> MigrationMaticToPol } } diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt index 35b8386cd9..30767aeb4b 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt @@ -55,4 +55,10 @@ object BlockchainUtils { val blockchain = Blockchain.fromId(networkId) return blockchain == Blockchain.Binance || blockchain == Blockchain.BinanceTestnet } + + /** If current [networkId] is Polygon */ + fun isPolygonChain(networkId: String): Boolean { + val blockchain = Blockchain.fromId(networkId) + return blockchain == Blockchain.Polygon || blockchain == Blockchain.PolygonTestnet + } } \ No newline at end of file From f1c53a4016bc5cb29cf253e37a9fc4ca0c62f2da Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 20:11:46 +0500 Subject: [PATCH 10/16] Updated on 2026-08-14 --- core/res/src/main/res/values-de/strings.xml | 2 ++ core/res/src/main/res/values-ja/strings.xml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index f142066bec..c9b6c36eff 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -875,6 +875,8 @@ Auf dieser Karte sind nur noch %s Unterschriften übrig. Du musst dein gesamtes Guthaben abheben. Geringe Anzahl von Unterschriften Token in verschiedenen Netzwerken können unterschiedliche Adressen haben. Überprüfe bei der Überweisung noch einmal, ob deine Adresse mit der des Netzwerks übereinstimmt. + Migration von MATIC zu POL + MATIC wird auf POL migriert. Es gibt jedoch keine Frist, und MATIC wird noch nicht abgeschafft. Du kannst MATIC-Token weiterhin verwenden oder sie über eien Exchange gegen POL tauschen. Verwende deine Karte, um eine Adresse für das %d-Netz zu erhalten Verwende deine Karte, um mehrere Adressen für die %d-Netzwerke zu erhalten diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index af264b0a88..55189ebf68 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -863,6 +863,8 @@ このカードには%sの署名のみが残っています。資金をすべて引き出す必要があります。 署名数が少ないです 異なるネットワーク上のトークンは、異なるアドレスを持つ場合があります。資金を送金する際には、アドレスがネットワークと一致していることを再確認してください。 + MATICからPOLへの移行 + MATICはPOLに移行中です。ただし、期限は設定されておらず、MATICはまだ廃止されていません。MATICトークンを引き続き安全に使用することも、取引所でPOLに交換することもできます。 %d ネットワークのアドレスを取得するために、カードを利用してください From 345b96066db1bb9324d2ab5b7228b214a393e1ad Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 18:20:17 +0300 Subject: [PATCH 11/16] Updated on 2026-08-14 --- .../walletconnect/WalletConnectSdkHelper.kt | 14 ++++++++++++-- .../tangem/tap/proxy/TransactionManagerImpl.kt | 16 +++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index 3914707cc3..18ce548096 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -72,7 +72,7 @@ class WalletConnectSdkHelper { } // TODO move fee calculation to SDK getFee() [REDACTED_JIRA] - val gasLimit = getGasLimitFromTx(value, walletManager, transaction) + val gasLimit = getGasLimitFromTx(value, walletManager, transaction, blockchain) val gasPrice = getGasPrice(walletManager, transaction) val feeDecimal = (gasLimit * gasPrice).movePointLeft(decimals) @@ -170,6 +170,7 @@ class WalletConnectSdkHelper { value: BigDecimal, walletManager: WalletManager, transaction: WcEthereumTransaction, + blockchain: Blockchain, ): BigDecimal { return transaction.gas?.hexToBigDecimal() ?: transaction.gasLimit?.hexToBigDecimal() @@ -177,7 +178,7 @@ class WalletConnectSdkHelper { value = value, walletManager = walletManager, transaction = transaction, - ) + ).increaseForMantleIfNeeded(blockchain) } private suspend fun getGasLimitFromBlockchain( @@ -200,6 +201,15 @@ class WalletConnectSdkHelper { } } + // TODO Workaround for Mantle. Remove after [REDACTED_JIRA] + private fun BigDecimal.increaseForMantleIfNeeded(blockchain: Blockchain): BigDecimal { + return if (blockchain == Blockchain.Mantle) { + this.multiply(MANTLE_FEE_ESTIMATE_MULTIPLIER) + } else { + this + } + } + private suspend fun sendTransaction(data: WcTransactionData, cardId: String?): String? { val result = (data.walletManager as TransactionSender).send( transactionData = data.transaction, diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index 4e8c1bbf82..f42a80725e 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -272,22 +272,24 @@ class TransactionManagerImpl( * @param blockchain */ private fun createMultipleProxyFees(gasPrice: BigInteger, gasLimit: BigInteger, blockchain: Blockchain): ProxyFees { - val gasPriceNormal = gasPrice.increaseBigIntegerByPercents(MULTIPLIER_GAS_PRICE_FOR_NORMAL_FEE) + val patchedGasLimit = gasLimit.toBigDecimal().increaseForMantleIfNeeded(blockchain).toBigInteger() + val gasPriceNormal = gasPrice + .increaseBigIntegerByPercents(MULTIPLIER_GAS_PRICE_FOR_NORMAL_FEE) val gasPricePriority = gasPrice.increaseBigIntegerByPercents(MULTIPLIER_GAS_PRICE_FOR_PRIORITY_FEE) - val feeMin = gasLimit.multiply(gasPrice).toBigDecimal( + val feeMin = patchedGasLimit.multiply(gasPrice).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), ).increaseForMantleIfNeeded(blockchain) - val feeNormal = gasLimit.multiply(gasPriceNormal).toBigDecimal( + val feeNormal = patchedGasLimit.multiply(gasPriceNormal).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), ).increaseForMantleIfNeeded(blockchain) - val feePriority = gasLimit.multiply(gasPricePriority).toBigDecimal( + val feePriority = patchedGasLimit.multiply(gasPricePriority).toBigDecimal( scale = blockchain.decimals(), mathContext = MathContext(blockchain.decimals(), RoundingMode.HALF_EVEN), ).increaseForMantleIfNeeded(blockchain) val minFee = ProxyFee.Common( - gasLimit = gasLimit, + gasLimit = patchedGasLimit, fee = ProxyAmount( currencySymbol = blockchain.currency, value = feeMin, @@ -295,7 +297,7 @@ class TransactionManagerImpl( ), ) val normalFee = ProxyFee.Common( - gasLimit = gasLimit, + gasLimit = patchedGasLimit, fee = ProxyAmount( currencySymbol = blockchain.currency, value = feeNormal, @@ -303,7 +305,7 @@ class TransactionManagerImpl( ), ) val priorityFee = ProxyFee.Common( - gasLimit = gasLimit, + gasLimit = patchedGasLimit, fee = ProxyAmount( currencySymbol = blockchain.currency, value = feePriority, From 74ab3dbfb2bff31d123a0304b92a5ddea11abd59 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Aug 2024 19:29:28 +0300 Subject: [PATCH 12/16] Updated on 2026-08-14 --- .../feature/swap/domain/SwapInteractorImpl.kt | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 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 de0468d9ff..088ef3b856 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 @@ -1138,6 +1138,7 @@ internal class SwapInteractorImpl @Inject constructor( isAllowedToSpend = isAllowedToSpend, spenderAddress = quoteModel.allowanceContract, ) + if (state !is SwapState.QuotesLoadedState) return state state.copy( preparedSwapConfigState = state.preparedSwapConfigState.copy( isAllowedToSpend = isAllowedToSpend, @@ -1171,18 +1172,32 @@ internal class SwapInteractorImpl @Inject constructor( } }, ifLeft = { error -> - val rates = getQuotes(fromToken.currency.id) - val fromTokenSwapInfo = TokenSwapInfo( - tokenAmount = amount, - amountFiat = rates[fromToken.currency.id]?.fiatRate?.multiply(amount.value) - ?: BigDecimal.ZERO, - cryptoCurrencyStatus = fromToken, + createSwapErrorWith( + fromToken = fromToken, + amount = amount, + includeFeeInAmount = includeFeeInAmount, + dataError = error, ) - return SwapState.SwapError(fromTokenSwapInfo, error, includeFeeInAmount) }, ) } + private suspend fun createSwapErrorWith( + fromToken: CryptoCurrencyStatus, + amount: SwapAmount, + includeFeeInAmount: IncludeFeeInAmount, + dataError: DataError, + ): SwapState.SwapError { + val rates = getQuotes(fromToken.currency.id) + val fromTokenSwapInfo = TokenSwapInfo( + tokenAmount = amount, + amountFiat = rates[fromToken.currency.id]?.fiatRate?.multiply(amount.value) + ?: BigDecimal.ZERO, + cryptoCurrencyStatus = fromToken, + ) + return SwapState.SwapError(fromTokenSwapInfo, dataError, includeFeeInAmount) + } + @Suppress("CyclomaticComplexMethod") private suspend fun getIncludeFeeInAmount( networkId: String, @@ -1481,7 +1496,7 @@ internal class SwapInteractorImpl @Inject constructor( quotesLoadedState: SwapState.QuotesLoadedState, spenderAddress: String?, isAllowedToSpend: Boolean, - ): SwapState.QuotesLoadedState { + ): SwapState { val fromToken = fromTokenStatus.currency if (isAllowedToSpend) { return quotesLoadedState.copy( @@ -1526,15 +1541,19 @@ internal class SwapInteractorImpl @Inject constructor( ) } catch (e: Exception) { Timber.e(e, "Failed to get fee") - null + // it's impossible next steps without fee + return createSwapErrorWith( + fromToken = fromTokenStatus, + amount = swapAmount, + includeFeeInAmount = IncludeFeeInAmount.Excluded, + dataError = DataError.UnknownError, + ) } } - val feeState = feeData?.let { - when (feeData) { - is ProxyFees.MultipleFees -> feeData.proxyFeesToFeeState(fromToken) - is ProxyFees.SingleFee -> feeData.proxyFeesToFeeState(fromToken) - } - } ?: TxFeeState.Empty + val feeState = when (feeData) { + is ProxyFees.MultipleFees -> feeData.proxyFeesToFeeState(fromToken) + is ProxyFees.SingleFee -> feeData.proxyFeesToFeeState(fromToken) + } val fee = when (feeState) { TxFeeState.Empty -> BigDecimal.ZERO is TxFeeState.MultipleFeeState -> feeState.normalFee.feeValue From 8e0e984b9a7b3e57232c78e3c6039f0fa116b30f Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 29 Aug 2024 14:02:43 +0400 Subject: [PATCH 13/16] Updated on 2026-08-14 --- .../presentation/wallet/ui/WalletScreen.kt | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt index b8dd2da1b7..369c9f8215 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt @@ -2,8 +2,11 @@ package com.tangem.feature.wallet.presentation.wallet.ui import android.content.res.Configuration import androidx.activity.compose.BackHandler +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.TweenSpec import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectTapGestures @@ -72,7 +75,8 @@ import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.balances import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.depositButton import com.tangem.feature.wallet.presentation.wallet.ui.utils.changeWalletAnimator import com.tangem.features.markets.component.BottomSheetState -import com.tangem.features.markets.component.BottomSheetState.* +import com.tangem.features.markets.component.BottomSheetState.COLLAPSED +import com.tangem.features.markets.component.BottomSheetState.EXPANDED import com.tangem.features.markets.component.MarketsEntryComponent import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.launch @@ -220,12 +224,9 @@ private fun WalletContent( } if (marketsEntryComponent != null) { - val bottomSheetState = remember { - mutableStateOf(BottomSheetState.COLLAPSED) - } - var headerSize by remember { - mutableStateOf(0.dp) - } + val bottomSheetState = remember { mutableStateOf(COLLAPSED) } + + var headerSize by remember { mutableStateOf(0.dp) } BaseScaffoldWithMarkets( state = state, @@ -241,17 +242,15 @@ private fun WalletContent( modifier = Modifier, ) }, - ) { - scaffoldContent() - } + content = scaffoldContent, + ) } else { BaseScaffold( state = state, selectedWallet = selectedWallet, snackbarHostState = snackbarHostState, - ) { - scaffoldContent() - } + content = scaffoldContent, + ) } } @@ -274,16 +273,21 @@ private fun BaseScaffold( ) }, floatingActionButton = { - val manageTokensButtonConfig by remember(state.selectedWalletIndex) { - mutableStateOf( - (state.wallets[state.selectedWalletIndex] as? WalletState.MultiCurrency)?.manageTokensButtonConfig, - ) - } + val manageTokensButtonConfig by rememberUpdatedState( + newValue = (state.wallets[state.selectedWalletIndex] as? WalletState.MultiCurrency) + ?.manageTokensButtonConfig, + ) + + AnimatedVisibility( + visible = manageTokensButtonConfig != null, + enter = fadeIn(), + exit = fadeOut(), + ) { + val config = manageTokensButtonConfig ?: return@AnimatedVisibility - manageTokensButtonConfig?.let { ManageTokensButton( modifier = Modifier.navigationBarsPadding(), - onClick = it.onClick, + onClick = config.onClick, ) } }, From 36a315eef4bb0f1e59befb4ef2225340410db1d8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 30 Aug 2024 13:19:48 +0300 Subject: [PATCH 14/16] Updated on 2026-08-14 --- .../tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt | 2 +- .../main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt index 18ce548096..bd7f90f809 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectSdkHelper.kt @@ -447,6 +447,6 @@ class WalletConnectSdkHelper { const val HEX_PREFIX = "0x" const val DEFAULT_MAX_GASLIMIT = 350000 // TODO remove after [REDACTED_JIRA] - private val MANTLE_FEE_ESTIMATE_MULTIPLIER = BigDecimal("1.6") + private val MANTLE_FEE_ESTIMATE_MULTIPLIER = BigDecimal("1.8") } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index f42a80725e..87b23e1c2d 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -353,6 +353,6 @@ class TransactionManagerImpl( companion object { private const val MULTIPLIER_GAS_PRICE_FOR_NORMAL_FEE = 150 // 50% private const val MULTIPLIER_GAS_PRICE_FOR_PRIORITY_FEE = 200 // 50% - private val MANTLE_FEE_ESTIMATE_MULTIPLIER = BigDecimal("1.6") + private val MANTLE_FEE_ESTIMATE_MULTIPLIER = BigDecimal("1.8") } } \ No newline at end of file From ec2a5f5211b3f298bf63ab5ce984d5f56a85af43 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 2 Sep 2024 13:54:11 +0300 Subject: [PATCH 15/16] Updated on 2026-08-14 --- .../data/common/currency/ResponseCryptoCurrenciesFactory.kt | 1 + gradle/dependencies.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt index 9bbdfb7fed..24db327e04 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt @@ -118,6 +118,7 @@ class ResponseCryptoCurrenciesFactory { // get name and symbol from enum Blockchain until backend renamed // [REDACTED_JIRA] Blockchain.Dischain, + Blockchain.Polygon, -> this.currency else -> responseToken.symbol } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 89a7b25dc7..2ddd79a893 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -88,7 +88,7 @@ markdown = "0.7.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.14-751" +tangemBlockchainSdk = "release-app_5.14-756" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.14-379" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From 3f4bb4403e8949faee5e779ffeed9c4bf208d0c9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 2 Sep 2024 21:02:30 +0300 Subject: [PATCH 16/16] 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 2ddd79a893..abd5f3e54e 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -88,7 +88,7 @@ markdown = "0.7.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.14-756" +tangemBlockchainSdk = "release-app_5.14-758" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.14-379" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^