From bd173232ede3a4a4a377e20390345864409b2944 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 27 Jun 2023 18:03:24 +0300 Subject: [PATCH 1/8] Updated on 2026-08-14 --- .../src/main/assets/configs/feature_toggles_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json index b0b9550686..ab2ed7ee14 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -9,7 +9,7 @@ }, { "name": "NEW_CARD_SCANNING_ENABLED", - "version": "4.8.0" + "version": "4.9.0" }, { "name": "REDESIGNED_WALLET_SCREEN_ENABLED", From 677dd370a65085254c2414c5f85731cc7a3f852b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 29 Jun 2023 17:32:01 +0300 Subject: [PATCH 2/8] Updated on 2026-08-14 --- .../impl/presentation/ui/TokensListScreen.kt | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/ui/TokensListScreen.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/ui/TokensListScreen.kt index 44e620b8ac..6896480058 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/ui/TokensListScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/ui/TokensListScreen.kt @@ -25,9 +25,6 @@ import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp @@ -155,18 +152,8 @@ private fun DifferentAddressesWarning() { contentAlignment = Alignment.Center, ) { val text = stringResource(id = R.string.alert_manage_tokens_addresses_message) - val firstSpaceIndex = text.indexOf(" ") Text( - text = AnnotatedString( - text = text, - spanStyles = listOf( - AnnotatedString.Range( - SpanStyle(fontWeight = FontWeight.Bold), - start = 0, - end = firstSpaceIndex, - ), - ), - ), + text = text, modifier = Modifier.padding( horizontal = TangemTheme.dimens.spacing16, vertical = TangemTheme.dimens.spacing8, From ca46cb41a6f186f76affdcf13a71d298c6650d04 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 29 Jun 2023 19:05:42 +0300 Subject: [PATCH 3/8] Updated on 2026-08-14 --- .../wallet/ui/utils/WalletDataOperations.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt index f2d65a4fcf..63de2cf579 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/utils/WalletDataOperations.kt @@ -12,7 +12,6 @@ import com.tangem.tap.common.extensions.toFormattedCurrencyString import com.tangem.tap.common.extensions.toFormattedFiatValue import com.tangem.tap.domain.model.WalletDataModel import com.tangem.tap.domain.model.WalletStoreModel -import com.tangem.tap.features.wallet.models.PendingTransactionType import com.tangem.tap.features.wallet.models.WalletWarning import com.tangem.tap.features.wallet.redux.WalletMainButton import com.tangem.tap.features.wallet.redux.utils.UNKNOWN_AMOUNT_SIGN @@ -27,14 +26,15 @@ internal fun WalletDataModel.mainButton(blockchainAmount: BigDecimal): WalletMai internal fun WalletDataModel.hasPendingTransactions(): Boolean { // for now check pending ongoing only just for BTC, later test and add other utxo networks - val isBitcoinBlockchain = - currency.blockchain == Blockchain.Bitcoin || currency.blockchain == Blockchain.BitcoinTestnet - if (currency.isBlockchain() && isBitcoinBlockchain) { - val outgoingTransactions = status.pendingTransactions.filter { - it.type == PendingTransactionType.Outgoing - } - return outgoingTransactions.isEmpty() - } + // disabled for release 4.8, test and enable in 4.9 + // val isBitcoinBlockchain = + // currency.blockchain == Blockchain.Bitcoin || currency.blockchain == Blockchain.BitcoinTestnet + // if (currency.isBlockchain() && isBitcoinBlockchain) { + // val outgoingTransactions = status.pendingTransactions.filter { + // it.type == PendingTransactionType.Outgoing + // } + // return outgoingTransactions.isEmpty() + // } return status.pendingTransactions.isEmpty() } From 910cabb39b6c3476017987432f2a8a31770d9d88 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 30 Jun 2023 17:35:56 +0300 Subject: [PATCH 4/8] 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 bab0670f48..a9ef1dcf23 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -77,7 +77,7 @@ walletConnectWeb3 = "1.8.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_4.8-251" +tangemBlockchainSdk = "release-app_4.8-255" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_4.8-270" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds From d86e205e98040e30755d4f4a73227b329eaeee1a Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 3 Jul 2023 20:43:49 +0300 Subject: [PATCH 5/8] Updated on 2026-08-14 --- .../data/WalletConnectRepositoryImpl.kt | 30 +++++++++++++------ .../domain/WalletConnectInteractor.kt | 6 ++-- .../domain/models/WalletConnectEvents.kt | 3 +- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt index 01e3803798..50265e3953 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt @@ -1,6 +1,7 @@ package com.tangem.tap.domain.walletconnect2.data import android.app.Application +import arrow.core.flatten import com.tangem.tap.domain.walletconnect2.domain.WalletConnectRepository import com.tangem.tap.domain.walletconnect2.domain.WcJrpcRequestsDeserializer import com.tangem.tap.domain.walletconnect2.domain.models.* @@ -97,6 +98,7 @@ class WalletConnectRepositoryImpl @Inject constructor( sessionProposal.url, sessionProposal.icons, sessionProposal.requiredNamespaces.values.flatMap { it.chains ?: emptyList() }, + sessionProposal.optionalNamespaces.values.flatMap { it.chains ?: emptyList() }, ), ) } @@ -187,6 +189,7 @@ class WalletConnectRepositoryImpl @Inject constructor( namespaces = sessionProposal.requiredNamespaces, userNamespaces = userNamespaces, ) + if (missingNetworks.isNotEmpty()) { Timber.e("Not added blockchains: $missingNetworks") scope.launch { @@ -204,17 +207,26 @@ class WalletConnectRepositoryImpl @Inject constructor( }.groupBy { pair -> pair.first } .mapValues { entry -> entry.value.map { pair -> pair.second }.toSet() } - val preparedNamespaces = sessionProposal.requiredNamespaces.map { requiredNamespace -> - val accounts = requiredNamespace.value.chains?.mapNotNull { userChains[it] }?.flatten() ?: emptyList() + val preparedNamespaces = sessionProposal.requiredNamespaces + .map { requiredNamespace -> + val accountsRequired = requiredNamespace.value.chains + ?.mapNotNull { chain -> userChains[chain] } + ?.flatten() ?: emptyList() + val accountsOptional = sessionProposal.optionalNamespaces[requiredNamespace.key]?.chains + ?.mapNotNull { chain -> userChains[chain] } + ?.flatten() ?: emptyList() - requiredNamespace.key to Wallet.Model.Namespace.Session( - accounts = accounts, - methods = requiredNamespace.value.methods, - events = requiredNamespace.value.events, - ) - }.toMap() + requiredNamespace.key to Wallet.Model.Namespace.Session( + accounts = accountsRequired + accountsOptional, + methods = requiredNamespace.value.methods, + events = requiredNamespace.value.events, + ) + }.toMap() - val sessionApproval = Wallet.Params.SessionApprove(sessionProposal.proposerPublicKey, preparedNamespaces) + val sessionApproval = Wallet.Params.SessionApprove( + proposerPublicKey = sessionProposal.proposerPublicKey, + namespaces = preparedNamespaces, + ) Timber.d("Session approval is prepared for sending: $sessionApproval") diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt index ef202cd085..7d929df9fc 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/WalletConnectInteractor.kt @@ -50,15 +50,15 @@ class WalletConnectInteractor( when (wcEvent) { is WalletConnectEvents.SessionProposal -> { Timber.d("WC session proposal event received") - val unsupportedNetworks = wcEvent.chainIds + val unsupportedNetworks = wcEvent.requiredChainIds .filter { blockchainHelper.chainIdToNetworkIdOrNull(it) == null } if (unsupportedNetworks.isNotEmpty()) { val error = WalletConnectError.ApprovalErrorUnsupportedNetwork(unsupportedNetworks) handler.onSessionRejected(error) return@onEach } - - val networksFormatted = wcEvent.chainIds + val networksFormatted = (wcEvent.requiredChainIds + wcEvent.optionalChainIds) + .distinct() .mapNotNull { blockchainHelper.chainIdToFullNameOrNull(it) } .toString() handler.onProposalReceived(proposal = wcEvent, networksFormatted = networksFormatted) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectEvents.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectEvents.kt index bec06dd554..e481daa22d 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectEvents.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/domain/models/WalletConnectEvents.kt @@ -9,7 +9,8 @@ sealed interface WalletConnectEvents { val description: String, val url: String, val icons: List, - val chainIds: List, + val requiredChainIds: List, + val optionalChainIds: List, ) : WalletConnectEvents data class SessionApprovalError(val error: WalletConnectError) : WalletConnectEvents From 07a2f9f411b312f9ce2f023dcce1b8d84aa7e3ec Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Jul 2023 07:22:10 +0300 Subject: [PATCH 6/8] Updated on 2026-08-14 --- .../wallet/ui/view/TotalBalanceCard.kt | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/wallet/ui/view/TotalBalanceCard.kt b/app/src/main/java/com/tangem/tap/features/wallet/ui/view/TotalBalanceCard.kt index d89d245766..fdfadc43e1 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/ui/view/TotalBalanceCard.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/ui/view/TotalBalanceCard.kt @@ -27,6 +27,7 @@ import com.tangem.tap.domain.model.TotalFiatBalance import com.tangem.tap.features.wallet.redux.utils.UNKNOWN_AMOUNT_SIGN import com.tangem.wallet.R import com.valentinilk.shimmer.shimmer +import timber.log.Timber import java.math.BigDecimal import java.math.RoundingMode import java.text.DecimalFormat @@ -227,14 +228,21 @@ private fun buildAmountString(amount: BigDecimal?, fiatCurrency: FiatCurrency): ?: return AnnotatedString("${amount.toPlainString()} ${fiatCurrency.symbol}") val currencyToShow = "${fiatCurrency.symbol} " - val scaledAmount = Currency.getInstance(fiatCurrency.code)?.let { currency -> - formatter.currency = currency - formatter.maximumFractionDigits = fractionDigits - formatter.minimumFractionDigits = fractionDigits - formatter.isGroupingUsed = true - formatter.roundingMode = RoundingMode.HALF_UP - formatter.format(amount).replace(currency.symbol, currencyToShow) - } ?: formatter.format(amount) + val scaledAmount = try { + Currency.getInstance(fiatCurrency.code)?.let { currency -> + formatter.currency = currency + formatter.maximumFractionDigits = fractionDigits + formatter.minimumFractionDigits = fractionDigits + formatter.isGroupingUsed = true + formatter.roundingMode = RoundingMode.HALF_UP + formatter.format(amount).replace(currency.symbol, currencyToShow) + } ?: formatter.format(amount) + } catch (e: IllegalArgumentException) { + Timber.e("TotalBalanceCard buildAmountString currencyCode is not a supported ISO 4217 code: $e") + formatter.currency?.let { + formatter.format(amount).replace(it.symbol, currencyToShow) + } ?: formatter.format(amount) + } val integer = scaledAmount.substringBefore(formatter.decimalFormatSymbols.decimalSeparator) var reminder = scaledAmount.substringAfter(formatter.decimalFormatSymbols.decimalSeparator) From 0f465cf04b4ebc1699a17d4247c0de0a80b0ba63 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Jul 2023 15:44:46 +0400 Subject: [PATCH 7/8] Updated on 2026-08-14 --- gradle/dependencies.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index a9ef1dcf23..19e1dc5045 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -72,8 +72,8 @@ mviCore = "1.3.1" kotlinSerialization = "1.4.1" arrow = "1.2.0-RC" reactiveNetwork = "3.0.8" -walletConnectCore = "1.15.0" -walletConnectWeb3 = "1.8.0" +walletConnectCore = "1.17.0" +walletConnectWeb3 = "1.10.0" # endregion Other libraries # region Tangem From 56e272bb2bb361d8f1b38ff0b50f95c467dcd45a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Jul 2023 22:25:49 +0400 Subject: [PATCH 8/8] Updated on 2026-08-14 --- .../walletconnect2/data/WalletConnectRepositoryImpl.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt index 50265e3953..12c5510122 100644 --- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt +++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/data/WalletConnectRepositoryImpl.kt @@ -212,13 +212,16 @@ class WalletConnectRepositoryImpl @Inject constructor( val accountsRequired = requiredNamespace.value.chains ?.mapNotNull { chain -> userChains[chain] } ?.flatten() ?: emptyList() - val accountsOptional = sessionProposal.optionalNamespaces[requiredNamespace.key]?.chains + val optionalNamespace = sessionProposal.optionalNamespaces[requiredNamespace.key] + val accountsOptional = optionalNamespace?.chains ?.mapNotNull { chain -> userChains[chain] } ?.flatten() ?: emptyList() + val methods = (requiredNamespace.value.methods + (optionalNamespace?.methods ?: emptyList())) + .distinct() requiredNamespace.key to Wallet.Model.Namespace.Session( - accounts = accountsRequired + accountsOptional, - methods = requiredNamespace.value.methods, + accounts = (accountsRequired + accountsOptional).distinct(), + methods = methods, events = requiredNamespace.value.events, ) }.toMap()