From 6e7693bc49c4ec24ab8feb436abe516d755dd817 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 29 Oct 2022 21:12:08 +0400 Subject: [PATCH 01/25] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index a7b0e1623d..d76197931d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-130', + tangem_blockchain_sdk: 'develop-131', // tangem_blockchain_sdk: '0.0.1', ] From 46040532616bbb7b8214fbe19f16401d71aabed5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 11:24:28 +0400 Subject: [PATCH 02/25] Updated on 2026-08-14 --- app/src/main/res/layout/fragment_shop.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_shop.xml b/app/src/main/res/layout/fragment_shop.xml index 26cd36c1d7..7ebeaa7735 100644 --- a/app/src/main/res/layout/fragment_shop.xml +++ b/app/src/main/res/layout/fragment_shop.xml @@ -8,7 +8,6 @@ android:background="@color/backgroundLightGray" android:clipChildren="false" android:clipToPadding="false" - android:fitsSystemWindows="true" android:focusableInTouchMode="true" android:orientation="vertical"> From c7b47627536e3c86b7da69ced62407c58a0f374a Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 11:25:52 +0400 Subject: [PATCH 03/25] Updated on 2026-08-14 --- .../wallet/redux/middlewares/WalletMiddleware.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index ca2323f38e..30a72f0fd4 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -14,6 +14,7 @@ import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.tap.common.analytics.AnalyticsAnOld import com.tangem.tap.common.extensions.copyToClipboard import com.tangem.tap.common.extensions.dispatchDebugErrorNotification +import com.tangem.tap.common.extensions.dispatchErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.extensions.onCardScanned @@ -23,6 +24,7 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction +import com.tangem.tap.domain.TapError import com.tangem.tap.domain.failedRates import com.tangem.tap.domain.loadedRates import com.tangem.tap.features.demo.DemoHelper @@ -37,6 +39,7 @@ import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.WalletData import com.tangem.tap.features.wallet.redux.WalletState import com.tangem.tap.features.wallet.redux.WalletStore +import com.tangem.tap.network.NetworkConnectivity import com.tangem.tap.network.NetworkStateChanged import com.tangem.tap.preferencesStorage import com.tangem.tap.scope @@ -186,10 +189,10 @@ class WalletMiddleware { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.CreateWallet, - card = store.state.detailsState.scanResponse?.card + card = store.state.detailsState.scanResponse?.card, ) } } @@ -249,6 +252,10 @@ class WalletMiddleware { store.dispatchOpenUrl(action.exploreUrl) } is WalletAction.Send -> { + if (!NetworkConnectivity.getInstance().isOnlineOrConnecting()) { + store.dispatchErrorNotification(TapError.NoInternetConnection) + return + } val newAction = prepareSendAction(action.amount, store.state.walletState) store.dispatch(newAction) if (newAction is PrepareSendScreen) { From 68c65e668b6de99ffe6169a9ddf0eebdf29f8d51 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 11:28:38 +0400 Subject: [PATCH 04/25] Updated on 2026-08-14 --- .../com/tangem/tap/common/redux/global/GlobalMidlleware.kt | 1 + app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt index f5c5840ffd..6f5af6bb92 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt @@ -165,6 +165,7 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di } is GlobalAction.ScanCard -> { scope.launch { + tangemSdkManager.changeDisplayedCardIdNumbersCount(null) val result = tangemSdkManager.scanProduct( store.state.globalState.analyticsHandler, userTokensRepository, diff --git a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt index 296b47185b..70576a26b9 100644 --- a/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/TangemSdkManager.kt @@ -182,8 +182,9 @@ class TangemSdkManager(private val tangemSdk: TangemSdk, private val context: Co return withContext(Dispatchers.Main) { result } } - fun changeDisplayedCardIdNumbersCount(scanResponse: ScanResponse) { + fun changeDisplayedCardIdNumbersCount(scanResponse: ScanResponse?) { tangemSdk.config.cardIdDisplayFormat = when { + scanResponse == null -> CardIdDisplayFormat.Full scanResponse.isTangemTwins() -> CardIdDisplayFormat.LastLuhn(4) scanResponse.isSaltPay() -> CardIdDisplayFormat.None else -> CardIdDisplayFormat.Full From 27bd9c6db7a4386ba29ff19d56324a6240f97f69 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 11:30:56 +0400 Subject: [PATCH 05/25] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../features/tokens/redux/TokensMiddleware.kt | 9 +------- .../tap/features/wallet/redux/WalletAction.kt | 9 +++----- .../middlewares/MultiWalletMiddleware.kt | 21 +++++++++++-------- .../redux/reducers/MultiWalletReducer.kt | 5 +++++ 5 files changed, 22 insertions(+), 24 deletions(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index cf6ea50867..a1658496e7 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit cf6ea50867477f97655da9da47ff94987e8f3354 +Subproject commit a1658496e777b611fc990ef2bc1a1a1fd48bc1e6 diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index 9817b4db49..fe47a2b2bf 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -318,14 +318,7 @@ class TokensMiddleware { } private fun removeCurrenciesIfNeeded(currencies: List) { - if (currencies.isNotEmpty()) { - currencies.forEach { currency -> - store.dispatch(WalletAction.MultiWallet.RemoveWallet( - currency = currency, - fromScreen = AppScreen.AddTokens - )) - } - } + if (currencies.isNotEmpty()) store.dispatch(WalletAction.MultiWallet.RemoveWallets(currencies)) } private fun isNeedToDerive(scanResponse: ScanResponse, currency: Currency): Boolean { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index 836d287739..8843a8eb40 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -11,7 +11,6 @@ import com.tangem.common.card.Card import com.tangem.tap.common.entities.FiatCurrency import com.tangem.tap.common.redux.ErrorAction import com.tangem.tap.common.redux.NotificationAction -import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.domain.TapError import com.tangem.tap.domain.configurable.warningMessage.WarningMessage import com.tangem.tap.domain.tokens.models.BlockchainNetwork @@ -76,16 +75,14 @@ sealed class WalletAction : Action { data class TokenLoaded( val amount: Amount, val token: Token, - val blockchain: BlockchainNetwork + val blockchain: BlockchainNetwork, ) : MultiWallet() data class SelectWallet(val walletData: WalletData?) : MultiWallet() data class TryToRemoveWallet(val currency: Currency) : MultiWallet() - data class RemoveWallet( - val currency: Currency, - val fromScreen: AppScreen, - ) : MultiWallet() + data class RemoveWallet(val currency: Currency) : MultiWallet() + data class RemoveWallets(val currencies: List) : MultiWallet() data class SetPrimaryBlockchain(val blockchain: Blockchain) : MultiWallet() data class SetPrimaryToken(val token: Token) : MultiWallet() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index ba68023190..0fd28eaa82 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -7,6 +7,7 @@ import com.tangem.common.extensions.guard import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchErrorNotification +import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.safeUpdate import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.global.GlobalState @@ -109,12 +110,7 @@ class MultiWalletMiddleware { WalletDialog.RemoveWalletDialog( currencyTitle = currency.currencyName, onOk = { - store.dispatch( - WalletAction.MultiWallet.RemoveWallet( - currency = currency, - fromScreen = AppScreen.WalletDetails, - ), - ) + store.dispatch(WalletAction.MultiWallet.RemoveWallet(currency)) store.dispatch(NavigationAction.PopBackTo()) }, ), @@ -135,10 +131,17 @@ class MultiWalletMiddleware { .filter { it.blockchain == currency.blockchain && it.derivationPath == currency.derivationPath } } scope.launch { userTokensRepository.saveUserTokens(card, currencies) } - - if (action.fromScreen == AppScreen.AddTokens) { - store.dispatch(WalletAction.MultiWallet.SelectWallet(null)) + } + is WalletAction.MultiWallet.RemoveWallets -> { + val card = globalState.scanResponse?.card.guard { + store.dispatchErrorNotification(TapError.UnsupportedState("card is NULL")) + store.dispatch(NavigationAction.PopBackTo(AppScreen.Home)) + return } + var currencies = walletState?.currencies ?: emptyList() + currencies = currencies.filterNot { action.currencies.contains(it) } + scope.launch { userTokensRepository.saveUserTokens(card, currencies) } + store.dispatchOnMain(WalletAction.MultiWallet.SelectWallet(null)) } is WalletAction.MultiWallet.ShowWalletBackupWarning -> Unit is WalletAction.MultiWallet.BackupWallet -> { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt index 892b5db149..b75ed1ff6c 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/MultiWalletReducer.kt @@ -160,6 +160,11 @@ class MultiWalletReducer { is WalletAction.MultiWallet.RemoveWallet -> { state.removeWallet(state.getWalletData(action.currency)) } + is WalletAction.MultiWallet.RemoveWallets -> { + var updatedState = state + action.currencies.forEach { updatedState = updatedState.removeWallet(state.getWalletData(it)) } + updatedState + } is WalletAction.MultiWallet.SetPrimaryBlockchain -> state.copy(primaryBlockchain = action.blockchain) From f6e285825dd8f126b2a326f5cbff93435cae582d Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 13:26:10 +0400 Subject: [PATCH 06/25] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/features/home/HomeFragment.kt | 3 +++ .../java/com/tangem/tap/features/home/redux/HomeMiddleware.kt | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt index 839c7a3828..1d5243d02b 100644 --- a/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/home/HomeFragment.kt @@ -16,6 +16,7 @@ import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.home.compose.StoriesScreen import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.home.redux.HomeState +import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction import com.tangem.tap.features.tokens.redux.TokensAction import com.tangem.tap.store import org.rekotlin.StoreSubscriber @@ -37,6 +38,8 @@ class HomeFragment : Fragment(), StoreSubscriber { ): View? { val context = container?.context ?: return null + store.dispatch(BackupAction.CheckForUnfinishedBackup) + composeView = ComposeView(context).apply { setContent { AppCompatTheme { diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 4a10d18d51..75ce02a22a 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -35,7 +35,6 @@ import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.features.onboarding.OnboardingSaltPayHelper import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep -import com.tangem.tap.features.onboarding.products.wallet.redux.BackupAction import com.tangem.tap.features.onboarding.products.wallet.saltPay.SaltPayExceptionHandler import com.tangem.tap.features.onboarding.products.wallet.saltPay.redux.OnboardingSaltPayAction import com.tangem.tap.features.onboarding.products.wallet.saltPay.redux.OnboardingSaltPayState @@ -73,7 +72,6 @@ private fun handleHomeAction(appState: () -> AppState?, action: Action, dispatch store.dispatch(GlobalAction.RestoreAppCurrency) store.dispatch(GlobalAction.ExchangeManager.Init) store.dispatch(GlobalAction.FetchUserCountry) - store.dispatch(BackupAction.CheckForUnfinishedBackup) } is HomeAction.ShouldScanCardOnResume -> { if (action.shouldScanCard) { @@ -107,7 +105,7 @@ private fun handleHomeAction(appState: () -> AppState?, action: Action, dispatch RUSSIA_COUNTRY_CODE, BELARUS_COUNTRY_CODE -> store.dispatchOpenUrl(BUY_WALLET_URL) else -> store.dispatch(NavigationAction.NavigateTo(AppScreen.Shop)) } - store.state.globalState.analyticsHandler?.handleAnalyticsEvent( + store.state.globalState.analyticsHandler.handleAnalyticsEvent( event = AnalyticsEventAnOld.GET_CARD, params = mapOf(AnalyticsParamAnOld.SOURCE.param to GetCardSourceParamsAnOld.WELCOME.param), ) From ff01349bc82795ba4a279ee4788c7d15b168cafa Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 16:03:53 +0400 Subject: [PATCH 07/25] Updated on 2026-08-14 --- .../tap/features/wallet/ui/images/CurrencyIconRequest.kt | 3 ++- .../tangem/tap/features/wallet/ui/images/CurrencyIconView.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt index 62f015909c..729bfe3fcc 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconRequest.kt @@ -24,6 +24,7 @@ class CurrencyIconRequest( private val currencyTextView: TextView?, private val token: Token?, private val blockchain: Blockchain, + private val getLocalImage: Boolean = false, ) { fun load() { when { @@ -84,7 +85,7 @@ class CurrencyIconRequest( crossinline onError: (Blockchain) -> Unit = {}, ) { currencyImageView.loadIcon( - data = getIconUrl(blockchain.toNetworkId()), + data = if (getLocalImage) blockchain.getRoundIconRes() else getIconUrl(blockchain.toNetworkId()), placeholderRes = blockchain.getRoundIconRes(), onStart = { onStart(blockchain) }, onSuccess = { onSuccess(blockchain) }, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt index 8bf8cebcf1..cd5241fb86 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/images/CurrencyIconView.kt @@ -68,6 +68,7 @@ fun CurrencyIconView.load( currencyTextView = null, token = null, blockchain = currency.blockchain, + getLocalImage = true, ).load() } } \ No newline at end of file From 09515b6f76cbb07cb550c93afbc73e320bdd1199 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Nov 2022 16:59:18 +0400 Subject: [PATCH 08/25] Updated on 2026-08-14 --- .../com/tangem/tap/domain/extensions/Card.kt | 17 +++++++++ .../tap/domain/tokens/UserTokensRepository.kt | 35 +++++-------------- .../details/redux/DetailsMiddleware.kt | 21 +++++++++-- .../saltPay/SaltPayActivationManager.kt | 2 +- app/src/main/res/values-de/strings_final.xml | 1 + app/src/main/res/values-fr/strings_final.xml | 1 + app/src/main/res/values-it/strings_final.xml | 1 + app/src/main/res/values-ru/strings_final.xml | 1 + app/src/main/res/values/strings_final.xml | 1 + 9 files changed, 49 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt index 5bd5575906..ab2ba5610b 100644 --- a/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt +++ b/app/src/main/java/com/tangem/tap/domain/extensions/Card.kt @@ -4,12 +4,14 @@ import com.tangem.common.card.Card import com.tangem.common.card.CardWallet import com.tangem.common.card.EllipticCurve import com.tangem.common.card.FirmwareVersion +import com.tangem.common.extensions.calculateSha256 import com.tangem.common.extensions.toHexString import com.tangem.common.services.Result import com.tangem.domain.common.TapWorkarounds.isSaltPay import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.TapWorkarounds.isTangemNote import com.tangem.domain.common.TwinCardNumber +import com.tangem.domain.common.extensions.calculateHmacSha256 import com.tangem.domain.common.getTwinCardNumber import com.tangem.domain.common.isTangemTwin import com.tangem.operations.attestation.CardVerifyAndGetInfo @@ -88,4 +90,19 @@ fun Card.getArtworkUrl(artworkId: String?): String? { cardId.startsWith(Artwork.MARTA_CARD_ID) -> Artwork.MARTA_CARD_URL else -> null } +} + +fun Card.getUserWalletId(): String { + val walletPublicKey = this.wallets.firstOrNull()?.publicKey ?: return "" + return UserWalletId(walletPublicKey).stringValue +} + +class UserWalletId(val walletPublicKey: ByteArray) { + val stringValue: String = calculateUserId(walletPublicKey) + + private fun calculateUserId(walletPublicKey: ByteArray): String { + val message = "UserWalletID".toByteArray() + val keyHash = walletPublicKey.calculateSha256() + return message.calculateHmacSha256(keyHash).toHexString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt index 34330160a0..40b8389049 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/UserTokensRepository.kt @@ -3,14 +3,12 @@ package com.tangem.tap.domain.tokens import android.content.Context import com.tangem.blockchain.common.DerivationStyle import com.tangem.common.card.Card -import com.tangem.common.extensions.calculateSha256 -import com.tangem.common.extensions.toHexString import com.tangem.common.services.Result -import com.tangem.domain.common.extensions.calculateHmacSha256 import com.tangem.network.api.tangemTech.TangemTechService import com.tangem.network.api.tangemTech.UserTokensResponse import com.tangem.tap.common.AndroidFileReader import com.tangem.tap.domain.NoDataError +import com.tangem.tap.domain.extensions.getUserWalletId import com.tangem.tap.domain.tokens.models.BlockchainNetwork import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.wallet.models.Currency @@ -26,7 +24,7 @@ class UserTokensRepository( private val networkService: UserTokensNetworkService, ) { suspend fun getUserTokens(card: Card): List { - val userId = card.getUserId() + val userId = card.getUserWalletId() if (DemoHelper.isDemoCardId(card.cardId)) { return loadTokensOffline(card, userId).ifEmpty { loadDemoCurrencies() } } @@ -38,7 +36,7 @@ class UserTokensRepository( return when (val networkResult = networkService.getUserTokens(userId)) { is Result.Success -> { val tokens = networkResult.data.tokens.mapNotNull { Currency.fromTokenResponse(it) } - storageService.saveUserTokens(card.getUserId(), tokens.toUserTokensResponse()) + storageService.saveUserTokens(card.getUserWalletId(), tokens.toUserTokensResponse()) tokens.distinct() } is Result.Failure -> { @@ -49,14 +47,14 @@ class UserTokensRepository( suspend fun saveUserTokens(card: Card, tokens: List) { val userTokens = tokens.toUserTokensResponse() - networkService.saveUserTokens(card.getUserId(), userTokens) - storageService.saveUserTokens(card.getUserId(), userTokens) + networkService.saveUserTokens(card.getUserWalletId(), userTokens) + storageService.saveUserTokens(card.getUserWalletId(), userTokens) } suspend fun removeUserTokens(card: Card) { val userTokens = emptyList().toUserTokensResponse() - networkService.saveUserTokens(card.getUserId(), userTokens) - storageService.saveUserTokens(card.getUserId(), userTokens) + networkService.saveUserTokens(card.getUserWalletId(), userTokens) + storageService.saveUserTokens(card.getUserWalletId(), userTokens) } private fun List.toUserTokensResponse(): UserTokensResponse { @@ -69,7 +67,7 @@ class UserTokensRepository( } suspend fun loadBlockchainsToDerive(card: Card): List { - val userId = card.getUserId() + val userId = card.getUserWalletId() val blockchainNetworks = loadTokensOffline(card, userId).toBlockchainNetworks() if (DemoHelper.isDemoCardId(card.cardId)) { @@ -113,11 +111,6 @@ class UserTokensRepository( return storageService.getUserTokens(userId) ?: storageService.getUserTokens(card) } - private fun Card.getUserId(): String { - val walletPublicKey = this.wallets.firstOrNull()?.publicKey ?: return "" - return UserWalletId(walletPublicKey).stringValue - } - companion object { const val SORT_DEFAULT_VALUE = "manual" const val GROUP_DEFAULT_VALUE = "none" @@ -131,16 +124,4 @@ class UserTokensRepository( return UserTokensRepository(storageService, networkService) } } -} - -data class UserWalletId( - val walletPublicKey: ByteArray, -) { - val stringValue: String = calculateUserId(walletPublicKey) - - private fun calculateUserId(walletPublicKey: ByteArray): String { - val message = "UserWalletID".toByteArray() - val keyHash = walletPublicKey.calculateSha256() - return message.calculateHmacSha256(keyHash).toHexString() - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 309c2900d3..3595380cb6 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -5,12 +5,15 @@ import com.tangem.common.core.TangemSdkError import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.tap.common.analytics.AnalyticsAnOld import com.tangem.tap.common.analytics.AnalyticsParamAnOld +import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchNotification import com.tangem.tap.common.extensions.dispatchOnMain +import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction +import com.tangem.tap.domain.extensions.getUserWalletId import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletMode import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction @@ -18,6 +21,7 @@ import com.tangem.tap.features.wallet.models.hasSendableAmountsOrPendingTransact import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager +import com.tangem.wallet.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -78,7 +82,18 @@ class DetailsMiddleware { when (val result = tangemSdkManager.scanCard()) { is CompletionResult.Success -> { val card = result.data - store.dispatchOnMain(DetailsAction.PrepareCardSettingsData(card)) + if (card.getUserWalletId() == + store.state.globalState.scanResponse?.card?.getUserWalletId() + ) { + store.dispatchOnMain(DetailsAction.PrepareCardSettingsData(card)) + } else { + store.dispatchDialogShow( + AppDialog.SimpleOkDialogRes( + headerId = R.string.common_warning, + messageId = R.string.error_wrong_wallet_tapped, + ), + ) + } } is CompletionResult.Failure -> { } @@ -110,7 +125,7 @@ class DetailsMiddleware { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.PurgeWallet, card = store.state.detailsState.scanResponse?.card, @@ -154,7 +169,7 @@ class DetailsMiddleware { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error = error, action = AnalyticsAnOld.ActionToLog.ChangeSecOptions, params = mapOf( diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt index f62baf1b51..4ef4b407d2 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayActivationManager.kt @@ -20,8 +20,8 @@ import com.tangem.network.api.paymentology.RegistrationResponse import com.tangem.network.api.paymentology.tryExtractError import com.tangem.operations.attestation.AttestWalletKeyResponse import com.tangem.tap.common.extensions.safeUpdate +import com.tangem.tap.domain.extensions.UserWalletId import com.tangem.tap.domain.getFirstToken -import com.tangem.tap.domain.tokens.UserWalletId import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPayActivationError import java.math.BigDecimal diff --git a/app/src/main/res/values-de/strings_final.xml b/app/src/main/res/values-de/strings_final.xml index 384c389dbe..b7e64d53df 100644 --- a/app/src/main/res/values-de/strings_final.xml +++ b/app/src/main/res/values-de/strings_final.xml @@ -153,4 +153,5 @@ Please check you email for further instructions Do you want to exit the activation process? In this case, you will need to start from the beginning. + You have used a card from another wallet. Tap the card associated with this wallet \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings_final.xml b/app/src/main/res/values-fr/strings_final.xml index 384c389dbe..b7e64d53df 100644 --- a/app/src/main/res/values-fr/strings_final.xml +++ b/app/src/main/res/values-fr/strings_final.xml @@ -153,4 +153,5 @@ Please check you email for further instructions Do you want to exit the activation process? In this case, you will need to start from the beginning. + You have used a card from another wallet. Tap the card associated with this wallet \ No newline at end of file diff --git a/app/src/main/res/values-it/strings_final.xml b/app/src/main/res/values-it/strings_final.xml index 384c389dbe..b7e64d53df 100644 --- a/app/src/main/res/values-it/strings_final.xml +++ b/app/src/main/res/values-it/strings_final.xml @@ -153,4 +153,5 @@ Please check you email for further instructions Do you want to exit the activation process? In this case, you will need to start from the beginning. + You have used a card from another wallet. Tap the card associated with this wallet \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings_final.xml b/app/src/main/res/values-ru/strings_final.xml index bcf57b6db6..fe86cb0019 100644 --- a/app/src/main/res/values-ru/strings_final.xml +++ b/app/src/main/res/values-ru/strings_final.xml @@ -151,4 +151,5 @@ Более подробная информация отправлена на ваш адрес электронной почты. Вы хотите выйти из процесса активации? В этом случае вам будет необходимо начать процесс заново. + Вы использовали карту от другого кошелька. Приложите карту, связанную с этим кошельком. diff --git a/app/src/main/res/values/strings_final.xml b/app/src/main/res/values/strings_final.xml index 76dc5aa8dc..f5e11c6885 100644 --- a/app/src/main/res/values/strings_final.xml +++ b/app/src/main/res/values/strings_final.xml @@ -153,4 +153,5 @@ Please check you email for further instructions Do you want to exit the activation process? In this case, you will need to start from the beginning. + You have used a card from another wallet. Tap the card associated with this wallet From ca80c281ece9b08cd139e9eef4d70d6ad2a5ee88 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 3 Nov 2022 10:58:02 +0400 Subject: [PATCH 09/25] Updated on 2026-08-14 --- .../features/wallet/redux/middlewares/MultiWalletMiddleware.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 0fd28eaa82..b457d7e622 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -7,7 +7,6 @@ import com.tangem.common.extensions.guard import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchErrorNotification -import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.safeUpdate import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.common.redux.global.GlobalState @@ -141,7 +140,7 @@ class MultiWalletMiddleware { var currencies = walletState?.currencies ?: emptyList() currencies = currencies.filterNot { action.currencies.contains(it) } scope.launch { userTokensRepository.saveUserTokens(card, currencies) } - store.dispatchOnMain(WalletAction.MultiWallet.SelectWallet(null)) + store.dispatch(WalletAction.MultiWallet.SelectWallet(null)) } is WalletAction.MultiWallet.ShowWalletBackupWarning -> Unit is WalletAction.MultiWallet.BackupWallet -> { From 29d2d89fbaa0dedb78fa02c8ab1513204cd0c8f3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 3 Nov 2022 21:51:40 +0400 Subject: [PATCH 10/25] Updated on 2026-08-14 --- .../features/tokens/redux/TokensMiddleware.kt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt index fe47a2b2bf..04eb4ac5b0 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensMiddleware.kt @@ -10,7 +10,6 @@ import com.tangem.common.extensions.toMapKey import com.tangem.common.hdWallet.DerivationPath import com.tangem.common.services.Result import com.tangem.domain.DomainWrapped -import com.tangem.domain.common.KeyWalletPublicKey import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.TapWorkarounds.derivationStyle import com.tangem.domain.common.TapWorkarounds.isTestCard @@ -205,19 +204,17 @@ class TokensMiddleware { when (result) { is CompletionResult.Success -> { val newDerivedKeys = result.data.entries - val updatedDerivedKeys = - mutableMapOf() + val oldDerivedKeys = scanResponse.derivedKeys - newDerivedKeys.forEach { entry -> - val derivationData = derivationDataList.find { - it.mapKeyOfWalletPublicKey == entry.key - } ?: return@forEach - updatedDerivedKeys[entry.key] = - ExtendedPublicKeysMap(derivationData.alreadyDerivedKeys + entry.value) + val walletKeys = (newDerivedKeys.keys + oldDerivedKeys.keys).toSet() + + val updatedDerivedKeys = walletKeys.associateWith { walletKey -> + val oldDerivations = ExtendedPublicKeysMap(oldDerivedKeys[walletKey] ?: emptyMap()) + val newDerivations = newDerivedKeys[walletKey] ?: ExtendedPublicKeysMap(emptyMap()) + ExtendedPublicKeysMap(oldDerivations + newDerivations) } - val updatedScanResponse = scanResponse.copy( - derivedKeys = updatedDerivedKeys + derivedKeys = updatedDerivedKeys, ) store.dispatchOnMain(GlobalAction.SaveScanNoteResponse(updatedScanResponse)) delay(DELAY_SDK_DIALOG_CLOSE) From b6750824fa291d495fa269f70badcfd4b9526c98 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 3 Nov 2022 21:56:26 +0400 Subject: [PATCH 11/25] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index a7b0e1623d..30e111bd27 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-130', + tangem_blockchain_sdk: 'develop-132', // tangem_blockchain_sdk: '0.0.1', ] From 4e4b90c2a670fbcdac6e0d5b20adc9fca89cabe9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 7 Nov 2022 19:30:35 +0500 Subject: [PATCH 12/25] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- app/src/main/java/com/tangem/tap/MainActivity.kt | 2 +- .../tap/common/redux/navigation/NavigationAction.kt | 8 ++++---- .../tap/common/redux/navigation/NavigationReducer.kt | 9 ++++++++- .../tap/common/redux/navigation/NavigationState.kt | 4 ++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index a1658496e7..cf6ea50867 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit a1658496e777b611fc990ef2bc1a1a1fd48bc1e6 +Subproject commit cf6ea50867477f97655da9da47ff94987e8f3354 diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index a94cf067f5..e557e59247 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -132,7 +132,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac } override fun onDestroy() { - store.dispatch(NavigationAction.ActivityDestroyed) + store.dispatch(NavigationAction.ActivityDestroyed(WeakReference(this))) super.onDestroy() } diff --git a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationAction.kt b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationAction.kt index 0579c7f651..e397d78d8a 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationAction.kt @@ -1,7 +1,7 @@ package com.tangem.tap.common.redux.navigation import android.net.Uri -import androidx.fragment.app.FragmentActivity +import androidx.appcompat.app.AppCompatActivity import org.rekotlin.Action import java.lang.ref.WeakReference @@ -9,7 +9,7 @@ sealed class NavigationAction : Action { data class NavigateTo( val screen: AppScreen, val fragmentShareTransition: FragmentShareTransition? = null, - val addToBackstack: Boolean = true + val addToBackstack: Boolean = true, ) : NavigationAction() data class PopBackTo(val screen: AppScreen? = null) : NavigationAction() @@ -20,6 +20,6 @@ sealed class NavigationAction : Action { data class Share(val data: String) : NavigationAction() - data class ActivityCreated(val activity: WeakReference) : NavigationAction() - object ActivityDestroyed : NavigationAction() + data class ActivityCreated(val activity: WeakReference) : NavigationAction() + data class ActivityDestroyed(val activity: WeakReference) : NavigationAction() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt index e742aa2e6b..7d63cb95ee 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationReducer.kt @@ -25,7 +25,14 @@ private fun internalReduce(action: Action, state: AppState): NavigationState { state.navigationState.copy(backStack = navState.backStack.subList(0, index)) } is NavigationAction.ActivityCreated -> navState.copy(activity = navigationAction.activity) - is NavigationAction.ActivityDestroyed -> navState.copy(activity = null) + is NavigationAction.ActivityDestroyed -> { + when { + // Destroy the activity if it invoked for the same activity. Prevents overwriting to null if there is a + // new scan from the background [REDACTED_TASK_KEY] + navState.activity?.get() == navigationAction.activity.get() -> navState.copy(activity = null) + else -> navState + } + } else -> navState } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt index 9c6468c049..224e12755b 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt @@ -1,12 +1,12 @@ package com.tangem.tap.common.redux.navigation -import androidx.fragment.app.FragmentActivity +import androidx.appcompat.app.AppCompatActivity import org.rekotlin.StateType import java.lang.ref.WeakReference data class NavigationState( val backStack: List = listOf(AppScreen.Home), - val activity: WeakReference? = null + val activity: WeakReference? = null, ) : StateType enum class AppScreen { From b128907197b3359470bcb69b5e6e1b40984eeeb6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 7 Nov 2022 20:25:35 +0500 Subject: [PATCH 13/25] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- .../send/redux/reducers/FeeReducer.kt | 8 +++++-- .../features/send/redux/states/FeeState.kt | 2 ++ .../stateSubscribers/SendStateSubscriber.kt | 24 +++++++++++++++---- .../main/res/layout/layout_send_receipt.xml | 22 +++++++++++++---- 5 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index a1658496e7..cf6ea50867 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit a1658496e777b611fc990ef2bc1a1a1fd48bc1e6 +Subproject commit cf6ea50867477f97655da9da47ff94987e8f3354 diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt index 9965636a49..3238c3b372 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/FeeReducer.kt @@ -7,6 +7,7 @@ import com.tangem.tap.features.send.redux.SendScreenAction import com.tangem.tap.features.send.redux.states.FeeState import com.tangem.tap.features.send.redux.states.FeeType import com.tangem.tap.features.send.redux.states.SendState +import com.tangem.tap.features.wallet.redux.ProgressState /** [REDACTED_AUTHOR] @@ -36,7 +37,7 @@ class FeeReducer : SendInternalReducer { private fun handleAction(action: FeeAction, sendState: SendState, state: FeeState): SendState { val result = when (action) { is FeeAction.RequestFee -> { - state + state.copy(progressState = ProgressState.Loading) } is FeeAction.ChangeLayoutVisibility -> { fun getVisibility(current: Boolean, proposed: Boolean?): Boolean = proposed ?: current @@ -68,12 +69,15 @@ class FeeReducer : SendInternalReducer { currentFee = currentFee, feeIsApproximate = isFeeApproximate(sendState), ) - } + }.copy( + progressState = ProgressState.Done, + ) } FeeAction.FeeCalculation.ClearResult -> { state.copy( feeList = null, currentFee = null, + progressState = ProgressState.Done, ) } } diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt index d9b8798a1e..79b199a5e8 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/FeeState.kt @@ -1,6 +1,7 @@ package com.tangem.tap.features.send.redux.states import com.tangem.blockchain.common.Amount +import com.tangem.tap.features.wallet.redux.ProgressState import java.math.BigDecimal /** @@ -20,6 +21,7 @@ data class FeeState( val controlsLayoutIsVisible: Boolean = false, val feeChipGroupIsVisible: Boolean = true, val includeFeeSwitcherIsEnabled: Boolean = true, + val progressState: ProgressState = ProgressState.Done ) : SendScreenState { override val stateId: StateId = StateId.FEE 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 fe3bee237d..4d6d80e6ce 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 @@ -11,6 +11,7 @@ import com.tangem.tap.common.extensions.beginDelayedTransition import com.tangem.tap.common.extensions.enableError import com.tangem.tap.common.extensions.getColor import com.tangem.tap.common.extensions.getString +import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.show import com.tangem.tap.common.extensions.update import com.tangem.tap.common.redux.getMessageString @@ -35,6 +36,7 @@ import com.tangem.tap.features.send.ui.SendFragment import com.tangem.tap.features.send.ui.dialogs.RequestFeeErrorDialog import com.tangem.tap.features.send.ui.dialogs.SendTransactionFailsDialog import com.tangem.tap.features.send.ui.dialogs.TezosWarningDialog +import com.tangem.tap.features.wallet.redux.ProgressState import com.tangem.tap.features.wallet.redux.WalletState.Companion.ROUGH_SIGN import com.tangem.tap.features.wallet.redux.WalletState.Companion.UNKNOWN_AMOUNT_SIGN import com.tangem.tap.features.wallet.ui.adapters.WarningMessagesAdapter @@ -62,7 +64,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : StateId.TRANSACTION_EXTRAS -> handleTransactionExtrasState(fg, state.transactionExtrasState) StateId.AMOUNT -> handleAmountState(fg, state.amountState) StateId.FEE -> handleFeeState(fg, state.feeState) - StateId.RECEIPT -> handleReceiptState(fg, state.receiptState) + StateId.RECEIPT -> handleReceiptState(fg, state.receiptState, state.feeState.progressState) } } } @@ -263,7 +265,11 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : if (chipGroup.checkedChipId != chipId && chipId != View.NO_ID) chipGroup.check(chipId) } - private fun handleReceiptState(fg: SendFragment, state: ReceiptState) = with(fg.binding.clReceiptContainer) { + private fun handleReceiptState( + fg: SendFragment, + state: ReceiptState, + feeProgressState: ProgressState, + ) = with(fg.binding.clReceiptContainer) { val mainLayout = clReceiptContainer as ViewGroup val totalLayout = llTotalContainer.llTotal as ViewGroup val totalTokenLayout = llTotalContainer.flTotalTokenCrypto as ViewGroup @@ -274,11 +280,22 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : return if (value == UNKNOWN_AMOUNT_SIGN) value else "$ROUGH_SIGN $value" } + when (feeProgressState) { + ProgressState.Loading -> { + tvReceiptFeeValue.hide() + pbReceiptFee.show() + } + ProgressState.Done -> { + pbReceiptFee.hide() + tvReceiptFeeValue.show() + } + } + + when (state.visibleTypeOfReceipt) { ReceiptLayoutType.FIAT -> { val receipt = state.fiat ?: return - llTotalContainer.tvTotalValue totalLayout.show(true) totalTokenLayout.show(false) tvReceiptAmountValue.update("${receipt.amountFiat} ${receipt.symbols.fiat}") @@ -290,7 +307,6 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : receipt.willSentCrypto, receipt.symbols.crypto, ) llTotalContainer.tvWillBeSentValue.update(willSent) - } ReceiptLayoutType.CRYPTO -> { val receipt = state.crypto ?: return diff --git a/app/src/main/res/layout/layout_send_receipt.xml b/app/src/main/res/layout/layout_send_receipt.xml index 7309706654..2cf18b1ed5 100644 --- a/app/src/main/res/layout/layout_send_receipt.xml +++ b/app/src/main/res/layout/layout_send_receipt.xml @@ -22,10 +22,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" android:textAllCaps="true" android:textStyle="bold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" tools:text="75.00 usd" /> + + + Date: Tue, 8 Nov 2022 14:35:19 +0400 Subject: [PATCH 14/25] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/common/DialogManager.kt | 2 +- .../products/note/redux/OnboardingNoteMiddleware.kt | 7 +++++++ .../tangem/tap/features/wallet/redux/WalletAction.kt | 2 +- .../redux/middlewares/TradeCryptoMiddleware.kt | 2 +- .../redux/middlewares/WalletDialogsMiddleware.kt | 2 +- .../tap/features/wallet/redux/models/WalletDialog.kt | 2 +- .../RussianCardholdersWarningBottomSheetDialog.kt | 12 ++++++++++-- 7 files changed, 22 insertions(+), 7 deletions(-) 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 5ae8d9ce04..a1739329b5 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -153,7 +153,7 @@ class DialogManager : StoreSubscriber { primaryButtonAction = state.dialog.onOk, ) is WalletDialog.RussianCardholdersWarningDialog -> - RussianCardholdersWarningBottomSheetDialog(context) + RussianCardholdersWarningBottomSheetDialog(context, state.dialog.topUpUrl) else -> null } dialog?.show() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt index d990941bd5..abe0536c76 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt @@ -6,6 +6,7 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchErrorNotification +import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.extensions.getAddressData import com.tangem.tap.common.extensions.getToUpUrl @@ -20,8 +21,10 @@ import com.tangem.tap.domain.TapError import com.tangem.tap.domain.extensions.hasWallets import com.tangem.tap.domain.extensions.makePrimaryWalletManager import com.tangem.tap.features.demo.DemoHelper +import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.redux.ProgressState +import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager @@ -152,6 +155,10 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch } is OnboardingNoteAction.TopUp -> { val topUpUrl = noteState.walletManager?.getToUpUrl() ?: return + if (globalState.userCountryCode == RUSSIA_COUNTRY_CODE) { + store.dispatchOnMain(WalletAction.DialogAction.RussianCardholdersWarningDialog(topUpUrl)) + return + } store.dispatchOpenUrl(topUpUrl) } OnboardingNoteAction.Done -> { diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt index 8843a8eb40..b9451b117a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/WalletAction.kt @@ -154,7 +154,7 @@ sealed class WalletAction : Action { object SignedHashesMultiWalletDialog : DialogAction() object ChooseTradeActionDialog : DialogAction() data class ChooseCurrency(val amounts: List?) : DialogAction() - object RussianCardholdersWarningDialog : DialogAction() + data class RussianCardholdersWarningDialog(val topUpUrl: String? = null) : DialogAction() object Hide : DialogAction() } 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 319c940a52..f5040c42f4 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 @@ -37,7 +37,7 @@ class TradeCryptoMiddleware { action: WalletAction.TradeCryptoAction.Buy, ) { if (action.checkUserLocation && state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE) { - store.dispatchOnMain(WalletAction.DialogAction.RussianCardholdersWarningDialog) + store.dispatchOnMain(WalletAction.DialogAction.RussianCardholdersWarningDialog()) return } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt index d53809be9c..5191319318 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletDialogsMiddleware.kt @@ -32,7 +32,7 @@ class WalletDialogsMiddleware { ) } is WalletAction.DialogAction.RussianCardholdersWarningDialog -> { - store.dispatchDialogShow(WalletDialog.RussianCardholdersWarningDialog) + store.dispatchDialogShow(WalletDialog.RussianCardholdersWarningDialog(action.topUpUrl)) } is WalletAction.DialogAction.Hide -> { store.dispatchDialogHide() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt index 68718acd45..b4188f8dd8 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/models/WalletDialog.kt @@ -31,5 +31,5 @@ sealed interface WalletDialog : StateDialog { val titleRes: Int = R.string.token_details_unable_hide_alert_title } - object RussianCardholdersWarningDialog : WalletDialog + data class RussianCardholdersWarningDialog(val topUpUrl: String?) : WalletDialog } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt index a41dce9228..b634f76c68 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/dialogs/RussianCardholdersWarningBottomSheetDialog.kt @@ -5,12 +5,16 @@ import android.os.Bundle import android.view.LayoutInflater import com.google.android.material.bottomsheet.BottomSheetDialog import com.tangem.tap.common.extensions.dispatchDialogHide +import com.tangem.tap.common.extensions.dispatchOpenUrl import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.store import com.tangem.wallet.databinding.DialogRussiansCardholdersWarningBinding -class RussianCardholdersWarningBottomSheetDialog(context: Context) : BottomSheetDialog(context) { +class RussianCardholdersWarningBottomSheetDialog( + context: Context, private val topUpUrl: String?, +) : BottomSheetDialog + (context) { private var binding: DialogRussiansCardholdersWarningBinding? = null @@ -29,7 +33,11 @@ class RussianCardholdersWarningBottomSheetDialog(context: Context) : BottomSheet } binding?.btnYes?.setOnClickListener { - store.dispatch(WalletAction.TradeCryptoAction.Buy(checkUserLocation = false)) + if (topUpUrl != null) { + store.dispatchOpenUrl(topUpUrl) + } else { + store.dispatch(WalletAction.TradeCryptoAction.Buy(checkUserLocation = false)) + } dismiss() } binding?.btnNo?.setOnClickListener { From 74101247529fd1b0e96e51340ccfe19ec8d2962b Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 14:36:02 +0400 Subject: [PATCH 15/25] Updated on 2026-08-14 --- .../tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt index 9f2f76e6fd..79e84eec36 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/reducers/OnWalletLoadedReducer.kt @@ -88,7 +88,7 @@ class OnWalletLoadedReducer { val tokenFiatAmountFormatted = tokenFiatAmount?.toFormattedFiatValue(fiatCurrency.symbol) ?: UNKNOWN_AMOUNT_SIGN - val isTokenSendButtonEnabled = newWalletData.shouldEnableTokenSendButton() + val isTokenSendButtonEnabled = tokenWalletData?.shouldEnableTokenSendButton() == true && pendingTransactions.isEmpty() tokenWalletData?.copy( currencyData = tokenWalletData.currencyData.copy( From 8b4a8b48c301912c0dd38da61cc944873f7c8a7d Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 14:38:05 +0400 Subject: [PATCH 16/25] Updated on 2026-08-14 --- .../walletconnect/WalletConnectManager.kt | 53 ++++++++++--------- .../walletconnect/WalletConnectSdkHelper.kt | 36 ++++++------- 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt index 6bd6cddada..f95b187f09 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect/WalletConnectManager.kt @@ -44,6 +44,8 @@ import kotlin.collections.set class WalletConnectManager { + private var cardId: String? = null + private val okHttpClient: OkHttpClient by lazy { OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) @@ -138,6 +140,7 @@ class WalletConnectManager { fun restoreSessions(scanResponse: ScanResponse) { val walletPublicKey = scanResponse.card.wallets.firstOrNull { it.curve == EllipticCurve.Secp256k1 }?.publicKey ?: return + if (scanResponse.card.backupStatus?.isActive != true) cardId = scanResponse.card.cardId val sessions = walletConnectRepository.loadSavedSessions() // filter sessions for this particular card .filter { it.wallet.walletPublicKey.contentEquals(walletPublicKey) } @@ -223,10 +226,10 @@ class WalletConnectManager { } private fun onSessionClosed(session: WCSession) { - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Session( - AnalyticsAnOld.WcSessionEvent.Disconnect, sessions[session]?.peerMeta?.url - ) + AnalyticsAnOld.WcSessionEvent.Disconnect, sessions[session]?.peerMeta?.url, + ), ) sessions.remove(session) walletConnectRepository.removeSession(session) @@ -272,13 +275,13 @@ class WalletConnectManager { val activeData = sessions[session] val data = activeData?.transactionData ?: return scope.launch { - val hash = WalletConnectSdkHelper().completeTransaction(data).guard { + val hash = WalletConnectSdkHelper().completeTransaction(data, cardId).guard { sessions[data.session.session] = activeData.copy(transactionData = null) store.dispatchOnMain( WalletConnectAction.RejectRequest( data.session.session, - data.id - ) + data.id, + ), ) return@launch } @@ -292,12 +295,12 @@ class WalletConnectManager { ) { val activeData = sessions[sessionData] ?: return scope.launch { - val hash = WalletConnectSdkHelper().signBnbTransaction(data, activeData).guard { + val hash = WalletConnectSdkHelper().signBnbTransaction(data, activeData, cardId).guard { store.dispatchOnMain( WalletConnectAction.RejectRequest( sessionData, - id - ) + id, + ), ) return@launch } @@ -330,14 +333,14 @@ class WalletConnectManager { val activeData = sessions[session] val data = activeData?.personalSignData ?: return scope.launch { - val hash = WalletConnectSdkHelper().signPersonalMessage(data.hash, activeData.wallet) + val hash = WalletConnectSdkHelper().signPersonalMessage(data.hash, activeData.wallet, cardId) .guard { sessions[data.session.session] = activeData.copy(transactionData = null) store.dispatchOnMain( WalletConnectAction.RejectRequest( data.session.session, - data.id - ) + data.id, + ), ) return@launch } @@ -372,7 +375,7 @@ class WalletConnectManager { ), ) } - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Session( AnalyticsAnOld.WcSessionEvent.Connect, peer.url, ), @@ -387,10 +390,10 @@ class WalletConnectManager { } client.onEthSendTransaction = { id: Long, transaction: WCEthereumTransaction -> Timber.d("onEthSendTransaction: $transaction") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.SendTransaction - ) + AnalyticsAnOld.WcAction.SendTransaction, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( @@ -405,10 +408,10 @@ class WalletConnectManager { } client.onEthSignTransaction = { id: Long, transaction: WCEthereumTransaction -> Timber.d("onEthSignTransaction: $transaction") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.SignTransaction - ) + AnalyticsAnOld.WcAction.SignTransaction, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( @@ -423,10 +426,10 @@ class WalletConnectManager { } client.onEthSign = { id: Long, message: WCEthereumSignMessage -> Timber.d("onEthSign: $message") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.PersonalSign - ) + AnalyticsAnOld.WcAction.PersonalSign, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( @@ -499,10 +502,10 @@ class WalletConnectManager { val message = EthSignHelper.tryToParseEthTypedMessage(request) if (message != null) { Timber.d("onEthSign_v4: $message") - store.state.globalState.analyticsHandler?.logWcEvent( + store.state.globalState.analyticsHandler.logWcEvent( AnalyticsAnOld.WcAnalyticsEvent.Action( - AnalyticsAnOld.WcAction.PersonalSign - ) + AnalyticsAnOld.WcAction.PersonalSign, + ), ) sessions[client.session]?.toWalletConnectSession()?.let { sessionData -> store.dispatchOnMain( 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 f90eb7cbb9..eccfbaefdf 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 @@ -126,24 +126,24 @@ class WalletConnectSdkHelper { ) } - suspend fun completeTransaction(data: WcTransactionData): String? { + suspend fun completeTransaction(data: WcTransactionData, cardId: String?): String? { return when (data.type) { - WcTransactionType.EthSendTransaction -> sendTransaction(data) - WcTransactionType.EthSignTransaction -> signTransaction(data) + WcTransactionType.EthSendTransaction -> sendTransaction(data, cardId) + WcTransactionType.EthSignTransaction -> signTransaction(data, cardId) } } - private suspend fun sendTransaction(data: WcTransactionData): String? { + private suspend fun sendTransaction(data: WcTransactionData, cardId: String?): String? { val result = (data.walletManager as TransactionSender).send( transactionData = data.transaction, - signer = CommonSigner(tangemSdk) + signer = CommonSigner(tangemSdk, cardId), ) return when (result) { SimpleResult.Success -> { HEX_PREFIX + data.walletManager.wallet.recentTransactions.last().hash } is SimpleResult.Failure -> { - store.state.globalState.analyticsHandler?.handleBlockchainSdkErrorEvent( + store.state.globalState.analyticsHandler.handleBlockchainSdkErrorEvent( result.error, AnalyticsAnOld.ActionToLog.WalletConnectTransaction, ) @@ -153,27 +153,27 @@ class WalletConnectSdkHelper { } } - private suspend fun signTransaction(data: WcTransactionData): String? { + private suspend fun signTransaction(data: WcTransactionData, cardId: String?): String? { val dataToSign = EthereumUtils.buildTransactionToSign( transactionData = data.transaction, nonce = null, blockchain = data.walletManager.wallet.blockchain, - gasLimit = null + gasLimit = null, ) ?: return null val command = SignHashCommand( hash = dataToSign.hash, walletPublicKey = data.walletManager.wallet.publicKey.seedKey, - derivationPath = data.walletManager.wallet.publicKey.derivationPath + derivationPath = data.walletManager.wallet.publicKey.derivationPath, ) - val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message()) + val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message(), cardId = cardId) return when (result) { is CompletionResult.Success -> { HEX_PREFIX + result.data } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.WalletConnectSign, ) @@ -184,13 +184,13 @@ class WalletConnectSdkHelper { } } - suspend fun signBnbTransaction(data: ByteArray, session: WalletConnectActiveData): String? { + suspend fun signBnbTransaction(data: ByteArray, session: WalletConnectActiveData, cardId: String?): String? { val command = SignHashCommand( hash = data, walletPublicKey = session.wallet.walletPublicKey ?: return null, - derivationPath = session.wallet.derivationPath + derivationPath = session.wallet.derivationPath, ) - val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message()) + val result = tangemSdkManager.runTaskAsync(command, initialMessage = Message(), cardId = cardId) return when (result) { is CompletionResult.Success -> { val key = session.wallet.derivedPublicKey?.toDecompressedPublicKey() @@ -202,7 +202,7 @@ class WalletConnectSdkHelper { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.WalletConnectTransaction, ) @@ -266,10 +266,10 @@ class WalletConnectSdkHelper { }.joinToString("") } - suspend fun signPersonalMessage(hashToSign: ByteArray, wallet: WalletForSession): String? { + suspend fun signPersonalMessage(hashToSign: ByteArray, wallet: WalletForSession, cardId: String?): String? { val key = wallet.derivedPublicKey ?: wallet.walletPublicKey val command = SignHashCommand(hashToSign, wallet.walletPublicKey!!, wallet.derivationPath) - return when (val result = tangemSdkManager.runTaskAsync(command)) { + return when (val result = tangemSdkManager.runTaskAsync(command, cardId)) { is CompletionResult.Success -> { val hash = result.data.signature return EthereumUtils.prepareSignedMessageData( @@ -278,7 +278,7 @@ class WalletConnectSdkHelper { } is CompletionResult.Failure -> { (result.error as? TangemSdkError)?.let { error -> - store.state.globalState.analyticsHandler?.handleCardSdkErrorEvent( + store.state.globalState.analyticsHandler.handleCardSdkErrorEvent( error, AnalyticsAnOld.ActionToLog.WalletConnectSign, ) From 34ed302ebb82efccd921bbca99ede01412376960 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 16:39:16 +0500 Subject: [PATCH 17/25] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index cf6ea50867..a1658496e7 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit cf6ea50867477f97655da9da47ff94987e8f3354 +Subproject commit a1658496e777b611fc990ef2bc1a1a1fd48bc1e6 From 47aef5b1ceb81d4fa46999e290b52cbe1492b875 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Nov 2022 17:49:16 +0400 Subject: [PATCH 18/25] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 30e111bd27..ba7e3c39b6 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-132', + tangem_blockchain_sdk: 'develop-133', // tangem_blockchain_sdk: '0.0.1', ] From fe7f1f8b5db6d2131c5382cfb5f4b6fee96b815c Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 9 Nov 2022 22:17:30 +0500 Subject: [PATCH 19/25] Updated on 2026-08-14 --- app/src/main/assets/tangem-app-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index cf6ea50867..a1658496e7 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit cf6ea50867477f97655da9da47ff94987e8f3354 +Subproject commit a1658496e777b611fc990ef2bc1a1a1fd48bc1e6 From 9087ca5f5546ee7978ea0b30d61dce34194920b2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 16 Nov 2022 11:07:20 +0400 Subject: [PATCH 20/25] Updated on 2026-08-14 --- dependencies.gradle | 2 +- .../java/com/tangem/domain/common/extensions/Blockchain.kt | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index ba7e3c39b6..2db7835bc2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-133', + tangem_blockchain_sdk: 'develop-134', // tangem_blockchain_sdk: '0.0.1', ] diff --git a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt index b11840f128..0fde777794 100644 --- a/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt +++ b/domain/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt @@ -44,8 +44,7 @@ fun Blockchain.Companion.fromNetworkId(networkId: String): Blockchain? { "polkadot" -> Blockchain.Polkadot "polkadot/test" -> Blockchain.PolkadotTestnet "kusama" -> Blockchain.Kusama - // "optimistic-ethereum" -> Blockchain.Optimism - "optimistic-ethereum" -> null //TODO: Optimism is disabled until next release + "optimistic-ethereum" -> Blockchain.Optimism "optimistic-ethereum/test" -> Blockchain.OptimismTestnet "dash" -> Blockchain.Dash "sxdai" -> Blockchain.SaltPay @@ -144,6 +143,5 @@ fun Blockchain.isSupportedInApp(): Boolean { } private val excludedBlockchains = listOf( - Blockchain.Optimism, // TODO: remove when fee calculation is fixed Blockchain.SaltPay, ) \ No newline at end of file From 626b1496cfac9494ded605736df3b045dba250b5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 17 Nov 2022 12:28:38 +0300 Subject: [PATCH 21/25] Updated on 2026-08-14 --- .../redux/middlewares/WalletMiddleware.kt | 36 ++++++++++++------- app/src/main/res/values-ru/strings_final.xml | 1 + app/src/main/res/values/strings_final.xml | 1 + 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 30a72f0fd4..ea47afc58a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.wallet.redux.middlewares +import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.blockchain.blockchains.solana.RentProvider import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.AmountType @@ -17,6 +18,7 @@ import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.extensions.dispatchErrorNotification import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchOpenUrl +import com.tangem.tap.common.extensions.dispatchToastNotification import com.tangem.tap.common.extensions.onCardScanned import com.tangem.tap.common.extensions.shareText import com.tangem.tap.common.extensions.stripZeroPlainString @@ -45,6 +47,7 @@ import com.tangem.tap.preferencesStorage import com.tangem.tap.scope import com.tangem.tap.store import com.tangem.tap.tangemSdkManager +import com.tangem.wallet.R import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.launch @@ -118,10 +121,9 @@ class WalletMiddleware { true, ), ) - store.dispatch(WalletAction.LoadWallet.Success( - action.wallet, - action.blockchain - )) + store.dispatch( + action = WalletAction.LoadWallet.Success(action.wallet, action.blockchain) + ) } } store.dispatch(WalletAction.Warnings.CheckHashesCount.CheckHashesCountOnline) @@ -257,9 +259,17 @@ class WalletMiddleware { return } val newAction = prepareSendAction(action.amount, store.state.walletState) - store.dispatch(newAction) - if (newAction is PrepareSendScreen) { - store.dispatch(NavigationAction.NavigateTo(AppScreen.Send)) + if (newAction is PrepareSendScreen && newAction.walletManager == null) { + store.dispatch(NavigationAction.PopBackTo(screen = AppScreen.Home)) + FirebaseCrashlytics.getInstance().recordException( + IllegalStateException("PrepareSendScreen: walletManager is null") + ) + store.dispatchToastNotification(R.string.internal_error_wallet_manager_not_found) + } else { + store.dispatch(newAction) + if (newAction is PrepareSendScreen) { + store.dispatch(NavigationAction.NavigateTo(AppScreen.Send)) + } } } } @@ -366,11 +376,13 @@ class WalletMiddleware { val currency = walletManager.wallet.blockchain.currency if (show) { - dispatchOnMain(WalletAction.SetWalletRent( - wallet = walletManager.wallet, - minRent = ("${rentProvider.rentAmount().stripZeroPlainString()} $currency"), - rentExempt = ("${rentExempt.stripZeroPlainString()} $currency") - )) + dispatchOnMain( + WalletAction.SetWalletRent( + wallet = walletManager.wallet, + minRent = ("${rentProvider.rentAmount().stripZeroPlainString()} $currency"), + rentExempt = ("${rentExempt.stripZeroPlainString()} $currency") + ) + ) } else { dispatchOnMain(WalletAction.RemoveWalletRent(walletManager.wallet)) } diff --git a/app/src/main/res/values-ru/strings_final.xml b/app/src/main/res/values-ru/strings_final.xml index fe86cb0019..ad4f23ca35 100644 --- a/app/src/main/res/values-ru/strings_final.xml +++ b/app/src/main/res/values-ru/strings_final.xml @@ -152,4 +152,5 @@ Вы хотите выйти из процесса активации? В этом случае вам будет необходимо начать процесс заново. Вы использовали карту от другого кошелька. Приложите карту, связанную с этим кошельком. + Внутренняя ошибка: не удается найти менеджер кошельков diff --git a/app/src/main/res/values/strings_final.xml b/app/src/main/res/values/strings_final.xml index f5e11c6885..70e85346c6 100644 --- a/app/src/main/res/values/strings_final.xml +++ b/app/src/main/res/values/strings_final.xml @@ -154,4 +154,5 @@ Do you want to exit the activation process? In this case, you will need to start from the beginning. You have used a card from another wallet. Tap the card associated with this wallet + Internal error: wallet manager not found From 0fae89892af90d38eb136a68ca5c0fc1480d6aa4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 17 Nov 2022 15:37:24 +0400 Subject: [PATCH 22/25] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2db7835bc2..2376dbe286 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-134', + tangem_blockchain_sdk: 'develop-135', // tangem_blockchain_sdk: '0.0.1', ] From 150bdaf01a76ae1af5980f64d8b3730a768dd80e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Nov 2022 21:10:11 +0400 Subject: [PATCH 23/25] Updated on 2026-08-14 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2376dbe286..02d685f18f 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,7 +3,7 @@ ext.versions = [ build_gradle : '7.1.3', tangem_card_sdk : 'develop-165', // tangem_card_sdk : '0.0.1', - tangem_blockchain_sdk: 'develop-135', + tangem_blockchain_sdk: 'develop-139', // tangem_blockchain_sdk: '0.0.1', ] From 199d6d4eb76fa8cbd1ed112c685b0171bb8def56 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Nov 2022 21:19:00 +0400 Subject: [PATCH 24/25] Updated on 2026-08-14 --- .../com/tangem/tap/domain/RatesRepository.kt | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt b/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt index 51252c819c..8b4136e90f 100644 --- a/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/RatesRepository.kt @@ -20,21 +20,18 @@ class RatesRepository { val throttledResult = coinsList.filter { throttler.isStillThrottled(it) }.map { Pair(it, throttler.geValue(it)) } - if (throttledResult.isNotEmpty()) { - return handleFiatRatesResult(throttledResult.toMap()) - } val currenciesToUpdate = coinsList.filter { !throttler.isStillThrottled(it) } val coinIds = currenciesToUpdate.mapNotNull { it.coinId }.distinct() - if (coinIds.isEmpty()) return EMPTY_RESULT + if (coinIds.isEmpty()) return handleFiatRatesResult(throttledResult.toMap()) return when (val result = tangemTechService.rates(currencyId, coinIds)) { is Result.Success -> { val ratesResultList: Map> = result.data.rates.mapValues { Result.Success(it.value.toBigDecimal()) } - val updatedCurrencies = mutableMapOf?>() - currenciesToUpdate.forEach { currency -> + val updatedCurrencies = throttledResult.toMap().toMutableMap() + coinsList.forEach { currency -> ratesResultList[currency.coinId]?.let { updatedCurrencies[currency] = it throttler.updateThrottlingTo(currency) @@ -65,13 +62,6 @@ class RatesRepository { fun clear() { throttler.clear() } - - companion object { - val EMPTY_RESULT = Result.Success(Pair( - mutableMapOf(), - mutableMapOf() - )) - } } typealias RatesResult = Pair, MutableMap> From 4edf42b23f8bdc678d19d0ff545fc9d0310b2b50 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 23 Nov 2022 21:19:54 +0400 Subject: [PATCH 25/25] Updated on 2026-08-14 --- .../features/wallet/ui/WalletDetailsFragment.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) 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 281d4b3938..f43965d8f9 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 @@ -149,14 +149,16 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details), binding.srlWalletDetails.setOnRefreshListener { if (selectedWallet.currencyData.status != BalanceStatus.Loading) { - store.dispatch(WalletAction.LoadWallet( - blockchain = BlockchainNetwork( - selectedWallet.currency.blockchain, - selectedWallet.currency.derivationPath, - emptyList() - ) - ) + store.dispatch( + WalletAction.LoadWallet( + blockchain = BlockchainNetwork( + selectedWallet.currency.blockchain, + selectedWallet.currency.derivationPath, + emptyList(), + ), + ), ) + store.dispatch(WalletAction.LoadFiatRate(coinsList = listOf(selectedWallet.currency))) } }